Merge branch 'dev' of https://github.com/TeamNewPipe/NewPipe into feature/notifications

This commit is contained in:
Koitharu 2021-09-20 07:26:01 +03:00
commit fb0473da39
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27
84 changed files with 830 additions and 359 deletions

View File

@ -33,10 +33,10 @@ jobs:
if: github.event_name == 'pull_request'
run: git checkout -B ${{ github.head_ref }}
- name: set up JDK 8
- name: set up JDK 11
uses: actions/setup-java@v2
with:
java-version: 8
java-version: 11
distribution: "temurin"
cache: 'gradle'
@ -59,10 +59,10 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: set up JDK 8
- name: set up JDK 11
uses: actions/setup-java@v2
with:
java-version: 8
java-version: 11
distribution: "temurin"
cache: 'gradle'

View File

@ -17,8 +17,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdkVersion 19
targetSdkVersion 29
versionCode 975
versionName "0.21.9"
versionCode 976
versionName "0.21.10"
multiDexEnabled true
@ -54,6 +54,11 @@ android {
// debug build. This seems to be a Gradle bug, therefore
// TODO: update Gradle version
release {
if (System.properties.containsKey('packageSuffix')) {
applicationIdSuffix System.getProperty('packageSuffix')
resValue "string", "app_name", "NewPipe " + System.getProperty('packageSuffix')
archivesBaseName = 'NewPipe_' + System.getProperty('packageSuffix')
}
minifyEnabled true
shrinkResources false // disabled to fix F-Droid's reproducible build
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
@ -185,7 +190,7 @@ dependencies {
// name and the commit hash with the commit hash of the (pushed) commit you want to test
// This works thanks to JitPack: https://jitpack.io/
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:62b87552f51022be76804f3bed65447aeb9fce9b'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.21.10'
/** Checkstyle **/
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
@ -257,6 +262,9 @@ dependencies {
// Crash reporting
implementation "ch.acra:acra-core:5.7.0"
// Properly restarting
implementation 'com.jakewharton:process-phoenix:2.1.2'
// Reactive extensions for Java VM
implementation "io.reactivex.rxjava3:rxjava:3.0.7"
implementation "io.reactivex.rxjava3:rxandroid:3.0.0"

View File

@ -11,6 +11,8 @@ import androidx.core.app.NotificationManagerCompat;
import androidx.multidex.MultiDexApplication;
import androidx.preference.PreferenceManager;
import com.jakewharton.processphoenix.ProcessPhoenix;
import org.acra.ACRA;
import org.acra.config.ACRAConfigurationException;
import org.acra.config.CoreConfiguration;
@ -86,6 +88,12 @@ public class App extends MultiDexApplication {
app = this;
if (ProcessPhoenix.isPhoenixProcess(this)) {
Log.i(TAG, "This is a phoenix process! "
+ "Aborting initialization of App[onCreate]");
return;
}
// Initialize settings first because others inits can use its values
NewPipeSettings.initSettings(this);

View File

@ -16,7 +16,7 @@ import leakcanary.AppWatcher;
public abstract class BaseFragment extends Fragment {
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
protected final boolean DEBUG = MainActivity.DEBUG;
protected static final boolean DEBUG = MainActivity.DEBUG;
protected AppCompatActivity activity;
//These values are used for controlling fragments when they are part of the frontpage
@State

View File

@ -170,6 +170,10 @@ class AboutActivity : AppCompatActivity() {
"PrettyTime", "2012 - 2020", "Lincoln Baxter, III",
"https://github.com/ocpsoft/prettytime", StandardLicenses.APACHE2
),
SoftwareComponent(
"ProcessPhoenix", "2015", "Jake Wharton",
"https://github.com/JakeWharton/ProcessPhoenix", StandardLicenses.APACHE2
),
SoftwareComponent(
"RxAndroid", "2015", "The RxAndroid authors",
"https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2

View File

@ -121,27 +121,14 @@ class ErrorPanelHelper(
ErrorActivity.reportError(context, errorInfo)
}
errorTextView.setText(
when (errorInfo.throwable) {
is AgeRestrictedContentException -> R.string.restricted_video_no_stream
is GeographicRestrictionException -> R.string.georestricted_content
is PaidContentException -> R.string.paid_content
is PrivateContentException -> R.string.private_content
is SoundCloudGoPlusContentException -> R.string.soundcloud_go_plus_content
is YoutubeMusicPremiumContentException -> R.string.youtube_music_premium_content
is ContentNotAvailableException -> R.string.content_not_available
is ContentNotSupportedException -> R.string.content_not_supported
else -> {
// show retry button only for content which is not unavailable or unsupported
errorRetryButton.isVisible = true
if (errorInfo.throwable != null && errorInfo.throwable!!.isNetworkRelated) {
R.string.network_error
} else {
R.string.error_snackbar_message
}
}
}
)
errorTextView.setText(getExceptionDescription(errorInfo.throwable))
if (errorInfo.throwable !is ContentNotAvailableException &&
errorInfo.throwable !is ContentNotSupportedException
) {
// show retry button only for content which is not unavailable or unsupported
errorRetryButton.isVisible = true
}
}
setRootVisible()
@ -189,5 +176,27 @@ class ErrorPanelHelper(
companion object {
val TAG: String = ErrorPanelHelper::class.simpleName!!
val DEBUG: Boolean = MainActivity.DEBUG
@StringRes
public fun getExceptionDescription(throwable: Throwable?): Int {
return when (throwable) {
is AgeRestrictedContentException -> R.string.restricted_video_no_stream
is GeographicRestrictionException -> R.string.georestricted_content
is PaidContentException -> R.string.paid_content
is PrivateContentException -> R.string.private_content
is SoundCloudGoPlusContentException -> R.string.soundcloud_go_plus_content
is YoutubeMusicPremiumContentException -> R.string.youtube_music_premium_content
is ContentNotAvailableException -> R.string.content_not_available
is ContentNotSupportedException -> R.string.content_not_supported
else -> {
// show retry button only for content which is not unavailable or unsupported
if (throwable != null && throwable.isNetworkRelated) {
R.string.network_error
} else {
R.string.error_snackbar_message
}
}
}
}
}
}

View File

@ -1,5 +1,6 @@
package org.schabi.newpipe.error;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
@ -66,6 +67,7 @@ public class ReCaptchaActivity extends AppCompatActivity {
private ActivityRecaptchaBinding recaptchaBinding;
private String foundCookies = "";
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(final Bundle savedInstanceState) {
ThemeHelper.setTheme(this);

View File

@ -77,6 +77,7 @@ import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
import org.schabi.newpipe.local.dialog.PlaylistCreationDialog;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.MainPlayer.PlayerType;
import org.schabi.newpipe.player.Player;
import org.schabi.newpipe.player.event.OnKeyDownListener;
import org.schabi.newpipe.player.event.PlayerServiceExtendedEventListener;
@ -423,7 +424,7 @@ public final class VideoDetailFragment
showRelatedItems = sharedPreferences.getBoolean(key, true);
tabSettingsChanged = true;
} else if (key.equals(getString(R.string.show_description_key))) {
showComments = sharedPreferences.getBoolean(key, true);
showDescription = sharedPreferences.getBoolean(key, true);
tabSettingsChanged = true;
}
}
@ -742,20 +743,19 @@ public final class VideoDetailFragment
&& player.getPlayQueue() != null
&& player.videoPlayerSelected()
&& player.getPlayQueue().previous()) {
return true;
return true; // no code here, as previous() was used in the if
}
// That means that we are on the start of the stack,
// return false to let the MainActivity handle the onBack
if (stack.size() <= 1) {
restoreDefaultOrientation();
return false;
return false; // let MainActivity handle the onBack (e.g. to minimize the mini player)
}
// Remove top
stack.pop();
// Get stack item from the new top
assert stack.peek() != null;
setupFromHistoryItem(stack.peek());
setupFromHistoryItem(Objects.requireNonNull(stack.peek()));
return true;
}
@ -1096,8 +1096,8 @@ public final class VideoDetailFragment
toggleFullscreenIfInFullscreenMode();
final PlayQueue queue = setupPlayQueueForIntent(append);
if (append) {
NavigationHelper.enqueueOnPopupPlayer(activity, queue, false);
if (append) { //resumePlayback: false
NavigationHelper.enqueueOnPlayer(activity, queue, PlayerType.POPUP);
} else {
replaceQueueIfUserConfirms(() -> NavigationHelper
.playOnPopupPlayer(activity, queue, true));
@ -1155,7 +1155,7 @@ public final class VideoDetailFragment
final PlayQueue queue = setupPlayQueueForIntent(append);
if (append) {
NavigationHelper.enqueueOnBackgroundPlayer(activity, queue, false);
NavigationHelper.enqueueOnPlayer(activity, queue, PlayerType.AUDIO);
} else {
replaceQueueIfUserConfirms(() -> NavigationHelper
.playOnBackgroundPlayer(activity, queue, true));
@ -1181,7 +1181,7 @@ public final class VideoDetailFragment
addVideoPlayerView();
final Intent playerIntent = NavigationHelper.getPlayerIntent(requireContext(),
MainPlayer.class, queue, true, autoPlayEnabled);
MainPlayer.class, queue, autoPlayEnabled);
ContextCompat.startForegroundService(activity, playerIntent);
}
@ -1432,17 +1432,15 @@ public final class VideoDetailFragment
//////////////////////////////////////////////////////////////////////////*/
private void restoreDefaultOrientation() {
if (!isPlayerAvailable() || !player.videoPlayerSelected() || activity == null) {
return;
if (isPlayerAvailable() && player.videoPlayerSelected()) {
toggleFullscreenIfInFullscreenMode();
}
toggleFullscreenIfInFullscreenMode();
// This will show systemUI and pause the player.
// User can tap on Play button and video will be in fullscreen mode again
// Note for tablet: trying to avoid orientation changes since it's not easy
// to physically rotate the tablet every time
if (!DeviceUtils.isTablet(activity)) {
if (activity != null && !DeviceUtils.isTablet(activity)) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}

View File

@ -350,12 +350,16 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
if (context == null || context.getResources() == null || activity == null) {
return;
}
final List<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().getType() != null) {
if (PlayerHolder.getInstance().isPlayerOpen()) {
entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) {
entries.add(StreamDialogEntry.enqueue_next);
}
}
if (item.getStreamType() == StreamType.AUDIO_STREAM) {
entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,

View File

@ -45,6 +45,7 @@ import org.schabi.newpipe.fragments.list.BaseListInfoFragment;
import org.schabi.newpipe.ktx.AnimationType;
import org.schabi.newpipe.local.subscription.SubscriptionManager;
import org.schabi.newpipe.local.feed.notifications.NotificationHelper;
import org.schabi.newpipe.player.MainPlayer.PlayerType;
import org.schabi.newpipe.player.playqueue.ChannelPlayQueue;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.util.ExtractorHelper;
@ -550,12 +551,12 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
.playOnBackgroundPlayer(activity, getPlayQueue(), false));
playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnPopupPlayer(activity, getPlayQueue(), true);
NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.POPUP);
return true;
});
playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnBackgroundPlayer(activity, getPlayQueue(), true);
NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.AUDIO);
return true;
});
}

View File

@ -37,6 +37,7 @@ import org.schabi.newpipe.extractor.stream.StreamType;
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.MainPlayer.PlayerType;
import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;
@ -148,9 +149,14 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().getType() != null) {
if (PlayerHolder.getInstance().isPlayerOpen()) {
entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) {
entries.add(StreamDialogEntry.enqueue_next);
}
}
if (item.getStreamType() == StreamType.AUDIO_STREAM) {
entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
@ -347,12 +353,12 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue(), false));
playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnPopupPlayer(activity, getPlayQueue(), true);
NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.POPUP);
return true;
});
playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnBackgroundPlayer(activity, getPlayQueue(), true);
NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.AUDIO);
return true;
});
}

View File

