From 4fc37a7321e31631459fc4fbe8bb2ca86f6dd409 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Sun, 3 Jun 2018 13:20:20 -0700 Subject: [PATCH 001/363] -Added toggle to allow main video player to switch to popup player when onstop is called. -Fixed player state not recovering when player is stopped during multiwindow mode. -Updated gradle to 3.1.2. --- .../org/schabi/newpipe/player/MainVideoPlayer.java | 11 +++++++++-- .../schabi/newpipe/player/helper/PlayerHelper.java | 9 ++++++++- app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/video_audio_settings.xml | 6 ++++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 0dea47e56..8daa544ae 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -208,10 +208,17 @@ public final class MainVideoPlayer extends AppCompatActivity protected void onStop() { if (DEBUG) Log.d(TAG, "onStop() called"); super.onStop(); - playerImpl.destroy(); - PlayerHelper.setScreenBrightness(getApplicationContext(), getWindow().getAttributes().screenBrightness); + + isInMultiWindow = false; + + if (playerImpl == null) return; + if (PlayerHelper.isMinimizeOnExitEnabled(this)) { + playerImpl.onFullScreenButtonClicked(); + } else { + playerImpl.destroy(); + } } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index dbe0e9f46..252a3f708 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -173,6 +173,10 @@ public class PlayerHelper { return isAutoQueueEnabled(context, false); } + public static boolean isMinimizeOnExitEnabled(@NonNull final Context context) { + return isMinimizeOnExitEnabled(context, false); + } + @NonNull public static SeekParameters getSeekParameters(@NonNull final Context context) { return isUsingInexactSeek(context, false) ? @@ -249,7 +253,6 @@ public class PlayerHelper { * System font scaling: * Very small - 0.25f, Small - 0.5f, Normal - 1.0f, Large - 1.5f, Very Large - 2.0f * */ - @NonNull public static float getCaptionScale(@NonNull final Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return 1f; @@ -322,4 +325,8 @@ public class PlayerHelper { return sp.getFloat(context.getString(R.string.screen_brightness_key), screenBrightness); } } + + private static boolean isMinimizeOnExitEnabled(@NonNull final Context context, final boolean b) { + return getPreferences(context).getBoolean(context.getString(R.string.minimize_on_exit_key), b); + } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index fc7cfd1b4..e21697a62 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -24,6 +24,7 @@ auto_queue_key screen_brightness_key screen_brightness_timestamp_key + minimize_on_exit_key default_resolution 360p diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ee80536f..747b80dcc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,6 +74,8 @@ Remember last size and position of popup Use fast inexact seek Inexact seek allows the player to seek to positions faster with reduced precision + Minimize on exit + Experimental. Switch to play on popup player when exiting main video player Load thumbnails Disable to stop all thumbnails from loading and save on data and memory usage. Changing this will clear both in-memory and on-disk image cache. Image cache wiped diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 6ec0da215..440bce0f2 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -113,5 +113,11 @@ android:key="@string/use_inexact_seek_key" android:summary="@string/use_inexact_seek_summary" android:title="@string/use_inexact_seek_title"/> + + From e1df4757e49610025a2d0695556a29d6853732a6 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Sun, 3 Jun 2018 14:09:16 -0700 Subject: [PATCH 002/363] -Expanded minimize to exit to allow resuming on background player. -Modified minimize to exit toggle to selection dialog. --- .../newpipe/player/MainVideoPlayer.java | 21 ++++++++---- .../newpipe/player/helper/PlayerHelper.java | 34 ++++++++++++++++--- app/src/main/res/values/settings_keys.xml | 15 ++++++++ app/src/main/res/values/strings.xml | 9 +++-- app/src/main/res/xml/video_audio_settings.xml | 14 ++++---- 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 8daa544ae..cbe269a7d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -213,12 +213,7 @@ public final class MainVideoPlayer extends AppCompatActivity isInMultiWindow = false; - if (playerImpl == null) return; - if (PlayerHelper.isMinimizeOnExitEnabled(this)) { - playerImpl.onFullScreenButtonClicked(); - } else { - playerImpl.destroy(); - } + if (playerImpl != null) playerImpl.terminate(); } /*////////////////////////////////////////////////////////////////////////// @@ -448,6 +443,20 @@ public final class MainVideoPlayer extends AppCompatActivity switchPopupButton.setOnClickListener(this); } + public void terminate() { + switch (PlayerHelper.getMinimizeOnExitAction(context)) { + case PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_BACKGROUND: + onPlayBackgroundButtonClicked(); + break; + case PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_POPUP: + onFullScreenButtonClicked(); + break; + case PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_NONE: + destroy(); + break; + } + } + /*////////////////////////////////////////////////////////////////////////// // ExoPlayer Video Listener //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 252a3f708..f8d594114 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.preference.PreferenceManager; +import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.accessibility.CaptioningManager; @@ -28,6 +29,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import java.lang.annotation.Retention; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; @@ -42,6 +44,8 @@ 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; import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_ZOOM; +import static java.lang.annotation.RetentionPolicy.SOURCE; +import static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.*; public class PlayerHelper { private PlayerHelper() {} @@ -51,6 +55,14 @@ public class PlayerHelper { private static final NumberFormat speedFormatter = new DecimalFormat("0.##x"); private static final NumberFormat pitchFormatter = new DecimalFormat("##%"); + @Retention(SOURCE) + @IntDef({MINIMIZE_ON_EXIT_MODE_NONE, MINIMIZE_ON_EXIT_MODE_BACKGROUND, + MINIMIZE_ON_EXIT_MODE_POPUP}) + public @interface MinimizeMode { + int MINIMIZE_ON_EXIT_MODE_NONE = 0; + int MINIMIZE_ON_EXIT_MODE_BACKGROUND = 1; + int MINIMIZE_ON_EXIT_MODE_POPUP = 2; + } //////////////////////////////////////////////////////////////////////////// // Exposed helpers //////////////////////////////////////////////////////////////////////////// @@ -173,8 +185,20 @@ public class PlayerHelper { return isAutoQueueEnabled(context, false); } - public static boolean isMinimizeOnExitEnabled(@NonNull final Context context) { - return isMinimizeOnExitEnabled(context, false); + @MinimizeMode + public static int getMinimizeOnExitAction(@NonNull final Context context) { + final String defaultAction = context.getString(R.string.minimize_on_exit_none_key); + final String popupAction = context.getString(R.string.minimize_on_exit_popup_key); + final String backgroundAction = context.getString(R.string.minimize_on_exit_background_key); + + final String action = getMinimizeOnExitAction(context, defaultAction); + if (action.equals(popupAction)) { + return MINIMIZE_ON_EXIT_MODE_POPUP; + } else if (action.equals(backgroundAction)) { + return MINIMIZE_ON_EXIT_MODE_BACKGROUND; + } else { + return MINIMIZE_ON_EXIT_MODE_NONE; + } } @NonNull @@ -326,7 +350,9 @@ public class PlayerHelper { } } - private static boolean isMinimizeOnExitEnabled(@NonNull final Context context, final boolean b) { - return getPreferences(context).getBoolean(context.getString(R.string.minimize_on_exit_key), b); + private static String getMinimizeOnExitAction(@NonNull final Context context, + final String key) { + return getPreferences(context).getString(context.getString(R.string.minimize_on_exit_key), + key); } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index e21697a62..2b505686b 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -24,7 +24,22 @@ auto_queue_key screen_brightness_key screen_brightness_timestamp_key + minimize_on_exit_key + @string/minimize_on_exit_none_key + minimize_on_exit_none_key + minimize_on_exit_background_key + minimize_on_exit_popup_key + + @string/minimize_on_exit_none_key + @string/minimize_on_exit_background_key + @string/minimize_on_exit_popup_key + + + @string/minimize_on_exit_none_description + @string/minimize_on_exit_background_description + @string/minimize_on_exit_popup_description + default_resolution 360p diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 747b80dcc..c1132ac65 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,8 +74,6 @@ Remember last size and position of popup Use fast inexact seek Inexact seek allows the player to seek to positions faster with reduced precision - Minimize on exit - Experimental. Switch to play on popup player when exiting main video player Load thumbnails Disable to stop all thumbnails from loading and save on data and memory usage. Changing this will clear both in-memory and on-disk image cache. Image cache wiped @@ -506,4 +504,11 @@ 144p + + Minimize on exit + Action when exiting main video player — %s + None + Minimize to background player + Minimize to popup player + diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 440bce0f2..a547ffaf2 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -90,6 +90,14 @@ android:summary="@string/preferred_open_action_settings_summary" android:title="@string/preferred_open_action_settings_title"/> + + - - From baa63249d1d4e8cca96eadaa0c86dd962ec275a8 Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Tue, 5 Jun 2018 19:48:31 +0200 Subject: [PATCH 003/363] Added share option to long tap menu --- .../newpipe/fragments/detail/VideoDetailFragment.java | 6 +++++- .../org/schabi/newpipe/fragments/list/BaseListFragment.java | 6 +++++- .../newpipe/fragments/list/channel/ChannelFragment.java | 6 +++++- .../newpipe/fragments/list/playlist/PlaylistFragment.java | 4 ++++ .../newpipe/local/history/StatisticsPlaylistFragment.java | 4 ++++ .../newpipe/local/playlist/LocalPlaylistFragment.java | 6 +++++- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 68c0a11ff..640c1d087 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -540,7 +540,8 @@ public class VideoDetailFragment final String[] commands = new String[]{ context.getResources().getString(R.string.enqueue_on_background), context.getResources().getString(R.string.enqueue_on_popup), - context.getResources().getString(R.string.append_playlist) + context.getResources().getString(R.string.append_playlist), + context.getResources().getString(R.string.share) }; final DialogInterface.OnClickListener actions = (DialogInterface dialogInterface, int i) -> { @@ -557,6 +558,9 @@ public class VideoDetailFragment .show(getFragmentManager(), TAG); } break; + case 3: + shareUrl(item.getName(), item.getUrl()); + break; default: break; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 14ec50775..c4b341aae 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -196,7 +196,8 @@ public abstract class BaseListFragment extends BaseStateFragment implem final String[] commands = new String[]{ context.getResources().getString(R.string.enqueue_on_background), context.getResources().getString(R.string.enqueue_on_popup), - context.getResources().getString(R.string.append_playlist) + context.getResources().getString(R.string.append_playlist), + context.getResources().getString(R.string.share) }; final DialogInterface.OnClickListener actions = (dialogInterface, i) -> { @@ -213,6 +214,9 @@ public abstract class BaseListFragment extends BaseStateFragment implem .show(getFragmentManager(), TAG); } break; + case 3: + shareUrl(item.getName(), item.getUrl()); + break; default: break; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index dc8d764f3..b56692877 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -161,7 +161,8 @@ public class ChannelFragment extends BaseListInfoFragment { context.getResources().getString(R.string.start_here_on_main), context.getResources().getString(R.string.start_here_on_background), context.getResources().getString(R.string.start_here_on_popup), - context.getResources().getString(R.string.append_playlist) + context.getResources().getString(R.string.append_playlist), + context.getResources().getString(R.string.share) }; final DialogInterface.OnClickListener actions = new DialogInterface.OnClickListener() { @@ -190,6 +191,9 @@ public class ChannelFragment extends BaseListInfoFragment { .show(getFragmentManager(), TAG); } break; + case 6: + shareUrl(item.getName(), item.getUrl()); + break; default: break; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 0498c95c5..bba7a470e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -142,6 +142,7 @@ public class PlaylistFragment extends BaseListInfoFragment { context.getResources().getString(R.string.start_here_on_main), context.getResources().getString(R.string.start_here_on_background), context.getResources().getString(R.string.start_here_on_popup), + context.getResources().getString(R.string.share) }; final DialogInterface.OnClickListener actions = (dialogInterface, i) -> { @@ -162,6 +163,9 @@ public class PlaylistFragment extends BaseListInfoFragment { case 4: NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(index)); break; + case 5: + shareUrl(item.getName(), item.getUrl()); + break; default: break; } diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java index eac1873a4..c2c813a4d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java @@ -298,6 +298,7 @@ public class StatisticsPlaylistFragment context.getResources().getString(R.string.start_here_on_background), context.getResources().getString(R.string.start_here_on_popup), context.getResources().getString(R.string.delete), + context.getResources().getString(R.string.share) }; final DialogInterface.OnClickListener actions = (dialogInterface, i) -> { @@ -321,6 +322,9 @@ public class StatisticsPlaylistFragment case 5: deleteEntry(index); break; + case 6: + shareUrl(item.toStreamInfoItem().getName(), item.toStreamInfoItem().getUrl()); + break; default: break; } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index e51fa50a4..35a1530c9 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -520,7 +520,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment { @@ -549,6 +550,9 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Date: Tue, 5 Jun 2018 23:37:20 -0700 Subject: [PATCH 004/363] -Added back button press check to destroy rather than minimize main video player. --- .../newpipe/player/MainVideoPlayer.java | 19 ++++++++++++++++--- app/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index cbe269a7d..8a4fb62da 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -104,6 +104,7 @@ public final class MainVideoPlayer extends AppCompatActivity @Nullable private PlayerState playerState; private boolean isInMultiWindow; + private boolean isBackPressed; /*////////////////////////////////////////////////////////////////////////// // Activity LifeCycle @@ -191,6 +192,12 @@ public final class MainVideoPlayer extends AppCompatActivity } } + @Override + public void onBackPressed() { + super.onBackPressed(); + isBackPressed = true; + } + @Override protected void onSaveInstanceState(Bundle outState) { if (DEBUG) Log.d(TAG, "onSaveInstanceState() called"); @@ -211,9 +218,15 @@ public final class MainVideoPlayer extends AppCompatActivity PlayerHelper.setScreenBrightness(getApplicationContext(), getWindow().getAttributes().screenBrightness); - isInMultiWindow = false; + if (playerImpl == null) return; + if (isBackPressed) { + playerImpl.destroy(); + } else { + playerImpl.minimize(); + } - if (playerImpl != null) playerImpl.terminate(); + isInMultiWindow = false; + isBackPressed = false; } /*////////////////////////////////////////////////////////////////////////// @@ -443,7 +456,7 @@ public final class MainVideoPlayer extends AppCompatActivity switchPopupButton.setOnClickListener(this); } - public void terminate() { + public void minimize() { switch (PlayerHelper.getMinimizeOnExitAction(context)) { case PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_BACKGROUND: onPlayBackgroundButtonClicked(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1132ac65..5ca88bd6f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -505,8 +505,8 @@ - Minimize on exit - Action when exiting main video player — %s + Minimize on application switch + Action when switching to other application from main video player — %s None Minimize to background player Minimize to popup player From 201f7e9848d2585de9394b22dfdb1af3111fa378 Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Fri, 8 Jun 2018 15:59:05 +0200 Subject: [PATCH 005/363] Added share option to Popup and Background queues --- .../newpipe/player/ServicePlayerActivity.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index 8b96b651e..7674105e1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -340,6 +340,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity return true; }); + final MenuItem share = menu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, /*pos=*/3, + Menu.NONE, R.string.share); + share.setOnMenuItemClickListener(menuItem -> { + shareUrl(item.getTitle(), item.getUrl()); + return true; + }); + menu.show(); } @@ -509,6 +516,18 @@ public abstract class ServicePlayerActivity extends AppCompatActivity .show(getSupportFragmentManager(), getTag()); } + //////////////////////////////////////////////////////////////////////////// + // Share + //////////////////////////////////////////////////////////////////////////// + + private void shareUrl(String subject, String url) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_SUBJECT, subject); + intent.putExtra(Intent.EXTRA_TEXT, url); + startActivity(Intent.createChooser(intent, getString(R.string.share_dialog_title))); + } + //////////////////////////////////////////////////////////////////////////// // Binding Service Listener //////////////////////////////////////////////////////////////////////////// From 981174a4904d81d929c44556b72126f18594a157 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 9 Jun 2018 01:01:13 +0530 Subject: [PATCH 006/363] Fixed bug #640. --- .../java/org/schabi/newpipe/player/PopupVideoPlayer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 8107345a1..1a690dcfe 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -662,7 +662,8 @@ public final class PopupVideoPlayer extends Service { videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); lockManager.acquireWifiAndCpu(); - hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); + windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); } @Override @@ -677,6 +678,9 @@ public final class PopupVideoPlayer extends Service { updateNotification(R.drawable.ic_play_arrow_white); videoPlayPause.setBackgroundResource(R.drawable.ic_play_arrow_white); lockManager.releaseWifiAndCpu(); + + windowLayoutParams.flags = 0; + windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); } @Override From 429dddc6c970b7b583e051e5e1227a1b5cb9119e Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 9 Jun 2018 01:13:37 +0530 Subject: [PATCH 007/363] reintroduced hideControls method. --- app/src/debug/gen/org/schabi/newpipe/BuildConfig.java | 8 ++++++++ app/src/debug/gen/org/schabi/newpipe/Manifest.java | 7 +++++++ app/src/debug/gen/org/schabi/newpipe/R.java | 7 +++++++ app/src/main/gen/org/schabi/newpipe/BuildConfig.java | 8 ++++++++ app/src/main/gen/org/schabi/newpipe/Manifest.java | 7 +++++++ app/src/main/gen/org/schabi/newpipe/R.java | 7 +++++++ .../java/org/schabi/newpipe/player/PopupVideoPlayer.java | 2 ++ 7 files changed, 46 insertions(+) create mode 100644 app/src/debug/gen/org/schabi/newpipe/BuildConfig.java create mode 100644 app/src/debug/gen/org/schabi/newpipe/Manifest.java create mode 100644 app/src/debug/gen/org/schabi/newpipe/R.java create mode 100644 app/src/main/gen/org/schabi/newpipe/BuildConfig.java create mode 100644 app/src/main/gen/org/schabi/newpipe/Manifest.java create mode 100644 app/src/main/gen/org/schabi/newpipe/R.java diff --git a/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java b/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java new file mode 100644 index 000000000..575afb9cb --- /dev/null +++ b/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java @@ -0,0 +1,8 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ +public final class BuildConfig { + public final static boolean DEBUG = Boolean.parseBoolean(null); +} \ No newline at end of file diff --git a/app/src/debug/gen/org/schabi/newpipe/Manifest.java b/app/src/debug/gen/org/schabi/newpipe/Manifest.java new file mode 100644 index 000000000..10e45a45a --- /dev/null +++ b/app/src/debug/gen/org/schabi/newpipe/Manifest.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/app/src/debug/gen/org/schabi/newpipe/R.java b/app/src/debug/gen/org/schabi/newpipe/R.java new file mode 100644 index 000000000..088bdfb0d --- /dev/null +++ b/app/src/debug/gen/org/schabi/newpipe/R.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ +public final class R { +} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/BuildConfig.java b/app/src/main/gen/org/schabi/newpipe/BuildConfig.java new file mode 100644 index 000000000..575afb9cb --- /dev/null +++ b/app/src/main/gen/org/schabi/newpipe/BuildConfig.java @@ -0,0 +1,8 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ +public final class BuildConfig { + public final static boolean DEBUG = Boolean.parseBoolean(null); +} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/Manifest.java b/app/src/main/gen/org/schabi/newpipe/Manifest.java new file mode 100644 index 000000000..10e45a45a --- /dev/null +++ b/app/src/main/gen/org/schabi/newpipe/Manifest.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/R.java b/app/src/main/gen/org/schabi/newpipe/R.java new file mode 100644 index 000000000..088bdfb0d --- /dev/null +++ b/app/src/main/gen/org/schabi/newpipe/R.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ +public final class R { +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 1a690dcfe..6eb339ffe 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -662,6 +662,8 @@ public final class PopupVideoPlayer extends Service { videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); lockManager.acquireWifiAndCpu(); + hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); + windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); } From 89e3219e06adb7266d15a6824a0d9b781cc27446 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 9 Jun 2018 01:38:57 +0530 Subject: [PATCH 008/363] Further fixes wrt FLAG_NOT_FOCUSABLE. --- .../java/org/schabi/newpipe/player/PopupVideoPlayer.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 6eb339ffe..3aa8d68f3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -664,7 +664,8 @@ public final class PopupVideoPlayer extends Service { hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); - windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); } @@ -681,7 +682,7 @@ public final class PopupVideoPlayer extends Service { videoPlayPause.setBackgroundResource(R.drawable.ic_play_arrow_white); lockManager.releaseWifiAndCpu(); - windowLayoutParams.flags = 0; + windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); } @@ -698,6 +699,9 @@ public final class PopupVideoPlayer extends Service { updateNotification(R.drawable.ic_replay_white); videoPlayPause.setBackgroundResource(R.drawable.ic_replay_white); lockManager.releaseWifiAndCpu(); + + windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); } @Override From 752f985e13978421328ce847e25c3038306268e9 Mon Sep 17 00:00:00 2001 From: aiddroid Date: Sat, 9 Jun 2018 07:16:54 +0000 Subject: [PATCH 009/363] =?UTF-8?q?Translated=20using=20Weblate=20(?= =?UTF-8?q?=E7=AE=80=E4=BD=93=E4=B8=AD=E6=96=87(Chinese=20Simplified))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-zh-rCN/strings.xml | 83 ++++++++++++++-------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1d3121a00..f181ba98b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -34,7 +34,7 @@ 下载 即将播放 - 显示下一部和相近的视频 + 显示下一部和相似的视频 不支援此网址 默认内容语言 视频和音频 @@ -88,7 +88,7 @@ 重试 无权访问存储空间 自动播放 - NewPipe被其他应用调用时,自动播放视频 + 当NewPipe被其他应用调用时,自动播放视频 直播 点击搜索开始NewPipe @@ -155,7 +155,7 @@ 在搜索时显示搜索建议 搜索记录 在本地存储搜索请求 - 历史 + 历史和缓存 记住观看的视频 焦点恢复 在打扰(例如来电)过后恢复视频播放 @@ -204,7 +204,7 @@ 关于 贡献者 许可 - 一款开源、轻量级的安卓 YouTube 客户端。 + 开源的轻量级流媒体Android客户端。 在 GitHub 上查看 NewPipe 许可 无论你有什么想法:翻译程序,改进设计,优化代码或是想做出大量修改——我们都随时欢迎。做得越多它将变得越好! @@ -230,7 +230,7 @@ [未知] - 播放此流媒体失败 + 无法播放此流媒体 发生无法解决的播放器错误 没有结果 空空如也 @@ -268,8 +268,8 @@ 移除所有网页的缓存数据 已清除元数据缓存 自动播放队列中下一个视频 - 如果播放到非循环列表中的最后一个视频,则自动加入一个相关视频到列表中。 - 显示长按以扩展的提示 + 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表。 + 显示\"长按添加\"提示 当视频详情页中的背景或悬浮按钮被按下的时候显示提示 默认内容国家 服务 @@ -308,10 +308,10 @@ 重命名 捐赠 - NewPipe 是一群志愿者花费业余时间开发的,目的是给你们带来最佳体验。你的一点心意,可以让开发者们可以享受一杯 Java 的咖啡的同时让 NewPipe 变得更好用! + NewPipe 是一群志愿者花费业余时间开发的,目的是给你们带来最佳体验。你的一点心意,可以让开发者们在享受一杯 Java 的咖啡的同时让 NewPipe 变得更好用。 捐赠 网页 - 为了获得 NewPipe 的更多信息和最新消息请访问我们的网站。 + 访问 NewPipe 网站以获取更多的信息和新闻。 你想从搜索历史中删除此项吗? 你想从观看历史中删除此项吗? 确实要删除历史记录的所有项目吗? @@ -351,10 +351,10 @@ 打开侧栏菜单 关闭侧栏菜单 - 马上就好 ;D + 精彩内容即将呈现 ;D - 偏好的打开动作 + 偏好\"打开\"动作 打开内容的默认动作 — %s 视频播放器 @@ -363,7 +363,7 @@ 总是询问 获取信息中… - 正在加载请求的内容 + 正在加载请求内容 创建新播放列表 删除播放列表 @@ -379,7 +379,7 @@ 播放列表已创建 加入播放列表 播放列表缩略图已更改 - 删除播放列表失败 + 无法删除播放列表 无字幕 @@ -394,10 +394,10 @@ 大字体 启用 LeakCanary - heap dumping 的时候,内存泄露监测可能会导致应用未响应 + 内存泄露监测可能会在heap dumping时导致应用失去响应 报告生命周期外的错误 - 处理之后,强制报告无法送达的、发生在Fragment或activity生命周期之外的Rx异常 + 处理完无法送达的、发生在Fragment或activity生命周期之外的Rx异常后强制报告 导入/导出 导入 @@ -410,22 +410,22 @@ 导入文件 之前的导出 - 订阅导入失败 - 订阅导出失败 + 无法导入订阅 + 无法导出订阅 - 为了导入你的 YouTube 订阅,你需要一个导出文件,按照下面的步骤来下载此文件: -\n1. 浏览器打开链接:%1$s -\n2. 登录你的账户 -\n3. 下载应该马上开始(这个就是你的导出文件) - 为了导入你的 SoundCloud,你需要知道你的个人页链接或者id,如果你知道,只要在下面的输入框中输入任意一种就OK了。 -\n如果你不知道,你需要这么做: -\n1. 浏览器打开链接:%1$s -\n2. 在某些手机浏览器中你得开启桌面模式(desktop mode) -\n3. 复制你跳转到的链接(这个就是你的个人页链接) + 通过下载导出文件导入 YouTube 订阅: +\n1. 浏览器打开链接:%1$s +\n2. 登录账户 +\n3. 下载应该会马上开始(这个就是导出文件) + 通过输入URL或您的ID导入SoundCloud配置: +\n1. 在浏览器中开启\"桌面模式\"(该网站不适用于移动设备) +\n2. 打开URL:%1$s +\n3. 登录账号 +\n3. 复制重定向后的URL。 你的ID 或 soundcloud.com/你的ID - 请注意这个操作可能耗费大量流量。 -\n你想继续吗? + 请注意该操作可能消耗大量网络流量。 +\n您希望继续吗? 播放速度控制 速度 @@ -433,9 +433,32 @@ Unhook(可能导致失真) Nightcore 默认 -找不到能播放此文件的播放器 +未安装能播放此文件的应用 字幕 - 修改播放器的字幕文本大小和背景样式。需要重启播放器以生效。 + 修改播放器的字幕文本大小和背景样式。需要重启应用程序以生效。 + 清除观看记录 + 删除视频观看记录。 + 删除全部观看记录。 + 观看记录已删除。 + 清除搜索记录 + 删除搜索关键词记录。 + 删除全部搜索记录。 + 搜索记录已删除。 + 已删除1项。 + + NewPipe的隐私策略 + NewPipe 项目非常重视您的隐私。因此, 未经您的同意,应用程序不会收集任何您的数据。 NewPipe 的隐私策略详细解释了您在发送崩溃报告时会发送和存储的哪些数据。 + 阅读隐私策略 + NewPipe 是 copyleft 的自由软件: 你可以按照自己的意愿使用、学习、分享和改进它。具体地说, 您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款(第3版或者任何更高版本), 重新发布和/或修改本软件。 + 您是否希望同时导入设置? + + 为了遵守欧洲通用数据保护条例(GDPR),我们提醒您注意NewPipe的隐私政策。 请仔细阅读。 +\n您必须接受它才能向我们发送错误报告。 + 接受 + 拒绝 + + 不限制 + 使用移动数据时的限制分辨率 From 8e1deda7b006505c1fea73df845424bd168892d6 Mon Sep 17 00:00:00 2001 From: aiddroid Date: Sat, 9 Jun 2018 07:13:12 +0000 Subject: [PATCH 010/363] Translated using Weblate (Chinese (Mandarin)) Currently translated at 0.0% (0 of 373 strings) --- app/src/main/res/values-cmn/strings.xml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index a6b3daec9..d9326b168 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -1,2 +1,20 @@ - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + From 71ad54652b0cd9cdea4a30117b7435ac45688e98 Mon Sep 17 00:00:00 2001 From: aiddroid Date: Sat, 9 Jun 2018 08:10:10 +0000 Subject: [PATCH 011/363] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-zh-rCN/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f181ba98b..8d4c99aaa 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -308,7 +308,7 @@ 重命名 捐赠 - NewPipe 是一群志愿者花费业余时间开发的,目的是给你们带来最佳体验。你的一点心意,可以让开发者们在享受一杯 Java 的咖啡的同时让 NewPipe 变得更好用。 + NewPipe 是一群志愿者花费业余时间开发的,目的是为您带来最佳体验。你的一点心意,可以让开发者们在享受一杯 Java 的咖啡的同时让 NewPipe 变得更好用。 捐赠 网页 访问 NewPipe 网站以获取更多的信息和新闻。 @@ -335,7 +335,7 @@ Kiosk 流行的 - Top 50 + 前50 最新 & 最热 后台播放器 悬浮窗播放器 @@ -414,7 +414,7 @@ 无法导出订阅 通过下载导出文件导入 YouTube 订阅: -\n1. 浏览器打开链接:%1$s +\n1. 在浏览器打开URL:%1$s \n2. 登录账户 \n3. 下载应该会马上开始(这个就是导出文件) 通过输入URL或您的ID导入SoundCloud配置: @@ -460,5 +460,5 @@ 拒绝 不限制 - 使用移动数据时的限制分辨率 + 使用移动数据时限制分辨率 From feea448a24c85edf779a7487e572ebfa0ac15183 Mon Sep 17 00:00:00 2001 From: Edwar Tikhonov Date: Sun, 10 Jun 2018 13:12:49 +0000 Subject: [PATCH 012/363] =?UTF-8?q?Translated=20using=20Weblate=20(=D0=A0?= =?UTF-8?q?=D1=83=D1=81=D1=81=D0=BA=D0=B8=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-ru/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 96c9674cd..d8841da7f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -474,4 +474,15 @@ Предпочтительное действие \'открытие\' Желаете ли вы также импортировать настройки? + Политика конфиденциальности NewPipe + Проект NewPipe очень серьезно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. +\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчета о сбоях. + Прочитать политику конфиденциальности + Чтобы соответствовать Европейскому стандарту защиты данных (GDPR), мы обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно прочитайте его. +\nВы должны принять её, чтобы отправить нам отчет об ошибке. + Принять + Отклонить + + Без лимита + Предельное разрешение при использовании мобильных данных From d4670bf6fa4e941001343b97fc13de4df175e7f1 Mon Sep 17 00:00:00 2001 From: Edwar Tikhonov Date: Sun, 10 Jun 2018 13:18:53 +0000 Subject: [PATCH 013/363] Translated using Weblate (Russe) Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d8841da7f..892a78049 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -483,6 +483,6 @@ Принять Отклонить - Без лимита + Безлимитный Предельное разрешение при использовании мобильных данных From cf03708da27ad6a390fda9c1f76df6f08b2257ee Mon Sep 17 00:00:00 2001 From: Dual Natan Date: Mon, 11 Jun 2018 19:13:08 +0000 Subject: [PATCH 014/363] Translated using Weblate (Macedonian) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-mk/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index f93ce3119..1ae02a0f2 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -444,4 +444,15 @@ Преводи Смени ја големината и стилот на преводот. Потребен е рестарт за промена. + NewPipe - политика за приватност + Проектот NewPipe сериозно ја сфаќа вашата приватност. Затоа апликацијата не собира ваши податоци без ваша дозвола. +\nПолитиката за приватност на NewPipe детално објаснува кои податоци се зачувани и пратени кога праќате извештај за грешка во апликацијата. + Прочитај ја политиката за приватност + За да постапуваме соодветно со регулацијата за заштита на податоци (GDPR) на ЕУ, вараме да обрнете внимание на политиката за приватност на NewPipe. +\nВе молиме прочитајте ја внимателно. Мора да ја прифатите за да ни го испратите извештајот за грешка во апликацијата. + Прифати + Отфрли + + Неограничено + Ограничи резолуција при користење мобилен интернет From ace0ed9667887916cf08c8503809ecf150fd28c2 Mon Sep 17 00:00:00 2001 From: Dual Natan Date: Mon, 11 Jun 2018 19:27:28 +0000 Subject: [PATCH 015/363] Translated using Weblate (Swedish) Currently translated at 68.9% (257 of 373 strings) --- app/src/main/res/values-sv/strings.xml | 33 +++++++++++++++++++------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 77dd115a9..1247a552b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -29,7 +29,7 @@ Plats för att lagra nerladdat ljud i Ange nerladdningsplats för ljudfiler - Spelar automatiskt upp en video när NewPipe öppnas av en annan app + Automatiskt spelar en video upp när NewPipe öppnas av en annan app Standardupplösning Standardupplösning för popup Visa högre upplösningar @@ -41,7 +41,7 @@ Ljud Standardformat för ljud Videoformat som föredras - WebM — fritt format + WebM — öppet format M4A — bättre kvalité Tema Ljus @@ -57,7 +57,7 @@ Ladda ner Nästa video - Visa nästkommande och liknande videor + Visa \'nästkommande\' och \'liknande\' videor Webbadressen stöds inte Standard innehållsspråk Video & Ljud @@ -123,15 +123,15 @@ Autospela Sök historik Spara sökfrågor lokalt - Historik + Historik & Cacheminne Håll koll på videor som du tittat på Fortsätt då fokus fås Fortsätta spela efter avbrott (t.ex. telefonsamtal) - Visa \"Håll för att lägga till\" tips + Visa \"håll för att lägga till\" tips Visa tips när bakgrunds- eller popup-knappen trycks på sidan för videodetaljer Spelare Beteende - Historik + Historik & Cacheminne Tillagd till bakgrunds-spelar kön Tillagd till popup-spelar kön Spellista @@ -237,7 +237,7 @@ Om Medverkande Licenser - Gratis och enkel YouTube-app för Android. + Öppet och enkel Android app för mediastreaming. Visa på GitHub NewPipes licens Vad du än har för idéer gällande översättning, designändringar, kod rengöring eller riktigt tunga så är hjälp alltid välkommet. Ju mer som görs desto bättre blir det! @@ -280,8 +280,25 @@ Börja här i bakgrunden Börja här i popup Donera - NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe! + NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe. Ge tillbaka Webbplats För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats. + Visa info + + Bokmärken + + Lägga till + + Använda snabb inexact sökning + Ladda miniatyrer + Inaktivera för att stoppa alla miniatyrer från lastning och spara på nät och minnesanvändning. Ändring av detta kommer att rensa cache-minnet. + Bild cacheminnet var rensad + Tjänst + Debug + Alltid + Bara en gång + Fil + + Byta orientationen From 09dd044f3de86e17c51a358774dfcd8b411cb94a Mon Sep 17 00:00:00 2001 From: "Andrei.Rosca" Date: Mon, 11 Jun 2018 14:44:00 +0200 Subject: [PATCH 016/363] undo delete --- .../newpipe/download/DeleteManager.java | 178 ++++++++++++++++++ .../newpipe/download/DownloadActivity.java | 51 ++++- .../giga/ui/adapter/MissionAdapter.java | 57 +++--- .../giga/ui/fragment/MissionsFragment.java | 45 ++++- 4 files changed, 291 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/download/DeleteManager.java diff --git a/app/src/main/java/org/schabi/newpipe/download/DeleteManager.java b/app/src/main/java/org/schabi/newpipe/download/DeleteManager.java new file mode 100644 index 000000000..210cf668d --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/download/DeleteManager.java @@ -0,0 +1,178 @@ +package org.schabi.newpipe.download; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.BaseTransientBottomBar; +import android.support.design.widget.Snackbar; +import android.view.View; + +import org.schabi.newpipe.R; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.PublishSubject; +import us.shandian.giga.get.DownloadManager; +import us.shandian.giga.get.DownloadMission; + +public class DeleteManager { + + private static final String KEY_STATE = "delete_manager_state"; + + private View mView; + private HashSet mPendingMap; + private List mDisposableList; + private DownloadManager mDownloadManager; + private PublishSubject publishSubject = PublishSubject.create(); + + DeleteManager(Activity activity) { + mPendingMap = new HashSet<>(); + mDisposableList = new ArrayList<>(); + mView = activity.findViewById(android.R.id.content); + } + + public Observable getUndoObservable() { + return publishSubject; + } + + public boolean contains(@NonNull DownloadMission mission) { + return mPendingMap.contains(mission.url); + } + + public void add(@NonNull DownloadMission mission) { + mPendingMap.add(mission.url); + + if (mPendingMap.size() == 1) { + showUndoDeleteSnackbar(mission); + } + } + + public void setDownloadManager(@NonNull DownloadManager downloadManager) { + mDownloadManager = downloadManager; + + if (mPendingMap.size() < 1) { + //nothing to do + return; + } + + showUndoDeleteSnackbar(); + } + + public void restoreState(@Nullable Bundle savedInstanceState) { + if (savedInstanceState == null) { + // nothing to do + return; + } + + List list = savedInstanceState.getStringArrayList(KEY_STATE); + if (list != null) { + mPendingMap.addAll(list); + } + } + + public void saveState(@Nullable Bundle outState) { + if (outState == null) { + // nothing to do + return; + } + + for (Disposable disposable : mDisposableList) { + disposable.dispose(); + } + + outState.putStringArrayList(KEY_STATE, new ArrayList<>(mPendingMap)); + } + + private void showUndoDeleteSnackbar() { + if (mPendingMap.size() < 1) { + // nothing to do + return; + } + + String url = mPendingMap.iterator().next(); + + for (int i = 0; i < mDownloadManager.getCount(); i++) { + DownloadMission mission = mDownloadManager.getMission(i); + if (url.equals(mission.url)) { + showUndoDeleteSnackbar(mission); + break; + } + } + } + + private void showUndoDeleteSnackbar(@NonNull DownloadMission mission) { + final Snackbar snackbar = Snackbar.make(mView, mission.name, Snackbar.LENGTH_INDEFINITE); + final Disposable disposable = Observable.timer(3, TimeUnit.SECONDS) + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(l -> snackbar.dismiss()); + + mDisposableList.add(disposable); + + snackbar.setAction(R.string.undo, v -> { + mPendingMap.remove(mission.url); + publishSubject.onNext(mission); + disposable.dispose(); + snackbar.dismiss(); + }); + + snackbar.addCallback(new BaseTransientBottomBar.BaseCallback() { + @Override + public void onDismissed(Snackbar transientBottomBar, int event) { + if (!disposable.isDisposed()) { + mPendingMap.remove(mission.url); + Completable.fromAction(() -> deletePending(mission)) + .subscribeOn(Schedulers.io()) + .subscribe(); + } + snackbar.removeCallback(this); + mDisposableList.remove(disposable); + showUndoDeleteSnackbar(); + } + }); + + snackbar.show(); + } + + public void deletePending() { + if (mPendingMap.size() < 1) { + // nothing to do + return; + } + + HashSet idSet = new HashSet<>(); + for (int i = 0; i < mDownloadManager.getCount(); i++) { + if (contains(mDownloadManager.getMission(i))) { + idSet.add(i); + } + } + + for (Integer id : idSet) { + mDownloadManager.deleteMission(id); + } + + mPendingMap.clear(); + } + + private void deletePending(@NonNull DownloadMission mission) { + if (!contains(mission)) { + // nothing to do + return; + } + + for (int i = 0; i < mDownloadManager.getCount(); i++) { + if (mission.url.equals(mDownloadManager.getMission(i).url)) { + mDownloadManager.deleteMission(i); + break; + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java index 6512f5270..f9c48a533 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java @@ -15,12 +15,17 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.settings.SettingsActivity; import org.schabi.newpipe.util.ThemeHelper; +import io.reactivex.Completable; +import io.reactivex.schedulers.Schedulers; import us.shandian.giga.service.DownloadManagerService; import us.shandian.giga.ui.fragment.AllMissionsFragment; import us.shandian.giga.ui.fragment.MissionsFragment; public class DownloadActivity extends AppCompatActivity { + private static final String MISSIONS_FRAGMENT_TAG = "fragment_tag"; + private DeleteManager mDeleteManager; + @Override protected void onCreate(Bundle savedInstanceState) { // Service @@ -42,21 +47,35 @@ public class DownloadActivity extends AppCompatActivity { actionBar.setDisplayShowTitleEnabled(true); } - // Fragment - getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - updateFragments(); - getWindow().getDecorView().getViewTreeObserver().removeGlobalOnLayoutListener(this); - } - }); + mDeleteManager = new DeleteManager(this); + mDeleteManager.restoreState(savedInstanceState); + + MissionsFragment fragment = (MissionsFragment) getFragmentManager().findFragmentByTag(MISSIONS_FRAGMENT_TAG); + if (fragment != null) { + fragment.setDeleteManager(mDeleteManager); + } else { + getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + updateFragments(); + getWindow().getDecorView().getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + }); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + mDeleteManager.saveState(outState); + super.onSaveInstanceState(outState); } private void updateFragments() { - MissionsFragment fragment = new AllMissionsFragment(); + fragment.setDeleteManager(mDeleteManager); + getFragmentManager().beginTransaction() - .replace(R.id.frame, fragment) + .replace(R.id.frame, fragment, MISSIONS_FRAGMENT_TAG) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); } @@ -80,6 +99,7 @@ public class DownloadActivity extends AppCompatActivity { case R.id.action_settings: { Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); + deletePending(); return true; } default: @@ -87,4 +107,15 @@ public class DownloadActivity extends AppCompatActivity { } } + @Override + public void onBackPressed() { + super.onBackPressed(); + deletePending(); + } + + private void deletePending() { + Completable.fromAction(mDeleteManager::deletePending) + .subscribeOn(Schedulers.io()) + .subscribe(); + } } diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 12c81c127..4054c8a15 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -25,10 +25,13 @@ import android.widget.TextView; import android.widget.Toast; import org.schabi.newpipe.R; +import org.schabi.newpipe.download.DeleteManager; import java.io.File; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -52,18 +55,34 @@ public class MissionAdapter extends RecyclerView.Adapter mItemList; private DownloadManagerService.DMBinder mBinder; private int mLayout; - public MissionAdapter(Activity context, DownloadManagerService.DMBinder binder, DownloadManager manager, boolean isLinear) { + public MissionAdapter(Activity context, DownloadManagerService.DMBinder binder, DownloadManager downloadManager, DeleteManager deleteManager, boolean isLinear) { mContext = context; - mManager = manager; + mDownloadManager = downloadManager; + mDeleteManager = deleteManager; mBinder = binder; mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mLayout = isLinear ? R.layout.mission_item_linear : R.layout.mission_item; + + mItemList = new ArrayList<>(); + updateItemList(); + } + + public void updateItemList() { + mItemList.clear(); + + for (int i = 0; i < mDownloadManager.getCount(); i++) { + DownloadMission mission = mDownloadManager.getMission(i); + if (!mDeleteManager.contains(mission)) { + mItemList.add(mDownloadManager.getMission(i)); + } + } } @Override @@ -102,7 +121,7 @@ public class MissionAdapter extends RecyclerView.Adapter= Build.VERSION_CODES.LOLLIPOP) { - intent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION); - } - //mContext.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); - Log.v(TAG, "Starting intent: " + intent); - mContext.startActivity(intent); - } - private void viewFileWithFileProvider(File file, String mimetype) { String ourPackage = mContext.getApplicationContext().getPackageName(); Uri uri = FileProvider.getUriForFile(mContext, ourPackage + ".provider", file); diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 2ff83086f..bf5a82c0e 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -10,6 +10,8 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -19,13 +21,17 @@ import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.R; +import org.schabi.newpipe.download.DeleteManager; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; import us.shandian.giga.get.DownloadManager; +import us.shandian.giga.get.DownloadMission; import us.shandian.giga.service.DownloadManagerService; import us.shandian.giga.ui.adapter.MissionAdapter; public abstract class MissionsFragment extends Fragment { - private DownloadManager mManager; + private DownloadManager mDownloadManager; private DownloadManagerService.DMBinder mBinder; private SharedPreferences mPrefs; @@ -37,14 +43,19 @@ public abstract class MissionsFragment extends Fragment { private GridLayoutManager mGridManager; private LinearLayoutManager mLinearManager; private Context mActivity; + private DeleteManager mDeleteManager; + private Disposable mDeleteDisposable; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { mBinder = (DownloadManagerService.DMBinder) binder; - mManager = setupDownloadManager(mBinder); - updateList(); + mDownloadManager = setupDownloadManager(mBinder); + if (mDeleteManager != null) { + mDeleteManager.setDownloadManager(mDownloadManager); + updateList(); + } } @Override @@ -55,6 +66,14 @@ public abstract class MissionsFragment extends Fragment { }; + public void setDeleteManager(@NonNull DeleteManager deleteManager) { + mDeleteManager = deleteManager; + if (mDownloadManager != null) { + mDeleteManager.setDownloadManager(mDownloadManager); + updateList(); + } + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.missions, container, false); @@ -104,10 +123,26 @@ public abstract class MissionsFragment extends Fragment { mActivity = activity; } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (mDeleteManager != null) { + mDeleteDisposable = mDeleteManager.getUndoObservable().subscribe(mission -> { + if (mAdapter != null) { + mAdapter.updateItemList(); + mAdapter.notifyDataSetChanged(); + } + }); + } + } + @Override public void onDestroyView() { super.onDestroyView(); getActivity().unbindService(mConnection); + if (mDeleteDisposable != null) { + mDeleteDisposable.dispose(); + } } @Override @@ -129,7 +164,7 @@ public abstract class MissionsFragment extends Fragment { } private void updateList() { - mAdapter = new MissionAdapter((Activity) mActivity, mBinder, mManager, mLinear); + mAdapter = new MissionAdapter((Activity) mActivity, mBinder, mDownloadManager, mDeleteManager, mLinear); if (mLinear) { mList.setLayoutManager(mLinearManager); @@ -143,7 +178,7 @@ public abstract class MissionsFragment extends Fragment { mSwitch.setIcon(mLinear ? R.drawable.grid : R.drawable.list); } - mPrefs.edit().putBoolean("linear", mLinear).commit(); + mPrefs.edit().putBoolean("linear", mLinear).apply(); } protected abstract DownloadManager setupDownloadManager(DownloadManagerService.DMBinder binder); From 2515b8167f57ef23d0aa053c62eaba3433775b33 Mon Sep 17 00:00:00 2001 From: Issam Maghni Date: Fri, 15 Jun 2018 01:21:30 -0400 Subject: [PATCH 017/363] Disable animation (hidden anyway by navigation) --- .../java/org/schabi/newpipe/MainActivity.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 0ce6772bb..61b430c27 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -106,7 +106,19 @@ public class MainActivity extends AppCompatActivity { drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); - toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close); + toggle = new ActionBarDrawerToggle(this, drawer, toolbar, + R.string.drawer_open, R.string.drawer_close) { + @Override + public void onDrawerClosed(View view) { super.onDrawerClosed(view); } + + @Override + public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } + + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + super.onDrawerSlide(drawerView, 0); + } + }; toggle.syncState(); drawer.addDrawerListener(toggle); drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @@ -133,13 +145,11 @@ public class MainActivity extends AppCompatActivity { private boolean changeService(MenuItem item) { - if (item.getGroupId() == R.id.menu_services_group) { - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(false); - ServiceHelper.setSelectedServiceId(this, item.getItemId()); - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); - } else { + if (item.getGroupId() != R.id.menu_services_group) return false; - } + drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(false); + ServiceHelper.setSelectedServiceId(this, item.getItemId()); + drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); drawer.closeDrawers(); return true; } From 8b8652d44c3a92156915a92e73bef3f268610888 Mon Sep 17 00:00:00 2001 From: "Andrei.Rosca" Date: Fri, 15 Jun 2018 16:15:55 +0200 Subject: [PATCH 018/363] undo delete - code format --- ...anager.java => DeleteDownloadManager.java} | 36 +++++-------------- .../newpipe/download/DownloadActivity.java | 14 ++++---- .../giga/ui/adapter/MissionAdapter.java | 12 +++---- .../giga/ui/fragment/MissionsFragment.java | 22 ++++++------ 4 files changed, 31 insertions(+), 53 deletions(-) rename app/src/main/java/org/schabi/newpipe/download/{DeleteManager.java => DeleteDownloadManager.java} (86%) diff --git a/app/src/main/java/org/schabi/newpipe/download/DeleteManager.java b/app/src/main/java/org/schabi/newpipe/download/DeleteDownloadManager.java similarity index 86% rename from app/src/main/java/org/schabi/newpipe/download/DeleteManager.java rename to app/src/main/java/org/schabi/newpipe/download/DeleteDownloadManager.java index 210cf668d..f2912a6fa 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DeleteManager.java +++ b/app/src/main/java/org/schabi/newpipe/download/DeleteDownloadManager.java @@ -24,7 +24,7 @@ import io.reactivex.subjects.PublishSubject; import us.shandian.giga.get.DownloadManager; import us.shandian.giga.get.DownloadMission; -public class DeleteManager { +public class DeleteDownloadManager { private static final String KEY_STATE = "delete_manager_state"; @@ -34,7 +34,7 @@ public class DeleteManager { private DownloadManager mDownloadManager; private PublishSubject publishSubject = PublishSubject.create(); - DeleteManager(Activity activity) { + DeleteDownloadManager(Activity activity) { mPendingMap = new HashSet<>(); mDisposableList = new ArrayList<>(); mView = activity.findViewById(android.R.id.content); @@ -59,19 +59,13 @@ public class DeleteManager { public void setDownloadManager(@NonNull DownloadManager downloadManager) { mDownloadManager = downloadManager; - if (mPendingMap.size() < 1) { - //nothing to do - return; - } + if (mPendingMap.size() < 1) return; showUndoDeleteSnackbar(); } public void restoreState(@Nullable Bundle savedInstanceState) { - if (savedInstanceState == null) { - // nothing to do - return; - } + if (savedInstanceState == null) return; List list = savedInstanceState.getStringArrayList(KEY_STATE); if (list != null) { @@ -80,10 +74,7 @@ public class DeleteManager { } public void saveState(@Nullable Bundle outState) { - if (outState == null) { - // nothing to do - return; - } + if (outState == null) return; for (Disposable disposable : mDisposableList) { disposable.dispose(); @@ -93,10 +84,7 @@ public class DeleteManager { } private void showUndoDeleteSnackbar() { - if (mPendingMap.size() < 1) { - // nothing to do - return; - } + if (mPendingMap.size() < 1) return; String url = mPendingMap.iterator().next(); @@ -128,11 +116,11 @@ public class DeleteManager { @Override public void onDismissed(Snackbar transientBottomBar, int event) { if (!disposable.isDisposed()) { - mPendingMap.remove(mission.url); Completable.fromAction(() -> deletePending(mission)) .subscribeOn(Schedulers.io()) .subscribe(); } + mPendingMap.remove(mission.url); snackbar.removeCallback(this); mDisposableList.remove(disposable); showUndoDeleteSnackbar(); @@ -143,10 +131,7 @@ public class DeleteManager { } public void deletePending() { - if (mPendingMap.size() < 1) { - // nothing to do - return; - } + if (mPendingMap.size() < 1) return; HashSet idSet = new HashSet<>(); for (int i = 0; i < mDownloadManager.getCount(); i++) { @@ -163,11 +148,6 @@ public class DeleteManager { } private void deletePending(@NonNull DownloadMission mission) { - if (!contains(mission)) { - // nothing to do - return; - } - for (int i = 0; i < mDownloadManager.getCount(); i++) { if (mission.url.equals(mDownloadManager.getMission(i).url)) { mDownloadManager.deleteMission(i); diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java index f9c48a533..4a2c85149 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java @@ -24,7 +24,7 @@ import us.shandian.giga.ui.fragment.MissionsFragment; public class DownloadActivity extends AppCompatActivity { private static final String MISSIONS_FRAGMENT_TAG = "fragment_tag"; - private DeleteManager mDeleteManager; + private DeleteDownloadManager mDeleteDownloadManager; @Override protected void onCreate(Bundle savedInstanceState) { @@ -47,12 +47,12 @@ public class DownloadActivity extends AppCompatActivity { actionBar.setDisplayShowTitleEnabled(true); } - mDeleteManager = new DeleteManager(this); - mDeleteManager.restoreState(savedInstanceState); + mDeleteDownloadManager = new DeleteDownloadManager(this); + mDeleteDownloadManager.restoreState(savedInstanceState); MissionsFragment fragment = (MissionsFragment) getFragmentManager().findFragmentByTag(MISSIONS_FRAGMENT_TAG); if (fragment != null) { - fragment.setDeleteManager(mDeleteManager); + fragment.setDeleteManager(mDeleteDownloadManager); } else { getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override @@ -66,13 +66,13 @@ public class DownloadActivity extends AppCompatActivity { @Override protected void onSaveInstanceState(Bundle outState) { - mDeleteManager.saveState(outState); + mDeleteDownloadManager.saveState(outState); super.onSaveInstanceState(outState); } private void updateFragments() { MissionsFragment fragment = new AllMissionsFragment(); - fragment.setDeleteManager(mDeleteManager); + fragment.setDeleteManager(mDeleteDownloadManager); getFragmentManager().beginTransaction() .replace(R.id.frame, fragment, MISSIONS_FRAGMENT_TAG) @@ -114,7 +114,7 @@ public class DownloadActivity extends AppCompatActivity { } private void deletePending() { - Completable.fromAction(mDeleteManager::deletePending) + Completable.fromAction(mDeleteDownloadManager::deletePending) .subscribeOn(Schedulers.io()) .subscribe(); } diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 4054c8a15..8127c3467 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -25,7 +25,7 @@ import android.widget.TextView; import android.widget.Toast; import org.schabi.newpipe.R; -import org.schabi.newpipe.download.DeleteManager; +import org.schabi.newpipe.download.DeleteDownloadManager; import java.io.File; import java.lang.ref.WeakReference; @@ -56,15 +56,15 @@ public class MissionAdapter extends RecyclerView.Adapter mItemList; private DownloadManagerService.DMBinder mBinder; private int mLayout; - public MissionAdapter(Activity context, DownloadManagerService.DMBinder binder, DownloadManager downloadManager, DeleteManager deleteManager, boolean isLinear) { + public MissionAdapter(Activity context, DownloadManagerService.DMBinder binder, DownloadManager downloadManager, DeleteDownloadManager deleteDownloadManager, boolean isLinear) { mContext = context; mDownloadManager = downloadManager; - mDeleteManager = deleteManager; + mDeleteDownloadManager = deleteDownloadManager; mBinder = binder; mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -79,7 +79,7 @@ public class MissionAdapter extends RecyclerView.Adapter { + if (mDeleteDownloadManager != null) { + mDeleteDisposable = mDeleteDownloadManager.getUndoObservable().subscribe(mission -> { if (mAdapter != null) { mAdapter.updateItemList(); mAdapter.notifyDataSetChanged(); @@ -164,7 +162,7 @@ public abstract class MissionsFragment extends Fragment { } private void updateList() { - mAdapter = new MissionAdapter((Activity) mActivity, mBinder, mDownloadManager, mDeleteManager, mLinear); + mAdapter = new MissionAdapter((Activity) mActivity, mBinder, mDownloadManager, mDeleteDownloadManager, mLinear); if (mLinear) { mList.setLayoutManager(mLinearManager); From 95ba1873e40a1d4857fd16295a6ff263403039d5 Mon Sep 17 00:00:00 2001 From: annoyatron255 Date: Sat, 16 Jun 2018 18:12:56 -0500 Subject: [PATCH 019/363] Fix #1440 Broken Video Info Layout --- app/src/main/res/layout/fragment_video_detail.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 2b1f94c4a..7c6568b67 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -101,7 +101,8 @@ + android:layout_height="match_parent" + android:background="?android:windowBackground"> Date: Sun, 17 Jun 2018 13:55:43 +0200 Subject: [PATCH 020/363] Added download to share menu --- .../org/schabi/newpipe/RouterActivity.java | 59 ++++++++++++++++++- app/src/main/res/values/settings_keys.xml | 1 + 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index a862384cf..6b63d5746 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -1,5 +1,7 @@ package org.schabi.newpipe; +import android.annotation.SuppressLint; +import android.app.FragmentManager; import android.app.IntentService; import android.content.Context; import android.content.DialogInterface; @@ -8,6 +10,7 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.DrawableRes; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; import android.support.v7.app.AlertDialog; @@ -23,6 +26,7 @@ import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; +import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; @@ -31,6 +35,8 @@ import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.playqueue.ChannelPlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueue; @@ -38,16 +44,19 @@ import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Observer; import icepick.Icepick; import icepick.State; @@ -77,6 +86,8 @@ public class RouterActivity extends AppCompatActivity { protected String currentUrl; protected CompositeDisposable disposables = new CompositeDisposable(); + private boolean notDownload = true; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -95,10 +106,16 @@ public class RouterActivity extends AppCompatActivity { ? R.style.RouterActivityThemeLight : R.style.RouterActivityThemeDark); } + @SuppressLint("MissingSuperCall") @Override protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + + } + + @Override + protected void onPause() { + + super.onPause(); } @Override @@ -165,6 +182,7 @@ public class RouterActivity extends AppCompatActivity { final String videoPlayerKey = getString(R.string.video_player_key); final String backgroundPlayerKey = getString(R.string.background_player_key); final String popupPlayerKey = getString(R.string.popup_player_key); + final String downloadKey = getString(R.string.download_key); final String alwaysAskKey = getString(R.string.always_ask_open_action_key); if (selectedChoiceKey.equals(alwaysAskKey)) { @@ -179,6 +197,8 @@ public class RouterActivity extends AppCompatActivity { } } else if (selectedChoiceKey.equals(showInfoKey)) { handleChoice(showInfoKey); + } else if (selectedChoiceKey.equals(downloadKey)) { + handleChoice(downloadKey); } else { final boolean isExtVideoEnabled = preferences.getBoolean(getString(R.string.use_external_video_player_key), false); final boolean isExtAudioEnabled = preferences.getBoolean(getString(R.string.use_external_audio_player_key), false); @@ -236,7 +256,9 @@ public class RouterActivity extends AppCompatActivity { .setCancelable(true) .setNegativeButton(R.string.just_once, dialogButtonsClickListener) .setPositiveButton(R.string.always, dialogButtonsClickListener) - .setOnDismissListener((dialog) -> finish()) + .setOnDismissListener((dialog) -> { + if(notDownload) finish(); + }) .create(); //noinspection CodeBlock2Expr @@ -316,6 +338,9 @@ public class RouterActivity extends AppCompatActivity { resolveResourceIdFromAttr(context, R.attr.audio))); } + returnList.add(new AdapterChoiceItem(getString(R.string.download_key), getString(R.string.download), + resolveResourceIdFromAttr(context, R.attr.download))); + return returnList; } @@ -333,6 +358,7 @@ public class RouterActivity extends AppCompatActivity { positiveButton.setEnabled(state); } + @SuppressLint("CheckResult") private void handleChoice(final String selectedChoiceKey) { final List validChoicesList = Arrays.asList(getResources().getStringArray(R.array.preferred_open_action_values_list)); if (validChoicesList.contains(selectedChoiceKey)) { @@ -347,6 +373,33 @@ public class RouterActivity extends AppCompatActivity { return; } + if (selectedChoiceKey.equals(getString(R.string.download_key))) { + ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((@NonNull StreamInfo result) -> { + StreamInfo currentInfo = result; + List sortedVideoStreams = ListHelper.getSortedStreamVideosList(this, currentInfo.getVideoStreams(), currentInfo.getVideoOnlyStreams(), false); + int selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(this, sortedVideoStreams); + + android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); + + DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo); + downloadDialog.setVideoStreams(sortedVideoStreams); + downloadDialog.setAudioStreams(currentInfo.getAudioStreams()); + downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex); + downloadDialog.show(fm, "downloadDialog"); + fm.executePendingTransactions(); + downloadDialog.getDialog().setOnDismissListener(dialog -> { + finish(); + }); + }, (@NonNull Throwable throwable) -> { + onError(); + }); + notDownload = false; + return; + } + // stop and bypass FetcherService if InfoScreen was selected since // StreamDetailFragment can fetch data itself if (selectedChoiceKey.equals(getString(R.string.show_info_key))) { diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index fc7cfd1b4..82f4ebdbe 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -178,6 +178,7 @@ video_player background_player popup_player + download always_ask_player From 0c21023ad8d437ed00cbd7bfa5923fee53627cdc Mon Sep 17 00:00:00 2001 From: rimasx Date: Sun, 17 Jun 2018 13:56:27 +0000 Subject: [PATCH 021/363] Added translation using Weblate (Estonian) --- app/src/main/res/values-et/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-et/strings.xml diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-et/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From fcf650c6eb5758dc93f9258bed0c64d8482717ef Mon Sep 17 00:00:00 2001 From: Edwar Tikhonov Date: Sun, 17 Jun 2018 12:33:07 +0000 Subject: [PATCH 022/363] Translated using Weblate (Russian) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-ru/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 892a78049..19ef35d96 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,20 +1,20 @@ %1$s просмотров - Опубликовано %1$s - Ни одного потокового проигрывателя не было найдено. Установить VLC? + Опубликован в %1$s + Потоковый плеер не найден. Установить VLC? Установить Отмена Открыть в браузере Поделиться Скачать - Найти + Поиск Настройки Возможно, вы имели в виду: %1$s? Поделиться с помощью Выбрать браузер поворот - Папка для загрузки видео + Путь для загрузки видео Папка для хранения загруженных видео Введите путь к папке для загрузки видео Разрешение по умолчанию @@ -155,7 +155,7 @@ Отключено Изменение размера - Для некоторых видео может отсутствовать звук, если включена эта опция + В некоторых разрешениях НЕ будет звука, если эта опция выбрана  млн.  млрд. @@ -293,7 +293,7 @@ Воспроизвести тут Воспроизвести в фоне Воспроизвести в окне -Ни одного потокового проигрывателя не было найдено (вы можете установить VLC) +Потоковый плеер не найден (вы можете установить VLC) Страна контента по умолчанию Сервис Всегда From 7fb93453444dff33a34f0fa914861e1734ed1947 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Mon, 18 Jun 2018 18:22:52 -0700 Subject: [PATCH 023/363] -Fixed remote playlist metadata not updated when remote source data has changed. --- .../playlist/model/PlaylistRemoteEntity.java | 8 +++++++ .../list/playlist/PlaylistFragment.java | 24 +++++++++++++------ .../local/playlist/RemotePlaylistManager.java | 9 ++++--- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index 486350fc9..e2f2c8b08 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -71,6 +71,14 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { info.getUploaderName(), info.getStreamCount()); } + @Ignore + public boolean isIdenticalTo(final PlaylistInfo info) { + return getServiceId() == info.getServiceId() && getName().equals(info.getName()) && + getStreamCount() == info.getStreamCount() && getUrl().equals(info.getUrl()) && + getThumbnailUrl().equals(info.getThumbnailUrl()) && + getUploader().equals(info.getUploaderName()); + } + public long getUid() { return uid; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 0498c95c5..3481805a8 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -29,8 +29,8 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; -import org.schabi.newpipe.local.playlist.RemotePlaylistManager; import org.schabi.newpipe.info_list.InfoItemDialog; +import org.schabi.newpipe.local.playlist.RemotePlaylistManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; @@ -44,6 +44,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import io.reactivex.Flowable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; @@ -93,7 +94,8 @@ public class PlaylistFragment extends BaseListInfoFragment { super.onCreate(savedInstanceState); disposables = new CompositeDisposable(); isBookmarkButtonReady = new AtomicBoolean(false); - remotePlaylistManager = new RemotePlaylistManager(NewPipeDatabase.getInstance(getContext())); + remotePlaylistManager = new RemotePlaylistManager(NewPipeDatabase.getInstance( + requireContext())); } @Override @@ -281,14 +283,11 @@ public class PlaylistFragment extends BaseListInfoFragment { } remotePlaylistManager.getPlaylist(result) + .flatMap(lists -> getUpdateProcessor(lists, result), (lists, id) -> lists) .onBackpressureLatest() .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistBookmarkSubscriber()); - remotePlaylistManager.onUpdate(result) - .subscribeOn(AndroidSchedulers.mainThread()) - .subscribe(integer -> {/* Do nothing*/}, this::onError); - headerPlayAllButton.setOnClickListener(view -> NavigationHelper.playOnMainPlayer(activity, getPlayQueue())); headerPopupButton.setOnClickListener(view -> @@ -344,6 +343,17 @@ public class PlaylistFragment extends BaseListInfoFragment { // Utils //////////////////////////////////////////////////////////////////////////*/ + private Flowable getUpdateProcessor(@NonNull List playlists, + @NonNull PlaylistInfo result) { + final Flowable noItemToUpdate = Flowable.just(/*noItemToUpdate=*/-1); + if (playlists.isEmpty()) return noItemToUpdate; + + final PlaylistRemoteEntity playlistEntity = playlists.get(0); + if (playlistEntity.isIdenticalTo(result)) return noItemToUpdate; + + return remotePlaylistManager.onUpdate(playlists.get(0).getUid(), result).toFlowable(); + } + private Subscriber> getPlaylistBookmarkSubscriber() { return new Subscriber>() { @Override @@ -416,4 +426,4 @@ public class PlaylistFragment extends BaseListInfoFragment { playlistBookmarkButton.setIcon(ThemeHelper.resolveResourceIdFromAttr(activity, iconAttr)); playlistBookmarkButton.setTitle(titleRes); } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java index 526b49c15..1ae8a22a8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java @@ -40,8 +40,11 @@ public class RemotePlaylistManager { }).subscribeOn(Schedulers.io()); } - public Single onUpdate(final PlaylistInfo playlistInfo) { - return Single.fromCallable(() -> playlistRemoteTable.update(new PlaylistRemoteEntity(playlistInfo))) - .subscribeOn(Schedulers.io()); + public Single onUpdate(final long playlistId, final PlaylistInfo playlistInfo) { + return Single.fromCallable(() -> { + PlaylistRemoteEntity playlist = new PlaylistRemoteEntity(playlistInfo); + playlist.setUid(playlistId); + return playlistRemoteTable.update(playlist); + }).subscribeOn(Schedulers.io()); } } From b338d9dbcfbd068929ccbeef99d6acd4996dd2e7 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Mon, 18 Jun 2018 18:27:30 -0700 Subject: [PATCH 024/363] -Fixed view not registered when playback is started on external players. --- .../fragments/detail/VideoDetailFragment.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 68c0a11ff..ab2182a68 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -56,12 +56,14 @@ import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; @@ -128,7 +130,7 @@ public class VideoDetailFragment private StreamInfo currentInfo; private Disposable currentWorker; - private CompositeDisposable disposables = new CompositeDisposable(); + @NonNull private CompositeDisposable disposables = new CompositeDisposable(); private List sortedVideoStreams; private int selectedVideoStreamIndex = -1; @@ -872,10 +874,7 @@ public class VideoDetailFragment if (!useExternalAudioPlayer && android.os.Build.VERSION.SDK_INT >= 16) { openNormalBackgroundPlayer(append); } else { - NavigationHelper.playOnExternalPlayer(activity, - currentInfo.getName(), - currentInfo.getUploaderName(), - audioStream); + startOnExternalPlayer(activity, currentInfo, audioStream); } } @@ -902,10 +901,7 @@ public class VideoDetailFragment if (PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(this.getString(R.string.use_external_video_player_key), false)) { - NavigationHelper.playOnExternalPlayer(activity, - currentInfo.getName(), - currentInfo.getUploaderName(), - selectedVideoStream); + startOnExternalPlayer(activity, currentInfo, selectedVideoStream); } else { openNormalPlayer(selectedVideoStream); } @@ -949,6 +945,20 @@ public class VideoDetailFragment this.autoPlayEnabled = autoplay; } + private void startOnExternalPlayer(@NonNull final Context context, + @NonNull final StreamInfo info, + @NonNull final Stream selectedStream) { + NavigationHelper.playOnExternalPlayer(context, currentInfo.getName(), + currentInfo.getUploaderName(), selectedStream); + + final HistoryRecordManager recordManager = new HistoryRecordManager(requireContext()); + disposables.add(recordManager.onViewed(info).onErrorComplete() + .subscribe( + ignored -> {/* successful */}, + error -> Log.e(TAG, "Register view failure: ", error) + )); + } + @Nullable private VideoStream getSelectedVideoStream() { return sortedVideoStreams != null ? sortedVideoStreams.get(selectedVideoStreamIndex) : null; From e79eda9c5cba28c5d035c86d724c4af2fb7370f3 Mon Sep 17 00:00:00 2001 From: Andrea Troiano Date: Mon, 18 Jun 2018 07:05:19 +0000 Subject: [PATCH 025/363] Translated using Weblate (Italian) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-it/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index fb5d9405b..727ddcf79 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -186,7 +186,7 @@ Informazioni Licenze di terze parti © %1$s di %2$s protetto da licenza %3$s - Impossible caricare il contratto di licenza + Impossible caricare la licenza Visita il sito Informazioni Contributori @@ -218,7 +218,7 @@ Scarica Caratteri ammessi nei nomi dei file - I caratteri non validi vengono sostituiti con questo + I caratteri non validi vengono sostituiti con Carattere sostitutivo Lettere e cifre @@ -325,9 +325,9 @@ Nessun flusso video trovato Nessun flusso audio trovato - Riproduttore video - Riproduttore di fondo - Riproduttore a comparsa + Lettore video + Riproduzione in sottofondo + Riproduzione in modalità popup Chiedi sempre Raccogliendo informazioni… @@ -418,7 +418,7 @@ Importa/Esporta Importa Importa da - Esporta a + Esporta in Importando… Esportando… From af2a2e45af1d234741d29f3c52ebc903fa4f691a Mon Sep 17 00:00:00 2001 From: Ale-Ma Date: Mon, 18 Jun 2018 07:05:27 +0000 Subject: [PATCH 026/363] Translated using Weblate (Italian) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 727ddcf79..2b2431b09 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -472,7 +472,7 @@ Elimina l\'intera cronologia visualizzazioni. Cronologia visualizzazioni eliminata. Pulisci cronologia delle ricerche - Elimina la cronologia delle ricerche effettuate. + Cancella la cronologia dei termini di ricerca. Elimina l\'intera cronologia delle ricerche. Cronologia delle ricerche eliminata. 1 elemento eliminato. From f3e029c3f64efe814d10416d39d00929a1e1d274 Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Wed, 20 Jun 2018 14:46:57 +0200 Subject: [PATCH 027/363] Cleaned code, downloaddialog now also appears after giving storage permission. --- .../org/schabi/newpipe/RouterActivity.java | 87 +++++++++++-------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 6b63d5746..4f1fdeab2 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -7,11 +7,13 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; import android.support.v4.app.NotificationCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -86,7 +88,7 @@ public class RouterActivity extends AppCompatActivity { protected String currentUrl; protected CompositeDisposable disposables = new CompositeDisposable(); - private boolean notDownload = true; + private boolean selectionIsDownload = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -106,22 +108,16 @@ public class RouterActivity extends AppCompatActivity { ? R.style.RouterActivityThemeLight : R.style.RouterActivityThemeDark); } - @SuppressLint("MissingSuperCall") @Override protected void onSaveInstanceState(Bundle outState) { - - } - - @Override - protected void onPause() { - - super.onPause(); + super.onSaveInstanceState(outState); + Icepick.saveInstanceState(this, outState); } @Override protected void onStart() { super.onStart(); - + handleUrl(currentUrl); } @@ -257,7 +253,7 @@ public class RouterActivity extends AppCompatActivity { .setNegativeButton(R.string.just_once, dialogButtonsClickListener) .setPositiveButton(R.string.always, dialogButtonsClickListener) .setOnDismissListener((dialog) -> { - if(notDownload) finish(); + if(!selectionIsDownload) finish(); }) .create(); @@ -358,7 +354,6 @@ public class RouterActivity extends AppCompatActivity { positiveButton.setEnabled(state); } - @SuppressLint("CheckResult") private void handleChoice(final String selectedChoiceKey) { final List validChoicesList = Arrays.asList(getResources().getStringArray(R.array.preferred_open_action_values_list)); if (validChoicesList.contains(selectedChoiceKey)) { @@ -374,29 +369,10 @@ public class RouterActivity extends AppCompatActivity { } if (selectedChoiceKey.equals(getString(R.string.download_key))) { - ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe((@NonNull StreamInfo result) -> { - StreamInfo currentInfo = result; - List sortedVideoStreams = ListHelper.getSortedStreamVideosList(this, currentInfo.getVideoStreams(), currentInfo.getVideoOnlyStreams(), false); - int selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(this, sortedVideoStreams); - - android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); - - DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo); - downloadDialog.setVideoStreams(sortedVideoStreams); - downloadDialog.setAudioStreams(currentInfo.getAudioStreams()); - downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex); - downloadDialog.show(fm, "downloadDialog"); - fm.executePendingTransactions(); - downloadDialog.getDialog().setOnDismissListener(dialog -> { - finish(); - }); - }, (@NonNull Throwable throwable) -> { - onError(); - }); - notDownload = false; + if (PermissionHelper.checkStoragePermissions(this, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { + selectionIsDownload = true; + openDownloadDialog(); + } return; } @@ -426,6 +402,47 @@ public class RouterActivity extends AppCompatActivity { finish(); } + @SuppressLint("CheckResult") + private void openDownloadDialog() { + ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((@NonNull StreamInfo result) -> { + List sortedVideoStreams = ListHelper.getSortedStreamVideosList(this, + result.getVideoStreams(), + result.getVideoOnlyStreams(), + false); + int selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(this, + sortedVideoStreams); + + android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); + DownloadDialog downloadDialog = DownloadDialog.newInstance(result); + downloadDialog.setVideoStreams(sortedVideoStreams); + downloadDialog.setAudioStreams(result.getAudioStreams()); + downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex); + downloadDialog.show(fm, "downloadDialog"); + fm.executePendingTransactions(); + downloadDialog.getDialog().setOnDismissListener(dialog -> { + finish(); + }); + }, (@NonNull Throwable throwable) -> { + onError(); + }); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + for (int i: grantResults){ + if (i == PackageManager.PERMISSION_DENIED){ + finish(); + return; + } + } + if (requestCode == PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE) { + openDownloadDialog(); + } + } + private static class AdapterChoiceItem { final String description, key; @DrawableRes final int icon; From 155436b85dbff2130cf78079d307174db8a8d306 Mon Sep 17 00:00:00 2001 From: D D Date: Wed, 20 Jun 2018 19:13:29 +0000 Subject: [PATCH 028/363] Translated using Weblate (Bulgarian) Currently translated at 62.7% (234 of 373 strings) --- app/src/main/res/values-bg/strings.xml | 87 +++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 8ab7ee9dc..de171538a 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -18,7 +18,7 @@ Използвай външен видео плейър Някои резолюции няма да имат вграден аудио поток ако изберете тази опция Използвай външен аудио плейър - Режим с подпрозорец на NewPipe + Режим малък прозорец на NewPipe Абониране Абониран Премахнат абонамент за канала @@ -33,7 +33,7 @@ Подпрозорец Локация за запис на клиповете - Път за съхранение на свалени клипове + Място за съхранение на свалени клипове Въведи път за съхранение на свалени клипове Локация за запис на аудио @@ -64,25 +64,25 @@ Контролиране на плейъра чрез жестове Използвай жестове за да контролираш яркостта и силата на звука на плейъра Предложения за търсене - Покажи предположения по време на търсене + Показвай предположения по време на търсене История на търсенията Съхранявай заявките за търсене локално - История + История и кеш-памет Следи изгледаните клипове Поднови клип при възобновяване на фокуса Продължава въпроизвеждането след прекъсване (например, телефонно обаждане) Свалени Следващ клип - Показвай следващия и подобни клипове + Показвай „следващи“ и „подобни“ клипове Показвай поле със съвет \"Задръж за добавяне\" Неподдържан URL Език на съдържанието по подразбиране Плейър Поведение Видео & Аудио - История + История и кеш-памет Подпрозорец - Вид + Външност Други Въпроизвеждане във фонов режим Въпроизвеждане в подпрозорец @@ -211,4 +211,77 @@ Лицензии Безплатен и лек YouTube фронтенд за Android. Виж в GitHub + Изтегли стрийм файл. + Покажи инфо + + NewPipe + Отметки + + Добави към + + Използвай бързо, но неточно превъртане + Неточното превъртане позволява на плейъра да превърта кадри по-бързо с намалена прецизност + Зареждай иконки + Кеш-паметта с изображения е изтрита + Изчисти кешираните метаданни + Изчисти всички кешираини метаданни за уебстраници + Кеш-паметта с метаданни бе изчистена + Автоматично пускай следващия + Автоматично прибавяне на сродно съдържание при неповтарящ се преглед . + Държава по подразбиране, за която да бъде показвано подходящо съдържание + Услуга + Отстраняване на грешки + Винаги + Само веднъж + Файл + + Смени ориентацията + Мини към фонов режим + Мини към изкачащ прозорец + Мини в основен режим + + Внасяне на база данни + Изнасяне на база данни + Ще замени текущите история и абонаменти + Изнасяне на история, абонаменти и плейлисти + Изчисти историята с изгледани + Изтрий цялата история с изгледани. + Историята с изгледани е изтрита. + Изтрий историята на търсенията + Изтрива историята с въвежданите за търсене ключови думи. + Изтрий цялата история на гледанията. + Историята на търсенията е изтрита. + URL подписът на видеото не можа да бъде дешифрован + Външните плейъри не поддържат този вид линкове + Невалиден URL + Невалидна директория + Невалиден файл или източник на съдържание + Файлът не съществува или липсва разрешение за четене и/или запис + Името на файла не може да бъде празно + Възникна грешка: %1$s + Не са налични източници за изтегляне + + хил. + млн. + млрд. + + Няма абонати + Създай + Изтрий всички + Откажи + Няма инсталирано приложение, което да изпълни този файл + + © %1$s от %2$s под лиценза %3$s + Направи принос + За всичко, което се сетите: превод, промени по дизайна, изчистване на кода или много сериозни промени по кода – помощта е винаги добре дошла. Колкото повече се прави по това, толкова по-добре се получава. + Направи дарение + NewPipe се разработва от доброволни разработчици, което отделят от своето време, за да ви доставят най-доброто преживяване. Дайте от себе си, за да помогнете на разработчиците да направят NewPipe още по-добро приложение, докато се наслаждават на едно кафе от вас. + Дари + Уебсайт + Посетете сайта на NewPipe за повече информация и новини. + Политиката на NewPipe за личните данни + Проектът NewPipe се отнася много сериозно към вашата поверителност. За това, приложението не събира никакви данни без вашето съгласие. +\nНашата политика за личните данни обяснява подробно какви данни изпращате и къде се съхраняват, когато изпращате съобщения за грешки. + Прочетет нашата политика за поверителност + Лицензът на NewPipe From f1e43007f1a79019a8cc000b90d05e3d502e0eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20Tapia=20Ram=C3=ADrez?= Date: Thu, 21 Jun 2018 11:40:11 +0000 Subject: [PATCH 029/363] Translated using Weblate (Chinese (Mandarin)) Currently translated at 6.4% (24 of 373 strings) --- app/src/main/res/values-cmn/strings.xml | 42 ++++++++++++++----------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index d9326b168..5013b74eb 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -1,20 +1,26 @@ - - - - - - - - - - - - - - - - - - +点按搜索即可开始 + %1$s 意见 + 发布 %1$s + 找不到流播放器。你想安装VLC吗? + 找不到流播放器(您可以安装VLC播放它) + 安装 + 取消 + 在浏览器中打开 + 在弹出模式下打开 + 分享 + 下载 + 下载流文件. + 搜索 + 设置 + 你的意思是: %1$s ? + 与某人分享 + 选择浏览器 + 回转 + 使用外部视频播放器 + 启用此选项时,某些分辨率将不会有音频 + 使用外部音频播放器 + NewPipe弹出模式 + 订阅 + 订阅 From 93bbaf187e702fc25c25cd7dfe1468facd7ab33c Mon Sep 17 00:00:00 2001 From: rimasx Date: Sun, 17 Jun 2018 14:06:06 +0000 Subject: [PATCH 030/363] Translated using Weblate (Estonian) Currently translated at 94.6% (353 of 373 strings) --- app/src/main/res/values-et/strings.xml | 423 ++++++++++++++++++++++++- 1 file changed, 421 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a6b3daec9..bb1998829 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -1,2 +1,421 @@ - - \ No newline at end of file + +Alustuseks puuduta otsingut + %1$s vaatamist + Avaldatud %1$s + Voogesituseks puudub pleier. Kas paigaldada VLC? + Voogesituseks puudub pleier. (Selleks võib paigaldada VLC) + Paigalda + Tühista + Ava veebilehitsejas + Ava hüpikaknas + Jaga + Laadi alla + Laadi voog alla. + Otsi + Seaded + Kas mõtlesid: %1$s ? + Jaga + Vali veebilehitseja + pööramine + Kasuta välist videopleierit + Kui see valik lubada, puudub osadel lahutustel heli + Kasuta välist audiomängujat + NewPipe hüpikaknarežiim + Telli + Tellitud + Kanali tellimus tühistatud + Tellimuse muutmine nurjus + Tellimuse uuendamine nurjus + Kuva info + + Tellimused + Järjehoidjad + + Mis on uut + + Taust + Hüpikaken + "Lisa " + + Video allalaadimise kaust + Kaust allalaetud videote hoiustamiseks + Sisesta videote allalaadimise rada + + Audio allalaadimise kaust + Kaust allalaetud audio hoiustamiseks + Sisesta audio allalaadimise rada + + Automaatesitus + Esita video, kui NewPipe käivitub teise rakenduse kaudu + Vaikelahutus + Hüpikakna vaikelahutus + Kuva kõrgemaid lahutusi + Kõik seadmed ei toeta 2K/4K videoid + Esita Kodi abil + Kore rakendust ei leitud. Kas paigaldada see? + Kuva valik \"Esita Kodi abil\" + Kuva valik video esitamiseks Kodi meediakeskuse kaudu + Heli + Heli vaikevorming + Video vaikevorming + WebM — libre vorming + M4A — parem kvaliteet + Teema + Hele + Tume + Must + Pea hüpikakna suurus ja asukoht meeles + Pea hüpikakna viimane suurus ja asukoht meeles + Kasuta ebatäpset kerimist + Ebatäpne kerimine lubab mängijal otsida asukohta kiiremini täpsuse arvel + Laadi pisipildid + Keela peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal. + Pildid kustutati vahemälust + Kustuta metaandmed vahemälust + Kustuta veebilehtede andmed vahemälust + Metaandmed kustutati vahemälust + Järgmine voog automaatselt järjekorda + Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast. + Mängija juhtimise viiped + Luba viiped helitugevuse ja ereduse juhtimiseks + Kuva soovitused + Kuva otsingu ajal soovitusi + Otsinguajalugu + Salvesta otsinguajalugu kohalikult + Ajalugu ja vahemälu + Jälgi videote vaatamist + Jätka taasesitust fookuse saamisel + Jätka taasesitust pärast katkestamist (nt. telefonikõne) + Laadi alla + Järgmine video + Kuva \'järgmine\' ja \'sarnased\' videod + Kuva vihjet \"lisamiseks hoia\" + Kuva vihje, kui videoandmete lehel vajutatakse tausta või hüpikakna nupule + URL pole toetatud + Sisu vaikimisi riik + Teenus + Sisu vaikimisi keel + Mängija + Käitumine + Heli ja pilt + Ajalugu ja vahemälu + Hüpikaken + Välimus + Muu + Silumine + Taasesitus taustal + Taasesitus hüpikaknas + Lisati taustapleieri järjekorda + Lisati hüpikpleieri järjekorda + Esita + Sisu + Kuva vanusepiiranguga sisu + Vanusepiiranguga sisu. Selle saab lubada seadetes. + Otse + Allalaadimised + Allalaadimised + Vea teatamine + Kõik + Kanal + Pleilist + Jah + Hiljem + Keelatud + Filter + Värskenda + Kustuta + Suuruse muutmine + Parim lahutus + Võta tagasi + Esita kõik + Alati + Üks kord + Fail + + NewPipe teavitus + "Teavitused NewPipe tausta- ja hüpikmängijatele" + + [Tundmatu] + + Vaheta suunda + Lülita taustale + Lülita hüpikpleierile + Impordi andmebaas + Ekspordi andmebaas + Alistab praeguse ajaloo ja tellimused + Ekspordi ajalugu, tellimused ja pleilistid. + Puhasta vaatamiste ajalugu + Kustutab vaadatud voogude ajaloo. + Kustuta kogu vaatamiste ajalugu. + Vaatamiste ajalugu kustutati. + Kustuta otsinguajalugu + Kustutab otsisõnade ajaloo. + Kustuta kogu otsinguajalugu. + Otsinguajalugu kustutati. + Viga + Võrgu viga + Kõiki pisipilte ei õnnestunud laadida + Video URLi dekrüptimine nurjus + Veebilehe töötlemine nurjus + Veebilehe täielik töötlemine nurjus + Sisu pole saadaval + GEMA poolt blokeeritud + Allalaadimismenüü seadistamine nurjus + See on OTSEVOOG, mis pole veel toetatud. + Ühtegi voogu ei leitud + Pildi laadimine nurjus + Rakendus jooksis kokku + Selle voo esitus nurjus + Ilmnes taastamatu mängija viga + Mängija veast taastumine + Välised mängijad ei toeta seda tüüpi linke + Kehtetu URL + Videovooge ei leitud + Helivooge ei leitud + Kehtetu kataloog + Kehtetu faili/sisu allikas + Fail puudub või puuduvad õigused seda lugeda või kirjutada + Tühi failinimi pole lubatud + Ilmnes viga: %1$s + Allalaaditavaid videovooge pole + + Vabandust, seda poleks pidanud juhtuma. + Teata veast e-posti kaudu + Vabandust, ilmnesid mõned vead. + TEATA + Info: + Mis juhtus: + Mis:\\nPäring:\\nSisu Keel:\\nTeenus:\\nGMT aeg:\\nPakett:\\nVersioon:\\nOS versioon: + Oma kommentaar (inglise keeles): + Üksikasjad: + + + Video eelvaate pisipilt + Video eelvaate pisipilt + Üleslaadiaja avatari pisipilt + Meeldib + Ei meeldi + Kasuta Tor võrku + (Eksperimentaalne) Kasuta allalaadimiseks Tor võrku, et suurendada privaatsust (voogesitus ei ole veel toetatud). + Teata veast + Kasutaja raport + Tulemusi pole + Siin pole veel midagi + Lohista järjestuse muutmiseks + + Allalaadimiskataloogi \'%1$s\' loomine nurjus + Loodi allalaadimiskataloog \'%1$s\' + + Video + Audio + Proovi uuesti + Pääsuõigused salvestile puuduvad + Kasuta vana mängijat + Vana sisseehitatud mediaframework pleier + + K + M + B + + Tellijaid pole + + %s tellija + %s tellijat + + + Pole vaadatud + + %s vaatamine + %s vaatamist + + + Videoid pole + + %s video + %s videot + + + "Start " + Paus + Esita + Loo + Kustuta + Kustuta üks + Kustuta kõik + Kontrollsumma + Loobu + Nimeta ümber + + Uus ülesanne + OK + + Faili nimi + Lõimed + Viga + Server pole toetatud + Fail on juba olemas + Vigane URL või internet pole saadaval + NewPipe allalaadimine + Puuduta üksikasjade nägemiseks + Palun oota… + Kopeeriti lõikepuhvrisse + Vali saadaolev allalaadimiste kataloog + Need õigused on vajalikud +\nhüpikakna avamiseks + Kustutati 1 element. + + "reCAPTCHA " + Laadi alla + Lubatud tähemärgid failinimedes + Vigased tähemärgid asendatakse selle väärtusega + Asendustähemärk + + Tähed ja numbrid + Erimärgid + + Selle faili esitamiseks puudub rakendus + + NewPipe rakendusest + Seaded + Programmist + Kolmanda osapoole litsentsid + Litsentsi laadimine nurjus + Ava veebileht + Programmist + Kaasautorid + Litsentsid + Panusta + Vaata GitHubis + Anneta + Veebileht + Enama info saamiseks külasta NewPipe veebilehte. + NewPipe privaatsuspoliitika + Loe privaatsuspoliitikat + NewPipe litsents + Loe litsentsi + + + Ajalugu + Otsitud + Vaadatud + Ajalugu on keelatud + Ajalugu + Ajalugu on tühi + Ajalugu kustutati + Element kustutati + Kas kustutada see kirje otsinguajaloost? + Kas kustutada see kirje vaatamiste ajaloost? + Kas kustutada kõik kirjed ajaloost? + Viimati esitatud + Enim esitatud + + Avalehe sisu + Tühi leht + Kioski leht + Tellimuse leht + Voo leht + Kanali leht + Vali kanal + Ühtki kanalit pole veel tellitud + Vali kiosk + Eksport tehtud + Import tehtud + Korralikku ZIP faili pole + Hoiatus: Kõiki faile ei õnnestunud importida. + See alistab praeguse seadistuse. + Kas importida ka seadistused? + + "Kiosk " + Populaarsust koguvad + "Top 50 " + Uus ja kuum + Taustapleier + Hüpikpleier + Eemalda + Üksikasjad + Heli seaded + Hoia järjekorda lisamiseks + Lisa järjekorda taustal + Lisa järjekorda hüpikaknaga + Alusta taasesitust siit + Alusta siit taustal + Alusta siit hüpikaknaga + + Ava sahtel + Sulge sahtel + Siia ilmub varsti midagi ;D + + + Eelistatud \'ava\' toiming + Vaikimisi tegevus sisu avamisel — %s + + Videopleier + Taustapleier + Hüpikpleier + Küsi alati + + Info hankimine… + Soovitud sisu laadimine + + Loo uus pleilist + Kustuta pleilist + Nimeta pleilist ümber + Nimi + Lisa pleilisti + Määra pleilisti pisipildiks + + Lisa pleilist järjehoidjaks + Eemalda järjehoidja + + Kas kustutada see pleilist? + Pleilist loodud + Lisati pleilisti + Pleilisti pisipilt muudetud + Pleilisti kustutamine nurjus + + Subtiitriteta + + Mahuta + Täida + Suumi + + Automaatselt loodud + + Subtiitrid + Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada. + + Mälulekke seire võib põhjustada rakenduse hangumise + + Import/eksport + Import + Impordi asukohast + Ekspordi asukohta + + Import… + Eksport… + + Impordi fail + Eelmine eksport + + Tellimuste import nurjus + Tellimuste eksport nurjus + + Impordi YouTube tellimused eksportfaili abil: +\n +\n1. Ava URL: %1$s +\n2. Logi sisse +\n3. Allalaadimine peaks algama (see on eksportfail) + See toiming võib põhjustada suurt võrguliiklust. +\n +\nKas jätkata? + + Taasesituse kiiruse juhtimine + "Tempo " + Vaikimisi + + Nõustu + Keeldu + + Piiranguta + Piira lahutust mobiilse andmeside kasutamisel + From ee6d5121655095f04908221a03e99eb862495970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rossini=C3=A8re=20Vaud?= Date: Sat, 23 Jun 2018 10:02:01 +0000 Subject: [PATCH 031/363] Translated using Weblate (Polish) Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-pl/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ca31bab9e..7284ae49b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -473,4 +473,15 @@ NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, brać udział oraz udoskonalać je według własnego uznania. W szczególności możesz redystrybuować lub/i modyfikować pod zasadami GNU General Public License opublikowanej przez Free Software Fundation w wersji 3 lub (w zależności od ciebie) dowolnej późniejszej wersji. Czy chcesz zaimportować również ustawienia? + Polityka prywatności programu NewPipe + Projekt NewPipe bardzo poważnie traktuję politykę prywatności. Aplikacja nie zbiera żadnych danych bez Twojej zgody. Polityka prywatności programu NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o błędach aplikacji. + Przeczytaj politykę prywatności + Ze względu na wprowadzenie Ogólnego Rozporządzenia o ochronie danych (RODO), chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Proszę przeczytać ją uważnie. +\nMusisz ją zaakceptować, aby przesyłać raporty o błędach. +\n + Akceptuj + Odrzuć + + Brak limitu + Limit przy użyciu danych mobilnych From 2f31779af4a0bf09d7532c8b8ca270a8b3714602 Mon Sep 17 00:00:00 2001 From: yuriqdev Date: Fri, 22 Jun 2018 10:36:37 +0000 Subject: [PATCH 032/363] Translated using Weblate (Russian) Currently translated at 99.7% (372 of 373 strings) --- app/src/main/res/values-ru/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 19ef35d96..e5394b4ed 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -230,7 +230,7 @@ Отменить Нет результатов - Тут только сверчки + Тут ничего нет Нет подписчиков @@ -277,7 +277,7 @@ Настройки аудио Пока нет подписок на каналы Удалить - Отписаться + Вы подписаны Подписка отменена Показать \"держать, чтобы добавить\" подсказку Показывать подсказку при нажатии на иконку «В окне» или «В фоне» на странице сведений о видео @@ -320,7 +320,7 @@ Проигрыватель видео Фоновый проигрыватель - Проигрыватель в окне + Плеер в окне Всегда спрашивать Получение информации… @@ -391,7 +391,7 @@ Без титров - Пригнать + Подогнать Заполнить Приблизить @@ -428,8 +428,8 @@ \n1. Перейдите на: %1$s \n2. Войдите, если необходимо \n3. Должна начаться загрузка (это будет файл экспорта) - Импорт подписок из SoundCloud набрав либо URL или ваш ID: -\n + Импорт подписок из SoundCloud набрав либо URL, либо ваш ID: +\n \n1. Включите \"режим рабочего стола\" в браузере (сайт недоступен на телефоне) \n2. Пройдите на: %1$s \n3. Войдите, если надо @@ -471,7 +471,7 @@ 1 элемент удалён. NewPipe - программное обеспечение copyleft libre: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с GNU General Public License, опубликованным Free Software Foundation, либо версией 3 License, либо (по вашему выбору) любой более поздней версии. - Предпочтительное действие \'открытие\' + Предпочтительное действие \'Открыть\' Желаете ли вы также импортировать настройки? Политика конфиденциальности NewPipe From 180bb581a304c0bea128f99b50de6e2fb371f0f7 Mon Sep 17 00:00:00 2001 From: rimasx Date: Fri, 22 Jun 2018 14:03:34 +0000 Subject: [PATCH 033/363] Translated using Weblate (Estonian) Currently translated at 94.6% (353 of 373 strings) --- app/src/main/res/values-et/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index bb1998829..2ee7fb37d 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -19,7 +19,7 @@ pööramine Kasuta välist videopleierit Kui see valik lubada, puudub osadel lahutustel heli - Kasuta välist audiomängujat + Kasuta välist audiopleierit NewPipe hüpikaknarežiim Telli Tellitud @@ -67,16 +67,16 @@ Pea hüpikakna suurus ja asukoht meeles Pea hüpikakna viimane suurus ja asukoht meeles Kasuta ebatäpset kerimist - Ebatäpne kerimine lubab mängijal otsida asukohta kiiremini täpsuse arvel + Ebatäpne kerimine lubab pleieril otsida asukohta kiiremini täpsuse arvel Laadi pisipildid - Keela peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal. + Keela, peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal. Pildid kustutati vahemälust Kustuta metaandmed vahemälust Kustuta veebilehtede andmed vahemälust Metaandmed kustutati vahemälust Järgmine voog automaatselt järjekorda Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast. - Mängija juhtimise viiped + Pleieri juhtimise viiped Luba viiped helitugevuse ja ereduse juhtimiseks Kuva soovitused Kuva otsingu ajal soovitusi @@ -133,7 +133,7 @@ Fail NewPipe teavitus - "Teavitused NewPipe tausta- ja hüpikmängijatele" + Teavitused NewPipe tausta- ja hüpikpleierile [Tundmatu] @@ -166,9 +166,9 @@ Pildi laadimine nurjus Rakendus jooksis kokku Selle voo esitus nurjus - Ilmnes taastamatu mängija viga - Mängija veast taastumine - Välised mängijad ei toeta seda tüüpi linke + Ilmnes taastamatu pleieri viga + Pleieri veast taastumine + Välised pleierid ei toeta seda tüüpi linke Kehtetu URL Videovooge ei leitud Helivooge ei leitud @@ -326,7 +326,7 @@ Kas importida ka seadistused? "Kiosk " - Populaarsust koguvad + Trendid "Top 50 " Uus ja kuum Taustapleier From 81859a37de802f477f740612c8e8f1a4b882b5c0 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Sat, 23 Jun 2018 15:03:45 +0000 Subject: [PATCH 034/363] Translated using Weblate (German) Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 560b0e8e4..cd233d68d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -299,7 +299,7 @@ Zurückgeben Website Besuche die NewPipe Website für weitere Informationen und Neuigkeiten. - 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. + "NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür aufbringen, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen können, während sie sich an einer Tasse Kaffee erfreuen!" Service Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen) Standard-Land des Inhalts From dd0d6660039e82dc1d3dde684116b58c90bc1aac Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sat, 23 Jun 2018 15:06:00 +0000 Subject: [PATCH 035/363] Translated using Weblate (German) Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index cd233d68d..54d587e9a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -286,7 +286,7 @@ Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Button auf der Videodetailseite gedrückt gehalten wird In der Warteschlange der Hintergrundwiedergabe Neu & Heiß - Zum Anfügen gedrückt halten + Halten, um zur Wiedergabeliste hinzuzufügen \"Gedrückt halten, um Tipp hinzuzufügen\" anzeigen [Unbekannt] @@ -299,7 +299,7 @@ Zurückgeben Website Besuche die NewPipe Website für weitere Informationen und Neuigkeiten. - "NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür aufbringen, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen können, während sie sich an einer Tasse Kaffee erfreuen!" + NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen zu können, während sie sich an einer Tasse Kaffee erfreuen! Service Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen) Standard-Land des Inhalts From 3f7e02e305db0794d8a37447e3bd3606baa6bf2e Mon Sep 17 00:00:00 2001 From: DafabHoid Date: Sat, 23 Jun 2018 15:07:22 +0000 Subject: [PATCH 036/363] Translated using Weblate (German) Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 54d587e9a..292585620 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -407,8 +407,8 @@ Metadatencache gelöscht Debug Ungültige Datei-/Inhaltsquelle - Export fertiggestellt - Import fertiggestellt + Export abgeschlossen + Import abgeschlossen Name Import/Export Import From 2bc0c8a483a20e436f1c1520667e9c530fff1032 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Sat, 23 Jun 2018 15:08:28 +0000 Subject: [PATCH 037/363] Translated using Weblate (German) Currently translated at 100,0% (373 of 373 strings) --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 292585620..b7081d126 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -325,7 +325,7 @@ Immer fragen Informationen werden abgerufen… - Die angeforderten Inhalte werden geladen + Angeforderter Inhalt lädt Datenbank importieren Datenbank exportieren Wird deinen Verlauf und deine Abos überschreiben From 1b66446c0d47f8a50d4257a596a82c6b2874faa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rossini=C3=A8re=20Vaud?= Date: Sat, 23 Jun 2018 10:09:33 +0000 Subject: [PATCH 038/363] Translated using Weblate (Polish) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-pl/strings.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7284ae49b..0889fa9e3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -266,7 +266,7 @@ Większość znaków specjalnych Dotacja - NewPipe rozwijane jest przez wolontariuszy, którzy poświęcają swój wolny czas, by zapewnić ci jak najlepsze wrażenia podczas korzystania z aplikacji. To dobry moment, aby wesprzeć programistów i sprawić, by program był jeszcze lepszy, nie przerywając przy tym popijania kawy! + NewPipe rozwijane jest przez wolontariuszy, którzy poświęcają swój wolny czas, by zapewnić ci jak najlepsze wrażenia podczas korzystania z aplikacji. To dobry moment, aby wesprzeć programistów i sprawić, by program był jeszcze lepszy, nie przerywając przy tym popijania kawy. Daj od siebie Witryna By otrzymać więcej informacji oraz najnowsze wiadomości o NewPipe, odwiedź naszą stronę. @@ -477,8 +477,7 @@ Projekt NewPipe bardzo poważnie traktuję politykę prywatności. Aplikacja nie zbiera żadnych danych bez Twojej zgody. Polityka prywatności programu NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o błędach aplikacji. Przeczytaj politykę prywatności Ze względu na wprowadzenie Ogólnego Rozporządzenia o ochronie danych (RODO), chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Proszę przeczytać ją uważnie. -\nMusisz ją zaakceptować, aby przesyłać raporty o błędach. -\n +\nMusisz ją zaakceptować, aby przesyłać raporty o błędach. Akceptuj Odrzuć From aed0348802884643e2cbe8fdd071b510ff8046f6 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sat, 23 Jun 2018 15:10:04 +0000 Subject: [PATCH 039/363] Translated using Weblate (German) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-de/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b7081d126..eefd7fe5f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -96,7 +96,7 @@ Live - „Suchen“ antippen um zu beginnen + „Suchen“ antippen, um zu beginnen Downloads Downloads Fehlerbericht @@ -298,8 +298,8 @@ Spenden Zurückgeben Website - Besuche die NewPipe Website für weitere Informationen und Neuigkeiten. - NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen zu können, während sie sich an einer Tasse Kaffee erfreuen! + Besuche die NewPipe-Website für weitere Informationen und Neuigkeiten. + NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen zu können, während sie sich an einer Tasse Kaffee erfreuen. Service Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen) Standard-Land des Inhalts @@ -325,7 +325,7 @@ Immer fragen Informationen werden abgerufen… - Angeforderter Inhalt lädt + Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren Wird deinen Verlauf und deine Abos überschreiben @@ -358,7 +358,7 @@ Wiedergabeliste löschen Wiedergabeliste umbenennen Zur Wiedergabeliste hinzufügen - Als Vorschaubild der Wiedergabeliste festlegen + Als Symbolbild der Wiedergabeliste festlegen Lesezeichen entfernen From a32391f5604d83b8c2afb5e42cab53d060650f10 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Sat, 23 Jun 2018 15:12:19 +0000 Subject: [PATCH 040/363] Translated using Weblate (German) Currently translated at 100.0% (373 of 373 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index eefd7fe5f..fb15ff659 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -479,8 +479,8 @@ Lies die Datenschutzbestimmungen Akzeptieren Ablehnen -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. +Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipe\'s Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. +\nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen From cbe001efd69860eaa629a3502791b14e9dad2973 Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Mon, 25 Jun 2018 12:04:11 +0200 Subject: [PATCH 041/363] Added option to menu --- app/src/main/res/values/settings_keys.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 82f4ebdbe..bd0f04e9f 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -186,6 +186,7 @@ @string/video_player @string/background_player @string/popup_player + @string/download @string/always_ask_open_action @@ -193,6 +194,7 @@ @string/video_player_key @string/background_player_key @string/popup_player_key + @string/download_key @string/always_ask_open_action_key From 8e96b675fa3d7b6705c30c9ccc80b340962f6ed4 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Tue, 26 Jun 2018 01:13:21 +0530 Subject: [PATCH 042/363] Removed unwanted files. --- app/src/debug/gen/org/schabi/newpipe/BuildConfig.java | 8 -------- app/src/debug/gen/org/schabi/newpipe/Manifest.java | 7 ------- app/src/debug/gen/org/schabi/newpipe/R.java | 7 ------- app/src/main/gen/org/schabi/newpipe/BuildConfig.java | 8 -------- app/src/main/gen/org/schabi/newpipe/Manifest.java | 7 ------- app/src/main/gen/org/schabi/newpipe/R.java | 7 ------- 6 files changed, 44 deletions(-) delete mode 100644 app/src/debug/gen/org/schabi/newpipe/BuildConfig.java delete mode 100644 app/src/debug/gen/org/schabi/newpipe/Manifest.java delete mode 100644 app/src/debug/gen/org/schabi/newpipe/R.java delete mode 100644 app/src/main/gen/org/schabi/newpipe/BuildConfig.java delete mode 100644 app/src/main/gen/org/schabi/newpipe/Manifest.java delete mode 100644 app/src/main/gen/org/schabi/newpipe/R.java diff --git a/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java b/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java deleted file mode 100644 index 575afb9cb..000000000 --- a/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java +++ /dev/null @@ -1,8 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ -public final class BuildConfig { - public final static boolean DEBUG = Boolean.parseBoolean(null); -} \ No newline at end of file diff --git a/app/src/debug/gen/org/schabi/newpipe/Manifest.java b/app/src/debug/gen/org/schabi/newpipe/Manifest.java deleted file mode 100644 index 10e45a45a..000000000 --- a/app/src/debug/gen/org/schabi/newpipe/Manifest.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/app/src/debug/gen/org/schabi/newpipe/R.java b/app/src/debug/gen/org/schabi/newpipe/R.java deleted file mode 100644 index 088bdfb0d..000000000 --- a/app/src/debug/gen/org/schabi/newpipe/R.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ -public final class R { -} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/BuildConfig.java b/app/src/main/gen/org/schabi/newpipe/BuildConfig.java deleted file mode 100644 index 575afb9cb..000000000 --- a/app/src/main/gen/org/schabi/newpipe/BuildConfig.java +++ /dev/null @@ -1,8 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ -public final class BuildConfig { - public final static boolean DEBUG = Boolean.parseBoolean(null); -} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/Manifest.java b/app/src/main/gen/org/schabi/newpipe/Manifest.java deleted file mode 100644 index 10e45a45a..000000000 --- a/app/src/main/gen/org/schabi/newpipe/Manifest.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ -public final class Manifest { -} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/R.java b/app/src/main/gen/org/schabi/newpipe/R.java deleted file mode 100644 index 088bdfb0d..000000000 --- a/app/src/main/gen/org/schabi/newpipe/R.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ -public final class R { -} \ No newline at end of file From 4fbd1182c2f3ddf86c9f742d1934081ea8a9bfa2 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 26 Jun 2018 10:19:16 -0700 Subject: [PATCH 043/363] -Fixed minimizing to popup player does not destroying existing player when drawing over app permission is not granted. --- .../java/org/schabi/newpipe/player/MainVideoPlayer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 8a4fb62da..8a5844a43 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -219,11 +219,10 @@ public final class MainVideoPlayer extends AppCompatActivity getWindow().getAttributes().screenBrightness); if (playerImpl == null) return; - if (isBackPressed) { - playerImpl.destroy(); - } else { + if (!isBackPressed) { playerImpl.minimize(); } + playerImpl.destroy(); isInMultiWindow = false; isBackPressed = false; @@ -465,7 +464,8 @@ public final class MainVideoPlayer extends AppCompatActivity onFullScreenButtonClicked(); break; case PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_NONE: - destroy(); + default: + // No action break; } } From ef16145695dff523ffc3e09a938fcc71116ac96d Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 26 Jun 2018 10:21:43 -0700 Subject: [PATCH 044/363] -Fixed player new share intent causing main player crash due to player activity in background. --- app/src/main/java/org/schabi/newpipe/player/BasePlayer.java | 4 ++-- .../main/java/org/schabi/newpipe/player/MainVideoPlayer.java | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 4c3d70421..818f01bc0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -1147,11 +1147,11 @@ public abstract class BasePlayer implements @Player.RepeatMode public int getRepeatMode() { - return simpleExoPlayer.getRepeatMode(); + return simpleExoPlayer == null ? Player.REPEAT_MODE_OFF : simpleExoPlayer.getRepeatMode(); } public void setRepeatMode(@Player.RepeatMode final int repeatMode) { - simpleExoPlayer.setRepeatMode(repeatMode); + if (simpleExoPlayer != null) simpleExoPlayer.setRepeatMode(repeatMode); } public float getPlaybackSpeed() { diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 8a5844a43..df9f520e9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -153,7 +153,10 @@ public final class MainVideoPlayer extends AppCompatActivity protected void onNewIntent(Intent intent) { if (DEBUG) Log.d(TAG, "onNewIntent() called with: intent = [" + intent + "]"); super.onNewIntent(intent); - playerImpl.handleIntent(intent); + if (intent != null) { + playerState = null; + playerImpl.handleIntent(intent); + } } @Override From fb1a290bd9a1af6d126ba0f0efaad5e7b6f66a9f Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 26 Jun 2018 12:02:26 -0700 Subject: [PATCH 045/363] -Updated okHttp to 3.10.0. -Updated mockito to 2.8.9. -Updated rxJava to 2.1.14. -Fixed stetho to use correct lib version. --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5ff67bee..ada2626f1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ ext { exoPlayerLibVersion = '2.7.3' roomDbLibVersion = '1.0.0' leakCanaryLibVersion = '1.5.4' - okHttpLibVersion = '1.5.0' + okHttpLibVersion = '3.10.0' icepickLibVersion = '3.2.0' stethoLibVersion = '1.5.0' } @@ -57,7 +57,7 @@ dependencies { implementation 'com.github.TeamNewPipe:NewPipeExtractor:bf1c771' testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:1.10.19' + testImplementation 'org.mockito:mockito-core:2.8.9' implementation "com.android.support:appcompat-v7:$supportLibVersion" implementation "com.android.support:support-v4:$supportLibVersion" @@ -79,7 +79,7 @@ dependencies { debugImplementation "com.facebook.stetho:stetho-urlconnection:$stethoLibVersion" debugImplementation 'com.android.support:multidex:1.0.3' - implementation 'io.reactivex.rxjava2:rxjava:2.1.10' + implementation 'io.reactivex.rxjava2:rxjava:2.1.14' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' @@ -93,6 +93,6 @@ dependencies { debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryLibVersion" releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryLibVersion" - implementation 'com.squareup.okhttp3:okhttp:3.9.1' - debugImplementation "com.facebook.stetho:stetho-okhttp3:$okHttpLibVersion" + implementation "com.squareup.okhttp3:okhttp:$okHttpLibVersion" + debugImplementation "com.facebook.stetho:stetho-okhttp3:$stethoLibVersion" } From 27131d15dddde1e78368601ff1efc774c9600087 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 26 Jun 2018 12:25:53 -0700 Subject: [PATCH 046/363] -Updated room db to 1.1.1. -Fixed database import/export to no longer include accessory db files to ensure backward compatibility. --- app/build.gradle | 2 +- .../settings/ContentSettingsFragment.java | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ada2626f1..83abf44ab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,7 +43,7 @@ android { ext { supportLibVersion = '27.1.1' exoPlayerLibVersion = '2.7.3' - roomDbLibVersion = '1.0.0' + roomDbLibVersion = '1.1.1' leakCanaryLibVersion = '1.5.4' okHttpLibVersion = '3.10.0' icepickLibVersion = '3.2.0' diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index a02a9df34..3894c421f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -56,6 +56,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment { private File databasesDir; private File newpipe_db; private File newpipe_db_journal; + private File newpipe_db_shm; + private File newpipe_db_wal; private File newpipe_settings; private String thumbnailLoadToggleKey; @@ -88,6 +90,9 @@ public class ContentSettingsFragment extends BasePreferenceFragment { databasesDir = new File(homeDir + "/databases"); newpipe_db = new File(homeDir + "/databases/newpipe.db"); newpipe_db_journal = new File(homeDir + "/databases/newpipe.db-journal"); + newpipe_db_shm = new File(homeDir + "/databases/newpipe.db-shm"); + newpipe_db_wal = new File(homeDir + "/databases/newpipe.db-wal"); + newpipe_settings = new File(homeDir + "/databases/newpipe.settings"); newpipe_settings.delete(); @@ -207,7 +212,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { new BufferedOutputStream( new FileOutputStream(path))); ZipHelper.addFileToZip(outZip, newpipe_db.getPath(), "newpipe.db"); - ZipHelper.addFileToZip(outZip, newpipe_db_journal.getPath(), "newpipe.db-journal"); + saveSharedPreferencesToFile(newpipe_settings); ZipHelper.addFileToZip(outZip, newpipe_settings.getPath(), "newpipe.settings"); @@ -263,8 +268,15 @@ public class ContentSettingsFragment extends BasePreferenceFragment { throw new Exception("Could not create databases dir"); } - if(!(ZipHelper.extractFileFromZip(filePath, newpipe_db.getPath(), "newpipe.db") - && ZipHelper.extractFileFromZip(filePath, newpipe_db_journal.getPath(), "newpipe.db-journal"))) { + final boolean isDbFileExtracted = ZipHelper.extractFileFromZip(filePath, + newpipe_db.getPath(), "newpipe.db"); + + if (isDbFileExtracted) { + newpipe_db_journal.delete(); + newpipe_db_wal.delete(); + newpipe_db_shm.delete(); + + } else { Toast.makeText(getContext(), R.string.could_not_import_all_files, Toast.LENGTH_LONG) .show(); } From 772109855134f4d58483f52e2c76945340902b19 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 8 May 2018 10:18:32 -0700 Subject: [PATCH 047/363] -Updated ExoPlayer to 2.8.0 -Updated MediaSource contracts in ManagedMediaSource. -Changed PlaceholderMediaSource and FailedMediaSource to use built-in BaseMediaSource implementation. -Changed deprecated DynamicConcatenatingMediaSource to ConcatenatingMediaSource. -Removed manual playlist media source disposal in favor of player built-in disposal. --- app/build.gradle | 2 +- .../newpipe/player/helper/PlayerHelper.java | 1 - .../player/mediasource/FailedMediaSource.java | 16 +++++---- .../player/mediasource/LoadedMediaSource.java | 19 +++++++++-- .../ManagedMediaSourcePlaylist.java | 34 ++++++++----------- .../mediasource/PlaceholderMediaSource.java | 11 +++--- .../player/playback/MediaSourceManager.java | 3 -- 7 files changed, 46 insertions(+), 40 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 83abf44ab..b04daebed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ android { ext { supportLibVersion = '27.1.1' - exoPlayerLibVersion = '2.7.3' + exoPlayerLibVersion = '2.8.0' roomDbLibVersion = '1.1.1' leakCanaryLibVersion = '1.5.4' okHttpLibVersion = '3.10.0' diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index f8d594114..d10b99aec 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -241,7 +241,6 @@ public class PlayerHelper { public static TrackSelection.Factory getQualitySelector(@NonNull final Context context, @NonNull final BandwidthMeter meter) { return new AdaptiveTrackSelection.Factory(meter, - AdaptiveTrackSelection.DEFAULT_MAX_INITIAL_BITRATE, /*bufferDurationRequiredForQualityIncrease=*/1000, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java index 8d498a9bf..2f233c464 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java @@ -4,6 +4,7 @@ import android.support.annotation.NonNull; import android.util.Log; import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.source.BaseMediaSource; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.upstream.Allocator; @@ -11,7 +12,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItem; import java.io.IOException; -public class FailedMediaSource implements ManagedMediaSource { +public class FailedMediaSource extends BaseMediaSource implements ManagedMediaSource { private final String TAG = "FailedMediaSource@" + Integer.toHexString(hashCode()); public static class FailedMediaSourceException extends Exception { @@ -72,11 +73,6 @@ public class FailedMediaSource implements ManagedMediaSource { return System.currentTimeMillis() >= retryTimestamp; } - @Override - public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { - Log.e(TAG, "Loading failed source: ", error); - } - @Override public void maybeThrowSourceInfoRefreshError() throws IOException { throw new IOException(error); @@ -90,8 +86,14 @@ public class FailedMediaSource implements ManagedMediaSource { @Override public void releasePeriod(MediaPeriod mediaPeriod) {} + @Override - public void releaseSource() {} + protected void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + Log.e(TAG, "Loading failed source: ", error); + } + + @Override + protected void releaseSourceInternal() {} @Override public boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity, diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java index 1a9cfeb4d..c39b0a03d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java @@ -1,10 +1,12 @@ package org.schabi.newpipe.player.mediasource; +import android.os.Handler; import android.support.annotation.NonNull; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.MediaSourceEventListener; import com.google.android.exoplayer2.upstream.Allocator; import org.schabi.newpipe.player.playqueue.PlayQueueItem; @@ -34,7 +36,8 @@ public class LoadedMediaSource implements ManagedMediaSource { } @Override - public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { + public void prepareSource(ExoPlayer player, boolean isTopLevelSource, + SourceInfoRefreshListener listener) { source.prepareSource(player, isTopLevelSource, listener); } @@ -54,8 +57,18 @@ public class LoadedMediaSource implements ManagedMediaSource { } @Override - public void releaseSource() { - source.releaseSource(); + public void releaseSource(SourceInfoRefreshListener listener) { + source.releaseSource(listener); + } + + @Override + public void addEventListener(Handler handler, MediaSourceEventListener eventListener) { + source.addEventListener(handler, eventListener); + } + + @Override + public void removeEventListener(MediaSourceEventListener eventListener) { + source.removeEventListener(eventListener); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSourcePlaylist.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSourcePlaylist.java index 310f1062b..5fe107657 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSourcePlaylist.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSourcePlaylist.java @@ -3,14 +3,14 @@ package org.schabi.newpipe.player.mediasource; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource; +import com.google.android.exoplayer2.source.ConcatenatingMediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; public class ManagedMediaSourcePlaylist { - @NonNull private final DynamicConcatenatingMediaSource internalSource; + @NonNull private final ConcatenatingMediaSource internalSource; public ManagedMediaSourcePlaylist() { - internalSource = new DynamicConcatenatingMediaSource(/*isPlaylistAtomic=*/false, + internalSource = new ConcatenatingMediaSource(/*isPlaylistAtomic=*/false, new ShuffleOrder.UnshuffledShuffleOrder(0)); } @@ -32,12 +32,8 @@ public class ManagedMediaSourcePlaylist { null : (ManagedMediaSource) internalSource.getMediaSource(index); } - public void dispose() { - internalSource.releaseSource(); - } - @NonNull - public DynamicConcatenatingMediaSource getParentMediaSource() { + public ConcatenatingMediaSource getParentMediaSource() { return internalSource; } @@ -46,7 +42,7 @@ public class ManagedMediaSourcePlaylist { //////////////////////////////////////////////////////////////////////////*/ /** - * Expands the {@link DynamicConcatenatingMediaSource} by appending it with a + * Expands the {@link ConcatenatingMediaSource} by appending it with a * {@link PlaceholderMediaSource}. * * @see #append(ManagedMediaSource) @@ -56,17 +52,17 @@ public class ManagedMediaSourcePlaylist { } /** - * Appends a {@link ManagedMediaSource} to the end of {@link DynamicConcatenatingMediaSource}. - * @see DynamicConcatenatingMediaSource#addMediaSource + * Appends a {@link ManagedMediaSource} to the end of {@link ConcatenatingMediaSource}. + * @see ConcatenatingMediaSource#addMediaSource * */ public synchronized void append(@NonNull final ManagedMediaSource source) { internalSource.addMediaSource(source); } /** - * Removes a {@link ManagedMediaSource} from {@link DynamicConcatenatingMediaSource} + * Removes a {@link ManagedMediaSource} from {@link ConcatenatingMediaSource} * at the given index. If this index is out of bound, then the removal is ignored. - * @see DynamicConcatenatingMediaSource#removeMediaSource(int) + * @see ConcatenatingMediaSource#removeMediaSource(int) * */ public synchronized void remove(final int index) { if (index < 0 || index > internalSource.getSize()) return; @@ -75,10 +71,10 @@ public class ManagedMediaSourcePlaylist { } /** - * Moves a {@link ManagedMediaSource} in {@link DynamicConcatenatingMediaSource} + * Moves a {@link ManagedMediaSource} in {@link ConcatenatingMediaSource} * from the given source index to the target index. If either index is out of bound, * then the call is ignored. - * @see DynamicConcatenatingMediaSource#moveMediaSource(int, int) + * @see ConcatenatingMediaSource#moveMediaSource(int, int) * */ public synchronized void move(final int source, final int target) { if (source < 0 || target < 0) return; @@ -99,7 +95,7 @@ public class ManagedMediaSourcePlaylist { } /** - * Updates the {@link ManagedMediaSource} in {@link DynamicConcatenatingMediaSource} + * Updates the {@link ManagedMediaSource} in {@link ConcatenatingMediaSource} * at the given index with a given {@link ManagedMediaSource}. * @see #update(int, ManagedMediaSource, Runnable) * */ @@ -108,11 +104,11 @@ public class ManagedMediaSourcePlaylist { } /** - * Updates the {@link ManagedMediaSource} in {@link DynamicConcatenatingMediaSource} + * Updates the {@link ManagedMediaSource} in {@link ConcatenatingMediaSource} * at the given index with a given {@link ManagedMediaSource}. If the index is out of bound, * then the replacement is ignored. - * @see DynamicConcatenatingMediaSource#addMediaSource - * @see DynamicConcatenatingMediaSource#removeMediaSource(int, Runnable) + * @see ConcatenatingMediaSource#addMediaSource + * @see ConcatenatingMediaSource#removeMediaSource(int, Runnable) * */ public synchronized void update(final int index, @NonNull final ManagedMediaSource source, @Nullable final Runnable finalizingAction) { diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java index 318f9a316..bfd734393 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java @@ -3,20 +3,19 @@ package org.schabi.newpipe.player.mediasource; import android.support.annotation.NonNull; import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.source.BaseMediaSource; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.upstream.Allocator; import org.schabi.newpipe.player.playqueue.PlayQueueItem; -import java.io.IOException; - -public class PlaceholderMediaSource implements ManagedMediaSource { +public class PlaceholderMediaSource extends BaseMediaSource implements ManagedMediaSource { // Do nothing, so this will stall the playback - @Override public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {} - @Override public void maybeThrowSourceInfoRefreshError() throws IOException {} + @Override public void maybeThrowSourceInfoRefreshError() {} @Override public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator) { return null; } @Override public void releasePeriod(MediaPeriod mediaPeriod) {} - @Override public void releaseSource() {} + @Override protected void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) {} + @Override protected void releaseSourceInternal() {} @Override public boolean shouldBeReplacedWith(@NonNull PlayQueueItem newIdentity, diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java index 8ab3cba98..67a8debef 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java @@ -172,7 +172,6 @@ public class MediaSourceManager { playQueueReactor.cancel(); loaderReactor.dispose(); syncReactor.dispose(); - playlist.dispose(); } /*////////////////////////////////////////////////////////////////////////// @@ -481,8 +480,6 @@ public class MediaSourceManager { private void resetSources() { if (DEBUG) Log.d(TAG, "resetSources() called."); - - playlist.dispose(); playlist = new ManagedMediaSourcePlaylist(); } From 72d1e5131f526362892cc9ad6ac013210481feea Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 8 May 2018 11:24:42 -0700 Subject: [PATCH 048/363] -Added skip silence toggle to playback speed control. -Added step size selector to playback speed control. -Added skip silence flag to player intents. -Moved default preset in playback speed control to neutral dialog button, renamed as reset. -Removed nightcore preset from playback speed control. --- .../org/schabi/newpipe/player/BasePlayer.java | 23 ++- .../newpipe/player/MainVideoPlayer.java | 17 +- .../schabi/newpipe/player/PlayerState.java | 15 +- .../newpipe/player/PopupVideoPlayer.java | 1 + .../newpipe/player/ServicePlayerActivity.java | 12 +- .../helper/PlaybackParameterDialog.java | 168 ++++++++++++------ .../schabi/newpipe/util/NavigationHelper.java | 4 +- .../res/layout/dialog_playback_parameter.xml | 70 +++++++- app/src/main/res/values/strings.xml | 7 +- 9 files changed, 236 insertions(+), 81 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 818f01bc0..525f0d258 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -115,6 +115,7 @@ public abstract class BasePlayer implements public static final String REPEAT_MODE = "repeat_mode"; public static final String PLAYBACK_PITCH = "playback_pitch"; public static final String PLAYBACK_SPEED = "playback_speed"; + public static final String PLAYBACK_SKIP_SILENCE = "playback_skip_silence"; public static final String PLAYBACK_QUALITY = "playback_quality"; public static final String PLAY_QUEUE_KEY = "play_queue_key"; public static final String APPEND_ONLY = "append_only"; @@ -235,20 +236,23 @@ public abstract class BasePlayer implements final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode()); final float playbackSpeed = intent.getFloatExtra(PLAYBACK_SPEED, getPlaybackSpeed()); final float playbackPitch = intent.getFloatExtra(PLAYBACK_PITCH, getPlaybackPitch()); + final boolean playbackSkipSilence = intent.getBooleanExtra(PLAYBACK_SKIP_SILENCE, false); // Good to go... - initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, /*playOnInit=*/true); + initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, + /*playOnInit=*/true); } protected void initPlayback(@NonNull final PlayQueue queue, @Player.RepeatMode final int repeatMode, final float playbackSpeed, final float playbackPitch, + final boolean playbackSkipSilence, final boolean playOnReady) { destroyPlayer(); initPlayer(playOnReady); setRepeatMode(repeatMode); - setPlaybackParameters(playbackSpeed, playbackPitch); + setPlaybackParameters(playbackSpeed, playbackPitch, playbackSkipSilence); playQueue = queue; playQueue.init(); @@ -1162,19 +1166,22 @@ public abstract class BasePlayer implements return getPlaybackParameters().pitch; } + public boolean getPlaybackSkipSilence() { + return getPlaybackParameters().skipSilence; + } + public void setPlaybackSpeed(float speed) { - setPlaybackParameters(speed, getPlaybackPitch()); + setPlaybackParameters(speed, getPlaybackPitch(), getPlaybackSkipSilence()); } public PlaybackParameters getPlaybackParameters() { - final PlaybackParameters defaultParameters = new PlaybackParameters(1f, 1f); - if (simpleExoPlayer == null) return defaultParameters; + if (simpleExoPlayer == null) return PlaybackParameters.DEFAULT; final PlaybackParameters parameters = simpleExoPlayer.getPlaybackParameters(); - return parameters == null ? defaultParameters : parameters; + return parameters == null ? PlaybackParameters.DEFAULT : parameters; } - public void setPlaybackParameters(float speed, float pitch) { - simpleExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, pitch)); + public void setPlaybackParameters(float speed, float pitch, boolean skipSilence) { + simpleExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, pitch, skipSilence)); } public PlayQueue getPlayQueue() { diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index df9f520e9..56c8f8855 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -181,7 +181,7 @@ public final class MainVideoPlayer extends AppCompatActivity playerImpl.setPlaybackQuality(playerState.getPlaybackQuality()); playerImpl.initPlayback(playerState.getPlayQueue(), playerState.getRepeatMode(), playerState.getPlaybackSpeed(), playerState.getPlaybackPitch(), - playerState.wasPlaying()); + playerState.isPlaybackSkipSilence(), playerState.wasPlaying()); } } @@ -210,7 +210,8 @@ public final class MainVideoPlayer extends AppCompatActivity playerImpl.setRecovery(); playerState = new PlayerState(playerImpl.getPlayQueue(), playerImpl.getRepeatMode(), playerImpl.getPlaybackSpeed(), playerImpl.getPlaybackPitch(), - playerImpl.getPlaybackQuality(), playerImpl.isPlaying()); + playerImpl.getPlaybackQuality(), playerImpl.getPlaybackSkipSilence(), + playerImpl.isPlaying()); StateSaver.tryToSave(isChangingConfigurations(), null, outState, this); } @@ -352,8 +353,11 @@ public final class MainVideoPlayer extends AppCompatActivity //////////////////////////////////////////////////////////////////////////// @Override - public void onPlaybackParameterChanged(float playbackTempo, float playbackPitch) { - if (playerImpl != null) playerImpl.setPlaybackParameters(playbackTempo, playbackPitch); + public void onPlaybackParameterChanged(float playbackTempo, float playbackPitch, + boolean playbackSkipSilence) { + if (playerImpl != null) { + playerImpl.setPlaybackParameters(playbackTempo, playbackPitch, playbackSkipSilence); + } } /////////////////////////////////////////////////////////////////////////// @@ -533,6 +537,7 @@ public final class MainVideoPlayer extends AppCompatActivity this.getRepeatMode(), this.getPlaybackSpeed(), this.getPlaybackPitch(), + this.getPlaybackSkipSilence(), this.getPlaybackQuality() ); context.startService(intent); @@ -554,6 +559,7 @@ public final class MainVideoPlayer extends AppCompatActivity this.getRepeatMode(), this.getPlaybackSpeed(), this.getPlaybackPitch(), + this.getPlaybackSkipSilence(), this.getPlaybackQuality() ); context.startService(intent); @@ -649,7 +655,8 @@ public final class MainVideoPlayer extends AppCompatActivity @Override public void onPlaybackSpeedClicked() { - PlaybackParameterDialog.newInstance(getPlaybackSpeed(), getPlaybackPitch()) + PlaybackParameterDialog + .newInstance(getPlaybackSpeed(), getPlaybackPitch(), getPlaybackSkipSilence()) .show(getSupportFragmentManager(), TAG); } diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerState.java b/app/src/main/java/org/schabi/newpipe/player/PlayerState.java index 8ffcb6b29..359159809 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerState.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerState.java @@ -14,21 +14,26 @@ public class PlayerState implements Serializable { private final float playbackSpeed; private final float playbackPitch; @Nullable private final String playbackQuality; + private final boolean playbackSkipSilence; private final boolean wasPlaying; PlayerState(@NonNull final PlayQueue playQueue, final int repeatMode, - final float playbackSpeed, final float playbackPitch, final boolean wasPlaying) { - this(playQueue, repeatMode, playbackSpeed, playbackPitch, null, wasPlaying); + final float playbackSpeed, final float playbackPitch, + final boolean playbackSkipSilence, final boolean wasPlaying) { + this(playQueue, repeatMode, playbackSpeed, playbackPitch, null, + playbackSkipSilence, wasPlaying); } PlayerState(@NonNull final PlayQueue playQueue, final int repeatMode, final float playbackSpeed, final float playbackPitch, - @Nullable final String playbackQuality, final boolean wasPlaying) { + @Nullable final String playbackQuality, final boolean playbackSkipSilence, + final boolean wasPlaying) { this.playQueue = playQueue; this.repeatMode = repeatMode; this.playbackSpeed = playbackSpeed; this.playbackPitch = playbackPitch; this.playbackQuality = playbackQuality; + this.playbackSkipSilence = playbackSkipSilence; this.wasPlaying = wasPlaying; } @@ -62,6 +67,10 @@ public class PlayerState implements Serializable { return playbackQuality; } + public boolean isPlaybackSkipSilence() { + return playbackSkipSilence; + } + public boolean wasPlaying() { return wasPlaying; } diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 3aa8d68f3..146175fb0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -459,6 +459,7 @@ public final class PopupVideoPlayer extends Service { this.getRepeatMode(), this.getPlaybackSpeed(), this.getPlaybackPitch(), + this.getPlaybackSkipSilence(), this.getPlaybackQuality() ); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index 7674105e1..b57a710ed 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -187,6 +187,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity this.player.getRepeatMode(), this.player.getPlaybackSpeed(), this.player.getPlaybackPitch(), + this.player.getPlaybackSkipSilence(), null ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -466,13 +467,16 @@ public abstract class ServicePlayerActivity extends AppCompatActivity private void openPlaybackParameterDialog() { if (player == null) return; - PlaybackParameterDialog.newInstance(player.getPlaybackSpeed(), - player.getPlaybackPitch()).show(getSupportFragmentManager(), getTag()); + PlaybackParameterDialog.newInstance(player.getPlaybackSpeed(), player.getPlaybackPitch(), + player.getPlaybackSkipSilence()).show(getSupportFragmentManager(), getTag()); } @Override - public void onPlaybackParameterChanged(float playbackTempo, float playbackPitch) { - if (player != null) player.setPlaybackParameters(playbackTempo, playbackPitch); + public void onPlaybackParameterChanged(float playbackTempo, float playbackPitch, + boolean playbackSkipSilence) { + if (player != null) { + player.setPlaybackParameters(playbackTempo, playbackPitch, playbackSkipSilence); + } } //////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index 7c7d87791..60e43ff7d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -21,25 +21,24 @@ import static org.schabi.newpipe.player.BasePlayer.DEBUG; public class PlaybackParameterDialog extends DialogFragment { @NonNull private static final String TAG = "PlaybackParameterDialog"; - public static final double MINIMUM_PLAYBACK_VALUE = 0.25f; + // Maximum allowable range in ExoPlayer + public static final double MINIMUM_PLAYBACK_VALUE = 0.10f; public static final double MAXIMUM_PLAYBACK_VALUE = 3.00f; public static final char STEP_UP_SIGN = '+'; public static final char STEP_DOWN_SIGN = '-'; - public static final double PLAYBACK_STEP_VALUE = 0.05f; - - public static final double NIGHTCORE_TEMPO = 1.20f; - public static final double NIGHTCORE_PITCH_LOWER = 1.15f; - public static final double NIGHTCORE_PITCH_UPPER = 1.25f; + public static final double DEFAULT_PLAYBACK_STEP_VALUE = 0.05f; public static final double DEFAULT_TEMPO = 1.00f; public static final double DEFAULT_PITCH = 1.00f; + public static final boolean DEFAULT_SKIP_SILENCE = false; @NonNull private static final String INITIAL_TEMPO_KEY = "initial_tempo_key"; @NonNull private static final String INITIAL_PITCH_KEY = "initial_pitch_key"; public interface Callback { - void onPlaybackParameterChanged(final float playbackTempo, final float playbackPitch); + void onPlaybackParameterChanged(final float playbackTempo, final float playbackPitch, + final boolean playbackSkipSilence); } @Nullable private Callback callback; @@ -50,6 +49,7 @@ public class PlaybackParameterDialog extends DialogFragment { private double initialTempo = DEFAULT_TEMPO; private double initialPitch = DEFAULT_PITCH; + private boolean initialSkipSilence = DEFAULT_SKIP_SILENCE; @Nullable private SeekBar tempoSlider; @Nullable private TextView tempoMinimumText; @@ -65,16 +65,22 @@ public class PlaybackParameterDialog extends DialogFragment { @Nullable private TextView pitchStepDownText; @Nullable private TextView pitchStepUpText; - @Nullable private CheckBox unhookingCheckbox; + @Nullable private TextView stepSizeOnePercentText; + @Nullable private TextView stepSizeFivePercentText; + @Nullable private TextView stepSizeTenPercentText; + @Nullable private TextView stepSizeTwentyFivePercentText; + @Nullable private TextView stepSizeOneHundredPercentText; - @Nullable private TextView nightCorePresetText; - @Nullable private TextView resetPresetText; + @Nullable private CheckBox unhookingCheckbox; + @Nullable private CheckBox skipSilenceCheckbox; public static PlaybackParameterDialog newInstance(final double playbackTempo, - final double playbackPitch) { + final double playbackPitch, + final boolean playbackSkipSilence) { PlaybackParameterDialog dialog = new PlaybackParameterDialog(); dialog.initialTempo = playbackTempo; dialog.initialPitch = playbackPitch; + dialog.initialSkipSilence = playbackSkipSilence; return dialog; } @@ -123,7 +129,9 @@ public class PlaybackParameterDialog extends DialogFragment { .setView(view) .setCancelable(true) .setNegativeButton(R.string.cancel, (dialogInterface, i) -> - setPlaybackParameters(initialTempo, initialPitch)) + setPlaybackParameters(initialTempo, initialPitch, initialSkipSilence)) + .setNeutralButton(R.string.playback_reset, (dialogInterface, i) -> + setPlaybackParameters(DEFAULT_TEMPO, DEFAULT_PITCH, DEFAULT_SKIP_SILENCE)) .setPositiveButton(R.string.finish, (dialogInterface, i) -> setCurrentPlaybackParameters()); @@ -136,9 +144,13 @@ public class PlaybackParameterDialog extends DialogFragment { private void setupControlViews(@NonNull View rootView) { setupHookingControl(rootView); + setupSkipSilenceControl(rootView); + setupTempoControl(rootView); setupPitchControl(rootView); - setupPresetControl(rootView); + setupStepSize(DEFAULT_PLAYBACK_STEP_VALUE); + + setupStepSizeSelector(rootView); } private void setupTempoControl(@NonNull View rootView) { @@ -157,17 +169,17 @@ public class PlaybackParameterDialog extends DialogFragment { tempoMinimumText.setText(PlayerHelper.formatSpeed(MINIMUM_PLAYBACK_VALUE)); if (tempoStepUpText != null) { - tempoStepUpText.setText(getStepUpPercentString(PLAYBACK_STEP_VALUE)); + tempoStepUpText.setText(getStepUpPercentString(DEFAULT_PLAYBACK_STEP_VALUE)); tempoStepUpText.setOnClickListener(view -> { - onTempoSliderUpdated(getCurrentTempo() + PLAYBACK_STEP_VALUE); + onTempoSliderUpdated(getCurrentTempo() + DEFAULT_PLAYBACK_STEP_VALUE); setCurrentPlaybackParameters(); }); } if (tempoStepDownText != null) { - tempoStepDownText.setText(getStepDownPercentString(PLAYBACK_STEP_VALUE)); + tempoStepDownText.setText(getStepDownPercentString(DEFAULT_PLAYBACK_STEP_VALUE)); tempoStepDownText.setOnClickListener(view -> { - onTempoSliderUpdated(getCurrentTempo() - PLAYBACK_STEP_VALUE); + onTempoSliderUpdated(getCurrentTempo() - DEFAULT_PLAYBACK_STEP_VALUE); setCurrentPlaybackParameters(); }); } @@ -194,22 +206,6 @@ public class PlaybackParameterDialog extends DialogFragment { if (pitchMinimumText != null) pitchMinimumText.setText(PlayerHelper.formatPitch(MINIMUM_PLAYBACK_VALUE)); - if (pitchStepUpText != null) { - pitchStepUpText.setText(getStepUpPercentString(PLAYBACK_STEP_VALUE)); - pitchStepUpText.setOnClickListener(view -> { - onPitchSliderUpdated(getCurrentPitch() + PLAYBACK_STEP_VALUE); - setCurrentPlaybackParameters(); - }); - } - - if (pitchStepDownText != null) { - pitchStepDownText.setText(getStepDownPercentString(PLAYBACK_STEP_VALUE)); - pitchStepDownText.setOnClickListener(view -> { - onPitchSliderUpdated(getCurrentPitch() - PLAYBACK_STEP_VALUE); - setCurrentPlaybackParameters(); - }); - } - if (pitchSlider != null) { pitchSlider.setMax(strategy.progressOf(MAXIMUM_PLAYBACK_VALUE)); pitchSlider.setProgress(strategy.progressOf(initialPitch)); @@ -231,24 +227,84 @@ public class PlaybackParameterDialog extends DialogFragment { } } - private void setupPresetControl(@NonNull View rootView) { - nightCorePresetText = rootView.findViewById(R.id.presetNightcore); - if (nightCorePresetText != null) { - nightCorePresetText.setOnClickListener(view -> { - final double randomPitch = NIGHTCORE_PITCH_LOWER + - Math.random() * (NIGHTCORE_PITCH_UPPER - NIGHTCORE_PITCH_LOWER); + private void setupSkipSilenceControl(@NonNull View rootView) { + skipSilenceCheckbox = rootView.findViewById(R.id.skipSilenceCheckbox); + if (skipSilenceCheckbox != null) { + skipSilenceCheckbox.setChecked(initialSkipSilence); + skipSilenceCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> + setCurrentPlaybackParameters()); + } + } - setTempoSlider(NIGHTCORE_TEMPO); - setPitchSlider(randomPitch); + private void setupStepSizeSelector(@NonNull final View rootView) { + stepSizeOnePercentText = rootView.findViewById(R.id.stepSizeOnePercent); + stepSizeFivePercentText = rootView.findViewById(R.id.stepSizeFivePercent); + stepSizeTenPercentText = rootView.findViewById(R.id.stepSizeTenPercent); + stepSizeTwentyFivePercentText = rootView.findViewById(R.id.stepSizeTwentyFivePercent); + stepSizeOneHundredPercentText = rootView.findViewById(R.id.stepSizeOneHundredPercent); + + if (stepSizeOnePercentText != null) { + final double onePercent = 0.01f; + stepSizeOnePercentText.setText(getPercentString(onePercent)); + stepSizeOnePercentText.setOnClickListener(view -> setupStepSize(onePercent)); + } + + if (stepSizeFivePercentText != null) { + final double fivePercent = 0.05f; + stepSizeFivePercentText.setText(getPercentString(fivePercent)); + stepSizeFivePercentText.setOnClickListener(view -> setupStepSize(fivePercent)); + } + + if (stepSizeTenPercentText != null) { + final double tenPercent = 0.10f; + stepSizeTenPercentText.setText(getPercentString(tenPercent)); + stepSizeTenPercentText.setOnClickListener(view -> setupStepSize(tenPercent)); + } + + if (stepSizeTwentyFivePercentText != null) { + final double twentyFivePercent = 0.25f; + stepSizeTwentyFivePercentText.setText(getPercentString(twentyFivePercent)); + stepSizeTwentyFivePercentText.setOnClickListener(view -> + setupStepSize(twentyFivePercent)); + } + + if (stepSizeOneHundredPercentText != null) { + final double oneHundredPercent = 1.00f; + stepSizeOneHundredPercentText.setText(getPercentString(oneHundredPercent)); + stepSizeOneHundredPercentText.setOnClickListener(view -> + setupStepSize(oneHundredPercent)); + } + } + + private void setupStepSize(final double stepSize) { + if (tempoStepUpText != null) { + tempoStepUpText.setText(getStepUpPercentString(stepSize)); + tempoStepUpText.setOnClickListener(view -> { + onTempoSliderUpdated(getCurrentTempo() + stepSize); setCurrentPlaybackParameters(); }); } - resetPresetText = rootView.findViewById(R.id.presetReset); - if (resetPresetText != null) { - resetPresetText.setOnClickListener(view -> { - setTempoSlider(DEFAULT_TEMPO); - setPitchSlider(DEFAULT_PITCH); + if (tempoStepDownText != null) { + tempoStepDownText.setText(getStepDownPercentString(stepSize)); + tempoStepDownText.setOnClickListener(view -> { + onTempoSliderUpdated(getCurrentTempo() - stepSize); + setCurrentPlaybackParameters(); + }); + } + + if (pitchStepUpText != null) { + pitchStepUpText.setText(getStepUpPercentString(stepSize)); + pitchStepUpText.setOnClickListener(view -> { + onPitchSliderUpdated(getCurrentPitch() + stepSize); + setCurrentPlaybackParameters(); + }); + } + + if (pitchStepDownText != null) { + pitchStepDownText.setText(getStepDownPercentString(stepSize)); + pitchStepDownText.setOnClickListener(view -> { + onPitchSliderUpdated(getCurrentPitch() - stepSize); setCurrentPlaybackParameters(); }); } @@ -342,10 +398,11 @@ public class PlaybackParameterDialog extends DialogFragment { //////////////////////////////////////////////////////////////////////////*/ private void setCurrentPlaybackParameters() { - setPlaybackParameters(getCurrentTempo(), getCurrentPitch()); + setPlaybackParameters(getCurrentTempo(), getCurrentPitch(), getCurrentSkipSilence()); } - private void setPlaybackParameters(final double tempo, final double pitch) { + private void setPlaybackParameters(final double tempo, final double pitch, + final boolean skipSilence) { if (callback != null && tempoCurrentText != null && pitchCurrentText != null) { if (DEBUG) Log.d(TAG, "Setting playback parameters to " + "tempo=[" + tempo + "], " + @@ -353,7 +410,7 @@ public class PlaybackParameterDialog extends DialogFragment { tempoCurrentText.setText(PlayerHelper.formatSpeed(tempo)); pitchCurrentText.setText(PlayerHelper.formatPitch(pitch)); - callback.onPlaybackParameterChanged((float) tempo, (float) pitch); + callback.onPlaybackParameterChanged((float) tempo, (float) pitch, skipSilence); } } @@ -367,13 +424,22 @@ public class PlaybackParameterDialog extends DialogFragment { pitchSlider.getProgress()); } + private boolean getCurrentSkipSilence() { + return skipSilenceCheckbox != null && skipSilenceCheckbox.isChecked(); + } + @NonNull private static String getStepUpPercentString(final double percent) { - return STEP_UP_SIGN + PlayerHelper.formatPitch(percent); + return STEP_UP_SIGN + getPercentString(percent); } @NonNull private static String getStepDownPercentString(final double percent) { - return STEP_DOWN_SIGN + PlayerHelper.formatPitch(percent); + return STEP_DOWN_SIGN + getPercentString(percent); + } + + @NonNull + private static String getPercentString(final double percent) { + return PlayerHelper.formatPitch(percent); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index ebbeb06f8..12f6856de 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -100,11 +100,13 @@ public class NavigationHelper { final int repeatMode, final float playbackSpeed, final float playbackPitch, + final boolean playbackSkipSilence, @Nullable final String playbackQuality) { return getPlayerIntent(context, targetClazz, playQueue, playbackQuality) .putExtra(BasePlayer.REPEAT_MODE, repeatMode) .putExtra(BasePlayer.PLAYBACK_SPEED, playbackSpeed) - .putExtra(BasePlayer.PLAYBACK_PITCH, playbackPitch); + .putExtra(BasePlayer.PLAYBACK_PITCH, playbackPitch) + .putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence); } public static void playOnMainPlayer(final Context context, final PlayQueue queue) { diff --git a/app/src/main/res/layout/dialog_playback_parameter.xml b/app/src/main/res/layout/dialog_playback_parameter.xml index a8c6a5dcd..47937e882 100644 --- a/app/src/main/res/layout/dialog_playback_parameter.xml +++ b/app/src/main/res/layout/dialog_playback_parameter.xml @@ -279,30 +279,88 @@ android:layout_centerHorizontal="true" android:layout_below="@id/separatorCheckbox"/> + + + android:layout_below="@id/skipSilenceCheckbox"> + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ca88bd6f..8686d21d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -479,9 +479,10 @@ Playback Speed Controls Tempo Pitch - Unhook (may cause distortion) - Nightcore - Default + Unlink (may cause distortion) + Fast-forward during silence + Step + Reset 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. From 3194a2bf2c769fb1fe9b4365ec3da33acc93e1ae Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Wed, 9 May 2018 11:19:03 -0700 Subject: [PATCH 049/363] -Fixed skip silence state not maintained by player on new queue. -Fixed TrackSelector deprecations. --- .../java/org/schabi/newpipe/player/BasePlayer.java | 3 ++- .../org/schabi/newpipe/player/PopupVideoPlayer.java | 3 ++- .../java/org/schabi/newpipe/player/VideoPlayer.java | 13 ++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 525f0d258..11d8381dc 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -236,7 +236,8 @@ public abstract class BasePlayer implements final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode()); final float playbackSpeed = intent.getFloatExtra(PLAYBACK_SPEED, getPlaybackSpeed()); final float playbackPitch = intent.getFloatExtra(PLAYBACK_PITCH, getPlaybackPitch()); - final boolean playbackSkipSilence = intent.getBooleanExtra(PLAYBACK_SKIP_SILENCE, false); + final boolean playbackSkipSilence = intent.getBooleanExtra(PLAYBACK_SKIP_SILENCE, + getPlaybackSkipSilence()); // Good to go... initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 146175fb0..8b0fc0ddc 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -729,7 +729,8 @@ public final class PopupVideoPlayer extends Service { /*package-private*/ void enableVideoRenderer(final boolean enable) { final int videoRendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO); if (trackSelector != null && videoRendererIndex != RENDERER_UNAVAILABLE) { - trackSelector.setRendererDisabled(videoRendererIndex, !enable); + trackSelector.setParameters(trackSelector.buildUponParameters() + .setRendererDisabled(videoRendererIndex, !enable)); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index 5ea1c74a0..250d02b42 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -241,7 +241,8 @@ public abstract class VideoPlayer extends BasePlayer // Setup audio session with onboard equalizer if (Build.VERSION.SDK_INT >= 21) { - trackSelector.setTunnelingAudioSessionId(C.generateAudioSessionIdV21(context)); + trackSelector.setParameters(trackSelector.buildUponParameters() + .setTunnelingAudioSessionId(C.generateAudioSessionIdV21(context))); } } @@ -298,7 +299,8 @@ public abstract class VideoPlayer extends BasePlayer captionOffItem.setOnMenuItemClickListener(menuItem -> { final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT); if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) { - trackSelector.setRendererDisabled(textRendererIndex, true); + trackSelector.setParameters(trackSelector.buildUponParameters() + .setRendererDisabled(textRendererIndex, true)); } return true; }); @@ -312,7 +314,8 @@ public abstract class VideoPlayer extends BasePlayer final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT); if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) { trackSelector.setPreferredTextLanguage(captionLanguage); - trackSelector.setRendererDisabled(textRendererIndex, false); + trackSelector.setParameters(trackSelector.buildUponParameters() + .setRendererDisabled(textRendererIndex, false)); } return true; }); @@ -575,8 +578,8 @@ public abstract class VideoPlayer extends BasePlayer // Build UI buildCaptionMenu(availableLanguages); - if (trackSelector.getRendererDisabled(textRenderer) || preferredLanguage == null || - !availableLanguages.contains(preferredLanguage)) { + if (trackSelector.getParameters().getRendererDisabled(textRenderer) || + preferredLanguage == null || !availableLanguages.contains(preferredLanguage)) { captionTextView.setText(R.string.caption_none); } else { captionTextView.setText(preferredLanguage); From bc6fdf81d2405facccfb4e7f1230b664fd2586ad Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Thu, 10 May 2018 13:28:31 -0700 Subject: [PATCH 050/363] -Refactored player media source resolution into external helpers. -Baked resolved media metadata into media source for one-way data passing. --- .../newpipe/player/BackgroundPlayer.java | 36 ++-- .../org/schabi/newpipe/player/BasePlayer.java | 169 +++++++----------- .../newpipe/player/MainVideoPlayer.java | 29 +-- .../newpipe/player/PopupVideoPlayer.java | 35 ++-- .../schabi/newpipe/player/VideoPlayer.java | 110 ++---------- .../player/playback/MediaSourceManager.java | 28 +-- .../player/playback/PlaybackListener.java | 2 +- .../resolver/AudioPlaybackResolver.java | 39 ++++ .../player/resolver/MediaSourceTag.java | 51 ++++++ .../player/resolver/PlaybackResolver.java | 84 +++++++++ .../newpipe/player/resolver/Resolver.java | 7 + .../resolver/VideoPlaybackResolver.java | 122 +++++++++++++ 12 files changed, 436 insertions(+), 276 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/resolver/MediaSourceTag.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index f25c20bb2..b5135bd84 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -42,14 +42,12 @@ import com.google.android.exoplayer2.source.MediaSource; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.MediaFormat; -import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.helper.LockManager; -import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.playqueue.PlayQueueItem; -import org.schabi.newpipe.util.ListHelper; +import org.schabi.newpipe.player.resolver.AudioPlaybackResolver; +import org.schabi.newpipe.player.resolver.MediaSourceTag; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ThemeHelper; @@ -279,10 +277,18 @@ public final class BackgroundPlayer extends Service { protected class BasePlayerImpl extends BasePlayer { + @Nullable private AudioPlaybackResolver resolver; + BasePlayerImpl(Context context) { super(context); } + @Override + public void initPlayer(boolean playOnReady) { + super.initPlayer(playOnReady); + resolver = new AudioPlaybackResolver(context, dataSource); + } + @Override public void handleIntent(final Intent intent) { super.handleIntent(intent); @@ -390,11 +396,9 @@ public final class BackgroundPlayer extends Service { // Playback Listener //////////////////////////////////////////////////////////////////////////*/ - protected void onMetadataChanged(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info, - final int newPlayQueueIndex, - final boolean hasPlayQueueItemChanged) { - if (shouldUpdateOnProgress || hasPlayQueueItemChanged) { + protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { + super.onMetadataChanged(tag); + if (shouldUpdateOnProgress) { resetNotification(); updateNotification(-1); updateMetadata(); @@ -404,15 +408,7 @@ public final class BackgroundPlayer extends Service { @Override @Nullable public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { - final MediaSource liveSource = super.sourceOf(item, info); - if (liveSource != null) return liveSource; - - final int index = ListHelper.getDefaultAudioFormat(context, info.getAudioStreams()); - if (index < 0 || index >= info.getAudioStreams().size()) return null; - - final AudioStream audio = info.getAudioStreams().get(index); - return buildMediaSource(audio.getUrl(), PlayerHelper.cacheKeyOf(info, audio), - MediaFormat.getSuffixById(audio.getFormatId())); + return resolver == null ? null : resolver.resolve(info); } @Override @@ -439,8 +435,8 @@ public final class BackgroundPlayer extends Service { } private void updateMetadata() { - if (activityListener != null && currentInfo != null) { - activityListener.onMetadataUpdate(currentInfo); + if (activityListener != null && getCurrentMetadata() != null) { + activityListener.onMetadataUpdate(getCurrentMetadata().getMetadata()); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 11d8381dc..2cbef93e4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -25,15 +25,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.media.AudioManager; -import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerFactory; @@ -49,7 +46,6 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.util.Util; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; @@ -57,7 +53,6 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import org.schabi.newpipe.Downloader; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfo; -import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.helper.AudioReactor; import org.schabi.newpipe.player.helper.LoadController; @@ -72,6 +67,7 @@ import org.schabi.newpipe.player.playback.PlaybackListener; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueAdapter; import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.player.resolver.MediaSourceTag; import org.schabi.newpipe.util.SerializedCache; import java.io.IOException; @@ -130,12 +126,12 @@ public abstract class BasePlayer implements protected PlayQueue playQueue; protected PlayQueueAdapter playQueueAdapter; - protected MediaSourceManager playbackManager; + @Nullable protected MediaSourceManager playbackManager; - protected StreamInfo currentInfo; - protected PlayQueueItem currentItem; + @Nullable private PlayQueueItem currentItem; + @Nullable private MediaSourceTag currentMetadata; - protected Toast errorToast; + @Nullable protected Toast errorToast; /*////////////////////////////////////////////////////////////////////////// // Player @@ -329,58 +325,6 @@ public abstract class BasePlayer implements if (DEBUG) Log.d(TAG, "Thumbnail - onLoadingCancelled() called with: " + "imageUri = [" + imageUri + "], view = [" + view + "]"); } - /*////////////////////////////////////////////////////////////////////////// - // MediaSource Building - //////////////////////////////////////////////////////////////////////////*/ - - public MediaSource buildLiveMediaSource(@NonNull final String sourceUrl, - @C.ContentType final int type) { - if (DEBUG) { - Log.d(TAG, "buildLiveMediaSource() called with: url = [" + sourceUrl + - "], content type = [" + type + "]"); - } - if (dataSource == null) return null; - - final Uri uri = Uri.parse(sourceUrl); - switch (type) { - case C.TYPE_SS: - return dataSource.getLiveSsMediaSourceFactory().createMediaSource(uri); - case C.TYPE_DASH: - return dataSource.getLiveDashMediaSourceFactory().createMediaSource(uri); - case C.TYPE_HLS: - return dataSource.getLiveHlsMediaSourceFactory().createMediaSource(uri); - default: - throw new IllegalStateException("Unsupported type: " + type); - } - } - - public MediaSource buildMediaSource(@NonNull final String sourceUrl, - @NonNull final String cacheKey, - @NonNull final String overrideExtension) { - if (DEBUG) { - Log.d(TAG, "buildMediaSource() called with: url = [" + sourceUrl + - "], cacheKey = [" + cacheKey + "]" + - "], overrideExtension = [" + overrideExtension + "]"); - } - if (dataSource == null) return null; - - final Uri uri = Uri.parse(sourceUrl); - @C.ContentType final int type = TextUtils.isEmpty(overrideExtension) ? - Util.inferContentType(uri) : Util.inferContentType("." + overrideExtension); - - switch (type) { - case C.TYPE_SS: - return dataSource.getLiveSsMediaSourceFactory().createMediaSource(uri); - case C.TYPE_DASH: - return dataSource.getDashMediaSourceFactory().createMediaSource(uri); - case C.TYPE_HLS: - return dataSource.getHlsMediaSourceFactory().createMediaSource(uri); - case C.TYPE_OTHER: - return dataSource.getExtractorMediaSourceFactory(cacheKey).createMediaSource(uri); - default: - throw new IllegalStateException("Unsupported type: " + type); - } - } /*////////////////////////////////////////////////////////////////////////// // Broadcast Receiver @@ -614,6 +558,7 @@ public abstract class BasePlayer implements } break; case Player.STATE_READY: //3 + maybeUpdateCurrentMetadata(); maybeCorrectSeekPosition(); if (!isPrepared) { isPrepared = true; @@ -630,10 +575,12 @@ public abstract class BasePlayer implements } private void maybeCorrectSeekPosition() { - if (playQueue == null || simpleExoPlayer == null || currentInfo == null) return; + if (playQueue == null || simpleExoPlayer == null || currentMetadata == null) return; final int currentSourceIndex = playQueue.getIndex(); final PlayQueueItem currentSourceItem = playQueue.getItem(); + final StreamInfo currentInfo = currentMetadata.getMetadata(); + if (currentSourceItem == null) return; final long recoveryPositionMillis = currentSourceItem.getRecoveryPosition(); @@ -649,16 +596,15 @@ public abstract class BasePlayer implements playQueue.unsetRecovery(currentSourceIndex); } else if (isSynchronizing && isLive()) { - if (DEBUG) Log.d(TAG, "Playback - Synchronizing livestream to default time"); // Is still synchronizing? + if (DEBUG) Log.d(TAG, "Playback - Synchronizing livestream to default time"); seekToDefault(); } else if (isSynchronizing && presetStartPositionMillis > 0L) { + // Has another start position? if (DEBUG) Log.d(TAG, "Playback - Seeking to preset start " + "position=[" + presetStartPositionMillis + "]"); - // Has another start position? seekTo(presetStartPositionMillis); - currentInfo.setStartPosition(0); } isSynchronizing = false; @@ -732,6 +678,9 @@ public abstract class BasePlayer implements public void onPositionDiscontinuity(@Player.DiscontinuityReason final int reason) { if (DEBUG) Log.d(TAG, "ExoPlayer - onPositionDiscontinuity() called with " + "reason = [" + reason + "]"); + + maybeUpdateCurrentMetadata(); + // Refresh the playback if there is a transition to the next video final int newPeriodIndex = simpleExoPlayer.getCurrentPeriodIndex(); @@ -793,7 +742,7 @@ public abstract class BasePlayer implements if (DEBUG) Log.d(TAG, "Playback - onPlaybackBlock() called"); currentItem = null; - currentInfo = null; + currentMetadata = null; simpleExoPlayer.stop(); isPrepared = false; @@ -810,42 +759,21 @@ public abstract class BasePlayer implements simpleExoPlayer.prepare(mediaSource); } - @Override - public void onPlaybackSynchronize(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info) { + public void onPlaybackSynchronize(@NonNull final PlayQueueItem item) { if (DEBUG) Log.d(TAG, "Playback - onPlaybackSynchronize() called with " + - (info != null ? "available" : "null") + " info, " + "item=[" + item.getTitle() + "], url=[" + item.getUrl() + "]"); if (simpleExoPlayer == null || playQueue == null) return; final boolean onPlaybackInitial = currentItem == null; final boolean hasPlayQueueItemChanged = currentItem != item; - final boolean hasStreamInfoChanged = currentInfo != info; final int currentPlayQueueIndex = playQueue.indexOf(item); final int currentPlaylistIndex = simpleExoPlayer.getCurrentWindowIndex(); final int currentPlaylistSize = simpleExoPlayer.getCurrentTimeline().getWindowCount(); - // when starting playback on the last item when not repeating, maybe auto queue - if (info != null && currentPlayQueueIndex == playQueue.size() - 1 && - getRepeatMode() == Player.REPEAT_MODE_OFF && - PlayerHelper.isAutoQueueEnabled(context)) { - final PlayQueue autoQueue = PlayerHelper.autoQueueOf(info, playQueue.getStreams()); - if (autoQueue != null) playQueue.append(autoQueue.getStreams()); - } // If nothing to synchronize - if (!hasPlayQueueItemChanged && !hasStreamInfoChanged) { - return; - } - + if (!hasPlayQueueItemChanged) return; currentItem = item; - currentInfo = info; - if (hasPlayQueueItemChanged) { - // updates only to the stream info should not trigger another view count - registerView(); - initThumbnail(info == null ? item.getThumbnailUrl() : info.getThumbnailUrl()); - } - onMetadataChanged(item, info, currentPlayQueueIndex, hasPlayQueueItemChanged); // Check if on wrong window if (currentPlayQueueIndex != playQueue.getIndex()) { @@ -873,26 +801,21 @@ public abstract class BasePlayer implements } } - abstract protected void onMetadataChanged(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info, - final int newPlayQueueIndex, - final boolean hasPlayQueueItemChanged); + protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { + Log.d(TAG, "Playback - onMetadataChanged() called, " + + "playing: " + tag.getMetadata().getName()); + final StreamInfo info = tag.getMetadata(); - @Nullable - @Override - public MediaSource sourceOf(PlayQueueItem item, StreamInfo info) { - final StreamType streamType = info.getStreamType(); - if (!(streamType == StreamType.AUDIO_LIVE_STREAM || streamType == StreamType.LIVE_STREAM)) { - return null; + initThumbnail(info.getThumbnailUrl()); + registerView(); + + // when starting playback on the last item when not repeating, maybe auto queue + if (playQueue.getIndex() == playQueue.size() - 1 && + getRepeatMode() == Player.REPEAT_MODE_OFF && + PlayerHelper.isAutoQueueEnabled(context)) { + final PlayQueue autoQueue = PlayerHelper.autoQueueOf(info, playQueue.getStreams()); + if (autoQueue != null) playQueue.append(autoQueue.getStreams()); } - - if (!info.getHlsUrl().isEmpty()) { - return buildLiveMediaSource(info.getHlsUrl(), C.TYPE_HLS); - } else if (!info.getDashMpdUrl().isEmpty()) { - return buildLiveMediaSource(info.getDashMpdUrl(), C.TYPE_DASH); - } - - return null; } @Override @@ -1051,7 +974,8 @@ public abstract class BasePlayer implements //////////////////////////////////////////////////////////////////////////*/ private void registerView() { - if (databaseUpdateReactor == null || currentInfo == null) return; + if (databaseUpdateReactor == null || currentMetadata == null) return; + final StreamInfo currentInfo = currentMetadata.getMetadata(); databaseUpdateReactor.add(recordManager.onViewed(currentInfo).onErrorComplete() .subscribe( ignored -> {/* successful */}, @@ -1082,7 +1006,8 @@ public abstract class BasePlayer implements } private void savePlaybackState() { - if (simpleExoPlayer == null || currentInfo == null) return; + if (simpleExoPlayer == null || currentMetadata == null) return; + final StreamInfo currentInfo = currentMetadata.getMetadata(); if (simpleExoPlayer.getCurrentPosition() > RECOVERY_SKIP_THRESHOLD_MILLIS && simpleExoPlayer.getCurrentPosition() < @@ -1090,6 +1015,23 @@ public abstract class BasePlayer implements savePlaybackState(currentInfo, simpleExoPlayer.getCurrentPosition()); } } + + private void maybeUpdateCurrentMetadata() { + if (simpleExoPlayer == null) return; + + final MediaSourceTag metadata; + try { + metadata = (MediaSourceTag) simpleExoPlayer.getCurrentTag(); + } catch (IndexOutOfBoundsException | ClassCastException error) { + return; + } + + if (metadata == null || currentMetadata == metadata) return; + + currentMetadata = metadata; + onMetadataChanged(metadata); + } + /*////////////////////////////////////////////////////////////////////////// // Getters and Setters //////////////////////////////////////////////////////////////////////////*/ @@ -1106,19 +1048,28 @@ public abstract class BasePlayer implements return currentState; } + @Nullable + public MediaSourceTag getCurrentMetadata() { + return currentMetadata; + } + + @NonNull public String getVideoUrl() { return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getUrl(); } + @NonNull public String getVideoTitle() { return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getTitle(); } + @NonNull public String getUploaderName() { return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getUploader(); } /** Checks if the current playback is a livestream AND is playing at or beyond the live edge */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public boolean isLiveEdge() { if (simpleExoPlayer == null || !isLive()) return false; diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 56c8f8855..a66906c73 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -58,7 +58,6 @@ import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.SubtitleView; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.player.helper.PlaybackParameterDialog; @@ -67,6 +66,8 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.player.playqueue.PlayQueueItemBuilder; import org.schabi.newpipe.player.playqueue.PlayQueueItemHolder; import org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback; +import org.schabi.newpipe.player.resolver.MediaSourceTag; +import org.schabi.newpipe.player.resolver.VideoPlaybackResolver; import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; @@ -497,11 +498,8 @@ public final class MainVideoPlayer extends AppCompatActivity // Playback Listener //////////////////////////////////////////////////////////////////////////*/ - protected void onMetadataChanged(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info, - final int newPlayQueueIndex, - final boolean hasPlayQueueItemChanged) { - super.onMetadataChanged(item, info, newPlayQueueIndex, false); + protected void onMetadataChanged(@Nullable final MediaSourceTag tag) { + super.onMetadataChanged(tag); titleTextView.setText(getVideoTitle()); channelTextView.setText(getUploaderName()); @@ -686,14 +684,19 @@ public final class MainVideoPlayer extends AppCompatActivity } @Override - protected int getDefaultResolutionIndex(final List sortedVideos) { - return ListHelper.getDefaultResolutionIndex(context, sortedVideos); - } + protected VideoPlaybackResolver.QualityResolver getQualityResolver() { + return new VideoPlaybackResolver.QualityResolver() { + @Override + public int getDefaultResolutionIndex(List sortedVideos) { + return ListHelper.getDefaultResolutionIndex(context, sortedVideos); + } - @Override - protected int getOverrideResolutionIndex(final List sortedVideos, - final String playbackQuality) { - return ListHelper.getResolutionIndex(context, sortedVideos, playbackQuality); + @Override + public int getOverrideResolutionIndex(List sortedVideos, + String playbackQuality) { + return ListHelper.getResolutionIndex(context, sortedVideos, playbackQuality); + } + }; } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 8b0fc0ddc..476ad73ef 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -59,13 +59,13 @@ import com.google.android.exoplayer2.ui.SubtitleView; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.helper.LockManager; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.old.PlayVideoActivity; -import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.player.resolver.MediaSourceTag; +import org.schabi.newpipe.player.resolver.VideoPlaybackResolver; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ThemeHelper; @@ -511,14 +511,20 @@ public final class PopupVideoPlayer extends Service { } @Override - protected int getDefaultResolutionIndex(final List sortedVideos) { - return ListHelper.getPopupDefaultResolutionIndex(context, sortedVideos); - } + protected VideoPlaybackResolver.QualityResolver getQualityResolver() { + return new VideoPlaybackResolver.QualityResolver() { + @Override + public int getDefaultResolutionIndex(List sortedVideos) { + return ListHelper.getPopupDefaultResolutionIndex(context, sortedVideos); + } - @Override - protected int getOverrideResolutionIndex(final List sortedVideos, - final String playbackQuality) { - return ListHelper.getPopupResolutionIndex(context, sortedVideos, playbackQuality); + @Override + public int getOverrideResolutionIndex(List sortedVideos, + String playbackQuality) { + return ListHelper.getPopupResolutionIndex(context, sortedVideos, + playbackQuality); + } + }; } /*////////////////////////////////////////////////////////////////////////// @@ -539,8 +545,8 @@ public final class PopupVideoPlayer extends Service { } private void updateMetadata() { - if (activityListener != null && currentInfo != null) { - activityListener.onMetadataUpdate(currentInfo); + if (activityListener != null && getCurrentMetadata() != null) { + activityListener.onMetadataUpdate(getCurrentMetadata().getMetadata()); } } @@ -586,11 +592,8 @@ public final class PopupVideoPlayer extends Service { // Playback Listener //////////////////////////////////////////////////////////////////////////*/ - protected void onMetadataChanged(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info, - final int newPlayQueueIndex, - final boolean hasPlayQueueItemChanged) { - super.onMetadataChanged(item, info, newPlayQueueIndex, false); + protected void onMetadataChanged(@Nullable final MediaSourceTag tag) { + super.onMetadataChanged(tag); updateMetadata(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index 250d02b42..eaec59f65 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -29,7 +29,6 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; -import android.net.Uri; import android.os.Build; import android.os.Handler; import android.support.annotation.NonNull; @@ -47,11 +46,9 @@ import android.widget.SeekBar; import android.widget.TextView; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.MergingMediaSource; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.CaptionStyleCompat; @@ -62,21 +59,17 @@ import com.google.android.exoplayer2.video.VideoListener; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; -import org.schabi.newpipe.extractor.Subtitles; -import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; -import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.player.resolver.MediaSourceTag; +import org.schabi.newpipe.player.resolver.VideoPlaybackResolver; import org.schabi.newpipe.util.AnimationUtils; -import org.schabi.newpipe.util.ListHelper; import java.util.ArrayList; import java.util.List; -import static com.google.android.exoplayer2.C.SELECTION_FLAG_AUTOSELECT; -import static com.google.android.exoplayer2.C.TIME_UNSET; import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed; import static org.schabi.newpipe.player.helper.PlayerHelper.getTimeString; import static org.schabi.newpipe.util.AnimationUtils.animateView; @@ -105,13 +98,12 @@ public abstract class VideoPlayer extends BasePlayer public static final int DEFAULT_CONTROLS_DURATION = 300; // 300 millis public static final int DEFAULT_CONTROLS_HIDE_TIME = 2000; // 2 Seconds - private ArrayList availableStreams; + private List availableStreams; private int selectedStreamIndex; - protected String playbackQuality; - protected boolean wasPlaying = false; + @Nullable private VideoPlaybackResolver resolver; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ @@ -244,6 +236,8 @@ public abstract class VideoPlayer extends BasePlayer trackSelector.setParameters(trackSelector.buildUponParameters() .setTunnelingAudioSessionId(C.generateAudioSessionIdV21(context))); } + + resolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); } @Override @@ -326,23 +320,18 @@ public abstract class VideoPlayer extends BasePlayer // Playback Listener //////////////////////////////////////////////////////////////////////////*/ - protected abstract int getDefaultResolutionIndex(final List sortedVideos); + protected abstract VideoPlaybackResolver.QualityResolver getQualityResolver(); - protected abstract int getOverrideResolutionIndex(final List sortedVideos, final String playbackQuality); + protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { + super.onMetadataChanged(tag); - protected void onMetadataChanged(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info, - final int newPlayQueueIndex, - final boolean hasPlayQueueItemChanged) { qualityTextView.setVisibility(View.GONE); playbackSpeedTextView.setVisibility(View.GONE); playbackEndTime.setVisibility(View.GONE); playbackLiveSync.setVisibility(View.GONE); - final StreamType streamType = info == null ? StreamType.NONE : info.getStreamType(); - - switch (streamType) { + switch (tag.getMetadata().getStreamType()) { case AUDIO_STREAM: surfaceView.setVisibility(View.GONE); playbackEndTime.setVisibility(View.VISIBLE); @@ -359,20 +348,14 @@ public abstract class VideoPlayer extends BasePlayer break; case VIDEO_STREAM: + final StreamInfo info = tag.getMetadata(); if (info.getVideoStreams().size() + info.getVideoOnlyStreams().size() == 0) break; - final List videos = ListHelper.getSortedStreamVideosList(context, - info.getVideoStreams(), info.getVideoOnlyStreams(), false); - availableStreams = new ArrayList<>(videos); - if (playbackQuality == null) { - selectedStreamIndex = getDefaultResolutionIndex(videos); - } else { - selectedStreamIndex = getOverrideResolutionIndex(videos, getPlaybackQuality()); - } - + availableStreams = tag.getSortedAvailableVideoStreams(); + selectedStreamIndex = tag.getSelectedVideoStreamIndex(); buildQualityMenu(); - qualityTextView.setVisibility(View.VISIBLE); + qualityTextView.setVisibility(View.VISIBLE); surfaceView.setVisibility(View.VISIBLE); default: playbackEndTime.setVisibility(View.VISIBLE); @@ -386,65 +369,7 @@ public abstract class VideoPlayer extends BasePlayer @Override @Nullable public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { - final MediaSource liveSource = super.sourceOf(item, info); - if (liveSource != null) return liveSource; - - List mediaSources = new ArrayList<>(); - - // Create video stream source - final List videos = ListHelper.getSortedStreamVideosList(context, - info.getVideoStreams(), info.getVideoOnlyStreams(), false); - final int index; - if (videos.isEmpty()) { - index = -1; - } else if (playbackQuality == null) { - index = getDefaultResolutionIndex(videos); - } else { - index = getOverrideResolutionIndex(videos, getPlaybackQuality()); - } - final VideoStream video = index >= 0 && index < videos.size() ? videos.get(index) : null; - if (video != null) { - final MediaSource streamSource = buildMediaSource(video.getUrl(), - PlayerHelper.cacheKeyOf(info, video), - MediaFormat.getSuffixById(video.getFormatId())); - mediaSources.add(streamSource); - } - - // Create optional audio stream source - final List audioStreams = info.getAudioStreams(); - final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( - ListHelper.getDefaultAudioFormat(context, audioStreams)); - // Use the audio stream if there is no video stream, or - // Merge with audio stream in case if video does not contain audio - if (audio != null && ((video != null && video.isVideoOnly) || video == null)) { - final MediaSource audioSource = buildMediaSource(audio.getUrl(), - PlayerHelper.cacheKeyOf(info, audio), - MediaFormat.getSuffixById(audio.getFormatId())); - mediaSources.add(audioSource); - } - - // If there is no audio or video sources, then this media source cannot be played back - if (mediaSources.isEmpty()) return null; - // Below are auxiliary media sources - - // Create subtitle sources - for (final Subtitles subtitle : info.getSubtitles()) { - final String mimeType = PlayerHelper.mimeTypesOf(subtitle.getFileType()); - if (mimeType == null) continue; - - final Format textFormat = Format.createTextSampleFormat(null, mimeType, - SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle)); - final MediaSource textSource = dataSource.getSampleMediaSourceFactory() - .createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET); - mediaSources.add(textSource); - } - - if (mediaSources.size() == 1) { - return mediaSources.get(0); - } else { - return new MergingMediaSource(mediaSources.toArray( - new MediaSource[mediaSources.size()])); - } + return resolver == null ? null : resolver.resolve(info); } /*////////////////////////////////////////////////////////////////////////// @@ -908,11 +833,12 @@ public abstract class VideoPlayer extends BasePlayer //////////////////////////////////////////////////////////////////////////*/ public void setPlaybackQuality(final String quality) { - this.playbackQuality = quality; + if (resolver != null) resolver.setPlaybackQuality(quality); } + @Nullable public String getPlaybackQuality() { - return playbackQuality; + return resolver == null ? null : resolver.getPlaybackQuality(); } public AspectRatioFrameLayout getAspectRatioFrameLayout() { diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java index 67a8debef..b27dc3dd6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java @@ -5,12 +5,10 @@ import android.support.annotation.Nullable; import android.support.v4.util.ArraySet; import android.util.Log; -import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource; import com.google.android.exoplayer2.source.MediaSource; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; -import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.mediasource.FailedMediaSource; import org.schabi.newpipe.player.mediasource.LoadedMediaSource; import org.schabi.newpipe.player.mediasource.ManagedMediaSource; @@ -24,10 +22,8 @@ import org.schabi.newpipe.player.playqueue.events.RemoveEvent; import org.schabi.newpipe.player.playqueue.events.ReorderEvent; import org.schabi.newpipe.util.ServiceHelper; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -37,8 +33,6 @@ import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.disposables.SerialDisposable; -import io.reactivex.functions.Consumer; import io.reactivex.internal.subscriptions.EmptySubscription; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.PublishSubject; @@ -104,7 +98,6 @@ public class MediaSourceManager { private final static int MAXIMUM_LOADER_SIZE = WINDOW_SIZE * 2 + 1; @NonNull private final CompositeDisposable loaderReactor; @NonNull private final Set loadingItems; - @NonNull private final SerialDisposable syncReactor; @NonNull private final AtomicBoolean isBlocked; @@ -144,7 +137,6 @@ public class MediaSourceManager { this.playQueueReactor = EmptySubscription.INSTANCE; this.loaderReactor = new CompositeDisposable(); - this.syncReactor = new SerialDisposable(); this.isBlocked = new AtomicBoolean(false); @@ -171,7 +163,6 @@ public class MediaSourceManager { playQueueReactor.cancel(); loaderReactor.dispose(); - syncReactor.dispose(); } /*////////////////////////////////////////////////////////////////////////// @@ -310,21 +301,7 @@ public class MediaSourceManager { final PlayQueueItem currentItem = playQueue.getItem(); if (isBlocked.get() || currentItem == null) return; - final Consumer onSuccess = info -> syncInternal(currentItem, info); - final Consumer onError = throwable -> syncInternal(currentItem, null); - - final Disposable sync = currentItem.getStream() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(onSuccess, onError); - syncReactor.set(sync); - } - - private void syncInternal(@NonNull final PlayQueueItem item, - @Nullable final StreamInfo info) { - // Ensure the current item is up to date with the play queue - if (playQueue.getItem() == item) { - playbackListener.onPlaybackSynchronize(item, info); - } + playbackListener.onPlaybackSynchronize(currentItem); } private synchronized void maybeSynchronizePlayer() { @@ -423,7 +400,8 @@ public class MediaSourceManager { } /** - * Checks if the corresponding MediaSource in {@link DynamicConcatenatingMediaSource} + * Checks if the corresponding MediaSource in + * {@link com.google.android.exoplayer2.source.ConcatenatingMediaSource} * for a given {@link PlayQueueItem} needs replacement, either due to gapless playback * readiness or playlist desynchronization. *

diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java b/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java index 4dcb30aa3..238bdfcd0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java @@ -45,7 +45,7 @@ public interface PlaybackListener { * * May be called anytime at any amount once unblock is called. * */ - void onPlaybackSynchronize(@NonNull final PlayQueueItem item, @Nullable final StreamInfo info); + void onPlaybackSynchronize(@NonNull final PlayQueueItem item); /** * Requests the listener to resolve a stream info into a media source diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java new file mode 100644 index 000000000..f95f0e3bb --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -0,0 +1,39 @@ +package org.schabi.newpipe.player.resolver; + +import android.content.Context; +import android.support.annotation.NonNull; + +import com.google.android.exoplayer2.source.MediaSource; + +import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.player.helper.PlayerDataSource; +import org.schabi.newpipe.player.helper.PlayerHelper; +import org.schabi.newpipe.util.ListHelper; + +public class AudioPlaybackResolver implements PlaybackResolver { + + @NonNull private final Context context; + @NonNull private final PlayerDataSource dataSource; + + public AudioPlaybackResolver(@NonNull final Context context, + @NonNull final PlayerDataSource dataSource) { + this.context = context; + this.dataSource = dataSource; + } + + @Override + public MediaSource resolve(@NonNull StreamInfo info) { + final MediaSource liveSource = maybeBuildLiveMediaSource(dataSource, info); + if (liveSource != null) return liveSource; + + final int index = ListHelper.getDefaultAudioFormat(context, info.getAudioStreams()); + if (index < 0 || index >= info.getAudioStreams().size()) return null; + + final AudioStream audio = info.getAudioStreams().get(index); + final MediaSourceTag tag = new MediaSourceTag(info); + return buildMediaSource(dataSource, audio.getUrl(), PlayerHelper.cacheKeyOf(info, audio), + MediaFormat.getSuffixById(audio.getFormatId()), tag); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/MediaSourceTag.java b/app/src/main/java/org/schabi/newpipe/player/resolver/MediaSourceTag.java new file mode 100644 index 000000000..bbe5d33ca --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/MediaSourceTag.java @@ -0,0 +1,51 @@ +package org.schabi.newpipe.player.resolver; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.VideoStream; + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + +public class MediaSourceTag implements Serializable { + @NonNull private final StreamInfo metadata; + + @NonNull private final List sortedAvailableVideoStreams; + private final int selectedVideoStreamIndex; + + public MediaSourceTag(@NonNull final StreamInfo metadata, + @NonNull final List sortedAvailableVideoStreams, + final int selectedVideoStreamIndex) { + this.metadata = metadata; + this.sortedAvailableVideoStreams = sortedAvailableVideoStreams; + this.selectedVideoStreamIndex = selectedVideoStreamIndex; + } + + public MediaSourceTag(@NonNull final StreamInfo metadata) { + this(metadata, Collections.emptyList(), /*indexNotAvailable=*/-1); + } + + @NonNull + public StreamInfo getMetadata() { + return metadata; + } + + @NonNull + public List getSortedAvailableVideoStreams() { + return sortedAvailableVideoStreams; + } + + public int getSelectedVideoStreamIndex() { + return selectedVideoStreamIndex; + } + + @Nullable + public VideoStream getSelectedVideoStream() { + return selectedVideoStreamIndex < 0 || + selectedVideoStreamIndex >= sortedAvailableVideoStreams.size() ? null : + sortedAvailableVideoStreams.get(selectedVideoStreamIndex); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java new file mode 100644 index 000000000..1da3ec211 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -0,0 +1,84 @@ +package org.schabi.newpipe.player.resolver; + +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; + +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.util.Util; + +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.StreamType; +import org.schabi.newpipe.player.helper.PlayerDataSource; + +public interface PlaybackResolver extends Resolver { + + @Nullable + default MediaSource maybeBuildLiveMediaSource(@NonNull final PlayerDataSource dataSource, + @NonNull final StreamInfo info) { + final StreamType streamType = info.getStreamType(); + if (!(streamType == StreamType.AUDIO_LIVE_STREAM || streamType == StreamType.LIVE_STREAM)) { + return null; + } + + final MediaSourceTag tag = new MediaSourceTag(info); + if (!info.getHlsUrl().isEmpty()) { + return buildLiveMediaSource(dataSource, info.getHlsUrl(), C.TYPE_HLS, tag); + } else if (!info.getDashMpdUrl().isEmpty()) { + return buildLiveMediaSource(dataSource, info.getDashMpdUrl(), C.TYPE_DASH, tag); + } + + return null; + } + + @NonNull + default MediaSource buildLiveMediaSource(@NonNull final PlayerDataSource dataSource, + @NonNull final String sourceUrl, + @C.ContentType final int type, + @NonNull final MediaSourceTag metadata) { + final Uri uri = Uri.parse(sourceUrl); + switch (type) { + case C.TYPE_SS: + return dataSource.getLiveSsMediaSourceFactory().setTag(metadata) + .createMediaSource(uri); + case C.TYPE_DASH: + return dataSource.getLiveDashMediaSourceFactory().setTag(metadata) + .createMediaSource(uri); + case C.TYPE_HLS: + return dataSource.getLiveHlsMediaSourceFactory().setTag(metadata) + .createMediaSource(uri); + default: + throw new IllegalStateException("Unsupported type: " + type); + } + } + + @NonNull + default MediaSource buildMediaSource(@NonNull final PlayerDataSource dataSource, + @NonNull final String sourceUrl, + @NonNull final String cacheKey, + @NonNull final String overrideExtension, + @NonNull final MediaSourceTag metadata) { + final Uri uri = Uri.parse(sourceUrl); + @C.ContentType final int type = TextUtils.isEmpty(overrideExtension) ? + Util.inferContentType(uri) : Util.inferContentType("." + overrideExtension); + + switch (type) { + case C.TYPE_SS: + return dataSource.getLiveSsMediaSourceFactory().setTag(metadata) + .createMediaSource(uri); + case C.TYPE_DASH: + return dataSource.getDashMediaSourceFactory().setTag(metadata) + .createMediaSource(uri); + case C.TYPE_HLS: + return dataSource.getHlsMediaSourceFactory().setTag(metadata) + .createMediaSource(uri); + case C.TYPE_OTHER: + return dataSource.getExtractorMediaSourceFactory(cacheKey).setTag(metadata) + .createMediaSource(uri); + default: + throw new IllegalStateException("Unsupported type: " + type); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java new file mode 100644 index 000000000..e4f81385a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java @@ -0,0 +1,7 @@ +package org.schabi.newpipe.player.resolver; + +import android.support.annotation.NonNull; + +public interface Resolver { + Produce resolve(@NonNull Source source); +} diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java new file mode 100644 index 000000000..5aa42ce3c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -0,0 +1,122 @@ +package org.schabi.newpipe.player.resolver; + +import android.content.Context; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.MergingMediaSource; + +import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.Subtitles; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.player.helper.PlayerDataSource; +import org.schabi.newpipe.player.helper.PlayerHelper; +import org.schabi.newpipe.util.ListHelper; + +import java.util.ArrayList; +import java.util.List; + +import static com.google.android.exoplayer2.C.SELECTION_FLAG_AUTOSELECT; +import static com.google.android.exoplayer2.C.TIME_UNSET; + +public class VideoPlaybackResolver implements PlaybackResolver { + + public interface QualityResolver { + int getDefaultResolutionIndex(final List sortedVideos); + int getOverrideResolutionIndex(final List sortedVideos, + final String playbackQuality); + } + + @NonNull private final Context context; + @NonNull private final PlayerDataSource dataSource; + @NonNull private final QualityResolver qualityResolver; + + @Nullable private String playbackQuality; + + public VideoPlaybackResolver(@NonNull final Context context, + @NonNull final PlayerDataSource dataSource, + @NonNull final QualityResolver qualityResolver) { + this.context = context; + this.dataSource = dataSource; + this.qualityResolver = qualityResolver; + } + + @Override + public MediaSource resolve(@NonNull StreamInfo info) { + final MediaSource liveSource = maybeBuildLiveMediaSource(dataSource, info); + if (liveSource != null) return liveSource; + + List mediaSources = new ArrayList<>(); + + // Create video stream source + final List videos = ListHelper.getSortedStreamVideosList(context, + info.getVideoStreams(), info.getVideoOnlyStreams(), false); + final int index; + if (videos.isEmpty()) { + index = -1; + } else if (playbackQuality == null) { + index = qualityResolver.getDefaultResolutionIndex(videos); + } else { + index = qualityResolver.getOverrideResolutionIndex(videos, getPlaybackQuality()); + } + final MediaSourceTag tag = new MediaSourceTag(info, videos, index); + @Nullable final VideoStream video = tag.getSelectedVideoStream(); + + if (video != null) { + final MediaSource streamSource = buildMediaSource(dataSource, video.getUrl(), + PlayerHelper.cacheKeyOf(info, video), + MediaFormat.getSuffixById(video.getFormatId()), tag); + mediaSources.add(streamSource); + } + + // Create optional audio stream source + final List audioStreams = info.getAudioStreams(); + final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( + ListHelper.getDefaultAudioFormat(context, audioStreams)); + // Use the audio stream if there is no video stream, or + // Merge with audio stream in case if video does not contain audio + if (audio != null && ((video != null && video.isVideoOnly) || video == null)) { + final MediaSource audioSource = buildMediaSource(dataSource, audio.getUrl(), + PlayerHelper.cacheKeyOf(info, audio), + MediaFormat.getSuffixById(audio.getFormatId()), tag); + mediaSources.add(audioSource); + } + + // If there is no audio or video sources, then this media source cannot be played back + if (mediaSources.isEmpty()) return null; + // Below are auxiliary media sources + + // Create subtitle sources + for (final Subtitles subtitle : info.getSubtitles()) { + final String mimeType = PlayerHelper.mimeTypesOf(subtitle.getFileType()); + if (mimeType == null) continue; + + final Format textFormat = Format.createTextSampleFormat(null, mimeType, + SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle)); + final MediaSource textSource = dataSource.getSampleMediaSourceFactory() + .createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET); + mediaSources.add(textSource); + } + + if (mediaSources.size() == 1) { + return mediaSources.get(0); + } else { + return new MergingMediaSource(mediaSources.toArray( + new MediaSource[mediaSources.size()])); + } + } + + @Nullable + public String getPlaybackQuality() { + return playbackQuality; + } + + public void setPlaybackQuality(@Nullable String playbackQuality) { + this.playbackQuality = playbackQuality; + } +} From 5c202f04e7babd401584149bc4e92c124e484867 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Thu, 10 May 2018 17:48:05 -0700 Subject: [PATCH 051/363] -[#1383]Fixed popup player caption selector not populating due to full width aspect ratio selector. -Fixed potential memory leak in media session connector containing player instance. --- .../org/schabi/newpipe/player/BasePlayer.java | 22 ++++--------------- .../player/helper/MediaSessionManager.java | 5 ++++- app/src/main/res/layout/player_popup.xml | 2 +- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 2cbef93e4..a0607621e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -285,9 +285,11 @@ public abstract class BasePlayer implements destroyPlayer(); unregisterBroadcastReceiver(); + if (mediaSessionManager != null) mediaSessionManager.dispose(); + trackSelector = null; - simpleExoPlayer = null; mediaSessionManager = null; + simpleExoPlayer = null; } /*////////////////////////////////////////////////////////////////////////// @@ -494,22 +496,6 @@ public abstract class BasePlayer implements (manifest == null ? "no manifest" : "available manifest") + ", " + "timeline size = [" + timeline.getWindowCount() + "], " + "reason = [" + reason + "]"); - if (playQueue == null) return; - - switch (reason) { - case Player.TIMELINE_CHANGE_REASON_RESET: // called after #block - case Player.TIMELINE_CHANGE_REASON_PREPARED: // called after #unblock - case Player.TIMELINE_CHANGE_REASON_DYNAMIC: // called after playlist changes - // Ensures MediaSourceManager#update is complete - final boolean isPlaylistStable = timeline.getWindowCount() == playQueue.size(); - // Ensure dynamic/livestream timeline changes does not cause negative position - if (isPlaylistStable && !isCurrentWindowValid() && !isSynchronizing) { - if (DEBUG) Log.d(TAG, "Playback - negative time position reached, " + - "clamping to default position."); - seekToDefault(); - } - break; - } } @Override @@ -598,7 +584,7 @@ public abstract class BasePlayer implements } else if (isSynchronizing && isLive()) { // Is still synchronizing? if (DEBUG) Log.d(TAG, "Playback - Synchronizing livestream to default time"); - seekToDefault(); + //seekToDefault(); } else if (isSynchronizing && presetStartPositionMillis > 0L) { // Has another start position? diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java index b174ed3ed..63c0bf333 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java @@ -39,10 +39,13 @@ public class MediaSessionManager { return MediaButtonReceiver.handleIntent(mediaSession, intent); } + /** + * Should be called on player destruction to prevent leakage. + * */ public void dispose() { this.sessionConnector.setPlayer(null, null); this.sessionConnector.setQueueNavigator(null); this.mediaSession.setActive(false); this.mediaSession.release(); - } + } } diff --git a/app/src/main/res/layout/player_popup.xml b/app/src/main/res/layout/player_popup.xml index f866cf002..001d43bf6 100644 --- a/app/src/main/res/layout/player_popup.xml +++ b/app/src/main/res/layout/player_popup.xml @@ -111,7 +111,7 @@ Date: Fri, 11 May 2018 17:20:36 -0700 Subject: [PATCH 052/363] -Fixed bookmarked playlist not updating metadata when changed. --- .../newpipe/fragments/list/playlist/PlaylistFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index ca732aa2c..161bca694 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -289,6 +289,7 @@ public class PlaylistFragment extends BaseListInfoFragment { remotePlaylistManager.getPlaylist(result) .flatMap(lists -> getUpdateProcessor(lists, result), (lists, id) -> lists) .onBackpressureLatest() + .flatMap(lists -> getUpdateProcessor(lists, result), (lists, id) -> lists) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistBookmarkSubscriber()); @@ -354,7 +355,6 @@ public class PlaylistFragment extends BaseListInfoFragment { final PlaylistRemoteEntity playlistEntity = playlists.get(0); if (playlistEntity.isIdenticalTo(result)) return noItemToUpdate; - return remotePlaylistManager.onUpdate(playlists.get(0).getUid(), result).toFlowable(); } From 19b8796cbcf827c86d69250e368cb2255869a51c Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Fri, 11 May 2018 19:21:40 -0700 Subject: [PATCH 053/363] -Fixed statistics fragment button not animating when pressed. -Removed background player notification button opacity change. --- .../newpipe/player/BackgroundPlayer.java | 27 ------------------- .../res/layout/statistic_playlist_control.xml | 5 ++-- 2 files changed, 3 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index b5135bd84..37b7e4c64 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -26,9 +26,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; -import android.os.Build; import android.os.IBinder; -import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; @@ -92,7 +90,6 @@ public final class BackgroundPlayer extends Service { private NotificationCompat.Builder notBuilder; private RemoteViews notRemoteView; private RemoteViews bigNotRemoteView; - private final String setAlphaMethodName = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) ? "setImageAlpha" : "setAlpha"; private boolean shouldUpdateOnProgress; @@ -246,16 +243,6 @@ public final class BackgroundPlayer extends Service { } notificationManager.notify(NOTIFICATION_ID, notBuilder.build()); } - - private void setControlsOpacity(@IntRange(from = 0, to = 255) int opacity) { - if (notRemoteView != null) notRemoteView.setInt(R.id.notificationPlayPause, setAlphaMethodName, opacity); - if (bigNotRemoteView != null) bigNotRemoteView.setInt(R.id.notificationPlayPause, setAlphaMethodName, opacity); - if (notRemoteView != null) notRemoteView.setInt(R.id.notificationFForward, setAlphaMethodName, opacity); - if (bigNotRemoteView != null) bigNotRemoteView.setInt(R.id.notificationFForward, setAlphaMethodName, opacity); - if (notRemoteView != null) notRemoteView.setInt(R.id.notificationFRewind, setAlphaMethodName, opacity); - if (bigNotRemoteView != null) bigNotRemoteView.setInt(R.id.notificationFRewind, setAlphaMethodName, opacity); - } - /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -525,32 +512,20 @@ public final class BackgroundPlayer extends Service { public void changeState(int state) { super.changeState(state); updatePlayback(); - } - - @Override - public void onBlocked() { - super.onBlocked(); - - setControlsOpacity(77); updateNotification(-1); } @Override public void onPlaying() { super.onPlaying(); - - setControlsOpacity(255); updateNotification(R.drawable.ic_pause_white); - lockManager.acquireWifiAndCpu(); } @Override public void onPaused() { super.onPaused(); - updateNotification(R.drawable.ic_play_arrow_white); - lockManager.releaseWifiAndCpu(); } @@ -558,8 +533,6 @@ public final class BackgroundPlayer extends Service { public void onCompleted() { super.onCompleted(); - setControlsOpacity(255); - resetNotification(); if (bigNotRemoteView != null) bigNotRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); if (notRemoteView != null) notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); diff --git a/app/src/main/res/layout/statistic_playlist_control.xml b/app/src/main/res/layout/statistic_playlist_control.xml index 8dc4e8c08..ff2b70524 100644 --- a/app/src/main/res/layout/statistic_playlist_control.xml +++ b/app/src/main/res/layout/statistic_playlist_control.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" android:orientation="vertical"> + android:focusable="true" + android:background="?attr/selectableItemBackground"> + Date: Fri, 11 May 2018 19:42:39 -0700 Subject: [PATCH 054/363] -Reduced fling speed required to close popup by 40%. --- .../java/org/schabi/newpipe/player/helper/PlayerHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index d10b99aec..275f488e3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -252,7 +252,7 @@ public class PlayerHelper { } public static int getShutdownFlingVelocity(@NonNull final Context context) { - return 10000; + return 6000; } public static int getTossFlingVelocity(@NonNull final Context context) { From 13587d7ab373253eae3a3f8590d9d62057e5d634 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Fri, 11 May 2018 20:09:02 -0700 Subject: [PATCH 055/363] -Fixed some typos. --- .../schabi/newpipe/player/helper/PlaybackParameterDialog.java | 2 +- .../java/org/schabi/newpipe/player/resolver/Resolver.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index 60e43ff7d..c53680835 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -21,7 +21,7 @@ import static org.schabi.newpipe.player.BasePlayer.DEBUG; public class PlaybackParameterDialog extends DialogFragment { @NonNull private static final String TAG = "PlaybackParameterDialog"; - // Maximum allowable range in ExoPlayer + // Minimum allowable range in ExoPlayer public static final double MINIMUM_PLAYBACK_VALUE = 0.10f; public static final double MAXIMUM_PLAYBACK_VALUE = 3.00f; diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java index e4f81385a..a7d4448e4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java @@ -2,6 +2,6 @@ package org.schabi.newpipe.player.resolver; import android.support.annotation.NonNull; -public interface Resolver { - Produce resolve(@NonNull Source source); +public interface Resolver { + Product resolve(@NonNull Source source); } From 0a2dbc468809f779edf9190bdcf18d8d4be4c9d9 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Wed, 16 May 2018 18:08:19 -0700 Subject: [PATCH 056/363] -Fixed playlist fragment infinite update cycle. -Updated Room DB version to 1.1.0. --- .../newpipe/fragments/list/playlist/PlaylistFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 161bca694..ca732aa2c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -289,7 +289,6 @@ public class PlaylistFragment extends BaseListInfoFragment { remotePlaylistManager.getPlaylist(result) .flatMap(lists -> getUpdateProcessor(lists, result), (lists, id) -> lists) .onBackpressureLatest() - .flatMap(lists -> getUpdateProcessor(lists, result), (lists, id) -> lists) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistBookmarkSubscriber()); @@ -355,6 +354,7 @@ public class PlaylistFragment extends BaseListInfoFragment { final PlaylistRemoteEntity playlistEntity = playlists.get(0); if (playlistEntity.isIdenticalTo(result)) return noItemToUpdate; + return remotePlaylistManager.onUpdate(playlists.get(0).getUid(), result).toFlowable(); } From f1f5996975cb3a5315c98dbeaa5e108105a2a4b8 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Wed, 16 May 2018 18:18:32 -0700 Subject: [PATCH 057/363] -Refactored playback resolvers and other persistent player objects to instantiate once only during player creation to enforce non-nullity. -Fixed background and popup player service staying in foreground when playback is paused or completed. -Fixed player metadata not updating on new stream. -Fixed player intent playback quality not applied. -Fixed player auto-queue not applied after stream transition or swapping. --- .../newpipe/player/BackgroundPlayer.java | 101 +++++++++++++---- .../org/schabi/newpipe/player/BasePlayer.java | 103 ++++++++++-------- .../newpipe/player/MainVideoPlayer.java | 8 +- .../newpipe/player/PopupVideoPlayer.java | 85 +++++++++++---- .../schabi/newpipe/player/VideoPlayer.java | 18 ++- .../resolver/AudioPlaybackResolver.java | 2 + .../newpipe/player/resolver/Resolver.java | 3 +- .../resolver/VideoPlaybackResolver.java | 1 + 8 files changed, 219 insertions(+), 102 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 37b7e4c64..c5c9f0615 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -37,6 +37,7 @@ import android.widget.RemoteViews; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.source.MediaSource; +import com.nostra13.universalimageloader.core.assist.FailReason; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; @@ -264,16 +265,16 @@ public final class BackgroundPlayer extends Service { protected class BasePlayerImpl extends BasePlayer { - @Nullable private AudioPlaybackResolver resolver; + @NonNull final private AudioPlaybackResolver resolver; BasePlayerImpl(Context context) { super(context); + this.resolver = new AudioPlaybackResolver(context, dataSource); } @Override public void initPlayer(boolean playOnReady) { super.initPlayer(playOnReady); - resolver = new AudioPlaybackResolver(context, dataSource); } @Override @@ -286,30 +287,65 @@ public final class BackgroundPlayer extends Service { startForeground(NOTIFICATION_ID, notBuilder.build()); } - @Override - public void initThumbnail(final String url) { + /*////////////////////////////////////////////////////////////////////////// + // Thumbnail Loading + //////////////////////////////////////////////////////////////////////////*/ + + private void setDummyRemoteViewThumbnail() { resetNotification(); - if (notRemoteView != null) notRemoteView.setImageViewResource(R.id.notificationCover, R.drawable.dummy_thumbnail); - if (bigNotRemoteView != null) bigNotRemoteView.setImageViewResource(R.id.notificationCover, R.drawable.dummy_thumbnail); + if (notRemoteView != null) { + notRemoteView.setImageViewResource(R.id.notificationCover, + R.drawable.dummy_thumbnail); + } + if (bigNotRemoteView != null) { + bigNotRemoteView.setImageViewResource(R.id.notificationCover, + R.drawable.dummy_thumbnail); + } updateNotification(-1); - super.initThumbnail(url); + } + + @Override + public void onLoadingStarted(String imageUri, View view) { + super.onLoadingStarted(imageUri, view); + setDummyRemoteViewThumbnail(); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); - - if (loadedImage != null) { - // rebuild notification here since remote view does not release bitmaps, causing memory leaks - resetNotification(); - - if (notRemoteView != null) notRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); - if (bigNotRemoteView != null) bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); - - updateNotification(-1); + if (loadedImage == null) { + setDummyRemoteViewThumbnail(); + return; } + + // rebuild notification here since remote view does not release bitmaps, + // causing memory leaks + resetNotification(); + if (notRemoteView != null) { + notRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); + } + if (bigNotRemoteView != null) { + bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); + } + updateNotification(-1); } + @Override + public void onLoadingFailed(String imageUri, View view, FailReason failReason) { + super.onLoadingFailed(imageUri, view, failReason); + setDummyRemoteViewThumbnail(); + } + + @Override + public void onLoadingCancelled(String imageUri, View view) { + super.onLoadingCancelled(imageUri, view); + setDummyRemoteViewThumbnail(); + } + + /*////////////////////////////////////////////////////////////////////////// + // States Implementation + //////////////////////////////////////////////////////////////////////////*/ + @Override public void onPrepared(boolean playWhenReady) { super.onPrepared(playWhenReady); @@ -385,17 +421,15 @@ public final class BackgroundPlayer extends Service { protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { super.onMetadataChanged(tag); - if (shouldUpdateOnProgress) { - resetNotification(); - updateNotification(-1); - updateMetadata(); - } + resetNotification(); + updateNotification(-1); + updateMetadata(); } @Override @Nullable public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { - return resolver == null ? null : resolver.resolve(info); + return resolver.resolve(info); } @Override @@ -515,18 +549,40 @@ public final class BackgroundPlayer extends Service { updateNotification(-1); } + @Override + public void onBlocked() { + super.onBlocked(); + startForeground(NOTIFICATION_ID, notBuilder.build()); + } + + @Override + public void onBuffering() { + super.onBuffering(); + startForeground(NOTIFICATION_ID, notBuilder.build()); + } + + @Override + public void onPausedSeek() { + super.onPausedSeek(); + startForeground(NOTIFICATION_ID, notBuilder.build()); + } + @Override public void onPlaying() { super.onPlaying(); updateNotification(R.drawable.ic_pause_white); + lockManager.acquireWifiAndCpu(); + startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override public void onPaused() { super.onPaused(); updateNotification(R.drawable.ic_play_arrow_white); + lockManager.releaseWifiAndCpu(); + stopForeground(false); } @Override @@ -539,6 +595,7 @@ public final class BackgroundPlayer extends Service { updateNotification(R.drawable.ic_replay_white); lockManager.releaseWifiAndCpu(); + stopForeground(false); } } } diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index a0607621e..3f50cf149 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -68,6 +68,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueAdapter; import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.player.resolver.MediaSourceTag; +import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.SerializedCache; import java.io.IOException; @@ -78,6 +79,7 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; +import io.reactivex.disposables.SerialDisposable; import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_INTERNAL; import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_PERIOD_TRANSITION; @@ -104,6 +106,14 @@ public abstract class BasePlayer implements @NonNull final protected HistoryRecordManager recordManager; + @NonNull final protected CustomTrackSelector trackSelector; + @NonNull final protected PlayerDataSource dataSource; + + @NonNull final private LoadControl loadControl; + @NonNull final private RenderersFactory renderFactory; + + @NonNull final private SerialDisposable progressUpdateReactor; + @NonNull final private CompositeDisposable databaseUpdateReactor; /*////////////////////////////////////////////////////////////////////////// // Intent //////////////////////////////////////////////////////////////////////////*/ @@ -142,9 +152,6 @@ public abstract class BasePlayer implements protected final static int PROGRESS_LOOP_INTERVAL_MILLIS = 500; protected final static int RECOVERY_SKIP_THRESHOLD_MILLIS = 3000; // 3 seconds - protected CustomTrackSelector trackSelector; - protected PlayerDataSource dataSource; - protected SimpleExoPlayer simpleExoPlayer; protected AudioReactor audioReactor; protected MediaSessionManager mediaSessionManager; @@ -152,9 +159,6 @@ public abstract class BasePlayer implements private boolean isPrepared = false; private boolean isSynchronizing = false; - protected Disposable progressUpdateReactor; - protected CompositeDisposable databaseUpdateReactor; - //////////////////////////////////////////////////////////////////////////*/ public BasePlayer(@NonNull final Context context) { @@ -171,29 +175,32 @@ public abstract class BasePlayer implements context.registerReceiver(broadcastReceiver, intentFilter); this.recordManager = new HistoryRecordManager(context); + + this.progressUpdateReactor = new SerialDisposable(); + this.databaseUpdateReactor = new CompositeDisposable(); + + final String userAgent = Downloader.USER_AGENT; + final DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); + this.dataSource = new PlayerDataSource(context, userAgent, bandwidthMeter); + + final TrackSelection.Factory trackSelectionFactory = + PlayerHelper.getQualitySelector(context, bandwidthMeter); + this.trackSelector = new CustomTrackSelector(trackSelectionFactory); + + this.loadControl = new LoadController(context); + this.renderFactory = new DefaultRenderersFactory(context); } public void setup() { - if (simpleExoPlayer == null) initPlayer(/*playOnInit=*/true); + if (simpleExoPlayer == null) { + initPlayer(/*playOnInit=*/true); + } initListeners(); } public void initPlayer(final boolean playOnReady) { if (DEBUG) Log.d(TAG, "initPlayer() called with: context = [" + context + "]"); - if (databaseUpdateReactor != null) databaseUpdateReactor.dispose(); - databaseUpdateReactor = new CompositeDisposable(); - - final String userAgent = Downloader.USER_AGENT; - final DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); - dataSource = new PlayerDataSource(context, userAgent, bandwidthMeter); - - final TrackSelection.Factory trackSelectionFactory = - PlayerHelper.getQualitySelector(context, bandwidthMeter); - trackSelector = new CustomTrackSelector(trackSelectionFactory); - - final LoadControl loadControl = new LoadController(context); - final RenderersFactory renderFactory = new DefaultRenderersFactory(context); simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(renderFactory, trackSelector, loadControl); simpleExoPlayer.addListener(this); simpleExoPlayer.setPlayWhenReady(playOnReady); @@ -287,7 +294,6 @@ public abstract class BasePlayer implements if (mediaSessionManager != null) mediaSessionManager.dispose(); - trackSelector = null; mediaSessionManager = null; simpleExoPlayer = null; } @@ -296,11 +302,12 @@ public abstract class BasePlayer implements // Thumbnail Loading //////////////////////////////////////////////////////////////////////////*/ - public void initThumbnail(final String url) { + private void initThumbnail(final String url) { if (DEBUG) Log.d(TAG, "Thumbnail - initThumbnail() called"); if (url == null || url.isEmpty()) return; ImageLoader.getInstance().resume(); - ImageLoader.getInstance().loadImage(url, this); + ImageLoader.getInstance().loadImage(url, ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS, + this); } @Override @@ -461,13 +468,11 @@ public abstract class BasePlayer implements public abstract void onUpdateProgress(int currentProgress, int duration, int bufferPercent); protected void startProgressLoop() { - if (progressUpdateReactor != null) progressUpdateReactor.dispose(); - progressUpdateReactor = getProgressReactor(); + progressUpdateReactor.set(getProgressReactor()); } protected void stopProgressLoop() { - if (progressUpdateReactor != null) progressUpdateReactor.dispose(); - progressUpdateReactor = null; + progressUpdateReactor.set(null); } public void triggerProgressUpdate() { @@ -482,7 +487,8 @@ public abstract class BasePlayer implements private Disposable getProgressReactor() { return Observable.interval(PROGRESS_LOOP_INTERVAL_MILLIS, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> triggerProgressUpdate()); + .subscribe(ignored -> triggerProgressUpdate(), + error -> Log.e(TAG, "Progress update failure: ", error)); } /*////////////////////////////////////////////////////////////////////////// @@ -496,12 +502,16 @@ public abstract class BasePlayer implements (manifest == null ? "no manifest" : "available manifest") + ", " + "timeline size = [" + timeline.getWindowCount() + "], " + "reason = [" + reason + "]"); + + maybeUpdateCurrentMetadata(); } @Override public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { if (DEBUG) Log.d(TAG, "ExoPlayer - onTracksChanged(), " + "track group size = " + trackGroups.length); + + maybeUpdateCurrentMetadata(); } @Override @@ -521,6 +531,8 @@ public abstract class BasePlayer implements } else if (isLoading && !isProgressLoopRunning()) { startProgressLoop(); } + + maybeUpdateCurrentMetadata(); } @Override @@ -665,24 +677,22 @@ public abstract class BasePlayer implements if (DEBUG) Log.d(TAG, "ExoPlayer - onPositionDiscontinuity() called with " + "reason = [" + reason + "]"); - maybeUpdateCurrentMetadata(); - // Refresh the playback if there is a transition to the next video final int newPeriodIndex = simpleExoPlayer.getCurrentPeriodIndex(); - - /* Discontinuity reasons!! Thank you ExoPlayer lords */ switch (reason) { case DISCONTINUITY_REASON_PERIOD_TRANSITION: if (newPeriodIndex == playQueue.getIndex()) { registerView(); } else { - playQueue.offsetIndex(+1); + playQueue.setIndex(newPeriodIndex); } case DISCONTINUITY_REASON_SEEK: case DISCONTINUITY_REASON_SEEK_ADJUSTMENT: case DISCONTINUITY_REASON_INTERNAL: break; } + + maybeUpdateCurrentMetadata(); } @Override @@ -794,14 +804,6 @@ public abstract class BasePlayer implements initThumbnail(info.getThumbnailUrl()); registerView(); - - // when starting playback on the last item when not repeating, maybe auto queue - if (playQueue.getIndex() == playQueue.size() - 1 && - getRepeatMode() == Player.REPEAT_MODE_OFF && - PlayerHelper.isAutoQueueEnabled(context)) { - final PlayQueue autoQueue = PlayerHelper.autoQueueOf(info, playQueue.getStreams()); - if (autoQueue != null) playQueue.append(autoQueue.getStreams()); - } } @Override @@ -960,7 +962,7 @@ public abstract class BasePlayer implements //////////////////////////////////////////////////////////////////////////*/ private void registerView() { - if (databaseUpdateReactor == null || currentMetadata == null) return; + if (currentMetadata == null) return; final StreamInfo currentInfo = currentMetadata.getMetadata(); databaseUpdateReactor.add(recordManager.onViewed(currentInfo).onErrorComplete() .subscribe( @@ -980,7 +982,7 @@ public abstract class BasePlayer implements } protected void savePlaybackState(final StreamInfo info, final long progress) { - if (info == null || databaseUpdateReactor == null) return; + if (info == null) return; final Disposable stateSaver = recordManager.saveStreamState(info, progress) .observeOn(AndroidSchedulers.mainThread()) .onErrorComplete() @@ -1012,12 +1014,23 @@ public abstract class BasePlayer implements return; } - if (metadata == null || currentMetadata == metadata) return; + if (metadata == null) return; + maybeAutoQueueNextStream(metadata); + if (currentMetadata == metadata) return; currentMetadata = metadata; onMetadataChanged(metadata); } + private void maybeAutoQueueNextStream(@NonNull final MediaSourceTag currentMetadata) { + if (playQueue == null || playQueue.getIndex() != playQueue.size() - 1 || + getRepeatMode() != Player.REPEAT_MODE_OFF || + !PlayerHelper.isAutoQueueEnabled(context)) return; + // auto queue when starting playback on the last item when not repeating + final PlayQueue autoQueue = PlayerHelper.autoQueueOf(currentMetadata.getMetadata(), + playQueue.getStreams()); + if (autoQueue != null) playQueue.append(autoQueue.getStreams()); + } /*////////////////////////////////////////////////////////////////////////// // Getters and Setters //////////////////////////////////////////////////////////////////////////*/ @@ -1135,7 +1148,7 @@ public abstract class BasePlayer implements } public boolean isProgressLoopRunning() { - return progressUpdateReactor != null && !progressUpdateReactor.isDisposed(); + return progressUpdateReactor.get() != null; } public void setRecovery() { diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index a66906c73..9130ea009 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -127,7 +127,7 @@ public final class MainVideoPlayer extends AppCompatActivity hideSystemUi(); setContentView(R.layout.activity_main_player); - playerImpl = new VideoPlayerImpl(this); + playerImpl = new VideoPlayerImpl(this); playerImpl.setup(findViewById(android.R.id.content)); if (savedInstanceState != null && savedInstanceState.get(KEY_SAVED_STATE) != null) { @@ -498,11 +498,11 @@ public final class MainVideoPlayer extends AppCompatActivity // Playback Listener //////////////////////////////////////////////////////////////////////////*/ - protected void onMetadataChanged(@Nullable final MediaSourceTag tag) { + protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { super.onMetadataChanged(tag); - titleTextView.setText(getVideoTitle()); - channelTextView.setText(getUploaderName()); + titleTextView.setText(tag.getMetadata().getName()); + channelTextView.setText(tag.getMetadata().getUploaderName()); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 476ad73ef..0426525a4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -56,6 +56,7 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.text.CaptionStyleCompat; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.SubtitleView; +import com.nostra13.universalimageloader.core.assist.FailReason; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; @@ -428,21 +429,6 @@ public final class PopupVideoPlayer extends Service { super.destroy(); } - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - if (loadedImage != null) { - // rebuild notification here since remote view does not release bitmaps, causing memory leaks - notBuilder = createNotification(); - - if (notRemoteView != null) { - notRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); - } - - updateNotification(-1); - } - } - @Override public void onFullScreenButtonClicked() { super.onFullScreenButtonClicked(); @@ -527,6 +513,54 @@ public final class PopupVideoPlayer extends Service { }; } + /*////////////////////////////////////////////////////////////////////////// + // Thumbnail Loading + //////////////////////////////////////////////////////////////////////////*/ + + private void setDummyRemoteViewThumbnail() { + resetNotification(); + if (notRemoteView != null) { + notRemoteView.setImageViewResource(R.id.notificationCover, + R.drawable.dummy_thumbnail); + } + updateNotification(-1); + } + + @Override + public void onLoadingStarted(String imageUri, View view) { + super.onLoadingStarted(imageUri, view); + setDummyRemoteViewThumbnail(); + } + + @Override + public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { + super.onLoadingComplete(imageUri, view, loadedImage); + if (loadedImage == null) { + setDummyRemoteViewThumbnail(); + return; + } + + // rebuild notification here since remote view does not release bitmaps, + // causing memory leaks + resetNotification(); + if (notRemoteView != null) { + notRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); + } + updateNotification(-1); + } + + @Override + public void onLoadingFailed(String imageUri, View view, FailReason failReason) { + super.onLoadingFailed(imageUri, view, failReason); + setDummyRemoteViewThumbnail(); + } + + @Override + public void onLoadingCancelled(String imageUri, View view) { + super.onLoadingCancelled(imageUri, view); + setDummyRemoteViewThumbnail(); + } + /*////////////////////////////////////////////////////////////////////////// // Activity Event Listener //////////////////////////////////////////////////////////////////////////*/ @@ -578,8 +612,8 @@ public final class PopupVideoPlayer extends Service { public void onRepeatModeChanged(int i) { super.onRepeatModeChanged(i); setRepeatModeRemote(notRemoteView, i); - updateNotification(-1); updatePlayback(); + updateNotification(-1); } @Override @@ -592,7 +626,7 @@ public final class PopupVideoPlayer extends Service { // Playback Listener //////////////////////////////////////////////////////////////////////////*/ - protected void onMetadataChanged(@Nullable final MediaSourceTag tag) { + protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { super.onMetadataChanged(tag); updateMetadata(); } @@ -651,12 +685,14 @@ public final class PopupVideoPlayer extends Service { public void changeState(int state) { super.changeState(state); updatePlayback(); + updateNotification(-1); } @Override public void onBlocked() { super.onBlocked(); updateNotification(R.drawable.ic_play_arrow_white); + startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override @@ -664,19 +700,21 @@ public final class PopupVideoPlayer extends Service { super.onPlaying(); updateNotification(R.drawable.ic_pause_white); videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); - lockManager.acquireWifiAndCpu(); - hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + + startForeground(NOTIFICATION_ID, notBuilder.build()); + lockManager.acquireWifiAndCpu(); } @Override public void onBuffering() { super.onBuffering(); updateNotification(R.drawable.ic_play_arrow_white); + startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override @@ -684,10 +722,13 @@ public final class PopupVideoPlayer extends Service { super.onPaused(); updateNotification(R.drawable.ic_play_arrow_white); videoPlayPause.setBackgroundResource(R.drawable.ic_play_arrow_white); + lockManager.releaseWifiAndCpu(); windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + + stopForeground(false); } @Override @@ -695,6 +736,7 @@ public final class PopupVideoPlayer extends Service { super.onPausedSeek(); videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); updateNotification(R.drawable.ic_play_arrow_white); + startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override @@ -702,10 +744,13 @@ public final class PopupVideoPlayer extends Service { super.onCompleted(); updateNotification(R.drawable.ic_replay_white); videoPlayPause.setBackgroundResource(R.drawable.ic_replay_white); + lockManager.releaseWifiAndCpu(); windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + + stopForeground(false); } @Override @@ -731,7 +776,7 @@ public final class PopupVideoPlayer extends Service { /*package-private*/ void enableVideoRenderer(final boolean enable) { final int videoRendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO); - if (trackSelector != null && videoRendererIndex != RENDERER_UNAVAILABLE) { + if (videoRendererIndex != RENDERER_UNAVAILABLE) { trackSelector.setParameters(trackSelector.buildUponParameters() .setRendererDisabled(videoRendererIndex, !enable)); } diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index eaec59f65..1ca0ff4ee 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -103,7 +103,7 @@ public abstract class VideoPlayer extends BasePlayer protected boolean wasPlaying = false; - @Nullable private VideoPlaybackResolver resolver; + @NonNull final private VideoPlaybackResolver resolver; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ @@ -154,6 +154,7 @@ public abstract class VideoPlayer extends BasePlayer public VideoPlayer(String debugTag, Context context) { super(context); this.TAG = debugTag; + this.resolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); } public void setup(View rootView) { @@ -236,8 +237,6 @@ public abstract class VideoPlayer extends BasePlayer trackSelector.setParameters(trackSelector.buildUponParameters() .setTunnelingAudioSessionId(C.generateAudioSessionIdV21(context))); } - - resolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); } @Override @@ -292,7 +291,7 @@ public abstract class VideoPlayer extends BasePlayer 0, Menu.NONE, R.string.caption_none); captionOffItem.setOnMenuItemClickListener(menuItem -> { final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT); - if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) { + if (textRendererIndex != RENDERER_UNAVAILABLE) { trackSelector.setParameters(trackSelector.buildUponParameters() .setRendererDisabled(textRendererIndex, true)); } @@ -306,7 +305,7 @@ public abstract class VideoPlayer extends BasePlayer i + 1, Menu.NONE, captionLanguage); captionItem.setOnMenuItemClickListener(menuItem -> { final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT); - if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) { + if (textRendererIndex != RENDERER_UNAVAILABLE) { trackSelector.setPreferredTextLanguage(captionLanguage); trackSelector.setParameters(trackSelector.buildUponParameters() .setRendererDisabled(textRendererIndex, false)); @@ -369,7 +368,7 @@ public abstract class VideoPlayer extends BasePlayer @Override @Nullable public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { - return resolver == null ? null : resolver.resolve(info); + return resolver.resolve(info); } /*////////////////////////////////////////////////////////////////////////// @@ -480,8 +479,7 @@ public abstract class VideoPlayer extends BasePlayer final int textRenderer = getRendererIndex(C.TRACK_TYPE_TEXT); if (captionTextView == null) return; - if (trackSelector == null || trackSelector.getCurrentMappedTrackInfo() == null || - textRenderer == RENDERER_UNAVAILABLE) { + if (trackSelector.getCurrentMappedTrackInfo() == null || textRenderer == RENDERER_UNAVAILABLE) { captionTextView.setVisibility(View.GONE); return; } @@ -833,12 +831,12 @@ public abstract class VideoPlayer extends BasePlayer //////////////////////////////////////////////////////////////////////////*/ public void setPlaybackQuality(final String quality) { - if (resolver != null) resolver.setPlaybackQuality(quality); + this.resolver.setPlaybackQuality(quality); } @Nullable public String getPlaybackQuality() { - return resolver == null ? null : resolver.getPlaybackQuality(); + return resolver.getPlaybackQuality(); } public AspectRatioFrameLayout getAspectRatioFrameLayout() { diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index f95f0e3bb..6bb556850 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.player.resolver; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.google.android.exoplayer2.source.MediaSource; @@ -24,6 +25,7 @@ public class AudioPlaybackResolver implements PlaybackResolver { } @Override + @Nullable public MediaSource resolve(@NonNull StreamInfo info) { final MediaSource liveSource = maybeBuildLiveMediaSource(dataSource, info); if (liveSource != null) return liveSource; diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java index a7d4448e4..4bd795574 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java @@ -1,7 +1,8 @@ package org.schabi.newpipe.player.resolver; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; public interface Resolver { - Product resolve(@NonNull Source source); + @Nullable Product resolve(@NonNull Source source); } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index 5aa42ce3c..8f91f4886 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -47,6 +47,7 @@ public class VideoPlaybackResolver implements PlaybackResolver { } @Override + @Nullable public MediaSource resolve(@NonNull StreamInfo info) { final MediaSource liveSource = maybeBuildLiveMediaSource(dataSource, info); if (liveSource != null) return liveSource; From 0ece4851d24f3962827ab33ccd359a781478add5 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Wed, 23 May 2018 19:56:43 -0700 Subject: [PATCH 058/363] -Updated ExoPlayer to 2.8.1, fixing livestream with long duration not loading. -Updated OkHttp to 3.10.0 and RxJava to 2.1.14. -Changed player recovery seek to use ExoPlayer built-in window seeking instead of seeking after stream window starts playing. -Changed playback speed changer default step size to 25%. -Changed player notification to reset on all state changes. -Fixed gradle dependency version incorrect variable names. -Fixed video player double tap not working during pause. -[#1412] Fixed NPE when sharing video to main video activity when it was playing but is out of focus: Reset main player state when new intent is received. -[#1410] Fixed fast forwarding and rewinding not working within 10 seconds from beginning or end of a stream window. --- app/build.gradle | 2 +- .../newpipe/player/BackgroundPlayer.java | 6 ++- .../org/schabi/newpipe/player/BasePlayer.java | 42 +++++-------------- .../newpipe/player/MainVideoPlayer.java | 1 - .../newpipe/player/PopupVideoPlayer.java | 2 +- .../helper/PlaybackParameterDialog.java | 36 +++++++++------- 6 files changed, 36 insertions(+), 53 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b04daebed..6410cb823 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ android { ext { supportLibVersion = '27.1.1' - exoPlayerLibVersion = '2.8.0' + exoPlayerLibVersion = '2.8.1' roomDbLibVersion = '1.1.1' leakCanaryLibVersion = '1.5.4' okHttpLibVersion = '3.10.0' diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index c5c9f0615..231163b7b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -544,26 +544,29 @@ public final class BackgroundPlayer extends Service { @Override public void changeState(int state) { + resetNotification(); super.changeState(state); updatePlayback(); - updateNotification(-1); } @Override public void onBlocked() { super.onBlocked(); + updateNotification(-1); startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override public void onBuffering() { super.onBuffering(); + updateNotification(-1); startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override public void onPausedSeek() { super.onPausedSeek(); + updateNotification(-1); startForeground(NOTIFICATION_ID, notBuilder.build()); } @@ -589,7 +592,6 @@ public final class BackgroundPlayer extends Service { public void onCompleted() { super.onCompleted(); - resetNotification(); if (bigNotRemoteView != null) bigNotRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); if (notRemoteView != null) notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); updateNotification(R.drawable.ic_replay_white); diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 3f50cf149..113ccbf68 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -85,7 +85,6 @@ import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_INTERNAL import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_PERIOD_TRANSITION; import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_SEEK; import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT; -import static org.schabi.newpipe.player.helper.PlayerHelper.getTimeString; /** * Base for the players, joining the common properties @@ -157,7 +156,6 @@ public abstract class BasePlayer implements protected MediaSessionManager mediaSessionManager; private boolean isPrepared = false; - private boolean isSynchronizing = false; //////////////////////////////////////////////////////////////////////////*/ @@ -575,37 +573,17 @@ public abstract class BasePlayer implements private void maybeCorrectSeekPosition() { if (playQueue == null || simpleExoPlayer == null || currentMetadata == null) return; - final int currentSourceIndex = playQueue.getIndex(); final PlayQueueItem currentSourceItem = playQueue.getItem(); - final StreamInfo currentInfo = currentMetadata.getMetadata(); - if (currentSourceItem == null) return; - final long recoveryPositionMillis = currentSourceItem.getRecoveryPosition(); - final boolean isCurrentWindowCorrect = - simpleExoPlayer.getCurrentPeriodIndex() == currentSourceIndex; + final StreamInfo currentInfo = currentMetadata.getMetadata(); final long presetStartPositionMillis = currentInfo.getStartPosition() * 1000; - - if (recoveryPositionMillis != PlayQueueItem.RECOVERY_UNSET && isCurrentWindowCorrect) { - // Is recovering previous playback? - if (DEBUG) Log.d(TAG, "Playback - Rewinding to recovery time=" + - "[" + getTimeString((int)recoveryPositionMillis) + "]"); - seekTo(recoveryPositionMillis); - playQueue.unsetRecovery(currentSourceIndex); - - } else if (isSynchronizing && isLive()) { - // Is still synchronizing? - if (DEBUG) Log.d(TAG, "Playback - Synchronizing livestream to default time"); - //seekToDefault(); - - } else if (isSynchronizing && presetStartPositionMillis > 0L) { + if (presetStartPositionMillis > 0L) { // Has another start position? if (DEBUG) Log.d(TAG, "Playback - Seeking to preset start " + "position=[" + presetStartPositionMillis + "]"); seekTo(presetStartPositionMillis); } - - isSynchronizing = false; } /** @@ -784,16 +762,18 @@ public abstract class BasePlayer implements "index=[" + currentPlayQueueIndex + "] with " + "playlist length=[" + currentPlaylistSize + "]"); - // If not playing correct stream, change window position and sets flag - // for synchronizing once window position is corrected - // @see maybeCorrectSeekPosition() } else if (currentPlaylistIndex != currentPlayQueueIndex || onPlaybackInitial || !isPlaying()) { if (DEBUG) Log.d(TAG, "Playback - Rewinding to correct" + " index=[" + currentPlayQueueIndex + "]," + " from=[" + currentPlaylistIndex + "], size=[" + currentPlaylistSize + "]."); - isSynchronizing = true; - simpleExoPlayer.seekToDefaultPosition(currentPlayQueueIndex); + + if (item.getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET) { + simpleExoPlayer.seekTo(currentPlayQueueIndex, item.getRecoveryPosition()); + playQueue.unsetRecovery(currentPlayQueueIndex); + } else { + simpleExoPlayer.seekToDefaultPosition(currentPlayQueueIndex); + } } } @@ -936,9 +916,7 @@ public abstract class BasePlayer implements public void seekTo(long positionMillis) { if (DEBUG) Log.d(TAG, "seekBy() called with: position = [" + positionMillis + "]"); - if (simpleExoPlayer == null || positionMillis < 0 || - positionMillis > simpleExoPlayer.getDuration()) return; - simpleExoPlayer.seekTo(positionMillis); + if (simpleExoPlayer != null) simpleExoPlayer.seekTo(positionMillis); } public void seekBy(long offsetMillis) { diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 9130ea009..bf728f9d5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -896,7 +896,6 @@ public final class MainVideoPlayer extends AppCompatActivity @Override public boolean onDoubleTap(MotionEvent e) { if (DEBUG) Log.d(TAG, "onDoubleTap() called with: e = [" + e + "]" + "rawXy = " + e.getRawX() + ", " + e.getRawY() + ", xy = " + e.getX() + ", " + e.getY()); - if (!playerImpl.isPlaying()) return false; if (e.getX() > playerImpl.getRootView().getWidth() * 2 / 3) { playerImpl.onFastForward(); diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 0426525a4..e2929d26f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -683,9 +683,9 @@ public final class PopupVideoPlayer extends Service { @Override public void changeState(int state) { + resetNotification(); super.changeState(state); updatePlayback(); - updateNotification(-1); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index c53680835..c184da0a5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -27,7 +27,13 @@ public class PlaybackParameterDialog extends DialogFragment { public static final char STEP_UP_SIGN = '+'; public static final char STEP_DOWN_SIGN = '-'; - public static final double DEFAULT_PLAYBACK_STEP_VALUE = 0.05f; + + public static final double STEP_ONE_PERCENT_VALUE = 0.01f; + public static final double STEP_FIVE_PERCENT_VALUE = 0.05f; + public static final double STEP_TEN_PERCENT_VALUE = 0.10f; + public static final double STEP_TWENTY_FIVE_PERCENT_VALUE = 0.25f; + public static final double STEP_ONE_HUNDRED_PERCENT_VALUE = 1.00f; + public static final double DEFAULT_PLAYBACK_STEP_VALUE = STEP_TWENTY_FIVE_PERCENT_VALUE; public static final double DEFAULT_TEMPO = 1.00f; public static final double DEFAULT_PITCH = 1.00f; @@ -244,35 +250,33 @@ public class PlaybackParameterDialog extends DialogFragment { stepSizeOneHundredPercentText = rootView.findViewById(R.id.stepSizeOneHundredPercent); if (stepSizeOnePercentText != null) { - final double onePercent = 0.01f; - stepSizeOnePercentText.setText(getPercentString(onePercent)); - stepSizeOnePercentText.setOnClickListener(view -> setupStepSize(onePercent)); + stepSizeOnePercentText.setText(getPercentString(STEP_ONE_PERCENT_VALUE)); + stepSizeOnePercentText.setOnClickListener(view -> + setupStepSize(STEP_ONE_PERCENT_VALUE)); } if (stepSizeFivePercentText != null) { - final double fivePercent = 0.05f; - stepSizeFivePercentText.setText(getPercentString(fivePercent)); - stepSizeFivePercentText.setOnClickListener(view -> setupStepSize(fivePercent)); + stepSizeFivePercentText.setText(getPercentString(STEP_FIVE_PERCENT_VALUE)); + stepSizeFivePercentText.setOnClickListener(view -> + setupStepSize(STEP_FIVE_PERCENT_VALUE)); } if (stepSizeTenPercentText != null) { - final double tenPercent = 0.10f; - stepSizeTenPercentText.setText(getPercentString(tenPercent)); - stepSizeTenPercentText.setOnClickListener(view -> setupStepSize(tenPercent)); + stepSizeTenPercentText.setText(getPercentString(STEP_TEN_PERCENT_VALUE)); + stepSizeTenPercentText.setOnClickListener(view -> + setupStepSize(STEP_TEN_PERCENT_VALUE)); } if (stepSizeTwentyFivePercentText != null) { - final double twentyFivePercent = 0.25f; - stepSizeTwentyFivePercentText.setText(getPercentString(twentyFivePercent)); + stepSizeTwentyFivePercentText.setText(getPercentString(STEP_TWENTY_FIVE_PERCENT_VALUE)); stepSizeTwentyFivePercentText.setOnClickListener(view -> - setupStepSize(twentyFivePercent)); + setupStepSize(STEP_TWENTY_FIVE_PERCENT_VALUE)); } if (stepSizeOneHundredPercentText != null) { - final double oneHundredPercent = 1.00f; - stepSizeOneHundredPercentText.setText(getPercentString(oneHundredPercent)); + stepSizeOneHundredPercentText.setText(getPercentString(STEP_ONE_HUNDRED_PERCENT_VALUE)); stepSizeOneHundredPercentText.setOnClickListener(view -> - setupStepSize(oneHundredPercent)); + setupStepSize(STEP_ONE_HUNDRED_PERCENT_VALUE)); } } From 157b0642145623c45a545af72f74f3bab2d68620 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Wed, 23 May 2018 20:18:48 -0700 Subject: [PATCH 059/363] -Fixed player database and progress disposable disposed when destroying exoplayer. -Fixed livestream not reloading on behind live window exception. -Added nonnull annotation to player intent strings. --- .../org/schabi/newpipe/player/BasePlayer.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 113ccbf68..ad62c71c3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -117,14 +117,14 @@ public abstract class BasePlayer implements // Intent //////////////////////////////////////////////////////////////////////////*/ - public static final String REPEAT_MODE = "repeat_mode"; - public static final String PLAYBACK_PITCH = "playback_pitch"; - public static final String PLAYBACK_SPEED = "playback_speed"; - public static final String PLAYBACK_SKIP_SILENCE = "playback_skip_silence"; - public static final String PLAYBACK_QUALITY = "playback_quality"; - public static final String PLAY_QUEUE_KEY = "play_queue_key"; - public static final String APPEND_ONLY = "append_only"; - public static final String SELECT_ON_APPEND = "select_on_append"; + @NonNull public static final String REPEAT_MODE = "repeat_mode"; + @NonNull public static final String PLAYBACK_PITCH = "playback_pitch"; + @NonNull public static final String PLAYBACK_SPEED = "playback_speed"; + @NonNull public static final String PLAYBACK_SKIP_SILENCE = "playback_skip_silence"; + @NonNull public static final String PLAYBACK_QUALITY = "playback_quality"; + @NonNull public static final String PLAY_QUEUE_KEY = "play_queue_key"; + @NonNull public static final String APPEND_ONLY = "append_only"; + @NonNull public static final String SELECT_ON_APPEND = "select_on_append"; /*////////////////////////////////////////////////////////////////////////// // Playback @@ -276,7 +276,6 @@ public abstract class BasePlayer implements if (playQueue != null) playQueue.dispose(); if (audioReactor != null) audioReactor.dispose(); if (playbackManager != null) playbackManager.dispose(); - if (databaseUpdateReactor != null) databaseUpdateReactor.dispose(); if (mediaSessionManager != null) mediaSessionManager.dispose(); if (playQueueAdapter != null) { @@ -290,9 +289,9 @@ public abstract class BasePlayer implements destroyPlayer(); unregisterBroadcastReceiver(); - if (mediaSessionManager != null) mediaSessionManager.dispose(); + databaseUpdateReactor.clear(); + progressUpdateReactor.set(null); - mediaSessionManager = null; simpleExoPlayer = null; } @@ -635,7 +634,7 @@ public abstract class BasePlayer implements setRecovery(); final Throwable cause = error.getCause(); - if (cause instanceof BehindLiveWindowException) { + if (error instanceof BehindLiveWindowException) { reload(); } else if (cause instanceof UnknownHostException) { playQueue.error(/*isNetworkProblem=*/true); @@ -942,11 +941,12 @@ public abstract class BasePlayer implements private void registerView() { if (currentMetadata == null) return; final StreamInfo currentInfo = currentMetadata.getMetadata(); - databaseUpdateReactor.add(recordManager.onViewed(currentInfo).onErrorComplete() + final Disposable viewRegister = recordManager.onViewed(currentInfo).onErrorComplete() .subscribe( ignored -> {/* successful */}, error -> Log.e(TAG, "Player onViewed() failure: ", error) - )); + ); + databaseUpdateReactor.add(viewRegister); } protected void reload() { From 2d6317bd24d76d34f561600f25fd152f6bd2cc6d Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Mon, 28 May 2018 19:51:41 -0700 Subject: [PATCH 060/363] -Fixed audio-only streams thumbnail not displaying on video players. -Fixed potential play queue desynchronization due to fast forwarding on silence. -Added current thumbnail storing in base player to allow immediate retrieval for notification building. -Removed video player buffer spinner during interim buffering but not initial buffering. -Reverted foreground notification stopping on pause and on complete. --- .../newpipe/player/BackgroundPlayer.java | 85 ++++--------------- .../org/schabi/newpipe/player/BasePlayer.java | 31 +++++-- .../newpipe/player/MainVideoPlayer.java | 1 - .../newpipe/player/PopupVideoPlayer.java | 52 ++++-------- .../schabi/newpipe/player/VideoPlayer.java | 7 +- 5 files changed, 64 insertions(+), 112 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 231163b7b..805326abd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -188,7 +188,9 @@ public final class BackgroundPlayer extends Service { .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setCustomContentView(notRemoteView) .setCustomBigContentView(bigNotRemoteView); - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) builder.setPriority(NotificationCompat.PRIORITY_MAX); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { + builder.setPriority(NotificationCompat.PRIORITY_MAX); + } return builder; } @@ -197,6 +199,7 @@ public final class BackgroundPlayer extends Service { remoteViews.setTextViewText(R.id.notificationSongName, basePlayerImpl.getVideoTitle()); remoteViews.setTextViewText(R.id.notificationArtist, basePlayerImpl.getUploaderName()); + remoteViews.setImageViewBitmap(R.id.notificationCover, basePlayerImpl.getThumbnail()); remoteViews.setOnClickPendingIntent(R.id.notificationPlayPause, PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT)); @@ -244,6 +247,7 @@ public final class BackgroundPlayer extends Service { } notificationManager.notify(NOTIFICATION_ID, notBuilder.build()); } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -291,57 +295,26 @@ public final class BackgroundPlayer extends Service { // Thumbnail Loading //////////////////////////////////////////////////////////////////////////*/ - private void setDummyRemoteViewThumbnail() { - resetNotification(); - if (notRemoteView != null) { - notRemoteView.setImageViewResource(R.id.notificationCover, - R.drawable.dummy_thumbnail); - } - if (bigNotRemoteView != null) { - bigNotRemoteView.setImageViewResource(R.id.notificationCover, - R.drawable.dummy_thumbnail); - } - updateNotification(-1); - } - - @Override - public void onLoadingStarted(String imageUri, View view) { - super.onLoadingStarted(imageUri, view); - setDummyRemoteViewThumbnail(); - } - @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); - if (loadedImage == null) { - setDummyRemoteViewThumbnail(); - return; - } - - // rebuild notification here since remote view does not release bitmaps, - // causing memory leaks resetNotification(); - if (notRemoteView != null) { - notRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); - } - if (bigNotRemoteView != null) { - bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); - } updateNotification(-1); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { super.onLoadingFailed(imageUri, view, failReason); - setDummyRemoteViewThumbnail(); + resetNotification(); + updateNotification(-1); } @Override public void onLoadingCancelled(String imageUri, View view) { super.onLoadingCancelled(imageUri, view); - setDummyRemoteViewThumbnail(); + resetNotification(); + updateNotification(-1); } - /*////////////////////////////////////////////////////////////////////////// // States Implementation //////////////////////////////////////////////////////////////////////////*/ @@ -544,60 +517,38 @@ public final class BackgroundPlayer extends Service { @Override public void changeState(int state) { - resetNotification(); super.changeState(state); updatePlayback(); } - @Override - public void onBlocked() { - super.onBlocked(); - updateNotification(-1); - startForeground(NOTIFICATION_ID, notBuilder.build()); - } - - @Override - public void onBuffering() { - super.onBuffering(); - updateNotification(-1); - startForeground(NOTIFICATION_ID, notBuilder.build()); - } - - @Override - public void onPausedSeek() { - super.onPausedSeek(); - updateNotification(-1); - startForeground(NOTIFICATION_ID, notBuilder.build()); - } - @Override public void onPlaying() { super.onPlaying(); + resetNotification(); updateNotification(R.drawable.ic_pause_white); - lockManager.acquireWifiAndCpu(); - startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override public void onPaused() { super.onPaused(); + resetNotification(); updateNotification(R.drawable.ic_play_arrow_white); - lockManager.releaseWifiAndCpu(); - stopForeground(false); } @Override public void onCompleted() { super.onCompleted(); - - if (bigNotRemoteView != null) bigNotRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); - if (notRemoteView != null) notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); + resetNotification(); + if (bigNotRemoteView != null) { + bigNotRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); + } + if (notRemoteView != null) { + notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); + } updateNotification(R.drawable.ic_replay_white); - lockManager.releaseWifiAndCpu(); - stopForeground(false); } } } diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index ad62c71c3..12e65cba1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -24,6 +24,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.media.AudioManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -139,6 +140,7 @@ public abstract class BasePlayer implements @Nullable private PlayQueueItem currentItem; @Nullable private MediaSourceTag currentMetadata; + @Nullable private Bitmap currentThumbnail; @Nullable protected Toast errorToast; @@ -317,6 +319,7 @@ public abstract class BasePlayer implements public void onLoadingFailed(String imageUri, View view, FailReason failReason) { Log.e(TAG, "Thumbnail - onLoadingFailed() called on imageUri = [" + imageUri + "]", failReason.getCause()); + currentThumbnail = null; } @Override @@ -324,12 +327,14 @@ public abstract class BasePlayer implements if (DEBUG) Log.d(TAG, "Thumbnail - onLoadingComplete() called with: " + "imageUri = [" + imageUri + "], view = [" + view + "], " + "loadedImage = [" + loadedImage + "]"); + currentThumbnail = loadedImage; } @Override public void onLoadingCancelled(String imageUri, View view) { if (DEBUG) Log.d(TAG, "Thumbnail - onLoadingCancelled() called with: " + "imageUri = [" + imageUri + "], view = [" + view + "]"); + currentThumbnail = null; } /*////////////////////////////////////////////////////////////////////////// @@ -653,19 +658,25 @@ public abstract class BasePlayer implements public void onPositionDiscontinuity(@Player.DiscontinuityReason final int reason) { if (DEBUG) Log.d(TAG, "ExoPlayer - onPositionDiscontinuity() called with " + "reason = [" + reason + "]"); + if (playQueue == null) return; // Refresh the playback if there is a transition to the next video - final int newPeriodIndex = simpleExoPlayer.getCurrentPeriodIndex(); + final int newWindowIndex = simpleExoPlayer.getCurrentWindowIndex(); switch (reason) { case DISCONTINUITY_REASON_PERIOD_TRANSITION: - if (newPeriodIndex == playQueue.getIndex()) { + // When player is in single repeat mode and a period transition occurs, + // we need to register a view count here since no metadata has changed + if (getRepeatMode() == Player.REPEAT_MODE_ONE && + newWindowIndex == playQueue.getIndex()) { registerView(); - } else { - playQueue.setIndex(newPeriodIndex); + break; } case DISCONTINUITY_REASON_SEEK: case DISCONTINUITY_REASON_SEEK_ADJUSTMENT: case DISCONTINUITY_REASON_INTERNAL: + if (playQueue.getIndex() != newWindowIndex) { + playQueue.setIndex(newWindowIndex); + } break; } @@ -777,9 +788,10 @@ public abstract class BasePlayer implements } protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { - Log.d(TAG, "Playback - onMetadataChanged() called, " + - "playing: " + tag.getMetadata().getName()); final StreamInfo info = tag.getMetadata(); + if (DEBUG) { + Log.d(TAG, "Playback - onMetadataChanged() called, playing: " + info.getName()); + } initThumbnail(info.getThumbnailUrl()); registerView(); @@ -1045,6 +1057,13 @@ public abstract class BasePlayer implements return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getUploader(); } + @Nullable + public Bitmap getThumbnail() { + return currentThumbnail == null ? + BitmapFactory.decodeResource(context.getResources(), R.drawable.dummy_thumbnail) : + currentThumbnail; + } + /** Checks if the current playback is a livestream AND is playing at or beyond the live edge */ @SuppressWarnings("BooleanMethodIsAlwaysInverted") public boolean isLiveEdge() { diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index bf728f9d5..9f3b5d020 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -720,7 +720,6 @@ public final class MainVideoPlayer extends AppCompatActivity @Override public void onBuffering() { super.onBuffering(); - animatePlayButtons(false, 100); getRootView().setKeepScreenOn(true); } diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index e2929d26f..3bee984a8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -34,7 +34,6 @@ import android.os.Build; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; import android.util.DisplayMetrics; import android.util.Log; @@ -229,6 +228,7 @@ public final class PopupVideoPlayer extends Service { notRemoteView.setTextViewText(R.id.notificationSongName, playerImpl.getVideoTitle()); notRemoteView.setTextViewText(R.id.notificationArtist, playerImpl.getUploaderName()); + notRemoteView.setImageViewBitmap(R.id.notificationCover, playerImpl.getThumbnail()); notRemoteView.setOnClickPendingIntent(R.id.notificationPlayPause, PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT)); @@ -517,48 +517,27 @@ public final class PopupVideoPlayer extends Service { // Thumbnail Loading //////////////////////////////////////////////////////////////////////////*/ - private void setDummyRemoteViewThumbnail() { - resetNotification(); - if (notRemoteView != null) { - notRemoteView.setImageViewResource(R.id.notificationCover, - R.drawable.dummy_thumbnail); - } - updateNotification(-1); - } - - @Override - public void onLoadingStarted(String imageUri, View view) { - super.onLoadingStarted(imageUri, view); - setDummyRemoteViewThumbnail(); - } - @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); - if (loadedImage == null) { - setDummyRemoteViewThumbnail(); - return; - } - // rebuild notification here since remote view does not release bitmaps, // causing memory leaks resetNotification(); - if (notRemoteView != null) { - notRemoteView.setImageViewBitmap(R.id.notificationCover, loadedImage); - } updateNotification(-1); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { super.onLoadingFailed(imageUri, view, failReason); - setDummyRemoteViewThumbnail(); + resetNotification(); + updateNotification(-1); } @Override public void onLoadingCancelled(String imageUri, View view) { super.onLoadingCancelled(imageUri, view); - setDummyRemoteViewThumbnail(); + resetNotification(); + updateNotification(-1); } /*////////////////////////////////////////////////////////////////////////// @@ -613,6 +592,7 @@ public final class PopupVideoPlayer extends Service { super.onRepeatModeChanged(i); setRepeatModeRemote(notRemoteView, i); updatePlayback(); + resetNotification(); updateNotification(-1); } @@ -683,7 +663,6 @@ public final class PopupVideoPlayer extends Service { @Override public void changeState(int state) { - resetNotification(); super.changeState(state); updatePlayback(); } @@ -691,14 +670,16 @@ public final class PopupVideoPlayer extends Service { @Override public void onBlocked() { super.onBlocked(); + resetNotification(); updateNotification(R.drawable.ic_play_arrow_white); - startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override public void onPlaying() { super.onPlaying(); + resetNotification(); updateNotification(R.drawable.ic_pause_white); + videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); @@ -713,16 +694,17 @@ public final class PopupVideoPlayer extends Service { @Override public void onBuffering() { super.onBuffering(); + resetNotification(); updateNotification(R.drawable.ic_play_arrow_white); - startForeground(NOTIFICATION_ID, notBuilder.build()); } @Override public void onPaused() { super.onPaused(); + resetNotification(); updateNotification(R.drawable.ic_play_arrow_white); - videoPlayPause.setBackgroundResource(R.drawable.ic_play_arrow_white); + videoPlayPause.setBackgroundResource(R.drawable.ic_play_arrow_white); lockManager.releaseWifiAndCpu(); windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; @@ -734,17 +716,19 @@ public final class PopupVideoPlayer extends Service { @Override public void onPausedSeek() { super.onPausedSeek(); - videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); + resetNotification(); updateNotification(R.drawable.ic_play_arrow_white); - startForeground(NOTIFICATION_ID, notBuilder.build()); + + videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); } @Override public void onCompleted() { super.onCompleted(); + resetNotification(); updateNotification(R.drawable.ic_replay_white); - videoPlayPause.setBackgroundResource(R.drawable.ic_replay_white); + videoPlayPause.setBackgroundResource(R.drawable.ic_replay_white); lockManager.releaseWifiAndCpu(); windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; @@ -768,8 +752,6 @@ public final class PopupVideoPlayer extends Service { super.hideControlsAndButton(duration, delay, videoPlayPause); } - - /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index 1ca0ff4ee..73f5e94b1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -333,16 +333,19 @@ public abstract class VideoPlayer extends BasePlayer switch (tag.getMetadata().getStreamType()) { case AUDIO_STREAM: surfaceView.setVisibility(View.GONE); + endScreen.setVisibility(View.VISIBLE); playbackEndTime.setVisibility(View.VISIBLE); break; case AUDIO_LIVE_STREAM: surfaceView.setVisibility(View.GONE); + endScreen.setVisibility(View.VISIBLE); playbackLiveSync.setVisibility(View.VISIBLE); break; case LIVE_STREAM: surfaceView.setVisibility(View.VISIBLE); + endScreen.setVisibility(View.GONE); playbackLiveSync.setVisibility(View.VISIBLE); break; @@ -357,6 +360,7 @@ public abstract class VideoPlayer extends BasePlayer qualityTextView.setVisibility(View.VISIBLE); surfaceView.setVisibility(View.VISIBLE); default: + endScreen.setVisibility(View.GONE); playbackEndTime.setVisibility(View.VISIBLE); break; } @@ -387,7 +391,6 @@ public abstract class VideoPlayer extends BasePlayer if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) playbackSeekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN); - animateView(endScreen, false, 0); loadingPanel.setBackgroundColor(Color.BLACK); animateView(loadingPanel, true, 0); animateView(surfaceForeground, true, 100); @@ -407,14 +410,12 @@ public abstract class VideoPlayer extends BasePlayer loadingPanel.setVisibility(View.GONE); animateView(currentDisplaySeek, AnimationUtils.Type.SCALE_AND_ALPHA, false, 200); - animateView(endScreen, false, 0); } @Override public void onBuffering() { if (DEBUG) Log.d(TAG, "onBuffering() called"); loadingPanel.setBackgroundColor(Color.TRANSPARENT); - animateView(loadingPanel, true, 500); } @Override From 8efcc8f80fbec871b959af4cdfd931371533dba2 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 5 Jun 2018 23:47:13 -0700 Subject: [PATCH 061/363] -Fixed main video player end screen thumbnail not fitting screen aspect ratio. --- app/src/main/res/layout/activity_main_player.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/activity_main_player.xml b/app/src/main/res/layout/activity_main_player.xml index f2cf85802..27aa56025 100644 --- a/app/src/main/res/layout/activity_main_player.xml +++ b/app/src/main/res/layout/activity_main_player.xml @@ -41,7 +41,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" - android:scaleType="centerInside" android:visibility="gone" tools:background="@android:color/white" tools:ignore="ContentDescription" From 06374c82fd920bdc340e3e3fd66ba23b55eea887 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 5 Jun 2018 23:48:44 -0700 Subject: [PATCH 062/363] -Fixed video players end screen not cleared on restarting playback after single stream play queue is completed. --- .../schabi/newpipe/player/VideoPlayer.java | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index 73f5e94b1..679fc6645 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -315,14 +315,13 @@ public abstract class VideoPlayer extends BasePlayer } captionPopupMenu.setOnDismissListener(this); } - /*////////////////////////////////////////////////////////////////////////// - // Playback Listener - //////////////////////////////////////////////////////////////////////////*/ - protected abstract VideoPlaybackResolver.QualityResolver getQualityResolver(); - protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { - super.onMetadataChanged(tag); + private void updateStreamRelatedViews() { + if (getCurrentMetadata() == null) return; + + final MediaSourceTag tag = getCurrentMetadata(); + final StreamInfo metadata = tag.getMetadata(); qualityTextView.setVisibility(View.GONE); playbackSpeedTextView.setVisibility(View.GONE); @@ -330,7 +329,7 @@ public abstract class VideoPlayer extends BasePlayer playbackEndTime.setVisibility(View.GONE); playbackLiveSync.setVisibility(View.GONE); - switch (tag.getMetadata().getStreamType()) { + switch (metadata.getStreamType()) { case AUDIO_STREAM: surfaceView.setVisibility(View.GONE); endScreen.setVisibility(View.VISIBLE); @@ -350,8 +349,8 @@ public abstract class VideoPlayer extends BasePlayer break; case VIDEO_STREAM: - final StreamInfo info = tag.getMetadata(); - if (info.getVideoStreams().size() + info.getVideoOnlyStreams().size() == 0) break; + if (metadata.getVideoStreams().size() + metadata.getVideoOnlyStreams().size() == 0) + break; availableStreams = tag.getSortedAvailableVideoStreams(); selectedStreamIndex = tag.getSelectedVideoStreamIndex(); @@ -368,6 +367,16 @@ public abstract class VideoPlayer extends BasePlayer buildPlaybackSpeedMenu(); playbackSpeedTextView.setVisibility(View.VISIBLE); } + /*////////////////////////////////////////////////////////////////////////// + // Playback Listener + //////////////////////////////////////////////////////////////////////////*/ + + protected abstract VideoPlaybackResolver.QualityResolver getQualityResolver(); + + protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { + super.onMetadataChanged(tag); + updateStreamRelatedViews(); + } @Override @Nullable @@ -400,6 +409,8 @@ public abstract class VideoPlayer extends BasePlayer public void onPlaying() { super.onPlaying(); + updateStreamRelatedViews(); + showAndAnimateControl(-1, true); playbackSeekBar.setEnabled(true); From 31218c2a8c8e29a7152bf56463ba2dc1d39a304a Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 5 Jun 2018 23:50:42 -0700 Subject: [PATCH 063/363] -Fixed popup player notification metadata not updated on stream change. -Fixed popup player window not clipped to above soft input keyboard upon expansion. --- .../org/schabi/newpipe/player/PopupVideoPlayer.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 3bee984a8..c53685afa 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -191,14 +191,19 @@ public final class PopupVideoPlayer extends Service { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); popupWidth = popupRememberSizeAndPos ? sharedPreferences.getFloat(POPUP_SAVED_WIDTH, defaultSize) : defaultSize; - final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_PHONE : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O ? + WindowManager.LayoutParams.TYPE_PHONE : + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + final int interactiveInputMethodLayout = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; windowLayoutParams = new WindowManager.LayoutParams( (int) popupWidth, (int) getMinimumVideoHeight(popupWidth), layoutParamType, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + interactiveInputMethodLayout, PixelFormat.TRANSLUCENT); windowLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; + windowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; int centerX = (int) (screenWidth / 2f - popupWidth / 2f); int centerY = (int) (screenHeight / 2f - popupHeight / 2f); @@ -608,6 +613,8 @@ public final class PopupVideoPlayer extends Service { protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { super.onMetadataChanged(tag); + resetNotification(); + updateNotification(-1); updateMetadata(); } From e7d23176b70abe07f11e2e433237d829daabf209 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 5 Jun 2018 23:52:34 -0700 Subject: [PATCH 064/363] -Fixed database backup failing due to journal file name change after Room DB version update. --- .../org/schabi/newpipe/settings/ContentSettingsFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 3894c421f..8f4e6d471 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -277,6 +277,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { newpipe_db_shm.delete(); } else { + Toast.makeText(getContext(), R.string.could_not_import_all_files, Toast.LENGTH_LONG) .show(); } From aa1878c15aafad7fb6340472a098175dc102f1cf Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 26 Jun 2018 10:16:54 -0700 Subject: [PATCH 065/363] -Changed baseplayer metadata getters to use media tag as source. -Changed background player notification to no longer update bitmap on progress time change. -Changed popup player to move above soft keyboard when it is opened. --- .../newpipe/player/BackgroundPlayer.java | 25 ++++++++---- .../org/schabi/newpipe/player/BasePlayer.java | 6 +-- .../newpipe/player/PopupVideoPlayer.java | 40 ++++++++++++------- 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 805326abd..dd70ea354 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -199,7 +199,6 @@ public final class BackgroundPlayer extends Service { remoteViews.setTextViewText(R.id.notificationSongName, basePlayerImpl.getVideoTitle()); remoteViews.setTextViewText(R.id.notificationArtist, basePlayerImpl.getUploaderName()); - remoteViews.setImageViewBitmap(R.id.notificationCover, basePlayerImpl.getThumbnail()); remoteViews.setOnClickPendingIntent(R.id.notificationPlayPause, PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT)); @@ -295,10 +294,22 @@ public final class BackgroundPlayer extends Service { // Thumbnail Loading //////////////////////////////////////////////////////////////////////////*/ + private void updateNotificationThumbnail() { + if (notRemoteView != null) { + notRemoteView.setImageViewBitmap(R.id.notificationCover, + basePlayerImpl.getThumbnail()); + } + if (bigNotRemoteView != null) { + bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, + basePlayerImpl.getThumbnail()); + } + } + @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); resetNotification(); + updateNotificationThumbnail(); updateNotification(-1); } @@ -306,13 +317,7 @@ public final class BackgroundPlayer extends Service { public void onLoadingFailed(String imageUri, View view, FailReason failReason) { super.onLoadingFailed(imageUri, view, failReason); resetNotification(); - updateNotification(-1); - } - - @Override - public void onLoadingCancelled(String imageUri, View view) { - super.onLoadingCancelled(imageUri, view); - resetNotification(); + updateNotificationThumbnail(); updateNotification(-1); } /*////////////////////////////////////////////////////////////////////////// @@ -395,6 +400,7 @@ public final class BackgroundPlayer extends Service { protected void onMetadataChanged(@NonNull final MediaSourceTag tag) { super.onMetadataChanged(tag); resetNotification(); + updateNotificationThumbnail(); updateNotification(-1); updateMetadata(); } @@ -525,6 +531,7 @@ public final class BackgroundPlayer extends Service { public void onPlaying() { super.onPlaying(); resetNotification(); + updateNotificationThumbnail(); updateNotification(R.drawable.ic_pause_white); lockManager.acquireWifiAndCpu(); } @@ -533,6 +540,7 @@ public final class BackgroundPlayer extends Service { public void onPaused() { super.onPaused(); resetNotification(); + updateNotificationThumbnail(); updateNotification(R.drawable.ic_play_arrow_white); lockManager.releaseWifiAndCpu(); } @@ -547,6 +555,7 @@ public final class BackgroundPlayer extends Service { if (notRemoteView != null) { notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 100, false); } + updateNotificationThumbnail(); updateNotification(R.drawable.ic_replay_white); lockManager.releaseWifiAndCpu(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 12e65cba1..7339dd50f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -1044,17 +1044,17 @@ public abstract class BasePlayer implements @NonNull public String getVideoUrl() { - return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getUrl(); + return currentMetadata == null ? context.getString(R.string.unknown_content) : currentMetadata.getMetadata().getUrl(); } @NonNull public String getVideoTitle() { - return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getTitle(); + return currentMetadata == null ? context.getString(R.string.unknown_content) : currentMetadata.getMetadata().getName(); } @NonNull public String getUploaderName() { - return currentItem == null ? context.getString(R.string.unknown_content) : currentItem.getUploader(); + return currentMetadata == null ? context.getString(R.string.unknown_content) : currentMetadata.getMetadata().getUploaderName(); } @Nullable diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index c53685afa..86998e0ea 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -98,6 +98,11 @@ public final class PopupVideoPlayer extends Service { private static final int MINIMUM_SHOW_EXTRA_WIDTH_DP = 300; + private static final int IDLE_WINDOW_FLAGS = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + private static final int ONGOING_PLAYBACK_WINDOW_FLAGS = IDLE_WINDOW_FLAGS | + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + private WindowManager windowManager; private WindowManager.LayoutParams windowLayoutParams; private GestureDetector gestureDetector; @@ -194,13 +199,11 @@ public final class PopupVideoPlayer extends Service { final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_PHONE : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; - final int interactiveInputMethodLayout = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | - WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; windowLayoutParams = new WindowManager.LayoutParams( (int) popupWidth, (int) getMinimumVideoHeight(popupWidth), layoutParamType, - interactiveInputMethodLayout, + IDLE_WINDOW_FLAGS, PixelFormat.TRANSLUCENT); windowLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; windowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; @@ -249,11 +252,15 @@ public final class PopupVideoPlayer extends Service { setRepeatModeRemote(notRemoteView, playerImpl.getRepeatMode()); - return new NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) .setOngoing(true) .setSmallIcon(R.drawable.ic_newpipe_triangle_white) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContent(notRemoteView); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { + builder.setPriority(NotificationCompat.PRIORITY_MAX); + } + return builder; } /** @@ -372,6 +379,12 @@ public final class PopupVideoPlayer extends Service { } } + private void updateWindowFlags(final int flags) { + if (windowLayoutParams == null || windowManager == null || playerImpl == null) return; + + windowLayoutParams.flags = flags; + windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + } /////////////////////////////////////////////////////////////////////////// protected class VideoPlayerImpl extends VideoPlayer implements View.OnLayoutChangeListener { @@ -684,16 +697,15 @@ public final class PopupVideoPlayer extends Service { @Override public void onPlaying() { super.onPlaying(); + + updateWindowFlags(ONGOING_PLAYBACK_WINDOW_FLAGS); + resetNotification(); updateNotification(R.drawable.ic_pause_white); videoPlayPause.setBackgroundResource(R.drawable.ic_pause_white); hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); - windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); - startForeground(NOTIFICATION_ID, notBuilder.build()); lockManager.acquireWifiAndCpu(); } @@ -708,15 +720,15 @@ public final class PopupVideoPlayer extends Service { @Override public void onPaused() { super.onPaused(); + + updateWindowFlags(IDLE_WINDOW_FLAGS); + resetNotification(); updateNotification(R.drawable.ic_play_arrow_white); videoPlayPause.setBackgroundResource(R.drawable.ic_play_arrow_white); lockManager.releaseWifiAndCpu(); - windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); - stopForeground(false); } @@ -732,15 +744,15 @@ public final class PopupVideoPlayer extends Service { @Override public void onCompleted() { super.onCompleted(); + + updateWindowFlags(IDLE_WINDOW_FLAGS); + resetNotification(); updateNotification(R.drawable.ic_replay_white); videoPlayPause.setBackgroundResource(R.drawable.ic_replay_white); lockManager.releaseWifiAndCpu(); - windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); - stopForeground(false); } From 7f7145e8deb7cd46e1e520a7796559258557e87a Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Tue, 26 Jun 2018 10:18:01 -0700 Subject: [PATCH 066/363] -Fixed playback parameter dialog settings not persisting through rotation. -Moved playback parameter dialog step size selector to below pitch slider. --- .../helper/PlaybackParameterDialog.java | 72 +++++++++++-------- .../res/layout/dialog_playback_parameter.xml | 60 +++++++++------- 2 files changed, 75 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index c184da0a5..d6453f579 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -33,15 +33,19 @@ public class PlaybackParameterDialog extends DialogFragment { public static final double STEP_TEN_PERCENT_VALUE = 0.10f; public static final double STEP_TWENTY_FIVE_PERCENT_VALUE = 0.25f; public static final double STEP_ONE_HUNDRED_PERCENT_VALUE = 1.00f; - public static final double DEFAULT_PLAYBACK_STEP_VALUE = STEP_TWENTY_FIVE_PERCENT_VALUE; public static final double DEFAULT_TEMPO = 1.00f; public static final double DEFAULT_PITCH = 1.00f; + public static final double DEFAULT_STEP = STEP_TWENTY_FIVE_PERCENT_VALUE; public static final boolean DEFAULT_SKIP_SILENCE = false; @NonNull private static final String INITIAL_TEMPO_KEY = "initial_tempo_key"; @NonNull private static final String INITIAL_PITCH_KEY = "initial_pitch_key"; + @NonNull private static final String TEMPO_KEY = "tempo_key"; + @NonNull private static final String PITCH_KEY = "pitch_key"; + @NonNull private static final String STEP_SIZE_KEY = "step_size_key"; + public interface Callback { void onPlaybackParameterChanged(final float playbackTempo, final float playbackPitch, final boolean playbackSkipSilence); @@ -57,6 +61,10 @@ public class PlaybackParameterDialog extends DialogFragment { private double initialPitch = DEFAULT_PITCH; private boolean initialSkipSilence = DEFAULT_SKIP_SILENCE; + private double tempo = DEFAULT_TEMPO; + private double pitch = DEFAULT_PITCH; + private double stepSize = DEFAULT_STEP; + @Nullable private SeekBar tempoSlider; @Nullable private TextView tempoMinimumText; @Nullable private TextView tempoMaximumText; @@ -86,6 +94,10 @@ public class PlaybackParameterDialog extends DialogFragment { PlaybackParameterDialog dialog = new PlaybackParameterDialog(); dialog.initialTempo = playbackTempo; dialog.initialPitch = playbackPitch; + + dialog.tempo = playbackTempo; + dialog.pitch = playbackPitch; + dialog.initialSkipSilence = playbackSkipSilence; return dialog; } @@ -110,6 +122,10 @@ public class PlaybackParameterDialog extends DialogFragment { if (savedInstanceState != null) { initialTempo = savedInstanceState.getDouble(INITIAL_TEMPO_KEY, DEFAULT_TEMPO); initialPitch = savedInstanceState.getDouble(INITIAL_PITCH_KEY, DEFAULT_PITCH); + + tempo = savedInstanceState.getDouble(TEMPO_KEY, DEFAULT_TEMPO); + pitch = savedInstanceState.getDouble(PITCH_KEY, DEFAULT_PITCH); + stepSize = savedInstanceState.getDouble(STEP_SIZE_KEY, DEFAULT_STEP); } } @@ -118,6 +134,10 @@ public class PlaybackParameterDialog extends DialogFragment { super.onSaveInstanceState(outState); outState.putDouble(INITIAL_TEMPO_KEY, initialTempo); outState.putDouble(INITIAL_PITCH_KEY, initialPitch); + + outState.putDouble(TEMPO_KEY, getCurrentTempo()); + outState.putDouble(PITCH_KEY, getCurrentPitch()); + outState.putDouble(STEP_SIZE_KEY, getCurrentStepSize()); } /*////////////////////////////////////////////////////////////////////////// @@ -154,8 +174,8 @@ public class PlaybackParameterDialog extends DialogFragment { setupTempoControl(rootView); setupPitchControl(rootView); - setupStepSize(DEFAULT_PLAYBACK_STEP_VALUE); + changeStepSize(stepSize); setupStepSizeSelector(rootView); } @@ -168,31 +188,15 @@ public class PlaybackParameterDialog extends DialogFragment { tempoStepDownText = rootView.findViewById(R.id.tempoStepDown); if (tempoCurrentText != null) - tempoCurrentText.setText(PlayerHelper.formatSpeed(initialTempo)); + tempoCurrentText.setText(PlayerHelper.formatSpeed(tempo)); if (tempoMaximumText != null) tempoMaximumText.setText(PlayerHelper.formatSpeed(MAXIMUM_PLAYBACK_VALUE)); if (tempoMinimumText != null) tempoMinimumText.setText(PlayerHelper.formatSpeed(MINIMUM_PLAYBACK_VALUE)); - if (tempoStepUpText != null) { - tempoStepUpText.setText(getStepUpPercentString(DEFAULT_PLAYBACK_STEP_VALUE)); - tempoStepUpText.setOnClickListener(view -> { - onTempoSliderUpdated(getCurrentTempo() + DEFAULT_PLAYBACK_STEP_VALUE); - setCurrentPlaybackParameters(); - }); - } - - if (tempoStepDownText != null) { - tempoStepDownText.setText(getStepDownPercentString(DEFAULT_PLAYBACK_STEP_VALUE)); - tempoStepDownText.setOnClickListener(view -> { - onTempoSliderUpdated(getCurrentTempo() - DEFAULT_PLAYBACK_STEP_VALUE); - setCurrentPlaybackParameters(); - }); - } - if (tempoSlider != null) { tempoSlider.setMax(strategy.progressOf(MAXIMUM_PLAYBACK_VALUE)); - tempoSlider.setProgress(strategy.progressOf(initialTempo)); + tempoSlider.setProgress(strategy.progressOf(tempo)); tempoSlider.setOnSeekBarChangeListener(getOnTempoChangedListener()); } } @@ -206,7 +210,7 @@ public class PlaybackParameterDialog extends DialogFragment { pitchStepUpText = rootView.findViewById(R.id.pitchStepUp); if (pitchCurrentText != null) - pitchCurrentText.setText(PlayerHelper.formatPitch(initialPitch)); + pitchCurrentText.setText(PlayerHelper.formatPitch(pitch)); if (pitchMaximumText != null) pitchMaximumText.setText(PlayerHelper.formatPitch(MAXIMUM_PLAYBACK_VALUE)); if (pitchMinimumText != null) @@ -214,7 +218,7 @@ public class PlaybackParameterDialog extends DialogFragment { if (pitchSlider != null) { pitchSlider.setMax(strategy.progressOf(MAXIMUM_PLAYBACK_VALUE)); - pitchSlider.setProgress(strategy.progressOf(initialPitch)); + pitchSlider.setProgress(strategy.progressOf(pitch)); pitchSlider.setOnSeekBarChangeListener(getOnPitchChangedListener()); } } @@ -222,7 +226,7 @@ public class PlaybackParameterDialog extends DialogFragment { private void setupHookingControl(@NonNull View rootView) { unhookingCheckbox = rootView.findViewById(R.id.unhookCheckbox); if (unhookingCheckbox != null) { - unhookingCheckbox.setChecked(initialPitch != initialTempo); + unhookingCheckbox.setChecked(pitch != tempo); unhookingCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> { if (isChecked) return; // When unchecked, slide back to the minimum of current tempo or pitch @@ -252,35 +256,37 @@ public class PlaybackParameterDialog extends DialogFragment { if (stepSizeOnePercentText != null) { stepSizeOnePercentText.setText(getPercentString(STEP_ONE_PERCENT_VALUE)); stepSizeOnePercentText.setOnClickListener(view -> - setupStepSize(STEP_ONE_PERCENT_VALUE)); + changeStepSize(STEP_ONE_PERCENT_VALUE)); } if (stepSizeFivePercentText != null) { stepSizeFivePercentText.setText(getPercentString(STEP_FIVE_PERCENT_VALUE)); stepSizeFivePercentText.setOnClickListener(view -> - setupStepSize(STEP_FIVE_PERCENT_VALUE)); + changeStepSize(STEP_FIVE_PERCENT_VALUE)); } if (stepSizeTenPercentText != null) { stepSizeTenPercentText.setText(getPercentString(STEP_TEN_PERCENT_VALUE)); stepSizeTenPercentText.setOnClickListener(view -> - setupStepSize(STEP_TEN_PERCENT_VALUE)); + changeStepSize(STEP_TEN_PERCENT_VALUE)); } if (stepSizeTwentyFivePercentText != null) { stepSizeTwentyFivePercentText.setText(getPercentString(STEP_TWENTY_FIVE_PERCENT_VALUE)); stepSizeTwentyFivePercentText.setOnClickListener(view -> - setupStepSize(STEP_TWENTY_FIVE_PERCENT_VALUE)); + changeStepSize(STEP_TWENTY_FIVE_PERCENT_VALUE)); } if (stepSizeOneHundredPercentText != null) { stepSizeOneHundredPercentText.setText(getPercentString(STEP_ONE_HUNDRED_PERCENT_VALUE)); stepSizeOneHundredPercentText.setOnClickListener(view -> - setupStepSize(STEP_ONE_HUNDRED_PERCENT_VALUE)); + changeStepSize(STEP_ONE_HUNDRED_PERCENT_VALUE)); } } - private void setupStepSize(final double stepSize) { + private void changeStepSize(final double stepSize) { + this.stepSize = stepSize; + if (tempoStepUpText != null) { tempoStepUpText.setText(getStepUpPercentString(stepSize)); tempoStepUpText.setOnClickListener(view -> { @@ -419,15 +425,19 @@ public class PlaybackParameterDialog extends DialogFragment { } private double getCurrentTempo() { - return tempoSlider == null ? initialTempo : strategy.valueOf( + return tempoSlider == null ? tempo : strategy.valueOf( tempoSlider.getProgress()); } private double getCurrentPitch() { - return pitchSlider == null ? initialPitch : strategy.valueOf( + return pitchSlider == null ? pitch : strategy.valueOf( pitchSlider.getProgress()); } + private double getCurrentStepSize() { + return stepSize; + } + private boolean getCurrentSkipSilence() { return skipSilenceCheckbox != null && skipSilenceCheckbox.isChecked(); } diff --git a/app/src/main/res/layout/dialog_playback_parameter.xml b/app/src/main/res/layout/dialog_playback_parameter.xml index 47937e882..a5933397e 100644 --- a/app/src/main/res/layout/dialog_playback_parameter.xml +++ b/app/src/main/res/layout/dialog_playback_parameter.xml @@ -260,43 +260,19 @@ - - - - + android:layout_below="@id/separatorStepSizeSelector"> + + + + + +
From ca679f5932b8ac6c118ec24108af9b013d927b60 Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Thu, 28 Jun 2018 12:18:02 -0700 Subject: [PATCH 067/363] -Fixed potential NPE when updating thumbnail in background player. --- .../main/java/org/schabi/newpipe/player/BackgroundPlayer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index dd70ea354..8594ca395 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -295,6 +295,7 @@ public final class BackgroundPlayer extends Service { //////////////////////////////////////////////////////////////////////////*/ private void updateNotificationThumbnail() { + if (basePlayerImpl == null) return; if (notRemoteView != null) { notRemoteView.setImageViewBitmap(R.id.notificationCover, basePlayerImpl.getThumbnail()); From 644766b5a67873d079e25986132f944e6705030f Mon Sep 17 00:00:00 2001 From: John Zhen Mo Date: Thu, 28 Jun 2018 12:21:03 -0700 Subject: [PATCH 068/363] -Updated exoplayer lib to 2.8.2. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6410cb823..c41535163 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ android { ext { supportLibVersion = '27.1.1' - exoPlayerLibVersion = '2.8.1' + exoPlayerLibVersion = '2.8.2' roomDbLibVersion = '1.1.1' leakCanaryLibVersion = '1.5.4' okHttpLibVersion = '3.10.0' From a208a22bc287a0a9d8c7a9015b3bcfce204b9922 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 29 Jun 2018 14:03:15 +0200 Subject: [PATCH 069/363] add link to the incredible bugreport converter --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 985223881..8073503ad 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,2 +1,3 @@ - [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them. - [ ] I checked if the issue/feature exists in the latest version. +- [ ] I did use the [incredible bugreport to markdown converter](https://teamnewpipe.github.io/CrashReportToMarkdown/) to paste bug reports. From e85e91183ef35483d22eaba5741bd312702843a9 Mon Sep 17 00:00:00 2001 From: Anton Shestakov Date: Sat, 30 Jun 2018 05:51:41 +0000 Subject: [PATCH 070/363] Translated using Weblate (Russian) Currently translated at 99.4% (371 of 373 strings) --- app/src/main/res/values-ru/strings.xml | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e5394b4ed..9549749cb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,7 @@ %1$s просмотров - Опубликован в %1$s + Опубликовано %1$s Потоковый плеер не найден. Установить VLC? Установить Отмена @@ -125,7 +125,7 @@ В фоне В окне - Только некоторые устройства могут воспроизводить 2K/4K видео + Только некоторые устройства могут воспроизводить видео в 2K/4K Формат видео по умолчанию Чёрная Запоминать размер и положение всплывающего окна @@ -311,10 +311,10 @@ Потоки аудио не найдены Пожертвовать - NewPipe разрабатывается волонтерами, которые проводят время, принося вам лучший опыт. Вернитесь, чтобы помочь разработчикам сделать NewPipe еще лучше, наслаждаясь чашечкой кофе. + NewPipe разрабатывается добровольцами в свободное время ради вашего удобства использования программы. Пора воздать должное, разработчики могут сделать NewPipe ещё лучше с чашечкой кофе! Воздать должное Веб-сайт - Посетите сайт NewPipe для большей информации и новостей. + Для получения более подробной информации и последних новостей о NewPipe посетите наш веб-сайт. Открыть лоток Закрыть лоток @@ -368,7 +368,7 @@ Предупреждение: нет возможности импорта всех файлов. Это перезапишет вашу текущую установку. - Скоро что-то тут появится ;D + Скоро тут что-то будет ;D Всегда спрашивать @@ -387,7 +387,7 @@ Плейлист создан Добавлено в плейлист Иконка плейлиста изменена - Нельзя удалить плейлист + Не удалось удалить плейлист Без титров @@ -407,7 +407,7 @@ Мониторинг утечки памяти может привести к зависанию приложения Ошибки отчёта вне очереди - Принудительная отчетность об исключении исключаемых Rx исключений за пределами фрагмента или жизненного цикла деятельности после удаления + Импорт/Экспорт Импорт @@ -420,8 +420,8 @@ Импорт файла Предыдущий экспорт - Нельзя импортировать подписки - Нельзя экспортировать подписки + Не удалось импортировать подписки + Не удалось экспортировать подписки Импорт подписок из YouTube загрузкой файла экспорта: \n @@ -447,7 +447,7 @@ Управление скоростью воспроизведения Темп Тон - Независимо (может вызвать искажение) + Независимо (возможны искажения) Nightcore По умолчанию Удалить все загруженные данные веб-страниц @@ -458,14 +458,14 @@ Титры Нет приложения, установленного для воспроизведения этого файла - Изменить размер заголовка и фоновые стили. Требуется перезапуск приложения для изменений. + Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу. Очистить историю просмотров Удалить всю историю просмотров. История просмотров была удалена. Очистить историю поиска Удалить историю поисковых запросов. - Удаляет историю воспроизведенных потоков. + Удаляет историю воспроизведённых потоков. Удалить всю историю поиска. Удалить историю поиска. 1 элемент удалён. @@ -483,6 +483,6 @@ Принять Отклонить - Безлимитный - Предельное разрешение при использовании мобильных данных + Без ограничения + Ограничить разрешение при использовании мобильных данных From 26d07ea2c67a6e517a9dfe39a4a8e815765eeef7 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Sun, 1 Jul 2018 09:39:16 +0000 Subject: [PATCH 071/363] Translated using Weblate (Dutch) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-nl/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3d0b552af..8616079ed 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -485,4 +485,10 @@ te openen in pop-upmodus
Weigeren Ongelimiteerd Resolutie beperken bij gebruik van mobiele gegevens - + Minimaliseren bij overschakelen naar andere app + Actie bij overschakelen van videospeler naar andere app — %s + Geen + Afspelen op achtergrond + Afspelen in pop-upvenster + + From bc4acbb7e1f864f409b878b869a98820828f7c5b Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Sun, 1 Jul 2018 10:39:10 +0000 Subject: [PATCH 072/363] Translated using Weblate (Catalan) Currently translated at 100,0% (378 of 378 strings) --- app/src/main/res/values-ca/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b8b7dd699..d230f40bb 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -452,4 +452,10 @@ Rebutja Sense restriccions Restringeix la resolució quan es facin servir dades mòbils - + Minimitza en canviar d\'aplicació + Acció en canviar a una altra aplicació des del reproductor de vídeo principal — %s + Cap + Minimitza al reproductor en segon pla + Minimitza al reproductor emergent + + From 73f81c5b52b58feacc02f9ee6fbf97b78066eb2f Mon Sep 17 00:00:00 2001 From: monolifed Date: Sun, 1 Jul 2018 12:45:49 +0000 Subject: [PATCH 073/363] Translated using Weblate (Turkish) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-tr/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 924b2c6bf..c240dbec5 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -481,4 +481,10 @@ Kabul etme Sınırsız Mobil veri kullanırken çözünürlüğü sınırla - + Uygulama geçişinde küçült + Ana video oynatıcıdan başka bir uygulamaya geçişteki eylem — %s + Yok + Arka plan oynatıcıya küçült + Açılır oynatıcıya küçült + + From 0a023a61f90b15624a40be8b09194afb137fda88 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sun, 1 Jul 2018 13:19:20 +0000 Subject: [PATCH 074/363] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1d0ce7ac0..bea3c11e7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -468,4 +468,10 @@ 下降 沒有限制 當您使用行動網路時限制解析度 - + 在應用程式切換時最小化 + 當從主影片播放器切換到其他應用程式時要進行的動作 — %s + + 最小化為背景播放器 + 最小化為彈出式播放器 + + From 3cdc1fcaeedabddc7a844e46d80e6edae5dcb990 Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Sun, 1 Jul 2018 20:41:42 +0000 Subject: [PATCH 075/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b958caaa5..76fb93d13 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -467,4 +467,10 @@ abrir em modo popup
Recusar Ilimitado Limitar resolução quando dados móveis estiverem em uso - + Minimizar ao trocar de aplicativo + Ação ao trocar de aplicativo quando estiver no reprodutor de vídeo principal — %s + "Nenhuma " + Minimizar para reprodutor em plano de fundo + Minimizar para reprodutor popup + + From ee417e41eac0313b4906e8f6f27e7b351112068c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20Tapia=20Ram=C3=ADrez?= Date: Sun, 1 Jul 2018 22:03:46 +0000 Subject: [PATCH 076/363] Translated using Weblate (Spanish) Currently translated at 100,0% (378 of 378 strings) --- app/src/main/res/values-es/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bfd0f3e6e..e7ca95673 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -488,4 +488,10 @@ abrir en modo popup
Sin límite Limitar resolución cuando se use Datos Móviles - + Mimimizar al cambiar de aplicación + Acción de cambiar a otra aplicación desde el reproductor principal + Ninguna + Minimizar al reproductor de fondo + Minimizar el reproductor popup + + From 4a484c535bd566769bf4fccd7419efa6933ee07a Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Mon, 2 Jul 2018 07:25:55 +0000 Subject: [PATCH 077/363] Translated using Weblate (Flemish) Currently translated at 100,0% (378 of 378 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index b4c378fc4..ed431ae0a 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -448,4 +448,10 @@ Weigeren Onbeperkt Resolutie beperken bij gebruik van mobiele gegevens - + Minimaliseren bij overschakelen naar anderen app + Actie bij overschakelen van videospeler naar anderen app — %s + Geen + Afspelen in achtergrond + Afspelen in pop-upspeler + + From cb8545e33d7433d0f175ea4eebb1548cbd1c0209 Mon Sep 17 00:00:00 2001 From: Marian Hanzel Date: Sun, 1 Jul 2018 07:12:03 +0000 Subject: [PATCH 078/363] Translated using Weblate (Slovak) Currently translated at 96.0% (363 of 378 strings) --- app/src/main/res/values-sk/strings.xml | 38 +++++++++++++++++--------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6358190ef..6204e5fba 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -361,7 +361,7 @@ Vždy sa opýtať Získavajú sa informácie… - Požadovaný obsah sa načítava + Načítanie požadované obsahu Vytvoriť nový zoznam skladieb Vymazať zoznam skladieb @@ -374,7 +374,7 @@ Odstrániť Záložku Chcete odstrániť tento zoznam skladieb? - Zoznam skladieb bol vytvorený + Zoznam skladieb vytvorený Pridané do zoznamu skladieb Miniatúra zoznamu skladieb bola zmenená Nemožno odstrániť zoznam skladieb @@ -414,18 +414,18 @@ Čoskoro sa tu niečo objaví ;D - Preferovaná akcia pri otvorení + Preferovaná akcia \'otvoriť\' Predvolená akcia pri otváraní obsahu — %s Automaticky vygenerované Nastavenie titulkov - Upravte mierku textu titulkov a štýly pozadia. Vyžaduje reštartovanie prehrávača. + Upravte mierku textu titulkov a štýly pozadia. Vyžaduje reštart prehrávača. Povoliť službu LeakCanary Monitorovanie pretečenia pamäte môže spôsobiť, že aplikácia nebude reagovať - Nahlásiť mimocyklické chyby + Nahlásiť mimo-cyklické chyby Vynútenie hlásenia nedodržateľných výnimiek Rx, ktoré sa vyskytnú mimo časového cyklu fragmentu alebo aktivity po zlikvidovaní Import/Export @@ -451,14 +451,14 @@ \n2. Po výzve sa prihláste do svojho účtu \n3. Sťahovanie by malo začať (to je exportovaný zoznam) \n - "Pre importovanie vašich SoundCloud dát, musíte poznať adresu URL alebo ID vašeho profilu. Ak poznáte jedno alebo druhé, zadajte ho do nižšie uvedeného vstupu a ste pripravení ísť. -\n -\nAk nepoznáte ani URL ani ID vašeho profilu, môžete postupovať nasledovne: -\n -\n1. V niektorom prehliadači povoľte režim \"desktop\" (web nie je dostupný pre mobilné zariadenia) -\n2. Prejdite na túto adresu URL: %1$s -\n3. Po výzve sa prihláste do svojho účtu -\n4. Skopírujte adresu URL, na ktorú ste boli presmerovaní (to je adresa vášho profilu) + "Importovať SoundCloud profil zadaním URL adresy alebo vášho ID: +\n +\nAk nepoznáte ani URL ani ID vašeho profilu, môžete postupovať nasledovne: +\n +\n1. V niektorom prehliadači povoľte režim \"desktop\" (web nie je dostupný pre mobilné zariadenia) +\n2. Prejdite na túto adresu URL: %1$s +\n3. Po výzve sa prihláste do svojho účtu +\n4. Skopírujte adresu URL, na ktorú ste boli presmerovaní (to je adresa vášho profilu). \n" ID,soundcloud.com/ID @@ -483,4 +483,16 @@ 1 položka bola vymazaná. "NewPipe je slobodný softvér pod licenciou copyleft. Môžete ho používať, študovať a vylepšovať ako len chcete. Konkrétne ho môžete šíriť a/alebo upravovať pod podmienkami Všeobecnej verejnej licencie GNU, ako ju publikuje Free Software Foundation, buď verzia 3 licencie, alebo (podľa vašej voľby) ktorákoľvek neskoršia verzia." + Ochrana osobných údajov v NewPipe + NewPipe projekt berie vaše súkromie vážne. Preto aplikácia nezhromažďuje žiadne údaje bez vášho súhlasu. +\nNewPipe v ochrane súkromia podrobne vysvetľuje, aké údaje budú odoslané a uložené pri hlásení o páde. + Prečítajte si pravidlá ochrany osobných údajov + Chcete zároveň importovať aj nastavenia? + + V súlade s Európskym Všeobecným Nariadením o Ochrane Údajov (GDPR), chceme upriamiť vašu pozornosť na ochranu osobných údajov v NewPipe. Starostlivo si ich prečítajte. Musíte ich prijať pred nahlásením chyby. + Prijať + Odmietnuť + + Bez limitu + Limitovať rozlíšenie pri použití mobilných dát From 1e79c146a7547b6f01296fb4e25b43e002ea8108 Mon Sep 17 00:00:00 2001 From: monolifed Date: Sun, 1 Jul 2018 12:49:08 +0000 Subject: [PATCH 079/363] Translated using Weblate (Turkish) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-tr/strings.xml | 34 +++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c240dbec5..0b62bd755 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -119,16 +119,16 @@ İndirme menüsü ayarlanamadı - Açılır pencere kipinde aç - NewPipe açılır pencere kipi + Açılır oynatıcı kipinde aç + NewPipe açılır oynatıcı kipi - Öntanımlı açılır pencere çözünürlüğü + Öntanımlı açılır oynatıcı çözünürlüğü Daha yüksek çözünürlükleri göster Yalnızca bazı aygıtlar 2K/4K video oynatmayı destekler Öntanımlı video biçimi Siyah - Açılır pencere kipinde oynatılıyor + Açılır oynatıcı kipinde oynatılıyor Tümü Kanal Evet @@ -148,7 +148,7 @@ M B - Bu izin açılır pencere kipinde + Bu izin açılır oynatıcı kipinde \naçmak için gerekli reCAPTCHA @@ -156,16 +156,16 @@ reCAPTCHA Formu istendi Arka Plan - Açılır Pencere + Açılır Oynatıcı Süz Yenile Temizle - Açılır pencere boyutunu ve konumunu hatırla - Açılır pencerenin ayarlandığı son boyutu ve konumu hatırla + Açılır oynatıcı boyutunu ve konumunu hatırla + Açılır oynatıcının ayarlandığı son boyutu ve konumu hatırla - Açılır Pencere + Açılır Oynatıcı Boyutlandırılıyor Bu seçenek etkinken bazı çözünürlüklerin sesi olmayacaktır @@ -224,7 +224,7 @@ Geri Al NewPipe Bildirimi - NewPipe Arka Plan ve Açılır Pencere Oynatıcıları için Bildirimler + NewPipe Arka Plan ve Açılır Oynatıcılar için Bildirimler Sonuç yok Burada Cırcır Böceklerinden Başka Şey Yok @@ -257,9 +257,9 @@ Öge silindi Bu içeriği arama geçmişinden silmek istiyor musunuz? \"Kuyruğa almak İçin bas\" ipucunu göster - Video ayrıntıları sayfasında arka plan veya açılır pencere düğmesine basıldığında ipucu göster + Video ayrıntıları sayfasında arka plan veya açılır oynatıcı düğmesine basıldığında ipucu göster Arka plan oynatıcıda kuyruğa eklendi - Açılır pencere oynatıcıda kuyruğa eklendi + Açılır oynatıcıda kuyruğa eklendi Tümünü Oynat [Bilinmeyen] @@ -283,16 +283,16 @@ En İyi 50 Yeni ve sıcak Arka Plan Oynatıcı - Açılır Pencere Oynatıcı + Açılır Oynatıcı Kaldır Ayrıntılar Ses Ayarları Kuyruğa Almak İçin Bas Arka Planda Kuyruğa Al - Açılır Pencerede Kuyruğa Al + Açılır Oynatıcıda Kuyruğa Al Burada Oynatmaya Başla Burada Arka Planda Başlat - Burada Açılır Pencerede Başlat + Burada Açılır Oynatıcıda Başlat Bağış yapın 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. Geri ver @@ -302,7 +302,7 @@ Hizmet Yönelimi Değiştir Arka Plana Geç - Açılır Pencereye Geç + Açılır Oynatıcıya Geç Ana Görünüme Geç Çekmeceyi Aç @@ -318,7 +318,7 @@ Video oynatıcı Arka plan oynatıcı - Açılır pencere oynatıcı + Açılır oynatıcı Her zaman sor Bilgi alınıyor… From aa9018b97bf587263acc6f5b5cff6fc4f188ebc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20Tapia=20Ram=C3=ADrez?= Date: Sun, 1 Jul 2018 22:18:24 +0000 Subject: [PATCH 080/363] Translated using Weblate (Spanish) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e7ca95673..bd39ba9f3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -492,6 +492,6 @@ abrir en modo popup Acción de cambiar a otra aplicación desde el reproductor principal Ninguna Minimizar al reproductor de fondo - Minimizar el reproductor popup + Minimizar el reproductor emergente From 55c84192beb3e4c8749f047d50d0ea0d90a7e05f Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Mon, 2 Jul 2018 07:27:27 +0000 Subject: [PATCH 081/363] Translated using Weblate (Flemish) Currently translated at 100.0% (378 of 378 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index ed431ae0a..65781b6a3 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -452,6 +452,6 @@ Actie bij overschakelen van videospeler naar anderen app — %s Geen Afspelen in achtergrond - Afspelen in pop-upspeler + Afspelen in pop-up From a3cd531cc8d4b66d827cb4887d57b7fe7b6dfebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Mon, 2 Jul 2018 21:46:43 +0000 Subject: [PATCH 082/363] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.0% (363 of 378 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index af771c971..34fa54b1a 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -477,4 +477,10 @@ Avslå Ubegrenset Begrens oppløsning når mobildata brukes - + Minimer ved programbytte + Handling ved bytting til annet program fra hovedspiller — %s + Ingen + Minimer til bakgrunnsspiller + Minimer til oppsprettsspiller + + From 1fb30bc3d9c825aef403ed991838a3ffe016bcdc Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 7 Jul 2018 05:38:50 +0000 Subject: [PATCH 083/363] Translated using Weblate (German) Currently translated at 100,0% (378 of 378 strings) --- app/src/main/res/values-de/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fb15ff659..5698d6eb8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -483,4 +483,10 @@ \nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen - + Minimieren beim Anwendungswechsel + Aktion beim Umschalten auf eine andere Anwendung vom Haupt-Videoplayer - %s + Keine + Zum Hintergrund-Player minimieren + Zum Popup-Player minimieren + + From 4eaff51ba24473191f484724ca85bbff97990f30 Mon Sep 17 00:00:00 2001 From: D D Date: Fri, 6 Jul 2018 11:17:51 +0000 Subject: [PATCH 084/363] Translated using Weblate (Bulgarian) Currently translated at 61,9% (234 of 378 strings) --- app/src/main/res/values-bg/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index de171538a..03c210679 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -236,7 +236,7 @@ Файл Смени ориентацията - Мини към фонов режим + Мини във фонов режим Мини към изкачащ прозорец Мини в основен режим From 639ad7698de2ad164954a6a6de637b6c5e05ed85 Mon Sep 17 00:00:00 2001 From: cxj Date: Sat, 7 Jul 2018 03:03:48 +0000 Subject: [PATCH 085/363] Translated using Weblate (Chinese (Mandarin)) Currently translated at 15,6% (59 of 378 strings) --- app/src/main/res/values-cmn/strings.xml | 41 +++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index 5013b74eb..ee13afdb7 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -23,4 +23,45 @@ NewPipe弹出模式 订阅 订阅 + 取消订阅成功 + 无法更改订阅 + 无法更新订阅 + 显示详情 + + 主页 + 订阅 + 书签 + + 新功能 + + 后台 + 弹出窗口 + 添加到 + + 视频下载路径 + 储存视频文件的路径 + 输入视频的下载地址 + + 音频下载路径 + 储存音频的路径 + 输入音频的下载路径 + + 自动播放 + NewPipes被其它程序调用时播放视频 + 默认分辨率 + 默认弹出窗口分辨率 + 显示更高的分辨率 + 只有部分设备支持播放 2K/4K 视频 + 用 Kodi 播放 + 没找到 Kore 应用,需要安装它吗? + 显示“用 Kodi 播放”选项 + 显示用 Kodi媒体中心 播放视频的选项 + 音频 + 默认音频格式 + 默认视频格式 + 主题 + 亮色 + 酷黑 + 黑色 + 记住弹出窗口的尺寸与位置 From 3364bf268b56f09141f983b1e26d4531f84974a2 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 7 Jul 2018 05:51:23 +0000 Subject: [PATCH 086/363] Translated using Weblate (German) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-de/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5698d6eb8..1ffdb4992 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -418,7 +418,7 @@ Wiedergabegeschwindigkeitsregler Geschwindigkeit Tonhöhe - Aushaken (kann zu Verzerrungen führen) + Verknüpfung aufheben (kann zu Verzerrungen führen) Nightcore Standard 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. @@ -489,4 +489,8 @@ Zum Hintergrund-Player minimieren Zum Popup-Player minimieren - +Vorspulen während der Stille + Schritt + Zurücksetzen + + From 23143797f952286fee02ff73f3cfe0943c2c7963 Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Sat, 7 Jul 2018 08:22:44 +0000 Subject: [PATCH 087/363] Translated using Weblate (Catalan) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-ca/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index d230f40bb..e1bf62601 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -458,4 +458,8 @@ Minimitza al reproductor en segon pla Minimitza al reproductor emergent - +Avança ràpid durant el silenci + Pas + Reinicialitza + + From 1acdefd358ea17c91e2393601e1a843cc89b7d04 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Sat, 7 Jul 2018 09:06:25 +0000 Subject: [PATCH 088/363] Translated using Weblate (Dutch) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-nl/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 8616079ed..7be3e0160 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -449,7 +449,7 @@ te openen in pop-upmodus
Afspeelsnelheidbesturing Tempo Toon - Ontkoppelen (kan ruis veroorzaken) + Ontlinken (kan ruis veroorzaken) Nightcore Standaard Voorkeursactie voor openen @@ -491,4 +491,8 @@ te openen in pop-upmodus Afspelen op achtergrond Afspelen in pop-upvenster - +Vooruitspoelen tijdens stilte + Stap + Standaardwaarden + + From 3e05508cf91a596a711349a0872da41082b687f6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 7 Jul 2018 13:09:46 +0000 Subject: [PATCH 089/363] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bea3c11e7..0dfb82955 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -432,7 +432,7 @@ 播放速度控制 節拍 間距 - 解除 (可能導致失真) + 解除連結(可能導致失真) Nightcore 預設 偏好的「開啟」動作 @@ -474,4 +474,8 @@ 最小化為背景播放器 最小化為彈出式播放器 - +在靜音時快轉 + 步進 + 重設 + + From d1dbcda88e3f2f1c9e26eba5ddcc3b2d469e2cd2 Mon Sep 17 00:00:00 2001 From: Ali Demirtas Date: Sat, 7 Jul 2018 17:02:41 +0000 Subject: [PATCH 090/363] Translated using Weblate (Turkish) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-tr/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0b62bd755..4441ee6b1 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -446,7 +446,7 @@ Hız Öntanımlı Ses titreşimi - Çengeli Çıkar (bozukluğa neden olabilir) + Bağlantıyı kes (bozulmalara neden olabilir) Nightcore İndirmeye uygun akış yok @@ -487,4 +487,8 @@ Arka plan oynatıcıya küçült Açılır oynatıcıya küçült - +Sessizlik sırasında hızlı ileri + Adım + Sıfırla + + From 7c2aa6e69da5a3c0c3f367d5e17e7fe68fcd5323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Freddy=20Mor=C3=A1n=20Jr?= Date: Sat, 7 Jul 2018 16:28:20 +0000 Subject: [PATCH 091/363] Translated using Weblate (Spanish) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-es/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bd39ba9f3..696398f37 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -453,7 +453,7 @@ abrir en modo popup Controles de velocidad de reproducción Tiempo Tono - Desenganchar (puede casusar distorsión) + Desenganchar (puede causar distorsión) Nightcore (tipo de música) Reproducción por defecto No hay streams disponibles para descargar @@ -494,4 +494,5 @@ abrir en modo popup Minimizar al reproductor de fondo Minimizar el reproductor emergente - +Avance rápido durante el silencio + From 22774592db663163ebb621ad59c4c0b345b56501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20Tapia=20Ram=C3=ADrez?= Date: Sat, 7 Jul 2018 19:06:26 +0000 Subject: [PATCH 092/363] Translated using Weblate (Spanish) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-es/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 696398f37..8e91794e8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -495,4 +495,7 @@ abrir en modo popup Minimizar el reproductor emergente Avance rápido durante el silencio + Paso + Reiniciar + From 17e7214d25a0c59663d932e32240b0a3c41e6002 Mon Sep 17 00:00:00 2001 From: AB Date: Sun, 8 Jul 2018 07:20:24 +0000 Subject: [PATCH 093/363] Translated using Weblate (Ukrainian) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-uk/strings.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 755b447c9..08ece56de 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -473,4 +473,14 @@ Відхилити Безмежно Обмежити роздільну здатність під час користування мобільним інтернетом - + Перемотувати підчас тиші + Крок + Скинути + + Зменшити при перемкненні застосунку + Дія при перемкненні до інших застосунків з головного відео-програвачу — %s + Жодних + Зменшити до фонового програвачу + Зменшити до віконного програвачу + + From d10f9a5f25e7acac7f089f2492c8e9b7d036579b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 8 Jul 2018 14:27:12 +0200 Subject: [PATCH 094/363] add getMoreInfo to SearchInfo --- app/build.gradle | 2 +- .../fragments/list/search/SearchFragment.java | 295 ++++++++++-------- .../schabi/newpipe/util/ExtractorHelper.java | 30 +- 3 files changed, 175 insertions(+), 152 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c41535163..503a3e469 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:bf1c771' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:39332a283b1c911' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index d07ff6448..e57cdbd31 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -38,10 +38,13 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchEngine; +import org.schabi.newpipe.extractor.search.SearchInfo; import org.schabi.newpipe.extractor.search.SearchResult; +import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.list.BaseListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.AnimationUtils; @@ -56,7 +59,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Queue; -import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import icepick.State; @@ -65,14 +68,13 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.PublishSubject; import static org.schabi.newpipe.util.AnimationUtils.animateView; public class SearchFragment - extends BaseListFragment + extends BaseListFragment implements BackPressable { /*////////////////////////////////////////////////////////////////////////// @@ -92,19 +94,21 @@ public class SearchFragment @State protected int filterItemCheckedId = -1; - private SearchEngine.Filter filter = SearchEngine.Filter.ANY; @State protected int serviceId = Constants.NO_SERVICE_ID; @State - protected String searchQuery; + protected SearchQIHandler searchQuery; @State - protected String lastSearchedQuery; + protected SearchQIHandler lastSearchedQuery; @State protected boolean wasSearchFocused = false; + @State + List contentFilter; - private int currentPage = 0; - private int currentNextPage = 0; + private StreamingService service; + private String currentPageUrl; + private String nextPageUrl; private String contentCountry; private boolean isSuggestionsEnabled = true; private boolean isSearchHistoryEnabled = true; @@ -130,11 +134,11 @@ public class SearchFragment /*////////////////////////////////////////////////////////////////////////*/ - public static SearchFragment getInstance(int serviceId, String query) { + public static SearchFragment getInstance(int serviceId, SearchQIHandler query) { SearchFragment searchFragment = new SearchFragment(); searchFragment.setQuery(serviceId, query); - if (!TextUtils.isEmpty(query)) { + if (!TextUtils.isEmpty(query.getSearchString())) { searchFragment.setSearchOnResume(); } @@ -202,10 +206,19 @@ public class SearchFragment if (DEBUG) Log.d(TAG, "onResume() called"); super.onResume(); - if (!TextUtils.isEmpty(searchQuery)) { + try { + service = NewPipe.getService(serviceId); + } catch (Exception e) { + ErrorActivity.reportError(getActivity(), e, getActivity().getClass(), + getActivity().findViewById(android.R.id.content), + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "", + "", R.string.general_error)); + } + + if (!TextUtils.isEmpty(searchQuery.getSearchString())) { if (wasLoading.getAndSet(false)) { - if (currentNextPage > currentPage) loadMoreItems(); - else search(searchQuery); + search(searchQuery); } else if (infoListAdapter.getItemsList().size() == 0) { if (savedState == null) { search(searchQuery); @@ -218,7 +231,7 @@ public class SearchFragment if (suggestionDisposable == null || suggestionDisposable.isDisposed()) initSuggestionObserver(); - if (TextUtils.isEmpty(searchQuery) || wasSearchFocused) { + if (TextUtils.isEmpty(searchQuery.getSearchString()) || wasSearchFocused) { showKeyboardSearch(); showSuggestionsPanel(); } else { @@ -247,7 +260,8 @@ public class SearchFragment public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case ReCaptchaActivity.RECAPTCHA_REQUEST: - if (resultCode == Activity.RESULT_OK && !TextUtils.isEmpty(searchQuery)) { + if (resultCode == Activity.RESULT_OK + && !TextUtils.isEmpty(searchQuery.getSearchString())) { search(searchQuery); } else Log.e(TAG, "ReCaptcha failed"); break; @@ -282,20 +296,31 @@ public class SearchFragment @Override public void writeTo(Queue objectsToSave) { super.writeTo(objectsToSave); - objectsToSave.add(currentPage); - objectsToSave.add(currentNextPage); + objectsToSave.add(currentPageUrl); + objectsToSave.add(nextPageUrl); } @Override public void readFrom(@NonNull Queue savedObjects) throws Exception { super.readFrom(savedObjects); - currentPage = (int) savedObjects.poll(); - currentNextPage = (int) savedObjects.poll(); + currentPageUrl = (String) savedObjects.poll(); + nextPageUrl = (String) savedObjects.poll(); } @Override public void onSaveInstanceState(Bundle bundle) { - searchQuery = searchEditText != null ? searchEditText.getText().toString() : searchQuery; + try { + searchQuery = searchEditText != null + ? NewPipe.getService(serviceId).getSearchQIHFactory().fromQuery( + searchEditText.getText().toString()) + : searchQuery; + } catch (Exception e) { + ErrorActivity.reportError(getActivity(), e, getActivity().getClass(), + getActivity().findViewById(android.R.id.content), + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "", + "", R.string.general_error)); + } super.onSaveInstanceState(bundle); } @@ -305,8 +330,12 @@ public class SearchFragment @Override public void reloadContent() { - if (!TextUtils.isEmpty(searchQuery) || (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) { - search(!TextUtils.isEmpty(searchQuery) ? searchQuery : searchEditText.getText().toString()); + if (!TextUtils.isEmpty(searchQuery.getSearchString()) + || (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) { + search(!TextUtils.isEmpty(searchQuery.getSearchString()) + ? searchQuery + : getSearchQuery(searchEditText.getText().toString(), + new ArrayList<>(0), "")); } else { if (searchEditText != null) { searchEditText.setText(""); @@ -330,22 +359,20 @@ public class SearchFragment supportActionBar.setDisplayHomeAsUpEnabled(true); } - inflater.inflate(R.menu.menu_search, menu); + for(String filter : service.getSearchQIHFactory().getAvailableContentFilter()) { + menu.add(filter); + } restoreFilterChecked(menu, filterItemCheckedId); } @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_filter_all: - case R.id.menu_filter_video: - case R.id.menu_filter_channel: - case R.id.menu_filter_playlist: - changeFilter(item, getFilterFromMenuId(item.getItemId())); - return true; - default: - return super.onOptionsItemSelected(item); - } + + List contentFilter = new ArrayList<>(1); + contentFilter.add(item.getTitle().toString()); + changeContentFilter(item, contentFilter); + + return true; } private void restoreFilterChecked(Menu menu, int itemId) { @@ -354,21 +381,8 @@ public class SearchFragment if (item == null) return; item.setChecked(true); - filter = getFilterFromMenuId(itemId); - } - } - - private SearchEngine.Filter getFilterFromMenuId(int itemId) { - switch (itemId) { - case R.id.menu_filter_video: - return SearchEngine.Filter.STREAM; - case R.id.menu_filter_channel: - return SearchEngine.Filter.CHANNEL; - case R.id.menu_filter_playlist: - return SearchEngine.Filter.PLAYLIST; - case R.id.menu_filter_all: - default: - return SearchEngine.Filter.ANY; + contentFilter.clear(); + contentFilter.add(menu.getItem(itemId).getTitle().toString()); } } @@ -380,9 +394,9 @@ public class SearchFragment private void showSearchOnStart() { if (DEBUG) Log.d(TAG, "showSearchOnStart() called, searchQuery → " + searchQuery+", lastSearchedQuery → " + lastSearchedQuery); - searchEditText.setText(searchQuery); + searchEditText.setText(searchQuery.getSearchString()); - if (TextUtils.isEmpty(searchQuery) || TextUtils.isEmpty(searchEditText.getText())) { + if (TextUtils.isEmpty(searchQuery.getSearchString()) || TextUtils.isEmpty(searchEditText.getText())) { searchToolbarContainer.setTranslationX(100); searchToolbarContainer.setAlpha(0f); searchToolbarContainer.setVisibility(View.VISIBLE); @@ -396,47 +410,38 @@ public class SearchFragment private void initSearchListeners() { if (DEBUG) Log.d(TAG, "initSearchListeners() called"); - searchClear.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (DEBUG) Log.d(TAG, "onClick() called with: v = [" + v + "]"); - if (TextUtils.isEmpty(searchEditText.getText())) { - NavigationHelper.gotoMainFragment(getFragmentManager()); - return; - } - - searchEditText.setText(""); - suggestionListAdapter.setItems(new ArrayList()); - showKeyboardSearch(); + searchClear.setOnClickListener(v -> { + if (DEBUG) Log.d(TAG, "onClick() called with: v = [" + v + "]"); + if (TextUtils.isEmpty(searchEditText.getText())) { + NavigationHelper.gotoMainFragment(getFragmentManager()); + return; } + + searchEditText.setText(""); + suggestionListAdapter.setItems(new ArrayList<>()); + showKeyboardSearch(); }); TooltipCompat.setTooltipText(searchClear, getString(R.string.clear)); - searchEditText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (DEBUG) Log.d(TAG, "onClick() called with: v = [" + v + "]"); - if (isSuggestionsEnabled && errorPanelRoot.getVisibility() != View.VISIBLE) { - showSuggestionsPanel(); - } + searchEditText.setOnClickListener(v -> { + if (DEBUG) Log.d(TAG, "onClick() called with: v = [" + v + "]"); + if (isSuggestionsEnabled && errorPanelRoot.getVisibility() != View.VISIBLE) { + showSuggestionsPanel(); } }); - searchEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (DEBUG) Log.d(TAG, "onFocusChange() called with: v = [" + v + "], hasFocus = [" + hasFocus + "]"); - if (isSuggestionsEnabled && hasFocus && errorPanelRoot.getVisibility() != View.VISIBLE) { - showSuggestionsPanel(); - } + searchEditText.setOnFocusChangeListener((View v, boolean hasFocus) -> { + if (DEBUG) Log.d(TAG, "onFocusChange() called with: v = [" + v + "], hasFocus = [" + hasFocus + "]"); + if (isSuggestionsEnabled && hasFocus && errorPanelRoot.getVisibility() != View.VISIBLE) { + showSuggestionsPanel(); } }); suggestionListAdapter.setListener(new SuggestionListAdapter.OnSuggestionItemSelected() { @Override public void onSuggestionItemSelected(SuggestionItem item) { - search(item.query); + search(getSearchQuery(item.query, new ArrayList<>(), "")); searchEditText.setText(item.query); } @@ -469,21 +474,22 @@ public class SearchFragment } }; searchEditText.addTextChangedListener(textWatcher); - searchEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (DEBUG) { - Log.d(TAG, "onEditorAction() called with: v = [" + v + "], actionId = [" + actionId + "], event = [" + event + "]"); - } - if (event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) { - search(searchEditText.getText().toString()); - return true; - } - return false; - } - }); + searchEditText.setOnEditorActionListener( + (TextView v, int actionId, KeyEvent event) -> { + if (DEBUG) { + Log.d(TAG, "onEditorAction() called with: v = [" + v + "], actionId = [" + actionId + "], event = [" + event + "]"); + } + if (event != null + && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER + || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) { + search(getSearchQuery(searchEditText.getText().toString(), new ArrayList<>(), "")); + return true; + } + return false; + }); - if (suggestionDisposable == null || suggestionDisposable.isDisposed()) initSuggestionObserver(); + if (suggestionDisposable == null || suggestionDisposable.isDisposed()) + initSuggestionObserver(); } private void unsetSearchListeners() { @@ -513,7 +519,8 @@ public class SearchFragment if (searchEditText == null) return; if (searchEditText.requestFocus()) { - InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) activity.getSystemService( + Context.INPUT_METHOD_SERVICE); imm.showSoftInput(searchEditText, InputMethodManager.SHOW_IMPLICIT); } } @@ -522,8 +529,10 @@ public class SearchFragment if (DEBUG) Log.d(TAG, "hideKeyboardSearch() called"); if (searchEditText == null) return; - InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + InputMethodManager imm = (InputMethodManager) activity.getSystemService( + Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), + InputMethodManager.HIDE_NOT_ALWAYS); searchEditText.clearFocus(); } @@ -557,7 +566,7 @@ public class SearchFragment if (suggestionsPanel.getVisibility() == View.VISIBLE && infoListAdapter.getItemsList().size() > 0 && !isLoading.get()) { hideSuggestionsPanel(); hideKeyboardSearch(); - searchEditText.setText(lastSearchedQuery); + searchEditText.setText(lastSearchedQuery.getSearchString()); return true; } return false; @@ -573,8 +582,10 @@ public class SearchFragment final Observable observable = suggestionPublisher .debounce(SUGGESTIONS_DEBOUNCE, TimeUnit.MILLISECONDS) - .startWith(searchQuery != null ? searchQuery : "") - .filter(query -> isSuggestionsEnabled); + .startWith(searchQuery != null + ? searchQuery.getSearchString() + : "") + .filter(searchString -> isSuggestionsEnabled); suggestionDisposable = observable .switchMap(query -> { @@ -645,35 +656,24 @@ public class SearchFragment // no-op } - private void search(final String query) { + private void search(final SearchQIHandler query) { if (DEBUG) Log.d(TAG, "search() called with: query = [" + query + "]"); - if (query.isEmpty()) return; + if (query.getSearchString().isEmpty()) return; try { - final StreamingService service = NewPipe.getServiceByUrl(query); + final StreamingService service = NewPipe.getServiceByUrl(query.getUrl()); if (service != null) { showLoading(); disposables.add(Observable - .fromCallable(new Callable() { - @Override - public Intent call() throws Exception { - return NavigationHelper.getIntentByLink(activity, service, query); - } - }) + .fromCallable(() -> + NavigationHelper.getIntentByLink(activity, service, query.getUrl())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(Intent intent) throws Exception { - getFragmentManager().popBackStackImmediate(); - activity.startActivity(intent); - } - }, new Consumer() { - @Override - public void accept(Throwable throwable) throws Exception { - showError(getString(R.string.url_not_supported_toast), false); - } - })); + .subscribe(intent -> { + getFragmentManager().popBackStackImmediate(); + activity.startActivity(intent); + }, throwable -> + showError(getString(R.string.url_not_supported_toast), false))); return; } } catch (Exception e) { @@ -682,19 +682,19 @@ public class SearchFragment lastSearchedQuery = query; searchQuery = query; - currentPage = 0; + currentPageUrl = ""; infoListAdapter.clearStreamItemList(); hideSuggestionsPanel(); hideKeyboardSearch(); - historyRecordManager.onSearched(serviceId, query) + historyRecordManager.onSearched(serviceId, query.getSearchString()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( ignored -> {}, error -> showSnackBarError(error, UserAction.SEARCHED, - NewPipe.getNameOfService(serviceId), query, 0) + NewPipe.getNameOfService(serviceId), query.getSearchString(), 0) ); - suggestionPublisher.onNext(query); + suggestionPublisher.onNext(query.getSearchString()); startLoading(false); } @@ -703,7 +703,8 @@ public class SearchFragment super.startLoading(forceLoad); if (disposables != null) disposables.clear(); if (searchDisposable != null) searchDisposable.dispose(); - searchDisposable = ExtractorHelper.searchFor(serviceId, searchQuery, currentPage, contentCountry, filter) + searchDisposable = ExtractorHelper.searchFor(serviceId, + searchQuery, currentPageUrl, contentCountry, contentFilter, "") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((searchResult, throwable) -> isLoading.set(false)) @@ -716,7 +717,8 @@ public class SearchFragment showListFooter(true); if (searchDisposable != null) searchDisposable.dispose(); currentNextPage = currentPage + 1; - searchDisposable = ExtractorHelper.getMoreSearchItems(serviceId, searchQuery, currentNextPage, contentCountry, filter) + searchDisposable = ExtractorHelper.getMoreSearchItems(serviceId, + searchQuery, currentNextPage, contentCountry, filter) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((nextItemsResult, throwable) -> isLoading.set(false)) @@ -739,21 +741,38 @@ public class SearchFragment // Utils //////////////////////////////////////////////////////////////////////////*/ - private void changeFilter(MenuItem item, SearchEngine.Filter filter) { - this.filter = filter; + private void changeContentFilter(MenuItem item, List contentFilter) { this.filterItemCheckedId = item.getItemId(); item.setChecked(true); - if (!TextUtils.isEmpty(searchQuery)) { + this.contentFilter = contentFilter; + searchQuery = getSearchQuery(searchQuery.getSearchString(), contentFilter, ""); + + if (!TextUtils.isEmpty(searchQuery.getSearchString())) { search(searchQuery); } } - private void setQuery(int serviceId, String searchQuery) { + private void setQuery(int serviceId, SearchQIHandler searchQuery) { this.serviceId = serviceId; this.searchQuery = searchQuery; } + private SearchQIHandler getSearchQuery(String searchString, + List contentFilter, + String sortFilter) { + try { + return service.getSearchQIHFactory() + .fromQuery(searchString, contentFilter, sortFilter); + } catch (Exception e) { + ErrorActivity.reportError(getActivity(), e, getActivity().getClass(), + getActivity().findViewById(android.R.id.content), + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "", + "", R.string.general_error)); + } + } + /*////////////////////////////////////////////////////////////////////////// // Suggestion Results //////////////////////////////////////////////////////////////////////////*/ @@ -772,8 +791,11 @@ public class SearchFragment if (DEBUG) Log.d(TAG, "onSuggestionError() called with: exception = [" + exception + "]"); if (super.onError(exception)) return; - int errorId = exception instanceof ParsingException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, UserAction.GET_SUGGESTIONS, NewPipe.getNameOfService(serviceId), searchQuery, errorId); + int errorId = exception instanceof ParsingException + ? R.string.parsing_error + : R.string.general_error; + onUnrecoverableError(exception, UserAction.GET_SUGGESTIONS, + NewPipe.getNameOfService(serviceId), searchQuery, errorId); } /*////////////////////////////////////////////////////////////////////////// @@ -800,7 +822,8 @@ public class SearchFragment @Override public void handleResult(@NonNull SearchResult result) { if (!result.errors.isEmpty()) { - showSnackBarError(result.errors, UserAction.SEARCHED, NewPipe.getNameOfService(serviceId), searchQuery, 0); + showSnackBarError(result.errors, UserAction.SEARCHED, + NewPipe.getNameOfService(serviceId), searchQuery, 0); } lastSearchedQuery = searchQuery; @@ -825,7 +848,8 @@ public class SearchFragment infoListAdapter.addInfoItemList(result.getItems()); if (!result.getErrors().isEmpty()) { - showSnackBarError(result.getErrors(), UserAction.SEARCHED, NewPipe.getNameOfService(serviceId) + showSnackBarError(result.getErrors(), UserAction.SEARCHED, + NewPipe.getNameOfService(serviceId) , "\"" + searchQuery + "\" → page " + currentPage, 0); } super.handleNextItems(result); @@ -839,8 +863,11 @@ public class SearchFragment infoListAdapter.clearStreamItemList(); showEmptyState(); } else { - int errorId = exception instanceof ParsingException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, UserAction.SEARCHED, NewPipe.getNameOfService(serviceId), searchQuery, errorId); + int errorId = exception instanceof ParsingException + ? R.string.parsing_error + : R.string.general_error; + onUnrecoverableError(exception, UserAction.SEARCHED, + NewPipe.getNameOfService(serviceId), searchQuery, errorId); } return true; diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 1897589c6..9cbedff23 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -38,9 +38,11 @@ import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.search.SearchEngine; +import org.schabi.newpipe.extractor.search.SearchInfo; import org.schabi.newpipe.extractor.search.SearchResult; import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; @@ -66,29 +68,23 @@ public final class ExtractorHelper { } } - public static Single searchFor(final int serviceId, - final String query, - final int pageNumber, - final String contentCountry, - final SearchEngine.Filter filter) { + public static Single searchFor(final int serviceId, + final SearchQIHandler query, + final String contentCountry) { checkServiceId(serviceId); return Single.fromCallable(() -> - SearchResult.getSearchResult(NewPipe.getService(serviceId).getSearchEngine(), - query, pageNumber, contentCountry, filter) - ); + SearchInfo.getInfo(NewPipe.getService(serviceId).getSearchExtractor(query, contentCountry))); } public static Single getMoreSearchItems(final int serviceId, - final String query, - final int nextPageNumber, - final String searchLanguage, - final SearchEngine.Filter filter) { + final SearchQIHandler query, + final String pageUrl, + final String contentCountry) { checkServiceId(serviceId); - return searchFor(serviceId, query, nextPageNumber, searchLanguage, filter) - .map((@NonNull SearchResult searchResult) -> - new InfoItemsPage(searchResult.resultList, - nextPageNumber + "", - searchResult.errors)); + return Single.fromCallable(() -> + SearchInfo.get + NewPipe.getService(serviceId).getSearchExtractor(query, contentCountry)) + } public static Single> suggestionsFor(final int serviceId, From 3e02c65bc084d24c2db3e25cd8981abb14c9e2b3 Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Sun, 8 Jul 2018 13:21:05 +0000 Subject: [PATCH 095/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 76fb93d13..670b23002 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -429,7 +429,7 @@ abrir em modo popup "Tempo " Desabilite para para de carregar todas as miniaturas e economizar dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco. Passo - Desenganchar + Desvincular (pode causar distorção) Padrão Ação de \'abrir\' preferida Ação padrão quando abrir conteúdo — %s @@ -473,4 +473,9 @@ abrir em modo popup Minimizar para reprodutor em plano de fundo Minimizar para reprodutor popup - +Avançar rapidamente durante silêncio + Parar +\n + Reiniciar + + From d5a500c0372a36db37ff92fbce465ff166026cf0 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 8 Jul 2018 17:46:21 +0200 Subject: [PATCH 096/363] bring everything to compile and run --- app/build.gradle | 2 +- .../java/org/schabi/newpipe/MainActivity.java | 69 ++++++++++++------- .../newpipe/fragments/MainFragment.java | 27 +++++--- .../fragments/detail/VideoDetailFragment.java | 20 ++++-- .../fragments/list/BaseListFragment.java | 38 ++++++++-- .../fragments/list/BaseListInfoFragment.java | 10 +-- .../list/channel/ChannelFragment.java | 21 +++--- .../fragments/list/kiosk/KioskFragment.java | 26 ++++--- .../list/playlist/PlaylistFragment.java | 39 +++++++---- .../fragments/list/search/SearchFragment.java | 47 +++++-------- .../local/bookmark/BookmarkFragment.java | 34 ++++++--- .../subscription/SubscriptionFragment.java | 16 ++++- .../org/schabi/newpipe/util/Constants.java | 2 +- .../schabi/newpipe/util/ExtractorHelper.java | 8 +-- .../schabi/newpipe/util/NavigationHelper.java | 17 +++-- 15 files changed, 238 insertions(+), 138 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 503a3e469..396b79459 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:39332a283b1c911' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:4746a1c48a8682' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 61b430c27..38ee4a1f8 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -49,6 +49,7 @@ import android.widget.TextView; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; @@ -61,6 +62,8 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; import org.schabi.newpipe.util.ThemeHelper; +import static org.schabi.newpipe.extractor.InfoItem.InfoType.PLAYLIST; + public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); @@ -392,31 +395,51 @@ public class MainActivity extends AppCompatActivity { } private void handleIntent(Intent intent) { - if (DEBUG) Log.d(TAG, "handleIntent() called with: intent = [" + intent + "]"); + try { + if (DEBUG) Log.d(TAG, "handleIntent() called with: intent = [" + intent + "]"); - if (intent.hasExtra(Constants.KEY_LINK_TYPE)) { - String url = intent.getStringExtra(Constants.KEY_URL); - int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0); - String title = intent.getStringExtra(Constants.KEY_TITLE); - switch (((StreamingService.LinkType) intent.getSerializableExtra(Constants.KEY_LINK_TYPE))) { - case STREAM: - boolean autoPlay = intent.getBooleanExtra(VideoDetailFragment.AUTO_PLAY, false); - NavigationHelper.openVideoDetailFragment(getSupportFragmentManager(), serviceId, url, title, autoPlay); - break; - case CHANNEL: - NavigationHelper.openChannelFragment(getSupportFragmentManager(), serviceId, url, title); - break; - case PLAYLIST: - NavigationHelper.openPlaylistFragment(getSupportFragmentManager(), serviceId, url, title); - break; + if (intent.hasExtra(Constants.KEY_LINK_TYPE)) { + String url = intent.getStringExtra(Constants.KEY_URL); + int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0); + String title = intent.getStringExtra(Constants.KEY_TITLE); + switch (((StreamingService.LinkType) intent.getSerializableExtra(Constants.KEY_LINK_TYPE))) { + case STREAM: + boolean autoPlay = intent.getBooleanExtra(VideoDetailFragment.AUTO_PLAY, false); + NavigationHelper.openVideoDetailFragment(getSupportFragmentManager(), serviceId, url, title, autoPlay); + break; + case CHANNEL: + NavigationHelper.openChannelFragment(getSupportFragmentManager(), + serviceId, + NewPipe.getService(serviceId) + .getChannelUIHFactory() + .fromUrl(url), + title); + break; + case PLAYLIST: + NavigationHelper.openPlaylistFragment(getSupportFragmentManager(), + serviceId, + NewPipe.getService(serviceId) + .getChannelUIHFactory() + .fromUrl(url), + title); + break; + } + } else if (intent.hasExtra(Constants.KEY_OPEN_SEARCH)) { + String searchString = intent.getStringExtra(Constants.KEY_SEARCH_STRING); + if (searchString == null) searchString = ""; + int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0); + NavigationHelper.openSearchFragment( + getSupportFragmentManager(), + serviceId, + NewPipe.getService(serviceId) + .getSearchQIHFactory() + .fromQuery(searchString)); + + } else { + NavigationHelper.gotoMainFragment(getSupportFragmentManager()); } - } else if (intent.hasExtra(Constants.KEY_OPEN_SEARCH)) { - String searchQuery = intent.getStringExtra(Constants.KEY_QUERY); - if (searchQuery == null) searchQuery = ""; - int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0); - NavigationHelper.openSearchFragment(getSupportFragmentManager(), serviceId, searchQuery); - } else { - NavigationHelper.gotoMainFragment(getSupportFragmentManager()); + } catch (Exception e) { + ErrorActivity.reportUiError(this, e); } } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 31092d3e6..cd4fc1baf 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -10,6 +10,7 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; import android.support.v7.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; @@ -127,7 +128,16 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_search: - NavigationHelper.openSearchFragment(getFragmentManager(), ServiceHelper.getSelectedServiceId(activity), ""); + try { + NavigationHelper.openSearchFragment( + getFragmentManager(), + ServiceHelper.getSelectedServiceId(activity), + NewPipe.getService(currentServiceId) + .getSearchQIHFactory() + .fromQuery("")); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); + } return true; } return super.onOptionsItemSelected(item); @@ -226,7 +236,9 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte FALLBACK_CHANNEL_URL); String name = preferences.getString(getString(R.string.main_page_selected_channel_name), FALLBACK_CHANNEL_NAME); - ChannelFragment fragment = ChannelFragment.getInstance(serviceId, url, name); + ChannelFragment fragment = ChannelFragment.getInstance(serviceId, + NewPipe.getService(currentServiceId).getPlaylistUIHFactory().fromUrl(url), + name); fragment.useAsFrontPage(true); return fragment; } else { @@ -255,20 +267,13 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte for (final String ks : kl.getAvailableKiosks()) { menu.add(0, KIOSK_MENU_OFFSET + i, Menu.NONE, KioskTranslator.getTranslatedKioskName(ks, getContext())) - .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { + .setOnMenuItemClickListener(menuItem -> { try { NavigationHelper.openKioskFragment(getFragmentManager(), currentServiceId, ks); } catch (Exception e) { - ErrorActivity.reportError(activity, e, - activity.getClass(), - null, - ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, - "none", "", R.string.app_ui_crash)); + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); } return true; - } }); i++; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 5aef21f39..fac6435dd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -17,6 +17,7 @@ import android.support.v4.content.ContextCompat; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; @@ -54,7 +55,7 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; +import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamInfo; @@ -64,6 +65,7 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; @@ -365,11 +367,17 @@ public class VideoDetailFragment if (TextUtils.isEmpty(currentInfo.getUploaderUrl())) { Log.w(TAG, "Can't open channel because we got no channel URL"); } else { - NavigationHelper.openChannelFragment( - getFragmentManager(), - currentInfo.getServiceId(), - currentInfo.getUploaderUrl(), - currentInfo.getUploaderName()); + try { + NavigationHelper.openChannelFragment( + getFragmentManager(), + currentInfo.getServiceId(), + NewPipe.getService(currentInfo.getServiceId()) + .getChannelUIHFactory() + .fromUrl(currentInfo.getUploaderUrl()), + currentInfo.getUploaderName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); + } } break; case R.id.detail_thumbnail_root_layout: diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index c4b341aae..adf419795 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -6,6 +6,7 @@ import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; @@ -15,15 +16,18 @@ import android.view.View; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.uih.ListUIHandler; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.info_list.InfoListAdapter; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; import org.schabi.newpipe.util.StateSaver; @@ -152,18 +156,40 @@ public abstract class BaseListFragment extends BaseStateFragment implem infoListAdapter.setOnChannelSelectedListener(new OnClickGesture() { @Override public void selected(ChannelInfoItem selectedItem) { - onItemSelected(selectedItem); - NavigationHelper.openChannelFragment(useAsFrontPage ? getParentFragment().getFragmentManager() : getFragmentManager(), - selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName()); + try { + onItemSelected(selectedItem); + NavigationHelper.openChannelFragment(useAsFrontPage ? + getParentFragment().getFragmentManager() + : getFragmentManager(), + selectedItem.getServiceId(), + NewPipe.getService(selectedItem + .getServiceId()) + .getChannelUIHFactory() + .fromUrl(selectedItem.getUrl()), + selectedItem.getName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); + } } }); infoListAdapter.setOnPlaylistSelectedListener(new OnClickGesture() { @Override public void selected(PlaylistInfoItem selectedItem) { - onItemSelected(selectedItem); - NavigationHelper.openPlaylistFragment(useAsFrontPage ? getParentFragment().getFragmentManager() : getFragmentManager(), - selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName()); + try { + onItemSelected(selectedItem); + NavigationHelper.openPlaylistFragment( + useAsFrontPage + ? getParentFragment().getFragmentManager() + : getFragmentManager(), + selectedItem.getServiceId(), + NewPipe.getService(selectedItem.getServiceId()) + .getPlaylistUIHFactory() + .fromUrl(selectedItem.getUrl()), + selectedItem.getName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); + } } }); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index a132213bf..270ba5550 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -8,6 +8,9 @@ import android.view.View; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.uih.ListUIHandler; +import org.schabi.newpipe.extractor.uih.UIHandler; import org.schabi.newpipe.util.Constants; import java.util.Queue; @@ -27,7 +30,7 @@ public abstract class BaseListInfoFragment @State protected String name; @State - protected String url; + protected ListUIHandler uiHandler; protected I currentInfo; protected String currentNextPageUrl; @@ -166,7 +169,6 @@ public abstract class BaseListInfoFragment public void handleResult(@NonNull I result) { super.handleResult(result); - url = result.getUrl(); name = result.getName(); setTitle(name); @@ -185,9 +187,9 @@ public abstract class BaseListInfoFragment // Utils //////////////////////////////////////////////////////////////////////////*/ - protected void setInitialData(int serviceId, String url, String name) { + protected void setInitialData(int serviceId, ListUIHandler uiHandler, String name) { this.serviceId = serviceId; - this.url = url; + this.uiHandler = uiHandler; this.name = !TextUtils.isEmpty(name) ? name : ""; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index b56692877..758b6506c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -33,6 +33,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.uih.ListUIHandler; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; @@ -90,9 +91,9 @@ public class ChannelFragment extends BaseListInfoFragment { private MenuItem menuRssButton; - public static ChannelFragment getInstance(int serviceId, String url, String name) { + public static ChannelFragment getInstance(int serviceId, ListUIHandler uiHandler, String name) { ChannelFragment instance = new ChannelFragment(); - instance.setInitialData(serviceId, url, name); + instance.setInitialData(serviceId, uiHandler, name); return instance; } @@ -236,10 +237,10 @@ public class ChannelFragment extends BaseListInfoFragment { openRssFeed(); break; case R.id.menu_item_openInBrowser: - openUrlInBrowser(url); + openUrlInBrowser(uiHandler.getUrl()); break; case R.id.menu_item_share: - shareUrl(name, url); + shareUrl(name, uiHandler.getUrl()); break; default: return super.onOptionsItemSelected(item); @@ -405,12 +406,12 @@ public class ChannelFragment extends BaseListInfoFragment { @Override protected Single loadMoreItemsLogic() { - return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPageUrl); + return ExtractorHelper.getMoreChannelItems(serviceId, uiHandler.getUrl(), currentNextPageUrl); } @Override protected Single loadResult(boolean forceLoad) { - return ExtractorHelper.getChannelInfo(serviceId, url, forceLoad); + return ExtractorHelper.getChannelInfo(serviceId, uiHandler.getUrl(), forceLoad); } /*////////////////////////////////////////////////////////////////////////// @@ -488,7 +489,7 @@ public class ChannelFragment extends BaseListInfoFragment { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_CHANNEL, NewPipe.getNameOfService(serviceId), - "Get next page of: " + url, R.string.general_error); + "Get next page of: " + uiHandler.getUrl(), R.string.general_error); } } @@ -501,7 +502,11 @@ public class ChannelFragment extends BaseListInfoFragment { if (super.onError(exception)) return true; int errorId = exception instanceof ExtractionException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, UserAction.REQUESTED_CHANNEL, NewPipe.getNameOfService(serviceId), url, errorId); + onUnrecoverableError(exception, + UserAction.REQUESTED_CHANNEL, + NewPipe.getNameOfService(serviceId), + uiHandler.getUrl(), + errorId); return true; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 5dfdcd655..97e35f4c2 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -11,22 +11,20 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.uih.ListUIHFactory; +import org.schabi.newpipe.extractor.uih.ListUIHandler; +import org.schabi.newpipe.extractor.uih.UIHFactory; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; -import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.KioskTranslator; -import org.schabi.newpipe.util.NavigationHelper; import icepick.State; import io.reactivex.Single; @@ -74,10 +72,10 @@ public class KioskFragment extends BaseListInfoFragment { throws ExtractionException { KioskFragment instance = new KioskFragment(); StreamingService service = NewPipe.getService(serviceId); - UrlIdHandler kioskTypeUrlIdHandler = service.getKioskList() - .getUrlIdHandlerByType(kioskId); + ListUIHFactory kioskUIHFactory = service.getKioskList() + .getUIHFactoryByType(kioskId); instance.setInitialData(serviceId, - kioskTypeUrlIdHandler.getUrl(kioskId), kioskId); + kioskUIHFactory.fromId(kioskId), kioskId); instance.kioskId = kioskId; return instance; } @@ -136,7 +134,10 @@ public class KioskFragment extends BaseListInfoFragment { .getDefaultSharedPreferences(activity) .getString(getString(R.string.content_country_key), getString(R.string.default_country_value)); - return ExtractorHelper.getKioskInfo(serviceId, url, contentCountry, forceReload); + return ExtractorHelper.getKioskInfo(serviceId, + uiHandler.getUrl(), + contentCountry, + forceReload); } @Override @@ -145,7 +146,10 @@ public class KioskFragment extends BaseListInfoFragment { .getDefaultSharedPreferences(activity) .getString(getString(R.string.content_country_key), getString(R.string.default_country_value)); - return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextPageUrl, contentCountry); + return ExtractorHelper.getMoreKioskItems(serviceId, + uiHandler.getUrl(), + currentNextPageUrl, + contentCountry); } /*////////////////////////////////////////////////////////////////////////// @@ -179,7 +183,7 @@ public class KioskFragment extends BaseListInfoFragment { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId) - , "Get next page of: " + url, 0); + , "Get next page of: " + uiHandler.getUrl(), 0); } } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index ca732aa2c..b7df1e0c3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -6,6 +6,7 @@ import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -19,6 +20,7 @@ import android.widget.TextView; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; +import org.schabi.newpipe.App; import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; @@ -28,12 +30,14 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.uih.ListUIHandler; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.ImageDisplayConstants; @@ -79,9 +83,9 @@ public class PlaylistFragment extends BaseListInfoFragment { private MenuItem playlistBookmarkButton; - public static PlaylistFragment getInstance(int serviceId, String url, String name) { + public static PlaylistFragment getInstance(int serviceId, ListUIHandler uiHandler, String name) { PlaylistFragment instance = new PlaylistFragment(); - instance.setInitialData(serviceId, url, name); + instance.setInitialData(serviceId, uiHandler, name); return instance; } @@ -216,22 +220,22 @@ public class PlaylistFragment extends BaseListInfoFragment { @Override protected Single loadMoreItemsLogic() { - return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPageUrl); + return ExtractorHelper.getMorePlaylistItems(serviceId, uiHandler.getUrl(), currentNextPageUrl); } @Override protected Single loadResult(boolean forceLoad) { - return ExtractorHelper.getPlaylistInfo(serviceId, url, forceLoad); + return ExtractorHelper.getPlaylistInfo(serviceId, uiHandler.getUrl(), forceLoad); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_openInBrowser: - openUrlInBrowser(url); + openUrlInBrowser(uiHandler.getUrl()); break; case R.id.menu_item_share: - shareUrl(name, url); + shareUrl(name, uiHandler.getUrl()); break; case R.id.menu_item_bookmark: onBookmarkClicked(); @@ -267,11 +271,18 @@ public class PlaylistFragment extends BaseListInfoFragment { if (!TextUtils.isEmpty(result.getUploaderName())) { headerUploaderName.setText(result.getUploaderName()); if (!TextUtils.isEmpty(result.getUploaderUrl())) { - headerUploaderLayout.setOnClickListener(v -> + headerUploaderLayout.setOnClickListener(v -> { + try { NavigationHelper.openChannelFragment(getFragmentManager(), - result.getServiceId(), result.getUploaderUrl(), - result.getUploaderName()) - ); + result.getServiceId(), + NewPipe.getService(serviceId) + .getChannelUIHFactory() + .fromUrl(result.getUploaderUrl()), + result.getUploaderName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); + } + }); } } @@ -326,7 +337,7 @@ public class PlaylistFragment extends BaseListInfoFragment { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId) - , "Get next page of: " + url, 0); + , "Get next page of: " + uiHandler.getUrl(), 0); } } @@ -339,7 +350,11 @@ public class PlaylistFragment extends BaseListInfoFragment { if (super.onError(exception)) return true; int errorId = exception instanceof ExtractionException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId), url, errorId); + onUnrecoverableError(exception, + UserAction.REQUESTED_PLAYLIST, + NewPipe.getNameOfService(serviceId), + uiHandler.getUrl(), + errorId); return true; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index e57cdbd31..ee76966ff 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -37,9 +37,8 @@ import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.search.SearchEngine; +import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.search.SearchInfo; -import org.schabi.newpipe.extractor.search.SearchResult; import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.list.BaseListFragment; @@ -59,7 +58,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Queue; -import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import icepick.State; @@ -103,8 +101,6 @@ public class SearchFragment protected SearchQIHandler lastSearchedQuery; @State protected boolean wasSearchFocused = false; - @State - List contentFilter; private StreamingService service; private String currentPageUrl; @@ -381,8 +377,6 @@ public class SearchFragment if (item == null) return; item.setChecked(true); - contentFilter.clear(); - contentFilter.add(menu.getItem(itemId).getTitle().toString()); } } @@ -703,8 +697,7 @@ public class SearchFragment super.startLoading(forceLoad); if (disposables != null) disposables.clear(); if (searchDisposable != null) searchDisposable.dispose(); - searchDisposable = ExtractorHelper.searchFor(serviceId, - searchQuery, currentPageUrl, contentCountry, contentFilter, "") + searchDisposable = ExtractorHelper.searchFor(serviceId, searchQuery, contentCountry) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((searchResult, throwable) -> isLoading.set(false)) @@ -716,9 +709,8 @@ public class SearchFragment isLoading.set(true); showListFooter(true); if (searchDisposable != null) searchDisposable.dispose(); - currentNextPage = currentPage + 1; searchDisposable = ExtractorHelper.getMoreSearchItems(serviceId, - searchQuery, currentNextPage, contentCountry, filter) + searchQuery, nextPageUrl, contentCountry) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((nextItemsResult, throwable) -> isLoading.set(false)) @@ -745,7 +737,6 @@ public class SearchFragment this.filterItemCheckedId = item.getItemId(); item.setChecked(true); - this.contentFilter = contentFilter; searchQuery = getSearchQuery(searchQuery.getSearchString(), contentFilter, ""); if (!TextUtils.isEmpty(searchQuery.getSearchString())) { @@ -765,12 +756,12 @@ public class SearchFragment return service.getSearchQIHFactory() .fromQuery(searchString, contentFilter, sortFilter); } catch (Exception e) { - ErrorActivity.reportError(getActivity(), e, getActivity().getClass(), - getActivity().findViewById(android.R.id.content), - ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, - "", - "", R.string.general_error)); + onUnrecoverableError(e, UserAction.SEARCHED, + service.getServiceInfo().getName(), + searchQuery.getSearchString(), + R.string.general_error); } + return searchQuery; } /*////////////////////////////////////////////////////////////////////////// @@ -795,7 +786,7 @@ public class SearchFragment ? R.string.parsing_error : R.string.general_error; onUnrecoverableError(exception, UserAction.GET_SUGGESTIONS, - NewPipe.getNameOfService(serviceId), searchQuery, errorId); + NewPipe.getNameOfService(serviceId), searchQuery.getSearchString(), errorId); } /*////////////////////////////////////////////////////////////////////////// @@ -820,17 +811,17 @@ public class SearchFragment //////////////////////////////////////////////////////////////////////////*/ @Override - public void handleResult(@NonNull SearchResult result) { - if (!result.errors.isEmpty()) { - showSnackBarError(result.errors, UserAction.SEARCHED, - NewPipe.getNameOfService(serviceId), searchQuery, 0); + public void handleResult(@NonNull SearchInfo result) { + if (!result.getErrors().isEmpty()) { + showSnackBarError(result.getErrors(), UserAction.SEARCHED, + NewPipe.getNameOfService(serviceId), searchQuery.getSearchString(), 0); } lastSearchedQuery = searchQuery; if (infoListAdapter.getItemsList().size() == 0) { - if (!result.getResults().isEmpty()) { - infoListAdapter.addInfoItemList(result.getResults()); + if (!result.getRelatedItems().isEmpty()) { + infoListAdapter.addInfoItemList(result.getRelatedItems()); } else { infoListAdapter.clearStreamItemList(); showEmptyState(); @@ -844,13 +835,13 @@ public class SearchFragment @Override public void handleNextItems(ListExtractor.InfoItemsPage result) { showListFooter(false); - currentPage = Integer.parseInt(result.getNextPageUrl()); + currentPageUrl = result.getNextPageUrl(); infoListAdapter.addInfoItemList(result.getItems()); if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.SEARCHED, NewPipe.getNameOfService(serviceId) - , "\"" + searchQuery + "\" → page " + currentPage, 0); + , "\"" + searchQuery + "\" → page: " + nextPageUrl, 0); } super.handleNextItems(result); } @@ -859,7 +850,7 @@ public class SearchFragment protected boolean onError(Throwable exception) { if (super.onError(exception)) return true; - if (exception instanceof SearchEngine.NothingFoundException) { + if (exception instanceof SearchExtractor.NothingFoundException) { infoListAdapter.clearStreamItemList(); showEmptyState(); } else { @@ -867,7 +858,7 @@ public class SearchFragment ? R.string.parsing_error : R.string.general_error; onUnrecoverableError(exception, UserAction.SEARCHED, - NewPipe.getNameOfService(serviceId), searchQuery, errorId); + NewPipe.getNameOfService(serviceId), searchQuery.getSearchString(), errorId); } return true; diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index f3f390c4d..a7e16a5f1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -6,6 +6,7 @@ import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.FragmentManager; +import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,9 +20,11 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.PlaylistLocalItem; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; +import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.local.BaseLocalListFragment; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -99,19 +102,28 @@ public final class BookmarkFragment itemListAdapter.setSelectedListener(new OnClickGesture() { @Override public void selected(LocalItem selectedItem) { - // Requires the parent fragment to find holder for fragment replacement - if (getParentFragment() == null) return; - final FragmentManager fragmentManager = getParentFragment().getFragmentManager(); + try { + // Requires the parent fragment to find holder for fragment replacement + if (getParentFragment() == null) return; + final FragmentManager fragmentManager = getParentFragment().getFragmentManager(); - if (selectedItem instanceof PlaylistMetadataEntry) { - final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.uid, - entry.name); + if (selectedItem instanceof PlaylistMetadataEntry) { + final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); + NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.uid, + entry.name); - } else if (selectedItem instanceof PlaylistRemoteEntity) { - final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); - NavigationHelper.openPlaylistFragment(fragmentManager, entry.getServiceId(), - entry.getUrl(), entry.getName()); + } else if (selectedItem instanceof PlaylistRemoteEntity) { + final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); + NavigationHelper.openPlaylistFragment( + fragmentManager, + entry.getServiceId(), + NewPipe.getService(entry.getServiceId()) + .getPlaylistUIHFactory() + .fromUrl(entry.getUrl()), + entry.getName()); + } + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java index 5f6ea42ee..9bbb5f517 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java @@ -15,6 +15,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -38,6 +39,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.info_list.InfoListAdapter; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.local.subscription.services.SubscriptionsExportService; import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService; @@ -318,9 +320,17 @@ public class SubscriptionFragment extends BaseStateFragment() { @Override public void selected(ChannelInfoItem selectedItem) { - // Requires the parent fragment to find holder for fragment replacement - NavigationHelper.openChannelFragment(getParentFragment().getFragmentManager(), - selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName()); + try { + // Requires the parent fragment to find holder for fragment replacement + NavigationHelper.openChannelFragment(getParentFragment().getFragmentManager(), + selectedItem.getServiceId(), + NewPipe.getService(selectedItem.getServiceId()) + .getChannelUIHFactory() + .fromUrl(selectedItem.getUrl()), + selectedItem.getName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); + } } }); diff --git a/app/src/main/java/org/schabi/newpipe/util/Constants.java b/app/src/main/java/org/schabi/newpipe/util/Constants.java index a6aec96e2..b01b6df6a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Constants.java +++ b/app/src/main/java/org/schabi/newpipe/util/Constants.java @@ -6,7 +6,7 @@ public class Constants { public static final String KEY_TITLE = "key_title"; public static final String KEY_LINK_TYPE = "key_link_type"; public static final String KEY_OPEN_SEARCH = "key_open_search"; - public static final String KEY_QUERY = "key_query"; + public static final String KEY_SEARCH_STRING = "key_search_string"; public static final String KEY_THEME_CHANGE = "key_theme_change"; public static final String KEY_MAIN_PAGE_CHANGE = "key_main_page_change"; diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 9cbedff23..2e4ef84e1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -37,10 +37,8 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; -import org.schabi.newpipe.extractor.search.SearchEngine; import org.schabi.newpipe.extractor.search.SearchInfo; -import org.schabi.newpipe.extractor.search.SearchResult; -import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; +import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.report.ErrorActivity; @@ -52,7 +50,6 @@ import java.util.List; import io.reactivex.Maybe; import io.reactivex.Single; -import io.reactivex.annotations.NonNull; public final class ExtractorHelper { private static final String TAG = ExtractorHelper.class.getSimpleName(); @@ -82,8 +79,7 @@ public final class ExtractorHelper { final String contentCountry) { checkServiceId(serviceId); return Single.fromCallable(() -> - SearchInfo.get - NewPipe.getService(serviceId).getSearchExtractor(query, contentCountry)) + SearchInfo.getMoreItems(NewPipe.getService(serviceId), query, contentCountry, pageUrl)); } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 12f6856de..0344e5e79 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -26,10 +26,13 @@ import org.schabi.newpipe.download.DownloadActivity; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.extractor.uih.ListUIHandler; +import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; @@ -283,7 +286,7 @@ public class NavigationHelper { return fragmentManager.popBackStackImmediate(SEARCH_FRAGMENT_TAG, 0); } - public static void openSearchFragment(FragmentManager fragmentManager, int serviceId, String query) { + public static void openSearchFragment(FragmentManager fragmentManager, int serviceId, SearchQIHandler query) { defaultTransaction(fragmentManager) .replace(R.id.fragment_holder, SearchFragment.getInstance(serviceId, query)) .addToBackStack(SEARCH_FRAGMENT_TAG) @@ -314,18 +317,18 @@ public class NavigationHelper { .commit(); } - public static void openChannelFragment(FragmentManager fragmentManager, int serviceId, String url, String name) { + public static void openChannelFragment(FragmentManager fragmentManager, int serviceId, ListUIHandler uiHandler, String name) { if (name == null) name = ""; defaultTransaction(fragmentManager) - .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, url, name)) + .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, uiHandler, name)) .addToBackStack(null) .commit(); } - public static void openPlaylistFragment(FragmentManager fragmentManager, int serviceId, String url, String name) { + public static void openPlaylistFragment(FragmentManager fragmentManager, int serviceId, ListUIHandler uiHandler, String name) { if (name == null) name = ""; defaultTransaction(fragmentManager) - .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, url, name)) + .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, uiHandler, name)) .addToBackStack(null) .commit(); } @@ -370,10 +373,10 @@ public class NavigationHelper { // Through Intents //////////////////////////////////////////////////////////////////////////*/ - public static void openSearch(Context context, int serviceId, String query) { + public static void openSearch(Context context, int serviceId, String searchString) { Intent mIntent = new Intent(context, MainActivity.class); mIntent.putExtra(Constants.KEY_SERVICE_ID, serviceId); - mIntent.putExtra(Constants.KEY_QUERY, query); + mIntent.putExtra(Constants.KEY_SEARCH_STRING, searchString); mIntent.putExtra(Constants.KEY_OPEN_SEARCH, true); context.startActivity(mIntent); } From 1ee1b522f1ceb6fd869feb9c638522e28f86098d Mon Sep 17 00:00:00 2001 From: Michalis Nikolaidis Date: Sun, 8 Jul 2018 23:33:25 +0000 Subject: [PATCH 097/363] Translated using Weblate (Greek) Currently translated at 19,5% (74 of 379 strings) --- app/src/main/res/values-el/strings.xml | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index fd89066aa..864453f7a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -62,4 +62,41 @@ Δημιουργήθηκε ο φάκελος \'%1$s\' Δ + Άνοιγμα σε αναδυόμενο παράθυρο + Εγγραφή + Εγγεγραμμένος + Μόνο μερικές συσκευές υποστηρίζουν την αναπαραγωγή 2K/4K βίντεο + Μαύρο + Προτάσεις αναζήτησης + Ιστορικό αναζήτησης + Λήψεις + Λήψεις + Όλα + Κανάλι + Ναι + Αργότερα + Φίλτρο + Σφάλμα + ΑΝΑΦΟΡΑ + "Πληροφορίες: " + "Τι συνέβη: " + Το σχόλιό σας (στα Αγγλικά): + "Λεπτομέρειες: " + + + Αναφορά Σφάλματος + Βίντεο + Ήχος + Παύση + Διαγραφή + Σφάλμα + Το αρχείο υπάρχει ήδη + Πατήστε για λεπτομέρειες + Λήψη + Γράμματα και ψηφία + Ρυθμίσεις + Άνοιγμα ιστοσελίδας + Άδειες + Ιστορικό + Ιστορικό From 708d7162fb9be3a5f2aa1da308ffe2d178553633 Mon Sep 17 00:00:00 2001 From: Lee Hoe Mun Date: Sun, 8 Jul 2018 18:19:59 +0000 Subject: [PATCH 098/363] Translated using Weblate (Chinese (Mandarin)) Currently translated at 16.6% (63 of 379 strings) --- app/src/main/res/values-cmn/strings.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index ee13afdb7..4016a40c8 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -64,4 +64,9 @@ 酷黑 黑色 记住弹出窗口的尺寸与位置 - + M4A — 更好的音质 + 记住上一次弹出窗口的位置以及大小 + 清理照片内存 + 最小化弹出播放器 + + From dd9557c13e5b27234e1bdc078d9c3e87ad1240d4 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Mon, 9 Jul 2018 00:11:36 +0000 Subject: [PATCH 099/363] Translated using Weblate (Greek) Currently translated at 19.5% (74 of 379 strings) --- app/src/main/res/values-el/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 864453f7a..a03f32a38 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -78,10 +78,10 @@ Φίλτρο Σφάλμα ΑΝΑΦΟΡΑ - "Πληροφορίες: " - "Τι συνέβη: " + Πληροφορίες: + Τι συνέβη: Το σχόλιό σας (στα Αγγλικά): - "Λεπτομέρειες: " + Λεπτομέρειες: Αναφορά Σφάλματος From decb167ba9d7b0ecfb6ddadee775051a543a469b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 10 Jul 2018 16:26:42 +0200 Subject: [PATCH 100/363] make the new extractor refactorings work with SoundCloud --- app/build.gradle | 2 +- .../java/org/schabi/newpipe/MainActivity.java | 12 +- .../newpipe/fragments/MainFragment.java | 6 +- .../fragments/detail/VideoDetailFragment.java | 4 +- .../fragments/list/BaseListFragment.java | 13 +- .../fragments/list/BaseListInfoFragment.java | 6 +- .../list/channel/ChannelFragment.java | 16 +- .../fragments/list/kiosk/KioskFragment.java | 8 +- .../list/playlist/PlaylistFragment.java | 20 +-- .../fragments/list/search/SearchFragment.java | 166 ++++++++++-------- .../local/bookmark/BookmarkFragment.java | 4 +- .../subscription/SubscriptionFragment.java | 4 +- .../schabi/newpipe/util/ExtractorHelper.java | 27 ++- .../schabi/newpipe/util/NavigationHelper.java | 24 ++- .../schabi/newpipe/util/ServiceHelper.java | 1 - 15 files changed, 163 insertions(+), 150 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 396b79459..10aaf91a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:4746a1c48a8682' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:a1aaca1be' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 38ee4a1f8..f43d413e9 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -410,17 +410,13 @@ public class MainActivity extends AppCompatActivity { case CHANNEL: NavigationHelper.openChannelFragment(getSupportFragmentManager(), serviceId, - NewPipe.getService(serviceId) - .getChannelUIHFactory() - .fromUrl(url), + url, title); break; case PLAYLIST: NavigationHelper.openPlaylistFragment(getSupportFragmentManager(), serviceId, - NewPipe.getService(serviceId) - .getChannelUIHFactory() - .fromUrl(url), + url, title); break; } @@ -431,9 +427,7 @@ public class MainActivity extends AppCompatActivity { NavigationHelper.openSearchFragment( getSupportFragmentManager(), serviceId, - NewPipe.getService(serviceId) - .getSearchQIHFactory() - .fromQuery(searchString)); + searchString); } else { NavigationHelper.gotoMainFragment(getSupportFragmentManager()); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index cd4fc1baf..0e3312403 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -132,9 +132,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte NavigationHelper.openSearchFragment( getFragmentManager(), ServiceHelper.getSelectedServiceId(activity), - NewPipe.getService(currentServiceId) - .getSearchQIHFactory() - .fromQuery("")); + ""); } catch (Exception e) { ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); } @@ -237,7 +235,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte String name = preferences.getString(getString(R.string.main_page_selected_channel_name), FALLBACK_CHANNEL_NAME); ChannelFragment fragment = ChannelFragment.getInstance(serviceId, - NewPipe.getService(currentServiceId).getPlaylistUIHFactory().fromUrl(url), + url, name); fragment.useAsFrontPage(true); return fragment; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index fac6435dd..d91502cdd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -371,9 +371,7 @@ public class VideoDetailFragment NavigationHelper.openChannelFragment( getFragmentManager(), currentInfo.getServiceId(), - NewPipe.getService(currentInfo.getServiceId()) - .getChannelUIHFactory() - .fromUrl(currentInfo.getUploaderUrl()), + currentInfo.getUploaderUrl(), currentInfo.getUploaderName()); } catch (Exception e) { ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index adf419795..c4702046d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -162,10 +162,7 @@ public abstract class BaseListFragment extends BaseStateFragment implem getParentFragment().getFragmentManager() : getFragmentManager(), selectedItem.getServiceId(), - NewPipe.getService(selectedItem - .getServiceId()) - .getChannelUIHFactory() - .fromUrl(selectedItem.getUrl()), + selectedItem.getUrl(), selectedItem.getName()); } catch (Exception e) { ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); @@ -183,9 +180,7 @@ public abstract class BaseListFragment extends BaseStateFragment implem ? getParentFragment().getFragmentManager() : getFragmentManager(), selectedItem.getServiceId(), - NewPipe.getService(selectedItem.getServiceId()) - .getPlaylistUIHFactory() - .fromUrl(selectedItem.getUrl()), + selectedItem.getUrl(), selectedItem.getName()); } catch (Exception e) { ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); @@ -204,7 +199,9 @@ public abstract class BaseListFragment extends BaseStateFragment implem private void onStreamSelected(StreamInfoItem selectedItem) { onItemSelected(selectedItem); - NavigationHelper.openVideoDetailFragment(useAsFrontPage ? getParentFragment().getFragmentManager() : getFragmentManager(), + NavigationHelper.openVideoDetailFragment(useAsFrontPage + ? getParentFragment().getFragmentManager() + : getFragmentManager(), selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName()); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index 270ba5550..9c3afb7f6 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -30,7 +30,7 @@ public abstract class BaseListInfoFragment @State protected String name; @State - protected ListUIHandler uiHandler; + protected String url; protected I currentInfo; protected String currentNextPageUrl; @@ -187,9 +187,9 @@ public abstract class BaseListInfoFragment // Utils //////////////////////////////////////////////////////////////////////////*/ - protected void setInitialData(int serviceId, ListUIHandler uiHandler, String name) { + protected void setInitialData(int serviceId, String url, String name) { this.serviceId = serviceId; - this.uiHandler = uiHandler; + this.url = url; this.name = !TextUtils.isEmpty(name) ? name : ""; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 758b6506c..041b550ed 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -91,9 +91,9 @@ public class ChannelFragment extends BaseListInfoFragment { private MenuItem menuRssButton; - public static ChannelFragment getInstance(int serviceId, ListUIHandler uiHandler, String name) { + public static ChannelFragment getInstance(int serviceId, String url, String name) { ChannelFragment instance = new ChannelFragment(); - instance.setInitialData(serviceId, uiHandler, name); + instance.setInitialData(serviceId, url, name); return instance; } @@ -237,10 +237,10 @@ public class ChannelFragment extends BaseListInfoFragment { openRssFeed(); break; case R.id.menu_item_openInBrowser: - openUrlInBrowser(uiHandler.getUrl()); + openUrlInBrowser(url); break; case R.id.menu_item_share: - shareUrl(name, uiHandler.getUrl()); + shareUrl(name, url); break; default: return super.onOptionsItemSelected(item); @@ -406,12 +406,12 @@ public class ChannelFragment extends BaseListInfoFragment { @Override protected Single loadMoreItemsLogic() { - return ExtractorHelper.getMoreChannelItems(serviceId, uiHandler.getUrl(), currentNextPageUrl); + return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPageUrl); } @Override protected Single loadResult(boolean forceLoad) { - return ExtractorHelper.getChannelInfo(serviceId, uiHandler.getUrl(), forceLoad); + return ExtractorHelper.getChannelInfo(serviceId, url, forceLoad); } /*////////////////////////////////////////////////////////////////////////// @@ -489,7 +489,7 @@ public class ChannelFragment extends BaseListInfoFragment { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_CHANNEL, NewPipe.getNameOfService(serviceId), - "Get next page of: " + uiHandler.getUrl(), R.string.general_error); + "Get next page of: " + url, R.string.general_error); } } @@ -505,7 +505,7 @@ public class ChannelFragment extends BaseListInfoFragment { onUnrecoverableError(exception, UserAction.REQUESTED_CHANNEL, NewPipe.getNameOfService(serviceId), - uiHandler.getUrl(), + url, errorId); return true; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 97e35f4c2..66ccfe6c3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -75,7 +75,7 @@ public class KioskFragment extends BaseListInfoFragment { ListUIHFactory kioskUIHFactory = service.getKioskList() .getUIHFactoryByType(kioskId); instance.setInitialData(serviceId, - kioskUIHFactory.fromId(kioskId), kioskId); + kioskUIHFactory.fromId(kioskId).getUrl(), kioskId); instance.kioskId = kioskId; return instance; } @@ -135,7 +135,7 @@ public class KioskFragment extends BaseListInfoFragment { .getString(getString(R.string.content_country_key), getString(R.string.default_country_value)); return ExtractorHelper.getKioskInfo(serviceId, - uiHandler.getUrl(), + url, contentCountry, forceReload); } @@ -147,7 +147,7 @@ public class KioskFragment extends BaseListInfoFragment { .getString(getString(R.string.content_country_key), getString(R.string.default_country_value)); return ExtractorHelper.getMoreKioskItems(serviceId, - uiHandler.getUrl(), + url, currentNextPageUrl, contentCountry); } @@ -183,7 +183,7 @@ public class KioskFragment extends BaseListInfoFragment { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId) - , "Get next page of: " + uiHandler.getUrl(), 0); + , "Get next page of: " + url, 0); } } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index b7df1e0c3..2f60276d7 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -83,9 +83,9 @@ public class PlaylistFragment extends BaseListInfoFragment { private MenuItem playlistBookmarkButton; - public static PlaylistFragment getInstance(int serviceId, ListUIHandler uiHandler, String name) { + public static PlaylistFragment getInstance(int serviceId, String url, String name) { PlaylistFragment instance = new PlaylistFragment(); - instance.setInitialData(serviceId, uiHandler, name); + instance.setInitialData(serviceId, url, name); return instance; } @@ -220,22 +220,22 @@ public class PlaylistFragment extends BaseListInfoFragment { @Override protected Single loadMoreItemsLogic() { - return ExtractorHelper.getMorePlaylistItems(serviceId, uiHandler.getUrl(), currentNextPageUrl); + return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPageUrl); } @Override protected Single loadResult(boolean forceLoad) { - return ExtractorHelper.getPlaylistInfo(serviceId, uiHandler.getUrl(), forceLoad); + return ExtractorHelper.getPlaylistInfo(serviceId, url, forceLoad); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_openInBrowser: - openUrlInBrowser(uiHandler.getUrl()); + openUrlInBrowser(url); break; case R.id.menu_item_share: - shareUrl(name, uiHandler.getUrl()); + shareUrl(name, url); break; case R.id.menu_item_bookmark: onBookmarkClicked(); @@ -275,9 +275,7 @@ public class PlaylistFragment extends BaseListInfoFragment { try { NavigationHelper.openChannelFragment(getFragmentManager(), result.getServiceId(), - NewPipe.getService(serviceId) - .getChannelUIHFactory() - .fromUrl(result.getUploaderUrl()), + result.getUploaderUrl(), result.getUploaderName()); } catch (Exception e) { ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); @@ -337,7 +335,7 @@ public class PlaylistFragment extends BaseListInfoFragment { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId) - , "Get next page of: " + uiHandler.getUrl(), 0); + , "Get next page of: " + url, 0); } } @@ -353,7 +351,7 @@ public class PlaylistFragment extends BaseListInfoFragment { onUnrecoverableError(exception, UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId), - uiHandler.getUrl(), + url, errorId); return true; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index ee76966ff..503bc86ee 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -29,12 +29,15 @@ import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; +import com.facebook.stetho.common.ListUtil; + import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.database.history.model.SearchHistoryEntry; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchExtractor; @@ -55,6 +58,7 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.net.SocketException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Queue; @@ -69,6 +73,8 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.PublishSubject; +import static java.util.Arrays.asList; + import static org.schabi.newpipe.util.AnimationUtils.animateView; public class SearchFragment @@ -95,10 +101,19 @@ public class SearchFragment @State protected int serviceId = Constants.NO_SERVICE_ID; + + // this three represet the current search query @State - protected SearchQIHandler searchQuery; + protected String searchString; @State - protected SearchQIHandler lastSearchedQuery; + protected String[] contentFilter; + @State + protected String sortFilter; + + // these represtent the last search + @State + protected String lastSearchedString; + @State protected boolean wasSearchFocused = false; @@ -130,11 +145,11 @@ public class SearchFragment /*////////////////////////////////////////////////////////////////////////*/ - public static SearchFragment getInstance(int serviceId, SearchQIHandler query) { + public static SearchFragment getInstance(int serviceId, String searchString) { SearchFragment searchFragment = new SearchFragment(); - searchFragment.setQuery(serviceId, query); + searchFragment.setQuery(serviceId, searchString, new String[0], ""); - if (!TextUtils.isEmpty(query.getSearchString())) { + if (!TextUtils.isEmpty(searchString)) { searchFragment.setSearchOnResume(); } @@ -212,12 +227,12 @@ public class SearchFragment "", R.string.general_error)); } - if (!TextUtils.isEmpty(searchQuery.getSearchString())) { + if (!TextUtils.isEmpty(searchString)) { if (wasLoading.getAndSet(false)) { - search(searchQuery); + search(searchString, contentFilter, sortFilter); } else if (infoListAdapter.getItemsList().size() == 0) { if (savedState == null) { - search(searchQuery); + search(searchString, contentFilter, sortFilter); } else if (!isLoading.get() && !wasSearchFocused) { infoListAdapter.clearStreamItemList(); showEmptyState(); @@ -227,7 +242,7 @@ public class SearchFragment if (suggestionDisposable == null || suggestionDisposable.isDisposed()) initSuggestionObserver(); - if (TextUtils.isEmpty(searchQuery.getSearchString()) || wasSearchFocused) { + if (TextUtils.isEmpty(searchString) || wasSearchFocused) { showKeyboardSearch(); showSuggestionsPanel(); } else { @@ -257,8 +272,8 @@ public class SearchFragment switch (requestCode) { case ReCaptchaActivity.RECAPTCHA_REQUEST: if (resultCode == Activity.RESULT_OK - && !TextUtils.isEmpty(searchQuery.getSearchString())) { - search(searchQuery); + && !TextUtils.isEmpty(searchString)) { + search(searchString, contentFilter, sortFilter); } else Log.e(TAG, "ReCaptcha failed"); break; @@ -305,18 +320,9 @@ public class SearchFragment @Override public void onSaveInstanceState(Bundle bundle) { - try { - searchQuery = searchEditText != null - ? NewPipe.getService(serviceId).getSearchQIHFactory().fromQuery( - searchEditText.getText().toString()) - : searchQuery; - } catch (Exception e) { - ErrorActivity.reportError(getActivity(), e, getActivity().getClass(), - getActivity().findViewById(android.R.id.content), - ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, - "", - "", R.string.general_error)); - } + searchString = searchEditText != null + ? searchEditText.getText().toString() + : searchString; super.onSaveInstanceState(bundle); } @@ -326,12 +332,11 @@ public class SearchFragment @Override public void reloadContent() { - if (!TextUtils.isEmpty(searchQuery.getSearchString()) + if (!TextUtils.isEmpty(searchString) || (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) { - search(!TextUtils.isEmpty(searchQuery.getSearchString()) - ? searchQuery - : getSearchQuery(searchEditText.getText().toString(), - new ArrayList<>(0), "")); + search(!TextUtils.isEmpty(searchString) + ? searchString + : searchEditText.getText().toString(), new String[0], ""); } else { if (searchEditText != null) { searchEditText.setText(""); @@ -387,14 +392,21 @@ public class SearchFragment private TextWatcher textWatcher; private void showSearchOnStart() { - if (DEBUG) Log.d(TAG, "showSearchOnStart() called, searchQuery → " + searchQuery+", lastSearchedQuery → " + lastSearchedQuery); - searchEditText.setText(searchQuery.getSearchString()); + if (DEBUG) Log.d(TAG, "showSearchOnStart() called, searchQuery → " + + searchString + + ", lastSearchedQuery → " + + lastSearchedString); + searchEditText.setText(searchString); - if (TextUtils.isEmpty(searchQuery.getSearchString()) || TextUtils.isEmpty(searchEditText.getText())) { + if (TextUtils.isEmpty(searchString) || TextUtils.isEmpty(searchEditText.getText())) { searchToolbarContainer.setTranslationX(100); searchToolbarContainer.setAlpha(0f); searchToolbarContainer.setVisibility(View.VISIBLE); - searchToolbarContainer.animate().translationX(0).alpha(1f).setDuration(200).setInterpolator(new DecelerateInterpolator()).start(); + searchToolbarContainer.animate() + .translationX(0) + .alpha(1f) + .setDuration(200) + .setInterpolator(new DecelerateInterpolator()).start(); } else { searchToolbarContainer.setTranslationX(0); searchToolbarContainer.setAlpha(1f); @@ -435,7 +447,7 @@ public class SearchFragment suggestionListAdapter.setListener(new SuggestionListAdapter.OnSuggestionItemSelected() { @Override public void onSuggestionItemSelected(SuggestionItem item) { - search(getSearchQuery(item.query, new ArrayList<>(), "")); + search(item.query, new String[0], ""); searchEditText.setText(item.query); } @@ -476,7 +488,7 @@ public class SearchFragment if (event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) { - search(getSearchQuery(searchEditText.getText().toString(), new ArrayList<>(), "")); + search(searchEditText.getText().toString(), new String[0], ""); return true; } return false; @@ -557,10 +569,12 @@ public class SearchFragment @Override public boolean onBackPressed() { - if (suggestionsPanel.getVisibility() == View.VISIBLE && infoListAdapter.getItemsList().size() > 0 && !isLoading.get()) { + if (suggestionsPanel.getVisibility() == View.VISIBLE + && infoListAdapter.getItemsList().size() > 0 + && !isLoading.get()) { hideSuggestionsPanel(); hideKeyboardSearch(); - searchEditText.setText(lastSearchedQuery.getSearchString()); + searchEditText.setText(lastSearchedString); return true; } return false; @@ -576,8 +590,8 @@ public class SearchFragment final Observable observable = suggestionPublisher .debounce(SUGGESTIONS_DEBOUNCE, TimeUnit.MILLISECONDS) - .startWith(searchQuery != null - ? searchQuery.getSearchString() + .startWith(searchString != null + ? searchString : "") .filter(searchString -> isSuggestionsEnabled); @@ -650,17 +664,17 @@ public class SearchFragment // no-op } - private void search(final SearchQIHandler query) { - if (DEBUG) Log.d(TAG, "search() called with: query = [" + query + "]"); - if (query.getSearchString().isEmpty()) return; + private void search(final String searchString, String[] contentFilter, String sortFilter) { + if (DEBUG) Log.d(TAG, "search() called with: query = [" + searchString + "]"); + if (searchString.isEmpty()) return; try { - final StreamingService service = NewPipe.getServiceByUrl(query.getUrl()); + final StreamingService service = NewPipe.getServiceByUrl(searchString); if (service != null) { showLoading(); disposables.add(Observable .fromCallable(() -> - NavigationHelper.getIntentByLink(activity, service, query.getUrl())) + NavigationHelper.getIntentByLink(activity, service, searchString)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(intent -> { @@ -674,21 +688,20 @@ public class SearchFragment // Exception occurred, it's not a url } - lastSearchedQuery = query; - searchQuery = query; - currentPageUrl = ""; + lastSearchedString = this.searchString; + this.searchString = searchString; infoListAdapter.clearStreamItemList(); hideSuggestionsPanel(); hideKeyboardSearch(); - historyRecordManager.onSearched(serviceId, query.getSearchString()) + historyRecordManager.onSearched(serviceId, searchString) .observeOn(AndroidSchedulers.mainThread()) .subscribe( ignored -> {}, error -> showSnackBarError(error, UserAction.SEARCHED, - NewPipe.getNameOfService(serviceId), query.getSearchString(), 0) + NewPipe.getNameOfService(serviceId), searchString, 0) ); - suggestionPublisher.onNext(query.getSearchString()); + suggestionPublisher.onNext(searchString); startLoading(false); } @@ -697,11 +710,16 @@ public class SearchFragment super.startLoading(forceLoad); if (disposables != null) disposables.clear(); if (searchDisposable != null) searchDisposable.dispose(); - searchDisposable = ExtractorHelper.searchFor(serviceId, searchQuery, contentCountry) + searchDisposable = ExtractorHelper.searchFor(serviceId, + searchString, + Arrays.asList(contentFilter), + sortFilter, + contentCountry) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((searchResult, throwable) -> isLoading.set(false)) .subscribe(this::handleResult, this::onError); + } @Override @@ -709,8 +727,13 @@ public class SearchFragment isLoading.set(true); showListFooter(true); if (searchDisposable != null) searchDisposable.dispose(); - searchDisposable = ExtractorHelper.getMoreSearchItems(serviceId, - searchQuery, nextPageUrl, contentCountry) + searchDisposable = ExtractorHelper.getMoreSearchItems( + serviceId, + searchString, + asList(contentFilter), + sortFilter, + nextPageUrl, + contentCountry) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((nextItemsResult, throwable) -> isLoading.set(false)) @@ -737,31 +760,18 @@ public class SearchFragment this.filterItemCheckedId = item.getItemId(); item.setChecked(true); - searchQuery = getSearchQuery(searchQuery.getSearchString(), contentFilter, ""); + this.contentFilter = new String[] {contentFilter.get(0)}; - if (!TextUtils.isEmpty(searchQuery.getSearchString())) { - search(searchQuery); + if (!TextUtils.isEmpty(searchString)) { + search(searchString, this.contentFilter, sortFilter); } } - private void setQuery(int serviceId, SearchQIHandler searchQuery) { + private void setQuery(int serviceId, String searchString, String[] contentfilter, String sortFilter) { this.serviceId = serviceId; - this.searchQuery = searchQuery; - } - - private SearchQIHandler getSearchQuery(String searchString, - List contentFilter, - String sortFilter) { - try { - return service.getSearchQIHFactory() - .fromQuery(searchString, contentFilter, sortFilter); - } catch (Exception e) { - onUnrecoverableError(e, UserAction.SEARCHED, - service.getServiceInfo().getName(), - searchQuery.getSearchString(), - R.string.general_error); - } - return searchQuery; + this.searchString = searchString; + this.contentFilter = contentfilter; + this.sortFilter = sortFilter; } /*////////////////////////////////////////////////////////////////////////// @@ -786,7 +796,7 @@ public class SearchFragment ? R.string.parsing_error : R.string.general_error; onUnrecoverableError(exception, UserAction.GET_SUGGESTIONS, - NewPipe.getNameOfService(serviceId), searchQuery.getSearchString(), errorId); + NewPipe.getNameOfService(serviceId), searchString, errorId); } /*////////////////////////////////////////////////////////////////////////// @@ -814,10 +824,12 @@ public class SearchFragment public void handleResult(@NonNull SearchInfo result) { if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.SEARCHED, - NewPipe.getNameOfService(serviceId), searchQuery.getSearchString(), 0); + NewPipe.getNameOfService(serviceId), searchString, 0); } - lastSearchedQuery = searchQuery; + lastSearchedString = searchString; + nextPageUrl = result.getNextPageUrl(); + currentPageUrl = result.getUrl(); if (infoListAdapter.getItemsList().size() == 0) { if (!result.getRelatedItems().isEmpty()) { @@ -841,7 +853,7 @@ public class SearchFragment if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.SEARCHED, NewPipe.getNameOfService(serviceId) - , "\"" + searchQuery + "\" → page: " + nextPageUrl, 0); + , "\"" + searchString + "\" → page: " + nextPageUrl, 0); } super.handleNextItems(result); } @@ -858,7 +870,7 @@ public class SearchFragment ? R.string.parsing_error : R.string.general_error; onUnrecoverableError(exception, UserAction.SEARCHED, - NewPipe.getNameOfService(serviceId), searchQuery.getSearchString(), errorId); + NewPipe.getNameOfService(serviceId), searchString, errorId); } return true; diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index a7e16a5f1..02eabd9ef 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -117,9 +117,7 @@ public final class BookmarkFragment NavigationHelper.openPlaylistFragment( fragmentManager, entry.getServiceId(), - NewPipe.getService(entry.getServiceId()) - .getPlaylistUIHFactory() - .fromUrl(entry.getUrl()), + entry.getUrl(), entry.getName()); } } catch (Exception e) { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java index 9bbb5f517..c194069fb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java @@ -324,9 +324,7 @@ public class SubscriptionFragment extends BaseStateFragment searchFor(final int serviceId, - final SearchQIHandler query, + final String searchString, + final List contentFilter, + final String sortFilter, final String contentCountry) { checkServiceId(serviceId); return Single.fromCallable(() -> - SearchInfo.getInfo(NewPipe.getService(serviceId).getSearchExtractor(query, contentCountry))); + SearchInfo.getInfo(NewPipe.getService(serviceId), + NewPipe.getService(serviceId) + .getSearchQIHFactory() + .fromQuery(searchString, contentFilter, sortFilter), + contentCountry)); } public static Single getMoreSearchItems(final int serviceId, - final SearchQIHandler query, - final String pageUrl, - final String contentCountry) { + final String searchString, + final List contentFilter, + final String sortFilter, + final String pageUrl, + final String contentCountry) { checkServiceId(serviceId); return Single.fromCallable(() -> - SearchInfo.getMoreItems(NewPipe.getService(serviceId), query, contentCountry, pageUrl)); + SearchInfo.getMoreItems(NewPipe.getService(serviceId), + NewPipe.getService(serviceId) + .getSearchQIHFactory() + .fromQuery(searchString, contentFilter, sortFilter), + contentCountry, + pageUrl)); } @@ -225,7 +237,6 @@ public final class ExtractorHelper { serviceId == -1 ? "none" : NewPipe.getNameOfService(serviceId), url + (optionalErrorMessage == null ? "" : optionalErrorMessage), errorId)); } }); - } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 0344e5e79..2271d79e1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -286,9 +286,11 @@ public class NavigationHelper { return fragmentManager.popBackStackImmediate(SEARCH_FRAGMENT_TAG, 0); } - public static void openSearchFragment(FragmentManager fragmentManager, int serviceId, SearchQIHandler query) { + public static void openSearchFragment(FragmentManager fragmentManager, + int serviceId, + String searchString) { defaultTransaction(fragmentManager) - .replace(R.id.fragment_holder, SearchFragment.getInstance(serviceId, query)) + .replace(R.id.fragment_holder, SearchFragment.getInstance(serviceId, searchString)) .addToBackStack(SEARCH_FRAGMENT_TAG) .commit(); } @@ -317,18 +319,25 @@ public class NavigationHelper { .commit(); } - public static void openChannelFragment(FragmentManager fragmentManager, int serviceId, ListUIHandler uiHandler, String name) { + public static void openChannelFragment( + FragmentManager fragmentManager, + int serviceId, + String url, + String name) { if (name == null) name = ""; defaultTransaction(fragmentManager) - .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, uiHandler, name)) + .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, url, name)) .addToBackStack(null) .commit(); } - public static void openPlaylistFragment(FragmentManager fragmentManager, int serviceId, ListUIHandler uiHandler, String name) { + public static void openPlaylistFragment(FragmentManager fragmentManager, + int serviceId, + String url, + String name) { if (name == null) name = ""; defaultTransaction(fragmentManager) - .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, uiHandler, name)) + .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, url, name)) .addToBackStack(null) .commit(); } @@ -470,7 +479,8 @@ public class NavigationHelper { switch (linkType) { case STREAM: - rIntent.putExtra(VideoDetailFragment.AUTO_PLAY, PreferenceManager.getDefaultSharedPreferences(context) + rIntent.putExtra(VideoDetailFragment.AUTO_PLAY, + PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.autoplay_through_intent_key), false)); break; } diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java index d86f27f2f..e7e52f393 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java @@ -5,7 +5,6 @@ import android.preference.PreferenceManager; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; -import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.ServiceList; From e386bdd6b3c9355f6d5b501da133886fe5824e91 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Tue, 10 Jul 2018 15:44:58 +0000 Subject: [PATCH 101/363] Translated using Weblate (Greek) Currently translated at 19.7% (75 of 379 strings) --- app/src/main/res/values-el/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a03f32a38..8f383b580 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -99,4 +99,6 @@ Άδειες Ιστορικό Ιστορικό + Εμφάνιση πληροφοριών + From 4638149ad016f27af8e8739d99dfc92fd8f8683d Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Wed, 11 Jul 2018 18:51:45 +0000 Subject: [PATCH 102/363] Translated using Weblate (Flemish) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 65781b6a3..3c15cf226 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -454,4 +454,8 @@ Afspelen in achtergrond Afspelen in pop-up - +Doorspoelen tijdens stilte + Stap + Standaardwaarden herstellen + + From e008fd21a4bbb9c85ba73615cd471c60e358f9bb Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Sat, 14 Jul 2018 18:49:43 +0000 Subject: [PATCH 103/363] Translated using Weblate (Arabic) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-ar/strings.xml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8711f2712..b2aa06f13 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -463,7 +463,7 @@ ضوابط سرعة التشغيل سرعة الأداء تردد الصوت - "النزع (قد يسبب تشويه)" + نزع الإرتباط (قد يسبب تشويه) تعديل الايقاع Nightcore هل تريد أيضا استيراد الإعدادات؟ @@ -478,4 +478,14 @@ لا حدود الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول - + تسريع إلى الأمام أثناء الصمت + خطوة + إعادة تعيين + + تصغير عند تبديل التطبيق + الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s + لاشيء + تصغير إلى مشغل الخلفية + تصغير إلى مشغل منبثق + + From 14e0dcb085f826e636003e1fe1f9371bb1099bdc Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 15 Jul 2018 21:21:09 +0200 Subject: [PATCH 104/363] fix names from UIH to LinkHandler --- app/build.gradle | 2 +- .../main/java/org/schabi/newpipe/MainActivity.java | 1 - .../newpipe/fragments/list/BaseListFragment.java | 2 -- .../newpipe/fragments/list/BaseListInfoFragment.java | 4 ++-- .../fragments/list/channel/ChannelFragment.java | 2 +- .../newpipe/fragments/list/kiosk/KioskFragment.java | 12 ++++++------ .../fragments/list/playlist/PlaylistFragment.java | 2 +- .../fragments/list/search/SearchFragment.java | 2 -- .../org/schabi/newpipe/util/NavigationHelper.java | 4 ++-- 9 files changed, 13 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 10aaf91a0..014f379f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:a1aaca1be' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:8ee068fd98' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index f43d413e9..191332e19 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -49,7 +49,6 @@ import android.widget.TextView; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index c4702046d..1db12bba9 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -16,11 +16,9 @@ import android.view.View; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.extractor.uih.ListUIHandler; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index 9c3afb7f6..e702c602f 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -9,8 +9,8 @@ import android.view.View; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.ListInfo; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.uih.ListUIHandler; -import org.schabi.newpipe.extractor.uih.UIHandler; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.linkhandler.LinkHandler; import org.schabi.newpipe.util.Constants; import java.util.Queue; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 041b550ed..42ba8e0ac 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -33,7 +33,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.extractor.uih.ListUIHandler; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 66ccfe6c3..114e92e43 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -18,9 +18,9 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; -import org.schabi.newpipe.extractor.uih.ListUIHFactory; -import org.schabi.newpipe.extractor.uih.ListUIHandler; -import org.schabi.newpipe.extractor.uih.UIHFactory; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; @@ -72,10 +72,10 @@ public class KioskFragment extends BaseListInfoFragment { throws ExtractionException { KioskFragment instance = new KioskFragment(); StreamingService service = NewPipe.getService(serviceId); - ListUIHFactory kioskUIHFactory = service.getKioskList() - .getUIHFactoryByType(kioskId); + ListLinkHandlerFactory kioskLinkHandlerFactory = service.getKioskList() + .getListLinkHandlerFactoryByType(kioskId); instance.setInitialData(serviceId, - kioskUIHFactory.fromId(kioskId).getUrl(), kioskId); + kioskLinkHandlerFactory.fromId(kioskId).getUrl(), kioskId); instance.kioskId = kioskId; return instance; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 2f60276d7..b7a42791c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -30,7 +30,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.extractor.uih.ListUIHandler; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 503bc86ee..f7ae11fcb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -37,12 +37,10 @@ import org.schabi.newpipe.database.history.model.SearchHistoryEntry; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.search.SearchInfo; -import org.schabi.newpipe.extractor.uih.SearchQIHandler; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.list.BaseListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 2271d79e1..85367e2a5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -31,8 +31,8 @@ import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; -import org.schabi.newpipe.extractor.uih.ListUIHandler; -import org.schabi.newpipe.extractor.uih.SearchQIHandler; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; From 0ff65b5496885a6d66be68578d86c81c56110c77 Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Sat, 14 Jul 2018 19:00:55 +0000 Subject: [PATCH 105/363] Translated using Weblate (Arabic) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b2aa06f13..b390a8306 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -359,7 +359,7 @@ مُزامَنة - تنزيل الملف البث. + تنزيل ملف البث الإشارات مرجعية استعمال التقديم السريع الغير دقيق From 88d354b08b83eb3ac0e1845954b124d74563307e Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Mon, 16 Jul 2018 11:11:56 +0000 Subject: [PATCH 106/363] Translated using Weblate (Arabic) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-ar/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b390a8306..839a296aa 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -2,7 +2,7 @@ جاري التشغيل في الخلفية إلغاء - إختر متصفح + اختر المتصفح مظلم صيغة الصوت الإفتراضية الدقة الإفتراضية @@ -61,10 +61,10 @@ تعذرت عملية تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو اضغط بحث للبدء - إشتراك + اشتراك مشترك الرئيسية - الإشتراكات + الاشتراكات ما الجديد @@ -84,11 +84,11 @@ عن التطبيق التاريخ التاريخ - فتح في وضع النوافذ المنبثقة - "بعض القرارات لن يكون الصوت عند تمكين هذا الخيار " + فتح في وضع النافذة المنبثقة + "بعض الخيارات الدقة لن تحتوي على صوت عند تمكين هذا الخيار " وضع النوافذ المنبثقة NewPipe - تم إلغاء اشتراك القناة - تعذر تغيير في الاشتراك + تم إلغاء الاشتراك في القناة + تعذر تغيير حالة الاشتراك تعذر تحديث الاشتراك نافذة @@ -305,7 +305,7 @@ مرة واحدة فقط العنوان خاطئ - لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله) + لم يتم العثور على مشغل الفديو (يمكنك تثبيت VLC لتشغيله) استيراد قاعدة البيانات تصدير قاعدة البيانات "سيقوم بالكتابة على سجل التاريخ والاشتراكات الحالية " From 573fa8870c25da01f3119a465682f2c8326d703c Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Mon, 16 Jul 2018 11:20:19 +0000 Subject: [PATCH 107/363] Translated using Weblate (Arabic) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-ar/strings.xml | 96 +++++++++++++------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 839a296aa..1d1a0ea1e 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,6 +1,6 @@ - جاري التشغيل في الخلفية + يتم التشغيل في الخلفية إلغاء اختر المتصفح مظلم @@ -25,7 +25,7 @@ تطبيق Kore غير موجود. هل تريد تثبيته ؟ مضيء صور معاينة الفيديو - M4A — جودة أفضل + جودة أفضل — M4A خطأ في الشبكة الفيديو التالي لا يوجد مشغل فيديو. هل تريد تثبيت VLC ؟ @@ -42,7 +42,7 @@ الفيديو والصوتيات مشاركة مشاركة بواسطة - عرض\'مقاطع\'الفيديو\'التالية\'و\'المشابهة\' + عرض الفديوهات \'التالية\'و\'المماثلة\' عرض خيار لتشغيل الفيديو بواسطة Kodi Media Center عرض خيار التشغيل بواسطة Kodi السمة @@ -72,7 +72,7 @@ تشغيل تلقائي اسود التاريخ وذاكرة التخزين المؤقت - التأريخ و ذاكرة التخزين المؤقتة + التاريخ و ذاكرة التخزين المؤقتة المحتوى التنزيلات التنزيلات @@ -94,14 +94,14 @@ نافذة تشغيل مقطع الفيديو عند إستدعاء NewPipe من تطبيق آخر - "دقة النوافذ المنبثقة الافتراضية " + الدقة الافتراضية لنوافذ المنبثقة "عرض أعلى جودة " بعض الأجهزة فقط تدعم تشغيل مقاطع الفيديو 2K / 4K تنسيق الفيديو الافتراضي تذكر حجم النافذة و وضعها - تذكر آخر حجم ومكان للنافذة + تذكر آخر مكان و حجم للنافذة المنبثقة اعدادات إيماءة المشغل - استخدم إيماءات للتحكم في سطوع وحجم المشغل + استخدم إيماءات التحكم في سطوع وصوت المشغل اقتراحات البحث عرض الاقتراحات عند البحث سجل البحث @@ -114,7 +114,7 @@ المشغل السلوك المنبثق - التشغيل في الوضع المنبثق + يتم التشغيل في الوضع المنبثق تم وضعه على قائمة الانتظار في مشغل الخلفية تم وضعه على قائمة الانتظار في مشغل النافذة المنبثقة عرض المحتوى المقيّد بحسب العُمر @@ -170,9 +170,9 @@ استخدام المشغل القديم المشغل القديم المدمج في إطار Mediaframework - ك - م - ب + الف + مليون + بليون صفر لا تقم با الإختيار (في بعض اللغات) لأنها ليست \"حالة خاصة\" للأندرويد @@ -186,14 +186,14 @@ لاتوجد مشاهدات لاتوجد فديوهات - بداية + تشغيل إيقاف شغل حذف التوقيع مهمة جديدة - حسنا + حسناً اسم الملف العمليات @@ -238,7 +238,7 @@ البحث - شاهد + تمت مشاهدته تم تعطيل السجل التاريخ فارغ تم مسح التاريخ @@ -251,7 +251,7 @@ صفحة الخلاصة صفحة القناة حدد قناة - لم يتم الاشتراك في القناة بعد + لم يتم الاشتراك في اي قناة بعد الترند أفضل 50 جديد & وساخن @@ -265,9 +265,9 @@ تحدي ريكابتشا اضغط للإدراج بقائمة الانتظار - لم تتم المشاهدة + لاتوجد مشاهدة %s مشاهدة - "اثنان مشاهدات " + مشاهدتين %s مشاهدات كثيرة %s عدد المشاهدات %s أقصى مشاهدات @@ -276,10 +276,10 @@ صفر واحد - اثنان - قليل - عدد كثير - "أخرى " + %s اثنان + %s قليل + %s عدد كثير + "%s أخرى " إعادة طلب كلمة التحقق @@ -289,19 +289,19 @@ حدد كشك كشك - إدراج بقائمة الانتظار على خلفية + إدراج بقائمة الانتظار في مشغل الخلفية إدراج بقائمة الانتظار على المنبثقة ابدأ هنا على خلفية المصدر المحتوى الإفتراضي حسب البلد تغيير الإتجاه - الإنتقال إلى الخلفية - الإنتقال إلى نافذة منبثقة - التحول إلى الرئيسية + الإنتقال إلى التشغيل في الخلفية + الإنتقال إلى التشغيل في النافذة المنبثقة + الإنتقال إلى الرئيسية الخدمة فتح الدرج إغلاق الدرج - دائمًا + دائماً مرة واحدة فقط العنوان خاطئ @@ -334,7 +334,7 @@ مشغل الفديو - السؤال دائمًا + السؤال دائماً الحصول على المعلومات … تحميل المحتوى المطلوب @@ -342,14 +342,14 @@ إنشاء قائمة تشغيل جديدة حذف قائمة التشغيل "إعادة تسمية قائمة التشغيل " - التسمية + الأسم إضافة إلى قائمة تشغيل هل تريد حذف قائمة التشغيل هذه ؟ قائمة التشغيل التي تم إنشاؤها تمت إضافتها إلى قائمة التشغيل لا يمكن حذف قائمة التشغيل - ملئ + ملئ الشاشة تكبير حجم خط التسمية @@ -395,32 +395,32 @@ تم محو ذاكرة التخزين المؤقت للبيانات الوصفية وضع البث القادم تلقائيا في قائمة الإنتظار رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار. - إضافة إلى قائمة التشغيل كصورة مصغرة + إضافة صورة مصغرة إلى قائمة التشغيل قائمة التشغيل المخزنة تم تغيير الصورة المصغرة لقائمة التشغيل بدون تسميات توضيحية تسميات توضيحية - تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق ليصبح ساري المفعول. + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول. تمكين LeakCanary - قد يتسبب مراقبة في تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات + قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات تقرير الأخطاء خارج دورة الحياة فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها محو سجل المشاهدة - احذف محفوظات التدفقات التي تم تشغيلها. + احذف محفوظات الفديوهات التي تم تشغيلها. حذف سجل المشاهدة بالكامل. - سجل المشاهدة المحذوف. + سجل المشاهدة محذوف. محو سجل البحث يحذف تاريخ البحث عن الكلمات الرئيسية. حذف محفوظات البحث بالكامل. سجل البحث المحذوف. المشغل الخارجي لا يدعم هذه الأنواع من الروابط مصدر ملف / مصدر غير صالح - الملف غير موجود أو ليس لديه الإذن الكافي للقراءة أو الكتابة إليه + الملف غير موجود أو ليس لديك الإذن الكافي للقراءة أو الكتابة إليه لا توجد تدفقات متاحة للتنزيل تم حذف عنصر واحد. @@ -433,7 +433,7 @@ آخر ما تم تشغيله الأكثر تشغيلا - هذا سوف يتجاوز الإعداد الحالي الخاص بك. + هذا سوف يتجاوز الإعدادت الحالية الخاصة بك. طريقة \'التشغيل\' المفضلة "الإجراء الافتراضي عند فتح المحتوى — %s" @@ -445,19 +445,19 @@ تعذر استيراد الاشتراكات لا يمكن تصدير الاشتراكات - استيراد اشتراكات YouTube عن طريق تنزيل ملف التصدير: -\n -\n1. انتقل إلى عنوان URL هذا: %1$s -\n2. تسجيل الدخول عندما يتطلب -\n3. يجب أن يبدأ تنزيل (وهذا ملف التصدير) - قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: -\n -\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) -\n2. انتقل إلى عنوان URL هذا: %1$s -\n3. تسجيل الدخول عندما يتطلب + استيراد اشتراكات YouTube عن طريق تنزيل ملف التصدير: +\n +\n1. انتقل إلى عنوان URL هذا: %1$s +\n2. تسجيل الدخول عندما يطلب منك +\n3. يجب أن يبدأ التنزيل (وهذا ملف التصدير) + قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: +\n +\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) +\n2. انتقل إلى عنوان URL هذا: %1$s +\n3. تسجيل الدخول عندما يطلب منك \n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. - ضع في اعتبارك أن هذه العملية يمكن أن تكون باهظة الثمن. -\n + ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. +\n \nهل تريد الاستمرار؟ ضوابط سرعة التشغيل From 4ef01ef745c9c772be814d76ea0e80a9d0fa1e2b Mon Sep 17 00:00:00 2001 From: Andrea Troiano Date: Wed, 18 Jul 2018 08:24:04 +0000 Subject: [PATCH 108/363] Translated using Weblate (Italian) Currently translated at 100,0% (379 of 379 strings) --- app/src/main/res/values-it/strings.xml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 2b2431b09..18bbc6d3e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -454,7 +454,7 @@ Controlli della velocità di riproduzione Tempo Tono - Slega (può causare distorsione) + Scollega (può causare distorsione) Nightcore Valore predefinito Nessun flusso disponibile per il download @@ -491,4 +491,14 @@ Senza limiti Limita la risoluzione quando si utilizzano dati mobili - + Avanzamento veloce durante il silenzio + Step + Reset + + Minimizza al cambio applicazione + Azione quando si passa ad un\'altra applicazione dal lettore video principale — %s + Nessuna + Minimizza al lettore in sottofondo + Minimizza al lettore popup + + From 68d5b5969398842be627abc4b4168d197b74e5fb Mon Sep 17 00:00:00 2001 From: Next Hubs Date: Tue, 17 Jul 2018 10:07:01 +0000 Subject: [PATCH 109/363] Translated using Weblate (Urdu) Currently translated at 5.0% (19 of 379 strings) --- app/src/main/res/values-ur/strings.xml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 74e45bad2..c653cf6e6 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -4,10 +4,19 @@ کوشائع ہوا انسٹال منسوخ کریں - اشتراک کریں + بانٹیں ڈاؤن لوڈکریں تلاش کریں - نتائج دکھارہاہےبرائے + کیا آپ کا مطلب تھا انٹرنیٹ میں کھولیں ترتیبات + کوئیstream پلیئر نہیں ملا.کیا آپ VLC انسٹال کرنا چاہتے ہیں؟ + کوئیstream پلیئر نہیں ملا.(آپ VLC انسٹال کر سکتے ہیے) + PopUp موڈ میں کھولیں + سٹریم فائل ڈاؤن لوڈ کریں. + کے ساتھ بانٹیں + Internet Browser منتخب کریں +\n + rotation کرو + external video player استعمال کریں From 39e04de208839cd29e9e0353582037a8e5a732b8 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Wed, 18 Jul 2018 15:05:49 +0200 Subject: [PATCH 110/363] show radio pin for content filter again --- .../newpipe/fragments/list/search/SearchFragment.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index f7ae11fcb..77274c96a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -358,9 +358,17 @@ public class SearchFragment supportActionBar.setDisplayHomeAsUpEnabled(true); } + int itemId = 0; + boolean isFirstItem = true; for(String filter : service.getSearchQIHFactory().getAvailableContentFilter()) { - menu.add(filter); + MenuItem item = menu.add(1, itemId++, 0, filter); + if(isFirstItem) { + item.setChecked(true); + isFirstItem = false; + } } + menu.setGroupCheckable(1, true, true); + restoreFilterChecked(menu, filterItemCheckedId); } From 48b6f01b131b505b33bf5c15f5f84d9057205451 Mon Sep 17 00:00:00 2001 From: D D Date: Tue, 17 Jul 2018 13:17:57 +0000 Subject: [PATCH 111/363] Translated using Weblate (Bulgarian) Currently translated at 97.8% (371 of 379 strings) --- app/src/main/res/values-bg/strings.xml | 343 +++++++++++++++++++------ 1 file changed, 258 insertions(+), 85 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 03c210679..34e7867a9 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,14 +1,14 @@ -Натисни на търсене за да започнеш +Докоснете търсачката, за да започнете %1$s гледания Публикувано на %1$s Не е намерен стрийм плейър. Желаете ли да инсталирате VLC? Инсталирай - Затвори - Отвори в браузъра - Отвори в подпрозорец + Отмени + Отвори в браузър + Отвори в прозорец Сподели - Сваляне + Изтегли Търси Настройки Може би имахте в предвид: %1$s ? @@ -16,81 +16,81 @@ Избери браузър ориентация Използвай външен видео плейър - Някои резолюции няма да имат вграден аудио поток ако изберете тази опция + Някои резолюции няма да имат вграден аудио поток, ако тази опция е избрана Използвай външен аудио плейър - Режим малък прозорец на NewPipe + NewPipe в прозорец Абониране Абониран Премахнат абонамент за канала - Не мога да променя абонаментите - Не мога да обновя абонаментите + Неуспешна промяна на абонамента + Неуспешно обновление на абонамента Абонаменти - Новости + Обновления - Фон - Подпрозорец + Във фонов режим + В прозорец - Локация за запис на клиповете - Място за съхранение на свалени клипове - Въведи път за съхранение на свалени клипове + Директория за изтегляне на видео + Папка за съхранение на изтеглените видеота + Въведете път за съхранение на изтеглените видеота - Локация за запис на аудио - Път за съхранение на свалено аудио - Въведи път за съхранение на свалено аудио + Директория за изтегляне на аудио + Папка за съхранение на изтеглено аудио + Въведете път за съхранение на изтеглено аудио Автоматично възпроизвеждане - Автоматично въпроизвеждане на видео, когато NewPipe е повикан от друго приложение + Въпроизвежда видео, когато NewPipe е повикан от друго приложение Резолюция по подразбиране - Резолюция по подразбиране на подпрозореца + Резолюция по подразбиране на прозореца Покажи по-високи резолюции Само някои устройства поддържат възпроизвеждане на 2K/4K клипове Въпроизвеждане с Kodi - Приложението Kore не е намерено. Желаете ли да го инсталирате? - Покажи опция \"Въпроизвеждане с Kodi\" - Показване на опция за въпроизвеждане на видео чрез Kodi media center + Приложението „Kore“ не е намерено. Желаете ли да го инсталирате? + Покажи „Възпроизвеждане с Kodi“ + Показване на опция за възпроизвеждане на видео чрез „Kodi media center“ Аудио Аудио формат по подразбиране Видео формат по подразбиране WebM — свободен формат M4A — по-добро качество - Тема + Тема на външния вид Светла Тъмна Черна - Помни размера и позицията на подпрозореца - Запомни последния размер и позиция на подпрозореца + Помни размера и позицията на прозореца + Използвай размера и позицията на прозореца от предишния път Контролиране на плейъра чрез жестове - Използвай жестове за да контролираш яркостта и силата на звука на плейъра + Позволи използване на жестове за контрол на яркостта и силата на звука на плейъра Предложения за търсене - Показвай предположения по време на търсене + Показвай предложения за търсене История на търсенията Съхранявай заявките за търсене локално История и кеш-памет - Следи изгледаните клипове - Поднови клип при възобновяване на фокуса - Продължава въпроизвеждането след прекъсване (например, телефонно обаждане) - Свалени - Следващ клип - Показвай „следващи“ и „подобни“ клипове - Показвай поле със съвет \"Задръж за добавяне\" - Неподдържан URL + Запаметявай кои видеота са гледани + Възобнови при връщане на фокус + Продължавай възпроизвеждането след прекъсване (например телефонно обаждане) + Изтегли + Следващо видео + Показвай „следващ“ и „подобни“ + Показвай съвет „задръж за добавяне“ + Непознат URL Език на съдържанието по подразбиране Плейър Поведение Видео & Аудио История и кеш-памет - Подпрозорец + Нов прозорец Външност Други - Въпроизвеждане във фонов режим - Въпроизвеждане в подпрозорец + Възпроизвеждане във фонов режим + Възпроизвеждане в подпрозорец Включен в опашката на фоновия плейър - Включен в опашката за възпроизвеждане в подпрозорец + Включен в опашката в нов прозорец Възпроизвеждане Съдържание - Покажи съдържание с ограничение във възрастта + Покажи съдържание за възрастни Съдържание за възрастни. Разрешаването на такова съдържание става от Настройки. на живо Изтегляния @@ -111,17 +111,17 @@ Възпроизведи всички Известия от NewPipe - Известия за фоновия плейър и плейъра на подпрозореца на NewPipe + Известия за фоновия плейър и плейъра в отделен прозорец на NewPipe [Неизвестен] Грешка Проблем с мрежата Не мога да заредя всички миниатюри - Не мога да интерпретирам правилно уебсайта - Не мога да интерпретирам изцяло правилно уебсайта + Неуспешно пресъздаване на уебсайта + Не мога да пресъздам изцяло уебсайта Съдържанието не е налично - Блокирано от GEMA + Блокирано от „GEMA“ Не мога да настроя меню за сваляне Това е предаване на живо, което все още не се поддържа. Не мога да достъпя нито един поток @@ -131,7 +131,7 @@ Критичен проблем с плейъра Опит за възстановяване от възникналия проблем с плейъра - Съжаляваме, но това не би трябвало да се случва. + Съжаляваме, това не би трябвало да се случва. Докладвай за грешката чрез имейл Съжаляваме, възникнаха някои грешки. ДОКЛАД @@ -141,18 +141,18 @@ Подробности: - Миниатюра на клипа - Миниатюра на аватаря на качилия клипа + Миниатюра на видео + Миниатюра на аватара на качилия видео Харесвания Нехаресвания - Използвай Tor - (Експериментално) Пренасочвай трафика при сваляне към мрежата на Tor за по-високо ниво на поверителност (стриймването на клипове все още не се поддържа). + Използвай „Tor“ + (Експериментално) Пренасочвай трафика при сваляне към мрежата на „Tor“ за по-високо ниво на поверителност (стриймването на видео все още не се поддържа). Докладвай за грешка Няма резултати - Тук все още няма нищо + Тук няма нищо - Не мога да създам директория за свалянията в \'%1$s\' - Създадох директория за свалянията в \'%1$s\' + Неуспешно създаване на директория за изтеглени в „%1$s“ + Бе създадена директория за свалянията в „%1$s“ Видео Аудио @@ -174,61 +174,61 @@ Няма клипове - %s клип - %s клипове + %s видео + %s видеота Пауза Начало Изтрий - Чексума + Контролна сума - Готово + ОК Име на файла Нишки Грешка Сървърът не се поддържа Файлът вече съществува - Неправилен формат на URL-а или няма връзка - NewPipe Сваляне - Натисни за подробности + Неправилен хиперлинк или няма връзка с Интернет + NewPipe Изтегляне + Докосни за подробности Моля, изчакайте… Копирано в клипборда Позволени символи в името на файловете Невалидните символи се заменят с тази стойност - Стойност за замяна + Символ за замяна Букви и цифри За NewPipe Настройки Относно приложението Лицензи от трети страни - Не мога да заредя лицензите + Неуспешно зареждане на лиценза Отвори уебсайта Относно приложението Допринесли - Лицензии - Безплатен и лек YouTube фронтенд за Android. + Лицензи + Безплатно и леко поточно предаване за Android. Виж в GitHub Изтегли стрийм файл. Покажи инфо - NewPipe + Главен Отметки Добави към Използвай бързо, но неточно превъртане - Неточното превъртане позволява на плейъра да превърта кадри по-бързо с намалена прецизност - Зареждай иконки + Неточното превъртане позволява на плейъра да превърта кадри по-бързо, с намалена прецизност + Зареждай миниатюри Кеш-паметта с изображения е изтрита - Изчисти кешираните метаданни - Изчисти всички кешираини метаданни за уебстраници - Кеш-паметта с метаданни бе изчистена - Автоматично пускай следващия - Автоматично прибавяне на сродно съдържание при неповтарящ се преглед . - Държава по подразбиране, за която да бъде показвано подходящо съдържание + Изтрий кешираните метаданни + Премахни всички метаданни за уебстраници от кеш-паметта + Кеш-паметта с метаданни бе изтрита + Автоматично нареди на опашка следващия + "Автоматично прибавяне на сродно съдържание при неповтарящ се преглед . " + Държава, за която да бъде показвано съдържание Услуга Отстраняване на грешки Винаги @@ -237,19 +237,19 @@ Смени ориентацията Мини във фонов режим - Мини към изкачащ прозорец + Мини към нов прозорец Мини в основен режим - Внасяне на база данни - Изнасяне на база данни + Импортиране на база данни + Експортиране на база данни Ще замени текущите история и абонаменти - Изнасяне на история, абонаменти и плейлисти - Изчисти историята с изгледани + Експортиране на историята, абонаментите и плейлистите + Изтрий историята с изгледани Изтрий цялата история с изгледани. Историята с изгледани е изтрита. Изтрий историята на търсенията Изтрива историята с въвежданите за търсене ключови думи. - Изтрий цялата история на гледанията. + Изтрий цялата история на търсенията. Историята на търсенията е изтрита. URL подписът на видеото не можа да бъде дешифрован Външните плейъри не поддържат този вид линкове @@ -272,16 +272,189 @@ Няма инсталирано приложение, което да изпълни този файл © %1$s от %2$s под лиценза %3$s - Направи принос - За всичко, което се сетите: превод, промени по дизайна, изчистване на кода или много сериозни промени по кода – помощта е винаги добре дошла. Колкото повече се прави по това, толкова по-добре се получава. - Направи дарение - NewPipe се разработва от доброволни разработчици, което отделят от своето време, за да ви доставят най-доброто преживяване. Дайте от себе си, за да помогнете на разработчиците да направят NewPipe още по-добро приложение, докато се наслаждават на едно кафе от вас. + Съдействайте + За всичко, което се сетите: превод, промени по дизайна, изчистване на кода или много сериозни промени по кода – помощта е винаги добре дошла. Колкото повече развитие, толкова по-добре! + Направете дарение + NewPipe се разработва от доброволци, които отделят от своето време, за да ви доставят най-доброто преживяване. Дайте от себе си в замяна, за да помогнете на разработчиците да направят NewPipe още по-добро приложение, докато се наслаждават на едно кафе от вас. Дари Уебсайт Посетете сайта на NewPipe за повече информация и новини. Политиката на NewPipe за личните данни Проектът NewPipe се отнася много сериозно към вашата поверителност. За това, приложението не събира никакви данни без вашето съгласие. \nНашата политика за личните данни обяснява подробно какви данни изпращате и къде се съхраняват, когато изпращате съобщения за грешки. - Прочетет нашата политика за поверителност + Прочетете нашата политика за поверителност Лицензът на NewPipe - + Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма) + Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита. + Показвай подсказка, когато е избран фонов режим или режим в прозорец на страницата с детайли на съответното видео + Изтрива историята на възпроизвежданите стриймове. + Не са намерени видео стриймове + Не са намерени аудио стриймове + "Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nУслуга:\\nВреме по GMT:\\nПакет:\\nВерсия:\\nОС версия: " + Миниатюра на видео + Потребителски доклад + Пренареди чрез плъзгане + + Начало + Изтрий един + Преименувай + + Нова цел + Моля, изберете достъпна папка за изтегляния + Това разрешение се изисква за +\nвъзпроизвеждане в отделен прозорец + 1 елемент е изтрит. + + reCAPTCHA + reCAPTCHA заявка + Изисква се въвеждане на reCAPTCHA + + Изтегляне + Повечето специални символи + + NewPipe е безплатен „copyleft“ софтуер: Можете да го използвате, изучавате, споделяте и подобрявате по ваше усмотрение. В частност, Вие можете да препубликувате и/или модифицирате приложението според правилата на Главния обществен лиценз на ГНУ, издаден от Фондацията за свободен софтуер – версия 3 на лиценза или по-нова. + Прочетете лиценза + + + История + Търсения + Гледани + Историята е изключена + История + Историята е празна + Историята е изчистена + Елементът е изтрит + Искате ли да изтриете този елемент от историята на търсенията? + Искате ли да изтриете този елемент от историята на гледанията? + Окончателно ли искате да изтриете всички елементи от историята на гледанията? + Последно възпроизвеждани + Най-възпроизвеждани + + Съдържание на главната страница + Празна страница + Страница-павилион + Страница с абонаменти + Страница с акценти от вашите абонаменти + Страница на определен канал + Изберете канал + За момента нямате абонаменти + Изберете павилион + Експортирането приключи + Импортирането приключи + Невалиден ZIP файл + Внимание: не всички файлове бяха импортирани успешно. + Това ще замени текущата Ви инсталация. + Желаете ли също да импортирате настройките? + + Павилион + Набиращи популярност + Топ 50 + Ново и горещо + Във фонов режим + В прозорец + Премахни + Детайли + Аудио настройки + Задръжте, за да поставите на опашката + На опашката във „фонов режим“ + На опашката в „режим в прозорец“ + Възпроизвеждане от тук + Възпроизвеждане от тук във фонов режим + Възпроизвеждане от тук в прозорец + + Отвори навигационната лента + Затвори навигационната лента + Тук нещо ще се появи скоро ;D + + + Действие при повикване от друго приложение + Действие по подразбиране при отваряне на съдържание — %s + + Видео плейър + Във фонов режим + В прозорец + Винаги питай + + Получаване на инфо… + Зареждане на заявеното съдържание + + Създай Нов Плейлист + Изтрий Плейлист + Преименувай Прелист + Име + Добави Към Плейлист + Задай като миниатюра на плейлиста + + Миниатюрата на плейлиста е сменена + Премахни отметката + + Искате ли да изтриете този плейлист? + Плейлистът е създаден + Добавено към плейлист + Миниатюрата на плейлиста е сменена + Плейлистът не можа да бъде изтрит + + Без надписи + + Приспособи + Запълни + Увеличи + + Авто-генерирани + + Надписи + Модифицирай мащаба на текста и фона на надписите. Изисква рестарт на приложението, за да се приложат промените. + + Включи LeakCanary + Следенето за пропускане на памет може да направи приложението нестабилно + + Докладвай за извънредни грешки + Импортиране/експортиране + Импортирай + Импортирай от + Експортирай в + + Импортиране… + Експортиране… + + Файл с данни за импортиране + Предишно експортиране + + Неуспешно импортиране на абонатите + Неуспешно експортиране на абонатите + + Импортирайте YouTube абонаментите, чрез изтегляне на нужния файл: +\n +\n1. Посетете тази връзка: %1$s +\n2. Влезте в акаунта си, когато това се изиска +\n3. Изтеглянето трябва да започне (това е експортирания файл) + Импортирайте SoundCloud профил чрез въвеждане на хипервръзката към него или чрез вашия ID: +\n +\n1. Включете „десктоп режим“ в браузър (сайтът е недостъпен за мобилни устройства) +\n2. Посетете връзката: %1$s +\n3. Влезте в профила си, ако се изисква +\n4. Копирайте хипервръзката на профилната страница, към която сте насочени. + вашиятID, soundcloud.com/вашиятID + + Това действие може да изразходва голямо количество данни от вашия трафик. +\n +\nЖелаете ли да продължите? + + Управление скоростта на възпроизвеждане + Темпо + Височина + Бързо превъртане при тишина + От съображения към Общия европейски регламент относно защитата на данните, Ви привличаме вниманието към политиката за поверителност на NewPipe. Моля, прочетете я внимателно. +\nТрябва да сте съгласни с условията, за да ни изпратите доклада за грешката. + Приеми + Откажи + + Без ограничения + Ограничена резолюция при мобилни данни + Минимизирай при преход към друго приложение + Действие при преминаване към друго приложение от видео плейъра — %s + Без минимизиране + Минимизирай във фонов режим + Минимизирай в прозорец + + From 78485287a49cedf2f067a87afa08f051aa8dccfe Mon Sep 17 00:00:00 2001 From: Ariel Shulman Date: Tue, 17 Jul 2018 17:58:34 +0000 Subject: [PATCH 112/363] Translated using Weblate (Hebrew) Currently translated at 82.3% (312 of 379 strings) --- app/src/main/res/values-he/strings.xml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 7480fdbff..6468079f4 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -32,7 +32,7 @@ הכנס נתיב לשמירת קבצי שמע נגן אוטומטית - הפעל סרטון אוטומטית כאשר NewPipe נפתח דרך אפליקציה אחרת + מנגן סרטון כאשר NewPipe נפתח דרך אפליקציה אחרת רזולוציית ברירת המחדל רזולוציית ברירת המחדל לחלון צץ הצג רזולוציות גבוהות יותר @@ -119,7 +119,7 @@ היסטוריית חיפושים שמור חיפושים מקומית - היסטוריה + היסטוריה ומטמון המשך לעקוב אחר סרטונים שנצפו המשך לנגן בעת חזרת המיקוד ליישום המשך לנגן לאחר הפרעות (לדוגמה: שיחות טלפון) @@ -386,4 +386,16 @@ \n3. ההורדה אמורה להתחיל (זהו קובץ היצוא) קצב ברירת מחדל - +השתמש בחיפוש מהיר שאינו מדויק + חיפוש לא מדויק מאפשר לנגן לחפש נקודת זמן מהר יותר, עם דיוק מופחת + טען תמונות ממוזערות + "השבת כדי לעצור את טעינת כל התמונות הממוזערות וחסוך בשימוש בנתונים ובזכרון. השינוי ימחק את המטמון בזכרון ובדיסק. " + הסר את כל נתוני העמודים במטמון + אוטומטית הכנס לתור את ההזרמה הבאה + "אוטומטית הוסף הזרמה קשורה כאשר ההזרמה האחרונה לא נמצאת במצב הזרמה חוזרת של התור. " + כפתור כיוון + החלף לראשי + + פעולה זו תדרוס את ההיסטוריה ורשימת המנויים הקיימת. + "מחק הסטוריה של ניגונים קודמים. " + From e60db5f928a2af528ea595f323110c3951dfd7e6 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 19 Jul 2018 16:18:57 +0200 Subject: [PATCH 113/363] make new filtersystem translatable --- app/build.gradle | 2 +- .../fragments/list/search/SearchFragment.java | 7 ++++++- .../java/org/schabi/newpipe/util/ServiceHelper.java | 12 ++++++++++++ app/src/main/res/values/strings.xml | 5 +++++ build.gradle | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 014f379f6..fbaab1214 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:8ee068fd98' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:1eff8c5708' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 77274c96a..5e511c03b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -51,6 +51,7 @@ import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.LayoutManagerSmoothScroller; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.ServiceHelper; import java.io.IOException; import java.io.InterruptedIOException; @@ -360,8 +361,12 @@ public class SearchFragment int itemId = 0; boolean isFirstItem = true; + final Context c = getContext(); for(String filter : service.getSearchQIHFactory().getAvailableContentFilter()) { - MenuItem item = menu.add(1, itemId++, 0, filter); + MenuItem item = menu.add(1, + itemId++, + 0, + ServiceHelper.getTranslatedFilterString(filter, c)); if(isFirstItem) { item.setChecked(true); isFirstItem = false; diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java index e7e52f393..7c781eb14 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java @@ -30,6 +30,18 @@ public class ServiceHelper { } } + public static String getTranslatedFilterString(String filter, Context c) { + switch(filter) { + case "all": return c.getString(R.string.all); + case "videos": return c.getString(R.string.videos); + case "channels": return c.getString(R.string.channels); + case "playlists": return c.getString(R.string.playlists); + case "tracks": return c.getString(R.string.tracks); + case "users": return c.getString(R.string.users); + default: return filter; + } + } + /** * Get a resource string with instructions for importing subscriptions for each service. * diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8686d21d3..502483667 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -125,7 +125,12 @@ Error report All Channel + Channels Playlist + Playlists + Videos + Tracks + Users Yes Later Disabled diff --git a/build.gradle b/build.gradle index a45c00aef..0448ed61e 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 82bb467a2aa7a972cdda198f00558c4823f4ce02 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sat, 21 Jul 2018 14:35:03 +0200 Subject: [PATCH 114/363] move on to version v0.13.6 --- app/build.gradle | 4 +-- .../fragments/list/search/SearchFragment.java | 2 -- .../metadata/android/en-US/changelogs/65.txti | 28 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/65.txti diff --git a/app/build.gradle b/app/build.gradle index fbaab1214..6b591cad3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 15 targetSdkVersion 27 - versionCode 64 - versionName "0.13.5" + versionCode 65 + versionName "0.13.6" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 5e511c03b..1e29eabbd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -29,8 +29,6 @@ import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; -import com.facebook.stetho.common.ListUtil; - import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.database.history.model.SearchHistoryEntry; diff --git a/fastlane/metadata/android/en-US/changelogs/65.txti b/fastlane/metadata/android/en-US/changelogs/65.txti new file mode 100644 index 000000000..90c7a7309 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/65.txti @@ -0,0 +1,28 @@ +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. + + From b7006a8f2c05a42347190345c6c0c7d0cb1b2635 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Sun, 22 Jul 2018 08:55:09 +0000 Subject: [PATCH 115/363] Translated using Weblate (Basque) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-eu/strings.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index d0da3d364..6eee064f9 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -468,4 +468,14 @@ Mugagabea Mugatu bereizmena datu mugikorrak erabiltzean - + Aurreratu azkar isilunea dagoenean + Urratsa + Leheneratu + + Minimizatu aplikazioa aldatzean + Ekintza bideo erreproduzigailu nagusitik beste aplikazio batera aldatzean — %s + Bat ere ez + Minimizatu bigarren planoko erreproduzigailura + Minimizatu laster-leiho erreproduzigailura + + From f5b57cc0da17318ebab7388f9cfadd506290d20d Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Sat, 21 Jul 2018 20:28:58 +0000 Subject: [PATCH 116/363] Translated using Weblate (Arabic) Currently translated at 100.0% (379 of 379 strings) --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1d1a0ea1e..3ddb368f8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -359,7 +359,7 @@ مُزامَنة - تنزيل ملف البث + تنزيل ملف البث. الإشارات مرجعية استعمال التقديم السريع الغير دقيق From 50571449cb583244cfcb0d7ca7001a2bc6cf4e72 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Sun, 22 Jul 2018 08:59:59 +0000 Subject: [PATCH 117/363] Translated using Weblate (Basque) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-eu/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 6eee064f9..8be6aad2d 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -476,6 +476,10 @@ Ekintza bideo erreproduzigailu nagusitik beste aplikazio batera aldatzean — %s Bat ere ez Minimizatu bigarren planoko erreproduzigailura - Minimizatu laster-leiho erreproduzigailura + Minimizatu laster-liho erreproduzigailura - +Kanalak + Erreprodukzio-zerrendak + Pistak + Erabiltzaileak + From 735d9a539161efced17841697cc6426f79a3caa2 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Sun, 22 Jul 2018 09:40:27 +0000 Subject: [PATCH 118/363] Translated using Weblate (Dutch) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7be3e0160..007b3e232 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -495,4 +495,8 @@ te openen in pop-upmodus Stap Standaardwaarden + Kanalen + Afspeellijsten + Nummers + Gebruikers From 414abad05f6fa5ec0d1b7aeda207a82b97f7dd2a Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Sun, 22 Jul 2018 10:37:32 +0000 Subject: [PATCH 119/363] Translated using Weblate (Catalan) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index e1bf62601..8c3a9b43f 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -462,4 +462,8 @@ Pas Reinicialitza + Canals + Llistes de reproducció + Pistes + Usuaris From 26489b0f002e730926d543cfacf362dec1f88b9e Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 22 Jul 2018 13:55:17 +0200 Subject: [PATCH 120/363] fix filters --- .../newpipe/fragments/list/search/SearchFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 1e29eabbd..411379963 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -56,8 +56,10 @@ import java.io.InterruptedIOException; import java.net.SocketException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Queue; import java.util.concurrent.TimeUnit; @@ -114,6 +116,7 @@ public class SearchFragment @State protected boolean wasSearchFocused = false; + private Map menuItemToFilterName; private StreamingService service; private String currentPageUrl; private String nextPageUrl; @@ -357,10 +360,13 @@ public class SearchFragment supportActionBar.setDisplayHomeAsUpEnabled(true); } + menuItemToFilterName = new HashMap<>(); + int itemId = 0; boolean isFirstItem = true; final Context c = getContext(); for(String filter : service.getSearchQIHFactory().getAvailableContentFilter()) { + menuItemToFilterName.put(itemId, filter); MenuItem item = menu.add(1, itemId++, 0, @@ -379,7 +385,7 @@ public class SearchFragment public boolean onOptionsItemSelected(MenuItem item) { List contentFilter = new ArrayList<>(1); - contentFilter.add(item.getTitle().toString()); + contentFilter.add(menuItemToFilterName.get(item.getItemId())); changeContentFilter(item, contentFilter); return true; From 65b744472bd595bc2bae8c704790e646660be20d Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sun, 22 Jul 2018 13:02:20 +0000 Subject: [PATCH 121/363] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0dfb82955..1d02fcbae 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -478,4 +478,8 @@ 步進 重設 + 頻道 + 播放清單 + + 使用者 From 3b0c96f6547bfbc8eb3bfa0da271b433fcef79fa Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Sun, 22 Jul 2018 10:43:11 +0000 Subject: [PATCH 122/363] Translated using Weblate (Catalan) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 8c3a9b43f..700506bce 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -226,7 +226,7 @@ M\'agrada No m\'agrada Fes servir el Tor - (En proves) Força el trànsit de baixada a través del Tot per a més privadesa (no compatible encara amb les emissions de vídeo). + (En proves) Força el trànsit de baixada a través del Tor per a més privadesa (no compatible encara amb les emissions de vídeo). Informa sobre un error Informe de l\'usuari Cap resultat From 860c4d045a8ca49b4cc3f94d6d49098b3a263c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 22 Jul 2018 11:33:15 +0000 Subject: [PATCH 123/363] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 95.8% (367 of 383 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 34fa54b1a..0f8d9b55a 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -483,4 +483,12 @@ Minimer til bakgrunnsspiller Minimer til oppsprettsspiller - +Kanaler + Spillelister + Spor + Brukere + Hurtig foroverspoling ved stillhet + Steg + Tilbakestill + + From 21bd9f09da425fed9058023d948cdce7d141dc0c Mon Sep 17 00:00:00 2001 From: Ali Demirtas Date: Sun, 22 Jul 2018 16:52:38 +0000 Subject: [PATCH 124/363] Translated using Weblate (Turkish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4441ee6b1..6fad8c97c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -491,4 +491,8 @@ Adım Sıfırla + Kanallar + Onatma listeleri + Parçalar + Kullanıcılar From b52dee37f4a83fd96bb7bb25a6029aa352f26740 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 23 Jul 2018 18:54:40 +0200 Subject: [PATCH 125/363] move on to version v0.13.7 --- app/build.gradle | 4 +-- .../en-US/changelogs/{65.txti => 65.txt} | 0 .../metadata/android/en-US/changelogs/66.txt | 34 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) rename fastlane/metadata/android/en-US/changelogs/{65.txti => 65.txt} (100%) create mode 100644 fastlane/metadata/android/en-US/changelogs/66.txt diff --git a/app/build.gradle b/app/build.gradle index 6b591cad3..f22492aef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 15 targetSdkVersion 27 - versionCode 65 - versionName "0.13.6" + versionCode 66 + versionName "0.13.7" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/fastlane/metadata/android/en-US/changelogs/65.txti b/fastlane/metadata/android/en-US/changelogs/65.txt similarity index 100% rename from fastlane/metadata/android/en-US/changelogs/65.txti rename to fastlane/metadata/android/en-US/changelogs/65.txt diff --git a/fastlane/metadata/android/en-US/changelogs/66.txt b/fastlane/metadata/android/en-US/changelogs/66.txt new file mode 100644 index 000000000..3bdc6ae6d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/66.txt @@ -0,0 +1,34 @@ +# Chagelog of v0.13.7 + +### Fixed +- Fix sort filter issues of v0.13.6 + +# Changelog of v0.13.6 + +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. + From d8cdc577021d15aca60e36309a5c146e3ee54abc Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Tue, 24 Jul 2018 02:48:16 +0000 Subject: [PATCH 126/363] Translated using Weblate (Arabic) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 3ddb368f8..79cafbaed 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -488,4 +488,8 @@ تصغير إلى مشغل الخلفية تصغير إلى مشغل منبثق - +القنوات + قوائم التشغيل + المسارات + المستخدمين + From f4ea3980c25ce9f07a3626837ae22df124f3e165 Mon Sep 17 00:00:00 2001 From: AB Date: Tue, 24 Jul 2018 08:25:43 +0000 Subject: [PATCH 127/363] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 08ece56de..582dd35ba 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -483,4 +483,8 @@ Зменшити до фонового програвачу Зменшити до віконного програвачу - +Канали + Плейлисти + Стежки + Користувачі + From 84cb3a10603e0191d80674a5f5e686539fcd04e2 Mon Sep 17 00:00:00 2001 From: mesnevi Date: Wed, 25 Jul 2018 06:21:35 +0000 Subject: [PATCH 128/363] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9549749cb..f90f8725c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -311,7 +311,7 @@ Потоки аудио не найдены Пожертвовать - NewPipe разрабатывается добровольцами в свободное время ради вашего удобства использования программы. Пора воздать должное, разработчики могут сделать NewPipe ещё лучше с чашечкой кофе! + NewPipe разрабатывают добровольцы в свободное время. Они делают это для того, чтобы программой было легко и удобно пользоваться. Давайте порадуем разработчиков чашечкой кофе! Когда им будет приятно, они так всё сделают, что и вам будет приятно. Воздать должное Веб-сайт Для получения более подробной информации и последних новостей о NewPipe посетите наш веб-сайт. @@ -407,7 +407,7 @@ Мониторинг утечки памяти может привести к зависанию приложения Ошибки отчёта вне очереди - + Принудительно отсылать недоставленные сообщения об ошибках в коде или действиях после их удаления Импорт/Экспорт Импорт @@ -485,4 +485,18 @@ Без ограничения Ограничить разрешение при использовании мобильных данных - + Каналы + Плей-листы + Дорожки + Пользователи + Перематывать вперёд при включённом беззвучном режиме. + Щаг + Сбросить + + Сворачивать при переключении приложений + При переключении воспроизведения видео со стандартного плеера на другое приложение — %s + Ничего не делать + Свернуть в режим фонового воспроизведения + Свернуть в режим всплывающего окна + + From b39e071d1ed35d18e1c99d37267a33e002942ff9 Mon Sep 17 00:00:00 2001 From: mesnevi Date: Wed, 25 Jul 2018 10:20:03 +0000 Subject: [PATCH 129/363] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f90f8725c..8f5795a92 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -472,7 +472,7 @@ NewPipe - программное обеспечение copyleft libre: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с GNU General Public License, опубликованным Free Software Foundation, либо версией 3 License, либо (по вашему выбору) любой более поздней версии. Предпочтительное действие \'Открыть\' - Желаете ли вы также импортировать настройки? + Хотите импортировать настройки? Политика конфиденциальности NewPipe Проект NewPipe очень серьезно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. @@ -489,7 +489,7 @@ Плей-листы Дорожки Пользователи - Перематывать вперёд при включённом беззвучном режиме. + Перематывать вперёд при включённом беззвучном режиме Щаг Сбросить From 881b191b8d4562667ca3b1a05a456c91a6a60428 Mon Sep 17 00:00:00 2001 From: Andrey mm Date: Wed, 25 Jul 2018 10:24:05 +0000 Subject: [PATCH 130/363] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8f5795a92..f80ad4fc4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -102,7 +102,7 @@ ОТЧЁТ Информация: Что произошло: - Детали: + Подробности: (Экспериментально) Загружать через Tor для повышения конфиденциальности (прямые трансляции пока не поддерживаются). From 4ef8b9334452a1a5968bd04c80680fdc7fe9812d Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sat, 28 Jul 2018 12:07:10 -0300 Subject: [PATCH 131/363] patch for ListHelper.java double check for null --- app/src/main/java/org/schabi/newpipe/util/ListHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 4f607b581..1a5bf14f7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -443,11 +443,11 @@ public final class ListHelper { /** * Are we connected to wifi? * @param context App context - * @return True if connected to wifi + * @return {@code 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; + return manager != null && manager.getActiveNetworkInfo() != null && manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI; } } From 75202921a13dd37e00e18d7a7d81d163dc974c8d Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Sun, 29 Jul 2018 00:11:48 +0000 Subject: [PATCH 132/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 670b23002..0ffd898a0 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -478,4 +478,8 @@ abrir em modo popup \n Reiniciar + Canais + Listas de reprodução + Faixas + Usuários From f521def4a52a57baee730ce65f734376538c9d03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Freddy=20Mor=C3=A1n=20Jr?= Date: Sat, 28 Jul 2018 19:35:00 +0000 Subject: [PATCH 133/363] Translated using Weblate (Spanish) Currently translated at 99.4% (381 of 383 strings) --- app/src/main/res/values-es/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8e91794e8..98dec6a54 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -498,4 +498,6 @@ abrir en modo popup Paso Reiniciar + Canales + Usuarios From 1ce21986210ce3e5eb49106433174c7d77102511 Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Sun, 29 Jul 2018 00:13:51 +0000 Subject: [PATCH 134/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0ffd898a0..7805a8fba 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -100,7 +100,7 @@ Threads URL inválida ou internet indisponível Selecione uma pasta para download - Nenhum player de stream encontrado. Deseja Instalar o VLC? + Nenhum player de stream encontrado. Deseja instalar o VLC? Não foi possível interpretar o site Áudio Reproduzir From 783d4e7e8ad00a7b5526776cb181738b21499891 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 29 Jul 2018 22:34:33 +0000 Subject: [PATCH 135/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 82 +++++++++++++------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f80ad4fc4..007b43188 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -18,9 +18,9 @@ Папка для хранения загруженных видео Введите путь к папке для загрузки видео Разрешение по умолчанию - Воспроизвести с помощью Kodi + Воспроизвести в Kodi Приложение Kore не найдено. Установить его? - Показывать опцию «Воспроизвести с помощью Kodi» + Показать опцию «Воспроизвести в Kodi» Показать опцию воспроизведения видео через Kodi media center Аудио Формат аудио по умолчанию @@ -114,7 +114,7 @@ Видео Аудио Повторить попытку - В доступе к хранилищу было отказано + Нет доступа к накопителю Не удалось загрузить все миниатюры Не удалось расшифровать подпись URL у видео Не удалось найти ни один поток @@ -137,7 +137,7 @@ Обновить Очистить Использовать старый плеер - Контроль жестов + Управление жестами Всё Фильтр @@ -149,7 +149,7 @@ reCAPTCHA Открыть в отдельном окне - Показывать подсказки в поиске + Отображать подсказки при поиске Позже Отключено @@ -169,7 +169,7 @@ Запрос reCAPTCHA Запрошен ввод reCAPTCHA - Показывать более высокое разрешение + Показать высокие разрешения NewPipe в окне О NewPipe Настройки @@ -182,7 +182,7 @@ О приложении Участники Прочитать лицензию - Библиотека лёгкого потокового воспроизведения на Android. + Свободное легковесное потоковое воспроизведение на Android. Открыть на GitHub Приветствуется всё — идеи, перевод, изменения дизайна, чистка кода или огромные изменения в коде. Чем больше сделано, тем лучше! © %1$s %2$s под лицензией %3$s @@ -198,7 +198,7 @@ История поиска Хранить поисковые запросы локально - История и Кэш + История и кэш Запоминать просмотренные видео Возобновлять при возврате фокуса Возобновлять воспроизведение после перерывов (например, телефонных звонков) @@ -225,12 +225,12 @@ Плеер Поведение - История и кеш + История и Кэш Плейлист Отменить Нет результатов - Тут ничего нет + Ничего нет Нет подписчиков @@ -279,7 +279,7 @@ Удалить Вы подписаны Подписка отменена - Показать \"держать, чтобы добавить\" подсказку + Подсказка \"Зажмите, чтобы добавить\" Показывать подсказку при нажатии на иконку «В окне» или «В фоне» на странице сведений о видео [Неизвестно] @@ -290,7 +290,7 @@ Зажмите, чтобы добавить в очередь Добавить в очередь «В фоне» Добавить в очередь «В окне» - Воспроизвести тут + Воспроизвести здесь Воспроизвести в фоне Воспроизвести в окне Потоковый плеер не найден (вы можете установить VLC) @@ -311,12 +311,12 @@ Потоки аудио не найдены Пожертвовать - NewPipe разрабатывают добровольцы в свободное время. Они делают это для того, чтобы программой было легко и удобно пользоваться. Давайте порадуем разработчиков чашечкой кофе! Когда им будет приятно, они так всё сделают, что и вам будет приятно. + Разработчики NewPipe ценой своего свободного времени делают вашу жизнь чуть удобнее. Отплатите им тем же — наслаждаясь чашечкой кофе, они смогут сделать NewPipe ещё лучше. Воздать должное Веб-сайт Для получения более подробной информации и последних новостей о NewPipe посетите наш веб-сайт. - Открыть лоток - Закрыть лоток + Открыть боковую панель + Закрыть боковую панель Проигрыватель видео Фоновый проигрыватель @@ -343,8 +343,8 @@ Экспорт данных Ваша текущая история и подписки будут перезаписаны Экспорт истории, подписок и плейлистов. - Неправильная директория - Неправильный файл/контент источника + Неверная папка + Неправильный файл/источник контента Файл не существует или нет разрешения на его чтение или запись Имя файла не может быть пустым Произошла ошибка: %1$s @@ -365,20 +365,20 @@ Экспорт завершён Импорт завершён Нет верного Zip файла - Предупреждение: нет возможности импорта всех файлов. + Предупреждение: не все файлы были импортированы. Это перезапишет вашу текущую установку. - Скоро тут что-то будет ;D + Скоро здесь кое-что появится ;D Всегда спрашивать - Создать новый плейлист + Создать плейлист Удалить плейлист Переименовать плейлист Имя Добавить в плейлист - Установить как иконку плейлиста + Установить как миниатюру плейлиста Добавить плейлист в закладки Удалить закладку @@ -386,7 +386,7 @@ Вы хотите удалить этот плейлист? Плейлист создан Добавлено в плейлист - Иконка плейлиста изменена + Миниатюра плейлиста изменена Не удалось удалить плейлист Без титров @@ -406,8 +406,8 @@ Включить LeakCanary Мониторинг утечки памяти может привести к зависанию приложения - Ошибки отчёта вне очереди - Принудительно отсылать недоставленные сообщения об ошибках в коде или действиях после их удаления + "Сообщать об ошибках жизненного цикла" + Принудительно сообщать о недоставляемых Rx-исключениях вне фрагмента или жизненного цикла после удаления Импорт/Экспорт Импорт @@ -436,14 +436,14 @@ \n4. Скопируйте адрес из адресной строки. вашID, soundcloud.com/вашID - Эта операция может использовать большие объемы сетевого трафика. + Это действие может использовать большие объёмы сетевого трафика. \n \nПродолжить? Загружать миниатюры - Отключите, чтобы перестать загружать миниатюры и начать экономить трафик и память. Изменение настройки очистит кеш изображений в памяти и на диске. - Кеш изображений очищен - Очистить кеш метаданных - Кеш метаданных очищен + Отключите, чтобы перестать загружать миниатюры и начать экономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске. + Кэш изображений очищен + Очистить кэш метаданных + Кэш метаданных очищен Управление скоростью воспроизведения Темп Тон @@ -456,41 +456,41 @@ Нет потоков, доступных для загрузки Титры - Нет приложения, установленного для воспроизведения этого файла + Приложение для воспроизведения этого файла не установлено Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу. Очистить историю просмотров Удалить всю историю просмотров. - История просмотров была удалена. + История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов. Удаляет историю воспроизведённых потоков. Удалить всю историю поиска. - Удалить историю поиска. + История поиска удалена. 1 элемент удалён. - NewPipe - программное обеспечение copyleft libre: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с GNU General Public License, опубликованным Free Software Foundation, либо версией 3 License, либо (по вашему выбору) любой более поздней версии. + NewPipe — программное обеспечение copyleft libre: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. Предпочтительное действие \'Открыть\' Хотите импортировать настройки? Политика конфиденциальности NewPipe - Проект NewPipe очень серьезно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. -\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчета о сбоях. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. +\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. Прочитать политику конфиденциальности - Чтобы соответствовать Европейскому стандарту защиты данных (GDPR), мы обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно прочитайте его. -\nВы должны принять её, чтобы отправить нам отчет об ошибке. + В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. +\nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. Принять Отклонить - Без ограничения + Без ограничений Ограничить разрешение при использовании мобильных данных Каналы - Плей-листы + Плейлисты Дорожки Пользователи - Перематывать вперёд при включённом беззвучном режиме - Щаг + Пропускать тишину + Шаг Сбросить Сворачивать при переключении приложений From e948eebe84e7f3f0f339aaf64a164dab00b8afc9 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 30 Jul 2018 03:22:38 +0000 Subject: [PATCH 136/363] Translated using Weblate (Russian) Currently translated at 99,4% (381 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 007b43188..3c1de2564 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -21,7 +21,7 @@ Воспроизвести в Kodi Приложение Kore не найдено. Установить его? Показать опцию «Воспроизвести в Kodi» - Показать опцию воспроизведения видео через Kodi media center + Показать опцию воспроизведения видео через медиацентр Kodi Аудио Формат аудио по умолчанию WebM — свободный формат @@ -440,7 +440,7 @@ \n \nПродолжить? Загружать миниатюры - Отключите, чтобы перестать загружать миниатюры и начать экономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске. + Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске. Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен From 522daf5aff55a7c8fdd92f8d65b1395c59e6980d Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 30 Jul 2018 03:46:01 +0000 Subject: [PATCH 137/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3c1de2564..5b2674b3f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -470,7 +470,7 @@ История поиска удалена. 1 элемент удалён. - NewPipe — программное обеспечение copyleft libre: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. + NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. Предпочтительное действие \'Открыть\' Хотите импортировать настройки? From 8fed029ee3f08a585f009993c4351ae8acaacdf5 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 30 Jul 2018 04:02:04 +0000 Subject: [PATCH 138/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5b2674b3f..1a5faf28d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -117,7 +117,7 @@ Нет доступа к накопителю Не удалось загрузить все миниатюры Не удалось расшифровать подпись URL у видео - Не удалось найти ни один поток + Не удалось найти ни одного потока Воспроизвести From e95df0dbd55729305bc57650b43173ea3a4fbfff Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 30 Jul 2018 04:15:46 +0000 Subject: [PATCH 139/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1a5faf28d..75357a077 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -14,7 +14,7 @@ Поделиться с помощью Выбрать браузер поворот - Путь для загрузки видео + Путь загрузки видео Папка для хранения загруженных видео Введите путь к папке для загрузки видео Разрешение по умолчанию @@ -40,8 +40,8 @@ Миниатюра аватара пользователя Не понравилось Понравилось - Использовать внешний видеоплеер - Использовать внешний аудиоплеер + Внешний видеоплеер + Внешний аудиоплеер Воспроизведение в фоновом режиме Тема Тёмная @@ -51,7 +51,7 @@ Ошибка сети Использовать Tor - Папка для загрузки аудио + Путь загрузки аудио Папка для хранения загруженных аудио Введите путь к папке для загрузки аудио @@ -59,7 +59,7 @@ Подождите… Файл уже существует Потоки - OK + ОК Начать Пауза Удалить @@ -69,17 +69,17 @@ Ошибка Сервер не поддерживается NewPipe скачивает - Неправильный URL или нет доступа к интернету - Нажмите для деталей + Неверный URL или нет доступа к интернету + Подробности Скопировано в буфер обмена Выберите доступную папку для загрузки - Показывать контент с ограничением по возрасту + Контент с ограничением по возрасту Ошибка - Ваш комментарий (на английском): + Ваш комментарий (English): Невозможно создать папку для загрузки \'%1$s\' - Воспроизводить автоматически + Автовоспроизведение Воспроизводить видео при вызове NewPipe из другого приложения Контент Видео с возрастными ограничениями. Разрешить подобный контент можно в настройках. @@ -95,9 +95,9 @@ Не удалось создать меню загрузки Это прямая трансляция, они пока не поддерживаются. Не удалось загрузить изображение - "Падение приложения/пользовательского интерфейса " + Падение приложения/UI Простите, это не должно было произойти. - Отправить отчёт об ошибке по электронной почте + Отправить отчёт по e-mail Простите, произошли ошибки. ОТЧЁТ Информация: @@ -129,14 +129,14 @@ Формат видео по умолчанию Чёрная Запоминать размер и положение всплывающего окна - Использовать жесты для изменения яркости и громкости + Изменять яркость и громкость жестами Всплывающее окно Воспроизведение во всплывающем окне Канал Да Обновить Очистить - Использовать старый плеер + Старый плеер Управление жестами Всё Фильтр @@ -160,16 +160,16 @@  млрд.  тыс. - Разрешение в режиме всплывающего окна - Запоминать последний размер и положение всплывающего окна - Поисковые подсказки + Разрешение всплывающего окна + Запоминать размер и положение всплывающего окна + Подсказки поиска Лучшее разрешение Старый встроенный плеер на Mediaframework Запрос reCAPTCHA Запрошен ввод reCAPTCHA - Показать высокие разрешения + Высокие разрешения NewPipe в окне О NewPipe Настройки @@ -213,7 +213,7 @@ Символ для замены Буквы и цифры - Большинство специальных символов + Большинство спецсимволов История История поиска @@ -332,8 +332,8 @@ Добавить к - Использовать быстрый, но неточный поиск - Неточный поиск позволяет плееру искать позицию быстрее, но с пониженной точностью + Быстрый неточный поиск + Неточный поиск позволяет плееру искать позицию быстрее, но менее точно Автоматическая очередь следующего стрима Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди. Отладка @@ -344,7 +344,7 @@ Ваша текущая история и подписки будут перезаписаны Экспорт истории, подписок и плейлистов. Неверная папка - Неправильный файл/источник контента + Неверный файл или источник контента Файл не существует или нет разрешения на его чтение или запись Имя файла не может быть пустым Произошла ошибка: %1$s @@ -357,16 +357,16 @@ Отклонить Переименовать - Вы хотите удалить этот элемент из истории поиска? - Вы уверены, что хотите удалить все элементы из истории? - Последнее проигрывание - Наиболее проигрываемые + Удалить этот элемент из истории поиска? + Удалить все элементы из истории? + Недавно проигранные + Часто проигрываемые Экспорт завершён Импорт завершён - Нет верного Zip файла + Нет верного Zip-файла Предупреждение: не все файлы были импортированы. - Это перезапишет вашу текущую установку. + Текущие данные будут заменены. Скоро здесь кое-что появится ;D @@ -383,7 +383,7 @@ Добавить плейлист в закладки Удалить закладку - Вы хотите удалить этот плейлист? + Удалить этот плейлист? Плейлист создан Добавлено в плейлист Миниатюра плейлиста изменена @@ -406,7 +406,7 @@ Включить LeakCanary Мониторинг утечки памяти может привести к зависанию приложения - "Сообщать об ошибках жизненного цикла" + Сообщать об ошибках жизненного цикла Принудительно сообщать о недоставляемых Rx-исключениях вне фрагмента или жизненного цикла после удаления Импорт/Экспорт @@ -436,7 +436,7 @@ \n4. Скопируйте адрес из адресной строки. вашID, soundcloud.com/вашID - Это действие может использовать большие объёмы сетевого трафика. + Это действие может вызвать большой расход трафика. \n \nПродолжить? Загружать миниатюры @@ -465,7 +465,7 @@ История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов. - Удаляет историю воспроизведённых потоков. + Удалить историю воспроизведённых потоков. Удалить всю историю поиска. История поиска удалена. 1 элемент удалён. @@ -484,14 +484,14 @@ Отклонить Без ограничений - Ограничить разрешение при использовании мобильных данных + Предельное разрешение в мобильной сети Каналы Плейлисты Дорожки Пользователи Пропускать тишину Шаг - Сбросить + Сброс Сворачивать при переключении приложений При переключении воспроизведения видео со стандартного плеера на другое приложение — %s From 315089c3614bf61e1d490b64b390851c2122bf19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emin=20Tufan=20=C3=87etin?= Date: Sun, 29 Jul 2018 15:37:57 +0000 Subject: [PATCH 140/363] Translated using Weblate (Turkish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6fad8c97c..251eab263 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -492,7 +492,7 @@ Sıfırla Kanallar - Onatma listeleri + Oynatma Listeleri Parçalar Kullanıcılar From d2f9b063b29c8fe78fac55eb55731ba1be516714 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 30 Jul 2018 10:59:52 +0000 Subject: [PATCH 141/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 75357a077..8f0b81026 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,7 +20,7 @@ Разрешение по умолчанию Воспроизвести в Kodi Приложение Kore не найдено. Установить его? - Показать опцию «Воспроизвести в Kodi» + Показать \"Воспроизвести в Kodi\" Показать опцию воспроизведения видео через медиацентр Kodi Аудио Формат аудио по умолчанию @@ -29,7 +29,7 @@ Скачать Следующее видео URL не поддерживается - Показывать \'следующее\' и \'предложенные\' видео + \"Следующее\" и \"Предложенные\" видео Язык контента по умолчанию Видео и Аудио Внешний вид @@ -78,7 +78,7 @@ Контент с ограничением по возрасту Ошибка Ваш комментарий (English): - Невозможно создать папку для загрузки \'%1$s\' + Не удалось создать папку для загрузки \"%1$s\" Автовоспроизведение Воспроизводить видео при вызове NewPipe из другого приложения Контент @@ -109,7 +109,7 @@ Сообщить об ошибке Сообщить о нарушении - Создана папка для загрузок \'%1$s\' + Создана папка для загрузок \"%1$s\" Видео Аудио @@ -280,7 +280,7 @@ Вы подписаны Подписка отменена Подсказка \"Зажмите, чтобы добавить\" - Показывать подсказку при нажатии на иконку «В окне» или «В фоне» на странице сведений о видео + Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео [Неизвестно] Восстановление после ошибки проигрывателя @@ -288,8 +288,8 @@ В фоне В окне Зажмите, чтобы добавить в очередь - Добавить в очередь «В фоне» - Добавить в очередь «В окне» + Добавить в очередь \"В фоне\" + Добавить в очередь \"В окне\" Воспроизвести здесь Воспроизвести в фоне Воспроизвести в окне @@ -365,7 +365,7 @@ Экспорт завершён Импорт завершён Нет верного Zip-файла - Предупреждение: не все файлы были импортированы. + Внимание: не все файлы были импортированы. Текущие данные будут заменены. Скоро здесь кое-что появится ;D @@ -471,7 +471,7 @@ 1 элемент удалён. NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. - Предпочтительное действие \'Открыть\' + Предпочтительное действие \"Открыть\" Хотите импортировать настройки? Политика конфиденциальности NewPipe From feb3d11f63e4d99c950d7edc574a23b7ed80bf9b Mon Sep 17 00:00:00 2001 From: Dual Natan Date: Mon, 30 Jul 2018 11:16:35 +0000 Subject: [PATCH 142/363] Translated using Weblate (Swedish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 1247a552b..525b0b278 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -301,4 +301,5 @@ Fil Byta orientationen + Rensa metadatan i cacheminnet From be6bc68b5649e1ccb2e83af6d3f94f8407dd7c50 Mon Sep 17 00:00:00 2001 From: MadderRagax Date: Mon, 30 Jul 2018 11:20:43 +0000 Subject: [PATCH 143/363] Translated using Weblate (Swedish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 177 ++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 525b0b278..7b75ea7e7 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -4,7 +4,7 @@ Ingen strömspelare hittades. Vill du installera VLC? Installera Avbryt - Öppna i bläddrare + Öppna i webbläsare Öppna i popup-läge Dela Ladda ner @@ -12,7 +12,7 @@ Inställningar Menade du: %1$s ? Dela med - Välj bläddrare + Välj webbläsare rotering Använd extern videospelare Några upplösningar kommer INTE ha ljud när det här alternativet är aktiverat @@ -189,7 +189,7 @@ Inga videor %s video - %s videon + %s videor Start @@ -292,7 +292,7 @@ Använda snabb inexact sökning Ladda miniatyrer - Inaktivera för att stoppa alla miniatyrer från lastning och spara på nät och minnesanvändning. Ändring av detta kommer att rensa cache-minnet. + Inaktivera för att stoppa alla miniatyrbilder från att ladda och spara på data och minnesanvändning. Ändring av detta kommer att rensa cache-minnet. Bild cacheminnet var rensad Tjänst Debug @@ -302,4 +302,171 @@ Byta orientationen Rensa metadatan i cacheminnet - + Ingen strömspelare hittades (du kan installera VLC för att spela upp) + Ladda ned sändning. + "Ej exakt sökning tillåter spelaren att söka positioner snabbare med minskad precision " + Ta bort alla cachade webbsidor + Metadata cache rensad + "Köa nästa ström automatiskt " + Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö. + Standard innehåll land + Kanaler + Spellistor + Spår + Användare + Växla till Bakgrunden + Växla till popup + Växla till main + + Importera databas + Exportera databas + Kommer att skriva över din nuvarande historik och prenumerationer + Exportera historik, prenumerationer och spellistor. + Rensa visningshistorik + Tar bort historiken för spelade videoklipp. + Ta bort hela visningshistoriken. + Visningshistorik borttagen. + Rensa sökhistorik + Tar bort historiken för söka nyckelord. + Ta bort hela sökhistoriken. + Sökhistorik borttagen. + Externa spelare stöder inte dessa typer av länkar + Ogiltig URL + Inga videoströmmar hittades + Inga ljudspår hittades + Ogiltig katalog + Ogiltig fil/innehålls källa + Filen finns inte eller otillräcklig behörighet att läsa eller skriva till den + Filnamnet får inte vara tomt + Ett fel uppstod: %1$s + Inga strömmar är tillgängliga för nedladdning + + Dra för att ändra ordning + + Skapa + Ta bort en + Ta bort alla + Avfärda + Döp om + + 1 objekt borttaget. + + Ingen app installerad för att spela upp filen + + NewPipes Sekretesspolicy + "NewPipe projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. NewPipes Sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport." + Läs sekretesspolicy + NewPipe är copyleft fri programvara: Du kan använda, studera, dela och förbättra den som du vill. Specifikt kan du distribuera och/eller modifiera det under villkoren för GNU General Public License som publicerats av Free Software Foundation, antingen version 3 av licensen, eller (om du så önskar) en senare version. + Vill du ta bort det här föremålet från visningshistoriken? + Är du säker du vill ta bort alla föremål från historiken? + Senast spelade + Mest spelade + + Exporteringen har slutförts + Importeringen har slutförts + Ingen giltig ZIP-fil + Varning: det gick inte att importera alla filer. + Det här kommer skriva över dina nuvarande inställningar. + Vill du också importera inställningar? + + Öppna navigationspanelen + Stäng navigationspanelen + Något kommer att visas här snart ;D + + + Föredra \'öppna\' åtgärden + Standardåtgärden när du öppnar innehåll — %s + + Videospelare + Bakgrundsspelare + Popup-spelare + Fråga alltid + + Hämtar information… + Laddar begärt innehåll + + Skapa ny spellista + Radera spellista + Byt namn på spellista + Namn + Lägg till i spellistan + Använd som spellistans miniatyrbild + + Bokmärk spellistan + Ta bort bokmärke + + Vill du ta bort den här spellistan? + Spellistan skapades + Tillagad i spellistan + "Spellistans miniatyrbild förändrades " + Kunde inte ta bort spellistan + + Ingen textning + + Passa + Fyll + Zoom + + Auto-genererade + + Textning + Ändra spelaren textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft. + + Aktivera LeakCanary + Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning + + Rapportera Out-of-lifecycle fel + Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning + + Importera/Exportera + Importera + Importera från + Exportera till + + Importera… + Exporterar… + + Importera fil + Föregående export + + Kunde inte importera prenumerationer + kunde inte exportera prenumerationer + + Importera YouTube-prenumerationer genom att hämta export-filen: +\n +\n1. Gå till följande webbadress: %1$s +\n2. Logga in när du blir tillfrågad +\n3. En nedladdning ska starta (det är export-filen) + Importera en SoundCloud profil genom att skriva in webbadressen eller ditt ID: +\n +\n1. Aktivera \"skrivbordsläge\" i en webbläsare (sidan är inte tillgänglig för mobila enheter) +\n2. Gå till följande webbadress: %1$s +\n3. Logga in när du blir tillfrågad +\n4. Kopiera profilens webbadress som du blev omdirigerad till. + dittID, soundcloud.com/dittid + + Tänk på att operationer kan vara nätverks intensiv. +\n +\nVill du fortsätta? + + Uppspelningshastighet Kontroller + Tempo + Pitch + Avlänka (kan orsaka förvrängning) + Snabbspola vid frånvaro av ljud + Steg + Återställ + + För att uppfylla den Europeiska dataskyddsförordningen (GDPR), uppmärksammar vi NewPipes sekretesspolicy. Läs den noggrant. Du måste acceptera det om du vill skicka felrapporten. + Acceptera + Avböj + + Ingen gräns + Begränsa upplösningen när du använder mobil data + "Minimera vid växling av applikationen " + Åtgärd när du växlar till andra applikationer från huvudvideospelare — %s + Ingen + Minimera till Bakgrunds-spelare + Minimera till popup-spelare + + From ff769caf82ccaaaa548f2604904d00fdfaca8a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20Tapia=20Ram=C3=ADrez?= Date: Wed, 1 Aug 2018 01:25:12 +0000 Subject: [PATCH 144/363] Translated using Weblate (Spanish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-es/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 98dec6a54..57765c659 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -500,4 +500,6 @@ abrir en modo popup Canales Usuarios + Listas de reproducción + Pistas From 1aa3761d1afae60dbaa38fcabe26feb7c6de1062 Mon Sep 17 00:00:00 2001 From: Carles Pastor Badosa Date: Thu, 2 Aug 2018 03:22:26 +0200 Subject: [PATCH 145/363] Fix typo in v0.13.7 changelog --- fastlane/metadata/android/en-US/changelogs/66.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/en-US/changelogs/66.txt b/fastlane/metadata/android/en-US/changelogs/66.txt index 3bdc6ae6d..89eb0abbb 100644 --- a/fastlane/metadata/android/en-US/changelogs/66.txt +++ b/fastlane/metadata/android/en-US/changelogs/66.txt @@ -1,4 +1,4 @@ -# Chagelog of v0.13.7 +# Changelog of v0.13.7 ### Fixed - Fix sort filter issues of v0.13.6 From c6da4043edee9d15c09ca16dd2c9c9d4e48d8771 Mon Sep 17 00:00:00 2001 From: D D Date: Wed, 1 Aug 2018 05:59:18 +0000 Subject: [PATCH 146/363] Translated using Weblate (Bulgarian) Currently translated at 98.4% (377 of 383 strings) --- app/src/main/res/values-bg/strings.xml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 34e7867a9..019922f73 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -72,7 +72,7 @@ Възобнови при връщане на фокус Продължавай възпроизвеждането след прекъсване (например телефонно обаждане) Изтегли - Следващо видео + Следващ клип Показвай „следващ“ и „подобни“ Показвай съвет „задръж за добавяне“ Непознат URL @@ -157,7 +157,7 @@ Видео Аудио Опитай отново - Отказан достъп до хранилището (провери правата) + Достъпа до хранилището е отказан Използвай стария плейър Използваю стария вграден Mediaframewoek плейър @@ -174,8 +174,8 @@ Няма клипове - %s видео - %s видеота + %s клип + %s клипове Пауза @@ -251,7 +251,7 @@ Изтрива историята с въвежданите за търсене ключови думи. Изтрий цялата история на търсенията. Историята на търсенията е изтрита. - URL подписът на видеото не можа да бъде дешифрован + URL подписът на клипа не можа да бъде дешифрован Външните плейъри не поддържат този вид линкове Невалиден URL Невалидна директория @@ -286,7 +286,7 @@ Лицензът на NewPipe Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма) Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита. - Показвай подсказка, когато е избран фонов режим или режим в прозорец на страницата с детайли на съответното видео + Показвай подсказка, когато е избран фонов режим или режим в прозорец на страницата с детайли на съответния клип Изтрива историята на възпроизвежданите стриймове. Не са намерени видео стриймове Не са намерени аудио стриймове @@ -457,4 +457,10 @@ Минимизирай във фонов режим Минимизирай в прозорец - +Канали + Плейлисти + Песни + Потребители + Възстанови + + From d0704f621f44fdb9e3708fb53d81bd16fdc3e224 Mon Sep 17 00:00:00 2001 From: Maxime Burlandy Date: Wed, 1 Aug 2018 06:51:45 +0000 Subject: [PATCH 147/363] Translated using Weblate (French) Currently translated at 97.1% (372 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3ab89ec54..ede0f0d77 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -434,11 +434,11 @@ \n3. Un téléchargement va démarrer (ce sera celui du fichier nécessaire à l\'importation des abonnements)" Pour importer vos abonnements SoundCloud, vous devez connaitre l\'URL de votre profil ou votre identifiant (id). Si vous le savez, tapez-le ci-dessous. \n -\nSi vous ne le connaissez pas, veuillez suivre les étapes suivantes : +\nSi vous ne le connaissez pas, veuillez suivre les étapes suivantes : \n -\n1. Activer le \"mode bureau\" dans votre navigateur (le site n\'est pas accesible en mode mobile) -\n2. Suivez ce : %1$s -\n3. Connectez-vous à votre compte +\n1. Activer le \"mode bureau\" dans votre navigateur (le site n\'est pas accesible en mode mobile) +\n2. Suivez cette URL : %1$s +\n3. Connectez-vous à votre compte \n4. Copier l\'URL vers lequel vous venez d\'être redirigé (qui est l\'URL de votre profil) votreID, soundcloud.com/votreid @@ -485,4 +485,16 @@ \nVous devez l\'accepter pour nous envoyer le rapport de bug. Pas de limite Limiter la résolution en données mobile + Chaînes + Listes de lecture + Pistes + Utilisateurs + Accélérer pendant les silences + Étape + Réinitialiser + + Minimiser + Action lors du changement d\'applications depuis le lecteur vidéo + Aucune + Réduire From 342b2ae5dc0107eae77a25ccd798c625df71ad8e Mon Sep 17 00:00:00 2001 From: MadderRagax Date: Tue, 31 Jul 2018 22:53:44 +0000 Subject: [PATCH 148/363] Translated using Weblate (Swedish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7b75ea7e7..0a73d2fd8 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -25,9 +25,9 @@ Genväg för att lagra nerladdade videor i Fyll i genvägen som videor ska laddas ner till - Plats för att ladda ner ljud till - Plats för att lagra nerladdat ljud i - Ange nerladdningsplats för ljudfiler + Genväg för nerladdning av ljud + Genväg för att lagra nerladdade ljudfiler i + Fyll i genvägen som ljudfiler ska laddas ner till Automatiskt spelar en video upp när NewPipe öppnas av en annan app Standardupplösning @@ -120,7 +120,7 @@ Vad är nytt - Autospela + Spela upp automatiskt Sök historik Spara sökfrågor lokalt Historik & Cacheminne @@ -327,7 +327,7 @@ Ta bort hela visningshistoriken. Visningshistorik borttagen. Rensa sökhistorik - Tar bort historiken för söka nyckelord. + Tar bort historiken för sökta nyckelord. Ta bort hela sökhistoriken. Sökhistorik borttagen. Externa spelare stöder inte dessa typer av länkar From 4779a993d3771aec847756eda7a0cb96374386b0 Mon Sep 17 00:00:00 2001 From: YeeVonAngg Date: Wed, 1 Aug 2018 11:31:36 +0000 Subject: [PATCH 149/363] Translated using Weblate (Chinese (Mandarin)) Currently translated at 27.4% (105 of 383 strings) --- app/src/main/res/values-cmn/strings.xml | 53 ++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index 4016a40c8..852ac7f1e 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -69,4 +69,55 @@ 清理照片内存 最小化弹出播放器 - +清楚观看历史 + 已删除搜索历史 + 错误 + 网络错误 + 举报错误 + 没有结果 + 开始 + 暂停 + 播放 + 创建 + 删除 + 删除所有 + 新任务 + 好 +\n + + 错误 +\n + 服务器无法支持 + 文件已存在 + NewPipe 下载中 + 请稍等… + 字母与数字 + 最特别的字符 + + 这个文件里没有已下载应用程式 + + 关于NewPipe + 设置 + 关于 + 第三方执照 + 打开网页 + 删除书签 + + 请问你要删除这个列表吗? + 已创建播放列表 + 已加入播放列表 + 步骤 + 重置 + + 为了遵守欧洲通用数据保护法规(GDPR,我们请你注意NewPipe的隐私政策.请仔细阅读. +\n你必须接受它才能将错误报告发送给我们. + 接受 + 拒绝 + + 没有限制 + 使用移动数据时的解析度限制 + 最小化应用程序切换 + 从主视频播放器切换到其他应用程序时的操作 - %s + 没有 + 最小化背景播放器 + From 1313f685dae00c4adb4e7b1fc463b1ece2c5be8d Mon Sep 17 00:00:00 2001 From: YeeVonAngg Date: Wed, 1 Aug 2018 11:24:18 +0000 Subject: [PATCH 150/363] Translated using Weblate (Chinese (Simplified)) Currently translated at 97.1% (372 of 383 strings) --- app/src/main/res/values-zh-rCN/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8d4c99aaa..5118b42d6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -461,4 +461,7 @@ 不限制 使用移动数据时限制分辨率 + 更多频道 + 更多频道 + 用户们 From 6d8fdf46d54cd8bbc8eefd6a3fb92cb973085c82 Mon Sep 17 00:00:00 2001 From: ssantos Date: Thu, 2 Aug 2018 20:53:30 +0000 Subject: [PATCH 151/363] Translated using Weblate (German) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-de/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1ffdb4992..871a2535c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -493,4 +493,8 @@ Schritt Zurücksetzen + Kanäle + Wiedergabelisten + Titel + Nutzer From a9cf42499872b7643f43db251afed0847adbd00a Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 11:03:30 +0000 Subject: [PATCH 152/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8f0b81026..8f1727581 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,7 +20,7 @@ Разрешение по умолчанию Воспроизвести в Kodi Приложение Kore не найдено. Установить его? - Показать \"Воспроизвести в Kodi\" + \"Воспроизвести в Kodi\" Показать опцию воспроизведения видео через медиацентр Kodi Аудио Формат аудио по умолчанию @@ -128,7 +128,7 @@ Только некоторые устройства могут воспроизводить видео в 2K/4K Формат видео по умолчанию Чёрная - Запоминать размер и положение всплывающего окна + Восстановить всплывающее окно Изменять яркость и громкость жестами Всплывающее окно Воспроизведение во всплывающем окне @@ -162,7 +162,7 @@  тыс. Разрешение всплывающего окна Запоминать размер и положение всплывающего окна - Подсказки поиска + Варианты поиска Лучшее разрешение Старый встроенный плеер на Mediaframework @@ -200,7 +200,7 @@ Хранить поисковые запросы локально История и кэш Запоминать просмотренные видео - Возобновлять при возврате фокуса + Возобновлять при фокусе Возобновлять воспроизведение после перерывов (например, телефонных звонков) @@ -279,7 +279,7 @@ Удалить Вы подписаны Подписка отменена - Подсказка \"Зажмите, чтобы добавить\" + \"Зажмите, чтобы добавить\" Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео [Неизвестно] @@ -334,7 +334,7 @@ Быстрый неточный поиск Неточный поиск позволяет плееру искать позицию быстрее, но менее точно - Автоматическая очередь следующего стрима + Автовоспроизведение Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди. Отладка Файл @@ -471,7 +471,7 @@ 1 элемент удалён. NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. - Предпочтительное действие \"Открыть\" + При открытии контента Хотите импортировать настройки? Политика конфиденциальности NewPipe @@ -484,7 +484,7 @@ Отклонить Без ограничений - Предельное разрешение в мобильной сети + Предел разрешения в мобильной сети Каналы Плейлисты Дорожки @@ -493,7 +493,7 @@ Шаг Сброс - Сворачивать при переключении приложений + При сворачивании приложения При переключении воспроизведения видео со стандартного плеера на другое приложение — %s Ничего не делать Свернуть в режим фонового воспроизведения From d93e22719082bda31d031d3f577404dbab6e9daf Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 11:24:05 +0000 Subject: [PATCH 153/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8f1727581..f397cff1c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -334,8 +334,8 @@ Быстрый неточный поиск Неточный поиск позволяет плееру искать позицию быстрее, но менее точно - Автовоспроизведение - Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди. + Автодополнение очереди + Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди Отладка Файл @@ -461,12 +461,12 @@ Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу. Очистить историю просмотров - Удалить всю историю просмотров. + История просмотров будет удалена. История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов. Удалить историю воспроизведённых потоков. - Удалить всю историю поиска. + История поиска будет удалена. История поиска удалена. 1 элемент удалён. From 4cbe842cfac378d99664add32b2b927c5f56e6ea Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 12:01:13 +0000 Subject: [PATCH 154/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f397cff1c..2f6711073 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -342,7 +342,7 @@ Импорт данных Экспорт данных Ваша текущая история и подписки будут перезаписаны - Экспорт истории, подписок и плейлистов. + Экспорт истории, подписок и плейлистов Неверная папка Неверный файл или источник контента Файл не существует или нет разрешения на его чтение или запись From acad468b4a0a894ac42289af0ee72f34427d2bcb Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 12:02:07 +0000 Subject: [PATCH 155/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f6711073..5627d898a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -440,7 +440,7 @@ \n \nПродолжить? Загружать миниатюры - Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске. + Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен From d43cee29f22027d1ffbad850a10e1c9f9aae1d98 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 12:03:05 +0000 Subject: [PATCH 156/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5627d898a..f16ebfe97 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -458,7 +458,7 @@ Титры Приложение для воспроизведения этого файла не установлено - Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу. + Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу Очистить историю просмотров История просмотров будет удалена. From b86aa28d6aa29184705ed3d0c418641118b9d339 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 12:03:46 +0000 Subject: [PATCH 157/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f16ebfe97..6fe2f9ce5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -464,7 +464,7 @@ История просмотров будет удалена. История просмотров удалена. Очистить историю поиска - Удалить историю поисковых запросов. + Удалить историю поисковых запросов Удалить историю воспроизведённых потоков. История поиска будет удалена. История поиска удалена. From 407330653835a5979a31a99b164e7ac606de125e Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 12:04:42 +0000 Subject: [PATCH 158/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6fe2f9ce5..a50336e13 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -465,7 +465,7 @@ История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов - Удалить историю воспроизведённых потоков. + Удалить историю воспроизведённых потоков История поиска будет удалена. История поиска удалена. 1 элемент удалён. From 3d8683597949d2efc51af4036332dd9acd5d2757 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 12:05:33 +0000 Subject: [PATCH 159/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a50336e13..bf81740c3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -461,12 +461,12 @@ Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу Очистить историю просмотров - История просмотров будет удалена. + Вся история просмотров будет удалена. История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов Удалить историю воспроизведённых потоков - История поиска будет удалена. + Вся история поиска будет удалена. История поиска удалена. 1 элемент удалён. From 7a011d9e751285ea41526e9c1d0ca9ef623ec815 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:18:18 +0000 Subject: [PATCH 160/363] Translated using Weblate (Arabic) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 79cafbaed..c070dd189 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -309,7 +309,7 @@ استيراد قاعدة البيانات تصدير قاعدة البيانات "سيقوم بالكتابة على سجل التاريخ والاشتراكات الحالية " - تصدير سجل, الاشتراكات وقوائم التشغيل. + تصدير سجل, الاشتراكات وقوائم التشغيل عرض المعلومات إضافة إلى @@ -389,12 +389,12 @@ "معرفك , soundcloud.com/ الخاص بك " إفتراضي -تعطيل إيقاف جميع الصور المصغرة من تحميل البيانات واستخدام الذاكرة وحفظها. سيؤدي التغيير هذا إلى محو-ذاكرة التخزين المؤقت في الذاكرة-وذاكرة على القرص. +تعطيل إيقاف جميع الصور المصغرة من تحميل البيانات واستخدام الذاكرة وحفظها. سيؤدي التغيير هذا إلى محو-ذاكرة التخزين المؤقت في الذاكرة-وذاكرة على القرص امسح البيانات الوصفية المخزنة مؤقتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا تم محو ذاكرة التخزين المؤقت للبيانات الوصفية وضع البث القادم تلقائيا في قائمة الإنتظار - رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار. + رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار إضافة صورة مصغرة إلى قائمة التشغيل قائمة التشغيل المخزنة @@ -402,7 +402,7 @@ بدون تسميات توضيحية تسميات توضيحية - تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول. + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول تمكين LeakCanary قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات @@ -411,11 +411,11 @@ فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها محو سجل المشاهدة - احذف محفوظات الفديوهات التي تم تشغيلها. + احذف محفوظات الفديوهات التي تم تشغيلها حذف سجل المشاهدة بالكامل. سجل المشاهدة محذوف. محو سجل البحث - يحذف تاريخ البحث عن الكلمات الرئيسية. + يحذف تاريخ البحث عن الكلمات الرئيسية حذف محفوظات البحث بالكامل. سجل البحث المحذوف. المشغل الخارجي لا يدعم هذه الأنواع من الروابط From 35229f8ae57091f389d9b3418a5319b22c36f4bf Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:19:25 +0000 Subject: [PATCH 161/363] Translated using Weblate (Basque) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-eu/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 8be6aad2d..1dfc8f059 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -328,20 +328,20 @@ Kendu cache-ko wegbuneen datu guztiak Metadatuen cache-a ezabatuta Gehitu ilarara hurrengo jarioa - Gehitu erlazionatutako jario bat azken jarioa jo bitartean errepikapenik gabeko ilara batean. + Gehitu erlazionatutako jario bat azken jarioa jo bitartean errepikapenik gabeko ilara batean Arazketa Fitxategia Inportatu datu-basea Esportatu datu-basea Zure uneko historiala eta harpidetzak gainidatziko ditu - Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak. + Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak Garbitu ikusitakoaren historiala - Jotako jarioen historiala ezabatzen du. + Jotako jarioen historiala ezabatzen du Ezabatu ikusitakoaren historial osoa. Ikusitakoaren historiala ezabatuta. Garbitu bilaketa historiala - Ezabatu bilaketa gakoen historiala. + Ezabatu bilaketa gakoen historiala Ezabatu bilaketen historial osoa. Bilaketen historiala ezabatuta. Direktorio baliogabea @@ -407,7 +407,7 @@ Automatikoki sortuak Azpitituluak - Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko. + Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko Gaitu LeakCanary Memoria galeren monitorizazioa. Aplikazioak agian ez du erantzungo memoriaren aitortza egin bitartean @@ -453,7 +453,7 @@ Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du - "Desgaitu iruditxoak kargatzea gelditzeko eta datuak eta memoria aurrezteko. Hau aldatzean memoria eta diskoko irudien cache-ak garbituko dira." + "Desgaitu iruditxoak kargatzea gelditzeko eta datuak eta memoria aurrezteko. Hau aldatzean memoria eta diskoko irudien cache-ak garbituko dira" 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. Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena From ad4799ee60f8bcc3a810f41d37373c960304f691 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:21:57 +0000 Subject: [PATCH 162/363] Translated using Weblate (Dutch) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 007b3e232..0a117443d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -331,7 +331,7 @@ te openen in pop-upmodus Database importeren Database exporteren Dit zal je huidige geschiedenis en abonnementen overschrijven - Exporteer geschiedenis, abonnementen en speellijsten. + Exporteer geschiedenis, abonnementen en speellijsten Export voltooid Import voltooid Geen geldig ZIP-bestand @@ -399,7 +399,7 @@ te openen in pop-upmodus Snelle, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Volgende stream automatisch in wachtrij plaatsen - Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst. + Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst SYNCHRONISEREN Bestand @@ -441,7 +441,7 @@ te openen in pop-upmodus \n \nWil je doorgaan? Miniatuurvoorbeelden laden - Schakel dit uit om alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache. + Schakel dit uit om alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -458,16 +458,16 @@ te openen in pop-upmodus Geen streams beschikbaar voor downloaden Bijschriften - Bijschriftgrootte en achtergrondstijlen wijzigen. Vereist een herstart van de app. + Bijschriftgrootte en achtergrondstijlen wijzigen. Vereist een herstart van de app Er is geen app geïnstalleerd die dit bestand kan afspelen Kijkgeschiedenis wissen - Verwijdert de geschiedenis van afgespeelde streams. + Verwijdert de geschiedenis van afgespeelde streams Verwijdert de gehele kijkgeschiedenis. Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen - Verwijdert de gebruikte zoektermen. + Verwijdert de gebruikte zoektermen Verwijdert de gehele geschiedenis. Zoekgeschiedenis verwijderd. 1 item verwijderd. From 4988b37d6f81bbd63f0af1e407424e1968d1defd Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:22:44 +0000 Subject: [PATCH 163/363] Translated using Weblate (Spanish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-es/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 57765c659..2c974e935 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -330,7 +330,7 @@ abrir en modo popup Importar base de datos Exportar base de datos Reemplazará su historial actual y sus suscripciones - Exportar historial, suscripciones y listas de reproducción. + Exportar historial, suscripciones y listas de reproducción Exportación completa Importación completa Archivo ZIP no válido @@ -403,7 +403,7 @@ abrir en modo popup Usar búsqueda rápida inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión Auto-encolar la siguiente transmisión - Auto-añadir un vídeo relacionado al reproducir el último vídeo en una cola no repetitiva. + Auto-añadir un vídeo relacionado al reproducir el último vídeo en una cola no repetitiva DIRECTO SINCRONIZAR Archivo @@ -445,7 +445,7 @@ abrir en modo popup \n \n¿Desea continuar? Cargar Miniaturas - Descativar todas las miniaturas para evitar que se carguen, guarden datos y usen memoria. Al cambiar esto se borrarán tanto la caché de imágenes en la memoria como en el disco. + Descativar todas las miniaturas para evitar que se carguen, guarden datos y usen memoria. Al cambiar esto se borrarán tanto la caché de imágenes en la memoria como en el disco Caché de imagen limpiado Metadatos eliminados del caché Eliminar todos los datos de la página web en caché @@ -464,14 +464,14 @@ abrir en modo popup No hay ninguna app instalada para reproducir este archivo Subtítulos - Modificar la escala de texto de los subtítulos y los estilos de fondo del reproductor. Requiere el reinicio de la app para que surta efecto. + Modificar la escala de texto de los subtítulos y los estilos de fondo del reproductor. Requiere el reinicio de la app para que surta efecto Borrar historial de reproducciones - Elimina el historial de las transmisiones reproducidas. + Elimina el historial de las transmisiones reproducidas Elimina todo el historial de reproducciones. Historial de reproducciones eliminado. Borrar historial de búsqueda - Elimina el historial de palabras clave de búsqueda. + Elimina el historial de palabras clave de búsqueda Elimina todo el historial de búsqueda. Historial de búsquedas eliminado. 1 elemento eliminado. From 90ba8440a06c0cfe4b7e7f942303e6a4cfe019b9 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:24:25 +0000 Subject: [PATCH 164/363] Translated using Weblate (Catalan) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 700506bce..5f1dfafa7 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -61,7 +61,7 @@ Importa una base de dades Exporta una base de dades - Exporta l\'historial, les subscripcions i les llistes de reproducció. + Exporta l\'historial, les subscripcions i les llistes de reproducció Error Error de xarxa Vídeo @@ -310,7 +310,7 @@ Toqueu el botó de cerca per començar En algunes resolucions NO hi haurà àudio quan aquesta opció estigui activada Reproductor d\'àudio extern - Desactiveu-ho per evitar que es carreguin les miniatures i estalviar dades i memòria. Si canvieu aquesta opció, s\'esborrarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge. + Desactiveu-ho per evitar que es carreguin les miniatures i estalviar dades i memòria. Si canvieu aquesta opció, s\'esborrarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge Emmagatzema les cerques localment Registra els vídeos visualitzats Reprèn automàticament @@ -390,7 +390,7 @@ Desvincula (pot provocar distorsió) Nightcore Elimina totes les dades de llocs web de la memòria cau - Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició. + Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició Mostra els missatges d\'ajuda Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo Què ha passat:\\nPetició:\\nIdioma del contingut:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO: @@ -425,16 +425,16 @@ No hi ha vídeos que es puguin baixar Subtítols - Modifica la mida del text i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis. + Modifica la mida del text i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis No s\'ha trobat cap aplicació que pugui reproduir aquest fitxer Esborra l\'historial de reproduccions - Esborra l\'historial dels vídeos que s\'han reproduït. + Esborra l\'historial dels vídeos que s\'han reproduït Esborra tot l\'historial de reproduccions. S\'ha esborrat l\'historial de reproduccions. Esborra l\'historial de cerca - Esborra l\'historial de paraules cercades. + Esborra l\'historial de paraules cercades Esborra tot l\'historial de cerca. S\'ha esborrat l\'historial de cerca. S\'ha esborrat 1 element. From 9034b9a9aef396826dfde705706f1cb049f3c1e1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:25:38 +0000 Subject: [PATCH 165/363] Translated using Weblate (Chinese (Traditional)) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1d02fcbae..ba7c66cf5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -271,7 +271,7 @@ 匯入資料庫 匯出資料庫 將覆蓋您目前的歷史記錄和訂閱 - 匯出歷史記錄、訂閱和播放清單。 + 匯出歷史記錄、訂閱和播放清單 返回 欲了解更多關於 NewPipe 的資訊和新聞,請造訪我們的網站。 首頁內容 @@ -382,7 +382,7 @@ 使用粗略但快速的尋找 粗略尋找讓播放器更快找到影片的進度位置 自動播放隊列中下一部影片 - 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流。 + 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流 同步 檔案 @@ -424,7 +424,7 @@ \n3. 詢問時登入到您的帳號 \n4. 複製您被重新導向到的網址。 載入縮圖 - 停用後,NewPipe將不再載入縮圖,減少數據使用與騰空儲存空間,亦會清除記憶體和磁碟上的縮圖快取。 + 停用後,NewPipe將不再載入縮圖,減少數據使用與騰空儲存空間,亦會清除記憶體和磁碟上的縮圖快取 已清除圖片快取 抹除快取中介資料 移除所有網頁的快取資料 @@ -441,16 +441,16 @@ 沒有可供下載的串流 字幕 - 調整播放器字幕大小與背景樣式。必須重新啟動應用程式才會生效。 + 調整播放器字幕大小與背景樣式。必須重新啟動應用程式才會生效 未安裝可播放此檔案的應用程式 清除觀看歷史 - 刪除播放過的串流歷史。 + 刪除播放過的串流歷史 刪除全部的觀看歷史。 觀看歷史已刪除。 清除觀看歷史 - 刪除搜尋關鍵字的歷史。 + 刪除搜尋關鍵字的歷史 刪除全部的搜尋歷史。 搜尋歷史已刪除。 已刪除 1 個項目。 From 3519d4b219bd5ae80c3821729b98513fb2a92863 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:27:21 +0000 Subject: [PATCH 166/363] Translated using Weblate (German) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-de/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 871a2535c..51b91eb5f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -329,7 +329,7 @@ Datenbank importieren Datenbank exportieren Wird deinen Verlauf und deine Abos überschreiben - Verlauf, Abos und Wiedergabelisten exportieren. + Verlauf, Abos und Wiedergabelisten exportieren Keine gültige ZIP-Datei Warnung: Nicht alle Dateien konnten importiert werden. Dies wird deine aktuellen Einstellungen überschreiben. @@ -421,9 +421,9 @@ Verknüpfung aufheben (kann zu Verzerrungen führen) Nightcore Standard -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. +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 Nächsten Stream automatisch einreihen - Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange. + Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange Hier wird bald etwas stehen ;D @@ -456,16 +456,16 @@ Standardaktion beim Öffnen von Inhalten - %s Untertitel - Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam. + Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam Keine App zum Abspielen dieser Datei installiert Verlauf leeren - Löscht den Verlauf der abgespielten Streams. + Löscht den Verlauf der abgespielten Streams Löscht den ganzen Verlauf. Verlauf gelöscht. Suchverlauf löschen - Lösche Verlauf der Suchschlüsselwörter. + Lösche Verlauf der Suchschlüsselwörter Lösche gesamten Suchverlauf. Suchverlauf gelöscht. 1 Element gelöscht. From 086e9beb59ec35d25921f2382c8a4c879b037555 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:29:20 +0000 Subject: [PATCH 167/363] Translated using Weblate (Turkish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 251eab263..df5f25999 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -326,7 +326,7 @@ Veri tabanını içe aktar Veri tabanını dışa aktar Şu anki geçmişinizi ve aboneliklerinizi geçersiz kılar - Geçmişi, abonelikleri ve oynatma listelerini dışa aktar. + Geçmişi, abonelikleri ve oynatma listelerini dışa aktar Dışa aktarım bitti İçe aktarım bitti Geçerli ZIP dosyası yok @@ -395,7 +395,7 @@ Hızlı isabetsiz konumlama kullan İsabetsiz konumlama, oynatıcının azaltılmış kesinlikle daha hızlı konumlama yapmasını sağlar Sonraki akışı kendiliğinden kuyruğa ekle - Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle. + Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle EŞZAMANLA Dosya @@ -437,7 +437,7 @@ \n \nDevam etmek istiyor musunuz? Küçük resimleri yükle - 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. + 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 Resim önbelleği temizlendi Önbelleklenmiş üst veriyi temizle Önbelleklenmiş tüm web sayfası verisini kaldır @@ -454,16 +454,16 @@ İçerik açılırken öntanımlı eylem — %s Ek Açıklamalar - Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir. + Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir Bu dosyayı oynatmak için kurulan uygulama yok İzleme geçmişini temizle - Oynatılan akışların geçmişini siler. + Oynatılan akışların geçmişini siler Tüm izleme geçmişini sil. İzleme geçmişi silindi. Arama geçmişini temizle - Aranan anahtar sözcüklerin geçmişini siler. + Aranan anahtar sözcüklerin geçmişini siler Tüm arama geçmişini sil. Arama geçmişi silindi. 1 öge silindi. From 321342cf6d914f62a9df3d4f7b25dc8c4e9adbf6 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:30:12 +0000 Subject: [PATCH 168/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7805a8fba..19209941b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -310,7 +310,7 @@ abrir em modo popup Importar base de dados Exportar base de dados Isso irá sobrescrever seu histórico e inscrições - Exportar histórico, inscrições e listas de reprodução. + Exportar histórico, inscrições e listas de reprodução Exportação completa Importação completa Não há nenhum arquivo ZIP válido @@ -379,7 +379,7 @@ abrir em modo popup Usar índice de indexação rápido porém não preciso Usar índice de indexação inexato Adicionar a próxima stream à fila automaticamente - Auto anexar uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva. + Auto anexar uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva Sincronizar Arquivo @@ -427,7 +427,7 @@ abrir em modo popup Cache de metadados foi limpo Controles de Velocidade de Reprodução "Tempo " - Desabilite para para de carregar todas as miniaturas e economizar dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco. + Desabilite para para de carregar todas as miniaturas e economizar dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco Passo Desvincular (pode causar distorção) Padrão @@ -439,17 +439,17 @@ abrir em modo popup Abrir gaveta Fechar gaveta Legendas - Modifique o tamanho da legenda e o estilo da tela de fundo. Necessário reiniciar o aplicativo para ter efeito. + Modifique o tamanho da legenda e o estilo da tela de fundo. Necessário reiniciar o aplicativo para ter efeito Night-core Nenhum player instalado para reproduzir este arquivo "Limpar histórico de já assistidos " - Deleta o histórico de videos já reproduzidos. + Deleta o histórico de videos já reproduzidos Deleta todo o histórico de já reproduzidos. Histórico de já assistidos deletado. Limpar histórico de pesquisa - Deleta histórico de palavras chave pesquisadas. + Deleta histórico de palavras chave pesquisadas Deletar todo o histórico de pesquisa. Histórico de pesquisa deletado. 1 item deletado. From 47a1fca32f79c33ee2482a6aca98292ad850a4a5 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:31:02 +0000 Subject: [PATCH 169/363] Translated using Weblate (Ukrainian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 582dd35ba..80f8a1d10 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -192,7 +192,7 @@ Імпортувати базу Експортувати базу Це перепише чинну історію та підписання - Експортувати історію, підписання та плейлисти. + Експортувати історію, підписання та плейлисти Неможливо відтворити цей стрим Відновлююсь після помилки програвача Помилкова URL @@ -387,7 +387,7 @@ Використовувати неточне шукання Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю Автоматично додати до черги наступний стрим - Автоматично додавати пов\'язаний стрим під час відтворення останнього у неповторювальній черзі. + Автоматично додавати пов\'язаний стрим під час відтворення останнього у неповторювальній черзі СИНХРОНІЗАЦІЯ Теки @@ -429,7 +429,7 @@ \n \nПродовжуватимете? Завантажити ескізи - Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного вичищення кешу зображень. + Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного вичищення кешу зображень Кеш зображень стерто Стерти кеш метаданих "Усунути всі кешовані дані веб-сторінки " @@ -446,16 +446,16 @@ Типова дія під час відкриття вмісту — %s Субтитри - Змінення маштабу тексту субтитрів та фонових стилів. Увімкнення функції потребує перезавантаження застосунку. + Змінення маштабу тексту субтитрів та фонових стилів. Увімкнення функції потребує перезавантаження застосунку Не знайдено відповідного застосунку для відтворення цього файла Очистити історію переглядів - Видаляє історію відтворень. + Видаляє історію відтворень Видалити всю історію переглядів. Історію переглядів було видалено. Очистити історію пошуків - Видаляє історію шуканих ключових слів. + Видаляє історію шуканих ключових слів Видалити всю пошукову історію. Пошукову історію було видалено. Видалено один фраґмент. From 01938af65bded7c11f979dc75ff5827db41a2df1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:31:54 +0000 Subject: [PATCH 170/363] Translated using Weblate (Swedish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0a73d2fd8..ebd9e934c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -292,7 +292,7 @@ Använda snabb inexact sökning Ladda miniatyrer - Inaktivera för att stoppa alla miniatyrbilder från att ladda och spara på data och minnesanvändning. Ändring av detta kommer att rensa cache-minnet. + Inaktivera för att stoppa alla miniatyrbilder från att ladda och spara på data och minnesanvändning. Ändring av detta kommer att rensa cache-minnet Bild cacheminnet var rensad Tjänst Debug @@ -308,7 +308,7 @@ Ta bort alla cachade webbsidor Metadata cache rensad "Köa nästa ström automatiskt " - Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö. + Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö Standard innehåll land Kanaler Spellistor @@ -321,13 +321,13 @@ Importera databas Exportera databas Kommer att skriva över din nuvarande historik och prenumerationer - Exportera historik, prenumerationer och spellistor. + Exportera historik, prenumerationer och spellistor Rensa visningshistorik - Tar bort historiken för spelade videoklipp. + Tar bort historiken för spelade videoklipp Ta bort hela visningshistoriken. Visningshistorik borttagen. Rensa sökhistorik - Tar bort historiken för sökta nyckelord. + Tar bort historiken för sökta nyckelord Ta bort hela sökhistoriken. Sökhistorik borttagen. Externa spelare stöder inte dessa typer av länkar @@ -410,7 +410,7 @@ Auto-genererade Textning - Ändra spelaren textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft. + Ändra spelaren textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft Aktivera LeakCanary Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning From cdb409612495a3abcf5e9a505c5ba8656e88d278 Mon Sep 17 00:00:00 2001 From: PiR Date: Fri, 3 Aug 2018 07:22:16 +0000 Subject: [PATCH 171/363] Translated using Weblate (French) Currently translated at 97,1% (372 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ede0f0d77..acc85dae9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -403,7 +403,7 @@ Télécharger le fichier de flux Vidéo suivante en file d\'attente - Ajout automatique d\'un flux connexe lors de la lecture du dernier flux dans une file d\'attente non répétitive. + Ajout automatique d\'un morceau suggéré lors de la lecture du dernier morceau dans une file d\'attente non bouclée. Débogage Remplir Générés automatiquement @@ -448,7 +448,7 @@ Vitesse de lecture Cadence - Unhook (déformations possibles) + Détacher (déformations possibles) Défaut Ouvrir de préférence avec Action par défaut lors de l\'ouverture de contenu - %s @@ -493,8 +493,10 @@ Étape Réinitialiser - Minimiser - Action lors du changement d\'applications depuis le lecteur vidéo + Minimiser lors du changement d\'application + Action lors du changement d\'applications depuis le lecteur vidéo —%s Aucune - Réduire - + Lecture en arrière plan + Mettre en lecteur popup + + From f220f397ae88655014252fba928e5443e9d6b2f8 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:32:46 +0000 Subject: [PATCH 172/363] Translated using Weblate (French) Currently translated at 97,1% (372 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index acc85dae9..e74c948fd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -384,7 +384,7 @@ Recherche rapide approximative Permettre au lecteur d\'accéder plus rapidement à une position au détriment de la précision Charger miniatures - Désactiver pour arrêter le chargement de toutes les miniatures et sauvegarder les données et l\'utilisation de la mémoire. Modifier cela effacera à la fois le cache d\'image en mémoire et sur disque. + Désactiver pour arrêter le chargement de toutes les miniatures et sauvegarder les données et l\'utilisation de la mémoire. Modifier cela effacera à la fois le cache d\'image en mémoire et sur disque Images en cache effacées Effacer les données en cache Effacer toutes les pages web mises en cache From 50f92269c2f6db7ebcb9ed990942d7aa2e2e9964 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 18:51:07 +0000 Subject: [PATCH 173/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bf81740c3..c456d5f9f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -75,7 +75,7 @@ Выберите доступную папку для загрузки - Контент с ограничением по возрасту + Контент 18+ Ошибка Ваш комментарий (English): Не удалось создать папку для загрузки \"%1$s\" @@ -208,7 +208,7 @@ Уведомления для NewPipe в фоне и во всплывающем окне Загрузки - Допустимые символы в именах файлов + Допустимые символы имён файлов Недопустимые символы заменяются на этот Символ для замены @@ -461,12 +461,12 @@ Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу Очистить историю просмотров - Вся история просмотров будет удалена. + Вся история просмотров будет удалена История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов Удалить историю воспроизведённых потоков - Вся история поиска будет удалена. + Вся история поиска будет удалена История поиска удалена. 1 элемент удалён. From 2f641ffb137119212bff5e033533decd3290caa1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:38:38 +0000 Subject: [PATCH 174/363] Translated using Weblate (Arabic) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c070dd189..1009e8e87 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -412,11 +412,11 @@ محو سجل المشاهدة احذف محفوظات الفديوهات التي تم تشغيلها - حذف سجل المشاهدة بالكامل. + حذف سجل المشاهدة بالكامل سجل المشاهدة محذوف. محو سجل البحث يحذف تاريخ البحث عن الكلمات الرئيسية - حذف محفوظات البحث بالكامل. + حذف محفوظات البحث بالكامل سجل البحث المحذوف. المشغل الخارجي لا يدعم هذه الأنواع من الروابط مصدر ملف / مصدر غير صالح From 67f70ce2cc00692478b6df1f1191ff2a3c07d998 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:39:02 +0000 Subject: [PATCH 175/363] Translated using Weblate (Basque) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-eu/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 1dfc8f059..9f9fceb8b 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -338,11 +338,11 @@ Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak Garbitu ikusitakoaren historiala Jotako jarioen historiala ezabatzen du - Ezabatu ikusitakoaren historial osoa. + Ezabatu ikusitakoaren historial osoa Ikusitakoaren historiala ezabatuta. Garbitu bilaketa historiala Ezabatu bilaketa gakoen historiala - Ezabatu bilaketen historial osoa. + Ezabatu bilaketen historial osoa Bilaketen historiala ezabatuta. Direktorio baliogabea Fitxategi edo edukiaren iturri baliogabea From 4575ee805a616f190a9a13730b3f7e30236c3e10 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:39:58 +0000 Subject: [PATCH 176/363] Translated using Weblate (Dutch) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0a117443d..358e76fde 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -464,11 +464,11 @@ te openen in pop-upmodus Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams - Verwijdert de gehele kijkgeschiedenis. + Verwijdert de gehele kijkgeschiedenis Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen - Verwijdert de gehele geschiedenis. + Verwijdert de gehele geschiedenis Zoekgeschiedenis verwijderd. 1 item verwijderd. From 0cfac137b7d4aff03049f2b451941bad95015372 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:41:12 +0000 Subject: [PATCH 177/363] Translated using Weblate (Spanish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-es/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2c974e935..b2aca1df6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -468,11 +468,11 @@ abrir en modo popup Borrar historial de reproducciones Elimina el historial de las transmisiones reproducidas - Elimina todo el historial de reproducciones. + Elimina todo el historial de reproducciones Historial de reproducciones eliminado. Borrar historial de búsqueda Elimina el historial de palabras clave de búsqueda - Elimina todo el historial de búsqueda. + Elimina todo el historial de búsqueda Historial de búsquedas eliminado. 1 elemento eliminado. From d9dfcc04bfa7e31051305f717ca85c392a1507bd Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:42:09 +0000 Subject: [PATCH 178/363] Translated using Weblate (Catalan) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 5f1dfafa7..eeea5dffe 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -431,11 +431,11 @@ Esborra l\'historial de reproduccions Esborra l\'historial dels vídeos que s\'han reproduït - Esborra tot l\'historial de reproduccions. + Esborra tot l\'historial de reproduccions S\'ha esborrat l\'historial de reproduccions. Esborra l\'historial de cerca Esborra l\'historial de paraules cercades - Esborra tot l\'historial de cerca. + Esborra tot l\'historial de cerca S\'ha esborrat l\'historial de cerca. S\'ha esborrat 1 element. From 439a814133de701d4df8c48693773a83a7094f5c Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:42:34 +0000 Subject: [PATCH 179/363] Translated using Weblate (Chinese (Traditional)) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ba7c66cf5..2e6610381 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -447,11 +447,11 @@ 清除觀看歷史 刪除播放過的串流歷史 - 刪除全部的觀看歷史。 + 刪除全部的觀看歷史 觀看歷史已刪除。 清除觀看歷史 刪除搜尋關鍵字的歷史 - 刪除全部的搜尋歷史。 + 刪除全部的搜尋歷史 搜尋歷史已刪除。 已刪除 1 個項目。 From fb43a5265c9a190482c8cce071889fd95b5e5f50 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:44:05 +0000 Subject: [PATCH 180/363] Translated using Weblate (German) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 51b91eb5f..c58ab68e9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -462,11 +462,11 @@ Verlauf leeren Löscht den Verlauf der abgespielten Streams - Löscht den ganzen Verlauf. + Löscht den ganzen Verlauf Verlauf gelöscht. Suchverlauf löschen Lösche Verlauf der Suchschlüsselwörter - Lösche gesamten Suchverlauf. + Lösche gesamten Suchverlauf Suchverlauf gelöscht. 1 Element gelöscht. From 7e7cfb79a402963d432b5f74acbb509d1036d79a Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:45:41 +0000 Subject: [PATCH 181/363] Translated using Weblate (Ukrainian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 80f8a1d10..313448323 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -452,11 +452,11 @@ Очистити історію переглядів Видаляє історію відтворень - Видалити всю історію переглядів. + Видалити всю історію переглядів Історію переглядів було видалено. Очистити історію пошуків Видаляє історію шуканих ключових слів - Видалити всю пошукову історію. + Видалити всю пошукову історію Пошукову історію було видалено. Видалено один фраґмент. From a87f6a0791b2b8a578c8e2c2707fdcf05db42744 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:46:10 +0000 Subject: [PATCH 182/363] Translated using Weblate (Swedish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index ebd9e934c..675514f17 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -324,11 +324,11 @@ Exportera historik, prenumerationer och spellistor Rensa visningshistorik Tar bort historiken för spelade videoklipp - Ta bort hela visningshistoriken. + Ta bort hela visningshistoriken Visningshistorik borttagen. Rensa sökhistorik Tar bort historiken för sökta nyckelord - Ta bort hela sökhistoriken. + Ta bort hela sökhistoriken Sökhistorik borttagen. Externa spelare stöder inte dessa typer av länkar Ogiltig URL From d2235da06a809b3a87488e0a29e87ab8b17e2ebc Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:49:50 +0000 Subject: [PATCH 183/363] Translated using Weblate (Turkish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index df5f25999..15fbc4130 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -460,11 +460,11 @@ İzleme geçmişini temizle Oynatılan akışların geçmişini siler - Tüm izleme geçmişini sil. + Tüm izleme geçmişini sil İzleme geçmişi silindi. Arama geçmişini temizle Aranan anahtar sözcüklerin geçmişini siler - Tüm arama geçmişini sil. + Tüm arama geçmişini sil Arama geçmişi silindi. 1 öge silindi. From 5b8393ff89ae2620cd9541eec639d16a1c978bbc Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:51:48 +0000 Subject: [PATCH 184/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 19209941b..3ec466bba 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -446,11 +446,11 @@ abrir em modo popup "Limpar histórico de já assistidos " Deleta o histórico de videos já reproduzidos - Deleta todo o histórico de já reproduzidos. + Deleta todo o histórico de já reproduzidos Histórico de já assistidos deletado. Limpar histórico de pesquisa Deleta histórico de palavras chave pesquisadas - Deletar todo o histórico de pesquisa. + Deletar todo o histórico de pesquisa Histórico de pesquisa deletado. 1 item deletado. From b0126afbcfed297f94574abb86ed16702cb5097b Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:38:34 +0000 Subject: [PATCH 185/363] Translated using Weblate (Estonian) Currently translated at 91.6% (351 of 383 strings) --- app/src/main/res/values-et/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 2ee7fb37d..7f08efd38 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -69,13 +69,13 @@ Kasuta ebatäpset kerimist Ebatäpne kerimine lubab pleieril otsida asukohta kiiremini täpsuse arvel Laadi pisipildid - Keela, peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal. + Keela, peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal Pildid kustutati vahemälust Kustuta metaandmed vahemälust Kustuta veebilehtede andmed vahemälust Metaandmed kustutati vahemälust Järgmine voog automaatselt järjekorda - Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast. + Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast Pleieri juhtimise viiped Luba viiped helitugevuse ja ereduse juhtimiseks Kuva soovitused @@ -143,14 +143,14 @@ Impordi andmebaas Ekspordi andmebaas Alistab praeguse ajaloo ja tellimused - Ekspordi ajalugu, tellimused ja pleilistid. + Ekspordi ajalugu, tellimused ja pleilistid Puhasta vaatamiste ajalugu - Kustutab vaadatud voogude ajaloo. - Kustuta kogu vaatamiste ajalugu. + Kustutab vaadatud voogude ajaloo + Kustuta kogu vaatamiste ajalugu Vaatamiste ajalugu kustutati. Kustuta otsinguajalugu - Kustutab otsisõnade ajaloo. - Kustuta kogu otsinguajalugu. + Kustutab otsisõnade ajaloo + Kustuta kogu otsinguajalugu Otsinguajalugu kustutati. Viga Võrgu viga @@ -382,7 +382,7 @@ Automaatselt loodud Subtiitrid - Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada. + Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada Mälulekke seire võib põhjustada rakenduse hangumise From f706452e678801f762f92dff5fbb1399c0f9683e Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 19:38:06 +0000 Subject: [PATCH 186/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c456d5f9f..051a52ffd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -332,7 +332,7 @@ Добавить к - Быстрый неточный поиск + Быстрый поиск позиции Неточный поиск позволяет плееру искать позицию быстрее, но менее точно Автодополнение очереди Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди @@ -447,7 +447,7 @@ Управление скоростью воспроизведения Темп Тон - Независимо (возможны искажения) + Независимо (искажения) Nightcore По умолчанию Удалить все загруженные данные веб-страниц From a81f31156d29d0909613b404d33ee988140b8ca1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 00:51:16 +0000 Subject: [PATCH 187/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 051a52ffd..b951468a5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -31,7 +31,7 @@ URL не поддерживается \"Следующее\" и \"Предложенные\" видео Язык контента по умолчанию - Видео и Аудио + Видео и аудио Внешний вид Другое @@ -225,7 +225,7 @@ Плеер Поведение - История и Кэш + История и кэш Плейлист Отменить From 75f89059e763281b5acf92912446faaeff4ee2a9 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 08:42:36 +0000 Subject: [PATCH 188/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b951468a5..e14ac0ffa 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -200,7 +200,7 @@ Хранить поисковые запросы локально История и кэш Запоминать просмотренные видео - Возобновлять при фокусе + Возобновить при фокусе Возобновлять воспроизведение после перерывов (например, телефонных звонков) @@ -451,7 +451,7 @@ Nightcore По умолчанию Удалить все загруженные данные веб-страниц - Действие по умолчанию при открытии контента — %s + По умолчанию, при открытии контента — %s Нет потоков, доступных для загрузки @@ -493,8 +493,8 @@ Шаг Сброс - При сворачивании приложения - При переключении воспроизведения видео со стандартного плеера на другое приложение — %s + Сворачивание при переключении + При переключении со стандартного плеера на другое приложение — %s Ничего не делать Свернуть в режим фонового воспроизведения Свернуть в режим всплывающего окна From 04f759041f3878b3e8f484c32fbc310975a4fdaa Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 08:52:12 +0000 Subject: [PATCH 189/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e14ac0ffa..e943f534a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -458,7 +458,7 @@ Титры Приложение для воспроизведения этого файла не установлено - Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу + Изменить размер и фон титров. Изменения вступят в силу после перезапуска Очистить историю просмотров Вся история просмотров будет удалена From 99ee076db9f3f9d53de4a6455bfa0798bd4dfa15 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 09:09:22 +0000 Subject: [PATCH 190/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e943f534a..fc1539564 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -451,7 +451,7 @@ Nightcore По умолчанию Удалить все загруженные данные веб-страниц - По умолчанию, при открытии контента — %s + При открытии контента — %s Нет потоков, доступных для загрузки @@ -493,7 +493,7 @@ Шаг Сброс - Сворачивание при переключении + При сворачивании плеера При переключении со стандартного плеера на другое приложение — %s Ничего не делать Свернуть в режим фонового воспроизведения From 3683deb51c363a0d6e2b8d13d7b9694a8fa3f35c Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 09:31:37 +0000 Subject: [PATCH 191/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fc1539564..5d12a9e71 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -335,7 +335,7 @@ Быстрый поиск позиции Неточный поиск позволяет плееру искать позицию быстрее, но менее точно Автодополнение очереди - Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди + Добавлять похожие потоки в очередь при воспроизведении последнего, если не включён повтор Отладка Файл @@ -440,7 +440,7 @@ \n \nПродолжить? Загружать миниатюры - Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске + Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и накопителе Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен From cebf349f9a1b579a33bd98c7def27ec18f07e964 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 09:57:38 +0000 Subject: [PATCH 192/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5d12a9e71..c2acfa6d3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -451,7 +451,7 @@ Nightcore По умолчанию Удалить все загруженные данные веб-страниц - При открытии контента — %s + При открытии ссылки на контент — %s Нет потоков, доступных для загрузки From 4a673eee8171a19f05c45cb1bec468843f9a013d Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 10:05:39 +0000 Subject: [PATCH 193/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c2acfa6d3..1fc017d41 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -323,10 +323,10 @@ Плеер в окне Всегда спрашивать - Получение информации… + Получение сведений… Загрузка запрошенного контента Загрузка файла прямой трансляции. - Показать информацию + Показать сведения Закладки From bd337f3aacb5ab98b8c71667895f475ea0022bdc Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 10:28:44 +0000 Subject: [PATCH 194/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1fc017d41..8b50a7a39 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -283,7 +283,7 @@ Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео [Неизвестно] - Восстановление после ошибки проигрывателя + Восстановление после ошибки плеера В фоне В окне @@ -304,8 +304,8 @@ Перейти в окно Перейти в главное окно - Ошибка проигрывателя без возможности восстановления - Внешние проигрыватели не поддерживают ссылки этих типов + Ошибка плеера без возможности восстановления + Внешние плееры не поддерживают ссылки этих типов Неверная ссылка Потоки видео не найдены Потоки аудио не найдены @@ -318,8 +318,8 @@ Открыть боковую панель Закрыть боковую панель - Проигрыватель видео - Фоновый проигрыватель + Плеер видео + Фоновый плеер Плеер в окне Всегда спрашивать From 21c2fbfd3911a7c85c1a60dd8c545f0ead828307 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 10:52:52 +0000 Subject: [PATCH 195/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8b50a7a39..da5c66482 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -29,7 +29,7 @@ Скачать Следующее видео URL не поддерживается - \"Следующее\" и \"Предложенные\" видео + \"Следующее\" и \"Предложенные\" Язык контента по умолчанию Видео и аудио Внешний вид @@ -128,7 +128,7 @@ Только некоторые устройства могут воспроизводить видео в 2K/4K Формат видео по умолчанию Чёрная - Восстановить всплывающее окно + Восстановить окно Изменять яркость и громкость жестами Всплывающее окно Воспроизведение во всплывающем окне @@ -318,7 +318,7 @@ Открыть боковую панель Закрыть боковую панель - Плеер видео + Видеоплеер Фоновый плеер Плеер в окне Всегда спрашивать @@ -496,7 +496,7 @@ При сворачивании плеера При переключении со стандартного плеера на другое приложение — %s Ничего не делать - Свернуть в режим фонового воспроизведения - Свернуть в режим всплывающего окна + Воспроизводить в фоне + Воспроизводить в окне From 935d89747f7267d785bb434b46704521a926e2e1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 11:41:12 +0000 Subject: [PATCH 196/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index da5c66482..63072c17c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -24,8 +24,8 @@ Показать опцию воспроизведения видео через медиацентр Kodi Аудио Формат аудио по умолчанию - WebM — свободный формат - M4A — лучше качество + WebM — свободный + M4A — выше качество Скачать Следующее видео URL не поддерживается From 398f9aa19a44c7f6289d7bfcd76f4f72b15d4a3a Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 11:53:20 +0000 Subject: [PATCH 197/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 63072c17c..ae451492b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -477,7 +477,7 @@ Политика конфиденциальности NewPipe Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. \nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. - Прочитать политику конфиденциальности + Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. \nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. Принять From 6effbf50a8572832884baec13a5dd7313d63dbcc Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 12:10:21 +0000 Subject: [PATCH 198/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ae451492b..c02f84e25 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -496,7 +496,7 @@ При сворачивании плеера При переключении со стандартного плеера на другое приложение — %s Ничего не делать - Воспроизводить в фоне - Воспроизводить в окне + Фоновый плеер + Плеер в окне From 9b080800e1e6f3755da8a79280e5073ed8532ec4 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 12:22:47 +0000 Subject: [PATCH 199/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c02f84e25..4e8f6e8f1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -297,7 +297,7 @@ Страна контента по умолчанию Сервис Всегда - Только один раз + Только сейчас Переключить ориентацию Перейти в фон From cbb9dcf7d0d30c360d3b6b5f65f50d8295f0d793 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 12:42:14 +0000 Subject: [PATCH 200/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4e8f6e8f1..4d44ae28c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -288,11 +288,11 @@ В фоне В окне Зажмите, чтобы добавить в очередь - Добавить в очередь \"В фоне\" - Добавить в очередь \"В окне\" - Воспроизвести здесь - Воспроизвести в фоне - Воспроизвести в окне + В очередь \"В фоне\" + В очередь \"В окне\" + Видеоплеер + Фоновый плеер + Плеер в окне Потоковый плеер не найден (вы можете установить VLC) Страна контента по умолчанию Сервис From 042885c155a276117097e366403a5374fa708103 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 14:17:09 +0000 Subject: [PATCH 201/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4d44ae28c..4fc30e90e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -378,7 +378,7 @@ Переименовать плейлист Имя Добавить в плейлист - Установить как миниатюру плейлиста + На миниатюру плейлиста Добавить плейлист в закладки Удалить закладку From a6a5bef4477eb4f211d2dbab3b9f30fba103efa3 Mon Sep 17 00:00:00 2001 From: MadderRagax Date: Tue, 31 Jul 2018 22:53:44 +0000 Subject: [PATCH 202/363] Update translation via weblate Translated using Weblate (Swedish) Currently translated at 100.0% (383 of 383 strings) Translated using Weblate (Chinese (Mandarin)) Currently translated at 27.4% (105 of 383 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 97.1% (372 of 383 strings) Translated using Weblate (German) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Arabic) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Basque) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Dutch) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Spanish) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Catalan) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (German) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Turkish) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Ukrainian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Swedish) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (French) Currently translated at 97,1% (372 of 383 strings) Translated using Weblate (French) Currently translated at 97,1% (372 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Arabic) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Basque) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Dutch) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Spanish) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Catalan) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (German) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Ukrainian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Swedish) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Turkish) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Estonian) Currently translated at 91.6% (351 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 16 ++-- app/src/main/res/values-ca/strings.xml | 16 ++-- app/src/main/res/values-cmn/strings.xml | 53 ++++++++++++- app/src/main/res/values-de/strings.xml | 20 +++-- app/src/main/res/values-es/strings.xml | 16 ++-- app/src/main/res/values-et/strings.xml | 16 ++-- app/src/main/res/values-eu/strings.xml | 16 ++-- app/src/main/res/values-fr/strings.xml | 16 ++-- app/src/main/res/values-nl/strings.xml | 16 ++-- app/src/main/res/values-pt-rBR/strings.xml | 16 ++-- app/src/main/res/values-ru/strings.xml | 90 +++++++++++----------- app/src/main/res/values-sv/strings.xml | 24 +++--- app/src/main/res/values-tr/strings.xml | 16 ++-- app/src/main/res/values-uk/strings.xml | 16 ++-- app/src/main/res/values-zh-rCN/strings.xml | 3 + app/src/main/res/values-zh-rTW/strings.xml | 16 ++-- 16 files changed, 213 insertions(+), 153 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 79cafbaed..1009e8e87 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -309,7 +309,7 @@ استيراد قاعدة البيانات تصدير قاعدة البيانات "سيقوم بالكتابة على سجل التاريخ والاشتراكات الحالية " - تصدير سجل, الاشتراكات وقوائم التشغيل. + تصدير سجل, الاشتراكات وقوائم التشغيل عرض المعلومات إضافة إلى @@ -389,12 +389,12 @@ "معرفك , soundcloud.com/ الخاص بك " إفتراضي -تعطيل إيقاف جميع الصور المصغرة من تحميل البيانات واستخدام الذاكرة وحفظها. سيؤدي التغيير هذا إلى محو-ذاكرة التخزين المؤقت في الذاكرة-وذاكرة على القرص. +تعطيل إيقاف جميع الصور المصغرة من تحميل البيانات واستخدام الذاكرة وحفظها. سيؤدي التغيير هذا إلى محو-ذاكرة التخزين المؤقت في الذاكرة-وذاكرة على القرص امسح البيانات الوصفية المخزنة مؤقتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا تم محو ذاكرة التخزين المؤقت للبيانات الوصفية وضع البث القادم تلقائيا في قائمة الإنتظار - رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار. + رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار إضافة صورة مصغرة إلى قائمة التشغيل قائمة التشغيل المخزنة @@ -402,7 +402,7 @@ بدون تسميات توضيحية تسميات توضيحية - تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول. + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول تمكين LeakCanary قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات @@ -411,12 +411,12 @@ فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها محو سجل المشاهدة - احذف محفوظات الفديوهات التي تم تشغيلها. - حذف سجل المشاهدة بالكامل. + احذف محفوظات الفديوهات التي تم تشغيلها + حذف سجل المشاهدة بالكامل سجل المشاهدة محذوف. محو سجل البحث - يحذف تاريخ البحث عن الكلمات الرئيسية. - حذف محفوظات البحث بالكامل. + يحذف تاريخ البحث عن الكلمات الرئيسية + حذف محفوظات البحث بالكامل سجل البحث المحذوف. المشغل الخارجي لا يدعم هذه الأنواع من الروابط مصدر ملف / مصدر غير صالح diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 700506bce..eeea5dffe 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -61,7 +61,7 @@ Importa una base de dades Exporta una base de dades - Exporta l\'historial, les subscripcions i les llistes de reproducció. + Exporta l\'historial, les subscripcions i les llistes de reproducció Error Error de xarxa Vídeo @@ -310,7 +310,7 @@ Toqueu el botó de cerca per començar En algunes resolucions NO hi haurà àudio quan aquesta opció estigui activada Reproductor d\'àudio extern - Desactiveu-ho per evitar que es carreguin les miniatures i estalviar dades i memòria. Si canvieu aquesta opció, s\'esborrarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge. + Desactiveu-ho per evitar que es carreguin les miniatures i estalviar dades i memòria. Si canvieu aquesta opció, s\'esborrarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge Emmagatzema les cerques localment Registra els vídeos visualitzats Reprèn automàticament @@ -390,7 +390,7 @@ Desvincula (pot provocar distorsió) Nightcore Elimina totes les dades de llocs web de la memòria cau - Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició. + Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició Mostra els missatges d\'ajuda Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo Què ha passat:\\nPetició:\\nIdioma del contingut:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO: @@ -425,17 +425,17 @@ No hi ha vídeos que es puguin baixar Subtítols - Modifica la mida del text i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis. + Modifica la mida del text i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis No s\'ha trobat cap aplicació que pugui reproduir aquest fitxer Esborra l\'historial de reproduccions - Esborra l\'historial dels vídeos que s\'han reproduït. - Esborra tot l\'historial de reproduccions. + Esborra l\'historial dels vídeos que s\'han reproduït + Esborra tot l\'historial de reproduccions S\'ha esborrat l\'historial de reproduccions. Esborra l\'historial de cerca - Esborra l\'historial de paraules cercades. - Esborra tot l\'historial de cerca. + Esborra l\'historial de paraules cercades + Esborra tot l\'historial de cerca S\'ha esborrat l\'historial de cerca. S\'ha esborrat 1 element. diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index 4016a40c8..852ac7f1e 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -69,4 +69,55 @@ 清理照片内存 最小化弹出播放器 - +清楚观看历史 + 已删除搜索历史 + 错误 + 网络错误 + 举报错误 + 没有结果 + 开始 + 暂停 + 播放 + 创建 + 删除 + 删除所有 + 新任务 + 好 +\n + + 错误 +\n + 服务器无法支持 + 文件已存在 + NewPipe 下载中 + 请稍等… + 字母与数字 + 最特别的字符 + + 这个文件里没有已下载应用程式 + + 关于NewPipe + 设置 + 关于 + 第三方执照 + 打开网页 + 删除书签 + + 请问你要删除这个列表吗? + 已创建播放列表 + 已加入播放列表 + 步骤 + 重置 + + 为了遵守欧洲通用数据保护法规(GDPR,我们请你注意NewPipe的隐私政策.请仔细阅读. +\n你必须接受它才能将错误报告发送给我们. + 接受 + 拒绝 + + 没有限制 + 使用移动数据时的解析度限制 + 最小化应用程序切换 + 从主视频播放器切换到其他应用程序时的操作 - %s + 没有 + 最小化背景播放器 + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1ffdb4992..c58ab68e9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -329,7 +329,7 @@ Datenbank importieren Datenbank exportieren Wird deinen Verlauf und deine Abos überschreiben - Verlauf, Abos und Wiedergabelisten exportieren. + Verlauf, Abos und Wiedergabelisten exportieren Keine gültige ZIP-Datei Warnung: Nicht alle Dateien konnten importiert werden. Dies wird deine aktuellen Einstellungen überschreiben. @@ -421,9 +421,9 @@ Verknüpfung aufheben (kann zu Verzerrungen führen) Nightcore Standard -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. +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 Nächsten Stream automatisch einreihen - Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange. + Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange Hier wird bald etwas stehen ;D @@ -456,17 +456,17 @@ Standardaktion beim Öffnen von Inhalten - %s Untertitel - Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam. + Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam Keine App zum Abspielen dieser Datei installiert Verlauf leeren - Löscht den Verlauf der abgespielten Streams. - Löscht den ganzen Verlauf. + Löscht den Verlauf der abgespielten Streams + Löscht den ganzen Verlauf Verlauf gelöscht. Suchverlauf löschen - Lösche Verlauf der Suchschlüsselwörter. - Lösche gesamten Suchverlauf. + Lösche Verlauf der Suchschlüsselwörter + Lösche gesamten Suchverlauf Suchverlauf gelöscht. 1 Element gelöscht. @@ -493,4 +493,8 @@ Schritt Zurücksetzen + Kanäle + Wiedergabelisten + Titel + Nutzer diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 57765c659..b2aca1df6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -330,7 +330,7 @@ abrir en modo popup Importar base de datos Exportar base de datos Reemplazará su historial actual y sus suscripciones - Exportar historial, suscripciones y listas de reproducción. + Exportar historial, suscripciones y listas de reproducción Exportación completa Importación completa Archivo ZIP no válido @@ -403,7 +403,7 @@ abrir en modo popup Usar búsqueda rápida inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión Auto-encolar la siguiente transmisión - Auto-añadir un vídeo relacionado al reproducir el último vídeo en una cola no repetitiva. + Auto-añadir un vídeo relacionado al reproducir el último vídeo en una cola no repetitiva DIRECTO SINCRONIZAR Archivo @@ -445,7 +445,7 @@ abrir en modo popup \n \n¿Desea continuar? Cargar Miniaturas - Descativar todas las miniaturas para evitar que se carguen, guarden datos y usen memoria. Al cambiar esto se borrarán tanto la caché de imágenes en la memoria como en el disco. + Descativar todas las miniaturas para evitar que se carguen, guarden datos y usen memoria. Al cambiar esto se borrarán tanto la caché de imágenes en la memoria como en el disco Caché de imagen limpiado Metadatos eliminados del caché Eliminar todos los datos de la página web en caché @@ -464,15 +464,15 @@ abrir en modo popup No hay ninguna app instalada para reproducir este archivo Subtítulos - Modificar la escala de texto de los subtítulos y los estilos de fondo del reproductor. Requiere el reinicio de la app para que surta efecto. + Modificar la escala de texto de los subtítulos y los estilos de fondo del reproductor. Requiere el reinicio de la app para que surta efecto Borrar historial de reproducciones - Elimina el historial de las transmisiones reproducidas. - Elimina todo el historial de reproducciones. + Elimina el historial de las transmisiones reproducidas + Elimina todo el historial de reproducciones Historial de reproducciones eliminado. Borrar historial de búsqueda - Elimina el historial de palabras clave de búsqueda. - Elimina todo el historial de búsqueda. + Elimina el historial de palabras clave de búsqueda + Elimina todo el historial de búsqueda Historial de búsquedas eliminado. 1 elemento eliminado. diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 2ee7fb37d..7f08efd38 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -69,13 +69,13 @@ Kasuta ebatäpset kerimist Ebatäpne kerimine lubab pleieril otsida asukohta kiiremini täpsuse arvel Laadi pisipildid - Keela, peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal. + Keela, peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal Pildid kustutati vahemälust Kustuta metaandmed vahemälust Kustuta veebilehtede andmed vahemälust Metaandmed kustutati vahemälust Järgmine voog automaatselt järjekorda - Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast. + Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast Pleieri juhtimise viiped Luba viiped helitugevuse ja ereduse juhtimiseks Kuva soovitused @@ -143,14 +143,14 @@ Impordi andmebaas Ekspordi andmebaas Alistab praeguse ajaloo ja tellimused - Ekspordi ajalugu, tellimused ja pleilistid. + Ekspordi ajalugu, tellimused ja pleilistid Puhasta vaatamiste ajalugu - Kustutab vaadatud voogude ajaloo. - Kustuta kogu vaatamiste ajalugu. + Kustutab vaadatud voogude ajaloo + Kustuta kogu vaatamiste ajalugu Vaatamiste ajalugu kustutati. Kustuta otsinguajalugu - Kustutab otsisõnade ajaloo. - Kustuta kogu otsinguajalugu. + Kustutab otsisõnade ajaloo + Kustuta kogu otsinguajalugu Otsinguajalugu kustutati. Viga Võrgu viga @@ -382,7 +382,7 @@ Automaatselt loodud Subtiitrid - Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada. + Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada Mälulekke seire võib põhjustada rakenduse hangumise diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 8be6aad2d..9f9fceb8b 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -328,21 +328,21 @@ Kendu cache-ko wegbuneen datu guztiak Metadatuen cache-a ezabatuta Gehitu ilarara hurrengo jarioa - Gehitu erlazionatutako jario bat azken jarioa jo bitartean errepikapenik gabeko ilara batean. + Gehitu erlazionatutako jario bat azken jarioa jo bitartean errepikapenik gabeko ilara batean Arazketa Fitxategia Inportatu datu-basea Esportatu datu-basea Zure uneko historiala eta harpidetzak gainidatziko ditu - Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak. + Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak Garbitu ikusitakoaren historiala - Jotako jarioen historiala ezabatzen du. - Ezabatu ikusitakoaren historial osoa. + Jotako jarioen historiala ezabatzen du + Ezabatu ikusitakoaren historial osoa Ikusitakoaren historiala ezabatuta. Garbitu bilaketa historiala - Ezabatu bilaketa gakoen historiala. - Ezabatu bilaketen historial osoa. + Ezabatu bilaketa gakoen historiala + Ezabatu bilaketen historial osoa Bilaketen historiala ezabatuta. Direktorio baliogabea Fitxategi edo edukiaren iturri baliogabea @@ -407,7 +407,7 @@ Automatikoki sortuak Azpitituluak - Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko. + Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko Gaitu LeakCanary Memoria galeren monitorizazioa. Aplikazioak agian ez du erantzungo memoriaren aitortza egin bitartean @@ -453,7 +453,7 @@ Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du - "Desgaitu iruditxoak kargatzea gelditzeko eta datuak eta memoria aurrezteko. Hau aldatzean memoria eta diskoko irudien cache-ak garbituko dira." + "Desgaitu iruditxoak kargatzea gelditzeko eta datuak eta memoria aurrezteko. Hau aldatzean memoria eta diskoko irudien cache-ak garbituko dira" 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. Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ede0f0d77..e74c948fd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -384,7 +384,7 @@ Recherche rapide approximative Permettre au lecteur d\'accéder plus rapidement à une position au détriment de la précision Charger miniatures - Désactiver pour arrêter le chargement de toutes les miniatures et sauvegarder les données et l\'utilisation de la mémoire. Modifier cela effacera à la fois le cache d\'image en mémoire et sur disque. + Désactiver pour arrêter le chargement de toutes les miniatures et sauvegarder les données et l\'utilisation de la mémoire. Modifier cela effacera à la fois le cache d\'image en mémoire et sur disque Images en cache effacées Effacer les données en cache Effacer toutes les pages web mises en cache @@ -403,7 +403,7 @@ Télécharger le fichier de flux Vidéo suivante en file d\'attente - Ajout automatique d\'un flux connexe lors de la lecture du dernier flux dans une file d\'attente non répétitive. + Ajout automatique d\'un morceau suggéré lors de la lecture du dernier morceau dans une file d\'attente non bouclée. Débogage Remplir Générés automatiquement @@ -448,7 +448,7 @@ Vitesse de lecture Cadence - Unhook (déformations possibles) + Détacher (déformations possibles) Défaut Ouvrir de préférence avec Action par défaut lors de l\'ouverture de contenu - %s @@ -493,8 +493,10 @@ Étape Réinitialiser - Minimiser - Action lors du changement d\'applications depuis le lecteur vidéo + Minimiser lors du changement d\'application + Action lors du changement d\'applications depuis le lecteur vidéo —%s Aucune - Réduire - + Lecture en arrière plan + Mettre en lecteur popup + + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 007b3e232..358e76fde 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -331,7 +331,7 @@ te openen in pop-upmodus Database importeren Database exporteren Dit zal je huidige geschiedenis en abonnementen overschrijven - Exporteer geschiedenis, abonnementen en speellijsten. + Exporteer geschiedenis, abonnementen en speellijsten Export voltooid Import voltooid Geen geldig ZIP-bestand @@ -399,7 +399,7 @@ te openen in pop-upmodus Snelle, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Volgende stream automatisch in wachtrij plaatsen - Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst. + Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst SYNCHRONISEREN Bestand @@ -441,7 +441,7 @@ te openen in pop-upmodus \n \nWil je doorgaan? Miniatuurvoorbeelden laden - Schakel dit uit om alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache. + Schakel dit uit om alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -458,17 +458,17 @@ te openen in pop-upmodus Geen streams beschikbaar voor downloaden Bijschriften - Bijschriftgrootte en achtergrondstijlen wijzigen. Vereist een herstart van de app. + Bijschriftgrootte en achtergrondstijlen wijzigen. Vereist een herstart van de app Er is geen app geïnstalleerd die dit bestand kan afspelen Kijkgeschiedenis wissen - Verwijdert de geschiedenis van afgespeelde streams. - Verwijdert de gehele kijkgeschiedenis. + Verwijdert de geschiedenis van afgespeelde streams + Verwijdert de gehele kijkgeschiedenis Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen - Verwijdert de gebruikte zoektermen. - Verwijdert de gehele geschiedenis. + Verwijdert de gebruikte zoektermen + Verwijdert de gehele geschiedenis Zoekgeschiedenis verwijderd. 1 item verwijderd. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7805a8fba..3ec466bba 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -310,7 +310,7 @@ abrir em modo popup Importar base de dados Exportar base de dados Isso irá sobrescrever seu histórico e inscrições - Exportar histórico, inscrições e listas de reprodução. + Exportar histórico, inscrições e listas de reprodução Exportação completa Importação completa Não há nenhum arquivo ZIP válido @@ -379,7 +379,7 @@ abrir em modo popup Usar índice de indexação rápido porém não preciso Usar índice de indexação inexato Adicionar a próxima stream à fila automaticamente - Auto anexar uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva. + Auto anexar uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva Sincronizar Arquivo @@ -427,7 +427,7 @@ abrir em modo popup Cache de metadados foi limpo Controles de Velocidade de Reprodução "Tempo " - Desabilite para para de carregar todas as miniaturas e economizar dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco. + Desabilite para para de carregar todas as miniaturas e economizar dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco Passo Desvincular (pode causar distorção) Padrão @@ -439,18 +439,18 @@ abrir em modo popup Abrir gaveta Fechar gaveta Legendas - Modifique o tamanho da legenda e o estilo da tela de fundo. Necessário reiniciar o aplicativo para ter efeito. + Modifique o tamanho da legenda e o estilo da tela de fundo. Necessário reiniciar o aplicativo para ter efeito Night-core Nenhum player instalado para reproduzir este arquivo "Limpar histórico de já assistidos " - Deleta o histórico de videos já reproduzidos. - Deleta todo o histórico de já reproduzidos. + Deleta o histórico de videos já reproduzidos + Deleta todo o histórico de já reproduzidos Histórico de já assistidos deletado. Limpar histórico de pesquisa - Deleta histórico de palavras chave pesquisadas. - Deletar todo o histórico de pesquisa. + Deleta histórico de palavras chave pesquisadas + Deletar todo o histórico de pesquisa Histórico de pesquisa deletado. 1 item deletado. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8f0b81026..4fc30e90e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,18 +20,18 @@ Разрешение по умолчанию Воспроизвести в Kodi Приложение Kore не найдено. Установить его? - Показать \"Воспроизвести в Kodi\" + \"Воспроизвести в Kodi\" Показать опцию воспроизведения видео через медиацентр Kodi Аудио Формат аудио по умолчанию - WebM — свободный формат - M4A — лучше качество + WebM — свободный + M4A — выше качество Скачать Следующее видео URL не поддерживается - \"Следующее\" и \"Предложенные\" видео + \"Следующее\" и \"Предложенные\" Язык контента по умолчанию - Видео и Аудио + Видео и аудио Внешний вид Другое @@ -75,7 +75,7 @@ Выберите доступную папку для загрузки - Контент с ограничением по возрасту + Контент 18+ Ошибка Ваш комментарий (English): Не удалось создать папку для загрузки \"%1$s\" @@ -128,7 +128,7 @@ Только некоторые устройства могут воспроизводить видео в 2K/4K Формат видео по умолчанию Чёрная - Запоминать размер и положение всплывающего окна + Восстановить окно Изменять яркость и громкость жестами Всплывающее окно Воспроизведение во всплывающем окне @@ -162,7 +162,7 @@  тыс. Разрешение всплывающего окна Запоминать размер и положение всплывающего окна - Подсказки поиска + Варианты поиска Лучшее разрешение Старый встроенный плеер на Mediaframework @@ -200,7 +200,7 @@ Хранить поисковые запросы локально История и кэш Запоминать просмотренные видео - Возобновлять при возврате фокуса + Возобновить при фокусе Возобновлять воспроизведение после перерывов (например, телефонных звонков) @@ -208,7 +208,7 @@ Уведомления для NewPipe в фоне и во всплывающем окне Загрузки - Допустимые символы в именах файлов + Допустимые символы имён файлов Недопустимые символы заменяются на этот Символ для замены @@ -225,7 +225,7 @@ Плеер Поведение - История и Кэш + История и кэш Плейлист Отменить @@ -279,33 +279,33 @@ Удалить Вы подписаны Подписка отменена - Подсказка \"Зажмите, чтобы добавить\" + \"Зажмите, чтобы добавить\" Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео [Неизвестно] - Восстановление после ошибки проигрывателя + Восстановление после ошибки плеера В фоне В окне Зажмите, чтобы добавить в очередь - Добавить в очередь \"В фоне\" - Добавить в очередь \"В окне\" - Воспроизвести здесь - Воспроизвести в фоне - Воспроизвести в окне + В очередь \"В фоне\" + В очередь \"В окне\" + Видеоплеер + Фоновый плеер + Плеер в окне Потоковый плеер не найден (вы можете установить VLC) Страна контента по умолчанию Сервис Всегда - Только один раз + Только сейчас Переключить ориентацию Перейти в фон Перейти в окно Перейти в главное окно - Ошибка проигрывателя без возможности восстановления - Внешние проигрыватели не поддерживают ссылки этих типов + Ошибка плеера без возможности восстановления + Внешние плееры не поддерживают ссылки этих типов Неверная ссылка Потоки видео не найдены Потоки аудио не найдены @@ -318,31 +318,31 @@ Открыть боковую панель Закрыть боковую панель - Проигрыватель видео - Фоновый проигрыватель + Видеоплеер + Фоновый плеер Плеер в окне Всегда спрашивать - Получение информации… + Получение сведений… Загрузка запрошенного контента Загрузка файла прямой трансляции. - Показать информацию + Показать сведения Закладки Добавить к - Быстрый неточный поиск + Быстрый поиск позиции Неточный поиск позволяет плееру искать позицию быстрее, но менее точно - Автоматическая очередь следующего стрима - Автоматически добавлять связанные видео, при воспроизведении с последнего видео в неповторяющейся очереди. + Автодополнение очереди + Добавлять похожие потоки в очередь при воспроизведении последнего, если не включён повтор Отладка Файл Импорт данных Экспорт данных Ваша текущая история и подписки будут перезаписаны - Экспорт истории, подписок и плейлистов. + Экспорт истории, подписок и плейлистов Неверная папка Неверный файл или источник контента Файл не существует или нет разрешения на его чтение или запись @@ -378,7 +378,7 @@ Переименовать плейлист Имя Добавить в плейлист - Установить как миниатюру плейлиста + На миниатюру плейлиста Добавить плейлист в закладки Удалить закладку @@ -440,51 +440,51 @@ \n \nПродолжить? Загружать миниатюры - Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и на диске. + Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и накопителе Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен Управление скоростью воспроизведения Темп Тон - Независимо (возможны искажения) + Независимо (искажения) Nightcore По умолчанию Удалить все загруженные данные веб-страниц - Действие по умолчанию при открытии контента — %s + При открытии ссылки на контент — %s Нет потоков, доступных для загрузки Титры Приложение для воспроизведения этого файла не установлено - Изменить размер и фон титров. Требуется перезапуск приложения для вступления изменений в силу. + Изменить размер и фон титров. Изменения вступят в силу после перезапуска Очистить историю просмотров - Удалить всю историю просмотров. + Вся история просмотров будет удалена История просмотров удалена. Очистить историю поиска - Удалить историю поисковых запросов. - Удалить историю воспроизведённых потоков. - Удалить всю историю поиска. + Удалить историю поисковых запросов + Удалить историю воспроизведённых потоков + Вся история поиска будет удалена История поиска удалена. 1 элемент удалён. NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. - Предпочтительное действие \"Открыть\" + При открытии контента Хотите импортировать настройки? Политика конфиденциальности NewPipe Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. \nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. - Прочитать политику конфиденциальности + Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. \nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. Принять Отклонить Без ограничений - Предельное разрешение в мобильной сети + Предел разрешения в мобильной сети Каналы Плейлисты Дорожки @@ -493,10 +493,10 @@ Шаг Сброс - Сворачивать при переключении приложений - При переключении воспроизведения видео со стандартного плеера на другое приложение — %s + При сворачивании плеера + При переключении со стандартного плеера на другое приложение — %s Ничего не делать - Свернуть в режим фонового воспроизведения - Свернуть в режим всплывающего окна + Фоновый плеер + Плеер в окне diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7b75ea7e7..675514f17 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -25,9 +25,9 @@ Genväg för att lagra nerladdade videor i Fyll i genvägen som videor ska laddas ner till - Plats för att ladda ner ljud till - Plats för att lagra nerladdat ljud i - Ange nerladdningsplats för ljudfiler + Genväg för nerladdning av ljud + Genväg för att lagra nerladdade ljudfiler i + Fyll i genvägen som ljudfiler ska laddas ner till Automatiskt spelar en video upp när NewPipe öppnas av en annan app Standardupplösning @@ -120,7 +120,7 @@ Vad är nytt - Autospela + Spela upp automatiskt Sök historik Spara sökfrågor lokalt Historik & Cacheminne @@ -292,7 +292,7 @@ Använda snabb inexact sökning Ladda miniatyrer - Inaktivera för att stoppa alla miniatyrbilder från att ladda och spara på data och minnesanvändning. Ändring av detta kommer att rensa cache-minnet. + Inaktivera för att stoppa alla miniatyrbilder från att ladda och spara på data och minnesanvändning. Ändring av detta kommer att rensa cache-minnet Bild cacheminnet var rensad Tjänst Debug @@ -308,7 +308,7 @@ Ta bort alla cachade webbsidor Metadata cache rensad "Köa nästa ström automatiskt " - Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö. + Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö Standard innehåll land Kanaler Spellistor @@ -321,14 +321,14 @@ Importera databas Exportera databas Kommer att skriva över din nuvarande historik och prenumerationer - Exportera historik, prenumerationer och spellistor. + Exportera historik, prenumerationer och spellistor Rensa visningshistorik - Tar bort historiken för spelade videoklipp. - Ta bort hela visningshistoriken. + Tar bort historiken för spelade videoklipp + Ta bort hela visningshistoriken Visningshistorik borttagen. Rensa sökhistorik - Tar bort historiken för söka nyckelord. - Ta bort hela sökhistoriken. + Tar bort historiken för sökta nyckelord + Ta bort hela sökhistoriken Sökhistorik borttagen. Externa spelare stöder inte dessa typer av länkar Ogiltig URL @@ -410,7 +410,7 @@ Auto-genererade Textning - Ändra spelaren textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft. + Ändra spelaren textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft Aktivera LeakCanary Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 251eab263..15fbc4130 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -326,7 +326,7 @@ Veri tabanını içe aktar Veri tabanını dışa aktar Şu anki geçmişinizi ve aboneliklerinizi geçersiz kılar - Geçmişi, abonelikleri ve oynatma listelerini dışa aktar. + Geçmişi, abonelikleri ve oynatma listelerini dışa aktar Dışa aktarım bitti İçe aktarım bitti Geçerli ZIP dosyası yok @@ -395,7 +395,7 @@ Hızlı isabetsiz konumlama kullan İsabetsiz konumlama, oynatıcının azaltılmış kesinlikle daha hızlı konumlama yapmasını sağlar Sonraki akışı kendiliğinden kuyruğa ekle - Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle. + Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle EŞZAMANLA Dosya @@ -437,7 +437,7 @@ \n \nDevam etmek istiyor musunuz? Küçük resimleri yükle - 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. + 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 Resim önbelleği temizlendi Önbelleklenmiş üst veriyi temizle Önbelleklenmiş tüm web sayfası verisini kaldır @@ -454,17 +454,17 @@ İçerik açılırken öntanımlı eylem — %s Ek Açıklamalar - Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir. + Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir Bu dosyayı oynatmak için kurulan uygulama yok İzleme geçmişini temizle - Oynatılan akışların geçmişini siler. - Tüm izleme geçmişini sil. + Oynatılan akışların geçmişini siler + Tüm izleme geçmişini sil İzleme geçmişi silindi. Arama geçmişini temizle - Aranan anahtar sözcüklerin geçmişini siler. - Tüm arama geçmişini sil. + Aranan anahtar sözcüklerin geçmişini siler + Tüm arama geçmişini sil Arama geçmişi silindi. 1 öge silindi. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 582dd35ba..313448323 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -192,7 +192,7 @@ Імпортувати базу Експортувати базу Це перепише чинну історію та підписання - Експортувати історію, підписання та плейлисти. + Експортувати історію, підписання та плейлисти Неможливо відтворити цей стрим Відновлююсь після помилки програвача Помилкова URL @@ -387,7 +387,7 @@ Використовувати неточне шукання Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю Автоматично додати до черги наступний стрим - Автоматично додавати пов\'язаний стрим під час відтворення останнього у неповторювальній черзі. + Автоматично додавати пов\'язаний стрим під час відтворення останнього у неповторювальній черзі СИНХРОНІЗАЦІЯ Теки @@ -429,7 +429,7 @@ \n \nПродовжуватимете? Завантажити ескізи - Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного вичищення кешу зображень. + Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного вичищення кешу зображень Кеш зображень стерто Стерти кеш метаданих "Усунути всі кешовані дані веб-сторінки " @@ -446,17 +446,17 @@ Типова дія під час відкриття вмісту — %s Субтитри - Змінення маштабу тексту субтитрів та фонових стилів. Увімкнення функції потребує перезавантаження застосунку. + Змінення маштабу тексту субтитрів та фонових стилів. Увімкнення функції потребує перезавантаження застосунку Не знайдено відповідного застосунку для відтворення цього файла Очистити історію переглядів - Видаляє історію відтворень. - Видалити всю історію переглядів. + Видаляє історію відтворень + Видалити всю історію переглядів Історію переглядів було видалено. Очистити історію пошуків - Видаляє історію шуканих ключових слів. - Видалити всю пошукову історію. + Видаляє історію шуканих ключових слів + Видалити всю пошукову історію Пошукову історію було видалено. Видалено один фраґмент. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8d4c99aaa..5118b42d6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -461,4 +461,7 @@ 不限制 使用移动数据时限制分辨率 + 更多频道 + 更多频道 + 用户们 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1d02fcbae..2e6610381 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -271,7 +271,7 @@ 匯入資料庫 匯出資料庫 將覆蓋您目前的歷史記錄和訂閱 - 匯出歷史記錄、訂閱和播放清單。 + 匯出歷史記錄、訂閱和播放清單 返回 欲了解更多關於 NewPipe 的資訊和新聞,請造訪我們的網站。 首頁內容 @@ -382,7 +382,7 @@ 使用粗略但快速的尋找 粗略尋找讓播放器更快找到影片的進度位置 自動播放隊列中下一部影片 - 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流。 + 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流 同步 檔案 @@ -424,7 +424,7 @@ \n3. 詢問時登入到您的帳號 \n4. 複製您被重新導向到的網址。 載入縮圖 - 停用後,NewPipe將不再載入縮圖,減少數據使用與騰空儲存空間,亦會清除記憶體和磁碟上的縮圖快取。 + 停用後,NewPipe將不再載入縮圖,減少數據使用與騰空儲存空間,亦會清除記憶體和磁碟上的縮圖快取 已清除圖片快取 抹除快取中介資料 移除所有網頁的快取資料 @@ -441,17 +441,17 @@ 沒有可供下載的串流 字幕 - 調整播放器字幕大小與背景樣式。必須重新啟動應用程式才會生效。 + 調整播放器字幕大小與背景樣式。必須重新啟動應用程式才會生效 未安裝可播放此檔案的應用程式 清除觀看歷史 - 刪除播放過的串流歷史。 - 刪除全部的觀看歷史。 + 刪除播放過的串流歷史 + 刪除全部的觀看歷史 觀看歷史已刪除。 清除觀看歷史 - 刪除搜尋關鍵字的歷史。 - 刪除全部的搜尋歷史。 + 刪除搜尋關鍵字的歷史 + 刪除全部的搜尋歷史 搜尋歷史已刪除。 已刪除 1 個項目。 From c5d98752fa5baa824be0d2b533afbb0ef5c2bcdd Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:42:23 +0000 Subject: [PATCH 203/363] Translated using Weblate (Esperanto) Currently translated at 25.0% (96 of 383 strings) --- app/src/main/res/values-eo/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index fdae53d50..48931a76d 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -38,8 +38,8 @@ Ludi Eraro Reteraro - Enhavo ne estas disponebla. - Blokita de GEMA. + Enhavo ne estas disponebla + Blokita de GEMA Ŝatoj Malŝatoj @@ -48,8 +48,8 @@ La aplikaĵo Kore ne estas trovita. Ĉu instali ĝin? Montri la sekvan videon kaj similajn videojn Ĉiuj miniaturoj ne ŝargeblas - La subskribo de la ligilo de la video ne malĉifreblas. - La retejo ne analizeblas. + La subskribo de la ligilo de la video ne malĉifreblas + La retejo ne analizeblas Miniaturo de la antaŭrigardo de la video Miniaturo de la antaŭrigardo de la video Miniaturo de la bildo de la alŝutinto From 640b8edd7898cdc9b359b22743789416f29456a9 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:20:14 +0000 Subject: [PATCH 204/363] Translated using Weblate (Bulgarian) Currently translated at 98.6% (378 of 383 strings) --- app/src/main/res/values-bg/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 019922f73..91d76eb66 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -227,7 +227,7 @@ Премахни всички метаданни за уебстраници от кеш-паметта Кеш-паметта с метаданни бе изтрита Автоматично нареди на опашка следващия - "Автоматично прибавяне на сродно съдържание при неповтарящ се преглед . " + "Автоматично прибавяне на сродно съдържание при неповтарящ се преглед " Държава, за която да бъде показвано съдържание Услуга Отстраняване на грешки @@ -245,11 +245,11 @@ Ще замени текущите история и абонаменти Експортиране на историята, абонаментите и плейлистите Изтрий историята с изгледани - Изтрий цялата история с изгледани. + Изтрий цялата история с изгледани Историята с изгледани е изтрита. Изтрий историята на търсенията - Изтрива историята с въвежданите за търсене ключови думи. - Изтрий цялата история на търсенията. + Изтрива историята с въвежданите за търсене ключови думи + Изтрий цялата история на търсенията Историята на търсенията е изтрита. URL подписът на клипа не можа да бъде дешифрован Външните плейъри не поддържат този вид линкове @@ -285,9 +285,9 @@ Прочетете нашата политика за поверителност Лицензът на NewPipe Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма) - Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита. + Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита Показвай подсказка, когато е избран фонов режим или режим в прозорец на страницата с детайли на съответния клип - Изтрива историята на възпроизвежданите стриймове. + Изтрива историята на възпроизвежданите стриймове Не са намерени видео стриймове Не са намерени аудио стриймове "Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nУслуга:\\nВреме по GMT:\\nПакет:\\nВерсия:\\nОС версия: " @@ -403,7 +403,7 @@ Авто-генерирани Надписи - Модифицирай мащаба на текста и фона на надписите. Изисква рестарт на приложението, за да се приложат промените. + Модифицирай мащаба на текста и фона на надписите. Изисква рестарт на приложението, за да се приложат промените Включи LeakCanary Следенето за пропускане на памет може да направи приложението нестабилно From 7ac338756af7907ac3d60459637736d6c09bc220 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:26:28 +0000 Subject: [PATCH 205/363] Translated using Weblate (Chinese (Simplified)) Currently translated at 97.1% (372 of 383 strings) --- app/src/main/res/values-zh-rCN/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5118b42d6..cd5e7bc4f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -262,13 +262,13 @@ 使用粗略但快速的寻找 粗略寻找让播放器更快找到视频的进度位置 加载缩略图 - 停用后,NewPipe將不再加载缩略图,减少数据使用和腾空存储空间,亦会清除内存和内存卡上的缩略图缓存。 + 停用后,NewPipe將不再加载缩略图,减少数据使用和腾空存储空间,亦会清除内存和内存卡上的缩略图缓存 已清除图像缓存 清除缓存元数据 移除所有网页的缓存数据 已清除元数据缓存 自动播放队列中下一个视频 - 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表。 + 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表 显示\"长按添加\"提示 当视频详情页中的背景或悬浮按钮被按下的时候显示提示 默认内容国家 @@ -286,7 +286,7 @@ 导入数据库 导出数据库 将覆盖你现有历史记录和订阅 - 导出历史记录,订阅和播放列表。 + 导出历史记录,订阅和播放列表 从播放器错误中恢复 外部播放器不支持这些链接类型 无效的链接 @@ -436,15 +436,15 @@ 未安装能播放此文件的应用 字幕 - 修改播放器的字幕文本大小和背景样式。需要重启应用程序以生效。 + 修改播放器的字幕文本大小和背景样式。需要重启应用程序以生效 清除观看记录 - 删除视频观看记录。 - 删除全部观看记录。 + 删除视频观看记录 + 删除全部观看记录 观看记录已删除。 清除搜索记录 - 删除搜索关键词记录。 - 删除全部搜索记录。 + 删除搜索关键词记录 + 删除全部搜索记录 搜索记录已删除。 已删除1项。 From 46fabe065c8078cbe1f2a6710cb5b939e770be36 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:39:22 +0000 Subject: [PATCH 206/363] Translated using Weblate (Czech) Currently translated at 93.9% (360 of 383 strings) --- app/src/main/res/values-cs/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index a1ee6ab1e..ee848f0e9 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -314,7 +314,7 @@ otevření ve vyskakovacím okně Importovat databázi Exportovat databázi Přepíše vaši dosavadní historii a odběry - Exportuje historii, odběry a playlisty. + Exportuje historii, odběry a playlisty Externí přehrávače nepodporují tyto druhy odkazů Neplatná URL Nenalezeny žádné video streamy @@ -399,13 +399,13 @@ otevření ve vyskakovacím okně Použít rychlé nepřesné hledání Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností Načítat náhledy - Zakažte, chcete-li zabránit načítání všech náhledů a tím šetřit data a využití paměti. Změnou tohoto nastavení dojde k vyčištění mezipaměti obrázků. + Zakažte, chcete-li zabránit načítání všech náhledů a tím šetřit data a využití paměti. Změnou tohoto nastavení dojde k vyčištění mezipaměti obrázků Mezipaměť obrázků vymazána Vymazat metadata v mezipaměti Odebrat všechna data uložená v mezipaměti Mezipaměť metadat vymazána Automatická fronta dalšího streamu - Automaticky připojí související stream při přehrávání posledního streamu v neopakující se frontě. + Automaticky připojí související stream při přehrávání posledního streamu v neopakující se frontě Soubor Neplatný adresář @@ -460,17 +460,17 @@ otevření ve vyskakovacím okně Výchozí chování při otevírání obsahu — %s Poznámky - Upravuje velikost textu poznámek a styly pozadí. Změny se projeví po restartu aplikace. + Upravuje velikost textu poznámek a styly pozadí. Změny se projeví po restartu aplikace K přehrání tohoto souboru chybí vhodná aplikace Vymazat historii sledování - Vymaže historii přehrávaných streamů. - Vymazat celkovou historii sledování. + Vymaže historii přehrávaných streamů + Vymazat celkovou historii sledování Historie sledování smazána. Vymazat historii vyhledávání - Vymaže historii vyhledávaných klíčových slov. - Vymazat celkovou historii vyhledávání. + Vymaže historii vyhledávaných klíčových slov + Vymazat celkovou historii vyhledávání Historie vyhledávání smazána. Jedna položka smazána. From 81895c20d620e924a8b5e233355e6d61167ac92e Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 11:58:59 +0000 Subject: [PATCH 207/363] Translated using Weblate (English) Currently translated at 99.7% (382 of 383 strings) --- app/src/main/res/values/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 502483667..138a6c4eb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,13 +75,13 @@ Use fast inexact seek Inexact seek allows the player to seek to positions faster with reduced precision Load thumbnails - Disable to stop all thumbnails from loading and save on data and memory usage. Changing this will clear both in-memory and on-disk image cache. + Disable to stop all thumbnails from loading and save on data and memory usage. Changing this will clear both in-memory and on-disk image cache Image cache wiped Wipe cached metadata Remove all cached webpage data Metadata cache wiped Auto-queue next stream - Auto-append a related stream when playing the last stream in a non-repeating queue. + Auto-append a related stream when playing the last stream in a non-repeating queue Player gesture controls Use gestures to control the brightness and volume of the player Search suggestions @@ -159,14 +159,14 @@ Import database Export database Will override your current history and subscriptions - Export history, subscriptions and playlists. + Export history, subscriptions and playlists Clear watch history - Deletes the history of played streams. - Delete whole watch history. + Deletes the history of played streams + Delete whole watch history Watch history deleted. Clear search history - Deletes history of search keywords. - Delete whole search history. + Deletes history of search keywords + Delete whole search history Search history deleted. Error @@ -450,7 +450,7 @@ Captions - Modify player caption text scale and background styles. Requires app restart to take effect. + Modify player caption text scale and background styles. Requires app restart to take effect Enable LeakCanary From ededfe10ab0b9aa4cc9907f2c4fb3b6b9e60bdd8 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:34:05 +0000 Subject: [PATCH 208/363] Translated using Weblate (Flemish) Currently translated at 98.6% (378 of 383 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 3c15cf226..c8f3dad2c 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -70,13 +70,13 @@ Snel, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Miniatuurvoorbeelden laden - Schakelt dit uit voor alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache. + Schakelt dit uit voor alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen Metagegevens-cache gewist Volgende stream automatisch in wachtrij plaatsen - Automatisch ne gerelateerde stream toevoegen bij het afspelen van de laatste stream in ne nie-herhalende wachtlijst. + Automatisch ne gerelateerde stream toevoegen bij het afspelen van de laatste stream in ne nie-herhalende wachtlijst Bewegingscontrole Gebruik bewegingen voor helderheid en volume van de speler aan te passen Zoeksuggesties @@ -146,7 +146,7 @@ Databank importeren Databank exporteren Dit zal uw huidige geschiedenis en abonnementen overschrijven - Exporteer geschiedenis, abonnementen en speellijsten. + Exporteer geschiedenis, abonnementen en speellijsten Fout Netwerkfout Kon niet alle miniaturen laden @@ -380,7 +380,7 @@ Automatisch gegenereerd Koppen - Koptekstgrootte en achtergrondstijlen wijzigen. Vereist nen herstart van den app. + Koptekstgrootte en achtergrondstijlen wijzigen. Vereist nen herstart van den app LeakCanary inschakelen Het monitoren van geheugenlekken kan dervoor zorgen da’ den app nie’ goe meer reageerd @@ -426,12 +426,12 @@ Nightcore Standaard Kijkgeschiedenis wissen - Verwijderd de geschiedenis van afgespeelde streams. - Verwijderd de ganse kijkgeschiedenis. + Verwijderd de geschiedenis van afgespeelde streams + Verwijderd de ganse kijkgeschiedenis Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen - Verwijderd de gebruikte zoektermen. - Verwijderd de ganse geschiedenis. + Verwijderd de gebruikte zoektermen + Verwijderd de ganse geschiedenis Zoekgeschiedenis verwijderd. 1 item verwijderd. From 124a2839b523d59cc009b5f0c242d4d5abe56cd1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:33:01 +0000 Subject: [PATCH 209/363] Translated using Weblate (French) Currently translated at 98.4% (377 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e74c948fd..f246972db 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -403,7 +403,7 @@ Télécharger le fichier de flux Vidéo suivante en file d\'attente - Ajout automatique d\'un morceau suggéré lors de la lecture du dernier morceau dans une file d\'attente non bouclée. + Ajout automatique d\'un morceau suggéré lors de la lecture du dernier morceau dans une file d\'attente non bouclée Débogage Remplir Générés automatiquement @@ -456,19 +456,19 @@ Aucun flux disponible au téléchargement Sous-titres - Modifier la taille du texte et les styles d\'arrière-plan du lecteur. Redémarrage requis pour prendre effet. + Modifier la taille du texte et les styles d\'arrière-plan du lecteur. Redémarrage requis pour prendre effet Ton Nightcore Aucune application installée pour lire ce fichier Effacer l\'historique - Supprimer l\'historique des flux regardés. - Supprimer tout l\'historique regardé. + Supprimer l\'historique des flux regardés + Supprimer tout l\'historique regardé Voir l’historique supprimé. Supprimer l\'historique des recherches - Supprimer l\'historique de recherche par mot clef. - Supprimer tout l\'historique de recherche. + Supprimer l\'historique de recherche par mot clef + Supprimer tout l\'historique de recherche Historique des recherches effacé. 1 élément supprimé. From 60c58c8b9c399849ca06fdffd14e3d941543aabb Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:44:22 +0000 Subject: [PATCH 210/363] Translated using Weblate (Indonesian) Currently translated at 93.7% (359 of 383 strings) --- app/src/main/res/values-id/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 44973426f..56cca9bbd 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -219,12 +219,12 @@ membuka di mode popup Riwayat Riwayat kosong Muat thumbnail - Nonaktifkan untuk berhenti memuat semua thumbnail dan menghemat penggunaan data dan memori. Mengubah ini akan menghapus tembolok gambar pada diska dan memory. + Nonaktifkan untuk berhenti memuat semua thumbnail dan menghemat penggunaan data dan memori. Mengubah ini akan menghapus tembolok gambar pada diska dan memory Tembolok gambar dihapus Hapus tembolok metadata Buang semua data tembolok laman web Tembolok metadata dihapus - Otomatis tambahkan stream yang terkait ketika memutar stream terakhir dalam antrean tanpa perulangan. + Otomatis tambahkan stream yang terkait ketika memutar stream terakhir dalam antrean tanpa perulangan Simpan daftar video yang telah ditonton Tampilkan tip \"tahan untuk menambahkan\" Tampilkan tip ketika tombol latar belakang atau popup ditekan pada halaman detail video @@ -255,7 +255,7 @@ membuka di mode popup Impor database Ekspor database Akan menimpa riwayat dan langganan kamu saat ini - Ekspor riwayat, daftat langganan dan daftar putar. + Ekspor riwayat, daftat langganan dan daftar putar Tidak bisa memutar stream ini Galat yg tidak bisa dipulihkan terjadi di pemutar Memulihkan dari galat pemutar @@ -391,11 +391,11 @@ membuka di mode popup Tambahkan Ke Hapus riwayat menonton - Hapus riwayat stream yang diputar. + Hapus riwayat stream yang diputar Hapus seluruh riwayat menonton. Riwayat menonton dihapus. Hapus riwayat pencarian - Hapus riwayat dari ketikan pencarian. + Hapus riwayat dari ketikan pencarian Hapus seluruh riwayat pencarian. Riwayat pencarian dihapus. Tidak ada stream yang tersedia untuk diunduh @@ -420,7 +420,7 @@ membuka di mode popup Aksi bawaan ketika membuka konten — %s Takarir - Mengubah skala keterangan teks pemutar dan gaya latar belakang. Perlu memulai ulang aplikasi untuk melihat hasilnya. + Mengubah skala keterangan teks pemutar dan gaya latar belakang. Perlu memulai ulang aplikasi untuk melihat hasilnya Pemantauan kebocoran memori dapat menyebabkan aplikasi menjadi tidak responsif saat terjadi dumping From fcb46db718c6ddd20b1d5ef6ae8754e6f49d814c Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:23:30 +0000 Subject: [PATCH 211/363] Translated using Weblate (Italian) Currently translated at 98.6% (378 of 383 strings) --- app/src/main/res/values-it/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 18bbc6d3e..9e2e96789 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -335,7 +335,7 @@ Importa database Esporta database Sovrascriverà la cronologia corrente e le iscrizioni - Esporta la cronologia, le iscrizioni e le playlist. + Esporta la cronologia, le iscrizioni e le playlist Esportazione completa Importazione completa Nessun file ZIP valido @@ -404,7 +404,7 @@ Usa la ricerca rapida ma imprecisa La ricerca imprecisa permette al lettore multimediale di spostarsi nelle posizioni più velocemente con una precisione ridotta Metti in coda automaticamente il prossimo flusso - Aggiungi automaticamente un flusso correlato quando è in corso la riproduzione dell\'ultimo flusso in una coda non ripetitiva. + Aggiungi automaticamente un flusso correlato quando è in corso la riproduzione dell\'ultimo flusso in una coda non ripetitiva SINCRONIZZAZIONE File @@ -446,7 +446,7 @@ \n \nVuoi continuare? Carica miniature - Disabilita per interrompere il caricamento delle miniature, la loro archiviazione e l\'utilizzo della memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco. + Disabilita per interrompere il caricamento delle miniature, la loro archiviazione e l\'utilizzo della memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco Pulizia della cache delle immagini completata Pulisci la cache dei metadati Rimuovi tutti i dati delle pagine web memorizzati nella cache @@ -463,17 +463,17 @@ Azione predefinita all\'apertura del contenuto — %s Sottotitoli - Modifica la dimensione e gli stili di sfondo dei sottotitoli. Richiede il riavvio dell\'app per rendere effettive le modifiche. + Modifica la dimensione e gli stili di sfondo dei sottotitoli. Richiede il riavvio dell\'app per rendere effettive le modifiche Nessuna app installata per riprodurre questo file Pulisci cronologia visualizzazioni - Elimina la cronologia dei flussi riprodotti. - Elimina l\'intera cronologia visualizzazioni. + Elimina la cronologia dei flussi riprodotti + Elimina l\'intera cronologia visualizzazioni Cronologia visualizzazioni eliminata. Pulisci cronologia delle ricerche - Cancella la cronologia dei termini di ricerca. - Elimina l\'intera cronologia delle ricerche. + Cancella la cronologia dei termini di ricerca + Elimina l\'intera cronologia delle ricerche Cronologia delle ricerche eliminata. 1 elemento eliminato. From 092215f47a1e8248c226fb6577531bbeed342389 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:34:50 +0000 Subject: [PATCH 212/363] Translated using Weblate (Macedonian) Currently translated at 96.3% (369 of 383 strings) --- app/src/main/res/values-mk/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 1ae02a0f2..b780b3f10 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -70,13 +70,13 @@ Брзо, непрецизно премотување Со непрецизното премотување може да се пребарува побрзо, но понепрецизно Прочитај сликички - Оневозможи, за да не се читаат сликичките од видеото, за штедење меморија и интернет. Промена на опцијата ќе ја избрише кеш-меморијата. + Оневозможи, за да не се читаат сликичките од видеото, за штедење меморија и интернет. Промена на опцијата ќе ја избрише кеш-меморијата Сликичките се избришани Избриши ги собраните мета-податоци Избриши ги сите собрани податоци од веб-страни Избришани се мета-податоците Автоматски постави го на листа следното видео - Автоматски прикачи поврзано видео кога ќе почне последното пуштено видео во неповторлива листа. + Автоматски прикачи поврзано видео кога ќе почне последното пуштено видео во неповторлива листа Управување на плеерот со гестови Користи гестови за управување на светлоста и тонот Предлози за пребарување @@ -146,7 +146,7 @@ Внеси датабаза Изнеси база на податоци Ќе ги избрише моменталните членства и историја - Изнеси историја, членства и плејлисти. + Изнеси историја, членства и плејлисти Грешка Мрежна грешка Не можеа да се прочитаат сите сликички @@ -422,12 +422,12 @@ „Nightcore“ Стандардно Избриши историја на гледаност - Ја брише историјата на пуштени видеа. - Избриши ја целата историја на гледаност. + Ја брише историјата на пуштени видеа + Избриши ја целата историја на гледаност Избришана е историјата на гледаност. Избриши историја на пребарувања - Ја брише историјата на пребарувања. - Избриши ја целата историја на пребарувања. + Ја брише историјата на пребарувања + Избриши ја целата историја на пребарувања Избришана е историјата на пребарувања. Нема стримови за симнување @@ -442,7 +442,7 @@ Стандардна акција при отворање видеа — %s Преводи - Смени ја големината и стилот на преводот. Потребен е рестарт за промена. + Смени ја големината и стилот на преводот. Потребен е рестарт за промена NewPipe - политика за приватност Проектот NewPipe сериозно ја сфаќа вашата приватност. Затоа апликацијата не собира ваши податоци без ваша дозвола. From 245479c339324ef0a1666dec898429b89f08c352 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:40:27 +0000 Subject: [PATCH 213/363] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.7% (382 of 383 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 0f8d9b55a..b64dd7b4f 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -324,7 +324,7 @@ Importer database Eksporter database Vil overstyre din nåværende historikk og abonnementsliste - Eksporter historikk, abonnementer og spillelister. + Eksporter historikk, abonnementer og spillelister Eksport fullført Import fullført Ingen gyldig ZIP-fil @@ -428,18 +428,18 @@ Forvalg Tøm avspillingshistorikk Slett historikken for avspilte strømmer - Slett hele visningshistorikken. + Slett hele visningshistorikken Visningshistorikk slettet. Tøm søkehistorikk - Sletter historikken for søkte nøkkelord. - Slett hele søkehistorikken. + Sletter historikken for søkte nøkkelord + Slett hele søkehistorikken Søkehistorikk slettet. Ett element slettet. Inget program installert for avspilling av denne filen. Undertekster - Endre undertekststørrelse og bakgrunnsstiler. Krever omstart av programmet for å tre i effekt. + Endre undertekststørrelse og bakgrunnsstiler. Krever omstart av programmet for å tre i effekt NewPipe er copyleft, fri programvare: Du kan bruke, studere og forbedre etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere det i henhold til vilkårene gitt i GNU General Public-lisensen, som publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. Ønsker du også å importere innstillinger? @@ -458,8 +458,8 @@ \n2. Logg inn når forespurt \n4. Kopier profil-nettadressen du ble videresendt til. Unøyaktig blafring tillater spilleren å blafre til posisjoner raskere med redusert nøyaktighet - Skru av for å stoppe alle miniatyrbilder fra innlasting og spare data og minnebruke. Endring av dette vil tømme både disk- og minne-hurtiglager. - Legg til en relatert strøm ved avspilling av forrige strøm i ikke-repeterende kø. + Skru av for å stoppe alle miniatyrbilder fra innlasting og spare data og minnebruke. Endring av dette vil tømme både disk- og minne-hurtiglager + Legg til en relatert strøm ved avspilling av forrige strøm i ikke-repeterende kø Minnelekkasjeoppsyn kan forårsake programmet å opptre uresponsivt under haugdumping Rapporter feil som opptrer utenfor sin levetid From 396e2d14f38e8d964dce163d5511c6a5120cb5df Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:28:25 +0000 Subject: [PATCH 214/363] Translated using Weblate (Polish) Currently translated at 96.3% (369 of 383 strings) --- app/src/main/res/values-pl/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0889fa9e3..a68a50f4b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -331,7 +331,7 @@ Importuj dane Eksportuj dane Nadpisuje bieżącą historię i subskrypcje - Eksportuje bieżącą historię, subskrypcje i playlisty. + Eksportuje bieżącą historię, subskrypcje i playlisty Przeciągnij, aby zmienić kolejność Utwórz @@ -396,13 +396,13 @@ Użyj szybkiego niedokładnego wyszukiwania Szybkie wyszukiwanie pozwala przeskoczyć do wybranej pozycji szybciej, lecz jest mniej precyzyjne Załaduj miniatury - Wyłącz, by aplikacja nie ściągała miniatur. Oszczędza transfer i pamięć. Zmiana tej opcji spowoduje wyczyszczenie pamięci podręcznej miniatur. + Wyłącz, by aplikacja nie ściągała miniatur. Oszczędza transfer i pamięć. Zmiana tej opcji spowoduje wyczyszczenie pamięci podręcznej miniatur Wyczyszczono pamięć podręczną miniatur Wyczyść pamięć podręczną metadanych Wyczyść pamięć podręczną stron Wyczyszczono pamięć podręczną metadanych Automatycznie dołącz kolejny stream - Automatycznie dodaj kolejny powiązany stream w momencie rozpoczęcia odtwarzania ostatniego elementu w niezapętlonej kolejce. + Automatycznie dodaj kolejny powiązany stream w momencie rozpoczęcia odtwarzania ostatniego elementu w niezapętlonej kolejce Plik Nieprawidłowy katalog @@ -456,15 +456,15 @@ Domyślna akcja podczas otwierania materiału - %s Napisy - Zmień kolor tekstu i tła napisów. Wymaga restartu aplikacji. + Zmień kolor tekstu i tła napisów. Wymaga restartu aplikacji Wyczyść historię oglądania - Usuwa historię odtworzonych strumieni. - Usuń całą historię oglądania. + Usuwa historię odtworzonych strumieni + Usuń całą historię oglądania Usunięto historię oglądania. Wyczyść historię wyszukiwania - Usuwa historię wyszukiwania słów kluczowych. - Usuń całą historię wyszukiwania. + Usuwa historię wyszukiwania słów kluczowych + Usuń całą historię wyszukiwania Usunięto historię wyszukiwania. Usunięto jedną pozycję. From 51a695d0473621de60973cc4b314d4a8e675f89a Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 3 Aug 2018 17:36:47 +0000 Subject: [PATCH 215/363] Translated using Weblate (Slovak) Currently translated at 93.7% (359 of 383 strings) --- app/src/main/res/values-sk/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6204e5fba..f4a2b16f8 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -293,7 +293,7 @@ Importovať databázu Exportovať databázu Prepíše aktuálnu históriu pozretí a odberov - Exportovať históriu, odbery a zoznamy skladieb. + Exportovať históriu, odbery a zoznamy skladieb Nepodarilo sa prehrať tento stream Pri prehrávaní došlo k chybe a nemožno pokračovať Zotavovanie po chybe v prehrávaní @@ -392,13 +392,13 @@ Používať rýchly posun Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou Načítanie miniatúr - Vypnutím tejto funkcie sa nebudú vytvárať miniatúry a tým sa ušetrí miesto a pamäť. Zmena nastavení spôsobuje vyčistenie vyrovnávacej pamäte. + Vypnutím tejto funkcie sa nebudú vytvárať miniatúry a tým sa ušetrí miesto a pamäť. Zmena nastavení spôsobuje vyčistenie vyrovnávacej pamäte Vyrovnávacia pamäť obrázkov vymazaná Vymazať metadáta uložené vo vyrovnávacej pamäti Odstrániť všetky údaje webových stránok vo vyrovnávacej pamäti Vyrovnávacia pamäť metadát bola vymazaná Automaticky zaradiť daľší stream - Automaticky zaradí súvisiaci stream, keď prehrávanie začne na poslednom streame v neopakujúcich sa zoznamoch prehrávania. + Automaticky zaradí súvisiaci stream, keď prehrávanie začne na poslednom streame v neopakujúcich sa zoznamoch prehrávania Ladenie Súbor @@ -420,7 +420,7 @@ Automaticky vygenerované Nastavenie titulkov - Upravte mierku textu titulkov a štýly pozadia. Vyžaduje reštart prehrávača. + Upravte mierku textu titulkov a štýly pozadia. Vyžaduje reštart prehrávača Povoliť službu LeakCanary Monitorovanie pretečenia pamäte môže spôsobiť, že aplikácia nebude reagovať @@ -473,12 +473,12 @@ Nightcore režim Predvolené Vymazať históriu pozretí - Odstráni históriu prehrávaných streamov. - Vymazať celú históriu pozretí. + Odstráni históriu prehrávaných streamov + Vymazať celú históriu pozretí História pozretí bola vymazaná. Vymazať históriu vyhľadávania - Vymaže históriu vyhľadávania kľúčových slov. - Vymazať celú históriu vyhľadávania. + Vymaže históriu vyhľadávania kľúčových slov + Vymazať celú históriu vyhľadávania História vyhľadávaní bola vymazaná. 1 položka bola vymazaná. From b1ad0edbe1851080bb02fdd8570700832f7d4d7d Mon Sep 17 00:00:00 2001 From: mesnevi Date: Sat, 4 Aug 2018 18:54:28 +0000 Subject: [PATCH 216/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4fc30e90e..327748c85 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -249,8 +249,8 @@ Нет видео %s видео - %s видео - %s видео + %s видео ролика + %s видео роликов Элемент удалён From 4669a1ab57da847660173fade9a64f3fbffc998b Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 4 Aug 2018 21:41:05 +0000 Subject: [PATCH 217/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 327748c85..cfd68d3d0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -29,7 +29,7 @@ Скачать Следующее видео URL не поддерживается - \"Следующее\" и \"Предложенные\" + \"Следующее\" и \"Предложенные\" видео Язык контента по умолчанию Видео и аудио Внешний вид @@ -155,7 +155,7 @@ Отключено Изменение размера - В некоторых разрешениях НЕ будет звука, если эта опция выбрана + В некоторых разрешениях НЕ будет звука, если включено  млн.  млрд. @@ -165,7 +165,7 @@ Варианты поиска Лучшее разрешение - Старый встроенный плеер на Mediaframework + Использовать старый встроенный плеер на Mediaframework Запрос reCAPTCHA Запрошен ввод reCAPTCHA @@ -288,11 +288,11 @@ В фоне В окне Зажмите, чтобы добавить в очередь - В очередь \"В фоне\" - В очередь \"В окне\" - Видеоплеер - Фоновый плеер - Плеер в окне + Добавить в очередь \"В фоне\" + Добавить в очередь \"В окне\" + Воспроизвести в плеере + Воспроизвести в фоне + Воспроизвести в окне Потоковый плеер не найден (вы можете установить VLC) Страна контента по умолчанию Сервис @@ -335,7 +335,7 @@ Быстрый поиск позиции Неточный поиск позволяет плееру искать позицию быстрее, но менее точно Автодополнение очереди - Добавлять похожие потоки в очередь при воспроизведении последнего, если не включён повтор + Добавлять похожие потоки в очередь при воспроизведении последнего потока, если не включён повтор Отладка Файл @@ -440,7 +440,7 @@ \n \nПродолжить? Загружать миниатюры - Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений в памяти и накопителе + Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен From 76f97e5c2e15aae8c9bad5a9da315af138c21621 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:12:52 +0000 Subject: [PATCH 218/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index cfd68d3d0..ceb39805f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -461,12 +461,12 @@ Изменить размер и фон титров. Изменения вступят в силу после перезапуска Очистить историю просмотров - Вся история просмотров будет удалена + Вся история просмотров будет удалена. История просмотров удалена. Очистить историю поиска Удалить историю поисковых запросов Удалить историю воспроизведённых потоков - Вся история поиска будет удалена + Вся история поиска будет удалена. История поиска удалена. 1 элемент удалён. From 7b6d6b466a46bf8a0ba23990b818cad8d2163202 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:10:53 +0000 Subject: [PATCH 219/363] Translated using Weblate (English) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 138a6c4eb..a78c83e0c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -162,11 +162,11 @@ Export history, subscriptions and playlists Clear watch history Deletes the history of played streams - Delete whole watch history + Delete whole watch history. Watch history deleted. Clear search history Deletes history of search keywords - Delete whole search history + Delete whole search history. Search history deleted. Error From cb0f700be17b5ea5e3db9731974861028b8bfb22 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:16:07 +0000 Subject: [PATCH 220/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ceb39805f..444ecc5ed 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -249,8 +249,8 @@ Нет видео %s видео - %s видео ролика - %s видео роликов + %s видео + %s видео Элемент удалён From b13f7a599b21c8725aa7f8ecd0aa5c0dbc11ff6f Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:40:41 +0000 Subject: [PATCH 221/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 444ecc5ed..f50500911 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -409,7 +409,7 @@ Сообщать об ошибках жизненного цикла Принудительно сообщать о недоставляемых Rx-исключениях вне фрагмента или жизненного цикла после удаления - Импорт/Экспорт + Импорт и экспорт Импорт Импорт из Экспорт в From 8209eda27a385ebd914e3f7280a4ef1e60df0e65 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:18:24 +0000 Subject: [PATCH 222/363] Translated using Weblate (Arabic) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1009e8e87..c070dd189 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -412,11 +412,11 @@ محو سجل المشاهدة احذف محفوظات الفديوهات التي تم تشغيلها - حذف سجل المشاهدة بالكامل + حذف سجل المشاهدة بالكامل. سجل المشاهدة محذوف. محو سجل البحث يحذف تاريخ البحث عن الكلمات الرئيسية - حذف محفوظات البحث بالكامل + حذف محفوظات البحث بالكامل. سجل البحث المحذوف. المشغل الخارجي لا يدعم هذه الأنواع من الروابط مصدر ملف / مصدر غير صالح From bbc1642b90e6a7748df588cae0080690ec836fec Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:19:10 +0000 Subject: [PATCH 223/363] Translated using Weblate (Basque) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-eu/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 9f9fceb8b..1dfc8f059 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -338,11 +338,11 @@ Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak Garbitu ikusitakoaren historiala Jotako jarioen historiala ezabatzen du - Ezabatu ikusitakoaren historial osoa + Ezabatu ikusitakoaren historial osoa. Ikusitakoaren historiala ezabatuta. Garbitu bilaketa historiala Ezabatu bilaketa gakoen historiala - Ezabatu bilaketen historial osoa + Ezabatu bilaketen historial osoa. Bilaketen historiala ezabatuta. Direktorio baliogabea Fitxategi edo edukiaren iturri baliogabea From 333506e00b17f79c7b2affcd679f2345dd52f522 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:19:41 +0000 Subject: [PATCH 224/363] Translated using Weblate (Bulgarian) Currently translated at 98,4% (377 of 383 strings) --- app/src/main/res/values-bg/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 91d76eb66..b0595a2fa 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -245,11 +245,11 @@ Ще замени текущите история и абонаменти Експортиране на историята, абонаментите и плейлистите Изтрий историята с изгледани - Изтрий цялата история с изгледани + Изтрий цялата история с изгледани. Историята с изгледани е изтрита. Изтрий историята на търсенията Изтрива историята с въвежданите за търсене ключови думи - Изтрий цялата история на търсенията + Изтрий цялата история на търсенията. Историята на търсенията е изтрита. URL подписът на клипа не можа да бъде дешифрован Външните плейъри не поддържат този вид линкове From f55a8deb97500472e7a4950088d97b336652f406 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:22:32 +0000 Subject: [PATCH 225/363] Translated using Weblate (Catalan) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index eeea5dffe..5f1dfafa7 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -431,11 +431,11 @@ Esborra l\'historial de reproduccions Esborra l\'historial dels vídeos que s\'han reproduït - Esborra tot l\'historial de reproduccions + Esborra tot l\'historial de reproduccions. S\'ha esborrat l\'historial de reproduccions. Esborra l\'historial de cerca Esborra l\'historial de paraules cercades - Esborra tot l\'historial de cerca + Esborra tot l\'historial de cerca. S\'ha esborrat l\'historial de cerca. S\'ha esborrat 1 element. From deef6417ad3ed9e1edd2df431494852b4bd4907f Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:28:36 +0000 Subject: [PATCH 226/363] Translated using Weblate (Chinese (Simplified)) Currently translated at 97,1% (372 of 383 strings) --- app/src/main/res/values-zh-rCN/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index cd5e7bc4f..08baee9b2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -440,11 +440,11 @@ 清除观看记录 删除视频观看记录 - 删除全部观看记录 + 删除全部观看记录。 观看记录已删除。 清除搜索记录 删除搜索关键词记录 - 删除全部搜索记录 + 删除全部搜索记录。 搜索记录已删除。 已删除1项。 From 3d359b7a98b3d0525f1680a9b6dbd6a148400d0a Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:26:21 +0000 Subject: [PATCH 227/363] Translated using Weblate (Chinese (Traditional)) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2e6610381..ba7c66cf5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -447,11 +447,11 @@ 清除觀看歷史 刪除播放過的串流歷史 - 刪除全部的觀看歷史 + 刪除全部的觀看歷史。 觀看歷史已刪除。 清除觀看歷史 刪除搜尋關鍵字的歷史 - 刪除全部的搜尋歷史 + 刪除全部的搜尋歷史。 搜尋歷史已刪除。 已刪除 1 個項目。 From c42df3a0c25755a919b94c4cbd5ed33c825e151b Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:36:15 +0000 Subject: [PATCH 228/363] Translated using Weblate (Czech) Currently translated at 93,9% (360 of 383 strings) --- app/src/main/res/values-cs/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ee848f0e9..89254764a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -466,11 +466,11 @@ otevření ve vyskakovacím okně Vymazat historii sledování Vymaže historii přehrávaných streamů - Vymazat celkovou historii sledování + Vymazat celkovou historii sledování. Historie sledování smazána. Vymazat historii vyhledávání Vymaže historii vyhledávaných klíčových slov - Vymazat celkovou historii vyhledávání + Vymazat celkovou historii vyhledávání. Historie vyhledávání smazána. Jedna položka smazána. From 761a249e0532bb957208169e949483230a0c4d6d Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:20:16 +0000 Subject: [PATCH 229/363] Translated using Weblate (Dutch) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 358e76fde..0a117443d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -464,11 +464,11 @@ te openen in pop-upmodus Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams - Verwijdert de gehele kijkgeschiedenis + Verwijdert de gehele kijkgeschiedenis. Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen - Verwijdert de gehele geschiedenis + Verwijdert de gehele geschiedenis. Zoekgeschiedenis verwijderd. 1 item verwijderd. From e52bfe4335437d56c6b4c99614ebabb565c4601f Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:37:43 +0000 Subject: [PATCH 230/363] Translated using Weblate (Estonian) Currently translated at 91,6% (351 of 383 strings) --- app/src/main/res/values-et/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 7f08efd38..e684a8ca4 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -146,11 +146,11 @@ Ekspordi ajalugu, tellimused ja pleilistid Puhasta vaatamiste ajalugu Kustutab vaadatud voogude ajaloo - Kustuta kogu vaatamiste ajalugu + Kustuta kogu vaatamiste ajalugu. Vaatamiste ajalugu kustutati. Kustuta otsinguajalugu Kustutab otsisõnade ajaloo - Kustuta kogu otsinguajalugu + Kustuta kogu otsinguajalugu. Otsinguajalugu kustutati. Viga Võrgu viga From 2cb991203970e9113e46cd69ad0e6468c2d7d9e7 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:35:14 +0000 Subject: [PATCH 231/363] Translated using Weblate (Flemish) Currently translated at 98,6% (378 of 383 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index c8f3dad2c..434bc3c7b 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -427,11 +427,11 @@ Standaard Kijkgeschiedenis wissen Verwijderd de geschiedenis van afgespeelde streams - Verwijderd de ganse kijkgeschiedenis + Verwijderd de ganse kijkgeschiedenis. Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen Verwijderd de gebruikte zoektermen - Verwijderd de ganse geschiedenis + Verwijderd de ganse geschiedenis. Zoekgeschiedenis verwijderd. 1 item verwijderd. From 298a91adbfccb3ddb958d59f8a65d4c319c3d219 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:35:48 +0000 Subject: [PATCH 232/363] Translated using Weblate (French) Currently translated at 98,1% (376 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f246972db..78a379cf0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -464,11 +464,11 @@ Effacer l\'historique Supprimer l\'historique des flux regardés - Supprimer tout l\'historique regardé + Supprimer tout l\'historique regardé. Voir l’historique supprimé. Supprimer l\'historique des recherches Supprimer l\'historique de recherche par mot clef - Supprimer tout l\'historique de recherche + Supprimer tout l\'historique de recherche. Historique des recherches effacé. 1 élément supprimé. From eb4764d2b2ffa611d8aedcd8b6805aaa9ea8d46d Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:30:30 +0000 Subject: [PATCH 233/363] Translated using Weblate (German) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c58ab68e9..51b91eb5f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -462,11 +462,11 @@ Verlauf leeren Löscht den Verlauf der abgespielten Streams - Löscht den ganzen Verlauf + Löscht den ganzen Verlauf. Verlauf gelöscht. Suchverlauf löschen Lösche Verlauf der Suchschlüsselwörter - Lösche gesamten Suchverlauf + Lösche gesamten Suchverlauf. Suchverlauf gelöscht. 1 Element gelöscht. From 0e53323fb7b7741d188974c4b5579268f5180b1e Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:21:49 +0000 Subject: [PATCH 234/363] Translated using Weblate (Italian) Currently translated at 98,6% (378 of 383 strings) --- app/src/main/res/values-it/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9e2e96789..7e8eb9337 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -469,11 +469,11 @@ Pulisci cronologia visualizzazioni Elimina la cronologia dei flussi riprodotti - Elimina l\'intera cronologia visualizzazioni + Elimina l\'intera cronologia visualizzazioni. Cronologia visualizzazioni eliminata. Pulisci cronologia delle ricerche Cancella la cronologia dei termini di ricerca - Elimina l\'intera cronologia delle ricerche + Elimina l\'intera cronologia delle ricerche. Cronologia delle ricerche eliminata. 1 elemento eliminato. From e6d97bc7738c87d891495d1ee58e2a9cb0046fe1 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:29:52 +0000 Subject: [PATCH 235/363] Translated using Weblate (Macedonian) Currently translated at 96,3% (369 of 383 strings) --- app/src/main/res/values-mk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index b780b3f10..f5d552ab4 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -423,11 +423,11 @@ Стандардно Избриши историја на гледаност Ја брише историјата на пуштени видеа - Избриши ја целата историја на гледаност + Избриши ја целата историја на гледаност. Избришана е историјата на гледаност. Избриши историја на пребарувања Ја брише историјата на пребарувања - Избриши ја целата историја на пребарувања + Избриши ја целата историја на пребарувања. Избришана е историјата на пребарувања. Нема стримови за симнување From 1fc494571b46b415bfabd5f965abd930f22ae058 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:31:19 +0000 Subject: [PATCH 236/363] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98,6% (378 of 383 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index b64dd7b4f..2a94f2fad 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -428,11 +428,11 @@ Forvalg Tøm avspillingshistorikk Slett historikken for avspilte strømmer - Slett hele visningshistorikken + Slett hele visningshistorikken. Visningshistorikk slettet. Tøm søkehistorikk Sletter historikken for søkte nøkkelord - Slett hele søkehistorikken + Slett hele søkehistorikken. Søkehistorikk slettet. Ett element slettet. From 7d1790abe3c7bdc13d6bba10277b3b91a51f4026 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:31:48 +0000 Subject: [PATCH 237/363] Translated using Weblate (Polish) Currently translated at 96,3% (369 of 383 strings) --- app/src/main/res/values-pl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a68a50f4b..a03e69748 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -460,11 +460,11 @@ Wyczyść historię oglądania Usuwa historię odtworzonych strumieni - Usuń całą historię oglądania + Usuń całą historię oglądania. Usunięto historię oglądania. Wyczyść historię wyszukiwania Usuwa historię wyszukiwania słów kluczowych - Usuń całą historię wyszukiwania + Usuń całą historię wyszukiwania. Usunięto historię wyszukiwania. Usunięto jedną pozycję. From b57f4202616f5dd654ad9c4e42b532efe57e5813 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:32:38 +0000 Subject: [PATCH 238/363] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 3ec466bba..19209941b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -446,11 +446,11 @@ abrir em modo popup "Limpar histórico de já assistidos " Deleta o histórico de videos já reproduzidos - Deleta todo o histórico de já reproduzidos + Deleta todo o histórico de já reproduzidos. Histórico de já assistidos deletado. Limpar histórico de pesquisa Deleta histórico de palavras chave pesquisadas - Deletar todo o histórico de pesquisa + Deletar todo o histórico de pesquisa. Histórico de pesquisa deletado. 1 item deletado. From 8a0e4b577cdd17074c35c4f14c6177c5873b123f Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:33:18 +0000 Subject: [PATCH 239/363] Translated using Weblate (Slovak) Currently translated at 93,7% (359 of 383 strings) --- app/src/main/res/values-sk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f4a2b16f8..e337699f5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -474,11 +474,11 @@ Predvolené Vymazať históriu pozretí Odstráni históriu prehrávaných streamov - Vymazať celú históriu pozretí + Vymazať celú históriu pozretí. História pozretí bola vymazaná. Vymazať históriu vyhľadávania Vymaže históriu vyhľadávania kľúčových slov - Vymazať celú históriu vyhľadávania + Vymazať celú históriu vyhľadávania. História vyhľadávaní bola vymazaná. 1 položka bola vymazaná. From dcb11f01e120f69bb9e9b9549ce0ce5d6eee78d9 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:21:16 +0000 Subject: [PATCH 240/363] Translated using Weblate (Spanish) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-es/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b2aca1df6..2c974e935 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -468,11 +468,11 @@ abrir en modo popup Borrar historial de reproducciones Elimina el historial de las transmisiones reproducidas - Elimina todo el historial de reproducciones + Elimina todo el historial de reproducciones. Historial de reproducciones eliminado. Borrar historial de búsqueda Elimina el historial de palabras clave de búsqueda - Elimina todo el historial de búsqueda + Elimina todo el historial de búsqueda. Historial de búsquedas eliminado. 1 elemento eliminado. From 6e66c013c02a270240bdb6452ed1c5f351810f3e Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:36:47 +0000 Subject: [PATCH 241/363] Translated using Weblate (Swedish) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 675514f17..ebd9e934c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -324,11 +324,11 @@ Exportera historik, prenumerationer och spellistor Rensa visningshistorik Tar bort historiken för spelade videoklipp - Ta bort hela visningshistoriken + Ta bort hela visningshistoriken. Visningshistorik borttagen. Rensa sökhistorik Tar bort historiken för sökta nyckelord - Ta bort hela sökhistoriken + Ta bort hela sökhistoriken. Sökhistorik borttagen. Externa spelare stöder inte dessa typer av länkar Ogiltig URL From 02ef05160f3c270b8b4b5b33cd2d5f1c186d2bea Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:33:49 +0000 Subject: [PATCH 242/363] Translated using Weblate (Turkish) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 15fbc4130..df5f25999 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -460,11 +460,11 @@ İzleme geçmişini temizle Oynatılan akışların geçmişini siler - Tüm izleme geçmişini sil + Tüm izleme geçmişini sil. İzleme geçmişi silindi. Arama geçmişini temizle Aranan anahtar sözcüklerin geçmişini siler - Tüm arama geçmişini sil + Tüm arama geçmişini sil. Arama geçmişi silindi. 1 öge silindi. From 62e121c12c3267a42efa3e99717f86b571a74a03 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 10:34:47 +0000 Subject: [PATCH 243/363] Translated using Weblate (Ukrainian) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 313448323..80f8a1d10 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -452,11 +452,11 @@ Очистити історію переглядів Видаляє історію відтворень - Видалити всю історію переглядів + Видалити всю історію переглядів. Історію переглядів було видалено. Очистити історію пошуків Видаляє історію шуканих ключових слів - Видалити всю пошукову історію + Видалити всю пошукову історію. Пошукову історію було видалено. Видалено один фраґмент. From a9ea06f75358fb9c5b529545e2b3c3c8cce84c9e Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 11:29:58 +0000 Subject: [PATCH 244/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f50500911..dbd0914cc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -380,7 +380,7 @@ Добавить в плейлист На миниатюру плейлиста - Добавить плейлист в закладки + Добавить закладку Удалить закладку Удалить этот плейлист? From 5d0528d19567ffc7c16df15aec9af0c962f1cecc Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 13:31:46 +0000 Subject: [PATCH 245/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dbd0914cc..0e33dd9b2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -462,12 +462,12 @@ Очистить историю просмотров Вся история просмотров будет удалена. - История просмотров удалена. + История просмотров удалена Очистить историю поиска Удалить историю поисковых запросов Удалить историю воспроизведённых потоков Вся история поиска будет удалена. - История поиска удалена. + История поиска удалена 1 элемент удалён. NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. From d1741e40e3dc857383a9a0cdc24af8fe56d1e2be Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 18:19:49 +0000 Subject: [PATCH 246/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0e33dd9b2..78a1e514a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -160,7 +160,7 @@  млрд.  тыс. - Разрешение всплывающего окна + Разрешение очереди \"В окне\" Запоминать размер и положение всплывающего окна Варианты поиска Лучшее разрешение From 79097eca47f56d9f3f43b43bae292176ecfbc12b Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 5 Aug 2018 20:51:43 +0000 Subject: [PATCH 247/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 78a1e514a..691fb7f71 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -290,9 +290,9 @@ Зажмите, чтобы добавить в очередь Добавить в очередь \"В фоне\" Добавить в очередь \"В окне\" - Воспроизвести в плеере - Воспроизвести в фоне - Воспроизвести в окне + Начать отсюда в плеере + Начать отсюда в фоне + Начать отсюда в окне Потоковый плеер не найден (вы можете установить VLC) Страна контента по умолчанию Сервис From cfa926542ed5d56b0a34d43c24ae6fc8a42684ec Mon Sep 17 00:00:00 2001 From: mesnevi Date: Mon, 6 Aug 2018 07:19:45 +0000 Subject: [PATCH 248/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 691fb7f71..2b8d170a0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -248,9 +248,9 @@ Нет видео - %s видео - %s видео - %s видео + %s видео ролик + %s видео ролика + %s видео роликов Элемент удалён From e53bd505fb37ffae8d78ea3730ccba6380a1c128 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 09:58:47 +0000 Subject: [PATCH 249/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2b8d170a0..4f1615574 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -458,7 +458,7 @@ Титры Приложение для воспроизведения этого файла не установлено - Изменить размер и фон титров. Изменения вступят в силу после перезапуска + Изменить размер текста и стиль титров. Изменения вступят в силу после перезапуска Очистить историю просмотров Вся история просмотров будет удалена. From e1ac1547fd487ec72a35d3c585d3ed467afd24f4 Mon Sep 17 00:00:00 2001 From: AB Date: Mon, 6 Aug 2018 05:27:46 +0000 Subject: [PATCH 250/363] Translated using Weblate (Ukrainian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 60 +++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 80f8a1d10..c58e0b365 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -17,21 +17,21 @@ Зовнішній відео-програвач Зовнішній аудіо-програвач - Шлях для завантаження відео - Вкажіть шлях для завантаження відео + Шлях для завантаження відеозапису + Вкажіть шлях для завантаження відеозаписів Вкажіть шлях для завантаження аудіо файлів - Шлях де будуть зберігатись завантажені відео + Шлях де зберігатимуться завантажені відеозаписи Шлях для завантаження аудіо - Шлях де будуть зберігатись завантажені аудіо файли + Шлях де зберігатимуться завантажені аудіофайли Автоматично відтворювати - Відтворює відео коли NewPipe викликано з іншого застосунку + Відтворює відеозапис коли NewPipe викликано з іншого застосунку Типова роздільна здатність Відтворювати за допомогою Kodi Застосунок Kore не знайдено. Встановити? Відтворювти у Kodi - Показувати опцію відтворення відео за допомогою Kodi media center + Показувати опцію відтворення відеозапису за допомогою Kodi media center Аудіо Типовий аудіо формат WebM — вільний формат @@ -41,8 +41,8 @@ Світла Завантажити - Наступне відео - Показувати \"наступні\" та \"схожі\" відео + Наступний відеозапис + Являти \"наступні\" й \"схожі\" відео URL не підтримується Переважна мова контенту Відео та Аудіо @@ -52,14 +52,14 @@ Відтворити У доступі відмовлено Контент - Показувати контент з віковими обмеженнями - Це відео має вікові обмеження. Спершу активуйте опцію для відображення таких відео у налаштуваннях. + Контент з віковими обмеженнями + Відеозапис має вікові обмеження. Спершу активуйте опцію для програвання таких записів у налаштуваннях. наживо Хиба Хиба мережі Не вдалося завантажити всі ескізи - Не вдалося розшифрувати підпис URL відео + Не вдалося розшифрувати URL підпис відеозапису Не вдалося проаналізувати веб-сайт Не вдалося повністю проаналізувати веб-сайт Контент не доступний @@ -140,13 +140,13 @@ Новинки - Тло + На тлі У вікні Типова роздільна здатність вікна - Не всі пристрої підтримують відтворення 2K/4K відео - Показувати більші роздільні здатності - Типовий відео формат + Не всі пристрої підтримують відтворення 2K/4K відеозаписи + Більші роздільні здатності + Типовий формат відеозапису Пам\'ятати розмір та позицію вікна Пам\'ятати останній розмір вікна Керування жестами @@ -156,10 +156,10 @@ Історія пошуків Зберігати пошукові запити локально Історія та кеш - Вести облік перегляду відео + Вести облік перегляду відеозаписів Відновити відтворення Продовжувати відтворення опісля переривання (наприклад телефонного дзвінка) - Показувати \"утримуй, аби додати\" підказку + \"Утримуй аби додати\" підказка Усталена країна контенту Сервіс Програвач @@ -201,7 +201,7 @@ Звіт користувача Без підписників - Без відео + Відео нема Помилкова URL або інтернет не є доступним Цей дозвіл має бути відкритим \nу вікні @@ -209,7 +209,7 @@ «reCAPTCHA» Завантаження Допустимі символи у назвах файлів - "Неправильні символи будуть скоректовані цим " + "Неправильні символи коригуватимуться цим " Символ заміни Літери та цифри @@ -233,7 +233,7 @@ Деталі Налаштування аудіо - Відео програвач + Відеопрогравач Фоновий програвач Віконний програвач Щоразу питати @@ -265,9 +265,9 @@ - %s відео - %s відео - %s відео + %s відеозапис + %s відеозаписи + %s відеозаписів Створити @@ -284,7 +284,7 @@ Моніторинг витоку памяті вимкнено Усунення вад Нічого нема - Старий убудований медіа-фреймворк програвач + Старий убудований медія-фреймворк програвач Перегляди відсутні @@ -386,7 +386,7 @@ Використовувати неточне шукання Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю - Автоматично додати до черги наступний стрим + Чи наступний стрим у черзі Автоматично додавати пов\'язаний стрим під час відтворення останнього у неповторювальній черзі СИНХРОНІЗАЦІЯ @@ -463,22 +463,22 @@ "NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконавлювати за власним розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією." Чи ви також бажаєте імпортувати налаштування? - Політика приватності NewPip\'у - Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому цей застосунок не збирає ніяких даних без вашої згоди -\nПолітика приватності NewPipe поясняє у деталях які дані було відіслано та збережено, під час відсилання крахового звіту. + Політика приватності NewPipe\'у + Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому цей застосунок не збирає ніяких даних без вашої згоди +\nПолітика приватності NewPipe пояснюється у деталях, які дані було відіслано та збережено, під час відсилання крахового звіту. Читати політику приватності Аби дотриматися Норм загального захисту даних ЄС (General Data Protection Regulation, GDPR), ми просимо звернути вашу увагу на NewPipe\'ову політику приватності. Будь ласка, прочитайте уважно \nВи маєте підтвердити її аби надіслати нам баґового звіту. Ухвалити Відхилити Безмежно - Обмежити роздільну здатність під час користування мобільним інтернетом + Обмеження якості відео (мобільний трафік) Перемотувати підчас тиші Крок Скинути Зменшити при перемкненні застосунку - Дія при перемкненні до інших застосунків з головного відео-програвачу — %s + Дія при перемкненні до інших застосунків з головного відеопрогравача — %s Жодних Зменшити до фонового програвачу Зменшити до віконного програвачу From 4cff7491867cbb48705613fd594c32a1257cf652 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 12:22:20 +0000 Subject: [PATCH 251/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4f1615574..d922ab592 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -209,7 +209,7 @@ Загрузки Допустимые символы имён файлов - Недопустимые символы заменяются на этот + Заменяет недопустимые символы Символ для замены Буквы и цифры @@ -341,8 +341,8 @@ Импорт данных Экспорт данных - Ваша текущая история и подписки будут перезаписаны - Экспорт истории, подписок и плейлистов + Текущие подписки, плейлисты и история будут заменены + Экспорт подписок, плейлистов и истории Неверная папка Неверный файл или источник контента Файл не существует или нет разрешения на его чтение или запись @@ -458,7 +458,7 @@ Титры Приложение для воспроизведения этого файла не установлено - Изменить размер текста и стиль титров. Изменения вступят в силу после перезапуска + Изменить размер текста и стиль титров. Нужен перезапуск Очистить историю просмотров Вся история просмотров будет удалена. From 691f93f01c91c243e160f3851546cc313b2920e7 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 14:50:52 +0000 Subject: [PATCH 252/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d922ab592..2df1d383b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -70,7 +70,7 @@ Сервер не поддерживается NewPipe скачивает Неверный URL или нет доступа к интернету - Подробности + Сведения Скопировано в буфер обмена Выберите доступную папку для загрузки @@ -302,7 +302,7 @@ Переключить ориентацию Перейти в фон Перейти в окно - Перейти в главное окно + Перейти в плеер Ошибка плеера без возможности восстановления Внешние плееры не поддерживают ссылки этих типов From a71c693ca31b277dfd69ee72a650e5abf25afc2b Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 15:05:28 +0000 Subject: [PATCH 253/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2df1d383b..886773030 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -273,8 +273,8 @@ Воспроизвести всё Не удалось воспроизвести этот поток - Подробности - Настройки аудио + Сведения + Настройки звука Пока нет подписок на каналы Удалить Вы подписаны From 3868c53908e28d3c9cf52f44ff7a981700564d25 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 19:59:22 +0000 Subject: [PATCH 254/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 886773030..de620c15c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -248,9 +248,9 @@ Нет видео - %s видео ролик - %s видео ролика - %s видео роликов + %s видео + %s видео + %s видео Элемент удалён From dcf4e43e285bf67384f834babc79c7a8d492453c Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 20:23:11 +0000 Subject: [PATCH 255/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index de620c15c..78e586575 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -55,7 +55,7 @@ Папка для хранения загруженных аудио Введите путь к папке для загрузки аудио - Нажмите поиск, чтобы начать + Начните с поиска Подождите… Файл уже существует Потоки From bc05cc14451bc6502b231127dd8c604754b28390 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 22:09:08 +0000 Subject: [PATCH 256/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 78e586575..9fd205b64 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -70,7 +70,7 @@ Сервер не поддерживается NewPipe скачивает Неверный URL или нет доступа к интернету - Сведения + Подробнее Скопировано в буфер обмена Выберите доступную папку для загрузки From 723898f87d070628beed9ed98d5c31203fbba6fb Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 22:24:09 +0000 Subject: [PATCH 257/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9fd205b64..f61704660 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -227,7 +227,7 @@ Поведение История и кэш Плейлист - Отменить + Отмена Нет результатов Ничего нет From 27f5bdeef1e0adf5e9f99c1fc34c25ebf7600df3 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 6 Aug 2018 23:54:16 +0000 Subject: [PATCH 258/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f61704660..e16b8bb69 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -494,7 +494,7 @@ Сброс При сворачивании плеера - При переключении со стандартного плеера на другое приложение — %s + При переключении со встроенного плеера на другое приложение — %s Ничего не делать Фоновый плеер Плеер в окне From 01c9ab36b7bd4d6baad721f6e079892ecf3a70be Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Tue, 7 Aug 2018 00:10:49 +0000 Subject: [PATCH 259/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e16b8bb69..f161bbda7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -270,7 +270,7 @@ Новое и горячее Добавлено в очередь в фоне Добавлено в очередь в окне - Воспроизвести всё + Играть всё Не удалось воспроизвести этот поток Сведения From c6a5dedf0a6be69843138abe07ed53dbad5d6026 Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Tue, 7 Aug 2018 08:45:30 +0000 Subject: [PATCH 260/363] Translated using Weblate (Dutch) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0a117443d..bca77d58c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -256,7 +256,7 @@ te openen in pop-upmodus Geen video\'s %s video - %s video\'s + %s video’s Item verwijderd From 9ed823b5a52c3fe75f6031c43170a5faedbe985c Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Tue, 7 Aug 2018 08:45:53 +0000 Subject: [PATCH 261/363] Translated using Weblate (Flemish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 434bc3c7b..ad1eb5ff6 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -458,4 +458,8 @@ Stap Standaardwaarden herstellen + Kanalen + Afspeellijsten + Nummers + Gebruikers From 7817cfe0c10630ce440ebcc847e50ef2e16d70a2 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Tue, 7 Aug 2018 21:16:46 +0000 Subject: [PATCH 262/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f161bbda7..6ebd69f18 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -489,7 +489,7 @@ Плейлисты Дорожки Пользователи - Пропускать тишину + Проматывать тишину Шаг Сброс From 20c3badfac1b161fd6316c17dfd6adfe58a113cb Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Tue, 7 Aug 2018 08:47:16 +0000 Subject: [PATCH 263/363] Translated using Weblate (Flemish) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index ad1eb5ff6..96d0cdb91 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -76,9 +76,9 @@ Alle gecachete webpagina-gegevens wissen Metagegevens-cache gewist Volgende stream automatisch in wachtrij plaatsen - Automatisch ne gerelateerde stream toevoegen bij het afspelen van de laatste stream in ne nie-herhalende wachtlijst + Automatisch ne gerelateerde stream toevoegen bij het afspelen van de laatste stream in een niet-herhalende wachtlijst Bewegingscontrole - Gebruik bewegingen voor helderheid en volume van de speler aan te passen + Gebruikt bewegingen voor helderheid en volume van de speler aan te passen Zoeksuggesties Toon suggesties bij zoeken Zoekgeschiedenis @@ -145,8 +145,8 @@ Databank importeren Databank exporteren - Dit zal uw huidige geschiedenis en abonnementen overschrijven - Exporteer geschiedenis, abonnementen en speellijsten + Dit gaat uw huidige geschiedenis en abonnementen overschrijven + Exporteert geschiedenis, abonnementen en speellijsten Fout Netwerkfout Kon niet alle miniaturen laden @@ -426,12 +426,12 @@ Nightcore Standaard Kijkgeschiedenis wissen - Verwijderd de geschiedenis van afgespeelde streams - Verwijderd de ganse kijkgeschiedenis. + Verwijdert de geschiedenis van afgespeelde streams + Verwijdert de ganse kijkgeschiedenis. Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen - Verwijderd de gebruikte zoektermen - Verwijderd de ganse geschiedenis. + Verwijdert de gebruikte zoektermen + Verwijdert de ganse geschiedenis. Zoekgeschiedenis verwijderd. 1 item verwijderd. From 6a1fbb00d947a6a8a0843cde9dbb0f9a37bb0964 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Tue, 7 Aug 2018 22:02:44 +0000 Subject: [PATCH 264/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6ebd69f18..24a8b5c3c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -471,7 +471,7 @@ 1 элемент удалён. NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. - При открытии контента + При открытии ссылки Хотите импортировать настройки? Политика конфиденциальности NewPipe From 5e13a1735df609f360bc4937e9ad3a8db2d5f973 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Tue, 7 Aug 2018 23:52:32 +0000 Subject: [PATCH 265/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 24a8b5c3c..4be5a2245 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -257,10 +257,10 @@ Удалить этот элемент из истории поиска? Контент главной страницы Пустая страница - Страница киоска - Страница подписки - Страница ленты - Страница канала + Киоск + Подписки + Что нового + Канал Выберите канал Выберите киоск From 5c32d73409cff3387cf2baefa498f9c064a2eae8 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Wed, 8 Aug 2018 11:37:06 +0000 Subject: [PATCH 266/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4be5a2245..caf09979f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -197,9 +197,9 @@ Что нового История поиска - Хранить поисковые запросы локально + Хранить запросы поиска локально История и кэш - Запоминать просмотренные видео + Запоминать воспроизведённые потоки Возобновить при фокусе Возобновлять воспроизведение после перерывов (например, телефонных звонков) @@ -464,7 +464,7 @@ Вся история просмотров будет удалена. История просмотров удалена Очистить историю поиска - Удалить историю поисковых запросов + Удалить историю запросов поиска Удалить историю воспроизведённых потоков Вся история поиска будет удалена. История поиска удалена From 0713f55e9c8bf43ad0b758e04206f91e06625da4 Mon Sep 17 00:00:00 2001 From: AB Date: Wed, 8 Aug 2018 17:53:26 +0000 Subject: [PATCH 267/363] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c58e0b365..d946a2cb0 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -321,8 +321,8 @@ Контент на головній сторінці Порожня сторінка Kiosk - Сторінка підписання - Сторінка фіду + Підписання + Нове Сторінка каналу Обрати канал Ви не підписані до жодного з каналів From 86732b6ae4eaf225052b6aa747e73d1317c5acf3 Mon Sep 17 00:00:00 2001 From: Dharmendra Date: Wed, 8 Aug 2018 17:00:08 +0000 Subject: [PATCH 268/363] Translated using Weblate (Hindi) Currently translated at 91.3% (350 of 383 strings) --- app/src/main/res/values-hi/strings.xml | 115 +++++++++++++++++++++---- 1 file changed, 97 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 909218fe3..8040f93b5 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -25,11 +25,11 @@ ऑडियो हलका काली - इतिहास + इतिहास और कैच डाउनलोड अगला वीडियो वीडियो और ऑडियो - इतिहास + इतिहास और कैच बैकग्राउंड में चल रहा है कोई दर्शक नहीं कोई वीडियो नहीं है @@ -99,11 +99,11 @@ जब कुछ ढूंड रहे हो तो सुझाव दिखाये खोज के इतिहास को देखे खोज के query को फ़ोन की मेमोरी में ही रखे - जो विडियो देखे है उस पर नजर रखे + देखे हुए वीडियो की सूची रखे जब फोकस मिले तो विडियो resume हो रूकावट आने पर भी विडियो को जारी रखे (जैसे - फ़ोन कॉल आये) - आगे ऐसा ही विडियो दिखाए जैसा पहले देखा था - "\"संलग्न करने के लिए पकड़ें\" देखायें " + \'अगला\' और \'पहले समान\' वीडियो दिखाए + \"संलग्न करने के लिए पकड़ें रहे\" दिखाए जब बैकग्राउंड और पॉपअप बटन विडियो के विवरण पन्ने में दबाई जाए तो tip को दिखाए ये वाला URL इसमें नहीं चलेगा डिफ़ॉल्ट विषय की भाषा @@ -155,7 +155,7 @@ कोई भी विडियो नहीं मिल रहा फोटो को load नहीं कर सकते APP/UI टूट गया - इस विडियो को चलाने में असफलता हो रही है + इस विडियो को चलाने में असफल हुए कभी ठीक न होने वाले विडियो प्लेयर की त्रुटी आ रही है विडियो प्लेयर त्रुटी से ठीक हो रहा है @@ -183,7 +183,7 @@ यंहा कुछ नहीं है "डाउनलोड वाली डायरेक्टरी को बना नहीं सकते \'%1$s\'" - डाउनलोड की डायरेक्टरी बन चुकी है \'%1$s\' + डाउनलोड की डायरेक्टरी बना दी गई है \'%1$s\' विडियो ऑडियो @@ -249,7 +249,7 @@ %2$s के द्वारा © %1$s जो %3$s के अधीन आते है लाइसेंस load नहीं हो रहा सहयोगकर्ता - एंड्राइड के लिए कम मेमोरी वाला और मुफ्त फ्रंट एंड Youtube. + एंड्राइड के लिए हल्का और मुफ्त स्ट्रीमिंग। अगर आपके पास कोई सुझाव हो जैसे -अनुवाद , डिजाईन में बदलाव ,code को साफ़ रखना , या फिर code में जायदा बदलाव लाना हो तो - साहयता के लिए आपका स्वागत है . जितना ज्यादा होगा उतना बेहतर होगा ! क्या आप इसको खोज इतिहास के मिटाना चाहते है ? @@ -312,10 +312,10 @@ नाम बदलें दान करें - NewPipe स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय व्यतीत करते हैं। अब यह सुनिश्चित करने का समय है कि हमारे डेवलपर्स जावा के कप का आनंद लेते समय NewPipe को और भी बेहतर बना सके! + NewPipe स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय व्यतीत करते हैं। स्वयंसेवको को मदद भेजे, ताकि वह NewPipe को और अच्छा बना सके। वापस दे वेबसाइट - अधिक जानकारी और NewPipe के बारे में नवीनतम समाचार प्राप्त करने के लिए हमारी वेबसाइट पर जाएं । + अधिक जानकारी और खबरों के लिए NewPipe की वेबसाइट पर जाएं । क्या आप इस आइटम को वॉच इतिहास से हटाना चाहते हैं? क्या आप वाकई इतिहास से सभी आइटंस हटाना चाहते हैं? पिछला चलाया गया @@ -329,7 +329,7 @@ ड्रावर खोलें ड्रावर बंद करें - जल्द ही यहां पर कुछ आएगा ;D + जल्द ही यहां पर कुछ दिखाई देगा ;D वीडियो प्लेयर @@ -338,7 +338,7 @@ हमेशा पूछें जानकारी प्राप्त की जा रही है… - अनुरोधित कंटेंट लोड हो रहा है + अनुरोधित सामग्री लोड कर रहे है नई प्लेलिस्ट बनाएं प्लेलिस्ट हटाएं @@ -351,12 +351,12 @@ बुकमार्क हटायें क्या आप इस प्लेलिस्ट को हटाना चाहते हैं? - प्लेलिस्ट सफलतापूर्वक बनाई गई + सूची बना दी गई प्लेलिस्ट में जोड़ा गया प्लेलिस्ट का थंबनेल बदल दिया गया है - प्लेलिस्ट हटाने में असफल + सूची हटाने में असफल - कोई कैप्शन नहीं + कोई कैप्शन नहीं है फिट भरें @@ -373,13 +373,13 @@ डीबग करें ऑटो-जनरेटेड LeakCanary सक्षम करें - हीप डंप करने के दौरान मेमोरी लीक मॉनिटरिंग app को अनुत्तरदायी बना सकता है + हीप डंप करने के दौरान मेमोरी लीक मॉनिटरिंग ऐप को अनुत्तरदायी बना सकता है Out-of-Lifecycle त्रुटियों की रिपोर्ट करें छायाप्रारुप लोड करें तेजी से अचूक तलाश का प्रयोग करें अचूक खोज प्लेयर को कम परिशुद्धता के साथ तेजी से पदों की तलाश करने की अनुमति देता है - सभी थंबनेल को डेटा और मेमोरी उपयोग पर लोड करने और सहेजने से रोकने के लिए अक्षम करें। इसे बदलने से इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों साफ़ हो जाएंगे। + सभी थंबनेल को लोड होने से रोके और डेटा और मेमोरी का उपयोग घटाए। इसे बदलने से मेमोरी और डिस्क की छवि की कैश साफ़ हो जाएगी छवि कैश मिटा दिया कैश मेटाडेटा वाइप करें सभी कैश किए गए वेबपृष्ठ डेटा हटाएं @@ -388,4 +388,83 @@ गैर-दोहराने वाली कतार में अंतिम स्ट्रीम चलाते समय संबंधित स्ट्रीम को स्वतः संलग्न करें। फाइल - + चेनल्स + सूची + ट्रेक + उपभोगता + देखे हुए वीडियो की सूची साफ करें + चलाये गए स्ट्रीम का इतिहास साफ करता है + देखे गए सभी का इतिहास साफ करें। + देखे हुए का इतिहास साफ कर दिया गया। + ढूंढने के इतिहास को साफ करें + ढूंढे गए शब्दो का इतिहास साफ करता है + ढूंढने के इतिहास को पूरा साफ करें। + ढूंढने के इतिहास को साफ कर दिया। + अमान्य डाइरेक्टरी + अमान्य फाइल/कॉन्टेंट उदभावस्थान + फाइल मौजूद नही है या उसे पढने या लिखने की पर्याप्त अनुमति नही है + फाइल का नाम खाली नही हो सकता + एक भूल हुई: %1$s + डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नही है + + एक चीज़ साफ कर दी गई। + + इस फ़ाइल को चलाने के लिए कोई ऐप स्थापित नही है + + NewPipe की गोपनीयता नीति + NewPipe परियोजना आपकी गोपनीयता को बहोत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नही करता। +\nNewPipe की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। + गोपनीयता नीति पढ़े + क्या आप सेटिंग्स भी आयात करना चाहते है? + + पसंदीदा \'खोलने पर\' करवाई + सामग्री खोलते समय डिफ़ॉल्ट कारवाही + + केप्सन + प्लेयर केप्शन के शब्दों का परिमाण और पृष्ठभूमि शैलियो को बदले। लागू करने के लिए ऐप को पुनः प्रारम्भ करना जरूरी है। + + आयात/निर्यात + आयात + से आयात करे + पर निर्यात करे + + आयात किया जा रहा है… + निर्यात किया जा रहा है… + + फाइल आयात करे + पहले वाला निर्यात + + सब्सक्रिप्शन आयात नही कर सके + सब्सक्रिप्शन निर्यात नही कर सके + + निर्यात की गई फाइल को डाउनलोड करके यूट्यूब सब्सक्रिप्शन को आयात करे: +\n +\n1. इस URL पर जाए: %1$s +\n2. जब कहा जाए, लॉगिन करे +\n3. एक डाउनलोड शुरू होना चाहिए (यही निर्यात की गई फाइल है) + आपका आई डी, soundcloud.com/yourid + + ध्यान रखे, यह तरीका नेटवर्क साधनो के लिए मंहगा हो सकता है। +\n +\nक्या आप आगे बढ़ना चाहते है? + + चलाने की गति के नियंत्रण + गति + ऊंचाई + अनलिंक (बिगाड़ सकता है) + खामोशी के समय तेज़ी से आगे बढ़े + कदम + रिसेट + + स्वीकारे + अस्वीकार करे + + असीमित + मोबाइल डेटा उपयोग करते समय रेसॉल्युसेन मर्यादित करे + ऐप बदलते समय मिनिमाइज करे + "कार्यवाई, मुख्य वीडियो चालक से दूसरी ऐप पर जाने पर — %s" + कोई नही + पृष्ठभूमि प्लेयर जैसे मिनिमाइज करे + पॉप अप प्लेयर जैसे मिनिमाइज करे + + From ac1fe66cf9f91156e992c43e43e9de0523e7ad5f Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 12 Aug 2018 20:08:24 +0000 Subject: [PATCH 269/363] Translated using Weblate (Russian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index caf09979f..1b01e965f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -21,7 +21,7 @@ Воспроизвести в Kodi Приложение Kore не найдено. Установить его? \"Воспроизвести в Kodi\" - Показать опцию воспроизведения видео через медиацентр Kodi + Показать опцию воспроизведения через медиацентр Kodi Аудио Формат аудио по умолчанию WebM — свободный From 5e05e9ec9307ea439a47434723559f7092e28c4f Mon Sep 17 00:00:00 2001 From: rimasx Date: Sat, 11 Aug 2018 12:51:26 +0000 Subject: [PATCH 270/363] Translated using Weblate (Estonian) Currently translated at 99,7% (382 of 383 strings) --- app/src/main/res/values-et/strings.xml | 52 +++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index e684a8ca4..db523e62e 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -9,7 +9,7 @@ Ava veebilehitsejas Ava hüpikaknas Jaga - Laadi alla + Allalaadimine Laadi voog alla. Otsi Seaded @@ -95,7 +95,7 @@ Sisu vaikimisi riik Teenus Sisu vaikimisi keel - Mängija + Pleier Käitumine Heli ja pilt Ajalugu ja vahemälu @@ -210,7 +210,7 @@ Audio Proovi uuesti Pääsuõigused salvestile puuduvad - Kasuta vana mängijat + Kasuta vana pleierit Vana sisseehitatud mediaframework pleier K @@ -346,7 +346,7 @@ Siia ilmub varsti midagi ;D - Eelistatud \'ava\' toiming + Lingi avamine Vaikimisi tegevus sisu avamisel — %s Videopleier @@ -418,4 +418,46 @@ Piiranguta Piira lahutust mobiilse andmeside kasutamisel - + Peamenüü + Kanalid + Pleilistid + Lood + Kasutajad + Lülitu peamisele + + reCAPTCHA nõue + Nõutav on reCAPTCHA + + © %1$s %2$s %3$s alla + Vaba kergekaaluline Androidi voogesitus. + Kui sul on ideid kujunduse muutmisest, koodi puhastamisest või suurtest koodi muudatustest - abi on alati teretulnud. Mida rohkem tehtud, seda paremaks läheb! + NewPipe arendajad on vabatahtlikud, kes kulutavad oma vaba aega, toomaks sulle parimat kogemust. On aeg anda tagasi aidates arendajaid ja muuta NewPipe veel paremaks, nautides ise tassi kohvi. + Anneta + NewPipe võtab privaatsust väga tõsiselt. Seetõttu ei kogu rakendus ilma nõusolekuta mingeid andmeid. +\nNewPipe privaatsuspoliitika selgitab üksikasjalikult, milliseid andmeid saadetakse ja kogutakse veateate saatmisel. + NewPipe vaba avatud koodiga tarkvara. Seada võib kasutada, uurida, jagada ja parandada. Täpsemalt - seda võib levitada ja/või muuta vastavalt Vaba Tarkvara Sihtasutuse avaldatud GNU Üldise Avaliku Litsentsi v.3 (või hilisem) tingimustele. + Luba LeakCanary + Teavita elutsüklist väljas vigadest + Impordi SoundCloudi profiil trükkides URL või oma ID: +\n +\n1. Luba \"töölaua režiim\" veebilehitsejas (lmobiilsete seadmete jaoks leht pole kättesaadav) +\n2. Ava URL: %1$s +\n3. Logi sisse +\n4. Kopeeri suunatud profiili URL. + sinu_ID, soundcloud.com/sinu_id + + Toon + Tühista ühendus (võib põhjustada moonutusi) + Keri helitu koht edasi + Samm + Lähtesta + + Selleks, et täita Euroopa Üldist Andmekaitse Määrust (GDPR), juhime tähelepanu NewPipe\'i privaatsuspoliitikale. Palun lugege seda hoolikalt. +\nMeile veateate saatmiseks tuleb sellega nõustuda. + Minimeeri, kui kasutad teisi rakendusi + Tegevus lülitusel peamiselt videopleierilt teisele rakendusele — %s + Pole + Esita taustal + Minimeeri hüpikpleierisse + + From 4384948f6ccb6358e294c8167ab99403ed60ba66 Mon Sep 17 00:00:00 2001 From: Praveen0899 Date: Mon, 13 Aug 2018 01:35:13 +0000 Subject: [PATCH 271/363] Translated using Weblate (Telugu) Currently translated at 33.9% (130 of 383 strings) --- app/src/main/res/values-te/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index d2231ce43..ffd467e27 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -198,4 +198,5 @@ ఎన్క్యూలో పట్టుకోండి "మీదగార వీడియో కి కావాల్సిన ప్లేయర్ లేదు. VLC ప్లేయర్ ఇన్స్టాల్ చేసుకుంటారా?" "మీదగార వీడియో కి కావాల్సిన ప్లేయర్ లేదు (మీరు VLC ఇసన్తాల్ చేసుకోవచ్చు)" + పాపప్ మోడ్ తెరువఛ From a7f36248d0f2a82fb8ab2f536996a90886907f9c Mon Sep 17 00:00:00 2001 From: oscar Date: Tue, 24 Jul 2018 17:41:57 +0200 Subject: [PATCH 272/363] Removed incorrect explanations of the M4A and WebM audio formats --- app/src/main/res/values-ar/strings.xml | 2 -- app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 2 -- app/src/main/res/values-bg/strings.xml | 2 -- app/src/main/res/values-bn-rBD/strings.xml | 2 -- app/src/main/res/values-ca/strings.xml | 2 -- app/src/main/res/values-cmn/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 2 -- app/src/main/res/values-de/strings.xml | 2 -- app/src/main/res/values-el/strings.xml | 2 -- app/src/main/res/values-eo/strings.xml | 2 -- app/src/main/res/values-es/strings.xml | 2 -- app/src/main/res/values-et/strings.xml | 2 -- app/src/main/res/values-eu/strings.xml | 2 -- app/src/main/res/values-fa/strings.xml | 2 -- app/src/main/res/values-fi/strings.xml | 2 -- app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-he/strings.xml | 2 -- app/src/main/res/values-hi/strings.xml | 2 -- app/src/main/res/values-hr/strings.xml | 2 -- app/src/main/res/values-hu/strings.xml | 2 -- app/src/main/res/values-id/strings.xml | 2 -- app/src/main/res/values-it/strings.xml | 2 -- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-ko/strings.xml | 2 -- app/src/main/res/values-ku/strings.xml | 2 -- app/src/main/res/values-lt/strings.xml | 2 -- app/src/main/res/values-mk/strings.xml | 2 -- app/src/main/res/values-nb-rNO/strings.xml | 2 -- app/src/main/res/values-nl-rBE/strings.xml | 2 -- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-pl/strings.xml | 2 -- app/src/main/res/values-pt-rBR/strings.xml | 2 -- app/src/main/res/values-pt/strings.xml | 2 -- app/src/main/res/values-ro/strings.xml | 2 -- app/src/main/res/values-ru/strings.xml | 8 +++----- app/src/main/res/values-sk/strings.xml | 2 -- app/src/main/res/values-sl/strings.xml | 2 -- app/src/main/res/values-sr/strings.xml | 2 -- app/src/main/res/values-sv/strings.xml | 2 -- app/src/main/res/values-tr/strings.xml | 2 -- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-vi/strings.xml | 2 -- app/src/main/res/values-zh-rCN/strings.xml | 2 -- app/src/main/res/values-zh-rHK/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- app/src/main/res/values/settings_keys.xml | 4 ++-- app/src/main/res/values/strings.xml | 2 -- 48 files changed, 5 insertions(+), 97 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1009e8e87..9d7725070 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -25,7 +25,6 @@ تطبيق Kore غير موجود. هل تريد تثبيته ؟ مضيء صور معاينة الفيديو - جودة أفضل — M4A خطأ في الشبكة الفيديو التالي لا يوجد مشغل فيديو. هل تريد تثبيت VLC ؟ @@ -53,7 +52,6 @@ (إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية ( تشغيل الفيديو المباشر غير مدعوم حتى الأن ). استخدام Tor مشاهدات %1$s - تنسيق حر — WebM تم حجبه بواسطة GEMA المحتوى غير متاح لم يتمكن من تحميل كل صور المعاينة diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 61a57ec26..d39e46d5a 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -48,7 +48,6 @@ Audio Defolt audio formatı Defolt video formatı - M4A — daha yaxşı keyfiyyət Mövzu Açıq Qaranlıq diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index ff0d96016..a8ee6260c 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -33,8 +33,6 @@ Amuesa una opción pa reproducir un videu per Kodi Audiu Formatu por defeutu d\'audiu - WebM — formatu llibre - M4A — calidá meyor Tema Escuru Claru diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 019922f73..e465e8bb1 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -53,8 +53,6 @@ Аудио Аудио формат по подразбиране Видео формат по подразбиране - WebM — свободен формат - M4A — по-добро качество Тема на външния вид Светла Тъмна diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 859e16aa9..f9ec7a07a 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -46,8 +46,6 @@ অডিও ডিফল্ট অডিও ফরম্যাট পছন্দসই ভিডিও ফরম্যাট - WebM — বিনামূল্য/স্বাধীন ফরম্যাট - m4a — ভালো মানের থিম উজ্জ্বল অন্ধকার diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index eeea5dffe..28f12217b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -23,8 +23,6 @@ Àudio Format d\'àudio per defecte Format de vídeo per defecte - WebM — format lliure - M4A — millor qualitat Tema Clar Fosc diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index 852ac7f1e..f55bbc60b 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -64,7 +64,6 @@ 酷黑 黑色 记住弹出窗口的尺寸与位置 - M4A — 更好的音质 记住上一次弹出窗口的位置以及大小 清理照片内存 最小化弹出播放器 diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index a1ee6ab1e..a4c5c7cb1 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -32,8 +32,6 @@ Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi Zvuk Výchozí formát zvuku - WebM — volný formát - M4A — lepší kvalita Téma Tmavé Světlé diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c58ab68e9..616a2abcc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -24,8 +24,6 @@ Zeigt eine Option an, über die man Videos mit Kodi abspielen kann Audio Bevorzugtes Audioformat - WebM — freies Format - M4A — bessere Qualität Herunterladen Nächstes Video \'Nächste\' und \'ähnliche\' Videos anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8f383b580..7fdb02a59 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -32,8 +32,6 @@ Προβολή μιας επιλογής για αναπαραγωγή με το Kodi media center. Ήχος Προεπιλεγμένη μορφή ήχου - WebM — δωρεάν format - m4a — καλύτερη ποιότητα Θέμα Σκοτεινό Φωτεινό diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index fdae53d50..585800cba 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -21,8 +21,6 @@ Montri \"Ludi per Kodi\"-opcion Sono Defaŭlta sondosierformo - WebM — libera dosierformo - m4a — pli bona kvalito Etoso Malluma Luma diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b2aca1df6..e51bb358e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -24,8 +24,6 @@ Mostrar una opción para reproducir vídeo con Kodi Media Center Audio Formato de audio por defecto - WebM — formato libre - M4A — mejor calidad Descargar Siguiente vídeo URL no soportada diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 7f08efd38..2d9d58fe2 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -58,8 +58,6 @@ Heli Heli vaikevorming Video vaikevorming - WebM — libre vorming - M4A — parem kvaliteet Teema Hele Tume diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 9f9fceb8b..74273e560 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -22,8 +22,6 @@ Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera Audioa Audio formatu lehenetsia - WebM — formatu librea - M4A — kalitate hobea Deskargatu Hurrengo bideoa Erakutsi \'hurrengo\' eta \'antzeko\' bideoak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 5d1f0b336..71acd9c69 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -35,8 +35,6 @@ نمایش گزینه‌ای برای پخش ویدیو با مرکز رسانهٔ کودی. صدا قالب صدای پیش‌گزیده - قالب آزاد — WebM - کیفیت بهتر — m4a زمینه تیره روشن diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index c755f8e73..fc9c343b1 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -54,8 +54,6 @@ Ääni Oletusääniformaatti Oletusvideoformaatti - WebM — vapaa formaatti - M4A — parempi laatu Teema Kirkas Tumma diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e74c948fd..c748a7626 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -24,8 +24,6 @@ %1$s vues Audio Format audio par défaut - WebM — format libre - M4A — meilleure qualité Télécharger Vidéo suivante Afficher les vidéos \"suivantes\" et \"similaires\" diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 6468079f4..21e944ea8 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -44,8 +44,6 @@ שמע תבנית ברירת המחדל לשמע תבנית סרט ברירת מחדל - WebM — תבנית חופשית - M4A — איכות גבוהה יותר ערכת נושא מואר חשוך diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 909218fe3..fe4389495 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -87,8 +87,6 @@ उस विकल्प को दिखाए जिसमे Kodi Media Center के जरिये विडियो प्ले किया जाता है डिफ़ॉल्ट ऑडियो का फॉर्मेट डिफ़ॉल्ट विडियो का फॉर्मेट - webm - फ्री फॉर्मेट - M4A - बेहतर क्वालिटी एप्प का नया रूप काला विडियो पॉपअप की आकर और उसकी स्थति को याद रखे diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 3fd74e7df..8e73cdf4f 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -54,8 +54,6 @@ Zvuk Zadani format zvuka Zadani format videozapisa - WebM - slobodni format - M4A - bolja kvaliteta Tema Svijetla Tamna diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 965b19031..1f925eb39 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -24,8 +24,6 @@ Mutat egy opciót a videók Kodi médiaközponttal való lejátszására. Hang Alapértelmezett hang formátum - WebM — szabad formátum - m4a — jobb minőség Letöltés Következő videó A webcím nem támogatott diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 44973426f..029a4b1de 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -32,8 +32,6 @@ Tampilkan opsi untuk memutar video via media center Kodi Audio Format audio baku - WebM — format bebas - M4A — kualitas lebih baik Tema Gelap Terang diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 18bbc6d3e..d772d5754 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -24,8 +24,6 @@ Mostra l\'opzione per riprodurre i video tramite Kodi Audio Formato audio predefinito - WebM — formato libero - M4A — miglior qualità Scarica Prossimo video Mostra \'prossimi\' video e video \'simili\' diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3eff27ff9..ceee62fa9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -23,8 +23,6 @@ Kodi メディアセンター経由で動画を再生するための設定を表示します 音楽 デフォルトの音楽形式 - WebM形式 - m4a形式 保存 次の動画 \"次の動画\"と\"関連動画\"を表示します diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 0a73759a9..2eee6b809 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -24,8 +24,6 @@ 비디오를 Kodi media center를 사용해 재생하는 옵션을 표시합니다 오디오 기본 오디오 형식 - WebM — 공개형 무료 자유 포맷입니다 - m4a — 보다 나은 품질을 제공합니다 다운로드 다음 비디오 다음 및 유사한 비디오 표시 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 8d30f3592..228849b33 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -58,8 +58,6 @@ ده‌نگ جۆری سه‌ره‌كی ده‌نگ جۆری سه‌ره‌كی ڤیدیۆ - WebM — جۆری ئاسایی - M4A — كوالێتی به‌رزتر ڕووكار ڕووناك تاریك diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 36482c0d0..af2ff5a7a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -43,8 +43,6 @@ Garso įrašas Numatytasos garso formatas Numatytasos vaizdo formatas - WebM — laisvas formatas - M4A - geresnė kokybė Tema Šviesi Tamsi diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 1ae02a0f2..67de9b563 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -59,8 +59,6 @@ Звук Стандарден аудио формат Стандарден видео формат - WebM — слободен формат - М4А — подобар квалитет Тема Светла Темна diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 0f8d9b55a..28d0480d2 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -32,8 +32,6 @@ Vis valg for avspilling via Kodi mediasenter Lyd Forvalgt lydformat - WebM — fritt format - M4A — bedre kvalitet Drakt Mørk Lys diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 3c15cf226..4c0ee5de3 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -59,8 +59,6 @@ Audio Standaardaudioformaat Standaardvideoformaat - WebM — vrij formaat - M4A — betere kwaliteit Thema Licht Donker diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 358e76fde..aed2683ce 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -24,8 +24,6 @@ Toont een optie om een video op een Kodi media center af te spelen Audio Standaardaudioformaat - WebM — vrij formaat - M4A — betere kwaliteit Downloaden Volgende video URL wordt niet ondersteund diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0889fa9e3..0b09d5d3e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -35,8 +35,6 @@ Wyświetl opcję, aby odtworzyć wideo przez Kodi Audio Domyślny format audio - WebM — otwarty i darmowy format - M4A — lepsza jakość Motyw Ciemny Jasny diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 3ec466bba..b58ab0b51 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -5,7 +5,6 @@ Seu comentário (em inglês): O que aconteceu: Informações: - WebM — formato aberto %1$s visualizações Reproduzir Vídeo com restrição de idade. Permissão para vídeos com essa restrição podem ser feitas no menu configurações. @@ -78,7 +77,6 @@ Downloads Downloads Você quis dizer: %1$s ? - M4A — melhor qualidade Nova missão App/interface parou Reproduzindo em segundo plano diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index dec2c6f77..d8ca1a265 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -26,8 +26,6 @@ Mostra uma opção para reproduzir o vídeo no Kodi Áudio Formato áudio padrão - WebM — formato livre - M4A — melhor qualidade Descarregar Vídeo seguinte Mostrar vídeos \'seguintes\' e \'semelhantes\' diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 022d0482e..a45b48199 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -33,8 +33,6 @@ Audio Format audio implicit Directorul de descărcare \'%1$s\' a fost creat - WebM — format liber - M4A — calitate superioară Temă Întunecat Luminos diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4fc30e90e..3cacc83e8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -24,8 +24,6 @@ Показать опцию воспроизведения видео через медиацентр Kodi Аудио Формат аудио по умолчанию - WebM — свободный - M4A — выше качество Скачать Следующее видео URL не поддерживается @@ -436,7 +434,7 @@ \n4. Скопируйте адрес из адресной строки. вашID, soundcloud.com/вашID - Это действие может вызвать большой расход трафика. + Это действие может вызвать большой расход трафика. \n \nПродолжить? Загружать миниатюры @@ -475,10 +473,10 @@ Хотите импортировать настройки? Политика конфиденциальности NewPipe - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. \nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. Прочитать политику - В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. + В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. \nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. Принять Отклонить diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6204e5fba..26a94f2b5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -32,8 +32,6 @@ Zobrazovať možnosť prehrať video cez mediálne centrum Kodi Zvuk Predvolený zvukový formát - WebM — voľný formát - M4A — lepšia kvalita Téma Tmavá Svetlá diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 16a4ab8e7..d2d6d4343 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -25,8 +25,6 @@ Pokaži možnost \"Predvajaj s Kodi\" Privzet zapis zvoka Zvok - WebM — prost zapis - M4A — višja kakovost posnetkov Prejem Naslednji video Pokaži naslednji video in podobne posnetke diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 54cb4db2a..60f99e254 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -24,8 +24,6 @@ Приказ опције за пуштање видеа у Коди медија центру Аудио Подразумевани формат звука - WebM — слободни формат - M4A — бољи квалитет Преузми Следећи видео УРЛ није подржан diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 675514f17..1508b33b2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -41,8 +41,6 @@ Ljud Standardformat för ljud Videoformat som föredras - WebM — öppet format - M4A — bättre kvalité Tema Ljus Mörk diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 15fbc4130..a13aeff81 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -34,8 +34,6 @@ \"Kodi ile oynat\" seçeneğini göster Kodi ortam merkezi aracılığıyla video oynatmak için bir seçenek görüntüler Öntanımlı ses biçimi - WebM — özgür biçim - M4A — daha iyi kalite Tema Koyu Açık diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 313448323..78eb45590 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -34,8 +34,6 @@ Показувати опцію відтворення відео за допомогою Kodi media center Аудіо Типовий аудіо формат - WebM — вільний формат - M4A — ліпша якість Тема Темна Світла diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1c3fe27a6..a55f01085 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -41,8 +41,6 @@ Âm thanh Định dạng âm thanh mặc định Định dạng video ưa thích - WebM — Định dạng miễn phí - M4a — chất lượng tốt hơn Nền Chủ đề Sáng diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5118b42d6..1207975f5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -26,8 +26,6 @@ 显示 Kodi 媒体中心播放视频的选项 音频 默认音频格式 - WebM — 开放格式 - M4A — 品质更佳 主题 灰暗 明亮 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index e21f8f1ea..7cb4ca5cb 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -22,8 +22,6 @@ 顯示以 Kodi 媒體中心播放影片的選項 聲音 預設聲音檔案格式 - WebM — 開放格式 - M4A — 更佳畫質 主題 黑暗 明亮 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2e6610381..302eb83a1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -26,8 +26,6 @@ 找不到Kore,您要安裝Kore嗎? 顯示「用Kodi播放」的選項 預設音訊格式 - WebM — 開放格式 - M4A — 畫質更佳 主題 灰暗 明亮 diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 3e73738ed..02f065285 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -93,8 +93,8 @@ audio_m4a audio_webm - @string/m4a_description - @string/webm_description + M4A + WebM @string/audio_m4a_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 502483667..240fef3dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,8 +64,6 @@ Audio Default audio format Default video format - WebM — libre format - M4A — better quality Theme Light Dark From 627301f83d91010c4a1a793442bb63628d1224b0 Mon Sep 17 00:00:00 2001 From: Telugu Speaker Date: Mon, 13 Aug 2018 01:35:49 +0000 Subject: [PATCH 273/363] Translated using Weblate (Telugu) Currently translated at 34.2% (131 of 383 strings) --- app/src/main/res/values-te/strings.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index ffd467e27..506c2decf 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -15,7 +15,8 @@ బ్రౌజర్ను ఎంచుకోండి భ్రమణ బాహ్యట ఆడియో ప్లేయర్ని ఉపయోగించండి - న్యూపై పాప్అప్ + న్యూపైప్ పాపప్ మోడ్ +\n సభ్యత్వ సబ్ స్క్రైబ్ అన్ సబ్స్క్రైబ్ చేయబడింది @@ -28,7 +29,7 @@ కొత్తది ఏమిటి వెనకవైపు - పాప్అప్ + పాపప్ వీడియో డౌన్లోడ్ మార్గం డౌన్లోడ్ చేసిన వీడియోలను నిల్వ చేయడానికి మార్గం @@ -198,5 +199,6 @@ ఎన్క్యూలో పట్టుకోండి "మీదగార వీడియో కి కావాల్సిన ప్లేయర్ లేదు. VLC ప్లేయర్ ఇన్స్టాల్ చేసుకుంటారా?" "మీదగార వీడియో కి కావాల్సిన ప్లేయర్ లేదు (మీరు VLC ఇసన్తాల్ చేసుకోవచ్చు)" - పాపప్ మోడ్ తెరువఛ + పాపప్ మోడ్ తెరవండి + డిఫాల్ట్ పాపప్ స్పష్టత From 21b7045f93f1679258415e975a2fcc2739e59f11 Mon Sep 17 00:00:00 2001 From: Ale-Ma Date: Tue, 14 Aug 2018 14:36:20 +0000 Subject: [PATCH 274/363] Translated using Weblate (Italian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-it/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7e8eb9337..62cacc830 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -501,4 +501,8 @@ Minimizza al lettore in sottofondo Minimizza al lettore popup - +Canali + Playlist + Tracce + Utenti + From de080d5811ec504e641d5dacef6d2fb2bd3e3d79 Mon Sep 17 00:00:00 2001 From: AB Date: Tue, 14 Aug 2018 08:10:29 +0000 Subject: [PATCH 275/363] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d946a2cb0..7016286b3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -48,7 +48,7 @@ Відео та Аудіо Зовнішній вигляд Інше - Відтворення у фоновому режимі + Відтворення у тловому режимі Відтворити У доступі відмовлено Контент @@ -167,7 +167,7 @@ Історія та кеш Вікно Відворення у вікні - Додано до фонового відтворення + Додано до тлового відтворення Додано до чергу у вікно Плейлист Фільтрувати @@ -181,11 +181,11 @@ Тільки тепер NewPipe сповіщення - Сповіщення для фонового та віконного програвачів NewPipe + "Сповіщення для NewPipe\'пових тлового і віконного програвачів " [Невідомо] - Перемкнутися до Тла + Перемкнутися до тла Перемкнутися до вікна Перемкнутися на головну @@ -234,7 +234,7 @@ Налаштування аудіо Відеопрогравач - Фоновий програвач + Тловий програвач Віконний програвач Щоразу питати @@ -247,7 +247,7 @@ Додати до - Показувати підказку коли натиснута кнопка фону або вікна на сторінці інформації відео + Показувати підказку коли натиснута кнопка тла або вікна на сторінці інформації відеозапису Перемкнути орієнтацію Фатальна хиба програвача Зовнішні програвачі не підтримують такі види ланок @@ -333,14 +333,14 @@ Кіоски Набуває популярності - Фоновий програвач + Тловий програвач Віконний програвач Усунути Затиснути, аби зняти з черги - Зняти з черги у фоновому програвачеві + Зняти з черги у тловому програвачеві Зняти з черги у віконному програвачеві Розпочати відтворення звідси - Розпочати відтворення звідси у фоновому програвачеві + Розпочати відтворення у тловому програвачеві Розпочати відтворення у вікні звідси Відчинити шухляду @@ -446,7 +446,7 @@ Типова дія під час відкриття вмісту — %s Субтитри - Змінення маштабу тексту субтитрів та фонових стилів. Увімкнення функції потребує перезавантаження застосунку + Змінення маштабу субтитрового тексту та тлових стилів. Увімкнення функції потребує перезавантаження застосунку Не знайдено відповідного застосунку для відтворення цього файла @@ -480,7 +480,7 @@ Зменшити при перемкненні застосунку Дія при перемкненні до інших застосунків з головного відеопрогравача — %s Жодних - Зменшити до фонового програвачу + До тлового програвача Зменшити до віконного програвачу Канали From e86302f5b9c1f7a97e62db5896b387ccec832020 Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Wed, 15 Aug 2018 01:30:42 +0000 Subject: [PATCH 276/363] Added translation using Weblate (Belarusian) --- app/src/main/res/values-be/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-be/strings.xml diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-be/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From cb4c8abd940892fa823413c2bcd6bb6ae72211d5 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Tue, 14 Aug 2018 16:25:16 +0000 Subject: [PATCH 277/363] Translated using Weblate (Telugu) Currently translated at 34.2% (131 of 383 strings) --- app/src/main/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 506c2decf..dc14446e7 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -149,7 +149,7 @@ ఫైల్ ఇప్పటికే ఉంది న్యూపిప్ డౌన్లోడ్ అవుతంది వివరాల కోసం నొక్కండి - దయచేసి వేచి ఉండండి + దయచేసి వేచి ఉండండి… క్లిప్బోర్డ్కు కాపీ చేయబడింది దయచేసి అందుబాటులో ఉన్న డౌన్లోడ్ ఫోల్డర్ను ఎంచుకోండి డౌన్లోడ్ From 042809620adaa33e263bb70298eeb92160ac32be Mon Sep 17 00:00:00 2001 From: Ivan Dekovets Date: Wed, 15 Aug 2018 06:47:40 +0000 Subject: [PATCH 278/363] Translated using Weblate (Belarusian) Currently translated at 100,0% (383 of 383 strings) --- app/src/main/res/values-be/strings.xml | 468 ++++++++++++++++++++++++- 1 file changed, 466 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index a6b3daec9..46c50a828 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,2 +1,466 @@ - - \ No newline at end of file + +Націсніце пошук, каб пачаць + %1$s праглядаў + Апублікавана %1$s + Патокавы плэер не знойдзены. Усталяваць VLC? + Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC) + Усталяваць + Скасаваць + Адкрыць у браўзэры + Адкрыць у асобным акне + Падзяліцца + Спампаваць + Загрузка файла прамой трансляцыі. + Пошук + Налады + Магчыма, вы мелі на ўвазе: %1$s? + Падзяліцца з дапамогай + Выбраць браўзэр + паварот + Знешні відэаплэер + У некаторых разрозненнях НЕ будзе гуку, калі гэтая опцыя абраная + Знешні аўдыяплэер + NewPipe ў акне + Падпісацца + Вы падпісаныя + Падпіска адменена + Не атрымалася змяніць падпіску + Не атрымалася абнавіць падпіску + Паказаць звесткі + + Галоўная + Падпіскі + Закладкі + + Што новага + + У фоне + У акне + Дадаць да + + Шлях загрузкі відэа + Папка для захоўвання загружаных відэа + Увядзіце шлях да папкі для загрузкі відэа + + Шлях загрузкі аўдыё + Папка для захоўвання загружаных аўдыё + Увядзіце шлях да папкі для загрузкі аўдыё + + Аўтапрайграванне + Прайграваць відэа пры выкліку NewPipe з іншага прыкладання + Разрознянне па змаўчанні + Разрозненне усплываючага акна + Высокія разрозненні + Толькі некаторыя прылады могуць прайграваць відэа ў 2K/4K + Прайграць у Kodi + Дадатак Kore не знойдзены. Усталяваць яго? + \"Прайграць у Kodi\" + Паказаць опцыю прайгравання відэа праз медыяцэнтр Kodi + Аўдыё + Фармат аўдыё па змаўчанні + Фармат відэа па змаўчанні + WebM - свабодны + M4A - вышэй якасць + Тэма + Светлая + Цёмная + Чорная + Аднавіць акно + Запамінаць памер і становішча ўсплываючага акна + Хуткі пошук пазіцыі + Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна + Загружаць мініяцюры + Адключыце, каб не загружаць мініяцюры і зэканоміць трафік і памяць. Змена налады ачысьціць кэш малюнкаў у памяці і носьбіце + Кэш малюнкаў ачышчаны + Ачысціць кэш метададзеных + Выдаліць усе загружаныя дадзеныя вэб-старонак + Кэш метададзеных ачышчаны + Аўтадапаўненне чаргі + Дадаваць падобныя патокі ў чаргу пры прайграванні апошняга, калі не ўключаны паўтор + Кіраванне жэстамі + Змяняць яркасць і гучнасць жэстамі + Варыянты пошуку + Адлюстроўваць падказкі пры пошуку + Гісторыя пошуку + Захоўваць пошукавыя запыты лакальна + Гісторыя і кэш + Запамінаць прагледжаныя відэа + Аднавіць пры фокусе + Аднаўляць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў) + Спампаваць + Наступнае відэа + \"Наступнае\" и \"Прапанаваныя\" + \"Зацісніце, каб дадаць\" + Паказаць падказку пры націсканні \"У акне\" ці \"У фоне\" на старонцы звестак аб відэа + URL не падтрымліваецца + Краіна кантэнту па змаўчанні + Сэрвіс + Мова кантэнту па змаўчанні + Плэер + Павядзенне + Відэа і аўдыё + Гісторыя і кэш + Усплываючае акно + Знешні выгляд + Іншае + Адладка + Прайграванне ў фонавым рэжыме + Прайграванне ва ўсплываючым акне + Дададзена ў чаргу ў фоне + Дададзена ў чаргу ў акне + Прайграць + Кантэнт + Кантэнт 18+ + Відэа з узроставымі абмежаваннямі. Дазволіць падобны кантэнт можна ў наладах. + ужывую + Загрузкі + Загрузкі + Справаздача пра памылку + Усё + Канал + Каналы + Плэйліст + Плэйлісты + Дарожкі + Карыстальнікі + Так + Пазней + Адключана + Фільтр + Абнавіць + Ачысціць + Змена памеру + Лепшае разрозненне + Скасаваць + Прайграць усё + Заўсёды + Толькі цяпер + Файл + + Апавяшчэнне NewPipe + Апавяшчэнні для NewPipe ў фоне і ва ўсплываючым акне + + [Невядома] + + Пераключыць арыентацыю + Перайсці ў фон + Перайсці ў акно + Перайсці ў галоўнае акно + + Імпарт дадзеных + Экспарт дадзеных + Ваша бягучая гісторыя і падпіскі перазапішуцца + Экспарт гісторыі, падпісак і плэйлістоў + Ачысціць гісторыю праглядаў + Выдаліць гісторыю прайграных патокаў + Уся гісторыя праглядаў будзе выдалена + Гісторыя праглядаў выдалена. + Ачысціць гісторыю пошуку + Выдаліць гісторыю пошукавых запытаў + Уся гісторыя пошуку будзе выдалена + Гісторыя пошуку выдалена. + Памылка + Памылка сеткі + Не атрымалася загрузіць усе мініяцюры + Не атрымалася расшыфраваць подпіс URL у відэа + Не атрымалася разабраць вэб-сайт + Не атрымалася цалкам разабраць вэб-сайт + Кантэнт недаступны + Заблакавана GEMA + Не атрымалася стварыць меню загрузкі + Гэта прамая трансляцыя, яны пакуль не падтрымліваюцца. + Не атрымалася знайсці ні аднаго патока + Не атрымалася загрузіць малюнак + Падзенне прыкладання/UI + Не атрымалася прайграць гэты паток + Памылка плэера без магчымасці аднаўлення + Аднаўленне пасля памылкі плэера + Знешнія плэеры не падтрымліваюць спасылкі гэтых тыпаў + Няправільная спасылка + Патокі відэа не знойдзены + Патокі аўдыё не знойдзены + Няправільная папка + Няправільны файл або крыніца кантэнту + Файл не існуе або няма дазволу на яго чытанне або запіс + Імя файла не можа быць пустым + Адбылася памылка: %1$s + Няма патокаў, даступных для загрузкі + + Прабачце, гэта не павінна было адбыцца. + Адправіць справаздачу па e-mail + Прабачце, адбыліся памылкі. + СПРАВАЗДАЧА + Інфармацыя: + Што адбылося: + Што:\\nЗапыт:\\nМова кантэнту:\\nСэрвіс:\\nЧас па Грынвічы:\\nПакет:\\nВерсія:\\nВерсія АС: + Ваш каментар (English): + Падрабязнасці: + + + Мініяцюра відэа-прэв\'ю + Мініяцюра відэа-прэв\'ю + Мініяцюра аватара карыстальніка + Спадабалася + Не спадабалася + Выкарыстоўваць Tor + (Эксперыментальна) Загружаць праз Tor для павышэння прыватнасці (прамыя трансляцыі пакуль не падтрымліваюцца). + Паведаміць пра памылку + Паведаміць аб парушэнні + Няма вынікаў + Нічога няма + Перацягніце, каб змяніць парадак + + Не атрымалася стварыць папку для загрузкі \"%1$s\" + Створана папка для загрузак \"%1$s\" + + Відэа + Аўдыё + Паспрабаваць зноў + Няма доступу да носьбіта + Стары плэер + Стары убудаваны плэер на Mediaframework + + тыс. + млн. + млрд. + + Няма падпісчыкаў + + %s падпісчык + %s падпісчыка + %s падпісчыкаў + + + Няма праглядаў + + %s прагляд + %s прагляда + %s праглядаў + + + Няма відэа + + %s відэа + %s відэа + %s відэа + + + Пачаць + Паўза + Прайграць + Стварыць + Выдаліць + Выдаліць адно + Выдаліць усё + Кантрольная сума + Адхіліць + Перайменаваць + + Новая мэта + ОК + + Імя файла + Патокі + Памылка + Сервер не падтрымліваецца + Файл ужо існуе + Няправільны URL або няма доступу да інтэрнэту + NewPipe спампоўвае + Падрабязнасці + Пачакайце… + Скапіявана ў буфер абмену + Выберыце даступную папку для загрузкі + Гэтае разрозненне трэба для +\nпрайгравання ў акне + 1 элемент выдалены. + + reCAPTCHA + Запыт reCAPTCHA + Запытаны ўвод reCAPTCHA + + Загрузкі + Дапушчальныя сімвалы назвы файлаў + Недапушчальныя сімвалы замяняюцца на гэтыя + Сімвал для замены + + Літары і лічбы + Большасць спецзнакаў + + Прыкладанне для прайгравання гэтага файла не ўстаноўлена + + Аб NewPipe + Налады + Аб дадатку + Іншыя ліцэнзіі + © %1$s %2$s пад ліцэнзіяй %3$s + Не атрымалася загрузіць ліцэнзію + Адкрыць вэб-сайт + Аб дадатку + Удзельнікі + Ліцэнзіі + Свабоднае легкавагавае патокавае прайграванне на Android. + Дапамога праекту + Вітаецца ўсё - ідэі, пераклад, змены дызайну, чыстка кода або велізарныя змены ў кодзе. Чым больш зроблена, тым лепш! + Адкрыць на GitHub + Ахвяраваць + Распрацоўшчыкі NewPipe цаной свайго вольнага часу робяць ваша жыццё крышачку зручней. Адплаціце ім тым жа - атрымліваючы асалоду ад кубачка кавы, яны змогуць зрабіць NewPipe яшчэ лепей. + Аддаць належнае + Вэб-сайт + Дзеля атрымання больш падрабязнай інфармацыі і апошніх навін аб NewPipe наведайце наш вэб-сайт. + Палітыка прыватнасці NewPipe + Праект NewPipe вельмі сур\'ёзна ставіцца да вашай прыватнасці. Таму прыкладанне не збірае ніякіх дадзеных без вашай згоды. +\nПалітыка прыватнасці NewPipe падрабязна тлумачыць, якія дадзеныя адпраўляюцца і захоўваюцца пры адпраўцы справаздачы аб збоях. + Прачытаць палітыку + Ліцэнзія NewPipe + NewPipe - свабоднае праграмнае забеспячэнне: вы можаце выкарыстоўваць, вывучаць і паляпшаць яго па сваім меркаванні. У прыватнасці, вы можаце распаўсюджваць і / або змяняць яго ў адпаведнасці з умовамі GNU General Public License, апублікаванай Free Software Foundation, альбо версіі 3, альбо (па вашаму выбару) любой больш позняй версіі. + Прачытаць ліцэнзію + + + Гісторыя + Гісторыя пошуку + Прагледжана + Гісторыя адключаная + Гісторыя + Гісторыя пустая + Гісторыя ачышчана + Элемент выдалены + Выдаліць гэты элемент з гісторыі пошуку? + Выдаліць гэты элемент з гісторыі пошуку? + Выдаліць усе элементы з гісторыі? + Нядаўна прайграныя + Часта прайграваемыя + + Кантэнт галоўнай старонкі + Пустая старонка + Старонка кіёска + Старонка падпіскі + Старонка стужкі + Старонка канала + Выберыце канал + Пакуль няма падпісак на каналы + Выберыце кіёск + Экспарт завершаны + Імпарт завершаны + Няма правільнага Zip-файла + Увага: не ўсе файлы былі імпартаваныя. + Бягучыя дадзеныя будуць замененыя. + Хочаце імпартаваць налады? + + Кіёск + Трэнды + Топ 50 + Новае і гарачае + У фоне + У акне + Выдаліць + Падрабязнасці + Налады аўдыё + Зацісніце, каб дадаць у чаргу + У чаргу \"У фоне\" + У чаргу \"У фоне\" + Відэаплэер + Фонавы плэер + Плэер у акне + + Адкрыць бакавую панэль + Зачыніць бакавую панэль + Хутка тут сёе-тое з\'явіцца ;D + + + Пры адкрыцці кантэнту + Пры адкрыцці спасылкі на кантэнт — %s + + Відэаплэер + Фонавы плэер + Плэер у акне + Заўсёды пытацца + + Атрыманне звестак… + Загрузка запытанага кантэнту + + Стварыць плэйліст + Выдаліць плэйліст + Перайменаваць плэйліст + Імя + Дадаць у плэйліст + На мініяцюру плэйліста + + Дадаць плэйліст у закладкі + Выдаліць закладку + + Выдаліць гэты плэйліст? + Плэйліст створаны + Дададзена ў плэйліст + Мініяцюра плэйліста зменена + Не атрымалася выдаліць плэйліст + + Без тытраў + + Падагнаць + Запоўніць + Наблізіць + + Створаны аўтаматычна + + Тытры + Змяніць памер і фон тытраў. Змены ўступяць у сілу пасля перазапуску + + Уключыць LeakCanary + Маніторынг уцечкі памяці можа прывесці да завісання прыкладання + + Паведамляць пра памылкі жыццёвага цыклу + Прымусова паведамляць пра недастаўляемыя Rx-выключэнні па-за фрагментам або жыццёвым цыкле пасля выдалення + + Імпарт/Экспарт + Імпарт + Імпарт з + Экспарт у + + Імпарт… + Экспарт… + + Імпарт файла + Папярэдні экспарт + + Не атрымалася імпартаваць падпіскі + Не атрымалася экспартаваць падпіскі + + Імпарт падпісак з YouTube загрузкай файла экспарту: +\n +\n1. Перайдзіце на: %1$s +\n2. Увайдзіце, калі неабходна +\n3. Павінна пачацца загрузка (гэта будзе файл экспарту) + Імпарт падпісак з SoundCloud набраўшы альбо URL, альбо ваш ID: +\n +\n1. Уключыце \"рэжым працоўнага стала\" у браўзэры (сайт недаступны на тэлефоне) +\n2. Перайдзіце на: %1$s +\n3. Увайдзіце, калі неабходна +\n4. Скапіруйце адрас з адраснага радка. + вашID, soundcloud.com/вашID + + Гэтае дзеянне можа выклікаць вялікі расход трафіку. +\n +\nПрацягнуць? + + Кіраванне хуткасцю прайгравання + Тэмп + Тон + Незалежна (скажэнні) + Прапускаць цішыню + Крок + Скід + + У адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. +\nВам неабходна прыняць яе ўмовы, каб адправіць нам справаздачу пра памылку. + Прыняць + Адмовіцца + + Без абмежаванняў + Ліміт разрознення ў мабільнай сетцы + Пры згортванні плэера + Пры пераключэнні са стандартнага плэера на іншае прыкладанне — %s + Нічога не рабіць + Фонавы плэер + Плэер у акне + + From 1ccc1f4c1a2ee0ba841a8ffd4a655bb3f4015088 Mon Sep 17 00:00:00 2001 From: "Haris Subandie Md. Suhaimin" Date: Wed, 15 Aug 2018 11:57:23 +0000 Subject: [PATCH 279/363] Added translation using Weblate (Malay) --- app/src/main/res/values-ms/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-ms/strings.xml diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ms/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 6dccfb4774c4902216e945654590698cf17aa6b9 Mon Sep 17 00:00:00 2001 From: Ivan Dekovets Date: Wed, 15 Aug 2018 06:49:54 +0000 Subject: [PATCH 280/363] Translated using Weblate (Belarusian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-be/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 46c50a828..8a1d35df3 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -153,11 +153,11 @@ Экспарт гісторыі, падпісак і плэйлістоў Ачысціць гісторыю праглядаў Выдаліць гісторыю прайграных патокаў - Уся гісторыя праглядаў будзе выдалена + Выдаліць усю гісторыю праглядаў. Гісторыя праглядаў выдалена. Ачысціць гісторыю пошуку Выдаліць гісторыю пошукавых запытаў - Уся гісторыя пошуку будзе выдалена + Выдаліць усю гісторыю пошуку. Гісторыя пошуку выдалена. Памылка Памылка сеткі From e3815e40d22ccc98fc344479ccbdec6b09f1c60b Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Wed, 15 Aug 2018 19:42:25 +0000 Subject: [PATCH 281/363] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1b01e965f..0d10dfdbc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -29,7 +29,7 @@ Скачать Следующее видео URL не поддерживается - \"Следующее\" и \"Предложенные\" видео + \"Следующее\" и \"Похожие\" видео Язык контента по умолчанию Видео и аудио Внешний вид From 5d4f2b786295682c40822f56a2ebd13865e1db29 Mon Sep 17 00:00:00 2001 From: "Haris Subandie Md. Suhaimin" Date: Wed, 15 Aug 2018 12:23:44 +0000 Subject: [PATCH 282/363] Translated using Weblate (Malay) Currently translated at 7.8% (30 of 383 strings) --- app/src/main/res/values-ms/strings.xml | 37 ++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index a6b3daec9..b228fb282 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -1,2 +1,35 @@ - - \ No newline at end of file + +Ketuk carian untuk bermula + %1$s dilihat + Diterbitkan pada %1$s + Tiada pemain strim yang ditemui. Adakah anda mahu memasang VLC? + Tiada pemain strim yang ditemui (anda boleh memasang VLC untuk bermain) + Pasang + Batal + Buka dalam pelayar + Buka dalam mod popup + Kongsi + Muat turun + Muat turun fail strim. + Carian + Tetapan + Adakah anda maksudkan: %1$s ? + Berkongsi dengan + Pilih pelayar + putaran + Guna pemain video luaran + Beberapa resolusi yang TIDAK akan mempunyai audio apabila opsyen ini diaktifkan + Gunakan pemain audio luaran + NewPipe mod popup + Langgan + Dilanggan + Saluran tanpa langganan + Tidak dapat menukar langganan + Tidak dapat mengemaskini langganan + Papar maklumat + + Utama + Langganan + Penanda halaman + + From 2076f146cf1dcf40b71388e314a37221412fc6d9 Mon Sep 17 00:00:00 2001 From: AB Date: Fri, 17 Aug 2018 11:29:29 +0000 Subject: [PATCH 283/363] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 7016286b3..084c85920 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -15,16 +15,16 @@ Оберіть переглядач обертання Зовнішній відео-програвач - Зовнішній аудіо-програвач + Зовнішній авдіо-програвач Шлях для завантаження відеозапису Вкажіть шлях для завантаження відеозаписів - Вкажіть шлях для завантаження аудіо файлів + Вкажіть шлях для завантаження авдіофайлів Шлях де зберігатимуться завантажені відеозаписи - Шлях для завантаження аудіо - Шлях де зберігатимуться завантажені аудіофайли + Шлях для завантаження авдіо + Шлях де зберігатимуться завантажені авдіофайли Автоматично відтворювати Відтворює відеозапис коли NewPipe викликано з іншого застосунку Типова роздільна здатність @@ -32,8 +32,8 @@ Застосунок Kore не знайдено. Встановити? Відтворювти у Kodi Показувати опцію відтворення відеозапису за допомогою Kodi media center - Аудіо - Типовий аудіо формат + Авдіо + Типовий авдіоформат WebM — вільний формат M4A — ліпша якість Тема @@ -45,7 +45,7 @@ Являти \"наступні\" й \"схожі\" відео URL не підтримується Переважна мова контенту - Відео та Аудіо + Відео та Авдіо Зовнішній вигляд Інше Відтворення у тловому режимі @@ -100,7 +100,7 @@ Створити теку для завантаження \'%1$s\' Відео - Аудіо + Авдіо Повторити Використовувати старий програвач К @@ -108,7 +108,7 @@ Б Почати - Пауза + Павза Відтворити Видалити Контрольна сума @@ -127,7 +127,7 @@ Стримінґового програвача не знайдено (ви можете встановити VLC для відтворення) Відкрити у віконному режимі - Певні роздільності НЕ МАТИМУТЬ звуку якщо цей параметр увімкнено + Певні роздільності НЕ матимуть звуку якщо цей параметр увімкнено NewPipe у віконному режимі Підписатися Ви підписалися @@ -197,7 +197,7 @@ Відновлююсь після помилки програвача Помилкова URL Відео-струмів не було знайдено - Не знайдено жодних аудіо-струмів + Не знайдено жодних авдіострумів Звіт користувача Без підписників @@ -231,7 +231,7 @@ Топ 50 Новинки Деталі - Налаштування аудіо + Звукові налаштування Відеопрогравач Тловий програвач From 5b8bb9f678b8312231eae7214a8bd6cf0ff113d9 Mon Sep 17 00:00:00 2001 From: DPap Date: Sun, 19 Aug 2018 12:11:17 +0000 Subject: [PATCH 284/363] Translated using Weblate (Greek) Currently translated at 79.6% (305 of 383 strings) --- app/src/main/res/values-el/strings.xml | 279 ++++++++++++++++++++++++- 1 file changed, 271 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8f383b580..9624bd77f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -2,7 +2,7 @@ %1$s προβολές Ανέβηκε στις %1$s - Δεν βρέθηκε πρόγραμμα αναπαραγωγής. Εγκατάσταση του VLC; + Δεν βρέθηκε πρόγραμμα αναπαραγωγής. Θα θέλατε να εγκαταστήσετε το VLC; Εγκατάσταση Ακύρωση Άνοιγμα στον browser @@ -18,22 +18,22 @@ Χρήση εξωτερικού audio player Διαδρομή λήψης video - Διαδρομή για αποθήκευση των video. + Διαδρομή για αποθήκευση των video Εισάγετε διαδρομή για λήψη των video Διαδρομή λήψης αρχείων ήχου Διαδρομή για αποθήκευση αρχείων ήχου - Εισάγετε διαδρομή για λήψη αρχείων ήχου. + Εισάγετε διαδρομή για λήψη αρχείων ήχου Προεπιλεγμένη ανάλυση Αναπαραγωγή με το Kodi - Η εφαρμογή Kore δεν βρέθηκε. Εγκατάσταση; + Η εφαρμογή Kore δεν βρέθηκε. Εγκατάσταση της; Εμφάνιση της επιλογής \"Αναπαραγωγή με το Kodi\" - Προβολή μιας επιλογής για αναπαραγωγή με το Kodi media center. + Προβολή μιας επιλογής για αναπαραγωγή με το Kodi media center Ήχος Προεπιλεγμένη μορφή ήχου - WebM — δωρεάν format - m4a — καλύτερη ποιότητα + WebM — δωρεάν μορφή + Μ4Α — καλύτερη ποιότητα Θέμα Σκοτεινό Φωτεινό @@ -52,7 +52,7 @@ Εικόνα προεπισκόπησης video Εικόνα προεπισκόπησης video - Εικόνα προφίλ του uploader + Εικόνα προφίλ του χρήστη Like Dislike Χρήση του Tor @@ -101,4 +101,267 @@ Ιστορικό Εμφάνιση πληροφοριών + Πατήστε στην αναζήτηση για να ξεκινήσετε + Δε βρέθηκε πρόγραμμα αναπαραγωγής ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή) + Κατέβασμα του αρχείου ροής. + Κάποιες αναλύσεις ΔΕΝ θα περιλαμβάνουν ήχο όταν επιλεχθεί αυτή η επιλογή + NewPipe σε λειτουργία αναδυόμενου παραθύρου + Έγινε διαγραφή από το κανάλι + Αδύνατη η αλλαγή της εγγραφής + Αδύνατη η ενημέρωση της εγγραφής + Κύριο + Εγγραφές + Σελιδοδείκτες + + Νέα + + Στο παρασκήνιο + Αναδυόμενο παράθυρο + Προσθήκη σε + + Αυτόματη αναπαραγωγή + Αναπαραγωγή του video όταν το NewPipe καλείται από άλλη εφαρμογή + Προεπιλεγμένη ανάλυση αναδυόμενου παραθύρου + Εμφάνιση υψηλότερων αναλύσεων + Προεπιλεγμένη μορφή video + Ενθύμιση του μεγέθους και της θέσης του αναδυόμενου παραθύρου + Ενθύμιση του τελευταίου μεγέθους και θέσης του παραθύρου + Χρήση γρήγορης μη-ακριβούς αναζήτησης + Η μη-ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια + Φόρτωση thumbnails + Απενεργοποιήστε για να σταματήσετε τη φόρτωση των thumbnail και να εξοικονομήσετε δεδομένα και χρήση μνήμης. Αλλάζοντας αυτή τη ρύθμιση θα εκκαθαρίσει τα προσωρινά αποθηκευμένα δεδομένα στη μνήμη και τον αποθηκευτικό χώρο + Εκκαθαρίστηκε η προσωρινή μνήμη εικονών + Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων + Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων + Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε + Αυτόματη πρόσθεση της επόμενης ροής στην ουρά + Αυτόματη πρόσθεση μιας σχετικής ροής όταν αναπαράγεται η προηγούμενη ροή σε μια μη-επαναλαμβανόμενη ουρά + Χειρισμοί ελέγχου με χειρονομίες + Χρήση χειρονομιών για τον έλεγχο της φωτεινότητας και της έντασης ήχου της εφαρμογής + Εμφάνιση υποδείξεων ενώ κάνετε αναζήτηση + Αποθήκευση αναζητήσεων στη συσκευή + Ιστορικό & Προσωρινή Αποθήκευση + Κρατήστε ιστορικό των video που έχετε δει + Συνέχεια όταν η εφαρμογή έρθει σε πρώτο πλάνο + Συνέχιση της αναπαραγωγής έπειτα από διακοπές (π.χ.: κλήσεις) + Εμφάνιση της βοήθειας \"πιέστε παρατεταμένα για πρόσθεση\" + Εμφάνιση της βοήθειας όταν έχει πατηθεί το κουμπί Παρασκηνίου ή Αναδυόμενου παραθύρου στη σελίδα λεπτομερειών του video + Προεπιλεγμένη χώρα περιεχομένου + Υπηρεσία + Συσκευή Αναπαραγωγής + Συμπεριφορά + Ιστορικό & Προσωρινή Αποθήκευση + Αναδυόμενο παράθυρο + Απασφαλμάτωση + Αναπαραγωγή σε αναδυόμενο παράθυρο + Προστέθηκε στη λίστα αναπαραγωγής παρασκηνίου + Προστέθηκε στη λίστα αναπαραγωγής αναδυόμενου παραθύρου + Περιεχόμενο + Εμφάνιση περιεχομένου περιορισμένης πρόσβασης + Video περιορισμένης πρόσβασης. Για να επιτρέπετε περιερχόμενο τέτοιου είδους, ενεργοποιήστε το στις Ρυθμίσεις. + Ζωντανά + Αναφορά σφαλμάτων + Κανάλια + Λίστα αναπαραγωγής + Λίστες αναπαραγωγής + Κομμάτια + Χρήστες + Απενεργοποιημένο + Ανανέωση + Εκκαθάριση + Αλλαγή μεγέθους + Βέλτιστη ανάλυση + Αναίρεση + Αναπαραγωγή όλων + Πάντα + Μόνο μία φορά + Αρχείο + + Ειδοποίηση NewPipe + Ειδοποιήσεις για την αναπαραγωγή Παρασκηνίου και Αναδυόμενου Παραθύρου + + [Άγνωστο] + + Αλλαγή προσανατολισμού + Αλλαγή σε Παρασκήνιο + Αλλαγή σε Αναδυόμενο Παράθυρο + Αλλαγή σε Κύριο + + Εισαγωγή βάσης δεδομένων + Εξαγωγή βάσης δεδομένων + Θα παρακάμψει το τρέχον ιστορικό και εγγραφές σας + Εξαγωγή ιστορικού, εγγραφών και λιστών αναπαραγωγής + Εκκαθάριση ιστορικού προβολής + Διαγράφει το ιστορικό των ροών που έχουν αναπαραχθεί + Διαγραφή ολόκληρου του ιστορικού προβολής. + Το στορικό προβολής διαγράφηκε. + Διαγραφή ιστορικού αναζητήσεων + Διαγράφει το ιστορικό αναζητήσεών σας + Διαγραφή ολόκληρου του ιστορικού αναζητήσεων. + Το ιστορικό αναζητήσεων διαγράφηκε. + Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων + Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής του URL του βιντεο + Δεν ήταν δυνατή η ανάλυση του ιστοτόπου + Δεν ήταν δυνατή η ανάλυση ολόκληρου του ιστοτόπου + Το περιεχόμενο δεν είναι διαθέσιμο + "Έχει αποκλειστεί από την GEMA" + Δεν ήταν δυνατή η ρύθμιση του μενού λήψεων + Αυτή είναι μια Ζωντανή Ροή, που δεν υποστηρίζεται ακόμα. + Δεν ήταν δυνατή η λήψη καμίας ροής + Δεν ήταν δυνατή η φόρτωση της εικόνας + Η εφαρμογή κράσαρε + Δεν ήταν δυνατή η αναπαραγωγή αυτής της ροής + Συνέβη ένα μη ανακτήσιμο σφάλμα στη συσκευή αναπαραγωγής + Ανάκτηση από σφάλμα της συσκευής αναπαραγωγής + Οι εξωτερικές συσκευές αναπαραγωγής δεν υποστηρίζουν αυτού του είδους συνδέσμους + Μη έγκυρο URL + Δε βρέθηκαν ροές video + Δε βρέθηκαν ροές ήχου + Μη έγκυρη τοποθεσία + Μη έγκυρο αρχείο ή πηγή περιεχομένου + Το αρχείο δεν υπάρχει ή δεν έχουμε επαρκή εξουσιοδότηση για να διαβάσουμε ή να γράψουμε σε αυτό + Το όνομα αρχείου δεν μπορεί να είναι κενό + Προέκυψε ένα σφάλμα: %1$s + Δεν υπάρχουν διαθέσιμες ροές για λήψη + + Λυπούμαστε, αυτό δεν έπρεπε να έχει συμβεί. + Αναφορά σφάλματος με ηλεκτρονικό ταχυδρομίο + Λυπούμαστε, συνέβησαν κάποια σφάλματα. + What:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού: + Αναφορά χρήστη + Κανένα αποτέλεσμα + Τρεις κι ο κούκος + Σύρετε για ταξινόμηση + + Προσπάθεια εκ νέου + Δεν δώθηκε άδεια εγγραφής στην εσωτερική μνήμη + Χρήση παλαιάς συσκευής αναπαραγωγής + Παλαιά συσκευή αναπαραγωγής Mediaframework + + Κ + Μ + Κανένας εγγεγραμένος χρήστης + + %s εγγεγραμένος χρήστης + %s εγγεγραμένοι χρήστες + + + Καμία προβολή + + %s προβολή + %s προβολές + + + Κανένα video + + %s video + %s videos + + + Εκκίνηση + Αναπαραγωγή + Δημιουργία + Διαγραφή ενός + Διαγραφή όλων + Checksum + Αγνόηση + Μετονομασία + + Νέα αποστολη + ΟΚ + + Όνομα αρχείου + Νήματα + Ο εξυπηρετητής δεν υποστηρίζεται + Λάθος μορφή URL ή δεν υπάρχει σύνδεση στο διαδίκτυο + Λήψη NewPipe + Παρακαλώ περιμένετε… + Αντιγράφηκε στο πρόχειρο + Παρακαλώ επιλέξτε έναν διαθέσιμο φάκελο λήψεων + Αυτή η άδεια είναι απαραίτητη για +\nτο άνοιγμα αναδυόμενων παραθύρων + 1 αντικείμενο διαγράφηκε. + + reCAPTCHA + Πρόκληση reCAPTCHA + Ζητήθηκε πρόκληση reCAPTCHA + + Επιτρεπτοί χαρακτήρες σε ονόματα αρχείων + Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή + Αντικαταστάτης χαρακτήρας + + Οι περισσότεροι ειδικοί χαρακτήρες + + Δεν υπάρχει εφαρμογή εγκατεστημένη για την αναπαραγωγή αυτού του αρχείου + + Σχετικά με το NewPipe + Περί + Άδειες Τρίτων + © %1$s από %2$s υπό %3$s + Δεν ήταν δυνατή η φόρτωση της άδειας + Περί + Συνεισφέροντες + Ελέυθερη και ελαφριά εφαρμογή αναπαραγωγής ροών στο Android. + Συνεισφέρετε + Αν έχετε ιδέες για μετάφραση, αλλαγή σχεδιασμού, εκκαθάριση ή ριζικές αλλαγές κώδικα της εφαρμογής—η βοήθεια σας είναι πάντα ευπρόσδεκτη. Όσο περισσότερη έχουμε, τόσο καλύτεροι γινόμαστε! + Δείτε το στο GitHub + Κάντε μια δωρεά + Το NewPipe αναπτύσσεται από εθελοντές που δαπανούν χρόνο για να σας προσφέρουν τη βέλτιστη δυνατή εμπειρία της εφαρμογής. Μπορείτε να συνεισφέρετε στους προγραμματιστές του NewPipe να το κάνουν ακόμα καλύτερο, προσφέροντάς τους έναν καφέ. + Προσφέρτε + Ιστότοπος + Επισκευτείτε τον ιστότοπο του NewPipe για περισσότερες πληροφορίες και νέα. + Η πολιτική ιδιωτικού απόρρητου του NewPipe + Το NewPipe παίρνει πολύ σοβαρά το ιδιωτικό σας απόρρητο. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας. +\nΗ πολιτική ιδιωτικού απόρρητου του NewPipe εξηγεί λεπτομερώς ποια δεδομένα αποστέλλονται και αποθηκεύονται όταν επιλέγετε να στείλετε μια αναφορά σφαλμάτων. + Διαβάστε την πολιτική ιδιωτικού απόρρητου + Η άδεια του NewPipe + Το NewPipe είναι copylelft ελεύθερο λογισμικό: Μπορείτε να το χρησιμοποιήσετε, να το μελετήσετε, να το μοιραστείτε και να το βελτιώσετε κατά βούληση. Ειδικότερα, μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό την άδεια GNU General Public Licence όπως αυτή εκδόθηκε από το Free Software Foundation, είτε υπό την έκδοση 3 της Άδειας είτε (προεραιτικά) υπό οποιαδήποτε μεταγενέστερη άδεια. + Διαβάστε την άδεια + + + Αναζητημένα + Έχει γίνει προβολή + Το ιστορικό έχει απενεργοποιηθεί + Το ιστορικό είναι κενό + Το ιστορικό εκκαθαρίστηκε + Το αντικείμενο διαγράφηκε + Θέλετε να σβήσετε αυτό το αντικείμενο από το ιστορικό αναζήτησης; + Θέλετε να σβήσετε αυτό το αντικείμενο από το ιστορικό προβολής; + Είστε σίγουροι ότι θέλετε να σβήσετε όλα τα αντικείμενα από το ιστορικό; + Τελευταία αναπαραγωγή + Αναπαράχθηκε περισσότερο + + Περιεχόμενο της κεντρικής σελίδας + Κενή σελίδα + Σελίδα περιπτέρου + Σελίδα εγγραφών + Σελίδα καναλιών + Επιλέξτε ένα κανάλι + Δεν έχει γίνει εγγραφή σε κάποιο κανάλι ακόμα + Επιλέξτε ένα περίπτερο + Η εξαγωγή ολοκληρώθηκε + Η εισαγωγή ολοκληρώθηκε + Μη έγκυρο αρχείο ZIP + Προσοχή: Δεν ήταν δυνατή η εισαγωγή όλων των αρχείων. + Αυτό θα παρακάμψει τις τρέχουσες ρυθμίσεις σας. + Θέλετε επίσης να εισάγετε ρυθμίσεις; + + Περίπτερο + Συσκευή αναπαραγωγής Παρασκηνίου + Συσκευή αναπαραγωγής Αναδυόμενου παραθύρου + Αφαίρεση + Λεπτομέρειες + Ρυθμίσεις ήχου + Πιέστε παρατεταμένα για να προστεθεί στην ουρά + Προσθήκη στην ουρά Παρασκηνίου + Προσθήκη στην ουρά Αναδυόμενου παραθύρου + Εκκίνηση Αναπαραγωγής εδώ + Εκκίνηση εδώ στο Παρασκήνιο + Εκκίνηση εδώ στο Αναδυόμενο Παράθυρο + + Άνοιγμα Συρταριού + Κλείσιμο Συρταριού + Κάτι θα παιχτεί εδω σύντομα ;D + + From d2dce8801bcd1c32f160268dff4ef8d118e0cbd0 Mon Sep 17 00:00:00 2001 From: DPap Date: Mon, 20 Aug 2018 16:56:40 +0000 Subject: [PATCH 285/363] Translated using Weblate (Greek) Currently translated at 91.9% (352 of 383 strings) --- app/src/main/res/values-el/strings.xml | 120 ++++++++++++++++++++----- 1 file changed, 99 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9624bd77f..8e43c66e0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -14,12 +14,12 @@ Κοινοποίηση με Επιλέξτε browser περιστροφή - Χρήση εξωτερικού video player + Χρήση εξωτερικής εφαρμογής αναπαραγωγής βίντεο Χρήση εξωτερικού audio player - Διαδρομή λήψης video - Διαδρομή για αποθήκευση των video - Εισάγετε διαδρομή για λήψη των video + Διαδρομή λήψης βίντεο + Διαδρομή για αποθήκευση των βίντεο + Εισάγετε διαδρομή για λήψη των βίντεο Διαδρομή λήψης αρχείων ήχου Διαδρομή για αποθήκευση αρχείων ήχου @@ -39,20 +39,20 @@ Φωτεινό Λήψη - Επόμενο video - Προβολή επόμενου και σχετικών video + Επόμενο βίντεο + Εμφάνιση \"επόμενου\" και \"σχετικών\" βίντεο Δεν υποστηρίζεται η διεύθυνση URL Προτιμώμενη γλώσσα περιεχομένου - Video & Ήχος + Βίντεο & Ήχος Εμφάνιση Άλλα Αναπαραγωγή στο υπόβαθρο Αναπαραγωγή Σφάλμα δικτύου - Εικόνα προεπισκόπησης video - Εικόνα προεπισκόπησης video - Εικόνα προφίλ του χρήστη + Μικρογραφία προεπισκόπισης βίντεο + Μικρογραφία προεπισκόπησης βίντεο + Μικρογραφία εικόνας προφίλ του χρήστη Like Dislike Χρήση του Tor @@ -120,16 +120,16 @@ Προσθήκη σε Αυτόματη αναπαραγωγή - Αναπαραγωγή του video όταν το NewPipe καλείται από άλλη εφαρμογή + Αναπαραγωγή του βίντεο όταν το NewPipe καλείται από άλλη εφαρμογή Προεπιλεγμένη ανάλυση αναδυόμενου παραθύρου Εμφάνιση υψηλότερων αναλύσεων - Προεπιλεγμένη μορφή video + Προεπιλεγμένη μορφή βίντεο Ενθύμιση του μεγέθους και της θέσης του αναδυόμενου παραθύρου Ενθύμιση του τελευταίου μεγέθους και θέσης του παραθύρου Χρήση γρήγορης μη-ακριβούς αναζήτησης Η μη-ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια Φόρτωση thumbnails - Απενεργοποιήστε για να σταματήσετε τη φόρτωση των thumbnail και να εξοικονομήσετε δεδομένα και χρήση μνήμης. Αλλάζοντας αυτή τη ρύθμιση θα εκκαθαρίσει τα προσωρινά αποθηκευμένα δεδομένα στη μνήμη και τον αποθηκευτικό χώρο + Απενεργοποιήστε για να σταματήσετε τη φόρτωση των μικρογραφιών και να εξοικονομήσετε δεδομένα και χρήση μνήμης. Αλλάζοντας αυτή τη ρύθμιση θα εκκαθαρίσει τα προσωρινά αποθηκευμένα δεδομένα στη μνήμη και τον αποθηκευτικό χώρο Εκκαθαρίστηκε η προσωρινή μνήμη εικονών Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων @@ -141,11 +141,11 @@ Εμφάνιση υποδείξεων ενώ κάνετε αναζήτηση Αποθήκευση αναζητήσεων στη συσκευή Ιστορικό & Προσωρινή Αποθήκευση - Κρατήστε ιστορικό των video που έχετε δει + Κρατήστε ιστορικό των βίντεο που έχετε δει Συνέχεια όταν η εφαρμογή έρθει σε πρώτο πλάνο Συνέχιση της αναπαραγωγής έπειτα από διακοπές (π.χ.: κλήσεις) Εμφάνιση της βοήθειας \"πιέστε παρατεταμένα για πρόσθεση\" - Εμφάνιση της βοήθειας όταν έχει πατηθεί το κουμπί Παρασκηνίου ή Αναδυόμενου παραθύρου στη σελίδα λεπτομερειών του video + Εμφάνιση της βοήθειας όταν έχει πατηθεί το κουμπί Παρασκηνίου ή Αναδυόμενου παραθύρου στη σελίδα λεπτομερειών του βίντεο Προεπιλεγμένη χώρα περιεχομένου Υπηρεσία Συσκευή Αναπαραγωγής @@ -158,7 +158,7 @@ Προστέθηκε στη λίστα αναπαραγωγής αναδυόμενου παραθύρου Περιεχόμενο Εμφάνιση περιεχομένου περιορισμένης πρόσβασης - Video περιορισμένης πρόσβασης. Για να επιτρέπετε περιερχόμενο τέτοιου είδους, ενεργοποιήστε το στις Ρυθμίσεις. + Βίντεο περιορισμένης πρόσβασης. Για να επιτρέπετε περιερχόμενο τέτοιου είδους, ενεργοποιήστε το στις Ρυθμίσεις. Ζωντανά Αναφορά σφαλμάτων Κανάλια @@ -200,7 +200,7 @@ Διαγραφή ολόκληρου του ιστορικού αναζητήσεων. Το ιστορικό αναζητήσεων διαγράφηκε. Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων - Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής του URL του βιντεο + Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής του URL του βίντεο Δεν ήταν δυνατή η ανάλυση του ιστοτόπου Δεν ήταν δυνατή η ανάλυση ολόκληρου του ιστοτόπου Το περιεχόμενο δεν είναι διαθέσιμο @@ -215,7 +215,7 @@ Ανάκτηση από σφάλμα της συσκευής αναπαραγωγής Οι εξωτερικές συσκευές αναπαραγωγής δεν υποστηρίζουν αυτού του είδους συνδέσμους Μη έγκυρο URL - Δε βρέθηκαν ροές video + Δε βρέθηκαν ροές βίντεο Δε βρέθηκαν ροές ήχου Μη έγκυρη τοποθεσία Μη έγκυρο αρχείο ή πηγή περιεχομένου @@ -252,10 +252,10 @@ %s προβολές - Κανένα video + Κανένα βίντεο - %s video - %s videos + %s βίντεο + %s βίντεο Εκκίνηση @@ -364,4 +364,82 @@ Κάτι θα παιχτεί εδω σύντομα ;D + Τοπ 50 + Καινούρια & δημοφιλή + Προτιμώμενη ενέργεια ανοίγματος + Προεπιλεγμένη ενέργεια για το άνοιγμα περιεχομένου — %s + + Συσκευή αναπαραγωγής βίντεο + Αναπαραγωγή Παρασκηνίου + Αναπαραγωγή σε Αναδυόμενο Παράθυρο + Πάντα ερώτηση + + Γίνεται λήψη πληροφοριών… + Γίνεται φόρτωση του ζητούμενου περιεχομένου + + Δημιουργία νέας Λίστας Αναπαραγωγής + Διαγραφή Λίστας + Μετονομασία Λίστας + Όνομα + Προσθήκη στη Λίστα + Ορισμός ως μικρογραφία λίστας αναπαραγωγής + + Προσθήκη Σελιδοδείκτη στη Λίστα + Διαγραφή Σελιδοδείκτη + + Επιθυμείτε να διαγράψετε αυτή τη λίστα αναπαραγωγής; + Η λίστα αναπαραγωγής δημιουργήθηκε + Προστέθηκε στη λίστα + Η μικρογραφία της λίστας αναπαραγωγής άλλαξε + Δεν ήταν δυνατή η διαγραφή της λίστας + + Δεν υπάρχουν υπότιτλοι + + Προσαρμογή + Γέμισμα + Μεγέθυνση + + Αυτόματοι + + Υπότιτλοι + Τροποποίηση του μεγέθους και του φόντου των υπότιτλων. Απαιτεί επανεκκίνηση της εφαρμογής + + Ενεργοποίηση του LeakCanary + Η παρακολούθηση των διαρροών μνήμης μπορεί να κάνει την εφαρμογή να μην αποκρίνεται κατά το heap dumping + + + + Εισαγωγή/Εξαγωγή + Εισαγωγή + Εισαγωγή από + Εξαγωγή σε + + Γίνεται εισαγωγή… + Γίνεται εξαγωγή… + + Εισαγωγή αρχείου + Προηγούμενη εξαγωγή + + Δεν ήταν δυνατή η εισαγωγή των εγγραφών + Δεν ήταν δυνατή η εισαγωγή των εγγραφών + + Κάντε εισαγωγή των εγγραφών σας στο YouTube κατεβάζοντας το εξής αρχείο: +\n +\n1. Πλοηγηθήτε στο: %1$s +\n2. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί +\n3. Η λήψη του αρχείου των εγγραφών σας θα ξεκινήσει + Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας: +\n +\n1. Ενεργοποιήστε τη λειτουργία Desktop στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά) +\n2. Πλοηθηθείτε στο %1$s +\n3. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί +\n4. Αντιγράψτε τον σύνδεσμο του λογαριαμού στον οποίο ανακατευθυνθήκατε. + Αυτή η διαδικασία μπορεί να χρησιμοποιήσει μεγάλο όγκο δεδομένων. +\n +\nΕπιθυμείτε να συνεχίσετε; + + Έλεγχος ταχύτητας αναπαραγωγής + Τέμπο + Τόνος + Ενέργεια όταν γίνεται αλλαγή από την εφαρμογή αναπαραγωγής βίντεο σε άλλη εφαρμογή — %s From 4cfd9c322b8d0bdd05705397205213d5e39c1a6a Mon Sep 17 00:00:00 2001 From: DPap Date: Tue, 21 Aug 2018 20:09:20 +0000 Subject: [PATCH 286/363] Translated using Weblate (Greek) Currently translated at 96.6% (370 of 383 strings) --- app/src/main/res/values-el/strings.xml | 38 ++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8e43c66e0..975ad4025 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -15,7 +15,7 @@ Επιλέξτε browser περιστροφή Χρήση εξωτερικής εφαρμογής αναπαραγωγής βίντεο - Χρήση εξωτερικού audio player + Χρήση εξωτερικής συσκευής αναπαραγωγής ήχου Διαδρομή λήψης βίντεο Διαδρομή για αποθήκευση των βίντεο @@ -42,7 +42,7 @@ Επόμενο βίντεο Εμφάνιση \"επόμενου\" και \"σχετικών\" βίντεο Δεν υποστηρίζεται η διεύθυνση URL - Προτιμώμενη γλώσσα περιεχομένου + Προεπιλεγμένη γλώσσα περιεχομένου Βίντεο & Ήχος Εμφάνιση Άλλα @@ -56,7 +56,7 @@ Like Dislike Χρήση του Tor - Αναγκάζει την κίνηση λήψης μέσω Tor για αυξημένη ανωνυμία (η αναπαραγωγή δεν υποστηρίζεται ακόμη) + (Πειραματικό) Αναγκάζει την κίνηση λήψης μέσω Tor για αυξημένη προστασία προσωπικών δεδομένων (η αναπαραγωγή δεν υποστηρίζεται ακόμη). Δεν μπόρεσε να δημιουργηθεί ο φάκελος \'%1$s\' Δημιουργήθηκε ο φάκελος \'%1$s\' @@ -136,7 +136,7 @@ Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε Αυτόματη πρόσθεση της επόμενης ροής στην ουρά Αυτόματη πρόσθεση μιας σχετικής ροής όταν αναπαράγεται η προηγούμενη ροή σε μια μη-επαναλαμβανόμενη ουρά - Χειρισμοί ελέγχου με χειρονομίες + Έλεγχος αναπαραγωγής με χειρονομίες Χρήση χειρονομιών για τον έλεγχο της φωτεινότητας και της έντασης ήχου της εφαρμογής Εμφάνιση υποδείξεων ενώ κάνετε αναζήτηση Αποθήκευση αναζητήσεων στη συσκευή @@ -407,7 +407,7 @@ Ενεργοποίηση του LeakCanary Η παρακολούθηση των διαρροών μνήμης μπορεί να κάνει την εφαρμογή να μην αποκρίνεται κατά το heap dumping - + Εισαγωγή/Εξαγωγή Εισαγωγή @@ -430,7 +430,7 @@ \n3. Η λήψη του αρχείου των εγγραφών σας θα ξεκινήσει Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας: \n -\n1. Ενεργοποιήστε τη λειτουργία Desktop στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά) +\n1. Ενεργοποιήστε τη λειτουργία \"Desktop mode\" στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά) \n2. Πλοηθηθείτε στο %1$s \n3. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί \n4. Αντιγράψτε τον σύνδεσμο του λογαριαμού στον οποίο ανακατευθυνθήκατε. @@ -441,5 +441,27 @@ Έλεγχος ταχύτητας αναπαραγωγής Τέμπο Τόνος - Ενέργεια όταν γίνεται αλλαγή από την εφαρμογή αναπαραγωγής βίντεο σε άλλη εφαρμογή — %s - + Ενέργεια κατά τη μετάβαση σε άλλη εφαρμογή — %s + Σελίδαρ Ροής + Δημοφιλή + Αναφορά σφαλμάτων εκτός κύκλου ζωής + Το όνομα χρήστη σας, soundcloud.com/όνομαχρήστη + + Αποσύνδεση (μπορεί να προκαλέσει παραμόρφωση) + Επιτάχυνση αναπαραγωγής κατά τη διάρκεια σιωπής + Βήμα + Μηδενισμός + + Προς συμμόρφωση με τον Ευρωπαϊκό Γενικό Κανονισμό για την Προστασία Δεδομένων (GDPR), σας επιστούμε την προσοχή στην πολιτική προστασίας προσωπικών δεδομένων του NewPipe. Παραλούμε, διαβάστε την προσεκτικά. +\nΘα πρέπει να την αποδεχτέιτε προκειμένου να μας αποστείλετε την αναφορά σφάλματος. + Αποδοχή + Απόρριψη + + Χωρίς όριο + Περιορισμός της ανάλυσης όταν γίνεται χρήση δεδομένων + Ελαχιστοποίηση κατά την εναλλαγή εφαρμογών + Καμία + Ελαχιστοποίηση στο παρασκήνιο + Ελαχιστοποίηση σε αναδυόμενο παράθυρο + + From 69fc571b5618fd66e4d40b5420e49b1c6e6c5a3b Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Tue, 21 Aug 2018 23:04:46 -0300 Subject: [PATCH 287/363] Add overlay to close popup --- .../newpipe/player/PopupVideoPlayer.java | 280 +++++++++++++----- app/src/main/res/layout/player_popup.xml | 8 +- .../res/layout/player_popup_close_overlay.xml | 18 ++ 3 files changed, 231 insertions(+), 75 deletions(-) create mode 100644 app/src/main/res/layout/player_popup_close_overlay.xml diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 86998e0ea..37a9e917e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -19,6 +19,8 @@ package org.schabi.newpipe.player; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.annotation.SuppressLint; import android.app.NotificationManager; import android.app.PendingIntent; @@ -34,6 +36,7 @@ import android.os.Build; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; import android.support.v4.app.NotificationCompat; import android.util.DisplayMetrics; import android.util.Log; @@ -41,7 +44,9 @@ import android.view.GestureDetector; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; +import android.view.animation.AnticipateInterpolator; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.PopupMenu; @@ -104,8 +109,12 @@ public final class PopupVideoPlayer extends Service { WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; private WindowManager windowManager; - private WindowManager.LayoutParams windowLayoutParams; - private GestureDetector gestureDetector; + private WindowManager.LayoutParams popupLayoutParams; + private GestureDetector popupGestureDetector; + + private View closeOverlayView; + private FloatingActionButton closeOverlayButton; + private WindowManager.LayoutParams closeOverlayLayoutParams; private int shutdownFlingVelocity; private int tossFlingVelocity; @@ -122,6 +131,7 @@ public final class PopupVideoPlayer extends Service { private VideoPlayerImpl playerImpl; private LockManager lockManager; + private boolean isPopupClosing = false; /*////////////////////////////////////////////////////////////////////////// // Service-Activity Binder @@ -150,7 +160,10 @@ public final class PopupVideoPlayer extends Service { public int onStartCommand(final Intent intent, int flags, int startId) { if (DEBUG) Log.d(TAG, "onStartCommand() called with: intent = [" + intent + "], flags = [" + flags + "], startId = [" + startId + "]"); - if (playerImpl.getPlayer() == null) initPopup(); + if (playerImpl.getPlayer() == null) { + initPopup(); + initPopupCloseOverlay(); + } if (!playerImpl.isPlaying()) playerImpl.getPlayer().setPlayWhenReady(true); playerImpl.handleIntent(intent); @@ -160,15 +173,16 @@ public final class PopupVideoPlayer extends Service { @Override public void onConfigurationChanged(Configuration newConfig) { + if (DEBUG) Log.d(TAG, "onConfigurationChanged() called with: newConfig = [" + newConfig + "]"); updateScreenSize(); - updatePopupSize(windowLayoutParams.width, -1); + updatePopupSize(popupLayoutParams.width, -1); checkPositionBounds(); } @Override public void onDestroy() { if (DEBUG) Log.d(TAG, "onDestroy() called"); - onClose(); + closePopup(); } @Override @@ -200,27 +214,52 @@ public final class PopupVideoPlayer extends Service { WindowManager.LayoutParams.TYPE_PHONE : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; - windowLayoutParams = new WindowManager.LayoutParams( + popupLayoutParams = new WindowManager.LayoutParams( (int) popupWidth, (int) getMinimumVideoHeight(popupWidth), layoutParamType, IDLE_WINDOW_FLAGS, PixelFormat.TRANSLUCENT); - windowLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; - windowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + popupLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; + popupLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; int centerX = (int) (screenWidth / 2f - popupWidth / 2f); int centerY = (int) (screenHeight / 2f - popupHeight / 2f); - windowLayoutParams.x = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_X, centerX) : centerX; - windowLayoutParams.y = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_Y, centerY) : centerY; + popupLayoutParams.x = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_X, centerX) : centerX; + popupLayoutParams.y = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_Y, centerY) : centerY; checkPositionBounds(); - MySimpleOnGestureListener listener = new MySimpleOnGestureListener(); - gestureDetector = new GestureDetector(this, listener); + PopupWindowGestureListener listener = new PopupWindowGestureListener(); + popupGestureDetector = new GestureDetector(this, listener); rootView.setOnTouchListener(listener); - playerImpl.getLoadingPanel().setMinimumWidth(windowLayoutParams.width); - playerImpl.getLoadingPanel().setMinimumHeight(windowLayoutParams.height); - windowManager.addView(rootView, windowLayoutParams); + + playerImpl.getLoadingPanel().setMinimumWidth(popupLayoutParams.width); + playerImpl.getLoadingPanel().setMinimumHeight(popupLayoutParams.height); + windowManager.addView(rootView, popupLayoutParams); + } + + @SuppressLint("RtlHardcoded") + private void initPopupCloseOverlay() { + if (DEBUG) Log.d(TAG, "initPopupCloseOverlay() called"); + closeOverlayView = View.inflate(this, R.layout.player_popup_close_overlay, null); + closeOverlayButton = closeOverlayView.findViewById(R.id.closeButton); + + final int layoutParamType = Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O ? + WindowManager.LayoutParams.TYPE_PHONE : + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + + closeOverlayLayoutParams = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, + layoutParamType, + flags, + PixelFormat.TRANSLUCENT); + closeOverlayLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; + closeOverlayLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + + closeOverlayButton.setVisibility(View.GONE); + windowManager.addView(closeOverlayView, closeOverlayLayoutParams); } /*////////////////////////////////////////////////////////////////////////// @@ -280,24 +319,54 @@ public final class PopupVideoPlayer extends Service { // Misc //////////////////////////////////////////////////////////////////////////*/ - public void onClose() { - if (DEBUG) Log.d(TAG, "onClose() called"); + public void closePopup() { + if (DEBUG) Log.d(TAG, "closePopup() called, isPopupClosing = " + isPopupClosing); + if (isPopupClosing) return; + isPopupClosing = true; if (playerImpl != null) { if (playerImpl.getRootView() != null) { windowManager.removeView(playerImpl.getRootView()); - playerImpl.setRootView(null); } + playerImpl.setRootView(null); playerImpl.stopActivityBinding(); playerImpl.destroy(); + playerImpl = null; } + + mBinder = null; if (lockManager != null) lockManager.releaseWifiAndCpu(); if (notificationManager != null) notificationManager.cancel(NOTIFICATION_ID); - mBinder = null; - playerImpl = null; - stopForeground(true); - stopSelf(); + animateOverlayAndFinishService(); + } + + private void animateOverlayAndFinishService() { + final int targetTranslationY = (int) (closeOverlayButton.getRootView().getHeight() - closeOverlayButton.getY()); + + closeOverlayButton.animate().setListener(null).cancel(); + closeOverlayButton.animate() + .setInterpolator(new AnticipateInterpolator()) + .translationY(targetTranslationY) + .setDuration(400) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + end(); + } + + @Override + public void onAnimationEnd(Animator animation) { + end(); + } + + private void end() { + windowManager.removeView(closeOverlayView); + + stopForeground(true); + stopSelf(); + } + }).start(); } /*////////////////////////////////////////////////////////////////////////// @@ -305,19 +374,21 @@ public final class PopupVideoPlayer extends Service { //////////////////////////////////////////////////////////////////////////*/ private void checkPositionBounds() { - if (windowLayoutParams.x > screenWidth - windowLayoutParams.width) - windowLayoutParams.x = (int) (screenWidth - windowLayoutParams.width); - if (windowLayoutParams.x < 0) windowLayoutParams.x = 0; - if (windowLayoutParams.y > screenHeight - windowLayoutParams.height) - windowLayoutParams.y = (int) (screenHeight - windowLayoutParams.height); - if (windowLayoutParams.y < 0) windowLayoutParams.y = 0; + if (DEBUG) Log.d(TAG, "checkPositionBounds() called"); + if (popupLayoutParams.x > screenWidth - popupLayoutParams.width) + popupLayoutParams.x = (int) (screenWidth - popupLayoutParams.width); + if (popupLayoutParams.x < 0) popupLayoutParams.x = 0; + + if (popupLayoutParams.y > screenHeight - popupLayoutParams.height) + popupLayoutParams.y = (int) (screenHeight - popupLayoutParams.height); + if (popupLayoutParams.y < 0) popupLayoutParams.y = 0; } private void savePositionAndSize() { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(PopupVideoPlayer.this); - sharedPreferences.edit().putInt(POPUP_SAVED_X, windowLayoutParams.x).apply(); - sharedPreferences.edit().putInt(POPUP_SAVED_Y, windowLayoutParams.y).apply(); - sharedPreferences.edit().putFloat(POPUP_SAVED_WIDTH, windowLayoutParams.width).apply(); + sharedPreferences.edit().putInt(POPUP_SAVED_X, popupLayoutParams.x).apply(); + sharedPreferences.edit().putInt(POPUP_SAVED_Y, popupLayoutParams.y).apply(); + sharedPreferences.edit().putFloat(POPUP_SAVED_WIDTH, popupLayoutParams.width).apply(); } private float getMinimumVideoHeight(float width) { @@ -352,13 +423,13 @@ public final class PopupVideoPlayer extends Service { if (height == -1) height = (int) getMinimumVideoHeight(width); else height = (int) (height > maximumHeight ? maximumHeight : height < minimumHeight ? minimumHeight : height); - windowLayoutParams.width = width; - windowLayoutParams.height = height; + popupLayoutParams.width = width; + popupLayoutParams.height = height; popupWidth = width; popupHeight = height; if (DEBUG) Log.d(TAG, "updatePopupSize() updated values: width = [" + width + "], height = [" + height + "]"); - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams); } protected void setRepeatModeRemote(final RemoteViews remoteViews, final int repeatMode) { @@ -380,10 +451,10 @@ public final class PopupVideoPlayer extends Service { } private void updateWindowFlags(final int flags) { - if (windowLayoutParams == null || windowManager == null || playerImpl == null) return; + if (popupLayoutParams == null || windowManager == null || playerImpl == null) return; - windowLayoutParams.flags = flags; - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + popupLayoutParams.flags = flags; + windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams); } /////////////////////////////////////////////////////////////////////////// @@ -393,6 +464,7 @@ public final class PopupVideoPlayer extends Service { private ImageView videoPlayPause; private View extraOptionsView; + private View closingOverlayView; @Override public void handleIntent(Intent intent) { @@ -413,12 +485,18 @@ public final class PopupVideoPlayer extends Service { fullScreenButton = rootView.findViewById(R.id.fullScreenButton); fullScreenButton.setOnClickListener(v -> onFullScreenButtonClicked()); videoPlayPause = rootView.findViewById(R.id.videoPlayPause); - videoPlayPause.setOnClickListener(this::onPlayPauseButtonPressed); extraOptionsView = rootView.findViewById(R.id.extraOptionsView); + closingOverlayView = rootView.findViewById(R.id.closingOverlay); rootView.addOnLayoutChangeListener(this); } + @Override + public void initListeners() { + super.initListeners(); + videoPlayPause.setOnClickListener(v -> onPlayPause()); + } + @Override protected void setupSubtitleView(@NonNull SubtitleView view, final float captionScale, @@ -429,10 +507,6 @@ public final class PopupVideoPlayer extends Service { view.setStyle(captionStyle); } - private void onPlayPauseButtonPressed(View ib) { - onPlayPause(); - } - @Override public void onLayoutChange(final View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { @@ -476,7 +550,7 @@ public final class PopupVideoPlayer extends Service { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } context.startActivity(intent); - onClose(); + closePopup(); } @Override @@ -634,7 +708,7 @@ public final class PopupVideoPlayer extends Service { @Override public void onPlaybackShutdown() { super.onPlaybackShutdown(); - onClose(); + closePopup(); } /*////////////////////////////////////////////////////////////////////////// @@ -660,7 +734,7 @@ public final class PopupVideoPlayer extends Service { if (DEBUG) Log.d(TAG, "onBroadcastReceived() called with: intent = [" + intent + "]"); switch (intent.getAction()) { case ACTION_CLOSE: - onClose(); + closePopup(); break; case ACTION_PLAY_PAUSE: onPlayPause(); @@ -791,12 +865,15 @@ public final class PopupVideoPlayer extends Service { public TextView getResizingIndicator() { return resizingIndicator; } + + public View getClosingOverlayView() { + return closingOverlayView; + } } - private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { + private class PopupWindowGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener { private int initialPopupX, initialPopupY; private boolean isMoving; - private boolean isResizing; @Override @@ -832,10 +909,10 @@ public final class PopupVideoPlayer extends Service { @Override public boolean onDown(MotionEvent e) { if (DEBUG) Log.d(TAG, "onDown() called with: e = [" + e + "]"); - initialPopupX = windowLayoutParams.x; - initialPopupY = windowLayoutParams.y; - popupWidth = windowLayoutParams.width; - popupHeight = windowLayoutParams.height; + initialPopupX = popupLayoutParams.x; + initialPopupY = popupLayoutParams.y; + popupWidth = popupLayoutParams.width; + popupHeight = popupLayoutParams.height; return super.onDown(e); } @@ -848,15 +925,20 @@ public final class PopupVideoPlayer extends Service { } @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - if (isResizing || playerImpl == null) return super.onScroll(e1, e2, distanceX, distanceY); + public boolean onScroll(MotionEvent initialEvent, MotionEvent movingEvent, float distanceX, float distanceY) { + if (isResizing || playerImpl == null) return super.onScroll(initialEvent, movingEvent, distanceX, distanceY); if (playerImpl.getCurrentState() != BasePlayer.STATE_BUFFERING && (!isMoving || playerImpl.getControlsRoot().getAlpha() != 1f)) playerImpl.showControls(0); + + if (!isMoving) { + animateView(closeOverlayButton, true, 200); + } + isMoving = true; - float diffX = (int) (e2.getRawX() - e1.getRawX()), posX = (int) (initialPopupX + diffX); - float diffY = (int) (e2.getRawY() - e1.getRawY()), posY = (int) (initialPopupY + diffY); + float diffX = (int) (movingEvent.getRawX() - initialEvent.getRawX()), posX = (int) (initialPopupX + diffX); + float diffY = (int) (movingEvent.getRawY() - initialEvent.getRawY()), posY = (int) (initialPopupY + diffY); if (posX > (screenWidth - popupWidth)) posX = (int) (screenWidth - popupWidth); else if (posX < 0) posX = 0; @@ -864,26 +946,49 @@ public final class PopupVideoPlayer extends Service { if (posY > (screenHeight - popupHeight)) posY = (int) (screenHeight - popupHeight); else if (posY < 0) posY = 0; - windowLayoutParams.x = (int) posX; - windowLayoutParams.y = (int) posY; + popupLayoutParams.x = (int) posX; + popupLayoutParams.y = (int) posY; + + final View closingOverlayView = playerImpl.getClosingOverlayView(); + if (isInsideClosingRadius(movingEvent)) { + if (closingOverlayView.getVisibility() == View.GONE) { + animateView(closingOverlayView, true, 250); + } + } else { + if (closingOverlayView.getVisibility() == View.VISIBLE) { + animateView(closingOverlayView, false, 0); + } + } //noinspection PointlessBooleanExpression - if (DEBUG && false) Log.d(TAG, "PopupVideoPlayer.onScroll = " + - ", e1.getRaw = [" + e1.getRawX() + ", " + e1.getRawY() + "]" + - ", e2.getRaw = [" + e2.getRawX() + ", " + e2.getRawY() + "]" + - ", distanceXy = [" + distanceX + ", " + distanceY + "]" + - ", posXy = [" + posX + ", " + posY + "]" + - ", popupWh = [" + popupWidth + " x " + popupHeight + "]"); - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + if (DEBUG && false) { + Log.d(TAG, "PopupVideoPlayer.onScroll = " + + ", e1.getRaw = [" + initialEvent.getRawX() + ", " + initialEvent.getRawY() + "]" + ", e1.getX,Y = [" + initialEvent.getX() + ", " + initialEvent.getY() + "]" + + ", e2.getRaw = [" + movingEvent.getRawX() + ", " + movingEvent.getRawY() + "]" + ", e2.getX,Y = [" + movingEvent.getX() + ", " + movingEvent.getY() + "]" + + ", distanceX,Y = [" + distanceX + ", " + distanceY + "]" + + ", posX,Y = [" + posX + ", " + posY + "]" + + ", popupW,H = [" + popupWidth + " x " + popupHeight + "]"); + } + windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams); return true; } - private void onScrollEnd() { + private void onScrollEnd(MotionEvent event) { if (DEBUG) Log.d(TAG, "onScrollEnd() called"); if (playerImpl == null) return; if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) { playerImpl.hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); } + + if (isInsideClosingRadius(event)) { + closePopup(); + } else { + animateView(playerImpl.getClosingOverlayView(), false, 0); + + if (!isPopupClosing) { + animateView(closeOverlayButton, false, 200); + } + } } @Override @@ -894,13 +999,13 @@ public final class PopupVideoPlayer extends Service { final float absVelocityX = Math.abs(velocityX); final float absVelocityY = Math.abs(velocityY); if (absVelocityX > shutdownFlingVelocity) { - onClose(); + closePopup(); return true; } else if (Math.max(absVelocityX, absVelocityY) > tossFlingVelocity) { - if (absVelocityX > tossFlingVelocity) windowLayoutParams.x = (int) velocityX; - if (absVelocityY > tossFlingVelocity) windowLayoutParams.y = (int) velocityY; + if (absVelocityX > tossFlingVelocity) popupLayoutParams.x = (int) velocityX; + if (absVelocityY > tossFlingVelocity) popupLayoutParams.y = (int) velocityY; checkPositionBounds(); - windowManager.updateViewLayout(playerImpl.getRootView(), windowLayoutParams); + windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams); return true; } return false; @@ -908,7 +1013,7 @@ public final class PopupVideoPlayer extends Service { @Override public boolean onTouch(View v, MotionEvent event) { - gestureDetector.onTouchEvent(event); + popupGestureDetector.onTouchEvent(event); if (playerImpl == null) return false; if (event.getPointerCount() == 2 && !isResizing) { if (DEBUG) Log.d(TAG, "onTouch() 2 finger pointer detected, enabling resizing."); @@ -931,7 +1036,7 @@ public final class PopupVideoPlayer extends Service { Log.d(TAG, "onTouch() ACTION_UP > v = [" + v + "], e1.getRaw = [" + event.getRawX() + ", " + event.getRawY() + "]"); if (isMoving) { isMoving = false; - onScrollEnd(); + onScrollEnd(event); } if (isResizing) { @@ -939,7 +1044,10 @@ public final class PopupVideoPlayer extends Service { animateView(playerImpl.getResizingIndicator(), false, 100, 0); playerImpl.changeState(playerImpl.getCurrentState()); } - savePositionAndSize(); + + if (!isPopupClosing) { + savePositionAndSize(); + } } v.performClick(); @@ -955,10 +1063,10 @@ public final class PopupVideoPlayer extends Service { final float diff = Math.abs(firstPointerX - secondPointerX); if (firstPointerX > secondPointerX) { // second pointer is the anchor (the leftmost pointer) - windowLayoutParams.x = (int) (event.getRawX() - diff); + popupLayoutParams.x = (int) (event.getRawX() - diff); } else { // first pointer is the anchor - windowLayoutParams.x = (int) event.getRawX(); + popupLayoutParams.x = (int) event.getRawX(); } checkPositionBounds(); @@ -969,5 +1077,29 @@ public final class PopupVideoPlayer extends Service { return true; } + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + + private int distanceFromCloseButton(MotionEvent popupMotionEvent) { + final int closeOverlayButtonX = closeOverlayButton.getLeft() + closeOverlayButton.getWidth() / 2; + final int closeOverlayButtonY = closeOverlayButton.getTop() + closeOverlayButton.getHeight() / 2; + + float fingerX = popupLayoutParams.x + popupMotionEvent.getX(); + float fingerY = popupLayoutParams.y + popupMotionEvent.getY(); + + return (int) Math.sqrt(Math.pow(closeOverlayButtonX - fingerX, 2) + Math.pow(closeOverlayButtonY - fingerY, 2)); + } + + private float getClosingRadius() { + final int buttonRadius = closeOverlayButton.getWidth() / 2; + // 20% wider than the button itself + return buttonRadius * 1.2f; + } + + private boolean isInsideClosingRadius(MotionEvent popupMotionEvent) { + return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius(); + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/player_popup.xml b/app/src/main/res/layout/player_popup.xml index 001d43bf6..7a92c6712 100644 --- a/app/src/main/res/layout/player_popup.xml +++ b/app/src/main/res/layout/player_popup.xml @@ -9,7 +9,6 @@ tools:layout_height="84dp" tools:layout_width="@dimen/popup_minimum_width"> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/player_popup_close_overlay.xml b/app/src/main/res/layout/player_popup_close_overlay.xml new file mode 100644 index 000000000..f7aceadec --- /dev/null +++ b/app/src/main/res/layout/player_popup_close_overlay.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file From a01d6eaf72fd83b3320d6c6ab23d30550ad828d8 Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Tue, 21 Aug 2018 23:04:52 -0300 Subject: [PATCH 288/363] Don't make controls visible when moving popup --- .../main/java/org/schabi/newpipe/player/PopupVideoPlayer.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 37a9e917e..2d943ea11 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -928,9 +928,6 @@ public final class PopupVideoPlayer extends Service { public boolean onScroll(MotionEvent initialEvent, MotionEvent movingEvent, float distanceX, float distanceY) { if (isResizing || playerImpl == null) return super.onScroll(initialEvent, movingEvent, distanceX, distanceY); - if (playerImpl.getCurrentState() != BasePlayer.STATE_BUFFERING - && (!isMoving || playerImpl.getControlsRoot().getAlpha() != 1f)) playerImpl.showControls(0); - if (!isMoving) { animateView(closeOverlayButton, true, 200); } From 8a29cfbb7e109a82ba48dc24deacb54729edb4c2 Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Tue, 21 Aug 2018 23:04:52 -0300 Subject: [PATCH 289/363] Remove popup shutdown gesture in favor of the new close overlay --- .../java/org/schabi/newpipe/player/PopupVideoPlayer.java | 7 +------ .../org/schabi/newpipe/player/helper/PlayerHelper.java | 4 ---- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 2d943ea11..bf1669e6e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -116,7 +116,6 @@ public final class PopupVideoPlayer extends Service { private FloatingActionButton closeOverlayButton; private WindowManager.LayoutParams closeOverlayLayoutParams; - private int shutdownFlingVelocity; private int tossFlingVelocity; private float screenWidth, screenHeight; @@ -200,7 +199,6 @@ public final class PopupVideoPlayer extends Service { View rootView = View.inflate(this, R.layout.player_popup, null); playerImpl.setup(rootView); - shutdownFlingVelocity = PlayerHelper.getShutdownFlingVelocity(this); tossFlingVelocity = PlayerHelper.getTossFlingVelocity(this); updateScreenSize(); @@ -995,10 +993,7 @@ public final class PopupVideoPlayer extends Service { final float absVelocityX = Math.abs(velocityX); final float absVelocityY = Math.abs(velocityY); - if (absVelocityX > shutdownFlingVelocity) { - closePopup(); - return true; - } else if (Math.max(absVelocityX, absVelocityY) > tossFlingVelocity) { + if (Math.max(absVelocityX, absVelocityY) > tossFlingVelocity) { if (absVelocityX > tossFlingVelocity) popupLayoutParams.x = (int) velocityX; if (absVelocityY > tossFlingVelocity) popupLayoutParams.y = (int) velocityY; checkPositionBounds(); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 275f488e3..ae187a834 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -251,10 +251,6 @@ public class PlayerHelper { return true; } - public static int getShutdownFlingVelocity(@NonNull final Context context) { - return 6000; - } - public static int getTossFlingVelocity(@NonNull final Context context) { return 2500; } From 3887231c73bb165790bc1929067743f7457834c1 Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Wed, 22 Aug 2018 23:45:25 -0300 Subject: [PATCH 290/363] Fix popup position when draggable area is resized A common case where this happens is when the soft input is visible. --- .../newpipe/player/PopupVideoPlayer.java | 60 +++++++++++++++---- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index bf1669e6e..0e7328020 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -175,7 +175,7 @@ public final class PopupVideoPlayer extends Service { if (DEBUG) Log.d(TAG, "onConfigurationChanged() called with: newConfig = [" + newConfig + "]"); updateScreenSize(); updatePopupSize(popupLayoutParams.width, -1); - checkPositionBounds(); + checkPopupPositionBounds(); } @Override @@ -225,7 +225,7 @@ public final class PopupVideoPlayer extends Service { popupLayoutParams.x = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_X, centerX) : centerX; popupLayoutParams.y = popupRememberSizeAndPos ? sharedPreferences.getInt(POPUP_SAVED_Y, centerY) : centerY; - checkPositionBounds(); + checkPopupPositionBounds(); PopupWindowGestureListener listener = new PopupWindowGestureListener(); popupGestureDetector = new GestureDetector(this, listener); @@ -371,15 +371,44 @@ public final class PopupVideoPlayer extends Service { // Utils //////////////////////////////////////////////////////////////////////////*/ - private void checkPositionBounds() { - if (DEBUG) Log.d(TAG, "checkPositionBounds() called"); - if (popupLayoutParams.x > screenWidth - popupLayoutParams.width) - popupLayoutParams.x = (int) (screenWidth - popupLayoutParams.width); - if (popupLayoutParams.x < 0) popupLayoutParams.x = 0; + /** + * @see #checkPopupPositionBounds(float, float) + */ + @SuppressWarnings("UnusedReturnValue") + private boolean checkPopupPositionBounds() { + return checkPopupPositionBounds(screenWidth, screenHeight); + } - if (popupLayoutParams.y > screenHeight - popupLayoutParams.height) - popupLayoutParams.y = (int) (screenHeight - popupLayoutParams.height); - if (popupLayoutParams.y < 0) popupLayoutParams.y = 0; + /** + * Check if {@link #popupLayoutParams}' position is within a arbitrary boundary that goes from (0,0) to (boundaryWidth,boundaryHeight). + *

+ * If it's out of these boundaries, {@link #popupLayoutParams}' position is changed and {@code true} is returned + * to represent this change. + * + * @return if the popup was out of bounds and have been moved back to it + */ + private boolean checkPopupPositionBounds(final float boundaryWidth, final float boundaryHeight) { + if (DEBUG) { + Log.d(TAG, "checkPopupPositionBounds() called with: boundaryWidth = [" + boundaryWidth + "], boundaryHeight = [" + boundaryHeight + "]"); + } + + if (popupLayoutParams.x < 0) { + popupLayoutParams.x = 0; + return true; + } else if (popupLayoutParams.x > boundaryWidth - popupLayoutParams.width) { + popupLayoutParams.x = (int) (boundaryWidth - popupLayoutParams.width); + return true; + } + + if (popupLayoutParams.y < 0) { + popupLayoutParams.y = 0; + return true; + } else if (popupLayoutParams.y > boundaryHeight - popupLayoutParams.height) { + popupLayoutParams.y = (int) (boundaryHeight - popupLayoutParams.height); + return true; + } + + return false; } private void savePositionAndSize() { @@ -907,6 +936,11 @@ public final class PopupVideoPlayer extends Service { @Override public boolean onDown(MotionEvent e) { if (DEBUG) Log.d(TAG, "onDown() called with: e = [" + e + "]"); + + // Fix popup position when the user touch it, it may have the wrong one + // because the soft input is visible (the draggable area is currently resized). + checkPopupPositionBounds(closeOverlayView.getWidth(), closeOverlayView.getHeight()); + initialPopupX = popupLayoutParams.x; initialPopupY = popupLayoutParams.y; popupWidth = popupLayoutParams.width; @@ -918,7 +952,7 @@ public final class PopupVideoPlayer extends Service { public void onLongPress(MotionEvent e) { if (DEBUG) Log.d(TAG, "onLongPress() called with: e = [" + e + "]"); updateScreenSize(); - checkPositionBounds(); + checkPopupPositionBounds(); updatePopupSize((int) screenWidth, -1); } @@ -996,7 +1030,7 @@ public final class PopupVideoPlayer extends Service { if (Math.max(absVelocityX, absVelocityY) > tossFlingVelocity) { if (absVelocityX > tossFlingVelocity) popupLayoutParams.x = (int) velocityX; if (absVelocityY > tossFlingVelocity) popupLayoutParams.y = (int) velocityY; - checkPositionBounds(); + checkPopupPositionBounds(); windowManager.updateViewLayout(playerImpl.getRootView(), popupLayoutParams); return true; } @@ -1061,7 +1095,7 @@ public final class PopupVideoPlayer extends Service { popupLayoutParams.x = (int) event.getRawX(); } - checkPositionBounds(); + checkPopupPositionBounds(); updateScreenSize(); final int width = (int) Math.min(screenWidth, diff); From 4704274b877017a72221a58f66152c07bdbe9576 Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Fri, 8 Jun 2018 16:11:59 +0200 Subject: [PATCH 291/363] New Branch --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 191332e19..c2eb069d6 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -106,6 +106,7 @@ public class MainActivity extends AppCompatActivity { item.setIcon(ServiceHelper.getIcon(s.getServiceId())); } + drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); toggle = new ActionBarDrawerToggle(this, drawer, toolbar, From 54b21c716a4025fce1f382bc0db5094e3b73813f Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Fri, 8 Jun 2018 21:07:25 +0200 Subject: [PATCH 292/363] Added drawer menu --- .../java/org/schabi/newpipe/MainActivity.java | 146 +++++++++++++++--- .../local/bookmark/BookmarkFragment.java | 6 +- .../schabi/newpipe/util/KioskTranslator.java | 15 +- .../schabi/newpipe/util/NavigationHelper.java | 16 ++ app/src/main/res/layout/drawer_layout.xml | 23 --- app/src/main/res/menu/drawer_items.xml | 14 +- 6 files changed, 163 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index c2eb069d6..d5a4bffd2 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -49,12 +49,15 @@ import android.widget.TextView; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.ServiceHelper; @@ -90,24 +93,70 @@ public class MainActivity extends AppCompatActivity { } setSupportActionBar(findViewById(R.id.toolbar)); - setupDrawer(); + try { + setupDrawer(); + } catch (Exception e) { + ErrorActivity.reportUiError(this, e); + } } - private void setupDrawer() { + private void setupDrawer() throws Exception { final Toolbar toolbar = findViewById(R.id.toolbar); drawer = findViewById(R.id.drawer_layout); drawerItems = findViewById(R.id.navigation); + //Services + for(StreamingService s : NewPipe.getServices()) { final String title = s.getServiceInfo().getName() + (ServiceHelper.isBeta(s) ? " (beta)" : ""); - final MenuItem item = drawerItems.getMenu() - .add(R.id.menu_services_group, s.getServiceId(), 0, title); - item.setIcon(ServiceHelper.getIcon(s.getServiceId())); + + drawerItems.getMenu() + .add(R.id.menu_services_group, s.getServiceId(), 0, title) + .setIcon(ServiceHelper.getIcon(s.getServiceId())); } + //Tabs - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); + int currentServiceId = ServiceHelper.getSelectedServiceId(this); + StreamingService service = NewPipe.getService(currentServiceId); + + int kioskId = 0; + + for (final String ks : service.getKioskList().getAvailableKiosks()) { + drawerItems.getMenu() + .add(R.id.menu_tabs_group, kioskId, 0, KioskTranslator.getTranslatedKioskName(ks, this)) + .setIcon(KioskTranslator.getKioskIcons(ks, this)); + kioskId ++; + } + + drawerItems.getMenu() + .add(R.id.menu_tabs_group, -1, 0, R.string.tab_subscriptions) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel)); + drawerItems.getMenu() + .add(R.id.menu_tabs_group, -2, 0, R.string.fragment_whats_new) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.rss)); + drawerItems.getMenu() + .add(R.id.menu_tabs_group, -3, 0, R.string.tab_bookmarks) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark)); + drawerItems.getMenu() + .add(R.id.menu_tabs_group, -4, 0, R.string.downloads) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.download)); + drawerItems.getMenu() + .add(R.id.menu_tabs_group, -5, 0, R.string.action_history) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.history)); + + //Settings and About + + drawerItems.getMenu() + .add(R.id.menu_options_about_group, 0, 0, R.string.settings) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.settings)); + drawerItems.getMenu() + .add(R.id.menu_options_about_group, 1, 0, R.string.tab_about) + .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.info)); + + + drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close) { @@ -140,32 +189,83 @@ public class MainActivity extends AppCompatActivity { } }); - drawerItems.setNavigationItemSelectedListener(this::changeService); - - setupDrawerFooter(); + drawerItems.setNavigationItemSelectedListener(this::drawerItemSelected); setupDrawerHeader(); } + private boolean drawerItemSelected(MenuItem item) { + switch (item.getGroupId()) { + case R.id.menu_services_group: + changeService(item); + break; + case R.id.menu_tabs_group: + try { + tabSelected(item); + } catch (Exception e) { + ErrorActivity.reportUiError(this, e); + } + break; + case R.id.menu_options_about_group: + optionsAboutSelected(item); + break; + default: + return false; + } - private boolean changeService(MenuItem item) { - if (item.getGroupId() != R.id.menu_services_group) - return false; - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(false); - ServiceHelper.setSelectedServiceId(this, item.getItemId()); - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); drawer.closeDrawers(); return true; } - private void setupDrawerFooter() { - ImageButton settings = findViewById(R.id.drawer_settings); - ImageButton downloads = findViewById(R.id.drawer_downloads); - ImageButton history = findViewById(R.id.drawer_history); + private void changeService(MenuItem item) { + drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(false); + ServiceHelper.setSelectedServiceId(this, item.getItemId()); + drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)).setChecked(true); + } - settings.setOnClickListener(view -> NavigationHelper.openSettings(this)); - downloads.setOnClickListener(view ->NavigationHelper.openDownloads(this)); - history.setOnClickListener(view -> - NavigationHelper.openStatisticFragment(getSupportFragmentManager())); + private void tabSelected(MenuItem item) throws ExtractionException { + switch(item.getItemId()) { + case -1: + NavigationHelper.openSubscriptionFragment(getSupportFragmentManager()); + break; + case -2: + NavigationHelper.openWhatsNewFragment(getSupportFragmentManager()); + break; + case -3: + NavigationHelper.openBookmarksFragment(getSupportFragmentManager()); + break; + case -4: + NavigationHelper.openDownloads(this); + break; + case -5: + NavigationHelper.openStatisticFragment(getSupportFragmentManager()); + break; + default: + int currentServiceId = ServiceHelper.getSelectedServiceId(this); + StreamingService service = NewPipe.getService(currentServiceId); + String serviceName = ""; + + int kioskId = 0; + for (final String ks : service.getKioskList().getAvailableKiosks()) { + if(kioskId == item.getItemId()) { + serviceName = ks; + } + kioskId ++; + } + + NavigationHelper.openKioskFragment(getSupportFragmentManager(), currentServiceId, serviceName); + break; + } + } + + private void optionsAboutSelected(MenuItem item) { + switch(item.getItemId()) { + case 0: + NavigationHelper.openSettings(this); + break; + case 1: + NavigationHelper.openAbout(this); + break; + } } private void setupDrawerHeader() { diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 02eabd9ef..975028d0d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -104,8 +104,10 @@ public final class BookmarkFragment public void selected(LocalItem selectedItem) { try { // Requires the parent fragment to find holder for fragment replacement - if (getParentFragment() == null) return; - final FragmentManager fragmentManager = getParentFragment().getFragmentManager(); + final FragmentManager fragmentManager = + getParentFragment() == null + ? getFragmentManager() + : getParentFragment().getFragmentManager(); if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java index 4740b82e0..392892cef 100644 --- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java +++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java @@ -24,7 +24,7 @@ import org.schabi.newpipe.R; public class KioskTranslator { public static String getTranslatedKioskName(String kioskId, Context c) { - switch(kioskId) { + switch (kioskId) { case "Trending": return c.getString(R.string.trending); case "Top 50": @@ -35,4 +35,17 @@ public class KioskTranslator { return kioskId; } } + + public static int getKioskIcons(String kioskId, Context c) { + switch(kioskId) { + case "Trending": + return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot); + case "Top 50": + return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot); + case "New & hot": + return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot); + default: + return 0; + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 85367e2a5..4556cfd7d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -36,12 +36,14 @@ import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.local.bookmark.BookmarkFragment; import org.schabi.newpipe.local.feed.FeedFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.local.history.StatisticsPlaylistFragment; import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; +import org.schabi.newpipe.local.subscription.SubscriptionFragment; import org.schabi.newpipe.local.subscription.SubscriptionsImportFragment; import org.schabi.newpipe.player.BackgroundPlayer; import org.schabi.newpipe.player.BackgroundPlayerActivity; @@ -349,6 +351,20 @@ public class NavigationHelper { .commit(); } + public static void openBookmarksFragment(FragmentManager fragmentManager) { + defaultTransaction(fragmentManager) + .replace(R.id.fragment_holder, new BookmarkFragment()) + .addToBackStack(null) + .commit(); + } + + public static void openSubscriptionFragment(FragmentManager fragmentManager) { + defaultTransaction(fragmentManager) + .replace(R.id.fragment_holder, new SubscriptionFragment()) + .addToBackStack(null) + .commit(); + } + public static void openKioskFragment(FragmentManager fragmentManager, int serviceId, String kioskId) throws ExtractionException { defaultTransaction(fragmentManager) .replace(R.id.fragment_holder, KioskFragment.getInstance(serviceId, kioskId)) diff --git a/app/src/main/res/layout/drawer_layout.xml b/app/src/main/res/layout/drawer_layout.xml index c0186a02c..2eb3abe26 100644 --- a/app/src/main/res/layout/drawer_layout.xml +++ b/app/src/main/res/layout/drawer_layout.xml @@ -89,29 +89,6 @@ android:layout_alignEnd="@id/navigation" android:layout_alignParentBottom="true"> - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/drawer_items.xml b/app/src/main/res/menu/drawer_items.xml index ae4598edd..9d5e67bb4 100644 --- a/app/src/main/res/menu/drawer_items.xml +++ b/app/src/main/res/menu/drawer_items.xml @@ -2,13 +2,11 @@

- - + + + + \ No newline at end of file From edb75c4bab85bbe914a5c22a2bef880820b752e1 Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Fri, 8 Jun 2018 21:27:50 +0200 Subject: [PATCH 293/363] Fixed crash in Subscriptions section --- .../subscription/SubscriptionFragment.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java index c194069fb..bbd1150c4 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java @@ -13,6 +13,7 @@ import android.os.Parcelable; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.FragmentManager; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; @@ -241,8 +242,15 @@ public class SubscriptionFragment extends BaseStateFragment - NavigationHelper.openWhatsNewFragment(getParentFragment().getFragmentManager())); + { + FragmentManager fragmentManager; + + if (getParentFragment() == null) + { + fragmentManager = getFragmentManager(); + } else { + fragmentManager = getParentFragment().getFragmentManager(); + } + NavigationHelper.openWhatsNewFragment(fragmentManager); + }); importExportListHeader.setOnClickListener(v -> importExportOptions.switchState()); } From 8ecbe4c8adb734c4c6875e5cc30b7b49baa24c5d Mon Sep 17 00:00:00 2001 From: Somethingweirdhere Date: Sat, 9 Jun 2018 11:33:03 +0200 Subject: [PATCH 294/363] Created a dialog for the main page content --- .../java/org/schabi/newpipe/MainActivity.java | 14 --- .../newpipe/fragments/MainFragment.java | 106 ++---------------- .../settings/ContentSettingsDialog.java | 98 ++++++++++++++++ .../settings/ContentSettingsFragment.java | 11 ++ app/src/main/res/drawable-hdpi/ic_add.png | Bin 0 -> 246 bytes app/src/main/res/drawable-mdpi/ic_add.png | Bin 0 -> 176 bytes app/src/main/res/drawable-xhdpi/ic_add.png | Bin 0 -> 220 bytes app/src/main/res/drawable-xxhdpi/ic_add.png | Bin 0 -> 371 bytes .../res/layout/dialog_contentsettings.xml | 60 ++++++++++ .../res/layout/dialog_contentsettingtab.xml | 43 +++++++ app/src/main/res/menu/main_menu.xml | 27 ----- app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/content_settings.xml | 9 +- 13 files changed, 225 insertions(+), 146 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ContentSettingsDialog.java create mode 100644 app/src/main/res/drawable-hdpi/ic_add.png create mode 100644 app/src/main/res/drawable-mdpi/ic_add.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_add.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_add.png create mode 100644 app/src/main/res/layout/dialog_contentsettings.xml create mode 100644 app/src/main/res/layout/dialog_contentsettingtab.xml delete mode 100644 app/src/main/res/menu/main_menu.xml diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index d5a4bffd2..159ba38d2 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -417,9 +417,6 @@ public class MainActivity extends AppCompatActivity { if (!(fragment instanceof SearchFragment)) { findViewById(R.id.toolbar).findViewById(R.id.toolbar_search_container).setVisibility(View.GONE); - - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main_menu, menu); } ActionBar actionBar = getSupportActionBar(); @@ -441,17 +438,6 @@ public class MainActivity extends AppCompatActivity { case android.R.id.home: onHomeButtonPressed(); return true; - case R.id.action_show_downloads: - return NavigationHelper.openDownloads(this); - case R.id.action_history: - NavigationHelper.openStatisticFragment(getSupportFragmentManager()); - return true; - case R.id.action_about: - NavigationHelper.openAbout(this); - return true; - case R.id.action_settings: - NavigationHelper.openSettings(this); - return true; default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 0e3312403..1665f7c5f 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -88,6 +88,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte int whatsHotIcon = ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.ic_hot); int bookmarkIcon = ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.ic_bookmark); + //assign proper icons to tabs + /* if (isSubscriptionsPageOnlySelected()) { tabLayout.getTabAt(0).setIcon(channelIcon); tabLayout.getTabAt(1).setIcon(bookmarkIcon); @@ -96,6 +98,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte tabLayout.getTabAt(1).setIcon(channelIcon); tabLayout.getTabAt(2).setIcon(bookmarkIcon); } + */ } /*////////////////////////////////////////////////////////////////////////// @@ -107,16 +110,6 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte super.onCreateOptionsMenu(menu, inflater); if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + "], inflater = [" + inflater + "]"); inflater.inflate(R.menu.main_fragment_menu, menu); - SubMenu kioskMenu = menu.addSubMenu(Menu.NONE, Menu.NONE, 200, getString(R.string.kiosk)); - try { - createKioskMenu(kioskMenu, inflater); - } catch (Exception e) { - ErrorActivity.reportError(activity, e, - activity.getClass(), - null, - ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, - "none", "", R.string.app_ui_crash)); - } ActionBar supportActionBar = activity.getSupportActionBar(); if (supportActionBar != null) { @@ -165,22 +158,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public Fragment getItem(int position) { - switch (position) { - case 0: - return isSubscriptionsPageOnlySelected() ? new SubscriptionFragment() : getMainPageFragment(); - case 1: - if(PreferenceManager.getDefaultSharedPreferences(getActivity()) - .getString(getString(R.string.main_page_content_key), getString(R.string.blank_page_key)) - .equals(getString(R.string.subscription_page_key))) { - return new BookmarkFragment(); - } else { - return new SubscriptionFragment(); - } - case 2: - return new BookmarkFragment(); - default: - return new BlankFragment(); - } + //return proper fragments + return new BlankFragment(); } @Override @@ -191,7 +170,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public int getCount() { - return isSubscriptionsPageOnlySelected() ? 2 : 3; + //return number of framgents + return 10; } } @@ -204,76 +184,4 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte .getString(getString(R.string.main_page_content_key), getString(R.string.blank_page_key)) .equals(getString(R.string.subscription_page_key)); } - - private Fragment getMainPageFragment() { - if (getActivity() == null) return new BlankFragment(); - - try { - SharedPreferences preferences = - PreferenceManager.getDefaultSharedPreferences(getActivity()); - final String setMainPage = preferences.getString(getString(R.string.main_page_content_key), - getString(R.string.main_page_selectd_kiosk_id)); - if (setMainPage.equals(getString(R.string.blank_page_key))) { - return new BlankFragment(); - } else if (setMainPage.equals(getString(R.string.kiosk_page_key))) { - int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), - FALLBACK_SERVICE_ID); - String kioskId = preferences.getString(getString(R.string.main_page_selectd_kiosk_id), - FALLBACK_KIOSK_ID); - KioskFragment fragment = KioskFragment.getInstance(serviceId, kioskId); - fragment.useAsFrontPage(true); - return fragment; - } else if (setMainPage.equals(getString(R.string.feed_page_key))) { - FeedFragment fragment = new FeedFragment(); - fragment.useAsFrontPage(true); - return fragment; - } else if (setMainPage.equals(getString(R.string.channel_page_key))) { - int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), - FALLBACK_SERVICE_ID); - String url = preferences.getString(getString(R.string.main_page_selected_channel_url), - FALLBACK_CHANNEL_URL); - String name = preferences.getString(getString(R.string.main_page_selected_channel_name), - FALLBACK_CHANNEL_NAME); - ChannelFragment fragment = ChannelFragment.getInstance(serviceId, - url, - name); - fragment.useAsFrontPage(true); - return fragment; - } else { - return new BlankFragment(); - } - - } catch (Exception e) { - ErrorActivity.reportError(activity, e, - activity.getClass(), - null, - ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, - "none", "", R.string.app_ui_crash)); - return new BlankFragment(); - } - } - - /*////////////////////////////////////////////////////////////////////////// - // Select Kiosk - //////////////////////////////////////////////////////////////////////////*/ - - private void createKioskMenu(Menu menu, MenuInflater menuInflater) - throws Exception { - StreamingService service = NewPipe.getService(currentServiceId); - KioskList kl = service.getKioskList(); - int i = 0; - for (final String ks : kl.getAvailableKiosks()) { - menu.add(0, KIOSK_MENU_OFFSET + i, Menu.NONE, - KioskTranslator.getTranslatedKioskName(ks, getContext())) - .setOnMenuItemClickListener(menuItem -> { - try { - NavigationHelper.openKioskFragment(getFragmentManager(), currentServiceId, ks); - } catch (Exception e) { - ErrorActivity.reportUiError((AppCompatActivity) getActivity(), e); - } - return true; - }); - i++; - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsDialog.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsDialog.java new file mode 100644 index 000000000..6cc63dd5e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsDialog.java @@ -0,0 +1,98 @@ +package org.schabi.newpipe.settings; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import org.schabi.newpipe.R; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ContentSettingsDialog extends DialogFragment { + + List usedTabs = new ArrayList<>(); + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.dialog_contentsettings, container); + } + + @Override + public void onViewCreated(@NonNull View rootView, @Nullable Bundle savedInstanceState) { + super.onViewCreated(rootView, savedInstanceState); + RecyclerView allTabs = rootView.findViewById(R.id.tabs); + allTabs.setLayoutManager(new LinearLayoutManager(getContext())); + allTabs.setAdapter(new allAdapter()); + + RecyclerView usedTabs = rootView.findViewById(R.id.usedTabs); + usedTabs.setLayoutManager(new LinearLayoutManager(getContext())); + } + + public class allAdapter extends RecyclerView.Adapter{ + + @Override + public TabViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + LayoutInflater inflater = LayoutInflater.from(getContext()); + View view = inflater.inflate(R.layout.dialog_contentsettingtab, parent, false); + return new TabViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull TabViewHolder holder, int position) { + holder.bind(position); + } + + + // Return the size of your dataset (invoked by the layout manager) + @Override + public int getItemCount() { + return 5; + } + + class TabViewHolder extends RecyclerView.ViewHolder { + + TextView text; + Button add; + + public TabViewHolder(View itemView) { + super(itemView); + + text = itemView.findViewById(R.id.tabName); + add = itemView.findViewById(R.id.buttonAddRemove); + } + + void bind(int position) { + add.setBackgroundResource(R.drawable.ic_add); + switch (position) { + case 0: + text.setText("Test"); + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + } + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 8f4e6d471..cf535ed09 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -9,6 +9,7 @@ import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.FragmentManager; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import android.util.Log; @@ -98,6 +99,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment { addPreferencesFromResource(R.xml.content_settings); + /* + final ListPreference mainPageContentPref = (ListPreference) findPreference(getString(R.string.main_page_content_key)); mainPageContentPref.setOnPreferenceChangeListener((Preference preference, Object newValueO) -> { final String newValue = newValueO.toString(); @@ -160,6 +163,14 @@ public class ContentSettingsFragment extends BasePreferenceFragment { return true; }); + */ + + Preference contentPreference = findPreference(getString(R.string.main_page_content_key)); + contentPreference.setOnPreferenceClickListener((Preference p) -> { + new ContentSettingsDialog().show(getFragmentManager(),""); + return true; + }); + Preference importDataPreference = findPreference(getString(R.string.import_data)); importDataPreference.setOnPreferenceClickListener((Preference p) -> { Intent i = new Intent(getActivity(), FilePickerActivityHelper.class) diff --git a/app/src/main/res/drawable-hdpi/ic_add.png b/app/src/main/res/drawable-hdpi/ic_add.png new file mode 100644 index 0000000000000000000000000000000000000000..85172125ec3e2d2b559c145390254b0752e832d2 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUty`CIR=C&P zpv&8*{GO5+E~F&jRIy}_ijrbH6C;a&0|Ss)QFvR&HM{mC>zb|4Fa3Izeti1vG{fT0 zLeK9M`{sVVttsDmZKYk&ekB7xp`|CKwbxB8T)X$nUXLki$12WFj}WUqEB(h!5Nwje pgZr$kcwN$2@knvzx5JD~4ImigP3~>Lt!FI>qb6h*~G7T zG^O=IgY|(+mx4}+@EaHzakWP>bn(?>IbO7!#SPNd@bEdqlcFZIpEV*qO@hn}Dnk8T U8}*yoflgrXboFyt=akR{03#GS3;+NC literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_add.png b/app/src/main/res/drawable-xhdpi/ic_add.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe4b60000a1d1be03ca0f9b3896ef50fd594f57 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=i#=T&Ln>~)y>XDU*+8TrG2P3k zQNf~Px?j*6w!7D+&+eEW7SMd3|Gn0;V5N<(RXiuDcs>vDk}NuRxhlx(Z!$yD!SxP5 z)-6{88ifLS=RU8WY4Q8KHN*Sn>u>aHo5Ihp%oku_;AijPO<%+D-|xV6^gdaSW-r_4c-5_MrfghKm-r zcXd6Or#L~8^U3v{7CS;#+`UzQyIiq*LEr`V$yI!JJPl{?J5R|D1eyQ>1`$_E_pVv> z>g}Z?$sc8wYfj#zbN}|XyUTy>FxsuiWcj6b|Epc^jL)85+R5?JvtSvE00Se70|TRg z0|N%LVY&3(+m$7kIPWd7>}9c7=J7h_`20WjF3MJ0_n+ICIqQ8kk!+_;7x(zkADi*5P~S?)1Ks-TUVrAH?GacE+nN V&6NI_U0Mhd@O1TaS?83{1OP(sld}K- literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/dialog_contentsettings.xml b/app/src/main/res/layout/dialog_contentsettings.xml new file mode 100644 index 000000000..9303cb995 --- /dev/null +++ b/app/src/main/res/layout/dialog_contentsettings.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_contentsettingtab.xml b/app/src/main/res/layout/dialog_contentsettingtab.xml new file mode 100644 index 000000000..baad35b7b --- /dev/null +++ b/app/src/main/res/layout/dialog_contentsettingtab.xml @@ -0,0 +1,43 @@ + + + + + +