diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a876df8fd..b87219f4f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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' diff --git a/app/build.gradle b/app/build.gradle index a9a4e7001..61407c2a7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 3c2866c94..2b308671a 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -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); diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java index c8b6969c6..0be427648 100644 --- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java @@ -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 diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index a18d15af3..a8fdcae26 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -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 diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index 66d5e6831..228c17f8c 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -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 + } + } + } + } } } diff --git a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java index cd6a882ae..555dd709b 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java @@ -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); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index ecf235abc..5a30ea0f3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -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); } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index ae661cfa3..c30b6fc05 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -350,12 +350,16 @@ public abstract class BaseListFragment extends BaseStateFragment if (context == null || context.getResources() == null || activity == null) { return; } - final List 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, diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 941035b07..dcda6db0b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -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 .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; }); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 513fbbc91..f3aa2e306 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -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 { final ArrayList 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 { 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; }); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 5ff2f4788..7de212383 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -215,6 +215,7 @@ public class SearchFragment extends BaseListFragment { - 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 diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 42fb8915d..b3619276d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -326,9 +326,14 @@ class FeedFragment : BaseStateFragment() { if (context == null || context.resources == null || activity == null) return val entries = ArrayList() - 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( diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java index 6a7a300ca..9632b47f7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java @@ -338,9 +338,14 @@ public class StatisticsPlaylistFragment final ArrayList 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, diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 40a7b26e2..21da9e571 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -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 { - 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 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( diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index dd5468f69..5ad855e78 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -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 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++; diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java index 68de8ce9f..46239cab1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java @@ -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; diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 859bfa31d..fd54ce4eb 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -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 Intent getPlayerIntent(@NonNull final Context context, @NonNull final Class 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 Intent getPlayerIntent(@NonNull final Context context, @NonNull final Class 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 Intent getPlayerEnqueueIntent(@NonNull final Context context, @NonNull final Class 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 Intent getPlayerEnqueueNextIntent(@NonNull final Context context, + @NonNull final Class 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()); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java index c64631b72..160eb59cd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java @@ -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) { diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java index 6245d6f14..ec51cc370 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java @@ -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) -> { diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java index 39ec51ce4..240341ab0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java @@ -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; } diff --git a/app/src/main/res/layout-large-land/player.xml b/app/src/main/res/layout-large-land/player.xml index f55632174..f3d11c6a2 100644 --- a/app/src/main/res/layout-large-land/player.xml +++ b/app/src/main/res/layout-large-land/player.xml @@ -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" /> diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 77842c0df..d304ca672 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -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" /> @@ -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" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 5626aa370..220738f83 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -697,4 +697,22 @@ اقتراحات البحث عن بعد اقتراحات البحث المحلية اسحب العناصر لإزالتها + + اكتمل %1$s التنزيل + اكتمل %1$s التنزيل + اكتمل %1$s التنزيل + اكتملت %1$s التنزيلات + اكتملت %1$s التنزيلات + اكتملت %1$s التنزيلات + + + اكتمل التنزيل + اكتمل التنزيل + اكتمل التنزيل + اكتمل تنزيل%s + اكتملت التنزيلات%s + اكتملت التنزيلات%s + + لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة + بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة \ No newline at end of file diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index 3c8a6af04..9670c318d 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -647,14 +647,14 @@ 远程搜索建议 本地搜索建议 - 删除了 %1$s 个下载 - + 删除了 %1$s 个下载 - 完成了 %s 个下载 - + 完成了 %s 个下载 滑动项目以删除它们 - 若自动旋转被锁定,不在以小窗播放器形式中播放视频,而直接切换到全屏模式。仍可以通过退出全屏以切换至小窗播放器。 + 若自动旋转被锁定,不在以小窗播放器形式中播放视频,而直接切换到全屏模式。仍可以通过退出全屏以切换至小窗播放器 以全屏启动主播放器 + 已将下个视频加入队列 + 将下一个视频加入队列 \ No newline at end of file diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 7e18da6f1..b04048c5f 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -469,7 +469,7 @@ \n2. بچۆرەژوورەوە گەر داوای‌ کرد \n3. كرته‌ بكه‌ له‌ \"All data included\"، پاشان كرته‌ بكه‌ له‌ \"Deselect all\" ، پاشان ته‌نیا \"subscriptions\" هه‌ڵبژێره‌ پاشان كرته‌ له‌ \"OK\" بكه‌ \n4. كرته‌ بكه‌ له‌ \"Next step\" و دواتر له‌ \"Create export\" -\n5. كرته‌ بكه‌ له‌ \"Download\" پاشان +\n5. كرته‌ بكه‌ له‌ \"Download\" دوای دەرکەوتنی \n6. له‌ فایلی دابه‌زێنراودا فایلی .json ئێكستراكت بكه‌ و لێره‌دا هاورده‌ی بكه‌. به‌پێی سیستەم کێشە لە هێڵەکەتدا هەیە @@ -654,4 +654,16 @@ پێشنیازکراوەکانی گەڕانی ڕیمۆت پێشنیازکراوەکانی گەڕانی نێوخۆیی دیارکردن وەک بینراو + پیشاندانی ڕێنمایی لەکاتی کرتە کردن لە پاشبنەما یاخود دوگمەی پەنجەرە لە \"وردەکارییەکان\" ی ڤیدیۆکە. + + %1$s دابەزێنراو سڕایەوە + %1$s دابەزێنراو سڕانەوە + + + دابەزاندن تەواوبوو + %s دابەزاندن تەواوبوون + + لادانی بابەتەکان بە سواندنیان + لە حاڵەتێکدا کە لاربوونەوە ناکارا کرابوو ، ئەوا لەجیاتی لێدانی ڤیدیۆکان لە لێدەرێکی بچووکدا ، ڕاستەوخۆ ڤیدیۆکان لە دۆخی پڕ بە ڕوونمادا لێبدرێن. دەتوانیت بە دەرچوونت لەسەر ڤیدیۆکە بەردەوام بیت لەسەر لێدەرێکی بچووک + دەستپێکردنی لێدەری سەرەکی لە ڕوونماپڕ \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d2ed2499d..b1675d6de 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -603,7 +603,7 @@ Zbořit aplikaci Stahování bylo zahájeno Můžete si zvolit svůj oblíbený motiv níže - Zvolte si svůj oblíbený noční motiv -- %s + Zvolte si svůj oblíbený noční motiv - %s Automatický (motiv zařízení) Radio Představujeme diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f296aeb56..6fc93fb69 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -665,6 +665,8 @@ %s Downloads abgeschlossen Wische über Elemente, um sie zu entfernen - 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. + 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 Hauptplayer im Vollbildmodus starten + Als Nächstes eingereiht + Als Nächstes in Wiedergabe einreihen \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 673d93aa9..3d4343195 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -303,7 +303,8 @@ \n3. Πατήστε το «Περιλαμβάνονται όλα τα δεδομένα του YouTube», στη συνέχεια «Κατάργηση επιλογής όλων» και επιλέξτε μόνο το «συνδρομές» και «ΟΚ». \n4. Πατήστε «Επόμενο βήμα» και μετά «Δημιουργία εξαγωγής». \n5. Πατήστε «Λήψη» όταν εμφανιστεί. -\n6. Από το ληφθέν αρχείο zip εξάγετε το αρχείο «συνδρομές.json» και εισάγετε το εδώ. +\n6. Πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο zip. +\n7. Αν η εισαγωγή από το zip αποτύχει, εξάγετε το αρχείο .csv (συνήθως βρίσκεται στο \"YouTube και YouTube Music/subscriptions/subscriptions.csv\"), πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο csv. Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας: \n \n1. Ενεργοποιήστε τη λειτουργία «Desktop mode» στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά) @@ -664,4 +665,8 @@ %s λήψεις ολοκληρώθηκαν Απομάκρυνση αντικειμένων με σύρσιμο + Εκκίνηση των βίντεο σε πλήρη οθόνη και όχι σε αναδυόμενο παράθυρο, αν η αυτόματη περιστροφή της οθόνης είναι ανενεργή. Μπορείτε να ενεργοποιήσετε το αναδυόμενο παράθυρο βγαίνοντας από την πλήρη οθόνη. + Εκκίνηση κύριου αναπαραγωγού σε πλήρη οθόνη + Προστέθηκε το επόμενο στην ουρά + Προσθήκη επόμενου στην ουρά \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 60d4fd184..79807facf 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -668,4 +668,6 @@ %s descargas finalizadas Desliza los elementos para removerlos + 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 + Iniciar reproductor principal en pantalla completa \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 5d2475369..dec03feef 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -665,4 +665,6 @@ Allalaadimine lõppes %s allalaadimist lõppesid + 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 + Käivita meediamängija täisekraanivaates \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index dfa29f08d..d79c6ce27 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -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. +\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 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 @@ Urruneko bilaketaren iradokizunak Tokiko bilaketa-iradokizunak Ikusi gisa markatu + Lerratu elementuak aldetara ezabatzeko + Ez hasi bideoak mini erreproduzitzailean eta hasi bideoak pantaila osoan zuzenean, auto biraketa blokeatuta badago. Mini erreproduzitzailea erabili dezakezu pantaila osotik irtetzean + Hasi erreproduzitzaile nagusia pantaila osoan \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 6fc412c68..e66825b96 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -665,6 +665,8 @@ بار کردن جزییات کانال… خطا در نمایش جزییات کانال برای برداشتن موارد، بکشیدشان - اگر چرخش خودکار قفل باشد، ویدیوها را در پخش‌کنندهٔ کوچک آغاز نمی‌کند، بلکه مستقیماً به تمام‌صفحه می‌رود. همچنان می‌توانید با خروج از تمام‌صفحه به پخش‌کنندهٔ کوچک دسترسی داشته باشید. + اگر چرخش خودکار قفل باشد، ویدیوها را در پخش‌کنندهٔ کوچک آغاز نمی‌کند، بلکه مستقیماً به تمام‌صفحه می‌رود. همچنان می‌توانید با خروج از تمام‌صفحه به پخش‌کنندهٔ کوچک دسترسی داشته باشید آغاز پخش‌کنندهٔ اصلی در تمام‌صفحه + بعدی در صف گذاشته شد + در صف گذاشتن بعدی \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 841bf5dce..91f07827b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -667,6 +667,7 @@ %s téléchargements terminés Balayez un élément pour le supprimer - 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. + 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 Lancer le lecteur principal en plein écran + Mettre en file d’attente la suivante \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7bb08e207..185fdda9a 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -10,7 +10,7 @@ Abrir no modo popup Compartillar Descarregar - Descargar o ficheiro de transmisión + Descargar o ficheiro de emisión Procurar Opcións Non querería dicir \"%1$s\"\? diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index f693ad374..6bc06eb3e 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -689,6 +689,8 @@ %s הורדות הסתיימו ניתן להחליק פריטים להסרתם - לא להפעיל סרטונים בנגן המוקטן, לעבור למצב מסך מלא ישירות במקום זאת, אם הטיה אוטומטית מושבתת. עדיין ניתן לגשת לנגן המוקטן על ידי יציאה ממסך מלא. + לא להפעיל סרטונים בנגן המוקטן, לעבור למצב מסך מלא ישירות במקום זאת, אם הטיה אוטומטית מושבתת. עדיין ניתן לגשת לנגן המוקטן על ידי יציאה ממסך מלא הפעלת הנגן הראשי במסך מלא + נוסף כהבא בתור + הוספה כהבא בתור \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 78705499f..af9d529d3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -665,4 +665,8 @@ %s download completati Scorri gli elementi per rimuoverli + 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 + Avvia il lettore principale a schermo intero + Aggiunto alla coda come prossimo + Accoda come prossimo \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 978edcfb3..769a31b52 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -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\" の下にある) を抽出し、ここにインポートします。 +\n3. \"すべて選択\" をクリックし、そして \"選択をすべて解除\" をクリック、そして \"登録チャンネル\" のみを選択し、\"OK\" をクリック +\n4. \"次のステップ\" をクリックし、そして \"エクスポートを作成\" をクリック +\n5. 表示されたら \"ダウンロード\" ボタンをクリック +\n6. ファイルからインポートをクリックしてダウンロードした zip ファイルを選択 +\n7. (インポートが失敗したら) csv ファイル (たいてい、\"YouTube と YouTube Music/登録チャンネル/登録チャンネル.csv\" にある) を抽出し、ファイルからインポートをクリックして抽出した csv ファイルを選択 リセット 同意する 拒否する @@ -643,4 +644,14 @@ リモート検索候補 ローカル検索候補 アイテムをスワイプして削除 + 直接フルスクリーンモードに切り替えて、ミニプレイヤーで動画を開始しません。自動回転がロックされている場合でも、フルスクリーンを終了することでミニプレイヤーにアクセスできます + フルスクリーンでメインプレイヤーを開始 + + %1$s つのダウンロードを削除しました + + + %s つのダウンロードが完了しました + + ピカソは、画像の上に、画像の出所を識別する色彩記章を表示します: 赤はネットワーク、青はディスク、緑はメモリ + 画像に標識を表示 \ No newline at end of file diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index dfdd865dc..35f5b075e 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -69,8 +69,8 @@ Buka nang Browser Orasido Pasang - Ra ono pemuter (kowe iso pasang VLC gae muter iku). - Raono pemuter. Pasang VLC\? - Diterbitke %1$s - Pencet \"Cari\" nek meh mulai + Ra ono pamuter (Sampeyan iso masang VLC kanggo muter iku). + Pamuter ora ditemokke. Pasang VLC\? + Diterbitake ing %1$s + Pencet suryakanta kanggo nglekasi \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index a5da35b98..dae17e3ff 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -26,11 +26,11 @@ Pasirinkite atsisiuntimų aplankalą garso įrašams Numatytoji raiška Numatytoji išokančiojo lango raiška - Rodyti aukštesnes raiškas + Rodyti didesnes raiškas Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą Groti su Kodi Įdiegti nereastą Kore programėlę\? - Rodyti \"Peržiūra su Kodi\" pasirinkimą + Rodyti „Peržiūra su Kodi“ pasirinkimą Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą Garso įrašas Numatytasis garso formatas @@ -44,7 +44,7 @@ Paieškos nuspėjimai Pasirinkite pasiūlymus, kurie bus rodomi ieškant Atsisiųsti - Rodyti „kitus” ir „panašius” vaizdo įrašus + Rodyti „Kitas” ir „Panašūs” vaizdo įrašus URL nepalaikoma Numatytoji turinio kalba Vaizdas ir garsas @@ -78,7 +78,7 @@ Kas nutiko: Kas:\\nUžklausa:\\nTurinio Kalba:\\nTurinio Šalis:\\nProgramėlės Kalba:\\nPaslauga:\\nGMT Laikas:\\nPaketas:\\nVersija:\\nOS versija: Jūsų komentaras (anglų kalba): - Detalės: + Išsami informacija: Vaizdo įrašo peržiūros miniatiūra Paleisti vaizdo įrašą, trukmė: Įkėlėjo naudotojo paveikslėlio miniatiūra @@ -106,7 +106,7 @@ Gijos Klaida NewPipe Atsiunčiama - Palieskite, kad peržiūrėtumėte detales + Palieskite, kad peržiūrėtumėte išsamią informaciją Prašome palaukti… Nukopijuota į iškarpinę Prašome pasirinkti galimą atsisiuntimų aplankalą @@ -126,9 +126,9 @@ Žiūrėjimo istorija Sekite peržiūrėtus vaizdo įrašus Paleisti - Tęsti grojimą po pertraukčių (pvz. skambučių) - Rodyti “laikyti kad pakeisti„ patarimą - Paspaudus \"Išsamiau:\" fono ar iššokančio lango mygtuke rodyti patarimą + Tęsti grojimą po pertraukimo (pvz. po skambučių) + Rodyti „Laikykite, kad pridėtumėte“ patarimą + Rodyti patarimą, kai vaizdo įraše „Išsami informacija“ paspausite foną arba iššokantįjį mygtuką Grotuvas Elgsena Istorija ir podėlis @@ -160,21 +160,21 @@ Raidės ir skaičiai Ypatingieji simboliai Apie NewPipe - Trečiųjų šalių leidimai + Trečiųjų šalių licencijos © %1$s %2$s pagal %3$s Apie - Leidimai - Laisvas transliavimas ant Android. + Licencijos + Nemokama, atviro kodo transliacijų peržiūros programėlė Android sistemai. Prisidėti - Jei turite idėjų dėl- vertimų, išvaizdos pakeitimų, kodo supaprastinimo, arba rimtų kodo pakeitimų- pagalba visada laukiama! + Jei turite idėjų dėl: vertimų, išvaizdos pakeitimų, kodo supaprastinimo, arba rimtų kodo pakeitimų - pagalba visada laukiama! Peržiūrėti per GitHub Paremti - 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. + 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. Duokite grąžos Interneto puslapis Kad sužinotumėte daugiau apie NewPipe apsilankykite mūsų interneto puslapyje. - NewPipe Leidimas - Skaityti leidimą + NewPipe licencija + Skaityti licenciją Istorija Istorija Ar norite ištrinti šį elementą iš paieškos istorijos? @@ -189,9 +189,9 @@ Top 50 Nauja ir karšta Pašalinti - Detalės + Išsami informacija Garso nustatymai - Laikykite kad įtraukti į eilę + Laikykite, kad įtrauktumėte į eilę Pradėti groti foniniame rėžime Pradėti groti langelio grotuve Nerastas srauto grotuvas (galite įdiegti VLC kad grotumėte). @@ -217,8 +217,8 @@ Sukurti Nutraukti Pervadinti - Paskutinis grotas - Daugiausiai grotas + Vėliausiai žiūrėta + Dažniausiai žiūrėta Eksportavimas baigtas Importavimas baigtas Netinkamas ZIP failas @@ -243,15 +243,15 @@ Grojaraštis sukurtas Pridėta į grojaraštį Grojaraščio paveikslėlis pakeistas. - Nėra antraštės + Jokių subtitrų Pritaikyti Užpildyti Priartinti - Automatiškai sugeneruotas + Automatiškai sugeneruoti Atminties nutekėjimo stebėjimas gali padaryti programėlę nestabilią Pranešti apie Out-of-Lifecycle klaidas Priverstinai pranešti apie \"undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal\" - Išjungti, kad paslėpti komentarus + Išjungti, kad būtų paslėpti komentarai Rodyti komentarus Pasirinkti skirtuką Atsisakyti prenumeratos @@ -313,7 +313,7 @@ Video maišos pranešimas Pranešimas apie naują NewPipe versija Programos atnaujinimo pranešimas - Failas + Failą Failas pašalintas Atlikėjai Albumai @@ -329,8 +329,8 @@ Šiam video taikomas amžiaus apribojimas \n \nĮjunkite \"%1$s\" norėdami peržiūrėti. - Youtube turi \"apribotą režimą\" kuriame slepiamas galimai suaugusiems skirtas turinys - Įjungti YouTube \"apribotą režimą\" + Youtube turi „apribotą režimą“ kuriame slepiamas galimai suaugusiems skirtas turinys + Įjungti YouTube „apribotą režimą“ Rodyti turinį kuris gali būti netinkamas vaikams (18+) Pranešimai Atnaujinimai @@ -341,22 +341,22 @@ Pasirinkite mėgiamiausias PeerTube kopijas PeerTube kopijos URL neatpažintas. Atverti kita programa\? - Auto atkūrimas + Automatinis atkūrimas Išvalyti duomenis Sąraše rodyti atkūrimo vietos indikatorių Vietos sąraše Naudoti gestus ryškumo valdymui - Ryškumo valdymo gestai + Ryškumo gesto valdymas Naudoti gestus garsumo valdymui Garsumo gesto valdymas Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę Metaduomenų saugykla išvalyta - Pašalinti visus išsaugotus puslapio duomenis + Pašalina visus išsaugotus puslapio duomenis Išvalyti išsaugotus metaduomenis Paveikslėlių saugykla išvalyta - Norėdami paslėpti meta duomenis info langeliuose su papildoma informacija apie srauto autorius ir turinį išjunkite + Išjunkite, kad paslėptumėte meta duomenis langeliuose su papildoma informacija apie srauto autorius ir turinį Rodyti meta duomenis Išjunkite norėdami paslėpti video aprašymą ir papildomą informaciją Naudoti greitą netikslų prasukimą @@ -385,19 +385,20 @@ Norėdami taupyti duomenų srautą, atminties naudojimą išjunkite. Pakeitimai išvalys duomenis atmintyje ir diske Įkelti miniatiūras Aktyvaus grotuvo eilė bus pakeista - Perjungiant iš vieno grotuvo į kitą gali pakeisti jūsų eilę + Perjungimas iš vieno grotuvo į kitą gali pakeisti jūsų eilę Prieš išvalant eilę prašyti patvirtinimo Greito prasukimo trukmė Netikslus prasukimas leidžia grotuvui greitai peršokti į kitą vietą su sumažintu tikslumu. 5, 15 ar 25 sekundės to nenaudoja - Importuokite \"YouTube\" prenumeratas iš \"Google Takeout\": + 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. - \"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. +\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ą + 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ą. 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 @@ Šis turinys prieinamas tik sumokėjusiems naudotojams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti. Šis vaizdo įrašas prieinamas tik \"YouTube Music Premium\" nariams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti. Išjunkite medijos tuneliavimą, jei vaizdo įrašo atkūrimo metu atsiranda juodas ekranas arba užstrigimas - Pakeiskite grotuvo antraštės teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą + Pakeiskite grotuvo subtitrų teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą Šis turinys yra privatus, todėl \"NewPipe\" jo negali transliuoti ar atsisiųsti. Ar norite išvalyti atsisiuntimų istoriją ar ištrinti visus atsisiųstus failus\? Laikas po paskutinio atnaujinimo, po kurio prenumerata laikoma pasenusia — %s @@ -420,7 +421,7 @@ NewPipe buvo uždaryta kol dirbo su failu Serveris nesiunčia duomenų Užmegzti saugaus ryšio nepavyko - Naudojant mobilius duomenis riboti raišką + Riboti raišką naudojant mobilius duomenis Automatiškai atkurti — %s Taip ir iš dalies žiūrėtus vaizdo įrašus Atstatyti parsiuntimo nepavyko @@ -495,10 +496,10 @@ Įjungti garsą Nutildyti Numatytasis veiksmas atveriant turinį — %s - Numatytasis \"atverti\" veiksmas + Numatytasis „atverti“ veiksmas Pridėta į eilę Pridėti į eilę - Rodyti kanalo detales + Rodyti kanalo išsamią informaciją Groti eilę Konferencijos Labiausiai patikę @@ -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. - Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į \"NewPipe\" privatumo politiką. Prašome atidžiai ją perskaityti. + 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. 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) 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 @@ Eiga prarasta, nes failas buvo panaikintas Failas šiuo pavadinimu jau egzistuoja Nepavyko sukurti paskirties aplanko - Kai įmanoma gauti iš atskiro kanalo + Kai įmanoma, gauti iš dedikuoto kanalo Elementams rodyti orginalų \"prieš\" laiką Nepavyksta prisijungti prie serverio Failo sukurti nepavyko @@ -615,7 +616,7 @@ Parsiųsti nepavyko Be limito jūsųID, soundcloud.com/jūsųid - Ankstesnis ekportavimas + Ankstesnio eksportavimo Importuoti failą Eksportuoti į Importuoti iš @@ -659,8 +660,8 @@ Nerodyti Širdelė nuo kurėjo Pažymėti kaip peržiūrėtą - Įkeliama kanalo informacija… - Klaida rodant kanalo informaciją + Įkeliama kanalo išsami informacija… + Klaida rodant kanalo išsamią informaciją Rodyti „Picasso“ spalvotas juosteles ant vaizdų, nurodančių jų šaltinį: raudona tinklui, mėlyna diskui ir žalia atmintis Rodyti vaizdo indikatorius Nuotolinės paieškos pasiūlymai @@ -676,4 +677,8 @@ %s atsiuntimų baigta Perbraukite elementus, kad juos pašalintumėte + 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 + Paleisti pagrindinį grotuvą viso ekrano režimu + Sekantis pridėtas į eilę + Įtraukti į eilę sekantį \ No newline at end of file diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index f4e573d62..f26e8a051 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -1,50 +1,50 @@ - सुरू गर्न \"खोज\" चिन्ह दबाउनु होस + सुरू गर्न \"खोज\" चिन्ह दबाउनुहोस् %1$s मा प्रकाशित कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ\? - कुनै स्ट्रीम प्लेयर फेला परेन (तपाइँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)। + कुनै स्ट्रिम प्लेयर फेला परेन (तपाईँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)। इन्स्टल गर्नुहोस् रद्द गर्नुहोस् ब्राउजरमा खाेल्नुहाेस् पपअप मोडमा खोल्नुहोस् - सेयर + साझा गर्नुहोस् डाउनलोड - स्ट्रीम डाउनलोड गर्नुहोस् - खोजी - सेटिङ - के तपाईको मतलब %1$s हो\? - बांडनुहोस् + स्ट्रिम् डाउनलोड गर्नुहोस् + खोज्नुहोस् + सेटिङ्गहरु + के तपाईंको मतलब \"%1$s\" हो\? + साझा गर्नुहोस् अन्य भिडियो प्लेयर प्रयोग गर्नुहोस् - केही रेसोलुशनहरूमा अडियो हटाउँदछ + कुनै भिडियो रेजोलुसनहरुमा अडियो हट्न सक्छ अन्य अडियो प्लेयर प्रयोग गर्नुहोस् - सब्सक्राइब - सब्सक्राइब गरिएको + सदस्यता लिनुहोस् + सदस्यता लिईएको सदस्यता रद्द गर्नुहोस् च्यानल सदस्यता रद्द गरियो सदस्यता परिवर्तन गर्न सकिएन सदस्यता अपडेट गर्न सकिएन जानकारी देखाउनुहोस् सदस्यताहरु - बुकमार्क गरिएको प्लेलिस्टहरू - ट्याब छनौट गर्नुहोस् + बुकमार्क गरिएका प्लेलिस्टहरू + ट्याब छनोट गर्नुहोस् पृष्ठभूमि पपअप - थप्नुहोस + मा थप्नुहोस् भिडियो डाउनलोड फोल्डर - डाउनलोड भिडियो फाइलहरू यहाँ भण्डारण छन् - भिडियो फाइलहरू लागि डाउनलोड फोल्डर चयन गर्नुहोस् + डाउनलोड गरिएका भिडियो फाइलहरू यहाँ भण्डारण छन् + भिडियो फाइलहरूका लागि डाउनलोड फोल्डर चयन गर्नुहोस् अडियो डाउनलोड फोल्डर - डाउनलोड अडियो फाइलहरू यहाँ भण्डारण छन् - अडियो फाइलहरू लागि डाउनलोड फोल्डर चयन गर्नुहोस् - पूर्वनिर्धारित संकल्प - पूर्वनिर्धारित पपअप संकल्प - उच्च रिजोल्युसन देखाउ - मात्र केही उपकरणहरू 2k/4K भिडियो प्ले गर्न सक्छन - Kodi संग खोल्नुहोस - \'Kore\' एप छैन | हाल्न चाहनुहुन्छ\? - \"Kodi संग प्ले\" विकल्प देखाउ - (Kodi) कोडि मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प प्रदर्शन + डाउनलोड गरिएका अडियो फाइलहरू यहाँ भण्डारण छन् + अडियो फाइलहरूका लागि डाउनलोड फोल्डर चयन गर्नुहोस् + पूर्वनिर्धारित रेजोलुसन + पूर्वनिर्धारित पपअप रेजोलुसन + उच्च रेजोलुसन देखाउनु + केवल केही डिभाइसहरू मात्र 2k/4K भिडियो चलाउन सक्छन् + Kodi सँग चलाउनुहोस् + \'Kore\' एप छैन, इन्स्टल गर्न चाहनुहुन्छ\? + \"Kodi सँग प्ले\" विकल्प देखाउनु + Kodi मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प देखाउनु अडियो पूर्वनिर्धारित अडियो ढाँचा पूर्वनिर्धारित भिडियो प्रारूप @@ -165,7 +165,7 @@ बचत गरिएका ट्याबहरू पढ्न सकिएन, पूर्वनिर्धारित प्रयोग गरिदै फेरी पहिलाकै अवस्थामा लैजाऊ तपाईं पूर्वनिर्धारित पुनर्स्थापना गर्न चाहनुहुन्छ\? - माफ गर्नुहोस्, त्यो हुनु हुँदैनथ्यो। + माफ गर्नुहोस्, त्यस्तो हुनु हुँदैनथियो। ई-मेल मार्फत यो त्रुटि रिपोर्ट माफ गर्नुहोस्, केही त्रुटिहरू भयो। रिपोर्ट @@ -179,27 +179,27 @@ अपलोडरको अवतार थम्बनेल मनपर्दो मन नपर्ने - कुनै परिणाम - यहाँ केही छैन + कुनै परिणामहरु छैनन् + यहाँ झ्याउँकिरी बाहेक केहि पनि छैन पुन: क्रमबद्ध गर्न तान्नुहोस् भिडियो अडियो पुन: प्रयास - K - एम + हजार + करोड अर्ब - शून्य चयन छैन प्राप्त (केही भाषामा) यो एन्ड्रोइड लागि \"विशेष मामला\" छैन रूपमा + कुनै सदस्यहरू छैनन् %s सदस्य - %s सदस्यहरु + %s सदस्यहरू - उपलब्ध गणना सदस्य - कुनै दृश्य + सदस्य संख्या उपलब्ध छैन + कसैले हेर्नुभएको छैन - % हेरियो - %s पटक हेरियो + %s पटक हेरिएको + %s पटक हेरिएको - कुनै भिडियो + कुनै भिडियो छैन प्रत्रिक्रिया छैन मिशन पज @@ -417,12 +417,12 @@ सबै प्लेब्याक स्थानहरु मेटाउँछ सबै प्लेब्याक स्थान मेटाउने\? सेवा टगल गर्नुहोस्, हाल चयन गरिएको: - कुनै एक हेरिरहनुभएको छ + कसैले हेर्दै हुनुहुँदैन - %s हेर्दै - %s जना हेर्दै छन् + %s जना हेर्दै हुनुहुन्छ + %s जना हेर्दै हुनुहुन्छ - कुनै एक सुनिरहेको छ + कसैले सुन्दै हुनुहुन्न %s श्रोता %s श्रोताहरु @@ -516,7 +516,7 @@ हेरिसकेको हटाउनुहोस सेवाहरूबाट मूल पाठहरू स्ट्रिम वस्तुहरूमा देखिने छन् आईटमहरूमा मूल समय पहिले देखाउनुहोस् - आनंत भिडियोहरू + अनगिन्ति भिडियोहरू १००+ भिडियोहरू कलाकारहरू एल्बमहरू @@ -531,4 +531,20 @@ \n… \nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ। हो र आंशिक रूपमा हेरिएको भिडियोहरू + सूचना पाटी रंगिन बनाउनु + केहि छैन + Buffering हुँदै + Shuffle गर्नु + दोहोर्‍याउनु + हरेक सूचना कार्यमा थिचेर परिवर्तन गर्नुहोस्। तपाईंले तीमध्धे तीनवटासम्म सूचना पाटीमा राख्न सक्नुहुन्छ, त्यसको लागि दाँयाँ बक्समा ठिक लगाउनुहोस्। + पाँचौ कार्य बटन + चौथो कार्य बटन + पहिलो कार्य बटन + दोस्रो कार्य बटन + तेस्रो कार्य बटन + थम्बनेल १:१ अनुपातमा परिवर्तन गर्नु + भिडियोको सूचना केन्द्रमा रहेको थम्बनेललाई १६:९ बाट १:१ अनुपातमा परिवर्तन गर्नु (यसको कारणले गर्दा बाङ्गोटेढो हुन सक्छ) + %s : का लागि परिणामहरु देखाइँदैछ + सँँग खोल्नुहोस् + हेरेको भनि चिन्ह लगाउनुहोस् \ No newline at end of file diff --git a/app/src/main/res/values-night-v21/styles.xml b/app/src/main/res/values-night-v21/styles.xml new file mode 100644 index 000000000..eb39dee38 --- /dev/null +++ b/app/src/main/res/values-night-v21/styles.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ff899bbf6..7c988ee3e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -260,7 +260,7 @@ 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 Wyczyszczono pamięć podręczną miniatur Wyczyść pamięć podręczną metadanych - Wyczyść pamięć podręczną stron + Usuwa całą pamięć podręczną stron Wyczyszczono pamięć podręczną metadanych Automatyczne kolejkowanie następnego strumienia Gdy kończy się kolejka odtwarzania, dodaj do niej kolejną powiązaną pozycję @@ -625,7 +625,7 @@ Pokaż szczegóły kanału Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś czarny ekran bądź brak płynności odtwarzania wideo Wyłącz tunelowanie multimediów - Ograniczenie wieku + Ograniczenie wiekowe Wyłącz zaznaczanie tekstu w opisie Włącz zaznaczanie tekstu w opisie Wewnętrzny @@ -686,4 +686,6 @@ Przesuń w bok elementy, aby je usunąć 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 Uruchamiaj główny odtwarzacz w trybie pełnoekranowym + Dodano do kolejki (następny) + Dodaj do kolejki (następny) \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 60bbd33e8..0fc71d1fd 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -169,14 +169,15 @@ País padrão para conteúdo Aplicação livre de reprodução de emissões para Android. Idioma padrão para conteúdo - Importar subscrições YouTube do Google Takeout: + 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. +\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 Ativar reprodutor em segundo plano Desafio reCAPTCHA solicitado Reprodução automática @@ -480,7 +481,7 @@ Vídeos Meta-dados em cache limpos Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup - Não foi encontrado um reprodutor (pode instalar VLC para reproduzir). + Nenhum reprodutor foi encontrado (pode instalar VLC para reproduzir). Ser-lhe-á perguntado onde guardar cada descarga. \nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo Mostrar opção \"Reproduzir no Kodi\" @@ -655,4 +656,17 @@ Mostrar indicadores de imagem Sugestões de pesquisa remotas Sugestões de pesquisa locais + + %1$s descarga apagada + %1$s descargas apagadas + + + Descarga concluída + %s descargas concluídas + + Deslizar itens para removê-los + 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 + Iniciar o reprodutor principal em ecrã cheio + Enfileirado o próximo + Enfileirar o próximo \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 4255bff3b..a1b9bd296 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -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 Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n @@ -665,4 +665,8 @@ %s descargas concluídas Deslizar itens para removê-los + 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 + Iniciar o reprodutor principal em ecrã cheio + Enfileirado o próximo + Enfileirar o próximo \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 143f02157..2ed8891c7 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -5,20 +5,20 @@ Instalare Anulare Deschidere în browser - Partajare + Distribuiți Descărcare Căutare Setări V-ați referit la: %1$s \? - Partajează cu - Folosește un player video extern + Distribuiți cu + Folosiți un player video extern Folosește un player audio extern Locația videoclipurilor descărcate Videoclipurile descărcate sunt stocate aici - Alegeți locația unde se vor descărca clipurile video - Directorul audio-ului descărcat - Locul în care se vor descărca fișierele audio - Alegeți locația în care se vor descărca fişierele audio + Alegeți folderul de descărcare pentru fișierele video + Dosar de descărcări audio + Fișierele audio descărcate sunt stocate aici + Alegeți folderul de descărcare pentru fișierele audio Rezoluție implicită Redați folosind Kodi Aplicația Kore nu a fost găsită. Doriți să o instalați? @@ -50,7 +50,7 @@ Thumbnail-ul avatarului autorului Au apreciat Nu au apreciat - Apăsați pe lupă pentru a începe + Apăsați pe lupă pentru a începe. În direct Descărcări Descărcări @@ -84,7 +84,7 @@ \ndeschide în mod pop-up Provocare reCAPTCHA reCAPTCHA nouă cerută - Rezoluție pop-up inițială + Rezoluția implicită a ferestrei pop-up Afișează rezoluții mai mari Doar anumite dispozitive suportă redarea videoclipurilor 2K/4K Format video implicit @@ -98,7 +98,7 @@ k mil. mld. - Sterge sunetul la anumite rezolutii + Elimină sunetul audio la anumite rezoluții Fundal Pop-up Reține dimensiunea și poziția pop-up-ului @@ -180,17 +180,17 @@ Descărcați fișierul de vizionat Arată informații Playlist-uri salvate - Adaugă La + Salvează în Folosește parcurgerea inexactă - 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. + 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. Încarcă miniaturi - 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. + 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 Datele cache de imagini au fost șterse Șterge cache-ul pentru metadata Șterge cache-ul pentru datele de pagini web Cache pentru metadata șters Adaugă următorul stream în coadă automat - Continuă oprirea (fără repetare) a colajului prin adăugarea unui stream asemănător + Continuă coadă de redare (care nu se repetă) prin adăugarea unui flux asemănător Arată sfatul „Țineți apăsat pentru a adăuga” Arată un sfat când apeși butonul de redare în fundal sau de popup în secțiunea video \"Detalii\" Țara implicită pentru conținut @@ -278,8 +278,8 @@ Viteză Acceptă Refuză - Dezaboneaza-te - Alege panel + Dezabonează-te + Alegeți fila Gesturi control volum Utilizează gesturi pentru controlul volumului Gesturi control strălucire @@ -346,7 +346,7 @@ Găsește instanța care îți place în %s Selectează instanța preferată PeerTube Instanțe PeerTube - Durată redare-înainte/derulare + Durată derulare rapidă înainte/înapoi Gata Apăsați \"Gata\" când ați terminat Raportează pe Github @@ -367,7 +367,7 @@ Afișați conținut posibil nepotrivit pentru copii, deoarece are o limită de vârstă (cum ar fi 18+) Notificare Adresa URL nu a putut fi recunoscută. Deschideți cu o altă aplicație\? - Afișați informațiile meta + Afișează informațiile meta 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) Colorează notificarea Nimic @@ -375,7 +375,7 @@ Redare aleatorie Repetaţi Puteți selecta cel mult trei acțiuni pentru afișare în notificarea compactă! - 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. + 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 Al cincilea buton de acțiune Al patrulea buton de acțiune Al treilea buton de acțiune @@ -465,8 +465,8 @@ Afișarea timpului inițial în urmă pentru elemente Raportarea forțată a excepțiilor Rx nelivrabile în afara ciclului de viață al fragmentului sau al activității după eliminare Coadă automată - Lista de redare a playerului activ va fi înlocuită - Trecerea de la un player la altul poate înlocui lista de redare + Coada de redare activă va fi înlocuită + Trecerea de la un player la altul vă poate înlocui coada de redare Solicitați confirmarea înainte de a șterge o listă de redare %d minut @@ -596,9 +596,9 @@ Comentarii 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. Copiați raportul formatat - 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. + 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 Dezactivați pentru a ascunde descrierea videoclipului și informațiile suplimentare - Arătați descrierea + Arată descrierea Deschideți cu Blocați aplicația Rezolvează diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0e29edcc4..58f61d5dd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -269,9 +269,9 @@ Заполнить Приблизить Создано автоматически - Мониторинг утечки памяти может привести к зависанию приложения - Сообщать об ошибках жизненного цикла - Принудительно сообщать о недоставляемых Rx-исключениях вне фрагмента или жизненного цикла после удаления + Мониторинг утечек памяти может привести к зависанию приложения + Сообщать об ошибках вне жизненного цикла + Принудительно сообщать о недоставляемых вне жизненного цикла фрагмента или активности Rx-исключениях после высвобождения ресурсов Импорт Импорт из Экспорт в @@ -329,7 +329,7 @@ Хотите импортировать настройки? Конфиденциальность Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия. -\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. +\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. \nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. @@ -609,7 +609,7 @@ Показать описание Открыть в Подходящее приложение не найдено - Сбой приложения + Вызвать сбой приложения Этот контент доступен только оплатившим его пользователям, поэтому NewPipe не может воспроизвести или загрузить его. Это видео доступно только для пользователей YouTube Music Premium, поэтому NewPipe не может воспроизвести или загрузить его. Это частный контент, поэтому NewPipe не может воспроизвести или загрузить его. @@ -618,7 +618,7 @@ Загрузка началась Вы можете выбрать предпочтительную ночную тему ниже Выберите предпочтительную ночную тему — %s - Автоматическая (тема устройства) + Автоматически (тема устройства) Радио Это видео имеет возрастные ограничения. \nСогласно новой политике YouTube в отношении видео с возрастными ограничениями NewPipe не может иметь доступ ни к одному потоку этого видео и, таким образом, не может воспроизвести его. @@ -670,7 +670,7 @@ Пометить как проигранные Не удалось отобразить сведения о канале Загрузка сведений о канале… - Указать цветной полосой на изображениях Picasso их источник (красный - сеть, синий - диск, зелёный - память) + Picasso: указать цветом источник изображений (красный - сеть, синий - диск, зелёный - память) Цветные метки на изображениях Серверные предложения поиска Локальные предложения поиска @@ -687,7 +687,7 @@ %s загрузок завершено Удалять элементы смахиванием - Не начинать просмотр видео в мини-плеере, но сразу переключиться в полноэкранный режим, если автовращение экрана заблокировано. Вы можете переключиться на мини-плеер, выйдя из полноэкранного режима. + Запускать видео во весь экран, если отключён автоповорот. Мини-плеер доступен при выходе из полноэкранного режима Начинать просмотр в полноэкранном режиме Уведомления Новые видео diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 566e2ddc3..0f5fd4bdf 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -665,4 +665,6 @@ %s iscarrigamentos acabados Trìsina sos elementos pro los bogare + 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 + Allughe su letore printzipale a ischermu intreu \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d95ceb597..82655d4ad 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -105,7 +105,7 @@ Zapamätať si parametre mini okna Zapamätať si posledné nastavenie veľkosti a pozície mini okna Hľadať návrhy - Zobrazovať návrhy pri vyhľadávaní + Vyberte návrhy, ktoré sa majú zobrazovať pri vyhľadávaní Najlepšie rozlíšenie Odber Odoberané @@ -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. +\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. 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 @@ \'Storage Access Framework\' nie je podporovaný v systéme Android KitKat a ani v starších verziách Pri každom sťahovaní sa zobrazí výzva kam uložiť súbor Nie je nastavený adresár na sťahovanie. Nastavte ho teraz. + Označiť ako pozorované + Načítavanie podrobností o kanáli… + Chyba pri zobrazení podrobností kanála + Vypnuté + Zapnuté + Režim tabletu + Obľúbené autorom + Zobrazovať pozreté položky + + %1$s sťahovanie zmazané + %1$s sťahovania zmazané + %1$s sťahovaní zmazaných + + + Sťahovanie ukončené + %s ukončené sťahovania + %s ukončených sťahovaní + + Neukazovať + Nízka kvalita (menšie) + Vysoká kvalita (väčšie) + Náhľad miniatúry pri vyhľadávaní + Zobraziť farebné stužky Picassa na obrázkoch podľa ich zdroja: červená pre sieť, modrá pre disk a zelená pre pamäť + Zobraziť indikátory obrázka + Potiahnutím vymazať + Komentáre sú zakázané + 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 + Hlavný prehrávač na celej obrazovke + Návrhy vzdialeného vyhľadávania + Miestne návrhy vyhľadávania \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c7dbe1ed6..fcb37456c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -665,6 +665,6 @@ %s indirme tamamlandı Ögeleri kaldırmak için kaydır - 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. + 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 Ana oynatıcıyı tam ekranda başlat \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 7dc699202..bcede9857 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -681,6 +681,8 @@ %s завантажень завершено Проведіть пальцем по елементах, щоб вилучити їх - Не запускати відео в мініпрогравачі, а перемикати в повноекранний режим безпосередньо, якщо автообертання заблоковано. Ви все одно можете отримати доступ до мініпрогравача, вийшовши з повноекранного режиму. + Не запускати відео в мініпрогравачі, а перемикати в повноекранний режим безпосередньо, якщо автообертання заблоковано. Ви все одно можете отримати доступ до мініпрогравача, вийшовши з повноекранного режиму Запустити основний програвач у повноекранному режимі + Заплановано наступним + Запланувати наступним \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index dc67a57da..f658900aa 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -651,4 +651,7 @@ %s lượt tải xuống đã hoàn tất + Vuốt các mục để xóa chúng + 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 + Khởi động trình phát chính ở toàn màn hình \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b4d805974..3c7e39409 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -653,4 +653,6 @@ %s 下載已完成 滑動項目以刪除它們 + 如果自動旋轉被鎖定,請不要在迷你播放器中啟動影片,而是直接切換到全螢幕模式。您仍然可以透過結束全螢幕存取迷你播放器 + 以全螢幕開始主播放器 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4da2ac60c..101be66d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,5 @@ - - - + + Tap the magnifying glass to get started. Published on %1$s No stream player found. Install VLC? @@ -122,7 +120,7 @@ Continue playing after interruptions (e.g. phonecalls) Download Start main player in fullscreen - 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. + 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 Autoplay Show \"Hold to append\" tip Show tip when pressing the background or the popup button in video \"Details:\" @@ -427,6 +425,8 @@ Show channel details Enqueue Enqueued + Enqueue next + Enqueued next Start playing in the background Start playing in a popup @@ -731,4 +731,4 @@ %s • %s %d/%d Toggle all - \ No newline at end of file + diff --git a/build.gradle b/build.gradle index c4647a9ad..4617611a8 100644 --- a/build.gradle +++ b/build.gradle @@ -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 diff --git a/doc/gradle.md b/doc/gradle.md new file mode 100644 index 000000000..a308734b2 --- /dev/null +++ b/doc/gradle.md @@ -0,0 +1,14 @@ +# Custom gradle parameters + +You can use these parameters by specifying them inside the `gradle.properties` file as +`systemProp.=` or passing them through the CLI with `-D=`. + +## 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. diff --git a/fastlane/metadata/android/es/changelogs/976.txt b/fastlane/metadata/android/es/changelogs/976.txt new file mode 100644 index 000000000..6e240172e --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/976.txt @@ -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. diff --git a/fastlane/metadata/android/fa/changelogs/974.txt b/fastlane/metadata/android/fa/changelogs/974.txt new file mode 100644 index 000000000..50b2ba79a --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/974.txt @@ -0,0 +1,5 @@ +تعمیر فوری +• تعمیر مشکلات میانگیری ایجاد شده به دست دریچه‌بندی یوتوب +• تعمیر استخراج نظرهای یوتوب و فروپاشی‌ها با نظرهای از کار افتاده +• تعمیر جست‌وجوی آهنگ‌های یوتوب +• تعمیر جریان‌های زندهٔ پیرتیوب diff --git a/fastlane/metadata/android/fa/changelogs/976.txt b/fastlane/metadata/android/fa/changelogs/976.txt new file mode 100644 index 000000000..390bce601 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/976.txt @@ -0,0 +1,10 @@ +• افزودن گزینه برای گشودن مستقیم پخش‌کننده در تمام‌صفحه +• اجازه انتخاب گونهٔ پیشنهاد جست‌وجو برای نمایش +• افزودن زمینه تاریک تاریک‌تر و صفحه گشایش تاریک +• بهبود گزینشگر پرونده برای تار کردن پرونده‌های ناخواسته +• تعمیر درون‌ریزی اشتراک‌های یوتوب +• نیاز به زدن دوباره روی دکمهٔ پخش دوباره برای پخش دوباره جریان +• تعمیر بستن نشست صوتی +• [تلویزیون اندرویدی] تعمیر پرش‌های بلند نوار جویش هنگام استفاده از دی‌پد + +برای دیدن تغییرات بیش‌تر، گزارش دگرگونی (و فرسته وبلاگی) را از زبانهٔ پیوندها در زیر ببینید. diff --git a/fastlane/metadata/android/he/changelogs/976.txt b/fastlane/metadata/android/he/changelogs/976.txt new file mode 100644 index 000000000..f6bf4a595 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/976.txt @@ -0,0 +1,10 @@ +• נוספה אפשרות לפתוח את הנגן ישירות במסך מלא +• אפשר לבחור אילו סוגי הצעות חיפוש להציג +• ערכת העיצוב הכהה מעתה כהה יותר וגם נוסף מסך פתיחה כהה +• בוחר הקבצים עבר מקצה שיפורים והוא מאפיר קבצים בלתי רצויים +• ייבוא המינויים מ־YouTube תוקן +• ניגון של תזרים מחדש דורש נגיעה בכפתור הנגינה מחדש פעם נוספת +• סגירת הפעלת שמע תוקנה +• [Android TV] תוקנו קפיצות גדולות בפס הנגינה עם שימוש ב־DPad + +כדי לצפות בשינויים נוספים יש לעיין ביומן השינויים (וברשומה בבלוג) מלשונית הקישורים שלהלן. diff --git a/fastlane/metadata/android/jv/changelogs/820.txt b/fastlane/metadata/android/jv/changelogs/820.txt new file mode 100644 index 000000000..23ece483c --- /dev/null +++ b/fastlane/metadata/android/jv/changelogs/820.txt @@ -0,0 +1 @@ +Ndandani dekripsi fungsi jeneng regex sing ndadekake YouTube ora bisa digunakake. diff --git a/fastlane/metadata/android/jv/changelogs/830.txt b/fastlane/metadata/android/jv/changelogs/830.txt new file mode 100644 index 000000000..d133c3425 --- /dev/null +++ b/fastlane/metadata/android/jv/changelogs/830.txt @@ -0,0 +1 @@ +Ngupdate SoundCloud client_id kanggo ndandani permasalahan SoundCloud. diff --git a/fastlane/metadata/android/jv/changelogs/850.txt b/fastlane/metadata/android/jv/changelogs/850.txt new file mode 100644 index 000000000..d76c4dba4 --- /dev/null +++ b/fastlane/metadata/android/jv/changelogs/850.txt @@ -0,0 +1 @@ +Ing rilis iki situs Youtube wes di anyarke. Situs modhel lawas bakal dimandhegake ing Maret lan Sampeyan kudu nganyari NewPipe. diff --git a/fastlane/metadata/android/jv/changelogs/860.txt b/fastlane/metadata/android/jv/changelogs/860.txt new file mode 100644 index 000000000..979a90fd6 --- /dev/null +++ b/fastlane/metadata/android/jv/changelogs/860.txt @@ -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. diff --git a/fastlane/metadata/android/jv/full_description.txt b/fastlane/metadata/android/jv/full_description.txt new file mode 100644 index 000000000..781bf007b --- /dev/null +++ b/fastlane/metadata/android/jv/full_description.txt @@ -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. diff --git a/fastlane/metadata/android/jv/short_description.txt b/fastlane/metadata/android/jv/short_description.txt new file mode 100644 index 000000000..9dd012dc0 --- /dev/null +++ b/fastlane/metadata/android/jv/short_description.txt @@ -0,0 +1 @@ +Tampilan ngarep gratis Youtube ingkang enteng kanggo Android diff --git a/fastlane/metadata/android/lt/full_description.txt b/fastlane/metadata/android/lt/full_description.txt index 07f081975..09cb8cf0a 100644 --- a/fastlane/metadata/android/lt/full_description.txt +++ b/fastlane/metadata/android/lt/full_description.txt @@ -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). diff --git a/fastlane/metadata/android/lt/short_description.txt b/fastlane/metadata/android/lt/short_description.txt index c5fd36f0a..53dc5368b 100644 --- a/fastlane/metadata/android/lt/short_description.txt +++ b/fastlane/metadata/android/lt/short_description.txt @@ -1 +1 @@ -Nemokama ir lengva "YouTube" sąsaja skirta "Android". +Nemokama ir lengva YouTube sąsaja, skirta Android. diff --git a/fastlane/metadata/android/pl/changelogs/976.txt b/fastlane/metadata/android/pl/changelogs/976.txt new file mode 100644 index 000000000..aca9eabb8 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/976.txt @@ -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. diff --git a/fastlane/metadata/android/uk/changelogs/71.txt b/fastlane/metadata/android/uk/changelogs/71.txt new file mode 100644 index 000000000..a962945c4 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/71.txt @@ -0,0 +1,10 @@ +### Вдосконалено +* Сповіщення про оновлення збірки застосунку GitHub (#1608 @krtkush) +* Поліпшено завантажувач (#1944 @kapodamy): + * додано відсутні білі піктограми й застосовано хардк-спосіб зміни кольорів піктограм + * перевірка ініціалізації ітератора (#2031) + * дозволено повторне завантаження з помилкою «після обробки не вдалося» в новому muxer + * новий MPEG-4 muxer виправив неузгодженість відео й аудіо (#2039) + +### Виправлено +* Переривання прямих трансляції YouTube (#1996 @yausername) diff --git a/fastlane/metadata/android/uk/changelogs/780.txt b/fastlane/metadata/android/uk/changelogs/780.txt new file mode 100644 index 000000000..9502e45e3 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/780.txt @@ -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 diff --git a/fastlane/metadata/android/uk/changelogs/790.txt b/fastlane/metadata/android/uk/changelogs/790.txt new file mode 100644 index 000000000..f74c24a65 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/790.txt @@ -0,0 +1,14 @@ +Вдосконалено +• Нові заголовки доступності для людей з вадами зору #2655 +• Мова налаштування теки завантажень послідовніша та однозначніша #2637 + +Виправлено +• Перевірка завантаження останнього байта блоку #2646 +• Виправлено прокручування деталей відео #2672 +• Вилучено повтор анімацій вікна пошуку #2695 +• [SoundCloud] Виправлено витяг client_id #2745 + +Розвиток +• Додано відсутні залежності, успадковані з NewPipeExtractor #2535 +• Перехід на AndroidX #2685 +• Оновлено до ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/uk/changelogs/940.txt b/fastlane/metadata/android/uk/changelogs/940.txt new file mode 100644 index 000000000..e18ff67f3 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/940.txt @@ -0,0 +1,16 @@ +Нове +• Підтримка коментарів SoundCloud +• Налаштування режиму обмеження YouTube +• Показ деталей батьківського каналу PeerTube + +Вдосконалено +• Показ кнопки Kore лише підтримуваних служб +• Блокування жестів програвача, що починаються з панелі навігації стану +• Новий колір тла кнопок повторної спроби й підписки залежно від кольору служби + +Виправлено +• Зависання вікна завантаження +• «Відкрити в переглядачі» точно відкриває браузер +• Збої відкриття відео та «Не вдалося відтворити цей потік» + +і більше diff --git a/fastlane/metadata/android/uk/changelogs/954.txt b/fastlane/metadata/android/uk/changelogs/954.txt new file mode 100644 index 000000000..d43119bc3 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/954.txt @@ -0,0 +1,9 @@ +• Нове: відтворення відео на сторінці подробиць, проведіть пальцем вниз, щоб згорнути програвач +• Повідомлення MediaStyle: налаштовувані дії у сповіщеннях, покращення швидкодії +• базова зміна розміру у NewPipe для ПК + +• показ діалогового вікна з відкритими опціями у разі непідтримуваної URL +• Покращено пропозиції пошуку, коли віддалені не вдається отримати +• Підвищена типова якість відео до 720p60 (програвач у застосунку) та 480p (спливний програвач) + +• виправлення помилок тощо diff --git a/fastlane/metadata/android/uk/changelogs/957.txt b/fastlane/metadata/android/uk/changelogs/957.txt new file mode 100644 index 000000000..4d8eff4ee --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/957.txt @@ -0,0 +1,10 @@ +• Об'єднано дії в черзі +• Жест двома пальцями, щоб закрити програвач +• Дозволено очищення cookie reCAPTCHA +• Можливість не забарвлювати сповіщення +• Поліпшено відкриття подробиць відео, щоб виправити нескінченну буферизацію та поведінку надсилання з NewPipe тощо +• Прискорено відео YouTube і виправлено обмеження віку +• Виправлено збої перемотування вперед/назад +• Списки не перевпорядковуються перетягуванням ескізів +• Завжди пам'ятати властивості спливного вікна +• Додано мову Санталі diff --git a/fastlane/metadata/android/uk/changelogs/958.txt b/fastlane/metadata/android/uk/changelogs/958.txt new file mode 100644 index 000000000..18b22eedf --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/958.txt @@ -0,0 +1,15 @@ +Нове та вдосконалене: +• Повторно додана опція ховання ескізу на екрані блокування +• Потягніть, щоб оновити стрічку +• Покращена швидкодія отримання локальних списків + +Виправлено: +• Збої запуску NewPipe після його видалення з оперативної пам’яті +• Збої запуску, коли немає з'єднання з інтернетом +• Дотримання параметрів яскравості та жестів +• [YouTube] Виправлені довгі списки відтворення + +Інше: +• Очищення коду та кілька внутрішніх удосконалень +• Оновлення залежностей +• Оновлення перекладів diff --git a/fastlane/metadata/android/uk/changelogs/961.txt b/fastlane/metadata/android/uk/changelogs/961.txt new file mode 100644 index 000000000..39b81ddf9 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Підтримка міксів +• [YouTube] Показ відомостей про суспільних мовників та Covid-19 +• [media.ccc.de] Додано останні відео +• Додано переклад сомалійською + +• Багато внутрішніх поліпшень + +• Виправлено спільне використання відео в програвачі +• Виправлено порожню ReCaptcha у вебперегляді +• Виправлена помилка, яка ставалася під час видалення потоку зі списку +• [PeerTube] Виправлено пов’язані потоки +• [YouTube] Виправлено пошук у YouTube Music diff --git a/fastlane/metadata/android/uk/changelogs/964.txt b/fastlane/metadata/android/uk/changelogs/964.txt new file mode 100644 index 000000000..be10e1407 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/964.txt @@ -0,0 +1,8 @@ +• Додано підтримку розділів елементами керування програвачем +• [PeerTube] Додано пошук Sepia +• Повторно додано кнопку поділитися до детального перегляду відео, переміщено опис потоку у макет вкладки +• Вимкнено відновлення яскравості, якщо жест яскравості вимкнено +• Новий пункт списку відтворення відео у kodi +• Виправлено збої, коли на пристрої не встановлено типовий переглядач +• Перемикання відтворення апаратною кнопкою пробіл у повноекранному програвачі +• [media.ccc.de] Виправлення й покращення diff --git a/fastlane/metadata/android/uk/changelogs/966.txt b/fastlane/metadata/android/uk/changelogs/966.txt new file mode 100644 index 000000000..9333482db --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/966.txt @@ -0,0 +1,14 @@ +Нове: +• Нова служба: Bandcamp + +Поліпшено: +• Нова опція дотримування теми пристрою +• Запобігання збоям показом покращеної панелі помилок +• Більше інформації чому вміст недоступний +• Апаратна кнопка пробілу для відтворення/паузи +• Показ «Завантаження розпочато» + +Виправлено: +• Дуже маленькі мініатюри в подробицях відео під час відтворення у фоновому режимі +• Порожній заголовок у згорнутому програвачі +• Виправлено помилку, через яку останній розмір не відновлюється належним чином diff --git a/fastlane/metadata/android/uk/changelogs/970.txt b/fastlane/metadata/android/uk/changelogs/970.txt new file mode 100644 index 000000000..7d4f5b79e --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/970.txt @@ -0,0 +1,11 @@ +Нове +• Показ метаданих вмісту (мітки, категорії, ліцензія, ...) під описом +• Опція «Показати деталі каналу» віддалених добірок +• Опція «Відкрити у переглядачі» у меню тривалого натискання + +Виправлено +• Збої на сторінці відомостей про відео +• Кнопка «Відтворити у Kodi» у програвачі завжди просила встановити Kore +• Налаштування шляхів імпорту та експорту +• [YouTube] Виправлено кількість вподобань коментарів +І багато іншого diff --git a/fastlane/metadata/android/uk/changelogs/972.txt b/fastlane/metadata/android/uk/changelogs/972.txt new file mode 100644 index 000000000..033272241 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/972.txt @@ -0,0 +1,14 @@ +Нове +Розпізнання міток часу й хештегів у описі +Ручне налаштування режиму планшета +Можливість ховати відтворені елементи у стрічці + +Вдосконалено +Правильна підтримка фреймфорку доступу до сховища +Краща обробка помилок недоступних та припинених каналів +Панель спільного доступу на Android 10+ тепер показано у заголовок вмісту. +Оновлено екземпляри Invidious та підтримка канальних посилань. + +Виправлено +[YouTube] Вміст із віковими обмеженнями +Витоки вікна Винятків під час відкриття вікна вибору diff --git a/fastlane/metadata/android/uk/changelogs/975.txt b/fastlane/metadata/android/uk/changelogs/975.txt new file mode 100644 index 000000000..0631acf58 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/975.txt @@ -0,0 +1,17 @@ +Нове +• Попередній перегляд ескізів під час пошуку +• Виявлення вимкнених коментарів +• Дозволено позначити елемент каналу переглянутим +• Сердечка коментарів + +Поліпшено +• Макет метаданих та міток +• Компоненти UI кольору служби + +Виправлено +• Ескіз у мініпрогравачі +• Нескінченну буферизацію повторюваних елементів черги +• Обертання та швидше закриття програвача +• ReCAPTCHA залишилася завантаженою у фоновому режимі +• Вимкнено натискання під час оновлення каналу +• Деякі збої завантажувача diff --git a/fastlane/metadata/android/uk/changelogs/976.txt b/fastlane/metadata/android/uk/changelogs/976.txt new file mode 100644 index 000000000..ec72bb4e0 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/976.txt @@ -0,0 +1,10 @@ +• Відкривайте програвач одразу у повноекранному режимі +• Дозволено обирати типи пошукових +• Ще темніша темна тема +• Сірий колір небажаних файлів у оглядачі файлів +• Виправлено імпортування підписок YouTube +• Повторне відтворення потоку вимагає повторного натискання кнопки відтворення +• Виправлено закриття аудіосеансу +• [Android TV] Виправлено стрибки на панелі переходів під час користування DPad + +Щоб переглянути інші зміни, перегляньте журнал змін (і запис блогу) на вкладці посилання унизу. diff --git a/fastlane/metadata/android/zh-Hans/changelogs/976.txt b/fastlane/metadata/android/zh-Hans/changelogs/976.txt new file mode 100644 index 000000000..300cdd6ab --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/976.txt @@ -0,0 +1,10 @@ +- 增加了直接打开全屏播放器的选项 +- 允许选择显示哪些类型的搜索建议 +- 加深深色主题,增加了深色启动屏幕 +- 改进了文件选择器,使无关文件变成灰色 +- 修复YouTube订阅导入 +- 重放一个视媒体需要再次点击重放按钮 +- 修复关闭音频会话 +- [Android TV] 修正了使用DPad时长寻址栏的跳动。 + +进一步了解全部变化,请从下列链接查看更新日志(与博客文章)。