@ -215,6 +215,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
@Override
public void onViewCreated(@NonNull final View rootView, final Bundle savedInstanceState) {
searchBinding = FragmentSearchBinding.bind(rootView);
super.onViewCreated(rootView, savedInstanceState);
showSearchOnStart();
initSearchListeners();
@ -341,7 +342,6 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
@Override
protected void initViews(final View rootView, final Bundle savedInstanceState) {
super.initViews(rootView, savedInstanceState);
searchBinding = FragmentSearchBinding.bind(rootView);
searchBinding.suggestionsList.setAdapter(suggestionListAdapter);
new ItemTouchHelper(new ItemTouchHelper.Callback() {
@ -807,18 +807,21 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(listNotification -> {
if (listNotification.isOnNext()) {
if (listNotification.getValue() != null) {
handleSuggestions(listNotification.getValue());
}
} else if (listNotification.isOnError()
&& listNotification.getError() != null
&& !ExceptionUtils.isInterruptedCaused(listNotification.getError())) {
showSnackBarError(new ErrorInfo(listNotification.getError(),
UserAction.GET_SUGGESTIONS, searchString, serviceId));
}
});
.subscribe(
listNotification -> {
if (listNotification.isOnNext()) {
if (listNotification.getValue() != null) {
handleSuggestions(listNotification.getValue());
}
} else if (listNotification.isOnError()
&& listNotification.getError() != null
&& !ExceptionUtils.isInterruptedCaused(
listNotification.getError())) {
showSnackBarError(new ErrorInfo(listNotification.getError(),
UserAction.GET_SUGGESTIONS, searchString, serviceId));
}
}, throwable -> showSnackBarError(new ErrorInfo(
throwable, UserAction.GET_SUGGESTIONS, searchString, serviceId)));
}
@Override

View File

@ -326,9 +326,14 @@ class FeedFragment : BaseStateFragment<FeedState>() {
if (context == null || context.resources == null || activity == null) return
val entries = ArrayList<StreamDialogEntry>()
if (PlayerHolder.getInstance().getType() != null) {
if (PlayerHolder.getInstance().isPlayerOpen) {
entries.add(StreamDialogEntry.enqueue)
if (PlayerHolder.getInstance().queueSize > 1) {
entries.add(StreamDialogEntry.enqueue_next)
}
}
if (item.streamType == StreamType.AUDIO_STREAM) {
entries.addAll(
listOf(

View File

@ -338,9 +338,14 @@ public class StatisticsPlaylistFragment
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().getType() != null) {
if (PlayerHolder.getInstance().isPlayerOpen()) {
entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) {
entries.add(StreamDialogEntry.enqueue_next);
}
}
if (infoItem.getStreamType() == StreamType.AUDIO_STREAM) {
entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,

View File

@ -42,6 +42,7 @@ import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.info_list.InfoItemDialog;
import org.schabi.newpipe.local.BaseLocalListFragment;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.player.MainPlayer.PlayerType;
import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
@ -493,12 +494,12 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue(), false));
playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnPopupPlayer(activity, getPlayQueue(), true);
NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.POPUP);
return true;
});
playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnBackgroundPlayer(activity, getPlayQueue(), true);
NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.AUDIO);
return true;
});
@ -752,8 +753,12 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().getType() != null) {
if (PlayerHolder.getInstance().isPlayerOpen()) {
entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) {
entries.add(StreamDialogEntry.enqueue_next);
}
}
if (infoItem.getStreamType() == StreamType.AUDIO_STREAM) {
entries.addAll(Arrays.asList(

View File

@ -226,10 +226,10 @@ public final class Player implements
public static final String REPEAT_MODE = "repeat_mode";
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 ENQUEUE = "enqueue";
public static final String ENQUEUE_NEXT = "enqueue_next";
public static final String RESUME_PLAYBACK = "resume_playback";
public static final String PLAY_WHEN_READY = "play_when_ready";
public static final String SELECT_ON_APPEND = "select_on_append";
public static final String PLAYER_TYPE = "player_type";
public static final String IS_MUTED = "is_muted";
@ -238,7 +238,7 @@ public final class Player implements
//////////////////////////////////////////////////////////////////////////*/
public static final int PLAY_PREV_ACTIVATION_LIMIT_MILLIS = 5000; // 5 seconds
public static final int PROGRESS_LOOP_INTERVAL_MILLIS = 500; // 500 millis
public static final int PROGRESS_LOOP_INTERVAL_MILLIS = 1000; // 1 second
public static final int DEFAULT_CONTROLS_DURATION = 300; // 300 millis
public static final int DEFAULT_CONTROLS_HIDE_TIME = 2000; // 2 Seconds
public static final int DPAD_CONTROLS_HIDE_TIME = 7000; // 7 Seconds
@ -608,16 +608,16 @@ public final class Player implements
setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY));
}
// Resolve append intents
if (intent.getBooleanExtra(APPEND_ONLY, false) && playQueue != null) {
final int sizeBeforeAppend = playQueue.size();
// Resolve enqueue intents
if (intent.getBooleanExtra(ENQUEUE, false) && playQueue != null) {
playQueue.append(newQueue.getStreams());
return;
if ((intent.getBooleanExtra(SELECT_ON_APPEND, false)
|| currentState == STATE_COMPLETED) && newQueue.getStreams().size() > 0) {
playQueue.setIndex(sizeBeforeAppend);
}
// Resolve enqueue next intents
} else if (intent.getBooleanExtra(ENQUEUE_NEXT, false) && playQueue != null) {
final int currentIndex = playQueue.getIndex();
playQueue.append(newQueue.getStreams());
playQueue.move(playQueue.size() - 1, currentIndex + 1);
return;
}
@ -2326,7 +2326,7 @@ public final class Player implements
Log.d(TAG, "ExoPlayer - onRepeatModeChanged() called with: "
+ "repeatMode = [" + repeatMode + "]");
}
setRepeatModeButton(((AppCompatImageButton) binding.repeatButton), repeatMode);
setRepeatModeButton(binding.repeatButton, repeatMode);
onShuffleOrRepeatModeChanged();
}
@ -3189,7 +3189,7 @@ public final class Player implements
private StreamSegmentAdapter.StreamSegmentListener getStreamSegmentListener() {
return (item, seconds) -> {
segmentAdapter.selectSegment(item);
seekTo(seconds * 1000);
seekTo(seconds * 1000L);
triggerProgressUpdate();
};
}
@ -3199,7 +3199,7 @@ public final class Player implements
final List<StreamSegment> segments = currentMetadata.getMetadata().getStreamSegments();
for (int i = 0; i < segments.size(); i++) {
if (segments.get(i).getStartTimeSeconds() * 1000 > playbackPosition) {
if (segments.get(i).getStartTimeSeconds() * 1000L > playbackPosition) {
break;
}
nearestPosition++;

View File

@ -70,6 +70,10 @@ public final class PlayerHolder {
return player != null;
}
public int getQueueSize() {
return isPlayerOpen() ? player.getPlayQueue().size() : 0;
}
public void setListener(@Nullable final PlayerServiceExtendedEventListener newListener) {
listener = newListener;

View File

@ -45,6 +45,8 @@ 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.MainPlayer;
import org.schabi.newpipe.player.MainPlayer.PlayerType;
import org.schabi.newpipe.player.NotificationUtil;
import org.schabi.newpipe.player.PlayQueueActivity;
import org.schabi.newpipe.player.Player;
import org.schabi.newpipe.player.helper.PlayerHelper;
@ -58,9 +60,12 @@ import java.util.ArrayList;
import static org.schabi.newpipe.util.external_communication.ShareUtils.installApp;
import com.jakewharton.processphoenix.ProcessPhoenix;
public final class NavigationHelper {
public static final String MAIN_FRAGMENT_TAG = "main_fragment_tag";
public static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag";
private static final String TAG = NotificationUtil.class.getSimpleName();
private NavigationHelper() {
}
@ -68,12 +73,11 @@ public final class NavigationHelper {
/*//////////////////////////////////////////////////////////////////////////
// Players
//////////////////////////////////////////////////////////////////////////*/
/* INTENT */
@NonNull
public static <T> Intent getPlayerIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue,
final boolean resumePlayback) {
@Nullable final PlayQueue playQueue) {
final Intent intent = new Intent(context, targetClazz);
if (playQueue != null) {
@ -82,7 +86,6 @@ public final class NavigationHelper {
intent.putExtra(Player.PLAY_QUEUE_KEY, cacheKey);
}
}
intent.putExtra(Player.RESUME_PLAYBACK, resumePlayback);
intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.VIDEO.ordinal());
return intent;
@ -92,23 +95,28 @@ public final class NavigationHelper {
public static <T> Intent getPlayerIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue,
final boolean resumePlayback,
final boolean playWhenReady) {
return getPlayerIntent(context, targetClazz, playQueue, resumePlayback)
return getPlayerIntent(context, targetClazz, playQueue)
.putExtra(Player.PLAY_WHEN_READY, playWhenReady);
}
@NonNull
public static <T> Intent getPlayerEnqueueIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue,
final boolean selectOnAppend,
final boolean resumePlayback) {
return getPlayerIntent(context, targetClazz, playQueue, resumePlayback)
.putExtra(Player.APPEND_ONLY, true)
.putExtra(Player.SELECT_ON_APPEND, selectOnAppend);
@Nullable final PlayQueue playQueue) {
return getPlayerIntent(context, targetClazz, playQueue)
.putExtra(Player.ENQUEUE, true);
}
@NonNull
public static <T> Intent getPlayerEnqueueNextIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue) {
return getPlayerIntent(context, targetClazz, playQueue)
.putExtra(Player.ENQUEUE_NEXT, true);
}
/* PLAY */
public static void playOnMainPlayer(final AppCompatActivity activity,
@NonNull final PlayQueue playQueue) {
final PlayQueueItem item = playQueue.getItem();
@ -154,56 +162,38 @@ public final class NavigationHelper {
ContextCompat.startForegroundService(context, intent);
}
public static void enqueueOnVideoPlayer(final Context context, final PlayQueue queue,
final boolean resumePlayback) {
enqueueOnVideoPlayer(context, queue, false, resumePlayback);
}
public static void enqueueOnVideoPlayer(final Context context, final PlayQueue queue,
final boolean selectOnAppend,
final boolean resumePlayback) {
/* ENQUEUE */
public static void enqueueOnPlayer(final Context context,
final PlayQueue queue,
final PlayerType playerType) {
Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerEnqueueIntent(
context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
final Intent intent = getPlayerEnqueueIntent(context, MainPlayer.class, queue);
intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.VIDEO.ordinal());
intent.putExtra(Player.PLAYER_TYPE, playerType.ordinal());
ContextCompat.startForegroundService(context, intent);
}
public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue,
final boolean resumePlayback) {
enqueueOnPopupPlayer(context, queue, false, resumePlayback);
}
public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue,
final boolean selectOnAppend,
final boolean resumePlayback) {
if (!PermissionHelper.isPopupEnabled(context)) {
PermissionHelper.showPopupEnablementToast(context);
return;
public static void enqueueOnPlayer(final Context context, final PlayQueue queue) {
PlayerType playerType = PlayerHolder.getInstance().getType();
if (!PlayerHolder.getInstance().isPlayerOpen()) {
Log.e(TAG, "Enqueueing but no player is open; defaulting to background player");
playerType = MainPlayer.PlayerType.AUDIO;
}
Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerEnqueueIntent(
context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.POPUP.ordinal());
ContextCompat.startForegroundService(context, intent);
enqueueOnPlayer(context, queue, playerType);
}
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue,
final boolean resumePlayback) {
enqueueOnBackgroundPlayer(context, queue, false, resumePlayback);
}
/* ENQUEUE NEXT */
public static void enqueueNextOnPlayer(final Context context, final PlayQueue queue) {
PlayerType playerType = PlayerHolder.getInstance().getType();
if (!PlayerHolder.getInstance().isPlayerOpen()) {
Log.e(TAG, "Enqueueing next but no player is open; defaulting to background player");
playerType = MainPlayer.PlayerType.AUDIO;
}
Toast.makeText(context, R.string.enqueued_next, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerEnqueueNextIntent(context, MainPlayer.class, queue);
public static void enqueueOnBackgroundPlayer(final Context context,
final PlayQueue queue,
final boolean selectOnAppend,
final boolean resumePlayback) {
Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerEnqueueIntent(
context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.AUDIO.ordinal());
intent.putExtra(Player.PLAYER_TYPE, playerType.ordinal());
ContextCompat.startForegroundService(context, intent);
}
@ -346,7 +336,7 @@ public final class NavigationHelper {
final boolean autoPlay;
@Nullable final MainPlayer.PlayerType playerType = PlayerHolder.getInstance().getType();
if (playerType == null) {
if (!PlayerHolder.getInstance().isPlayerOpen()) {
// no player open
autoPlay = PlayerHelper.isAutoplayAllowedByUser(context);
} else if (switchingPlayers) {
@ -360,7 +350,7 @@ public final class NavigationHelper {
autoPlay = false;
}
final RunnableWithVideoDetailFragment onVideoDetailFragmentReady = (detailFragment) -> {
final RunnableWithVideoDetailFragment onVideoDetailFragmentReady = detailFragment -> {
expandMainPlayer(detailFragment.requireActivity());
detailFragment.setAutoPlay(autoPlay);
if (switchingPlayers) {
@ -613,8 +603,7 @@ public final class NavigationHelper {
*/
public static void restartApp(final Activity activity) {
NewPipeDatabase.close();
activity.finishAffinity();
final Intent intent = new Intent(activity, MainActivity.class);
activity.startActivity(intent);
ProcessPhoenix.triggerRebirth(activity.getApplicationContext());
}
}

View File

@ -119,7 +119,7 @@ public final class PermissionHelper {
public static boolean isPopupEnabled(final Context context) {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M
|| PermissionHelper.checkSystemAlertWindowPermission(context);
|| checkSystemAlertWindowPermission(context);
}
public static void showPopupEnablementToast(final Context context) {

View File

@ -12,8 +12,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
import org.schabi.newpipe.local.dialog.PlaylistCreationDialog;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
import org.schabi.newpipe.util.external_communication.KoreUtils;
import org.schabi.newpipe.util.external_communication.ShareUtils;
@ -25,8 +23,6 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.schedulers.Schedulers;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
import static org.schabi.newpipe.player.MainPlayer.PlayerType.AUDIO;
import static org.schabi.newpipe.player.MainPlayer.PlayerType.POPUP;
public enum StreamDialogEntry {
//////////////////////////////////////
@ -43,7 +39,7 @@ public enum StreamDialogEntry {
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
NewPipeDatabase.getInstance(fragment.getContext()).streamDAO()
NewPipeDatabase.getInstance(fragment.requireContext()).streamDAO()
.setUploaderUrl(serviceId, url, result.getUploaderUrl())
.subscribeOn(Schedulers.io()).subscribe();
openChannelFragment(fragment, item, result.getUploaderUrl());
@ -64,18 +60,11 @@ public enum StreamDialogEntry {
* Info: Add this entry within showStreamDialog.
*/
enqueue(R.string.enqueue_stream, (fragment, item) -> {
final MainPlayer.PlayerType type = PlayerHolder.getInstance().getType();
NavigationHelper.enqueueOnPlayer(fragment.getContext(), new SinglePlayQueue(item));
}),
if (type == AUDIO) {
NavigationHelper.enqueueOnBackgroundPlayer(fragment.getContext(),
new SinglePlayQueue(item), false);
} else if (type == POPUP) {
NavigationHelper.enqueueOnPopupPlayer(fragment.getContext(),
new SinglePlayQueue(item), false);
} else /* type == VIDEO */ {
NavigationHelper.enqueueOnVideoPlayer(fragment.getContext(),
new SinglePlayQueue(item), false);
}
enqueue_next(R.string.enqueue_next_stream, (fragment, item) -> {
NavigationHelper.enqueueNextOnPlayer(fragment.getContext(), new SinglePlayQueue(item));
}),
start_here_on_background(R.string.start_here_on_background, (fragment, item) ->
@ -108,16 +97,16 @@ public enum StreamDialogEntry {
try {
NavigationHelper.playWithKore(fragment.requireContext(), videoUrl);
} catch (final Exception e) {
KoreUtils.showInstallKoreDialog(fragment.getActivity());
KoreUtils.showInstallKoreDialog(fragment.requireActivity());
}
}),
share(R.string.share, (fragment, item) ->
ShareUtils.shareText(fragment.getContext(), item.getName(), item.getUrl(),
ShareUtils.shareText(fragment.requireContext(), item.getName(), item.getUrl(),
item.getThumbnailUrl())),
open_in_browser(R.string.open_in_browser, (fragment, item) ->
ShareUtils.openUrlInBrowser(fragment.getContext(), item.getUrl())),
ShareUtils.openUrlInBrowser(fragment.requireContext(), item.getUrl())),
mark_as_watched(R.string.mark_as_watched, (fragment, item) -> {

View File

@ -1,9 +1,14 @@
package org.schabi.newpipe.util.external_communication;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.error.ErrorPanelHelper;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@ -24,6 +29,9 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
public final class InternalUrlsHandler {
private static final String TAG = InternalUrlsHandler.class.getSimpleName();
private static final boolean DEBUG = MainActivity.DEBUG;
private static final Pattern AMPERSAND_TIMESTAMP_PATTERN = Pattern.compile("(.*)&t=(\\d+)");
private static final Pattern HASHTAG_TIMESTAMP_PATTERN =
Pattern.compile("(.*)#timestamp=(\\d+)");
@ -93,7 +101,12 @@ public final class InternalUrlsHandler {
return false;
}
final String matchedUrl = matcher.group(1);
final int seconds = Integer.parseInt(matcher.group(2));
final int seconds;
if (matcher.group(2) == null) {
seconds = -1;
} else {
seconds = Integer.parseInt(matcher.group(2));
}
final StreamingService service;
final StreamingService.LinkType linkType;
@ -146,8 +159,18 @@ public final class InternalUrlsHandler {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(info -> {
final PlayQueue playQueue
= new SinglePlayQueue(info, seconds * 1000);
= new SinglePlayQueue(info, seconds * 1000L);
NavigationHelper.playOnPopupPlayer(context, playQueue, false);
}, throwable -> {
if (DEBUG) {
Log.e(TAG, "Could not play on popup: " + url, throwable);
}
new AlertDialog.Builder(context)
.setTitle(R.string.player_stream_failure)
.setMessage(
ErrorPanelHelper.Companion.getExceptionDescription(throwable))
.setPositiveButton(R.string.ok, (v, b) -> { })
.show();
}));
return true;
}

View File

@ -166,7 +166,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center"
android:minWidth="0dp"
android:padding="@dimen/player_main_buttons_padding"
@ -180,7 +180,7 @@
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:paddingStart="3dp"
@ -199,7 +199,7 @@
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:paddingStart="3dp"
@ -281,7 +281,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/play_with_kodi_title"
android:focusable="true"
@ -296,7 +296,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/open_in_browser"
android:focusable="true"
@ -311,7 +311,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/share"
android:focusable="true"
@ -325,7 +325,7 @@
android:id="@+id/switchMute"
android:layout_width="wrap_content"
android:layout_height="37dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/mute"
android:focusable="true"
@ -339,7 +339,7 @@
android:id="@+id/fullScreenButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/player_main_buttons_padding"
@ -447,7 +447,7 @@
android:id="@+id/playbackLiveSync"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center"
android:paddingLeft="4dp"
android:paddingRight="4dp"
@ -462,7 +462,7 @@
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="4dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:nextFocusUp="@id/playbackSeekBar"
@ -566,7 +566,7 @@
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="40dp"
android:background="?android:selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/close"
android:focusable="true"
@ -584,7 +584,7 @@
android:layout_centerVertical="true"
android:layout_marginStart="40dp"
android:layout_marginLeft="40dp"
android:background="?android:selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="10dp"
@ -599,7 +599,7 @@
android:layout_height="50dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/repeatButton"
android:background="?android:selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="10dp"
@ -614,8 +614,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/itemsListClose"
android:layout_toRightOf="@id/shuffleButton"
android:layout_toStartOf="@id/itemsListClose"
android:layout_toEndOf="@id/shuffleButton"
android:gravity="center"
android:textColor="@android:color/white" />
</RelativeLayout>

View File

@ -168,7 +168,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center"
android:minWidth="0dp"
android:padding="@dimen/player_main_buttons_padding"
@ -182,7 +182,7 @@
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:paddingStart="3dp"
@ -200,7 +200,7 @@
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:paddingStart="6dp"
@ -280,7 +280,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/play_with_kodi_title"
android:focusable="true"
@ -295,7 +295,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/open_in_browser"
android:focusable="true"
@ -310,7 +310,7 @@
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/share"
android:focusable="true"
@ -324,7 +324,7 @@
android:id="@+id/switchMute"
android:layout_width="wrap_content"
android:layout_height="37dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/mute"
android:focusable="true"
@ -338,7 +338,7 @@
android:id="@+id/fullScreenButton"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/player_main_buttons_padding"
@ -445,7 +445,7 @@
android:id="@+id/playbackLiveSync"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center"
android:paddingLeft="4dp"
android:paddingRight="4dp"
@ -460,7 +460,7 @@
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="4dp"
android:background="?attr/selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/player_main_buttons_padding"
@ -562,7 +562,7 @@
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="40dp"
android:background="?android:selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/close"
android:focusable="true"
@ -580,7 +580,7 @@
android:layout_centerVertical="true"
android:layout_marginStart="40dp"
android:layout_marginLeft="40dp"
android:background="?android:selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="10dp"
@ -595,7 +595,7 @@
android:layout_height="50dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/repeatButton"
android:background="?android:selectableItemBackground"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:padding="10dp"
@ -611,8 +611,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/shuffleButton"
android:layout_toLeftOf="@id/itemsListClose"
android:layout_toEndOf="@id/shuffleButton"
android:layout_toStartOf="@id/itemsListClose"
android:textColor="@android:color/white" />
</RelativeLayout>
@ -722,7 +722,7 @@
android:layout_height="70dp"
android:layout_centerInParent="true"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_brightness" />
tools:src="@drawable/ic_brightness_high" />
</RelativeLayout>
</RelativeLayout>

View File

@ -697,4 +697,22 @@
<string name="remote_search_suggestions">اقتراحات البحث عن بعد</string>
<string name="local_search_suggestions">اقتراحات البحث المحلية</string>
<string name="main_page_content_swipe_remove">اسحب العناصر لإزالتها</string>
<plurals name="deleted_downloads_toast">
<item quantity="zero">اكتمل %1$s التنزيل</item>
<item quantity="one">اكتمل %1$s التنزيل</item>
<item quantity="two">اكتمل %1$s التنزيل</item>
<item quantity="few">اكتملت %1$s التنزيلات</item>
<item quantity="many">اكتملت %1$s التنزيلات</item>
<item quantity="other">اكتملت %1$s التنزيلات</item>
</plurals>
<plurals name="download_finished_notification">
<item quantity="zero">اكتمل التنزيل</item>
<item quantity="one">اكتمل التنزيل</item>
<item quantity="two">اكتمل التنزيل</item>
<item quantity="few">اكتمل تنزيل%s</item>
<item quantity="many">اكتملت التنزيلات%s</item>
<item quantity="other">اكتملت التنزيلات%s</item>
</plurals>
<string name="start_main_player_fullscreen_summary">لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة</string>
<string name="start_main_player_fullscreen_title">بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة</string>
</resources>

View File

@ -647,14 +647,14 @@
<string name="remote_search_suggestions">远程搜索建议</string>
<string name="local_search_suggestions">本地搜索建议</string>
<plurals name="deleted_downloads_toast">
<item quantity="one">删除了 %1$s 个下载</item>
<item quantity="other"/>
<item quantity="other">删除了 %1$s 个下载</item>
</plurals>
<plurals name="download_finished_notification">
<item quantity="one">完成了 %s 个下载</item>
<item quantity="other"/>
<item quantity="other">完成了 %s 个下载</item>
</plurals>
<string name="main_page_content_swipe_remove">滑动项目以删除它们</string>
<string name="start_main_player_fullscreen_summary">若自动旋转被锁定,不在以小窗播放器形式中播放视频,而直接切换到全屏模式。仍可以通过退出全屏以切换至小窗播放器</string>
<string name="start_main_player_fullscreen_summary">若自动旋转被锁定,不在以小窗播放器形式中播放视频,而直接切换到全屏模式。仍可以通过退出全屏以切换至小窗播放器</string>
<string name="start_main_player_fullscreen_title">以全屏启动主播放器</string>
<string name="enqueued_next">已将下个视频加入队列</string>
<string name="enqueue_next_stream">将下一个视频加入队列</string>
</resources>

View File

@ -469,7 +469,7 @@
\n2. بچۆرەژوورەوە گەر داوای‌ کرد
\n3. كرته‌ بكه‌ له‌ \"All data included\"، پاشان كرته‌ بكه‌ له‌ \"Deselect all\" ، پاشان ته‌نیا \"subscriptions\" هه‌ڵبژێره‌ پاشان كرته‌ له‌ \"OK\" بكه‌
\n4. كرته‌ بكه‌ له‌ \"Next step\" و دواتر له‌ \"Create export\"
\n5. كرته‌ بكه‌ له‌ \"Download\" پاشان
\n5. كرته‌ بكه‌ له‌ \"Download\" دوای دەرکەوتنی
\n6. له‌ فایلی دابه‌زێنراودا فایلی .json ئێكستراكت بكه‌ و لێره‌دا هاورده‌ی بكه‌.</string>
<string name="systems_language">به‌پێی سیستەم</string>
<string name="network_error">کێشە لە هێڵەکەتدا هەیە</string>
@ -654,4 +654,16 @@
<string name="remote_search_suggestions">پێشنیازکراوەکانی گەڕانی ڕیمۆت</string>
<string name="local_search_suggestions">پێشنیازکراوەکانی گەڕانی نێوخۆیی</string>
<string name="mark_as_watched">دیارکردن وەک بینراو</string>
<string name="show_hold_to_append_summary">پیشاندانی ڕێنمایی لەکاتی کرتە کردن لە پاشبنەما یاخود دوگمەی پەنجەرە لە \"وردەکارییەکان\" ی ڤیدیۆکە.</string>
<plurals name="deleted_downloads_toast">
<item quantity="one">%1$s دابەزێنراو سڕایەوە</item>
<item quantity="other">%1$s دابەزێنراو سڕانەوە</item>
</plurals>
<plurals name="download_finished_notification">
<item quantity="one">دابەزاندن تەواوبوو</item>
<item quantity="other">%s دابەزاندن تەواوبوون</item>
</plurals>
<string name="main_page_content_swipe_remove">لادانی بابەتەکان بە سواندنیان</string>
<string name="start_main_player_fullscreen_summary">لە حاڵەتێکدا کە لاربوونەوە ناکارا کرابوو ، ئەوا لەجیاتی لێدانی ڤیدیۆکان لە لێدەرێکی بچووکدا ، ڕاستەوخۆ ڤیدیۆکان لە دۆخی پڕ بە ڕوونمادا لێبدرێن. دەتوانیت بە دەرچوونت لەسەر ڤیدیۆکە بەردەوام بیت لەسەر لێدەرێکی بچووک</string>
<string name="start_main_player_fullscreen_title">دەستپێکردنی لێدەری سەرەکی لە ڕوونماپڕ</string>
</resources>

View File

@ -603,7 +603,7 @@
<string name="crash_the_app">Zbořit aplikaci</string>
<string name="download_has_started">Stahování bylo zahájeno</string>
<string name="select_night_theme_toast">Můžete si zvolit svůj oblíbený motiv níže</string>
<string name="night_theme_summary">Zvolte si svůj oblíbený noční motiv -- %s</string>
<string name="night_theme_summary">Zvolte si svůj oblíbený noční motiv - %s</string>
<string name="auto_device_theme_title">Automatický (motiv zařízení)</string>
<string name="radio">Radio</string>
<string name="featured">Představujeme</string>

View File

@ -665,6 +665,8 @@
<item quantity="other">%s Downloads abgeschlossen</item>
</plurals>
<string name="main_page_content_swipe_remove">Wische über Elemente, um sie zu entfernen</string>
<string name="start_main_player_fullscreen_summary">Videos nicht im Miniplayer starten, sondern direkt in den Vollbildmodus schalten, wenn die automatische Drehung gesperrt ist. Du kannst immer noch auf den Miniplayer zugreifen, wenn du den Vollbildmodus verlässt.</string>
<string name="start_main_player_fullscreen_summary">Videos nicht im Miniplayer starten, sondern direkt in den Vollbildmodus schalten, wenn die automatische Drehung gesperrt ist. Du kannst immer noch auf den Miniplayer zugreifen, wenn du den Vollbildmodus verlässt</string>
<string name="start_main_player_fullscreen_title">Hauptplayer im Vollbildmodus starten</string>
<string name="enqueued_next">Als Nächstes eingereiht</string>
<string name="enqueue_next_stream">Als Nächstes in Wiedergabe einreihen</string>
</resources>

View File

@ -303,7 +303,8 @@
\n3. Πατήστε το «Περιλαμβάνονται όλα τα δεδομένα του YouTube», στη συνέχεια «Κατάργηση επιλογής όλων» και επιλέξτε μόνο το «συνδρομές» και «ΟΚ».
\n4. Πατήστε «Επόμενο βήμα» και μετά «Δημιουργία εξαγωγής».
\n5. Πατήστε «Λήψη» όταν εμφανιστεί.
\n6. Από το ληφθέν αρχείο zip εξάγετε το αρχείο «συνδρομές.json» και εισάγετε το εδώ.</string>
\n6. Πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο zip.
\n7. Αν η εισαγωγή από το zip αποτύχει, εξάγετε το αρχείο .csv (συνήθως βρίσκεται στο \"YouTube και YouTube Music/subscriptions/subscriptions.csv\"), πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο csv.</string>
<string name="import_soundcloud_instructions">Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας:
\n
\n1. Ενεργοποιήστε τη λειτουργία «Desktop mode» στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά)
@ -664,4 +665,8 @@
<item quantity="other">%s λήψεις ολοκληρώθηκαν</item>
</plurals>
<string name="main_page_content_swipe_remove">Απομάκρυνση αντικειμένων με σύρσιμο</string>
<string name="start_main_player_fullscreen_summary">Εκκίνηση των βίντεο σε πλήρη οθόνη και όχι σε αναδυόμενο παράθυρο, αν η αυτόματη περιστροφή της οθόνης είναι ανενεργή. Μπορείτε να ενεργοποιήσετε το αναδυόμενο παράθυρο βγαίνοντας από την πλήρη οθόνη.</string>
<string name="start_main_player_fullscreen_title">Εκκίνηση κύριου αναπαραγωγού σε πλήρη οθόνη</string>
<string name="enqueued_next">Προστέθηκε το επόμενο στην ουρά</string>
<string name="enqueue_next_stream">Προσθήκη επόμενου στην ουρά</string>
</resources>

View File

@ -668,4 +668,6 @@
<item quantity="other">%s descargas finalizadas</item>
</plurals>
<string name="main_page_content_swipe_remove">Desliza los elementos para removerlos</string>
<string name="start_main_player_fullscreen_summary">Si la rotación automática está bloqueada, no inicie los videos en el mini reproductor, sino pase directamente a modo de pantalla completa. Aún podrá acceder al mini reproductor al salir del modo pantalla completa</string>
<string name="start_main_player_fullscreen_title">Iniciar reproductor principal en pantalla completa</string>
</resources>

View File

@ -665,4 +665,6 @@
<item quantity="one">Allalaadimine lõppes</item>
<item quantity="other">%s allalaadimist lõppesid</item>
</plurals>
<string name="start_main_player_fullscreen_summary">Kui ekraani pööramine on lukustatud, siis videote esitamisel ära käivita väikest vaadet, vaid käivita kohe täisekraanivaade. Viimasest väljumisel näed väikest esitusvaadet</string>
<string name="start_main_player_fullscreen_title">Käivita meediamängija täisekraanivaates</string>
</resources>

View File

@ -291,8 +291,9 @@
\n2. Hasi saioa eskatzen zaizunean
\n3. Hautatu \"Datu guztiak barne\", gero \"Kendu hautapen guztiak\", eta hautatu \"harpidetzak\" soilik eta egin klik \"Ados\" botoian
\n4. Egin klik \"Hurrengo pausua\"-n eta \"Sortu esportazioa\"
\n5. Egin klik \"Deskargatu\" botoian agertzen denean eta
\n6. Erauzi .json fitxategia deskargatutako takeout zip-etik (normalean \"Youtube eta Youtube Music/harpidetzak/harpidetzak.json\") eta inportatu ezazu hemen.</string>
\n5. Egin klik \"Deskargatu\" botoian agertzen denean
\n6. Egin klik INPORTATU FITXATEGIA botoian eta hautatu deskargatutako zip fitxategia
\n6. [Zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean \"Youtube eta Youtube Music/harpidetzak/harpidetzak.csv\"), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia</string>
<string name="import_soundcloud_instructions">Inportatu SoundCloud profila URL-a edo zure ID-a idatziz:
\n
\n1. Gaitu \"mahaigain modua\" web nabigatzailean (gunea ez dabil mugikorretan)
@ -663,4 +664,7 @@
<string name="remote_search_suggestions">Urruneko bilaketaren iradokizunak</string>
<string name="local_search_suggestions">Tokiko bilaketa-iradokizunak</string>
<string name="mark_as_watched">Ikusi gisa markatu</string>
<string name="main_page_content_swipe_remove">Lerratu elementuak aldetara ezabatzeko</string>
<string name="start_main_player_fullscreen_summary">Ez hasi bideoak mini erreproduzitzailean eta hasi bideoak pantaila osoan zuzenean, auto biraketa blokeatuta badago. Mini erreproduzitzailea erabili dezakezu pantaila osotik irtetzean</string>
<string name="start_main_player_fullscreen_title">Hasi erreproduzitzaile nagusia pantaila osoan</string>
</resources>

View File

@ -665,6 +665,8 @@
<string name="loading_channel_details">بار کردن جزییات کانال…</string>
<string name="error_show_channel_details">خطا در نمایش جزییات کانال</string>
<string name="main_page_content_swipe_remove">برای برداشتن موارد، بکشیدشان</string>
<string name="start_main_player_fullscreen_summary">اگر چرخش خودکار قفل باشد، ویدیوها را در پخش‌کنندهٔ کوچک آغاز نمی‌کند، بلکه مستقیماً به تمام‌صفحه می‌رود. همچنان می‌توانید با خروج از تمام‌صفحه به پخش‌کنندهٔ کوچک دسترسی داشته باشید.</string>
<string name="start_main_player_fullscreen_summary">اگر چرخش خودکار قفل باشد، ویدیوها را در پخش‌کنندهٔ کوچک آغاز نمی‌کند، بلکه مستقیماً به تمام‌صفحه می‌رود. همچنان می‌توانید با خروج از تمام‌صفحه به پخش‌کنندهٔ کوچک دسترسی داشته باشید</string>
<string name="start_main_player_fullscreen_title">آغاز پخش‌کنندهٔ اصلی در تمام‌صفحه</string>
<string name="enqueued_next">بعدی در صف گذاشته شد</string>
<string name="enqueue_next_stream">در صف گذاشتن بعدی</string>
</resources>

View File

@ -667,6 +667,7 @@
<item quantity="other">%s téléchargements terminés</item>
</plurals>
<string name="main_page_content_swipe_remove">Balayez un élément pour le supprimer</string>
<string name="start_main_player_fullscreen_summary">Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran.</string>
<string name="start_main_player_fullscreen_summary">Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran</string>
<string name="start_main_player_fullscreen_title">Lancer le lecteur principal en plein écran</string>
<string name="enqueue_next_stream">Mettre en file dattente la suivante</string>
</resources>

View File

@ -10,7 +10,7 @@
<string name="open_in_popup_mode">Abrir no modo popup</string>
<string name="share">Compartillar</string>
<string name="download">Descarregar</string>
<string name="controls_download_desc">Descargar o ficheiro de transmisión</string>
<string name="controls_download_desc">Descargar o ficheiro de emisión</string>
<string name="search">Procurar</string>
<string name="settings">Opcións</string>
<string name="did_you_mean">Non querería dicir \"%1$s\"\?</string>

View File

@ -689,6 +689,8 @@
<item quantity="other">%s הורדות הסתיימו</item>
</plurals>
<string name="main_page_content_swipe_remove">ניתן להחליק פריטים להסרתם</string>
<string name="start_main_player_fullscreen_summary">לא להפעיל סרטונים בנגן המוקטן, לעבור למצב מסך מלא ישירות במקום זאת, אם הטיה אוטומטית מושבתת. עדיין ניתן לגשת לנגן המוקטן על ידי יציאה ממסך מלא.</string>
<string name="start_main_player_fullscreen_summary">לא להפעיל סרטונים בנגן המוקטן, לעבור למצב מסך מלא ישירות במקום זאת, אם הטיה אוטומטית מושבתת. עדיין ניתן לגשת לנגן המוקטן על ידי יציאה ממסך מלא</string>
<string name="start_main_player_fullscreen_title">הפעלת הנגן הראשי במסך מלא</string>
<string name="enqueued_next">נוסף כהבא בתור</string>
<string name="enqueue_next_stream">הוספה כהבא בתור</string>
</resources>

View File

@ -665,4 +665,8 @@
<item quantity="other">%s download completati</item>
</plurals>
<string name="main_page_content_swipe_remove">Scorri gli elementi per rimuoverli</string>
<string name="start_main_player_fullscreen_summary">Se la rotazione automatica è bloccata, i video non saranno avviati nel mini player, ma direttamente a schermo intero. È comunque possibile accedere al mini player uscendo dalla modalità a schermo intero</string>
<string name="start_main_player_fullscreen_title">Avvia il lettore principale a schermo intero</string>
<string name="enqueued_next">Aggiunto alla coda come prossimo</string>
<string name="enqueue_next_stream">Accoda come prossimo</string>
</resources>

View File

@ -295,10 +295,11 @@
\n
\n1. この URL を開きます: %1$s
\n2. ログインしていなければログインします
\n3. \"All data included\" をクリックし、そして \"Deselect all\" をクリック、そして \"subscriptions\" のみを選択し、\"OK\" をクリック
\n4. \"Next step\" をクリックし、そして \"Create export\" をクリック
\n5. 表示されたら \"Download\" ボタンをクリック
\n6. ダウンロードした takeout の zip から、.json ファイル (たいてい、\"YouTube and YouTube Music/subscriptions/subscriptions.json\" の下にある) を抽出し、ここにインポートします。</string>
\n3. \"すべて選択\" をクリックし、そして \"選択をすべて解除\" をクリック、そして \"登録チャンネル\" のみを選択し、\"OK\" をクリック
\n4. \"次のステップ\" をクリックし、そして \"エクスポートを作成\" をクリック
\n5. 表示されたら \"ダウンロード\" ボタンをクリック
\n6. ファイルからインポートをクリックしてダウンロードした zip ファイルを選択
\n7. (インポートが失敗したら) csv ファイル (たいてい、\"YouTube と YouTube Music/登録チャンネル/登録チャンネル.csv\" にある) を抽出し、ファイルからインポートをクリックして抽出した csv ファイルを選択</string>
<string name="playback_reset">リセット</string>
<string name="accept">同意する</string>
<string name="decline">拒否する</string>
@ -643,4 +644,14 @@
<string name="remote_search_suggestions">リモート検索候補</string>
<string name="local_search_suggestions">ローカル検索候補</string>
<string name="main_page_content_swipe_remove">アイテムをスワイプして削除</string>
<string name="start_main_player_fullscreen_summary">直接フルスクリーンモードに切り替えて、ミニプレイヤーで動画を開始しません。自動回転がロックされている場合でも、フルスクリーンを終了することでミニプレイヤーにアクセスできます</string>
<string name="start_main_player_fullscreen_title">フルスクリーンでメインプレイヤーを開始</string>
<plurals name="deleted_downloads_toast">
<item quantity="other">%1$s つのダウンロードを削除しました</item>
</plurals>
<plurals name="download_finished_notification">
<item quantity="other">%s つのダウンロードが完了しました</item>
</plurals>
<string name="show_image_indicators_summary">ピカソは、画像の上に、画像の出所を識別する色彩記章を表示します: 赤はネットワーク、青はディスク、緑はメモリ</string>
<string name="show_image_indicators_title">画像に標識を表示</string>
</resources>

View File

@ -69,8 +69,8 @@
<string name="open_in_browser">Buka nang Browser</string>
<string name="cancel">Orasido</string>
<string name="install">Pasang</string>
<string name="no_player_found_toast">Ra ono pemuter (kowe iso pasang VLC gae muter iku).</string>
<string name="no_player_found">Raono pemuter. Pasang VLC\?</string>
<string name="upload_date_text">Diterbitke %1$s</string>
<string name="main_bg_subtitle">Pencet \"Cari\" nek meh mulai</string>
<string name="no_player_found_toast">Ra ono pamuter (Sampeyan iso masang VLC kanggo muter iku).</string>
<string name="no_player_found">Pamuter ora ditemokke. Pasang VLC\?</string>
<string name="upload_date_text">Diterbitake ing %1$s</string>
<string name="main_bg_subtitle">Pencet suryakanta kanggo nglekasi</string>
</resources>

View File

@ -26,11 +26,11 @@
<string name="download_path_audio_dialog_title">Pasirinkite atsisiuntimų aplankalą garso įrašams</string>
<string name="default_resolution_title">Numatytoji raiška</string>
<string name="default_popup_resolution_title">Numatytoji išokančiojo lango raiška</string>
<string name="show_higher_resolutions_title">Rodyti aukštesnes raiškas</string>
<string name="show_higher_resolutions_title">Rodyti didesnes raiškas</string>
<string name="show_higher_resolutions_summary">Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą</string>
<string name="play_with_kodi_title">Groti su Kodi</string>
<string name="kore_not_found">Įdiegti nereastą Kore programėlę\?</string>
<string name="show_play_with_kodi_title">Rodyti \"Peržiūra su Kodi\" pasirinkimą</string>
<string name="show_play_with_kodi_title">Rodyti „Peržiūra su Kodi“ pasirinkimą</string>
<string name="show_play_with_kodi_summary">Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą</string>
<string name="play_audio">Garso įrašas</string>
<string name="default_audio_format_title">Numatytasis garso formatas</string>
@ -44,7 +44,7 @@
<string name="show_search_suggestions_title">Paieškos nuspėjimai</string>
<string name="show_search_suggestions_summary">Pasirinkite pasiūlymus, kurie bus rodomi ieškant</string>
<string name="download_dialog_title">Atsisiųsti</string>
<string name="show_next_and_similar_title">Rodyti „kitus” ir „panašius” vaizdo įrašus</string>
<string name="show_next_and_similar_title">Rodyti „Kitas” ir „Panašūs” vaizdo įrašus</string>
<string name="unsupported_url">URL nepalaikoma</string>
<string name="content_language_title">Numatytoji turinio kalba</string>
<string name="settings_category_video_audio_title">Vaizdas ir garsas</string>
@ -78,7 +78,7 @@
<string name="what_happened_headline">Kas nutiko:</string>
<string name="info_labels">Kas:\\nUžklausa:\\nTurinio Kalba:\\nTurinio Šalis:\\nProgramėlės Kalba:\\nPaslauga:\\nGMT Laikas:\\nPaketas:\\nVersija:\\nOS versija:</string>
<string name="your_comment">Jūsų komentaras (anglų kalba):</string>
<string name="error_details_headline">Detalės:</string>
<string name="error_details_headline">Išsami informacija:</string>
<string name="list_thumbnail_view_description">Vaizdo įrašo peržiūros miniatiūra</string>
<string name="detail_thumbnail_view_description">Paleisti vaizdo įrašą, trukmė:</string>
<string name="detail_uploader_thumbnail_view_description">Įkėlėjo naudotojo paveikslėlio miniatiūra</string>
@ -106,7 +106,7 @@
<string name="msg_threads">Gijos</string>
<string name="msg_error">Klaida</string>
<string name="msg_running">NewPipe Atsiunčiama</string>
<string name="msg_running_detail">Palieskite, kad peržiūrėtumėte detales</string>
<string name="msg_running_detail">Palieskite, kad peržiūrėtumėte išsamią informaciją</string>
<string name="msg_wait">Prašome palaukti…</string>
<string name="msg_copied">Nukopijuota į iškarpinę</string>
<string name="no_available_dir">Prašome pasirinkti galimą atsisiuntimų aplankalą</string>
@ -126,9 +126,9 @@
<string name="enable_watch_history_title">Žiūrėjimo istorija</string>
<string name="enable_watch_history_summary">Sekite peržiūrėtus vaizdo įrašus</string>
<string name="resume_on_audio_focus_gain_title">Paleisti</string>
<string name="resume_on_audio_focus_gain_summary">Tęsti grojimą po pertraukčių (pvz. skambučių)</string>
<string name="show_hold_to_append_title">Rodyti “laikyti kad pakeisti„ patarimą</string>
<string name="show_hold_to_append_summary">Paspaudus \"Išsamiau:\" fono ar iššokančio lango mygtuke rodyti patarimą</string>
<string name="resume_on_audio_focus_gain_summary">Tęsti grojimą po pertraukimo (pvz. po skambučių)</string>
<string name="show_hold_to_append_title">Rodyti „Laikykite, kad pridėtumėte“ patarimą</string>
<string name="show_hold_to_append_summary">Rodyti patarimą, kai vaizdo įraše „Išsami informacija“ paspausite foną arba iššokantįjį mygtuką</string>
<string name="settings_category_player_title">Grotuvas</string>
<string name="settings_category_player_behavior_title">Elgsena</string>
<string name="settings_category_history_title">Istorija ir podėlis</string>
@ -160,21 +160,21 @@
<string name="charset_letters_and_digits">Raidės ir skaičiai</string>
<string name="charset_most_special_characters">Ypatingieji simboliai</string>
<string name="title_activity_about">Apie NewPipe</string>
<string name="title_licenses">Trečiųjų šalių leidimai</string>
<string name="title_licenses">Trečiųjų šalių licencijos</string>
<string name="copyright" formatted="true">© %1$s %2$s pagal %3$s</string>
<string name="tab_about">Apie</string>
<string name="tab_licenses">Leidimai</string>
<string name="app_description">Laisvas transliavimas ant Android.</string>
<string name="tab_licenses">Licencijos</string>
<string name="app_description">Nemokama, atviro kodo transliacijų peržiūros programėlė Android sistemai.</string>
<string name="contribution_title">Prisidėti</string>
<string name="contribution_encouragement">Jei turite idėjų dėl- vertimų, išvaizdos pakeitimų, kodo supaprastinimo, arba rimtų kodo pakeitimų- pagalba visada laukiama!</string>
<string name="contribution_encouragement">Jei turite idėjų dėl: vertimų, išvaizdos pakeitimų, kodo supaprastinimo, arba rimtų kodo pakeitimų - pagalba visada laukiama!</string>
<string name="view_on_github">Peržiūrėti per GitHub</string>
<string name="donation_title">Paremti</string>
<string name="donation_encouragement">NewPipe yra vystoma savanorių, kurie praleidžia savo laisvą laiką, kad sukurtų geriausią patirtį Jums. Dabar yra laikas paremti juos, kad kūrėjai galėtų NewPipe paversti dar geresne programėle.</string>
<string name="donation_encouragement">NewPipe yra vystoma savanorių, kurie skiria savo laisvą laiką, kad sukurtų geriausią patirtį Jums. Dabar yra laikas paremti juos, kad kūrėjai galėtų NewPipe paversti dar geresne programėle.</string>
<string name="give_back">Duokite grąžos</string>
<string name="website_title">Interneto puslapis</string>
<string name="website_encouragement">Kad sužinotumėte daugiau apie NewPipe apsilankykite mūsų interneto puslapyje.</string>
<string name="app_license_title">NewPipe Leidimas</string>
<string name="read_full_license">Skaityti leidimą</string>
<string name="app_license_title">NewPipe licencija</string>
<string name="read_full_license">Skaityti licenciją</string>
<string name="title_activity_history">Istorija</string>
<string name="action_history">Istorija</string>
<string name="delete_item_search_history">Ar norite ištrinti šį elementą iš paieškos istorijos?</string>
@ -189,9 +189,9 @@
<string name="top_50">Top 50</string>
<string name="new_and_hot">Nauja ir karšta</string>
<string name="play_queue_remove">Pašalinti</string>
<string name="play_queue_stream_detail">Detalės</string>
<string name="play_queue_stream_detail">Išsami informacija</string>
<string name="play_queue_audio_settings">Garso nustatymai</string>
<string name="hold_to_append">Laikykite kad įtraukti į eilę</string>
<string name="hold_to_append">Laikykite, kad įtrauktumėte į eilę</string>
<string name="start_here_on_background">Pradėti groti foniniame rėžime</string>
<string name="start_here_on_popup">Pradėti groti langelio grotuve</string>
<string name="no_player_found_toast">Nerastas srauto grotuvas (galite įdiegti VLC kad grotumėte).</string>
@ -217,8 +217,8 @@
<string name="create">Sukurti</string>
<string name="dismiss">Nutraukti</string>
<string name="rename">Pervadinti</string>
<string name="title_last_played">Paskutinis grotas</string>
<string name="title_most_played">Daugiausiai grotas</string>
<string name="title_last_played">Vėliausiai žiūrėta</string>
<string name="title_most_played">Dažniausiai žiūrėta</string>
<string name="export_complete_toast">Eksportavimas baigtas</string>
<string name="import_complete_toast">Importavimas baigtas</string>
<string name="no_valid_zip_file">Netinkamas ZIP failas</string>
@ -243,15 +243,15 @@
<string name="playlist_creation_success">Grojaraštis sukurtas</string>
<string name="playlist_add_stream_success">Pridėta į grojaraštį</string>
<string name="playlist_thumbnail_change_success">Grojaraščio paveikslėlis pakeistas.</string>
<string name="caption_none">Nėra antraštės</string>
<string name="caption_none">Jokių subtitrų</string>
<string name="resize_fit">Pritaikyti</string>
<string name="resize_fill">Užpildyti</string>
<string name="resize_zoom">Priartinti</string>
<string name="caption_auto_generated">Automatiškai sugeneruotas</string>
<string name="caption_auto_generated">Automatiškai sugeneruoti</string>
<string name="enable_leak_canary_summary">Atminties nutekėjimo stebėjimas gali padaryti programėlę nestabilią</string>
<string name="enable_disposed_exceptions_title">Pranešti apie Out-of-Lifecycle klaidas</string>
<string name="enable_disposed_exceptions_summary">Priverstinai pranešti apie \"undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal\"</string>
<string name="show_comments_summary">Išjungti, kad paslėpti komentarus</string>
<string name="show_comments_summary">Išjungti, kad būtų paslėpti komentarai</string>
<string name="show_comments_title">Rodyti komentarus</string>
<string name="tab_choose">Pasirinkti skirtuką</string>
<string name="unsubscribe">Atsisakyti prenumeratos</string>
@ -313,7 +313,7 @@
<string name="hash_channel_name">Video maišos pranešimas</string>
<string name="app_update_notification_channel_description">Pranešimas apie naują NewPipe versija</string>
<string name="app_update_notification_channel_name">Programos atnaujinimo pranešimas</string>
<string name="file">Failas</string>
<string name="file">Failą</string>
<string name="file_deleted">Failas pašalintas</string>
<string name="artists">Atlikėjai</string>
<string name="albums">Albumai</string>
@ -329,8 +329,8 @@
<string name="restricted_video">Šiam video taikomas amžiaus apribojimas
\n
\nĮjunkite \"%1$s\" norėdami peržiūrėti.</string>
<string name="youtube_restricted_mode_enabled_summary">Youtube turi \"apribotą režimą\" kuriame slepiamas galimai suaugusiems skirtas turinys</string>
<string name="youtube_restricted_mode_enabled_title">Įjungti YouTube \"apribotą režimą\"</string>
<string name="youtube_restricted_mode_enabled_summary">Youtube turi „apribotą režimą“ kuriame slepiamas galimai suaugusiems skirtas turinys</string>
<string name="youtube_restricted_mode_enabled_title">Įjungti YouTube „apribotą režimą“</string>
<string name="show_age_restricted_content_summary">Rodyti turinį kuris gali būti netinkamas vaikams (18+)</string>
<string name="settings_category_notification_title">Pranešimai</string>
<string name="settings_category_updates_title">Atnaujinimai</string>
@ -341,22 +341,22 @@
<string name="peertube_instance_url_summary">Pasirinkite mėgiamiausias PeerTube kopijas</string>
<string name="peertube_instance_url_title">PeerTube kopijos</string>
<string name="unsupported_url_dialog_message">URL neatpažintas. Atverti kita programa\?</string>
<string name="autoplay_title">Auto atkūrimas</string>
<string name="autoplay_title">Automatinis atkūrimas</string>
<string name="settings_category_clear_data_title">Išvalyti duomenis</string>
<string name="enable_playback_state_lists_summary">Sąraše rodyti atkūrimo vietos indikatorių</string>
<string name="enable_playback_state_lists_title">Vietos sąraše</string>
<string name="brightness_gesture_control_summary">Naudoti gestus ryškumo valdymui</string>
<string name="brightness_gesture_control_title">Ryškumo valdymo gestai</string>
<string name="brightness_gesture_control_title">Ryškumo gesto valdymas</string>
<string name="volume_gesture_control_summary">Naudoti gestus garsumo valdymui</string>
<string name="volume_gesture_control_title">Garsumo gesto valdymas</string>
<string name="auto_queue_toggle">Auto eilė</string>
<string name="auto_queue_summary">Tęsti atkūrimą į eilę pridedant susijusius srautus</string>
<string name="auto_queue_title">Automatiškai pridėti sekantį į eilę</string>
<string name="metadata_cache_wipe_complete_notice">Metaduomenų saugykla išvalyta</string>
<string name="metadata_cache_wipe_summary">Pašalinti visus išsaugotus puslapio duomenis</string>
<string name="metadata_cache_wipe_summary">Pašalina visus išsaugotus puslapio duomenis</string>
<string name="metadata_cache_wipe_title">Išvalyti išsaugotus metaduomenis</string>
<string name="thumbnail_cache_wipe_complete_notice">Paveikslėlių saugykla išvalyta</string>
<string name="show_meta_info_summary">Norėdami paslėpti meta duomenis info langeliuose su papildoma informacija apie srauto autorius ir turinį išjunkite</string>
<string name="show_meta_info_summary">Išjunkite, kad paslėptumėte meta duomenis langeliuose su papildoma informacija apie srauto autorius ir turinį</string>
<string name="show_meta_info_title">Rodyti meta duomenis</string>
<string name="show_description_summary">Išjunkite norėdami paslėpti video aprašymą ir papildomą informaciją</string>
<string name="use_inexact_seek_title">Naudoti greitą netikslų prasukimą</string>
@ -385,19 +385,20 @@
<string name="download_thumbnail_summary">Norėdami taupyti duomenų srautą, atminties naudojimą išjunkite. Pakeitimai išvalys duomenis atmintyje ir diske</string>
<string name="download_thumbnail_title">Įkelti miniatiūras</string>
<string name="clear_queue_confirmation_description">Aktyvaus grotuvo eilė bus pakeista</string>
<string name="clear_queue_confirmation_summary">Perjungiant iš vieno grotuvo į kitą gali pakeisti jūsų eilę</string>
<string name="clear_queue_confirmation_summary">Perjungimas iš vieno grotuvo į kitą gali pakeisti jūsų eilę</string>
<string name="clear_queue_confirmation_title">Prieš išvalant eilę prašyti patvirtinimo</string>
<string name="seek_duration_title">Greito prasukimo trukmė</string>
<string name="use_inexact_seek_summary">Netikslus prasukimas leidžia grotuvui greitai peršokti į kitą vietą su sumažintu tikslumu. 5, 15 ar 25 sekundės to nenaudoja</string>
<string name="import_youtube_instructions">Importuokite \"YouTube\" prenumeratas iš \"Google Takeout\":
<string name="import_youtube_instructions">Importuokite „YouTube“ prenumeratas iš „Google Takeout“:
\n
\n1. Eikite į šį URL adresą: %1$s
\n2. Prisijunkite, kai būsite paprašyti
\n3. Spustelėkite \"All data included\" (įtraukti visus duomenis), tada \"Deselect all\" (panaikinti visų duomenų pasirinkimą), tada pasirinkite tik \"Subscriptions\" (prenumeratos) ir spustelėkite \"OK\" (gerai).
\n4. Spustelėkite \"Next step\" (kitas žingsnis), tada \"Create export\" (sukurti eksportą).
\n5. Pasirodžius mygtukui \"Download\" (Atsisiųsti), spustelėkite jį ir
\n6. Iš atsisiųsto išėmimo zip išskleiskite .json failą (paprastai po \"YouTube and YouTube Music/subscriptions/subscriptions.json\") ir importuokite jį čia.</string>
<string name="app_license">\"NewPipe\" yra \"copyleft libre\" programinė įranga: galite ją naudoti, studijuoti, dalytis ja ir tobulinti savo nuožiūra. Konkrečiai, galite ją platinti ir (arba) keisti pagal GNU bendrosios viešosios licencijos, kurią paskelbė Laisvosios programinės įrangos fondas, 3 licencijos versiją arba (savo nuožiūra) bet kurią vėlesnę versiją, sąlygas.</string>
\n3. Spustelėkite „All data included“ (įtraukti visus duomenis), tada „Deselect all“ (panaikinti visų duomenų pasirinkimą), tada pasirinkite tik „Subscriptions“ (prenumeratos) ir spustelėkite „OK“ (gerai).
\n4. Spustelėkite „Next step“ (kitas žingsnis), tada „Create export“ (sukurti eksportą).
\n5. Pasirodžius mygtukui „Download“ (Atsisiųsti), spustelėkite jį ir
\n6. Spustelėkite toliau Importuoti failą ir pasirinkite atsisiųstą ZIP failą
\n7. [Jei nepavyksta importuoti ZIP failo] Ištraukite .csv failą (paprastai po „YouTube and YouTube Music/subscriptions/subscriptions.json“), spustelėkite toliau esantį Importuoti failą ir pasirinkite išgautą CSV failą</string>
<string name="app_license">NewPipe yra „copyleft libre“ programinė įranga: galite ją naudoti, studijuoti ir patobulinti. Konkrečiau, galite ją platinti ir (arba) modifikuoti pagal „Free Software Foundation“ paskelbtą GNU bendrosios viešosios licencijos sąlygas, pasirinktinai pagal 3 licencijos versiją arba (jūsų pasirinkimu) bet kurią vėlesnę versiją.</string>
<string name="import_soundcloud_instructions">Importuokite \"SoundCloud\" profilį įvesdami URL arba savo ID:
\n
\n1. Interneto naršyklėje įjunkite darbalaukio režimą (svetainė neprieinama mobiliesiems įrenginiams).
@ -407,7 +408,7 @@
<string name="paid_content">Šis turinys prieinamas tik sumokėjusiems naudotojams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti.</string>
<string name="youtube_music_premium_content">Šis vaizdo įrašas prieinamas tik \"YouTube Music Premium\" nariams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti.</string>
<string name="disable_media_tunneling_summary">Išjunkite medijos tuneliavimą, jei vaizdo įrašo atkūrimo metu atsiranda juodas ekranas arba užstrigimas</string>
<string name="caption_setting_description">Pakeiskite grotuvo antraštės teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą</string>
<string name="caption_setting_description">Pakeiskite grotuvo subtitrų teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą</string>
<string name="private_content">Šis turinys yra privatus, todėl \"NewPipe\" jo negali transliuoti ar atsisiųsti.</string>
<string name="confirm_prompt">Ar norite išvalyti atsisiuntimų istoriją ar ištrinti visus atsisiųstus failus\?</string>
<string name="feed_update_threshold_summary">Laikas po paskutinio atnaujinimo, po kurio prenumerata laikoma pasenusia — %s</string>
@ -420,7 +421,7 @@
<string name="error_postprocessing_stopped">NewPipe buvo uždaryta kol dirbo su failu</string>
<string name="error_http_no_content">Serveris nesiunčia duomenų</string>
<string name="error_ssl_exception">Užmegzti saugaus ryšio nepavyko</string>
<string name="limit_mobile_data_usage_title">Naudojant mobilius duomenis riboti raišką</string>
<string name="limit_mobile_data_usage_title">Riboti raišką naudojant mobilius duomenis</string>
<string name="autoplay_summary">Automatiškai atkurti — %s</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">Taip ir iš dalies žiūrėtus vaizdo įrašus</string>
<string name="error_download_resource_gone">Atstatyti parsiuntimo nepavyko</string>
@ -495,10 +496,10 @@
<string name="unmute">Įjungti garsą</string>
<string name="mute">Nutildyti</string>
<string name="preferred_open_action_settings_summary">Numatytasis veiksmas atveriant turinį — %s</string>
<string name="preferred_open_action_settings_title">Numatytasis \"atverti\" veiksmas</string>
<string name="preferred_open_action_settings_title">Numatytasis „atverti“ veiksmas</string>
<string name="enqueued">Pridėta į eilę</string>
<string name="enqueue_stream">Pridėti į eilę</string>
<string name="show_channel_details">Rodyti kanalo detales</string>
<string name="show_channel_details">Rodyti kanalo išsamią informaciją</string>
<string name="title_activity_play_queue">Groti eilę</string>
<string name="conferences">Konferencijos</string>
<string name="most_liked">Labiausiai patikę</string>
@ -531,7 +532,7 @@
\n\"YouTube\" yra pavyzdys paslaugos, kuris siūlo šį greitąjį metodą su savo RSS kanalu.
\n
\nTaigi pasirinkimas priklauso nuo to, ko labiau norite: greičio ar tikslios informacijos.</string>
<string name="start_accept_privacy_policy">Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į \"NewPipe\" privatumo politiką. Prašome atidžiai ją perskaityti.
<string name="start_accept_privacy_policy">Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į NewPipe privatumo politiką. Prašome atidžiai ją perskaityti.
\nNorėdami išsiųsti mums pranešimą apie klaidą, turite su ja sutikti.</string>
<string name="feed_use_dedicated_fetch_method_summary">Prieinama kai kuriose tarnybose, paprastai yra daug greitesnė, tačiau gali grąžinti ribotą kiekį elementų ir dažnai neišsamią informaciją (pvz., nėra trukmės, elemento tipo, nėra tiesioginės būsenos)</string>
<string name="remove_watched_popup_warning">Vaizdo įrašai, kurie buvo peržiūrėti prieš juos įtraukiant į grojaraštį ir po to, kai jie buvo įtraukti į grojaraštį, bus pašalinti.
@ -560,7 +561,7 @@
<string name="error_progress_lost">Eiga prarasta, nes failas buvo panaikintas</string>
<string name="overwrite_unrelated_warning">Failas šiuo pavadinimu jau egzistuoja</string>
<string name="error_path_creation">Nepavyko sukurti paskirties aplanko</string>
<string name="feed_use_dedicated_fetch_method_title">Kai įmanoma gauti iš atskiro kanalo</string>
<string name="feed_use_dedicated_fetch_method_title">Kai įmanoma, gauti iš dedikuoto kanalo</string>
<string name="show_original_time_ago_title">Elementams rodyti orginalų \"prieš\" laiką</string>
<string name="error_connect_host">Nepavyksta prisijungti prie serverio</string>
<string name="error_file_creation">Failo sukurti nepavyko</string>
@ -615,7 +616,7 @@
<string name="download_failed">Parsiųsti nepavyko</string>
<string name="limit_data_usage_none_description">Be limito</string>
<string name="import_soundcloud_instructions_hint">jūsųID, soundcloud.com/jūsųid</string>
<string name="previous_export">Ankstesnis ekportavimas</string>
<string name="previous_export">Ankstesnio eksportavimo</string>
<string name="import_file_title">Importuoti failą</string>
<string name="export_to">Eksportuoti į</string>
<string name="import_from">Importuoti iš</string>
@ -659,8 +660,8 @@
<string name="dont_show">Nerodyti</string>
<string name="detail_heart_img_view_description">Širdelė nuo kurėjo</string>
<string name="mark_as_watched">Pažymėti kaip peržiūrėtą</string>
<string name="loading_channel_details">Įkeliama kanalo informacija…</string>
<string name="error_show_channel_details">Klaida rodant kanalo informaciją</string>
<string name="loading_channel_details">Įkeliama kanalo išsami informacija…</string>
<string name="error_show_channel_details">Klaida rodant kanalo išsamią informaciją</string>
<string name="show_image_indicators_summary">Rodyti „Picasso“ spalvotas juosteles ant vaizdų, nurodančių jų šaltinį: raudona tinklui, mėlyna diskui ir žalia atmintis</string>
<string name="show_image_indicators_title">Rodyti vaizdo indikatorius</string>
<string name="remote_search_suggestions">Nuotolinės paieškos pasiūlymai</string>
@ -676,4 +677,8 @@
<item quantity="other">%s atsiuntimų baigta</item>
</plurals>
<string name="main_page_content_swipe_remove">Perbraukite elementus, kad juos pašalintumėte</string>
<string name="start_main_player_fullscreen_summary">Nepradėti vaizdo įrašų naudojant mini grotuvą, o iškart įjungti viso ekrano režimą, jei automatinis pasukimas yra užrakintas. Vis tiek galėsite pasiekti mini grotuvą išėję iš viso ekrano rėžimo</string>
<string name="start_main_player_fullscreen_title">Paleisti pagrindinį grotuvą viso ekrano režimu</string>
<string name="enqueued_next">Sekantis pridėtas į eilę</string>
<string name="enqueue_next_stream">Įtraukti į eilę sekantį</string>
</resources>

View File

@ -1,50 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="main_bg_subtitle">सुरू गर्न \"खोज\" चिन्ह दबाउनु होस</string>
<string name="main_bg_subtitle">सुरू गर्न \"खोज\" चिन्ह दबाउनुहोस</string>
<string name="upload_date_text">%1$s मा प्रकाशित</string>
<string name="no_player_found">कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ\?</string>
<string name="no_player_found_toast">कुनै स्ट्रीम प्लेयर फेला परेन (तपाइँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)।</string>
<string name="no_player_found_toast">कुनै स्ट्रिम प्लेयर फेला परेन (तपाईँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)।</string>
<string name="install">इन्स्टल गर्नुहोस्</string>
<string name="cancel">रद्द गर्नुहोस्</string>
<string name="open_in_browser">ब्राउजरमा खाेल्नुहाेस्</string>
<string name="open_in_popup_mode">पपअप मोडमा खोल्नुहोस्</string>
<string name="share">ेयर</string>
<string name="share">ाझा गर्नुहोस्</string>
<string name="download">डाउनलोड</string>
<string name="controls_download_desc">स्ट्रीम डाउनलोड गर्नुहोस्</string>
<string name="search">खोज</string>
<string name="settings">सेटिङ</string>
<string name="did_you_mean">के तपाईको मतलब %1$s हो\?</string>
<string name="share_dialog_title">बांडनुहोस्</string>
<string name="controls_download_desc">स्ट्रिम् डाउनलोड गर्नुहोस्</string>
<string name="search">खोज्नुहोस्</string>
<string name="settings">सेटिङ्गहरु</string>
<string name="did_you_mean">के तपाईको मतलब \"%1$s\" हो\?</string>
<string name="share_dialog_title">साझा गर्नुहोस्</string>
<string name="use_external_video_player_title">अन्य भिडियो प्लेयर प्रयोग गर्नुहोस्</string>
<string name="use_external_video_player_summary">ेही रेसोलुशनहरूमा अडियो हटाउँद</string>
<string name="use_external_video_player_summary">ुनै भिडियो रेजोलुसनहरुमा अडियो हट्न सक्</string>
<string name="use_external_audio_player_title">अन्य अडियो प्लेयर प्रयोग गर्नुहोस्</string>
<string name="subscribe_button_title">ब्सक्राइब</string>
<string name="subscribed_button_title">ब्सक्राइब गरिएको</string>
<string name="subscribe_button_title">दस्यता लिनुहोस्</string>
<string name="subscribed_button_title">दस्यता लिईएको</string>
<string name="unsubscribe">सदस्यता रद्द गर्नुहोस्</string>
<string name="channel_unsubscribed">च्यानल सदस्यता रद्द गरियो</string>
<string name="subscription_change_failed">सदस्यता परिवर्तन गर्न सकिएन</string>
<string name="subscription_update_failed">सदस्यता अपडेट गर्न सकिएन</string>
<string name="show_info">जानकारी देखाउनुहोस्</string>
<string name="tab_subscriptions">सदस्यताहरु</string>
<string name="tab_bookmarks">बुकमार्क गरिएक प्लेलिस्टहरू</string>
<string name="tab_choose">ट्याब छनट गर्नुहोस्</string>
<string name="tab_bookmarks">बुकमार्क गरिएक प्लेलिस्टहरू</string>
<string name="tab_choose">ट्याब छनट गर्नुहोस्</string>
<string name="controls_background_title">पृष्ठभूमि</string>
<string name="controls_popup_title">पपअप</string>
<string name="controls_add_to_playlist_title">थप्नुहोस</string>
<string name="controls_add_to_playlist_title">मा थप्नुहोस</string>
<string name="download_path_title">भिडियो डाउनलोड फोल्डर</string>
<string name="download_path_summary">डाउनलोड भिडियो फाइलहरू यहाँ भण्डारण छन्</string>
<string name="download_path_dialog_title">भिडियो फाइलहरू लागि डाउनलोड फोल्डर चयन गर्नुहोस्</string>
<string name="download_path_summary">डाउनलोड गरिएका भिडियो फाइलहरू यहाँ भण्डारण छन्</string>
<string name="download_path_dialog_title">भिडियो फाइलहरूका लागि डाउनलोड फोल्डर चयन गर्नुहोस्</string>
<string name="download_path_audio_title">अडियो डाउनलोड फोल्डर</string>
<string name="download_path_audio_summary">डाउनलोड अडियो फाइलहरू यहाँ भण्डारण छन्</string>
<string name="download_path_audio_dialog_title">अडियो फाइलहरू लागि डाउनलोड फोल्डर चयन गर्नुहोस्</string>
<string name="default_resolution_title">पूर्वनिर्धारित संकल्प</string>
<string name="default_popup_resolution_title">पूर्वनिर्धारित पपअप संकल्प</string>
<string name="show_higher_resolutions_title">उच्च रिजोल्युसन देखाउ</string>
<string name="show_higher_resolutions_summary">मात्र केही उपकरणहरू 2k/4K भिडियो प्ले गर्न सक्छन</string>
<string name="play_with_kodi_title">Kodi संग खोल्नुहोस</string>
<string name="kore_not_found">\'Kore\' एप छैन | हाल्न चाहनुहुन्छ\?</string>
<string name="show_play_with_kodi_title">\"Kodi सग प्ले\" विकल्प देखाउ</string>
<string name="show_play_with_kodi_summary">(Kodi) कोडि मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प प्रदर्शन</string>
<string name="download_path_audio_summary">डाउनलोड गरिएका अडियो फाइलहरू यहाँ भण्डारण छन्</string>
<string name="download_path_audio_dialog_title">अडियो फाइलहरूका लागि डाउनलोड फोल्डर चयन गर्नुहोस्</string>
<string name="default_resolution_title">पूर्वनिर्धारित रेजोलुसन</string>
<string name="default_popup_resolution_title">पूर्वनिर्धारित पपअप रेजोलुसन</string>
<string name="show_higher_resolutions_title">उच्च रेजोलुसन देखाउनु</string>
<string name="show_higher_resolutions_summary">केवल केही डिभाइसहरू मात्र 2k/4K भिडियो चलाउन सक्छन्</string>
<string name="play_with_kodi_title">Kodi सँग चलाउनुहोस्</string>
<string name="kore_not_found">\'Kore\' एप छैन, इन्स्टल गर्न चाहनुहुन्छ\?</string>
<string name="show_play_with_kodi_title">\"Kodi सग प्ले\" विकल्प देखाउनु</string>
<string name="show_play_with_kodi_summary">Kodi मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प देखाउनु</string>
<string name="play_audio">अडियो</string>
<string name="default_audio_format_title">पूर्वनिर्धारित अडियो ढाँचा</string>
<string name="default_video_format_title">पूर्वनिर्धारित भिडियो प्रारूप</string>
@ -165,7 +165,7 @@
<string name="saved_tabs_invalid_json">बचत गरिएका ट्याबहरू पढ्न सकिएन, पूर्वनिर्धारित प्रयोग गरिदै</string>
<string name="restore_defaults">फेरी पहिलाकै अवस्थामा लैजाऊ</string>
<string name="restore_defaults_confirmation">तपाईं पूर्वनिर्धारित पुनर्स्थापना गर्न चाहनुहुन्छ\?</string>
<string name="sorry_string">माफ गर्नुहोस्, त्यो हुनु हुँदैनथ्यो।</string>
<string name="sorry_string">माफ गर्नुहोस्, त्यस्तो हुनु हुँदैनथियो।</string>
<string name="error_report_button_text">ई-मेल मार्फत यो त्रुटि रिपोर्ट</string>
<string name="error_snackbar_message">माफ गर्नुहोस्, केही त्रुटिहरू भयो।</string>
<string name="error_snackbar_action">रिपोर्ट</string>
@ -179,27 +179,27 @@
<string name="detail_uploader_thumbnail_view_description">अपलोडरको अवतार थम्बनेल</string>
<string name="detail_likes_img_view_description">मनपर्दो</string>
<string name="detail_dislikes_img_view_description">मन नपर्ने</string>
<string name="search_no_results">कुनै परिणाम</string>
<string name="empty_subscription_feed_subtitle">यहाँ केही छैन</string>
<string name="search_no_results">कुनै परिणामहरु छैनन्</string>
<string name="empty_subscription_feed_subtitle">यहाँ झ्याउँकिरी बाहेक केहि पनि छैन</string>
<string name="detail_drag_description">पुन: क्रमबद्ध गर्न तान्नुहोस्</string>
<string name="video">भिडियो</string>
<string name="audio">अडियो</string>
<string name="retry">पुन: प्रयास</string>
<string name="short_thousand">K</string>
<string name="short_million">एम</string>
<string name="short_thousand">हजार</string>
<string name="short_million">करोड</string>
<string name="short_billion">अर्ब</string>
<string name="no_subscribers">शून्य चयन छैन प्राप्त (केही भाषामा) यो एन्ड्रोइड लागि \"विशेष मामला\" छैन रूपमा</string>
<string name="no_subscribers">कुनै सदस्यहरू छैनन्</string>
<plurals name="subscribers">
<item quantity="one">%s सदस्य</item>
<item quantity="other">%s सदस्यहर</item>
<item quantity="other">%s सदस्यहर</item>
</plurals>
<string name="subscribers_count_not_available">उपलब्ध गणना सदस्य</string>
<string name="no_views">ुनै दृश्य</string>
<string name="subscribers_count_not_available">सदस्य संख्या उपलब्ध छैन</string>
<string name="no_views">सैले हेर्नुभएको छैन</string>
<plurals name="views">
<item quantity="one">% हेरिय</item>
<item quantity="other">%s पटक हेरि</item>
<item quantity="one">%s पटक हेरिएक</item>
<item quantity="other">%s पटक हेरिएक</item>
</plurals>
<string name="no_videos">कुनै भिडियो</string>
<string name="no_videos">कुनै भिडियो छैन</string>
<string name="no_comments">प्रत्रिक्रिया छैन</string>
<string name="start">मिशन</string>
<string name="pause">पज</string>
@ -417,12 +417,12 @@
<string name="clear_playback_states_summary">सबै प्लेब्याक स्थानहरु मेटाउँछ</string>
<string name="delete_playback_states_alert">सबै प्लेब्याक स्थान मेटाउने\?</string>
<string name="drawer_header_description">सेवा टगल गर्नुहोस्, हाल चयन गरिएको:</string>
<string name="no_one_watching">ुनै एक हेरिरहनुभएको छ</string>
<string name="no_one_watching">सैले हेर्दै हुनुहुँदैन</string>
<plurals name="watching">
<item quantity="one">%s हेर्दै</item>
<item quantity="other">%s जना हेर्दै छन्</item>
<item quantity="one">%s जना हेर्दै हुनुहुन्छ</item>
<item quantity="other">%s जना हेर्दै हुनुहुन्छ</item>
</plurals>
<string name="no_one_listening">ुनै एक सुनिरहेको छ</string>
<string name="no_one_listening">सैले सुन्दै हुनुहुन्न</string>
<plurals name="listening">
<item quantity="one">%s श्रोता</item>
<item quantity="other">%s श्रोताहरु</item>
@ -516,7 +516,7 @@
<string name="remove_watched">हेरिसकेको हटाउनुहोस</string>
<string name="show_original_time_ago_summary">सेवाहरूबाट मूल पाठहरू स्ट्रिम वस्तुहरूमा देखिने छन्</string>
<string name="show_original_time_ago_title">आईटमहरूमा मूल समय पहिले देखाउनुहोस्</string>
<string name="infinite_videos">आनंत भिडियोहरू</string>
<string name="infinite_videos">अनगिन्ति भिडियोहरू</string>
<string name="more_than_100_videos">१००+ भिडियोहरू</string>
<string name="artists">कलाकारहरू</string>
<string name="albums">एल्बमहरू</string>
@ -531,4 +531,20 @@
\n…
\nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ।</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">हो र आंशिक रूपमा हेरिएको भिडियोहरू</string>
<string name="notification_colorize_title">सूचना पाटी रंगिन बनाउनु</string>
<string name="notification_action_nothing">केहि छैन</string>
<string name="notification_action_buffering">Buffering हुँदै</string>
<string name="notification_action_shuffle">Shuffle गर्नु</string>
<string name="notification_action_repeat">दोहोर्‍याउनु</string>
<string name="notification_actions_summary">हरेक सूचना कार्यमा थिचेर परिवर्तन गर्नुहोस्। तपाईंले तीमध्धे तीनवटासम्म सूचना पाटीमा राख्न सक्नुहुन्छ, त्यसको लागि दाँयाँ बक्समा ठिक लगाउनुहोस्।</string>
<string name="notification_action_4_title">पाँचौ कार्य बटन</string>
<string name="notification_action_3_title">चौथो कार्य बटन</string>
<string name="notification_action_0_title">पहिलो कार्य बटन</string>
<string name="notification_action_1_title">दोस्रो कार्य बटन</string>
<string name="notification_action_2_title">तेस्रो कार्य बटन</string>
<string name="notification_scale_to_square_image_title">थम्बनेल १:१ अनुपातमा परिवर्तन गर्नु</string>
<string name="notification_scale_to_square_image_summary">भिडियोको सूचना केन्द्रमा रहेको थम्बनेललाई १६:९ बाट १:१ अनुपातमा परिवर्तन गर्नु (यसको कारणले गर्दा बाङ्गोटेढो हुन सक्छ)</string>
<string name="search_showing_result_for">%s : का लागि परिणामहरु देखाइँदैछ</string>
<string name="open_with">सँँग खोल्नुहोस्</string>
<string name="mark_as_watched">हेरेको भनि चिन्ह लगाउनुहोस्</string>
</resources>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Opening Theme -->
<style name="Base.V21.OpeningTheme" parent="Base.V19.OpeningTheme">
<item name="android:navigationBarColor">@color/dark_youtube_primary_color</item>
</style>
</resources>

View File

@ -260,7 +260,7 @@
<string name="download_thumbnail_summary">Wyłącz, aby nie wczytywać miniatur, oszczędzając dane i zużycie pamięci. Zmiana tej opcji czyści pamięć podręczną obrazów</string>
<string name="thumbnail_cache_wipe_complete_notice">Wyczyszczono pamięć podręczną miniatur</string>
<string name="metadata_cache_wipe_title">Wyczyść pamięć podręczną metadanych</string>
<string name="metadata_cache_wipe_summary">Wyczyść pamięć podręczną stron</string>
<string name="metadata_cache_wipe_summary">Usuwa całą pamięć podręczną stron</string>
<string name="metadata_cache_wipe_complete_notice">Wyczyszczono pamięć podręczną metadanych</string>
<string name="auto_queue_title">Automatyczne kolejkowanie następnego strumienia</string>
<string name="auto_queue_summary">Gdy kończy się kolejka odtwarzania, dodaj do niej kolejną powiązaną pozycję</string>
@ -625,7 +625,7 @@
<string name="show_channel_details">Pokaż szczegóły kanału</string>
<string name="disable_media_tunneling_summary">Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś czarny ekran bądź brak płynności odtwarzania wideo</string>
<string name="disable_media_tunneling_title">Wyłącz tunelowanie multimediów</string>
<string name="metadata_age_limit">Ograniczenie wieku</string>
<string name="metadata_age_limit">Ograniczenie wiekowe</string>
<string name="description_select_disable">Wyłącz zaznaczanie tekstu w opisie</string>
<string name="description_select_enable">Włącz zaznaczanie tekstu w opisie</string>
<string name="metadata_privacy_internal">Wewnętrzny</string>
@ -686,4 +686,6 @@
<string name="main_page_content_swipe_remove">Przesuń w bok elementy, aby je usunąć</string>
<string name="start_main_player_fullscreen_summary">Nie uruchamiaj wideo w miniodtwarzaczu, ale przełączaj się bezpośrednio na tryb pełnoekranowy, jeśli automatyczne obracanie jest zablokowane. Nadal możesz uzyskać dostęp do miniodtwarzacza, wychodząc z trybu pełnoekranowego</string>
<string name="start_main_player_fullscreen_title">Uruchamiaj główny odtwarzacz w trybie pełnoekranowym</string>
<string name="enqueued_next">Dodano do kolejki (następny)</string>
<string name="enqueue_next_stream">Dodaj do kolejki (następny)</string>
</resources>

View File

@ -169,14 +169,15 @@
<string name="default_content_country_title">País padrão para conteúdo</string>
<string name="app_description">Aplicação livre de reprodução de emissões para Android.</string>
<string name="content_language_title">Idioma padrão para conteúdo</string>
<string name="import_youtube_instructions">Importar subscrições YouTube do Google Takeout:
<string name="import_youtube_instructions">Importar subscrições do YouTube do Google Takeout:
\n
\n1. Aceda a este URL: %1$s
\n2. Inicie a sessão
\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar tudo\", selecione \"Subscrições\" e clique em \"OK\".
\n1. Vá para este URL: %1$s
\n2. Faça o login quando solicitado
\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\".
\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\".
\n5. Clique no botão \"Descarregar\"
\n6. A partir do zip descarregado extraia o ficheiro .json (normalmente em \"YouTube e YouTube Music/subscriptions/subscriptions.json\") e importe-o aqui.</string>
\n5. Clique no botão \"Descarregar\" após aparecer
\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro zip descarregado
\n7. [Se a importação do zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído</string>
<string name="minimize_on_exit_background_description">Ativar reprodutor em segundo plano</string>
<string name="recaptcha_request_toast">Desafio reCAPTCHA solicitado</string>
<string name="autoplay_title">Reprodução automática</string>
@ -480,7 +481,7 @@
<string name="videos_string">Vídeos</string>
<string name="metadata_cache_wipe_complete_notice">Meta-dados em cache limpos</string>
<string name="show_hold_to_append_summary">Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup</string>
<string name="no_player_found_toast">Não foi encontrado um reprodutor (pode instalar VLC para reproduzir).</string>
<string name="no_player_found_toast">Nenhum reprodutor foi encontrado (pode instalar VLC para reproduzir).</string>
<string name="downloads_storage_ask_summary">Ser-lhe-á perguntado onde guardar cada descarga.
\nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo</string>
<string name="show_play_with_kodi_title">Mostrar opção \"Reproduzir no Kodi\"</string>
@ -655,4 +656,17 @@
<string name="show_image_indicators_title">Mostrar indicadores de imagem</string>
<string name="remote_search_suggestions">Sugestões de pesquisa remotas</string>
<string name="local_search_suggestions">Sugestões de pesquisa locais</string>
<plurals name="deleted_downloads_toast">
<item quantity="one">%1$s descarga apagada</item>
<item quantity="other">%1$s descargas apagadas</item>
</plurals>
<plurals name="download_finished_notification">
<item quantity="one">Descarga concluída</item>
<item quantity="other">%s descargas concluídas</item>
</plurals>
<string name="main_page_content_swipe_remove">Deslizar itens para removê-los</string>
<string name="start_main_player_fullscreen_summary">Não iniciar vídeos no reprodutor mini, mas ir diretamente ao modo de ecrã cheio, se a rotação automática estiver bloqueada. Ainda pode acessar o reprodutor mini por sair do modo de ecrã cheio</string>
<string name="start_main_player_fullscreen_title">Iniciar o reprodutor principal em ecrã cheio</string>
<string name="enqueued_next">Enfileirado o próximo</string>
<string name="enqueue_next_stream">Enfileirar o próximo</string>
</resources>

View File

@ -269,7 +269,7 @@
\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\".
\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\".
\n5. Clique no botão \"Descarregar\" após aparecer
\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro zip baixado
\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro zip descarregado
\n7. [Se a importação do zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído</string>
<string name="import_soundcloud_instructions">Importe o seu perfil SoundCloud digitando o URL ou a ID.:
\n
@ -665,4 +665,8 @@
<item quantity="other">%s descargas concluídas</item>
</plurals>
<string name="main_page_content_swipe_remove">Deslizar itens para removê-los</string>
<string name="start_main_player_fullscreen_summary">Não iniciar vídeos no reprodutor mini, mas ir diretamente ao modo de ecrã cheio, se a rotação automática estiver bloqueada. Ainda pode acessar o reprodutor mini por sair do modo de ecrã cheio</string>
<string name="start_main_player_fullscreen_title">Iniciar o reprodutor principal em ecrã cheio</string>
<string name="enqueued_next">Enfileirado o próximo</string>
<string name="enqueue_next_stream">Enfileirar o próximo</string>
</resources>

View File

@ -5,20 +5,20 @@
<string name="install">Instalare</string>
<string name="cancel">Anulare</string>
<string name="open_in_browser">Deschidere în browser</string>
<string name="share">Partajare</string>
<string name="share">Distribuiți</string>
<string name="download">Descărcare</string>
<string name="search">Căutare</string>
<string name="settings">Setări</string>
<string name="did_you_mean">V-ați referit la: %1$s \?</string>
<string name="share_dialog_title">Partajează cu</string>
<string name="use_external_video_player_title">Folosește un player video extern</string>
<string name="share_dialog_title">Distribuiți cu</string>
<string name="use_external_video_player_title">Folosiți un player video extern</string>
<string name="use_external_audio_player_title">Folosește un player audio extern</string>
<string name="download_path_title">Locația videoclipurilor descărcate</string>
<string name="download_path_summary">Videoclipurile descărcate sunt stocate aici</string>
<string name="download_path_dialog_title">Alegeți locația unde se vor descărca clipurile video</string>
<string name="download_path_audio_title">Directorul audio-ului descărcat</string>
<string name="download_path_audio_summary">Locul în care se vor descărca fișierele audio</string>
<string name="download_path_audio_dialog_title">Alegeți locația în care se vor descărca fişierele audio</string>
<string name="download_path_dialog_title">Alegeți folderul de descărcare pentru fișierele video</string>
<string name="download_path_audio_title">Dosar de descărcări audio</string>
<string name="download_path_audio_summary">Fișierele audio descărcate sunt stocate aici</string>
<string name="download_path_audio_dialog_title">Alegeți folderul de descărcare pentru fișierele audio</string>
<string name="default_resolution_title">Rezoluție implicită</string>
<string name="play_with_kodi_title">Redați folosind Kodi</string>
<string name="kore_not_found">Aplicația Kore nu a fost găsită. Doriți să o instalați?</string>
@ -50,7 +50,7 @@
<string name="detail_uploader_thumbnail_view_description">Thumbnail-ul avatarului autorului</string>
<string name="detail_likes_img_view_description">Au apreciat</string>
<string name="detail_dislikes_img_view_description">Nu au apreciat</string>
<string name="main_bg_subtitle">Apăsați pe lupă pentru a începe</string>
<string name="main_bg_subtitle">Apăsați pe lupă pentru a începe.</string>
<string name="duration_live">În direct</string>
<string name="downloads">Descărcări</string>
<string name="downloads_title">Descărcări</string>
@ -84,7 +84,7 @@
\ndeschide în mod pop-up</string>
<string name="title_activity_recaptcha">Provocare reCAPTCHA</string>
<string name="recaptcha_request_toast">reCAPTCHA nouă cerută</string>
<string name="default_popup_resolution_title">Rezoluție pop-up inițială</string>
<string name="default_popup_resolution_title">Rezoluția implicită a ferestrei pop-up</string>
<string name="show_higher_resolutions_title">Afișează rezoluții mai mari</string>
<string name="show_higher_resolutions_summary">Doar anumite dispozitive suportă redarea videoclipurilor 2K/4K</string>
<string name="default_video_format_title">Format video implicit</string>
@ -98,7 +98,7 @@
<string name="short_thousand">k</string>
<string name="short_million">mil.</string>
<string name="short_billion">mld.</string>
<string name="use_external_video_player_summary">Sterge sunetul la anumite rezolutii</string>
<string name="use_external_video_player_summary">Elimină sunetul audio la anumite rezoluții</string>
<string name="controls_background_title">Fundal</string>
<string name="controls_popup_title">Pop-up</string>
<string name="popup_remember_size_pos_title">Reține dimensiunea și poziția pop-up-ului</string>
@ -180,17 +180,17 @@
<string name="controls_download_desc">Descărcați fișierul de vizionat</string>
<string name="show_info">Arată informații</string>
<string name="tab_bookmarks">Playlist-uri salvate</string>
<string name="controls_add_to_playlist_title">Adaugă La</string>
<string name="controls_add_to_playlist_title">Salvează în</string>
<string name="use_inexact_seek_title">Folosește parcurgerea inexactă</string>
<string name="use_inexact_seek_summary">Derularea inexactă permite player-ului să fie poziţionat mai rapid dar cu o precizie mai redusă. Căutarea pentru 5, 15 sau 25 de secunde nu funcționează cu acest lucru.</string>
<string name="use_inexact_seek_summary">Derularea inexactă permite player-ului să deruleze mai rapid, cu o precizie redusă. Derularea timp de 5, 15 sau 25 de secunde nu funcționează cu aceasta.</string>
<string name="download_thumbnail_title">Încarcă miniaturi</string>
<string name="download_thumbnail_summary">Dezactivați pentru a preveni încărcarea thumbnail-urilor şi pentru a economisi consumul de date și de memorie. Schimbarea acestei opțiuni va curăța tot cache-ul din memorie și de pe disc.</string>
<string name="download_thumbnail_summary">Dezactivați pentru a preveni încărcarea miniaturilor, economisirea datelor și utilizarea memoriei. Modificările șterg atât memoria cache a imaginilor în memorie, cât și pe disc</string>
<string name="thumbnail_cache_wipe_complete_notice">Datele cache de imagini au fost șterse</string>
<string name="metadata_cache_wipe_title">Șterge cache-ul pentru metadata</string>
<string name="metadata_cache_wipe_summary">Șterge cache-ul pentru datele de pagini web</string>
<string name="metadata_cache_wipe_complete_notice">Cache pentru metadata șters</string>
<string name="auto_queue_title">Adaugă următorul stream în coadă automat</string>
<string name="auto_queue_summary">Continuă oprirea (fără repetare) a colajului prin adăugarea unui stream asemănător</string>
<string name="auto_queue_summary">Continuă coadă de redare (care nu se repetă) prin adăugarea unui flux asemănător</string>
<string name="show_hold_to_append_title">Arată sfatul „Țineți apăsat pentru a adăuga”</string>
<string name="show_hold_to_append_summary">Arată un sfat când apeși butonul de redare în fundal sau de popup în secțiunea video \"Detalii\"</string>
<string name="default_content_country_title">Țara implicită pentru conținut</string>
@ -278,8 +278,8 @@
<string name="playback_tempo">Viteză</string>
<string name="accept">Acceptă</string>
<string name="decline">Refuză</string>
<string name="unsubscribe">Dezaboneaza-te</string>
<string name="tab_choose">Alege panel</string>
<string name="unsubscribe">Dezabonează-te</string>
<string name="tab_choose">Alegeți fila</string>
<string name="volume_gesture_control_title">Gesturi control volum</string>
<string name="volume_gesture_control_summary">Utilizează gesturi pentru controlul volumului</string>
<string name="brightness_gesture_control_title">Gesturi control strălucire</string>
@ -346,7 +346,7 @@
<string name="peertube_instance_url_help">Găsește instanța care îți place în %s</string>
<string name="peertube_instance_url_summary">Selectează instanța preferată PeerTube</string>
<string name="peertube_instance_url_title">Instanțe PeerTube</string>
<string name="seek_duration_title">Durată redare-înainte/derulare</string>
<string name="seek_duration_title">Durată derulare rapidă înainte/înapoi</string>
<string name="recaptcha_done_button">Gata</string>
<string name="subtitle_activity_recaptcha">Apăsați \"Gata\" când ați terminat</string>
<string name="error_report_open_issue_button_text">Raportează pe Github</string>
@ -367,7 +367,7 @@
<string name="show_age_restricted_content_summary">Afișați conținut posibil nepotrivit pentru copii, deoarece are o limită de vârstă (cum ar fi 18+)</string>
<string name="settings_category_notification_title">Notificare</string>
<string name="unsupported_url_dialog_message">Adresa URL nu a putut fi recunoscută. Deschideți cu o altă aplicație\?</string>
<string name="show_meta_info_title">Afișați informațiile meta</string>
<string name="show_meta_info_title">Afișează informațiile meta</string>
<string name="notification_colorize_summary">Faceți ca Android să personalizeze culoarea notificării în funcție de culoarea principală din miniatură (rețineți că aceasta nu este disponibilă pe toate dispozitivele)</string>
<string name="notification_colorize_title">Colorează notificarea</string>
<string name="notification_action_nothing">Nimic</string>
@ -375,7 +375,7 @@
<string name="notification_action_shuffle">Redare aleatorie</string>
<string name="notification_action_repeat">Repetaţi</string>
<string name="notification_actions_at_most_three">Puteți selecta cel mult trei acțiuni pentru afișare în notificarea compactă!</string>
<string name="notification_actions_summary">Editați fiecare acțiune de notificare de mai jos atingând-o. Selectați până la trei dintre ele pentru a fi afișate în notificarea compactă utilizând casetele de selectare din dreapta.</string>
<string name="notification_actions_summary">Modificați fiecare acțiune de notificare de mai jos, atingând-o. Selectați până la trei dintre ele pentru a fi afișate în notificarea compactă, utilizând casetele de selectare din dreapta</string>
<string name="notification_action_4_title">Al cincilea buton de acțiune</string>
<string name="notification_action_3_title">Al patrulea buton de acțiune</string>
<string name="notification_action_2_title">Al treilea buton de acțiune</string>
@ -465,8 +465,8 @@
<string name="show_original_time_ago_title">Afișarea timpului inițial în urmă pentru elemente</string>
<string name="enable_disposed_exceptions_summary">Raportarea forțată a excepțiilor Rx nelivrabile în afara ciclului de viață al fragmentului sau al activității după eliminare</string>
<string name="auto_queue_toggle">Coadă automată</string>
<string name="clear_queue_confirmation_description">Lista de redare a playerului activ va fi înlocuită</string>
<string name="clear_queue_confirmation_summary">Trecerea de la un player la altul poate înlocui lista de redare</string>
<string name="clear_queue_confirmation_description">Coada de redare activă va fi înlocuită</string>
<string name="clear_queue_confirmation_summary">Trecerea de la un player la altul vă poate înlocui coada de redare</string>
<string name="clear_queue_confirmation_title">Solicitați confirmarea înainte de a șterge o listă de redare</string>
<plurals name="minutes">
<item quantity="one">%d minut</item>
@ -596,9 +596,9 @@
<string name="comments_tab_description">Comentarii</string>
<string name="error_report_open_github_notice">Vă rugăm să verificați dacă există deja o problemă legată de crash-ul dvs. Când creați bilete duplicat, ne luați timp pe care l-am putea petrece cu remedierea erorii.</string>
<string name="copy_for_github">Copiați raportul formatat</string>
<string name="show_meta_info_summary">Dezactivați pentru a ascunde casetele de meta-informații cu informații suplimentare despre creatorul fluxului, conținutul fluxului sau o solicitare de căutare.</string>
<string name="show_meta_info_summary">Dezactivați pentru a ascunde casetele de informații meta cu informații suplimentare despre creatorul fluxului, conținutul fluxului sau o cerere de căutare</string>
<string name="show_description_summary">Dezactivați pentru a ascunde descrierea videoclipului și informațiile suplimentare</string>
<string name="show_description_title">Arătați descrierea</string>
<string name="show_description_title">Arată descrierea</string>
<string name="open_with">Deschideți cu</string>
<string name="crash_the_app">Blocați aplicația</string>
<string name="recaptcha_solve">Rezolvează</string>

View File

@ -269,9 +269,9 @@
<string name="resize_fill">Заполнить</string>
<string name="resize_zoom">Приблизить</string>
<string name="caption_auto_generated">Создано автоматически</string>
<string name="enable_leak_canary_summary">Мониторинг утечки памяти может привести к зависанию приложения</string>
<string name="enable_disposed_exceptions_title">Сообщать об ошибках жизненного цикла</string>
<string name="enable_disposed_exceptions_summary">Принудительно сообщать о недоставляемых Rx-исключениях вне фрагмента или жизненного цикла после удаления</string>
<string name="enable_leak_canary_summary">Мониторинг утечек памяти может привести к зависанию приложения</string>
<string name="enable_disposed_exceptions_title">Сообщать об ошибках вне жизненного цикла</string>
<string name="enable_disposed_exceptions_summary">Принудительно сообщать о недоставляемых вне жизненного цикла фрагмента или активности Rx-исключениях после высвобождения ресурсов</string>
<string name="import_title">Импорт</string>
<string name="import_from">Импорт из</string>
<string name="export_to">Экспорт в</string>
@ -329,7 +329,7 @@
<string name="import_settings">Хотите импортировать настройки?</string>
<string name="privacy_policy_title">Конфиденциальность</string>
<string name="privacy_policy_encouragement">Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия.
\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях.</string>
\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях.</string>
<string name="read_privacy_policy">Прочитать политику</string>
<string name="start_accept_privacy_policy">В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней.
\nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке.</string>
@ -609,7 +609,7 @@
<string name="show_description_title">Показать описание</string>
<string name="open_with">Открыть в</string>
<string name="no_app_to_open_intent">Подходящее приложение не найдено</string>
<string name="crash_the_app">Сбой приложения</string>
<string name="crash_the_app">Вызвать сбой приложения</string>
<string name="paid_content">Этот контент доступен только оплатившим его пользователям, поэтому NewPipe не может воспроизвести или загрузить его.</string>
<string name="youtube_music_premium_content">Это видео доступно только для пользователей YouTube Music Premium, поэтому NewPipe не может воспроизвести или загрузить его.</string>
<string name="private_content">Это частный контент, поэтому NewPipe не может воспроизвести или загрузить его.</string>
@ -618,7 +618,7 @@
<string name="download_has_started">Загрузка началась</string>
<string name="select_night_theme_toast">Вы можете выбрать предпочтительную ночную тему ниже</string>
<string name="night_theme_summary">Выберите предпочтительную ночную тему — %s</string>
<string name="auto_device_theme_title">Автоматическая (тема устройства)</string>
<string name="auto_device_theme_title">Автоматически (тема устройства)</string>
<string name="radio">Радио</string>
<string name="restricted_video_no_stream">Это видео имеет возрастные ограничения.
\nСогласно новой политике YouTube в отношении видео с возрастными ограничениями NewPipe не может иметь доступ ни к одному потоку этого видео и, таким образом, не может воспроизвести его.</string>
@ -670,7 +670,7 @@
<string name="mark_as_watched">Пометить как проигранные</string>
<string name="error_show_channel_details">Не удалось отобразить сведения о канале</string>
<string name="loading_channel_details">Загрузка сведений о канале…</string>
<string name="show_image_indicators_summary">Указать цветной полосой на изображениях Picasso их источник (красный - сеть, синий - диск, зелёный - память)</string>
<string name="show_image_indicators_summary">Picasso: указать цветом источник изображений (красный - сеть, синий - диск, зелёный - память)</string>
<string name="show_image_indicators_title">Цветные метки на изображениях</string>
<string name="remote_search_suggestions">Серверные предложения поиска</string>
<string name="local_search_suggestions">Локальные предложения поиска</string>
@ -687,7 +687,7 @@
<item quantity="other">%s загрузок завершено</item>
</plurals>
<string name="main_page_content_swipe_remove">Удалять элементы смахиванием</string>
<string name="start_main_player_fullscreen_summary">Не начинать просмотр видео в мини-плеере, но сразу переключиться в полноэкранный режим, если автовращение экрана заблокировано. Вы можете переключиться на мини-плеер, выйдя из полноэкранного режима.</string>
<string name="start_main_player_fullscreen_summary">Запускать видео во весь экран, если отключён автоповорот. Мини-плеер доступен при выходе из полноэкранного режима</string>
<string name="start_main_player_fullscreen_title">Начинать просмотр в полноэкранном режиме</string>
<string name="notifications">Уведомления</string>
<string name="streams_notification_channel_name">Новые видео</string>

View File

@ -665,4 +665,6 @@
<item quantity="other">%s iscarrigamentos acabados</item>
</plurals>
<string name="main_page_content_swipe_remove">Trìsina sos elementos pro los bogare</string>
<string name="start_main_player_fullscreen_summary">Si sa rotatzione automàtica est blocada no avies sos vìdeos in su riproduidore mini ma diretamente in sa modalidade a ischermu intreu. Podes atzèdere su matessi a su riproduidore mini essende dae s\'ischermu intreu</string>
<string name="start_main_player_fullscreen_title">Allughe su letore printzipale a ischermu intreu</string>
</resources>

View File

@ -105,7 +105,7 @@
<string name="popup_remember_size_pos_title">Zapamätať si parametre mini okna</string>
<string name="popup_remember_size_pos_summary">Zapamätať si posledné nastavenie veľkosti a pozície mini okna</string>
<string name="show_search_suggestions_title">Hľadať návrhy</string>
<string name="show_search_suggestions_summary">Zobrazovať návrhy pri vyhľadávaní</string>
<string name="show_search_suggestions_summary">Vyberte návrhy, ktoré sa majú zobrazovať pri vyhľadávaní</string>
<string name="best_resolution">Najlepšie rozlíšenie</string>
<string name="subscribe_button_title">Odber</string>
<string name="subscribed_button_title">Odoberané</string>
@ -289,7 +289,8 @@
\n3. Kliknite na \"Zahrnuté sú všetky údaj služby YouTube\", tam kliknite na \"Zrušiť výber\", zaškrtnite \"odbery\" a potom kliknite na OK
\n4. Kliknite na \"Ďaľší krok\" a potom na \"Vytvoriť export\"
\n5. Po chvíli sa objaví tlačidlo s nápisom \"Stiahnuť\"
\n6. Stiahnutý súbor otvorte a extraktujte .json súbor (nachádza sa v \"/Takeout/YouTube a YouTube Music/odbery/\"). Tento súbor importujte do NewPipe.</string>
\n6. Kliknite na IMPORT ZO SÚBORU a zvoľte stiahnutý zip súbor
\n7. Ak import zip súbory zlyhá. Stiahnutý súbor otvorte a extraktujte .csv súbor (nachádza sa v \"/Takeout/YouTube a YouTube Music/odbery/\"). Tento súbor importujte do NewPipe.</string>
<string name="import_soundcloud_instructions">Importovať SoundCloud profil zadaním URL adresy alebo vášho ID:
\n
\n1. Prepnite režim na \"desktop\" (web nie je dostupný pre mobilné zariadenia)
@ -648,4 +649,34 @@
<string name="downloads_storage_use_saf_summary_api_19">\'Storage Access Framework\' nie je podporovaný v systéme Android KitKat a ani v starších verziách</string>
<string name="downloads_storage_ask_summary_no_saf_notice">Pri každom sťahovaní sa zobrazí výzva kam uložiť súbor</string>
<string name="no_dir_yet">Nie je nastavený adresár na sťahovanie. Nastavte ho teraz.</string>
<string name="mark_as_watched">Označiť ako pozorované</string>
<string name="loading_channel_details">Načítavanie podrobností o kanáli…</string>
<string name="error_show_channel_details">Chyba pri zobrazení podrobností kanála</string>
<string name="off">Vypnuté</string>
<string name="on">Zapnuté</string>
<string name="tablet_mode_title">Režim tabletu</string>
<string name="detail_heart_img_view_description">Obľúbené autorom</string>
<string name="feed_toggle_show_played_items">Zobrazovať pozreté položky</string>
<plurals name="deleted_downloads_toast">
<item quantity="one">%1$s sťahovanie zmazané</item>
<item quantity="few">%1$s sťahovania zmazané</item>
<item quantity="other">%1$s sťahovaní zmazaných</item>
</plurals>
<plurals name="download_finished_notification">
<item quantity="one">Sťahovanie ukončené</item>
<item quantity="few">%s ukončené sťahovania</item>
<item quantity="other">%s ukončených sťahovaní</item>
</plurals>
<string name="dont_show">Neukazovať</string>
<string name="low_quality_smaller">Nízka kvalita (menšie)</string>
<string name="high_quality_larger">Vysoká kvalita (väčšie)</string>
<string name="seekbar_preview_thumbnail_title">Náhľad miniatúry pri vyhľadávaní</string>
<string name="show_image_indicators_summary">Zobraziť farebné stužky Picassa na obrázkoch podľa ich zdroja: červená pre sieť, modrá pre disk a zelená pre pamäť</string>
<string name="show_image_indicators_title">Zobraziť indikátory obrázka</string>
<string name="main_page_content_swipe_remove">Potiahnutím vymazať</string>
<string name="comments_are_disabled">Komentáre sú zakázané</string>
<string name="start_main_player_fullscreen_summary">Pri zamknutej auto-rotácií nespúšťať videá v mini prehrávači, ale prepnúť sa priamo do režimu celej obrazovky. Prístup k mini prehrávaču bude po ukončení režimu celej obrazovky</string>
<string name="start_main_player_fullscreen_title">Hlavný prehrávač na celej obrazovke</string>
<string name="remote_search_suggestions">Návrhy vzdialeného vyhľadávania</string>
<string name="local_search_suggestions">Miestne návrhy vyhľadávania</string>
</resources>

View File

@ -665,6 +665,6 @@
<item quantity="other">%s indirme tamamlandı</item>
</plurals>
<string name="main_page_content_swipe_remove">Ögeleri kaldırmak için kaydır</string>
<string name="start_main_player_fullscreen_summary">Videoları küçük oynatıcıda başlatma, kendiliğinden döndürme kilitliyse doğrudan tam ekran kipine geç. Tam ekrandan çıkarak küçük oynatıcıya erişmeye devam edebilirsiniz.</string>
<string name="start_main_player_fullscreen_summary">Videoları küçük oynatıcıda başlatma, kendiliğinden döndürme kilitliyse doğrudan tam ekran kipine geç. Tam ekrandan çıkarak küçük oynatıcıya erişmeye devam edebilirsiniz</string>
<string name="start_main_player_fullscreen_title">Ana oynatıcıyı tam ekranda başlat</string>
</resources>

View File

@ -681,6 +681,8 @@
<item quantity="other">%s завантажень завершено</item>
</plurals>
<string name="main_page_content_swipe_remove">Проведіть пальцем по елементах, щоб вилучити їх</string>
<string name="start_main_player_fullscreen_summary">Не запускати відео в мініпрогравачі, а перемикати в повноекранний режим безпосередньо, якщо автообертання заблоковано. Ви все одно можете отримати доступ до мініпрогравача, вийшовши з повноекранного режиму.</string>
<string name="start_main_player_fullscreen_summary">Не запускати відео в мініпрогравачі, а перемикати в повноекранний режим безпосередньо, якщо автообертання заблоковано. Ви все одно можете отримати доступ до мініпрогравача, вийшовши з повноекранного режиму</string>
<string name="start_main_player_fullscreen_title">Запустити основний програвач у повноекранному режимі</string>
<string name="enqueued_next">Заплановано наступним</string>
<string name="enqueue_next_stream">Запланувати наступним</string>
</resources>

View File

@ -651,4 +651,7 @@
<plurals name="download_finished_notification">
<item quantity="other">%s lượt tải xuống đã hoàn tất</item>
</plurals>
<string name="main_page_content_swipe_remove">Vuốt các mục để xóa chúng</string>
<string name="start_main_player_fullscreen_summary">Không bắt đầu video ở trình phát mini, mà chuyển trực tiếp thành chế độ toàn màn hình, nếu tự động xoay bị khóa. Bạn vẫn có thể truy cập trình phát mini bằng cách thoát khỏi toàn màn hình</string>
<string name="start_main_player_fullscreen_title">Khởi động trình phát chính ở toàn màn hình</string>
</resources>

View File

@ -653,4 +653,6 @@
<item quantity="other">%s 下載已完成</item>
</plurals>
<string name="main_page_content_swipe_remove">滑動項目以刪除它們</string>
<string name="start_main_player_fullscreen_summary">如果自動旋轉被鎖定,請不要在迷你播放器中啟動影片,而是直接切換到全螢幕模式。您仍然可以透過結束全螢幕存取迷你播放器</string>
<string name="start_main_player_fullscreen_title">以全螢幕開始主播放器</string>
</resources>

View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingTranslation">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="main_bg_subtitle">Tap the magnifying glass to get started.</string>
<string name="upload_date_text">Published on %1$s</string>
<string name="no_player_found">No stream player found. Install VLC?</string>
@ -122,7 +120,7 @@
<string name="resume_on_audio_focus_gain_summary">Continue playing after interruptions (e.g. phonecalls)</string>
<string name="download_dialog_title">Download</string>
<string name="start_main_player_fullscreen_title">Start main player in fullscreen</string>
<string name="start_main_player_fullscreen_summary">Do not start videos in the mini player, but turn to fullscreen mode directly, if auto rotation is locked. You can still access the mini player by exiting fullscreen.</string>
<string name="start_main_player_fullscreen_summary">Do not start videos in the mini player, but turn to fullscreen mode directly, if auto rotation is locked. You can still access the mini player by exiting fullscreen</string>
<string name="autoplay_title">Autoplay</string>
<string name="show_hold_to_append_title">Show \"Hold to append\" tip</string>
<string name="show_hold_to_append_summary">Show tip when pressing the background or the popup button in video \"Details:\"</string>
@ -427,6 +425,8 @@
<string name="show_channel_details">Show channel details</string>
<string name="enqueue_stream">Enqueue</string>
<string name="enqueued">Enqueued</string>
<string name="enqueue_next_stream">Enqueue next</string>
<string name="enqueued_next">Enqueued next</string>
<string name="start_here_on_background">Start playing in the background</string>
<string name="start_here_on_popup">Start playing in a popup</string>
<!-- Drawer -->
@ -731,4 +731,4 @@
<string name="notification_title_pattern" translatable="false">%s • %s</string>
<string name="streams_notifications_channels_summary" translatable="false">%d/%d</string>
<string name="toggle_all">Toggle all</string>
</resources>
</resources>

View File

@ -8,7 +8,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.android.tools.build:gradle:7.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong

14
doc/gradle.md Normal file
View File

@ -0,0 +1,14 @@
# Custom gradle parameters
You can use these parameters by specifying them inside the `gradle.properties` file as
`systemProp.<name>=<value>` or passing them through the CLI with `-D<name>=<value>`.
## packageSuffix
This allows you to specify a suffix, which will be added on release builds to the application id,
the `app_name` string and the apk file.
No validation is made, so make sure to pass in a valid value.
## skipFormatKtlint
This allows you to skip the `formatKtLint` task.
No value is needed.
It is used for CI in order to check for badly formatted files.

View File

@ -0,0 +1,10 @@
• Opción para abrir reproductor directamente en pantalla completa
• Escoge que tipo de sugerencias de búsqueda mostrar
• Tema oscuro más oscuro + splash screen oscura
• Selector de archivos mejorado
• Importación de YouTube corregida
• Reanudar stream requiere pulsar botón de reproducción otra vez
• Corregido cierre de sesión de audio
• [Android TV] Corregidos saltos en barra de reproducción al usar DPad
Para ver más cambios, revisa nuestro registro (y blog) en la pestaña de enlaces de abajo.

View File

@ -0,0 +1,5 @@
تعمیر فوری
• تعمیر مشکلات میانگیری ایجاد شده به دست دریچه‌بندی یوتوب
• تعمیر استخراج نظرهای یوتوب و فروپاشی‌ها با نظرهای از کار افتاده
• تعمیر جست‌وجوی آهنگ‌های یوتوب
• تعمیر جریان‌های زندهٔ پیرتیوب

View File

@ -0,0 +1,10 @@
• افزودن گزینه برای گشودن مستقیم پخش‌کننده در تمام‌صفحه
• اجازه انتخاب گونهٔ پیشنهاد جست‌وجو برای نمایش
• افزودن زمینه تاریک تاریک‌تر و صفحه گشایش تاریک
• بهبود گزینشگر پرونده برای تار کردن پرونده‌های ناخواسته
• تعمیر درون‌ریزی اشتراک‌های یوتوب
• نیاز به زدن دوباره روی دکمهٔ پخش دوباره برای پخش دوباره جریان
• تعمیر بستن نشست صوتی
• [تلویزیون اندرویدی] تعمیر پرش‌های بلند نوار جویش هنگام استفاده از دی‌پد
برای دیدن تغییرات بیش‌تر، گزارش دگرگونی (و فرسته وبلاگی) را از زبانهٔ پیوندها در زیر ببینید.

View File

@ -0,0 +1,10 @@
• נוספה אפשרות לפתוח את הנגן ישירות במסך מלא
• אפשר לבחור אילו סוגי הצעות חיפוש להציג
• ערכת העיצוב הכהה מעתה כהה יותר וגם נוסף מסך פתיחה כהה
• בוחר הקבצים עבר מקצה שיפורים והוא מאפיר קבצים בלתי רצויים
• ייבוא המינויים מ־YouTube תוקן
• ניגון של תזרים מחדש דורש נגיעה בכפתור הנגינה מחדש פעם נוספת
• סגירת הפעלת שמע תוקנה
• [Android TV] תוקנו קפיצות גדולות בפס הנגינה עם שימוש ב־DPad
כדי לצפות בשינויים נוספים יש לעיין ביומן השינויים (וברשומה בבלוג) מלשונית הקישורים שלהלן.

View File

@ -0,0 +1 @@
Ndandani dekripsi fungsi jeneng regex sing ndadekake YouTube ora bisa digunakake.

View File

@ -0,0 +1 @@
Ngupdate SoundCloud client_id kanggo ndandani permasalahan SoundCloud.

View File

@ -0,0 +1 @@
Ing rilis iki situs Youtube wes di anyarke. Situs modhel lawas bakal dimandhegake ing Maret lan Sampeyan kudu nganyari NewPipe.

View File

@ -0,0 +1,7 @@
Ditingkatake
*Nyimpen lan mulihke lamun pitch lan tempo nyangkut utawa ora
*Dhukungan tampilan cutout ing pamuter
*Tampilan bunder lan pencacah pelanggan
*Ngoptimakle Youtube supaya nggunakake data kang luwih sithik
Luwih seka 15 bug kaitane karo Youtube sik wes dibenakke ing rilis iki.

View File

@ -0,0 +1 @@
NewPipe ora migunakake pustaka kerangka kerja Google, utawa API Youtube. NewPipe namung migunakake informasi situs kanggo njupuk informasi kang dibutuhake. Mula iku, NewPipe isa digunakke ing piranti tanpa Layanan Google. Sampeyan uga ora mbutuhake akun Youtube kanggo migunakake NewPipe, lan aplikasi iki FLOSS.

View File

@ -0,0 +1 @@
Tampilan ngarep gratis Youtube ingkang enteng kanggo Android

View File

@ -1 +1 @@
NewPipe nenaudoja jokių Google paslaugų ar Youtube API. Programa tik paima informaciją kurios jai reikia. Dėlto NewPipe nereikia įdiegtų Google paslaugų. Taipogi jums nereikia Youtube paskyros norint naudoti NewPipe, tai yra FLOSS.
NewPipe nenaudoja jokių Google struktūrinių bibliotekų ar YouTube API. Ji tik analizuoja svetainę, kad gautų reikiamą informaciją. Todėl šią programėlę galima naudoti įrenginiuose, kuriuose nėra įdiegtos Google paslaugos. Be to, norint naudoti NewPipe, jums nereikia YouTube paskyros ir visa tai yra FLOSS (nemokama/libre/atvirojo kodo programinė įranga).

View File

@ -1 +1 @@
Nemokama ir lengva "YouTube" sąsaja skirta "Android".
Nemokama ir lengva YouTube sąsaja, skirta Android.

View File

@ -0,0 +1,10 @@
• Dodano opcję bezpośr. otw. odtw. na pełnym ekranie
• Umożl. wybór typów sugestii wyszukiw. do wyświetl.
• Ciemniejszy ciemny motyw + dodano ciemny ekran powitalny
• Ulepsz. selektor plików do wyszarzania niechcianych plików
• Napraw. import. subskrypcji YouTube
• Ponowne odtw. strumienia wymaga ponownego dotknięcia przycisku odtw.
• Napraw. zamykanie sesji audio
• [Android TV] Napraw. długie przeskoki paska wyszukiw. przy korzystaniu z DPada
Reszta zmian w dzienniku zmian w linkach poniżej.

View File

@ -0,0 +1,10 @@
### Вдосконалено
* Сповіщення про оновлення збірки застосунку GitHub (#1608 @krtkush)
* Поліпшено завантажувач (#1944 @kapodamy):
* додано відсутні білі піктограми й застосовано хардк-спосіб зміни кольорів піктограм
* перевірка ініціалізації ітератора (#2031)
* дозволено повторне завантаження з помилкою «після обробки не вдалося» в новому muxer
* новий MPEG-4 muxer виправив неузгодженість відео й аудіо (#2039)
### Виправлено
* Переривання прямих трансляції YouTube (#1996 @yausername)

View File

@ -0,0 +1,12 @@
Зміни в 0.17.3
Поліпшення
• Можливість очищення станів відтворення #2550
• Можливість вибору схованих каталогів #2591
• Підтримка відкриття URL екземплярів «invidio.us» #2488
• Додано підтримку URL «music.youtube.com» TeamNewPipe/NewPipeExtractor#194
Виправлено
• [YouTube] 'java.lang.IllegalArgumentException #192
• [YouTube] не працювали прямі трансляції TeamNewPipe/NewPipeExtractor #195
• Проблему швидкодії android pie під час завантаження трансляцій #2592

View File

@ -0,0 +1,14 @@
Вдосконалено
• Нові заголовки доступності для людей з вадами зору #2655
• Мова налаштування теки завантажень послідовніша та однозначніша #2637
Виправлено
• Перевірка завантаження останнього байта блоку #2646
• Виправлено прокручування деталей відео #2672
• Вилучено повтор анімацій вікна пошуку #2695
• [SoundCloud] Виправлено витяг client_id #2745
Розвиток
• Додано відсутні залежності, успадковані з NewPipeExtractor #2535
• Перехід на AndroidX #2685
• Оновлено до ExoPlayer 2.10.6 #2697, #2736

View File

@ -0,0 +1,16 @@
Нове
• Підтримка коментарів SoundCloud
• Налаштування режиму обмеження YouTube
• Показ деталей батьківського каналу PeerTube
Вдосконалено
• Показ кнопки Kore лише підтримуваних служб
• Блокування жестів програвача, що починаються з панелі навігації стану
• Новий колір тла кнопок повторної спроби й підписки залежно від кольору служби
Виправлено
• Зависання вікна завантаження
• «Відкрити в переглядачі» точно відкриває браузер
• Збої відкриття відео та «Не вдалося відтворити цей потік»
і більше

View File

@ -0,0 +1,9 @@
• Нове: відтворення відео на сторінці подробиць, проведіть пальцем вниз, щоб згорнути програвач
• Повідомлення MediaStyle: налаштовувані дії у сповіщеннях, покращення швидкодії
• базова зміна розміру у NewPipe для ПК
• показ діалогового вікна з відкритими опціями у разі непідтримуваної URL
• Покращено пропозиції пошуку, коли віддалені не вдається отримати
• Підвищена типова якість відео до 720p60 (програвач у застосунку) та 480p (спливний програвач)
• виправлення помилок тощо

View File

@ -0,0 +1,10 @@
Об'єднано дії в черзі
• Жест двома пальцями, щоб закрити програвач
• Дозволено очищення cookie reCAPTCHA
• Можливість не забарвлювати сповіщення
• Поліпшено відкриття подробиць відео, щоб виправити нескінченну буферизацію та поведінку надсилання з NewPipe тощо
• Прискорено відео YouTube і виправлено обмеження віку
• Виправлено збої перемотування вперед/назад
• Списки не перевпорядковуються перетягуванням ескізів
• Завжди пам'ятати властивості спливного вікна
• Додано мову Санталі

View File

@ -0,0 +1,15 @@
Нове та вдосконалене:
• Повторно додана опція ховання ескізу на екрані блокування
• Потягніть, щоб оновити стрічку
• Покращена швидкодія отримання локальних списків
Виправлено:
• Збої запуску NewPipe після його видалення з оперативної пам’яті
• Збої запуску, коли немає з'єднання з інтернетом
• Дотримання параметрів яскравості та жестів
• [YouTube] Виправлені довгі списки відтворення
Інше:
• Очищення коду та кілька внутрішніх удосконалень
• Оновлення залежностей
• Оновлення перекладів

View File

@ -0,0 +1,12 @@
• [YouTube] Підтримка міксів
• [YouTube] Показ відомостей про суспільних мовників та Covid-19
• [media.ccc.de] Додано останні відео
• Додано переклад сомалійською
• Багато внутрішніх поліпшень
• Виправлено спільне використання відео в програвачі
• Виправлено порожню ReCaptcha у вебперегляді
• Виправлена помилка, яка ставалася під час видалення потоку зі списку
• [PeerTube] Виправлено пов’язані потоки
• [YouTube] Виправлено пошук у YouTube Music

View File

@ -0,0 +1,8 @@
• Додано підтримку розділів елементами керування програвачем
• [PeerTube] Додано пошук Sepia
• Повторно додано кнопку поділитися до детального перегляду відео, переміщено опис потоку у макет вкладки
• Вимкнено відновлення яскравості, якщо жест яскравості вимкнено
• Новий пункт списку відтворення відео у kodi
• Виправлено збої, коли на пристрої не встановлено типовий переглядач
• Перемикання відтворення апаратною кнопкою пробіл у повноекранному програвачі
• [media.ccc.de] Виправлення й покращення

View File

@ -0,0 +1,14 @@
Нове:
• Нова служба: Bandcamp
Поліпшено:
• Нова опція дотримування теми пристрою
• Запобігання збоям показом покращеної панелі помилок
• Більше інформації чому вміст недоступний
• Апаратна кнопка пробілу для відтворення/паузи
• Показ «Завантаження розпочато»
Виправлено:
• Дуже маленькі мініатюри в подробицях відео під час відтворення у фоновому режимі
• Порожній заголовок у згорнутому програвачі
• Виправлено помилку, через яку останній розмір не відновлюється належним чином

View File

@ -0,0 +1,11 @@
Нове
• Показ метаданих вмісту (мітки, категорії, ліцензія, ...) під описом
• Опція «Показати деталі каналу» віддалених добірок
• Опція «Відкрити у переглядачі» у меню тривалого натискання
Виправлено
• Збої на сторінці відомостей про відео
• Кнопка «Відтворити у Kodi» у програвачі завжди просила встановити Kore
• Налаштування шляхів імпорту та експорту
• [YouTube] Виправлено кількість вподобань коментарів
І багато іншого

View File

@ -0,0 +1,14 @@
Нове
Розпізнання міток часу й хештегів у описі
Ручне налаштування режиму планшета
Можливість ховати відтворені елементи у стрічці
Вдосконалено
Правильна підтримка фреймфорку доступу до сховища
Краща обробка помилок недоступних та припинених каналів
Панель спільного доступу на Android 10+ тепер показано у заголовок вмісту.
Оновлено екземпляри Invidious та підтримка канальних посилань.
Виправлено
[YouTube] Вміст із віковими обмеженнями
Витоки вікна Винятків під час відкриття вікна вибору

View File

@ -0,0 +1,17 @@
Нове
• Попередній перегляд ескізів під час пошуку
• Виявлення вимкнених коментарів
• Дозволено позначити елемент каналу переглянутим
• Сердечка коментарів
Поліпшено
• Макет метаданих та міток
• Компоненти UI кольору служби
Виправлено
• Ескіз у мініпрогравачі
• Нескінченну буферизацію повторюваних елементів черги
• Обертання та швидше закриття програвача
• ReCAPTCHA залишилася завантаженою у фоновому режимі
• Вимкнено натискання під час оновлення каналу
• Деякі збої завантажувача

View File

@ -0,0 +1,10 @@
• Відкривайте програвач одразу у повноекранному режимі
• Дозволено обирати типи пошукових
• Ще темніша темна тема
• Сірий колір небажаних файлів у оглядачі файлів
• Виправлено імпортування підписок YouTube
• Повторне відтворення потоку вимагає повторного натискання кнопки відтворення
• Виправлено закриття аудіосеансу
• [Android TV] Виправлено стрибки на панелі переходів під час користування DPad
Щоб переглянути інші зміни, перегляньте журнал змін (і запис блогу) на вкладці посилання унизу.

View File

@ -0,0 +1,10 @@
- 增加了直接打开全屏播放器的选项
- 允许选择显示哪些类型的搜索建议
- 加深深色主题,增加了深色启动屏幕
- 改进了文件选择器,使无关文件变成灰色
- 修复YouTube订阅导入
- 重放一个视媒体需要再次点击重放按钮
- 修复关闭音频会话
- [Android TV] 修正了使用DPad时长寻址栏的跳动。
进一步了解全部变化,请从下列链接查看更新日志(与博客文章)。