diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13a4d8723..306b8c2c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: branches: - dev - master + - release/** paths-ignore: - 'README.md' - 'doc/**' diff --git a/app/build.gradle b/app/build.gradle index 27e8241a6..36bee05a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { resValue "string", "app_name", "NewPipe" minSdk 19 targetSdk 29 - versionCode 985 - versionName "0.22.2" + versionCode 986 + versionName "0.23.0" multiDexEnabled true @@ -190,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:b77c72fb8826c3ffca0be5f96b066cca0a07b1c9' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:ac1c22d81c65b7b0c5427f4e1989f5256d617f32' /** Checkstyle **/ checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 53a9ecd5a..4a54d8992 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -51,3 +51,6 @@ private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); } + +# for some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) +-keep class org.schabi.newpipe.settings.notifications.** { *; } 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 e97629f31..b291aa035 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 @@ -25,7 +25,6 @@ import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.graphics.Typeface -import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.os.Parcelable @@ -37,7 +36,6 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.Button -import androidx.annotation.AttrRes import androidx.annotation.Nullable import androidx.appcompat.app.AlertDialog import androidx.appcompat.content.res.AppCompatResources @@ -80,6 +78,7 @@ import org.schabi.newpipe.util.DeviceUtils import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NavigationHelper import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountStreams +import org.schabi.newpipe.util.ThemeHelper.resolveDrawable import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout import java.time.OffsetDateTime import java.util.function.Consumer @@ -579,19 +578,6 @@ class FeedFragment : BaseStateFragment() { lastNewItemsCount = highlightCount } - private fun resolveDrawable(context: Context, @AttrRes attrResId: Int): Drawable? { - return androidx.core.content.ContextCompat.getDrawable( - context, - android.util.TypedValue().apply { - context.theme.resolveAttribute( - attrResId, - this, - true - ) - }.resourceId - ) - } - private fun showNewItemsLoaded() { tryGetNewItemsLoadedButton()?.clearAnimation() tryGetNewItemsLoadedButton() 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 82ae0df27..30c62af39 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -3557,15 +3557,27 @@ public final class Player implements } // apply caption language from previous user preference - final List selectedPreferredLanguages = - trackSelector.getParameters().preferredTextLanguages; + final int textRendererIndex = getCaptionRendererIndex(); + if (textRendererIndex == RENDERER_UNAVAILABLE) { + return; + } + + // If user prefers to show no caption, then disable the renderer. + // Otherwise, DefaultTrackSelector may automatically find an available caption + // and display that. final String userPreferredLanguage = prefs.getString(context.getString(R.string.caption_user_set_key), null); - final int textRendererIndex = getCaptionRendererIndex(); + if (userPreferredLanguage == null) { + trackSelector.setParameters(trackSelector.buildUponParameters() + .setRendererDisabled(textRendererIndex, true)); + return; + } - if (userPreferredLanguage != null - && !selectedPreferredLanguages.contains(userPreferredLanguage) - && textRendererIndex != RENDERER_UNAVAILABLE) { + // Only set preferred language if it does not match the user preference, + // otherwise there might be an infinite cycle at onTextTracksChanged. + final List selectedPreferredLanguages = + trackSelector.getParameters().preferredTextLanguages; + if (!selectedPreferredLanguages.contains(userPreferredLanguage)) { trackSelector.setParameters(trackSelector.buildUponParameters() .setPreferredTextLanguages(userPreferredLanguage, PlayerHelper.captionLanguageStemOf(userPreferredLanguage)) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index 1a55c21c3..7220335d1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -1,123 +1,121 @@ package org.schabi.newpipe.player.helper; +import static org.schabi.newpipe.ktx.ViewUtils.animateRotation; import static org.schabi.newpipe.player.Player.DEBUG; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; +import static org.schabi.newpipe.util.ThemeHelper.resolveDrawable; import android.app.Dialog; import android.content.Context; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.os.Bundle; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; -import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.DialogPlaybackParameterBinding; +import org.schabi.newpipe.player.Player; import org.schabi.newpipe.util.SimpleOnSeekBarChangeListener; import org.schabi.newpipe.util.SliderStrategy; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.DoubleConsumer; +import java.util.function.DoubleFunction; +import java.util.function.DoubleSupplier; + +import icepick.Icepick; +import icepick.State; + public class PlaybackParameterDialog extends DialogFragment { + private static final String TAG = "PlaybackParameterDialog"; + // Minimum allowable range in ExoPlayer - private static final double MINIMUM_PLAYBACK_VALUE = 0.10f; - private static final double MAXIMUM_PLAYBACK_VALUE = 3.00f; + private static final double MIN_PITCH_OR_SPEED = 0.10f; + private static final double MAX_PITCH_OR_SPEED = 3.00f; - private static final char STEP_UP_SIGN = '+'; - private static final char STEP_DOWN_SIGN = '-'; + private static final boolean PITCH_CTRL_MODE_PERCENT = false; + private static final boolean PITCH_CTRL_MODE_SEMITONE = true; - private static final double STEP_ONE_PERCENT_VALUE = 0.01f; - private static final double STEP_FIVE_PERCENT_VALUE = 0.05f; - private static final double STEP_TEN_PERCENT_VALUE = 0.10f; - private static final double STEP_TWENTY_FIVE_PERCENT_VALUE = 0.25f; - private static final double STEP_ONE_HUNDRED_PERCENT_VALUE = 1.00f; + private static final double STEP_1_PERCENT_VALUE = 0.01f; + private static final double STEP_5_PERCENT_VALUE = 0.05f; + private static final double STEP_10_PERCENT_VALUE = 0.10f; + private static final double STEP_25_PERCENT_VALUE = 0.25f; + private static final double STEP_100_PERCENT_VALUE = 1.00f; private static final double DEFAULT_TEMPO = 1.00f; - private static final double DEFAULT_PITCH = 1.00f; - private static final int DEFAULT_SEMITONES = 0; - private static final double DEFAULT_STEP = STEP_TWENTY_FIVE_PERCENT_VALUE; + private static final double DEFAULT_PITCH_PERCENT = 1.00f; + private static final double DEFAULT_STEP = STEP_25_PERCENT_VALUE; private static final boolean DEFAULT_SKIP_SILENCE = false; - @NonNull - private static final String TAG = "PlaybackParameterDialog"; - @NonNull - private static final String INITIAL_TEMPO_KEY = "initial_tempo_key"; - @NonNull - private static final String INITIAL_PITCH_KEY = "initial_pitch_key"; + private static final SliderStrategy QUADRATIC_STRATEGY = new SliderStrategy.Quadratic( + MIN_PITCH_OR_SPEED, + MAX_PITCH_OR_SPEED, + 1.00f, + 10_000); - @NonNull - private static final String TEMPO_KEY = "tempo_key"; - @NonNull - private static final String PITCH_KEY = "pitch_key"; - @NonNull - private static final String STEP_SIZE_KEY = "step_size_key"; + private static final SliderStrategy SEMITONE_STRATEGY = new SliderStrategy() { + @Override + public int progressOf(final double value) { + return PlayerSemitoneHelper.percentToSemitones(value) + 12; + } - @NonNull - private final SliderStrategy strategy = new SliderStrategy.Quadratic( - MINIMUM_PLAYBACK_VALUE, MAXIMUM_PLAYBACK_VALUE, - /*centerAt=*/1.00f, /*sliderGranularity=*/10000); + @Override + public double valueOf(final int progress) { + return PlayerSemitoneHelper.semitonesToPercent(progress - 12); + } + }; @Nullable private Callback callback; - private double initialTempo = DEFAULT_TEMPO; - private double initialPitch = DEFAULT_PITCH; - private int initialSemitones = DEFAULT_SEMITONES; - private boolean initialSkipSilence = DEFAULT_SKIP_SILENCE; - private double tempo = DEFAULT_TEMPO; - private double pitch = DEFAULT_PITCH; - private int semitones = DEFAULT_SEMITONES; + @State + double initialTempo = DEFAULT_TEMPO; + @State + double initialPitchPercent = DEFAULT_PITCH_PERCENT; + @State + boolean initialSkipSilence = DEFAULT_SKIP_SILENCE; - @Nullable - private SeekBar tempoSlider; - @Nullable - private TextView tempoCurrentText; - @Nullable - private TextView tempoStepDownText; - @Nullable - private TextView tempoStepUpText; - @Nullable - private SeekBar pitchSlider; - @Nullable - private TextView pitchCurrentText; - @Nullable - private TextView pitchStepDownText; - @Nullable - private TextView pitchStepUpText; - @Nullable - private SeekBar semitoneSlider; - @Nullable - private TextView semitoneCurrentText; - @Nullable - private TextView semitoneStepDownText; - @Nullable - private TextView semitoneStepUpText; - @Nullable - private CheckBox unhookingCheckbox; - @Nullable - private CheckBox skipSilenceCheckbox; - @Nullable - private CheckBox adjustBySemitonesCheckbox; + @State + double tempo = DEFAULT_TEMPO; + @State + double pitchPercent = DEFAULT_PITCH_PERCENT; + @State + boolean skipSilence = DEFAULT_SKIP_SILENCE; - public static PlaybackParameterDialog newInstance(final double playbackTempo, - final double playbackPitch, - final boolean playbackSkipSilence, - final Callback callback) { + private DialogPlaybackParameterBinding binding; + + public static PlaybackParameterDialog newInstance( + final double playbackTempo, + final double playbackPitch, + final boolean playbackSkipSilence, + final Callback callback + ) { final PlaybackParameterDialog dialog = new PlaybackParameterDialog(); dialog.callback = callback; + dialog.initialTempo = playbackTempo; - dialog.initialPitch = playbackPitch; - - dialog.tempo = playbackTempo; - dialog.pitch = playbackPitch; - dialog.semitones = dialog.percentToSemitones(playbackPitch); - + dialog.initialPitchPercent = playbackPitch; dialog.initialSkipSilence = playbackSkipSilence; + + dialog.tempo = dialog.initialTempo; + dialog.pitchPercent = dialog.initialPitchPercent; + dialog.skipSilence = dialog.initialSkipSilence; + return dialog; } @@ -135,29 +133,10 @@ public class PlaybackParameterDialog extends DialogFragment { } } - @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - assureCorrectAppLanguage(getContext()); - super.onCreate(savedInstanceState); - if (savedInstanceState != null) { - initialTempo = savedInstanceState.getDouble(INITIAL_TEMPO_KEY, DEFAULT_TEMPO); - initialPitch = savedInstanceState.getDouble(INITIAL_PITCH_KEY, DEFAULT_PITCH); - initialSemitones = percentToSemitones(initialPitch); - - tempo = savedInstanceState.getDouble(TEMPO_KEY, DEFAULT_TEMPO); - pitch = savedInstanceState.getDouble(PITCH_KEY, DEFAULT_PITCH); - semitones = percentToSemitones(pitch); - } - } - @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - outState.putDouble(INITIAL_TEMPO_KEY, initialTempo); - outState.putDouble(INITIAL_PITCH_KEY, initialPitch); - - outState.putDouble(TEMPO_KEY, getCurrentTempo()); - outState.putDouble(PITCH_KEY, getCurrentPitch()); + Icepick.saveInstanceState(this, outState); } /*////////////////////////////////////////////////////////////////////////// @@ -168,327 +147,342 @@ public class PlaybackParameterDialog extends DialogFragment { @Override public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) { assureCorrectAppLanguage(getContext()); - final View view = View.inflate(getContext(), R.layout.dialog_playback_parameter, null); - setupControlViews(view); + Icepick.restoreInstanceState(this, savedInstanceState); + + binding = DialogPlaybackParameterBinding.inflate(LayoutInflater.from(getContext())); + initUI(); final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(requireActivity()) - .setView(view) + .setView(binding.getRoot()) .setCancelable(true) - .setNegativeButton(R.string.cancel, (dialogInterface, i) -> - setPlaybackParameters(initialTempo, initialPitch, - initialSemitones, initialSkipSilence)) - .setNeutralButton(R.string.playback_reset, (dialogInterface, i) -> - setPlaybackParameters(DEFAULT_TEMPO, DEFAULT_PITCH, - DEFAULT_SEMITONES, DEFAULT_SKIP_SILENCE)) - .setPositiveButton(R.string.ok, (dialogInterface, i) -> - setCurrentPlaybackParameters()); + .setNegativeButton(R.string.cancel, (dialogInterface, i) -> { + setAndUpdateTempo(initialTempo); + setAndUpdatePitch(initialPitchPercent); + setAndUpdateSkipSilence(initialSkipSilence); + updateCallback(); + }) + .setNeutralButton(R.string.playback_reset, (dialogInterface, i) -> { + setAndUpdateTempo(DEFAULT_TEMPO); + setAndUpdatePitch(DEFAULT_PITCH_PERCENT); + setAndUpdateSkipSilence(DEFAULT_SKIP_SILENCE); + updateCallback(); + }) + .setPositiveButton(R.string.ok, (dialogInterface, i) -> updateCallback()); return dialogBuilder.create(); } /*////////////////////////////////////////////////////////////////////////// - // Control Views + // UI Initialization and Control //////////////////////////////////////////////////////////////////////////*/ - private void setupControlViews(@NonNull final View rootView) { - setupHookingControl(rootView); - setupSkipSilenceControl(rootView); - setupAdjustBySemitonesControl(rootView); + private void initUI() { + // Tempo + setText(binding.tempoMinimumText, PlayerHelper::formatSpeed, MIN_PITCH_OR_SPEED); + setText(binding.tempoMaximumText, PlayerHelper::formatSpeed, MAX_PITCH_OR_SPEED); - setupTempoControl(rootView); - setupPitchControl(rootView); - setupSemitoneControl(rootView); + binding.tempoSeekbar.setMax(QUADRATIC_STRATEGY.progressOf(MAX_PITCH_OR_SPEED)); + setAndUpdateTempo(tempo); + binding.tempoSeekbar.setOnSeekBarChangeListener( + getTempoOrPitchSeekbarChangeListener( + QUADRATIC_STRATEGY, + this::onTempoSliderUpdated)); - togglePitchSliderType(rootView); + registerOnStepClickListener( + binding.tempoStepDown, + () -> tempo, + -1, + this::onTempoSliderUpdated); + registerOnStepClickListener( + binding.tempoStepUp, + () -> tempo, + 1, + this::onTempoSliderUpdated); - setupStepSizeSelector(rootView); + // Pitch + binding.pitchToogleControlModes.setOnClickListener(v -> { + final boolean isCurrentlyVisible = + binding.pitchControlModeTabs.getVisibility() == View.GONE; + binding.pitchControlModeTabs.setVisibility(isCurrentlyVisible + ? View.VISIBLE + : View.GONE); + animateRotation(binding.pitchToogleControlModes, + Player.DEFAULT_CONTROLS_DURATION, + isCurrentlyVisible ? 180 : 0); + }); + + getPitchControlModeComponentMappings() + .forEach(this::setupPitchControlModeTextView); + changePitchControlMode(isCurrentPitchControlModeSemitone()); + + // Pitch - Percent + setText(binding.pitchPercentMinimumText, PlayerHelper::formatPitch, MIN_PITCH_OR_SPEED); + setText(binding.pitchPercentMaximumText, PlayerHelper::formatPitch, MAX_PITCH_OR_SPEED); + + binding.pitchPercentSeekbar.setMax(QUADRATIC_STRATEGY.progressOf(MAX_PITCH_OR_SPEED)); + setAndUpdatePitch(pitchPercent); + binding.pitchPercentSeekbar.setOnSeekBarChangeListener( + getTempoOrPitchSeekbarChangeListener( + QUADRATIC_STRATEGY, + this::onPitchPercentSliderUpdated)); + + registerOnStepClickListener( + binding.pitchPercentStepDown, + () -> pitchPercent, + -1, + this::onPitchPercentSliderUpdated); + registerOnStepClickListener( + binding.pitchPercentStepUp, + () -> pitchPercent, + 1, + this::onPitchPercentSliderUpdated); + + // Pitch - Semitone + binding.pitchSemitoneSeekbar.setOnSeekBarChangeListener( + getTempoOrPitchSeekbarChangeListener( + SEMITONE_STRATEGY, + this::onPitchPercentSliderUpdated)); + + registerOnSemitoneStepClickListener( + binding.pitchSemitoneStepDown, + -1, + this::onPitchPercentSliderUpdated); + registerOnSemitoneStepClickListener( + binding.pitchSemitoneStepUp, + 1, + this::onPitchPercentSliderUpdated); + + // Steps + getStepSizeComponentMappings() + .forEach(this::setupStepTextView); + // Initialize UI + setStepSizeToUI(getCurrentStepSize()); + + // Bottom controls + bindCheckboxWithBoolPref( + binding.unhookCheckbox, + R.string.playback_unhook_key, + true, + isChecked -> { + if (!isChecked) { + // when unchecked, slide back to the minimum of current tempo or pitch + ensureHookIsValidAndUpdateCallBack(); + } + }); + + setAndUpdateSkipSilence(skipSilence); + binding.skipSilenceCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> { + skipSilence = isChecked; + updateCallback(); + }); } - private void togglePitchSliderType(@NonNull final View rootView) { - final RelativeLayout pitchControl = rootView.findViewById(R.id.pitchControl); - final RelativeLayout semitoneControl = rootView.findViewById(R.id.semitoneControl); + // -- General formatting -- - final View separatorStepSizeSelector = - rootView.findViewById(R.id.separatorStepSizeSelector); - final RelativeLayout.LayoutParams params = - (RelativeLayout.LayoutParams) separatorStepSizeSelector.getLayoutParams(); - if (pitchControl != null && semitoneControl != null && unhookingCheckbox != null) { - if (getCurrentAdjustBySemitones()) { - // replaces pitchControl slider with semitoneControl slider - pitchControl.setVisibility(View.GONE); - semitoneControl.setVisibility(View.VISIBLE); - params.addRule(RelativeLayout.BELOW, R.id.semitoneControl); - - // forces unhook for semitones - unhookingCheckbox.setChecked(true); - unhookingCheckbox.setEnabled(false); - - setupTempoStepSizeSelector(rootView); - } else { - semitoneControl.setVisibility(View.GONE); - pitchControl.setVisibility(View.VISIBLE); - params.addRule(RelativeLayout.BELOW, R.id.pitchControl); - - // (re)enables hooking selection - unhookingCheckbox.setEnabled(true); - setupCombinedStepSizeSelector(rootView); - } - } + private void setText( + final TextView textView, + final DoubleFunction formatter, + final double value + ) { + Objects.requireNonNull(textView).setText(formatter.apply(value)); } - private void setupTempoControl(@NonNull final View rootView) { - tempoSlider = rootView.findViewById(R.id.tempoSeekbar); - final TextView tempoMinimumText = rootView.findViewById(R.id.tempoMinimumText); - final TextView tempoMaximumText = rootView.findViewById(R.id.tempoMaximumText); - tempoCurrentText = rootView.findViewById(R.id.tempoCurrentText); - tempoStepUpText = rootView.findViewById(R.id.tempoStepUp); - tempoStepDownText = rootView.findViewById(R.id.tempoStepDown); + // -- Steps -- - if (tempoCurrentText != null) { - tempoCurrentText.setText(PlayerHelper.formatSpeed(tempo)); - } - if (tempoMaximumText != null) { - tempoMaximumText.setText(PlayerHelper.formatSpeed(MAXIMUM_PLAYBACK_VALUE)); - } - if (tempoMinimumText != null) { - tempoMinimumText.setText(PlayerHelper.formatSpeed(MINIMUM_PLAYBACK_VALUE)); - } - - if (tempoSlider != null) { - tempoSlider.setMax(strategy.progressOf(MAXIMUM_PLAYBACK_VALUE)); - tempoSlider.setProgress(strategy.progressOf(tempo)); - tempoSlider.setOnSeekBarChangeListener(getOnTempoChangedListener()); - } + private void registerOnStepClickListener( + final TextView stepTextView, + final DoubleSupplier currentValueSupplier, + final double direction, // -1 for step down, +1 for step up + final DoubleConsumer newValueConsumer + ) { + stepTextView.setOnClickListener(view -> { + newValueConsumer.accept( + currentValueSupplier.getAsDouble() + 1 * getCurrentStepSize() * direction); + updateCallback(); + }); } - private void setupPitchControl(@NonNull final View rootView) { - pitchSlider = rootView.findViewById(R.id.pitchSeekbar); - final TextView pitchMinimumText = rootView.findViewById(R.id.pitchMinimumText); - final TextView pitchMaximumText = rootView.findViewById(R.id.pitchMaximumText); - pitchCurrentText = rootView.findViewById(R.id.pitchCurrentText); - pitchStepDownText = rootView.findViewById(R.id.pitchStepDown); - pitchStepUpText = rootView.findViewById(R.id.pitchStepUp); - - if (pitchCurrentText != null) { - pitchCurrentText.setText(PlayerHelper.formatPitch(pitch)); - } - if (pitchMaximumText != null) { - pitchMaximumText.setText(PlayerHelper.formatPitch(MAXIMUM_PLAYBACK_VALUE)); - } - if (pitchMinimumText != null) { - pitchMinimumText.setText(PlayerHelper.formatPitch(MINIMUM_PLAYBACK_VALUE)); - } - - if (pitchSlider != null) { - pitchSlider.setMax(strategy.progressOf(MAXIMUM_PLAYBACK_VALUE)); - pitchSlider.setProgress(strategy.progressOf(pitch)); - pitchSlider.setOnSeekBarChangeListener(getOnPitchChangedListener()); - } + private void registerOnSemitoneStepClickListener( + final TextView stepTextView, + final int direction, // -1 for step down, +1 for step up + final DoubleConsumer newValueConsumer + ) { + stepTextView.setOnClickListener(view -> { + newValueConsumer.accept(PlayerSemitoneHelper.semitonesToPercent( + PlayerSemitoneHelper.percentToSemitones(this.pitchPercent) + direction)); + updateCallback(); + }); } - private void setupSemitoneControl(@NonNull final View rootView) { - semitoneSlider = rootView.findViewById(R.id.semitoneSeekbar); - semitoneCurrentText = rootView.findViewById(R.id.semitoneCurrentText); - semitoneStepDownText = rootView.findViewById(R.id.semitoneStepDown); - semitoneStepUpText = rootView.findViewById(R.id.semitoneStepUp); + // -- Pitch -- - if (semitoneCurrentText != null) { - semitoneCurrentText.setText(getSignedSemitonesString(semitones)); - } - - if (semitoneSlider != null) { - setSemitoneSlider(semitones); - semitoneSlider.setOnSeekBarChangeListener(getOnSemitoneChangedListener()); - } - - } - - private void setupHookingControl(@NonNull final View rootView) { - unhookingCheckbox = rootView.findViewById(R.id.unhookCheckbox); - if (unhookingCheckbox != null) { - // restores whether pitch and tempo are unhooked or not - unhookingCheckbox.setChecked(PreferenceManager - .getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.playback_unhook_key), true)); - - unhookingCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> { - // saves whether pitch and tempo are unhooked or not - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .edit() - .putBoolean(getString(R.string.playback_unhook_key), isChecked) - .apply(); - - if (!isChecked) { - // when unchecked, slides back to the minimum of current tempo or pitch - final double minimum = Math.min(getCurrentPitch(), getCurrentTempo()); - setSliders(minimum); - setCurrentPlaybackParameters(); - } - }); - } - } - - private void setupSkipSilenceControl(@NonNull final View rootView) { - skipSilenceCheckbox = rootView.findViewById(R.id.skipSilenceCheckbox); - if (skipSilenceCheckbox != null) { - skipSilenceCheckbox.setChecked(initialSkipSilence); - skipSilenceCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> - setCurrentPlaybackParameters()); - } - } - - private void setupAdjustBySemitonesControl(@NonNull final View rootView) { - adjustBySemitonesCheckbox = rootView.findViewById(R.id.adjustBySemitonesCheckbox); - if (adjustBySemitonesCheckbox != null) { - // restores whether semitone adjustment is used or not - adjustBySemitonesCheckbox.setChecked(PreferenceManager - .getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.playback_adjust_by_semitones_key), true)); - - // stores whether semitone adjustment is used or not - adjustBySemitonesCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> { - PreferenceManager.getDefaultSharedPreferences(requireContext()) + private void setupPitchControlModeTextView( + final boolean semitones, + final TextView textView + ) { + textView.setOnClickListener(view -> { + PreferenceManager.getDefaultSharedPreferences(requireContext()) .edit() - .putBoolean(getString(R.string.playback_adjust_by_semitones_key), isChecked) + .putBoolean(getString(R.string.playback_adjust_by_semitones_key), semitones) .apply(); - togglePitchSliderType(rootView); - if (isChecked) { - setPlaybackParameters( - getCurrentTempo(), - getCurrentPitch(), - Integer.min(12, - Integer.max(-12, percentToSemitones(getCurrentPitch()) - )), - getCurrentSkipSilence() + + changePitchControlMode(semitones); + }); + } + + private Map getPitchControlModeComponentMappings() { + final Map mappings = new HashMap<>(); + mappings.put(PITCH_CTRL_MODE_PERCENT, binding.pitchControlModePercent); + mappings.put(PITCH_CTRL_MODE_SEMITONE, binding.pitchControlModeSemitone); + return mappings; + } + + private void changePitchControlMode(final boolean semitones) { + // Bring all textviews into a normal state + final Map pitchCtrlModeComponentMapping = + getPitchControlModeComponentMappings(); + pitchCtrlModeComponentMapping.forEach((v, textView) -> textView.setBackground( + resolveDrawable(requireContext(), R.attr.selectableItemBackground))); + + // Mark the selected textview + final TextView textView = pitchCtrlModeComponentMapping.get(semitones); + if (textView != null) { + textView.setBackground(new LayerDrawable(new Drawable[]{ + resolveDrawable(requireContext(), R.attr.dashed_border), + resolveDrawable(requireContext(), R.attr.selectableItemBackground) + })); + } + + // Show or hide component + binding.pitchPercentControl.setVisibility(semitones ? View.GONE : View.VISIBLE); + binding.pitchSemitoneControl.setVisibility(semitones ? View.VISIBLE : View.GONE); + + if (semitones) { + // Recalculate pitch percent when changing to semitone + // (as it could be an invalid semitone value) + final double newPitchPercent = calcValidPitch(pitchPercent); + + // If the values differ set the new pitch + if (this.pitchPercent != newPitchPercent) { + if (DEBUG) { + Log.d(TAG, "Bringing pitchPercent to correct corresponding semitone: " + + "currentPitchPercent = " + pitchPercent + ", " + + "newPitchPercent = " + newPitchPercent ); - setSemitoneSlider(Integer.min(12, - Integer.max(-12, percentToSemitones(getCurrentPitch())) - )); - } else { - setPlaybackParameters( - getCurrentTempo(), - semitonesToPercent(getCurrentSemitones()), - getCurrentSemitones(), - getCurrentSkipSilence() - ); - setPitchSlider(semitonesToPercent(getCurrentSemitones())); } - }); + this.onPitchPercentSliderUpdated(newPitchPercent); + updateCallback(); + } + } else if (!binding.unhookCheckbox.isChecked()) { + // When changing to percent it's possible that tempo is != pitch + ensureHookIsValidAndUpdateCallBack(); } } - private void setupStepSizeSelector(@NonNull final View rootView) { - setStepSize(PreferenceManager + private boolean isCurrentPitchControlModeSemitone() { + return PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getBoolean( + getString(R.string.playback_adjust_by_semitones_key), + PITCH_CTRL_MODE_PERCENT); + } + + // -- Steps (Set) -- + + private void setupStepTextView( + final double stepSizeValue, + final TextView textView + ) { + setText(textView, PlaybackParameterDialog::getPercentString, stepSizeValue); + textView.setOnClickListener(view -> { + PreferenceManager.getDefaultSharedPreferences(requireContext()) + .edit() + .putFloat(getString(R.string.adjustment_step_key), (float) stepSizeValue) + .apply(); + + setStepSizeToUI(stepSizeValue); + }); + } + + private Map getStepSizeComponentMappings() { + final Map mappings = new HashMap<>(); + mappings.put(STEP_1_PERCENT_VALUE, binding.stepSizeOnePercent); + mappings.put(STEP_5_PERCENT_VALUE, binding.stepSizeFivePercent); + mappings.put(STEP_10_PERCENT_VALUE, binding.stepSizeTenPercent); + mappings.put(STEP_25_PERCENT_VALUE, binding.stepSizeTwentyFivePercent); + mappings.put(STEP_100_PERCENT_VALUE, binding.stepSizeOneHundredPercent); + return mappings; + } + + private void setStepSizeToUI(final double newStepSize) { + // Bring all textviews into a normal state + final Map stepSiteComponentMapping = getStepSizeComponentMappings(); + stepSiteComponentMapping.forEach((v, textView) -> textView.setBackground( + resolveDrawable(requireContext(), R.attr.selectableItemBackground))); + + // Mark the selected textview + final TextView textView = stepSiteComponentMapping.get(newStepSize); + if (textView != null) { + textView.setBackground(new LayerDrawable(new Drawable[]{ + resolveDrawable(requireContext(), R.attr.dashed_border), + resolveDrawable(requireContext(), R.attr.selectableItemBackground) + })); + } + + // Bind to the corresponding control components + binding.tempoStepUp.setText(getStepUpPercentString(newStepSize)); + binding.tempoStepDown.setText(getStepDownPercentString(newStepSize)); + + binding.pitchPercentStepUp.setText(getStepUpPercentString(newStepSize)); + binding.pitchPercentStepDown.setText(getStepDownPercentString(newStepSize)); + } + + private double getCurrentStepSize() { + return PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getFloat(getString(R.string.adjustment_step_key), (float) DEFAULT_STEP); + } + + // -- Additional options -- + + private void setAndUpdateSkipSilence(final boolean newSkipSilence) { + this.skipSilence = newSkipSilence; + binding.skipSilenceCheckbox.setChecked(newSkipSilence); + } + + @SuppressWarnings("SameParameterValue") // this method was written to be reusable + private void bindCheckboxWithBoolPref( + @NonNull final CheckBox checkBox, + @StringRes final int resId, + final boolean defaultValue, + @NonNull final Consumer onInitialValueOrValueChange + ) { + final boolean prefValue = PreferenceManager .getDefaultSharedPreferences(requireContext()) - .getFloat(getString(R.string.adjustment_step_key), (float) DEFAULT_STEP)); + .getBoolean(getString(resId), defaultValue); - final TextView stepSizeOnePercentText = rootView.findViewById(R.id.stepSizeOnePercent); - final TextView stepSizeFivePercentText = rootView.findViewById(R.id.stepSizeFivePercent); - final TextView stepSizeTenPercentText = rootView.findViewById(R.id.stepSizeTenPercent); - final TextView stepSizeTwentyFivePercentText = rootView - .findViewById(R.id.stepSizeTwentyFivePercent); - final TextView stepSizeOneHundredPercentText = rootView - .findViewById(R.id.stepSizeOneHundredPercent); + checkBox.setChecked(prefValue); - if (stepSizeOnePercentText != null) { - stepSizeOnePercentText.setText(getPercentString(STEP_ONE_PERCENT_VALUE)); - stepSizeOnePercentText - .setOnClickListener(view -> setStepSize(STEP_ONE_PERCENT_VALUE)); - } + onInitialValueOrValueChange.accept(prefValue); - if (stepSizeFivePercentText != null) { - stepSizeFivePercentText.setText(getPercentString(STEP_FIVE_PERCENT_VALUE)); - stepSizeFivePercentText - .setOnClickListener(view -> setStepSize(STEP_FIVE_PERCENT_VALUE)); - } + checkBox.setOnCheckedChangeListener((compoundButton, isChecked) -> { + // save whether pitch and tempo are unhooked or not + PreferenceManager.getDefaultSharedPreferences(requireContext()) + .edit() + .putBoolean(getString(resId), isChecked) + .apply(); - if (stepSizeTenPercentText != null) { - stepSizeTenPercentText.setText(getPercentString(STEP_TEN_PERCENT_VALUE)); - stepSizeTenPercentText - .setOnClickListener(view -> setStepSize(STEP_TEN_PERCENT_VALUE)); - } - - if (stepSizeTwentyFivePercentText != null) { - stepSizeTwentyFivePercentText - .setText(getPercentString(STEP_TWENTY_FIVE_PERCENT_VALUE)); - stepSizeTwentyFivePercentText - .setOnClickListener(view -> setStepSize(STEP_TWENTY_FIVE_PERCENT_VALUE)); - } - - if (stepSizeOneHundredPercentText != null) { - stepSizeOneHundredPercentText - .setText(getPercentString(STEP_ONE_HUNDRED_PERCENT_VALUE)); - stepSizeOneHundredPercentText - .setOnClickListener(view -> setStepSize(STEP_ONE_HUNDRED_PERCENT_VALUE)); - } + onInitialValueOrValueChange.accept(isChecked); + }); } - private void setupTempoStepSizeSelector(@NonNull final View rootView) { - final TextView playbackStepTypeText = rootView.findViewById(R.id.playback_step_type); - if (playbackStepTypeText != null) { - playbackStepTypeText.setText(R.string.playback_tempo_step); - } - setupStepSizeSelector(rootView); - } - - private void setupCombinedStepSizeSelector(@NonNull final View rootView) { - final TextView playbackStepTypeText = rootView.findViewById(R.id.playback_step_type); - if (playbackStepTypeText != null) { - playbackStepTypeText.setText(R.string.playback_step); - } - setupStepSizeSelector(rootView); - } - - private void setStepSize(final double stepSize) { - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .edit() - .putFloat(getString(R.string.adjustment_step_key), (float) stepSize) - .apply(); - - if (tempoStepUpText != null) { - tempoStepUpText.setText(getStepUpPercentString(stepSize)); - tempoStepUpText.setOnClickListener(view -> { - onTempoSliderUpdated(getCurrentTempo() + stepSize); - setCurrentPlaybackParameters(); - }); - } - - if (tempoStepDownText != null) { - tempoStepDownText.setText(getStepDownPercentString(stepSize)); - tempoStepDownText.setOnClickListener(view -> { - onTempoSliderUpdated(getCurrentTempo() - stepSize); - setCurrentPlaybackParameters(); - }); - } - - if (pitchStepUpText != null) { - pitchStepUpText.setText(getStepUpPercentString(stepSize)); - pitchStepUpText.setOnClickListener(view -> { - onPitchSliderUpdated(getCurrentPitch() + stepSize); - setCurrentPlaybackParameters(); - }); - } - - if (pitchStepDownText != null) { - pitchStepDownText.setText(getStepDownPercentString(stepSize)); - pitchStepDownText.setOnClickListener(view -> { - onPitchSliderUpdated(getCurrentPitch() - stepSize); - setCurrentPlaybackParameters(); - }); - } - - if (semitoneStepDownText != null) { - semitoneStepDownText.setOnClickListener(view -> { - onSemitoneSliderUpdated(getCurrentSemitones() - 1); - setCurrentPlaybackParameters(); - }); - } - - if (semitoneStepUpText != null) { - semitoneStepUpText.setOnClickListener(view -> { - onSemitoneSliderUpdated(getCurrentSemitones() + 1); - setCurrentPlaybackParameters(); - }); + /** + * Ensures that the slider hook is valid and if not sets and updates the sliders accordingly. + *
+ * You have to ensure by yourself that the hooking is active. + */ + private void ensureHookIsValidAndUpdateCallBack() { + if (tempo != pitchPercent) { + setSliders(Math.min(tempo, pitchPercent)); + updateCallback(); } } @@ -496,166 +490,106 @@ public class PlaybackParameterDialog extends DialogFragment { // Sliders //////////////////////////////////////////////////////////////////////////*/ - private SimpleOnSeekBarChangeListener getOnTempoChangedListener() { + private SeekBar.OnSeekBarChangeListener getTempoOrPitchSeekbarChangeListener( + final SliderStrategy sliderStrategy, + final DoubleConsumer newValueConsumer + ) { return new SimpleOnSeekBarChangeListener() { @Override - public void onProgressChanged(@NonNull final SeekBar seekBar, final int progress, + public void onProgressChanged(@NonNull final SeekBar seekBar, + final int progress, final boolean fromUser) { - final double currentTempo = strategy.valueOf(progress); - if (fromUser) { - onTempoSliderUpdated(currentTempo); - setCurrentPlaybackParameters(); - } - } - }; - } - - private SimpleOnSeekBarChangeListener getOnPitchChangedListener() { - return new SimpleOnSeekBarChangeListener() { - @Override - public void onProgressChanged(@NonNull final SeekBar seekBar, final int progress, - final boolean fromUser) { - final double currentPitch = strategy.valueOf(progress); - if (fromUser) { // this change is first in chain - onPitchSliderUpdated(currentPitch); - setCurrentPlaybackParameters(); - } - } - }; - } - - private SimpleOnSeekBarChangeListener getOnSemitoneChangedListener() { - return new SimpleOnSeekBarChangeListener() { - @Override - public void onProgressChanged(@NonNull final SeekBar seekBar, final int progress, - final boolean fromUser) { - // semitone slider supplies values 0 to 24, subtraction by 12 is required - final int currentSemitones = progress - 12; - if (fromUser) { // this change is first in chain - onSemitoneSliderUpdated(currentSemitones); - // line below also saves semitones as pitch percentages - onPitchSliderUpdated(semitonesToPercent(currentSemitones)); - setCurrentPlaybackParameters(); + if (fromUser) { // ensure that the user triggered the change + newValueConsumer.accept(sliderStrategy.valueOf(progress)); + updateCallback(); } } }; } private void onTempoSliderUpdated(final double newTempo) { - if (!unhookingCheckbox.isChecked()) { + if (!binding.unhookCheckbox.isChecked()) { setSliders(newTempo); } else { - setTempoSlider(newTempo); + setAndUpdateTempo(newTempo); } } - private void onPitchSliderUpdated(final double newPitch) { - if (!unhookingCheckbox.isChecked()) { + private void onPitchPercentSliderUpdated(final double newPitch) { + if (!binding.unhookCheckbox.isChecked()) { setSliders(newPitch); } else { - setPitchSlider(newPitch); + setAndUpdatePitch(newPitch); } } - private void onSemitoneSliderUpdated(final int newSemitone) { - setSemitoneSlider(newSemitone); - } - private void setSliders(final double newValue) { - setTempoSlider(newValue); - setPitchSlider(newValue); + setAndUpdateTempo(newValue); + setAndUpdatePitch(newValue); } - private void setTempoSlider(final double newTempo) { - if (tempoSlider == null) { - return; - } - tempoSlider.setProgress(strategy.progressOf(newTempo)); + private void setAndUpdateTempo(final double newTempo) { + this.tempo = calcValidTempo(newTempo); + + binding.tempoSeekbar.setProgress(QUADRATIC_STRATEGY.progressOf(tempo)); + setText(binding.tempoCurrentText, PlayerHelper::formatSpeed, tempo); } - private void setPitchSlider(final double newPitch) { - if (pitchSlider == null) { - return; - } - pitchSlider.setProgress(strategy.progressOf(newPitch)); + private void setAndUpdatePitch(final double newPitch) { + this.pitchPercent = calcValidPitch(newPitch); + + binding.pitchPercentSeekbar.setProgress(QUADRATIC_STRATEGY.progressOf(pitchPercent)); + binding.pitchSemitoneSeekbar.setProgress(SEMITONE_STRATEGY.progressOf(pitchPercent)); + setText(binding.pitchPercentCurrentText, + PlayerHelper::formatPitch, + pitchPercent); + setText(binding.pitchSemitoneCurrentText, + PlayerSemitoneHelper::formatPitchSemitones, + pitchPercent); } - private void setSemitoneSlider(final int newSemitone) { - if (semitoneSlider == null) { - return; + private double calcValidTempo(final double newTempo) { + return Math.max(MIN_PITCH_OR_SPEED, Math.min(MAX_PITCH_OR_SPEED, newTempo)); + } + + private double calcValidPitch(final double newPitch) { + final double calcPitch = + Math.max(MIN_PITCH_OR_SPEED, Math.min(MAX_PITCH_OR_SPEED, newPitch)); + + if (!isCurrentPitchControlModeSemitone()) { + return calcPitch; } - semitoneSlider.setProgress(newSemitone + 12); + + return PlayerSemitoneHelper.semitonesToPercent( + PlayerSemitoneHelper.percentToSemitones(calcPitch)); } /*////////////////////////////////////////////////////////////////////////// // Helper //////////////////////////////////////////////////////////////////////////*/ - private void setCurrentPlaybackParameters() { - if (getCurrentAdjustBySemitones()) { - setPlaybackParameters( - getCurrentTempo(), - semitonesToPercent(getCurrentSemitones()), - getCurrentSemitones(), - getCurrentSkipSilence() - ); - } else { - setPlaybackParameters( - getCurrentTempo(), - getCurrentPitch(), - percentToSemitones(getCurrentPitch()), - getCurrentSkipSilence() + private void updateCallback() { + if (callback == null) { + return; + } + if (DEBUG) { + Log.d(TAG, "Updating callback: " + + "tempo = " + tempo + ", " + + "pitchPercent = " + pitchPercent + ", " + + "skipSilence = " + skipSilence ); } - } - - private void setPlaybackParameters(final double newTempo, final double newPitch, - final int newSemitones, final boolean skipSilence) { - if (callback != null && tempoCurrentText != null - && pitchCurrentText != null && semitoneCurrentText != null) { - if (DEBUG) { - Log.d(TAG, "Setting playback parameters to " - + "tempo=[" + newTempo + "], " - + "pitch=[" + newPitch + "], " - + "semitones=[" + newSemitones + "]"); - } - - tempoCurrentText.setText(PlayerHelper.formatSpeed(newTempo)); - pitchCurrentText.setText(PlayerHelper.formatPitch(newPitch)); - semitoneCurrentText.setText(getSignedSemitonesString(newSemitones)); - callback.onPlaybackParameterChanged((float) newTempo, (float) newPitch, skipSilence); - } - } - - private double getCurrentTempo() { - return tempoSlider == null ? tempo : strategy.valueOf(tempoSlider.getProgress()); - } - - private double getCurrentPitch() { - return pitchSlider == null ? pitch : strategy.valueOf(pitchSlider.getProgress()); - } - - private int getCurrentSemitones() { - // semitoneSlider is absolute, that's why - 12 - return semitoneSlider == null ? semitones : semitoneSlider.getProgress() - 12; - } - - private boolean getCurrentSkipSilence() { - return skipSilenceCheckbox != null && skipSilenceCheckbox.isChecked(); - } - - private boolean getCurrentAdjustBySemitones() { - return adjustBySemitonesCheckbox != null && adjustBySemitonesCheckbox.isChecked(); + callback.onPlaybackParameterChanged((float) tempo, (float) pitchPercent, skipSilence); } @NonNull private static String getStepUpPercentString(final double percent) { - return STEP_UP_SIGN + getPercentString(percent); + return '+' + getPercentString(percent); } @NonNull private static String getStepDownPercentString(final double percent) { - return STEP_DOWN_SIGN + getPercentString(percent); + return '-' + getPercentString(percent); } @NonNull @@ -663,21 +597,8 @@ public class PlaybackParameterDialog extends DialogFragment { return PlayerHelper.formatPitch(percent); } - @NonNull - private static String getSignedSemitonesString(final int semitones) { - return semitones > 0 ? "+" + semitones : "" + semitones; - } - public interface Callback { void onPlaybackParameterChanged(float playbackTempo, float playbackPitch, boolean playbackSkipSilence); } - - public double semitonesToPercent(final int inSemitones) { - return Math.pow(2, inSemitones / 12.0); - } - - public int percentToSemitones(final double inPercent) { - return (int) Math.round(12 * Math.log(inPercent) / Math.log(2)); - } } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index e21b21d35..b73c6cf7f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -78,6 +78,20 @@ public final class PlayerHelper { private static final NumberFormat SPEED_FORMATTER = new DecimalFormat("0.##x"); private static final NumberFormat PITCH_FORMATTER = new DecimalFormat("##%"); + /** + * Maximum opacity allowed for Android 12 and higher to allow touches on other apps when using + * NewPipe's popup player. + * + *

+ * This value is hardcoded instead of being get dynamically with the method linked of the + * constant documentation below, because it is not static and popup player layout parameters + * are generated with static methods. + *

+ * + * @see WindowManager.LayoutParams#FLAG_NOT_TOUCHABLE + */ + private static final float MAXIMUM_OPACITY_ALLOWED_FOR_S_AND_HIGHER = 0.8f; + @Retention(SOURCE) @IntDef({AUTOPLAY_TYPE_ALWAYS, AUTOPLAY_TYPE_WIFI, AUTOPLAY_TYPE_NEVER}) @@ -412,7 +426,7 @@ public final class PlayerHelper { context.getString(R.string.progressive_load_interval_key), context.getString(R.string.progressive_load_interval_default_value)); - if (context.getString(R.string.progressive_load_interval_default_value) + if (context.getString(R.string.progressive_load_interval_exoplayer_default_value) .equals(preferredIntervalBytes)) { return ProgressiveMediaSource.DEFAULT_LOADING_CHECK_INTERVAL_BYTES; } @@ -587,6 +601,12 @@ public final class PlayerHelper { flags, PixelFormat.TRANSLUCENT); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + // Setting maximum opacity allowed for touch events to other apps for Android 12 and + // higher to prevent non interaction when using other apps with the popup player + closeOverlayLayoutParams.alpha = MAXIMUM_OPACITY_ALLOWED_FOR_S_AND_HIGHER; + } + closeOverlayLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; closeOverlayLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerSemitoneHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerSemitoneHelper.java new file mode 100644 index 000000000..f3a71d7cd --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerSemitoneHelper.java @@ -0,0 +1,38 @@ +package org.schabi.newpipe.player.helper; + +/** + * Converts between percent and 12-tone equal temperament semitones. + *
+ * @see + * + * Wikipedia: Equal temperament#Twelve-tone equal temperament + * + */ +public final class PlayerSemitoneHelper { + public static final int SEMITONE_COUNT = 12; + + private PlayerSemitoneHelper() { + // No impl + } + + public static String formatPitchSemitones(final double percent) { + return formatPitchSemitones(percentToSemitones(percent)); + } + + public static String formatPitchSemitones(final int semitones) { + return semitones > 0 ? "+" + semitones : "" + semitones; + } + + public static double semitonesToPercent(final int semitones) { + return Math.pow(2, ensureSemitonesInRange(semitones) / (double) SEMITONE_COUNT); + } + + public static int percentToSemitones(final double percent) { + return ensureSemitonesInRange( + (int) Math.round(SEMITONE_COUNT * Math.log(percent) / Math.log(2))); + } + + private static int ensureSemitonesInRange(final int semitones) { + return Math.max(-SEMITONE_COUNT, Math.min(SEMITONE_COUNT, semitones)); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt index e823c2fcf..fcc9abf73 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt @@ -26,6 +26,10 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.notifications_settings) + + // main check is done in onResume, but also do it here to prevent flickering + preferenceScreen.isEnabled = + NotificationHelper.areNotificationsEnabledOnDevice(requireContext()) } override fun onStart() { @@ -64,7 +68,7 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen // If they are disabled, show a snackbar informing the user about that // while allowing them to open the device's app settings. val enabled = NotificationHelper.areNotificationsEnabledOnDevice(requireContext()) - preferenceScreen.isEnabled = enabled + preferenceScreen.isEnabled = enabled // it is disabled by default, see the xml if (!enabled) { if (notificationWarningSnackbar == null) { notificationWarningSnackbar = Snackbar.make( @@ -85,9 +89,6 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen show() } } - } else { - notificationWarningSnackbar?.dismiss() - notificationWarningSnackbar = null } // (Re-)Create loader @@ -102,6 +103,9 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen loader?.dispose() loader = null + notificationWarningSnackbar?.dismiss() + notificationWarningSnackbar = null + super.onPause() } diff --git a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java index 7c47d387f..7d06e57b6 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -23,9 +23,11 @@ import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.util.TypedValue; import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StyleRes; import androidx.appcompat.app.ActionBar; @@ -227,6 +229,22 @@ public final class ThemeHelper { return value.data; } + /** + * Resolves a {@link Drawable} by it's id. + * + * @param context Context + * @param attrResId Resource id + * @return the {@link Drawable} + */ + public static Drawable resolveDrawable( + @NonNull final Context context, + @AttrRes final int attrResId + ) { + final TypedValue typedValue = new TypedValue(); + context.getTheme().resolveAttribute(attrResId, typedValue, true); + return ContextCompat.getDrawable(context, typedValue.resourceId); + } + private static String getSelectedThemeKey(final Context context) { final String themeKey = context.getString(R.string.theme_key); final String defaultTheme = context.getResources().getString(R.string.default_theme_value); diff --git a/app/src/main/res/layout/dialog_playback_parameter.xml b/app/src/main/res/layout/dialog_playback_parameter.xml index 862b2ea67..e402f4fb1 100644 --- a/app/src/main/res/layout/dialog_playback_parameter.xml +++ b/app/src/main/res/layout/dialog_playback_parameter.xml @@ -1,5 +1,6 @@ @@ -117,10 +111,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentEnd="true" - android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginEnd="4dp" - android:layout_marginRight="4dp" android:background="?attr/selectableItemBackground" android:clickable="true" android:focusable="true" @@ -138,9 +130,9 @@ android:layout_height="1dp" android:layout_below="@id/tempoControl" android:layout_marginStart="12dp" - android:layout_marginTop="6dp" - android:layout_marginEnd="6dp" - android:layout_marginBottom="6dp" + android:layout_marginTop="5dp" + android:layout_marginEnd="12dp" + android:layout_marginBottom="5dp" android:background="?attr/separator_color" /> - + + + android:layout_marginStart="22dp" + android:layout_marginEnd="22dp" + android:orientation="horizontal" + android:visibility="gone" + tools:visibility="visible"> + android:text="@string/percent" + android:textColor="?attr/colorAccent" /> + + + + + + - - + tools:text="-5%" /> + + + + + + + + + + + - - + tools:text="+5%" /> - - - - - - - + android:orientation="horizontal" + tools:visibility="gone"> - - - - - - + android:layout_height="match_parent" + android:layout_marginLeft="4dp" + android:layout_marginRight="4dp" + android:layout_toStartOf="@+id/pitchSemitoneStepUp" + android:layout_toEndOf="@+id/pitchSemitoneStepDown" + android:orientation="horizontal"> - + + + + + + + + + + + @@ -403,7 +431,8 @@ android:clickable="true" android:focusable="true" android:gravity="center" - android:textColor="?attr/colorAccent" /> + android:textColor="?attr/colorAccent" + tools:text="1%" /> + android:textColor="?attr/colorAccent" + tools:text="5%" /> + android:textColor="?attr/colorAccent" + tools:text="10%" /> + android:textColor="?attr/colorAccent" + tools:text="25%" /> - + android:textColor="?attr/colorAccent" + tools:text="100%" /> - diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 818f946dd..e7da4611a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -730,11 +730,34 @@ إظهار خطأ snackbar لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. \nالرجاء تثبيت مدير ملفات متوافق مع Storage Access Framework. - يتم تشغيله في الخلفية تعليق مثبت LeakCanary غير متوفر - ضبط الصوت من خلال النغمات الموسيقية النصفية - خطوة الإيقاع - الافتراضي ExoPlayer + الافتراضي ExoPlayer تغيير حجم الفاصل الزمني للتحميل (حاليا %s). قد تؤدي القيمة الأقل إلى تسريع تحميل الفيديو الأولي. تتطلب التغييرات إعادة تشغيل المشغل. + تكوين إشعار مشغل البث الحالي + الإشعارات + تحميل تفاصيل البث… + تم تعطيل الإشعارات + بث جديد + إشعار المشغل + لقد اشتركت الآن في هذه القناة + الإخطارات حول التدفقات الجديدة للاشتراكات + إشعارات أحداث البث الجديدة + الإخطار بأحداث البث الجديدة من الاشتراكات + تشغيل التحقق من وجود تدفقات جديدة + معدل البحث + مطلوب اتصال الشبكة + أي شبكة + محو جميع الملفات التي تم تنزيلها من القرص؟ + الحصول على إشعار + , + تبديل الكل + + %s دفق جديد + %s دفق جديد + %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 4aa497e99..917016675 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 @@ -670,11 +670,30 @@ 找不到适合此操作的文件管理器。 \n请安装与存储访问框架(SAF)兼容的文件管理器。 NewPipe 遇到了一个错误,点击此处报告此错误 - 已经在后台播放 置顶评论 LeakCanary 不可用 - 以音乐半音调整音高 - 节奏步长 改变加载间隔的大小(当前%s),较低的值可以加快初始的视频加载速度,改变需要重启播放器。 - ExoPlayer 默认 + ExoPlayer 默认 + 配置当前正在播放的串流的通知 + 新串流通知 + 检查频率 + 所需的网络连接 + 通知已被禁用 + 你刚刚订阅了此频道 + + 全选 + 播放器通知 + 通知 + 新的串流 + + %s 条新串流 + + + 被订阅的新串流的通知 + 正在加载串流详情… + 检查新串流 + 任何网络 + 清除所有下载的文件? + 获取通知 + 来自订阅的新串流的通知 \ No newline at end of file diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 12d526a7d..24498f162 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -189,7 +189,7 @@ কোন রেজাল্ট নেই কোন ফোল্ডার নেই বাহ্যিক স্টোরেজ নেই - সার্চ ইতিহাস ডিলিট হয়েছে। + সার্চ ইতিহাস মোছা হয়েছে নাম নাম পরিবর্তন ইতিহাস @@ -198,7 +198,7 @@ তৈরি করুন পুনরায় চেষ্টা করুন সাহায্য - দেখার ইতিহাস মুছে গেছে। + দেখার ইতিহাস মুছে গেছে সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\? দেখার ইতিহাস মুছে ফেলুন ডাটা বেস এক্সপোর্ট করুন @@ -269,14 +269,14 @@ তালিকা তে পজিশন শেষ প্লে ব্যাক পজিশন এ যান সার্চ গুলি স্থানীয় ভাবে জমা করুন - সার্চ এর সময় সাজেশন দেখান + সার্চ এর সময় সাজেশন পছন্দ করুন সার্চ সাজেশন ফিড লোড হচ্ছে… এরর দেখান একটি প্লে লিস্ট পছন্দ করুন সম্পর্কিত থার্ড-পার্টি লাইসেন্স সমূহ - গিটহাব এ এরর রিপোর্ট করুন + গিটহাব এ রিপোর্ট করুন ডিফল্ট এ ফিরে যান রেজাল্ট দেখান হচ্ছেঃ %s কিউ মোছার আগে নিশ্চিত করুন @@ -292,4 +292,12 @@ মেটা ইনফো দেখান বিবরণ দেখান রাত্রি থিম + তৃতীয় অ্যাকশান বোতাম + চতুর্থ অ্যাকশান বোতাম + সক্রিয় প্লেয়ার ক্রম পরিবর্তিত হয়ে যাবে + স্থানীয় সার্চ সাজেশন + পঞ্চম অ্যাকশান বোতাম + প্রথম অ্যাকশান বোতাম + দ্বিতীয় অ্যাকশান বোতাম + নতুন স্ট্রিম \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 421139875..a42e68940 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -650,7 +650,6 @@ Inicia el reproductor principal en pantalla completa Llisqueu els elements per eliminar-los Si la rotació automàtica està bloquejada, no inicieu vídeos al mini reproductor, sinó que aneu directament al mode de pantalla completa. Podeu accedir igualment al mini reproductor sortint de pantalla completa - Ja s\'està reproduint en segon pla Notificació d\'informe d\'error Tancar abruptament el reproductor Comprovar si hi ha actualitzacions diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index f621b88bd..399d2360e 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -672,7 +672,6 @@ پیشاندانی ”کڕاش کردنی لێدەرەکە“ سازاندنی پەیامی کێشەیەک پشکنین بۆ نوێکردنەوە - وا لە پاشبنەمادا لێدەدرێت کێشە لە سکاڵا کردنی پەیام پەیامەکانی سکاڵاکردن لە کێشەکان بابەتە نوێیەکانی فیید diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 98523442a..9ba0d1e98 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -684,7 +684,6 @@ Vytvořit oznámení o chybě Kontrola aktualizací… Ukázat „Shodit přehrávač“ - Hraje již v pozadí Nové položky feedů Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nProsím, nainstalujte správce souborů kompatibilní se Storage Access Framework. @@ -698,7 +697,5 @@ Shodit přehrávač Změnit interval načítání (aktuálně %s). Menší hodnota může zrychlit počáteční načítání videa. Změna vyžaduje restart přehrávače. LeakCanary není dostupné - Upravit výšku tónů po půltónech - Krok tempa - Výchozí ExoPlayer + Výchozí ExoPlayer \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 8fadebacd..71bb83fb0 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -396,4 +396,5 @@ Viser resultater for: %s Åben med LeakCanary er ikke tilgængelig + Markér som set \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index edde1ab27..ffc501c63 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -666,9 +666,9 @@ Hauptplayer im Vollbildmodus starten Als Nächstes eingereiht Als Nächstes in Wiedergabe einreihen - Verarbeitung… Kann einen Moment dauern + Verarbeitung … Kann einen Moment dauern Nach Aktualisierungen suchen - Suche nach Aktualisierungen… + Suche nach Aktualisierungen … Manuelle Prüfung auf neue Versionen Neue Feed-Elemente \"Player abstürzen lassen\" anzeigen @@ -684,11 +684,28 @@ \nBitte installiere einen Dateimanager oder versuche, \'%s\' in den Downloadeinstellungen zu deaktivieren.
Es wurde kein geeigneter Dateimanager für diese Aktion gefunden. \nBitte installiere einen Storage Access Framework kompatiblen Dateimanager. - Wird bereits im Hintergrund abgespielt Angehefteter Kommentar LeakCanary ist nicht verfügbar - Tonhöhe nach musikalischen Halbtönen anpassen Ändern der Größe des Ladeintervalls (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden des Videos beschleunigen. Änderungen erfordern einen Neustart des Players. - Geschwindigkeitsstufe - ExoPlayer Standard + ExoPlayer Standard + Benachrichtigungen + Benachrichtigen über neue abonnierbare Streams + Neue Streams + + %s neuer Stream + %s neue Streams + + Stream-Details laden … + Über neue Streams aus Abonnements benachrichtigen + , + Jedes Netzwerk + Benachrichtigungen über neue Streams + Suche nach neuen Streams ausführen + Erforderliche Netzwerkverbindung + Benachrichtigungen sind deaktiviert + Benachrichtigung erhalten + Alle heruntergeladenen Dateien von der Festplatte löschen\? + Du hast jetzt diesen Kanal abonniert + Alle umschalten + Aktualisierungsintervall \ 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 911c97be6..e202d2b34 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -682,11 +682,30 @@ \nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης.
Το NewPipe παρουσίασε ένα σφάλμα. Πατήστε για αναφορά Εμφάνιση μιας snackbar σφάλματος - Αναπαράγεται ήδη στο παρασκήνιο Καρφιτσωμένο σχόλιο Το LeakCanary δεν είναι διαθέσιμο - Προσαρμόστε τον τόνο με βάση τα μουσικά ημιτόνια - Βήμα τέμπο - Εξ\' ορισμού ExoPlayer + Εξ\' ορισμού ExoPlayer Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής. + Ειδοποιήσεις + + %s νέα ροή + %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 4d69a096d..9ab3b8ce9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -292,7 +292,7 @@ Quitar todos los datos guardados de páginas web Se vació la caché de metadatos Controles de velocidad de reproducción - Tiempo + Tempo Tono Desvincular (puede causar distorsión) No hay streams disponibles para descargar @@ -686,10 +686,11 @@ No se encontró ningún gestor de archivos adecuado para esta acción. \nPor favor instale un gestor de archivos compatible con \"Sistema de Acceso al Almacenamiento\". Comentario fijado - Ya se reproduce en segundo plano LeakCanary no está disponible - ExoPlayer valor por defecto - Paso de tempo + ExoPlayer valor por defecto Cambia el tamaño del intervalo de carga (actualmente %s). Un valor más bajo puede acelerar la carga inicial del vídeo. Los cambios requieren un reinicio del reproductor. - Ajustar el tono por semitonos musicales + Notificaciones + Nuevos streams + Notificación del reproductor + Configurar notificación de la reproducción en curso \ 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 439c9d906..029ff9878 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -674,7 +674,6 @@ NewPipe töös tekkis viga, sellest teavitamiseks klõpsi Jooksuta meediamängija kokku Näita veateate akent - Meedia esitamine taustal toimib juba Teavitus vigadest Teavitused vigadest informeerimiseks Tekkis viga, vaata vastavat teadet @@ -685,6 +684,28 @@ \nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku.
Esiletõstetud kommentaar LeakCanary pole saadaval - ExoPlayer\'i vaikimisi väärtused + ExoPlayer\'i vaikimisi väärtused Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem. Muudatuste jõustamine eeldab rakenduse uuesti käivitamist. + Meediamängija teavitused + Teavitused pole kasutusel + Kontrollimise sagedus + Tellimuste-kohaste uute meedivoogude teavitused + Kas kustutame kõik allalaaditud failid andmekandjalt\? + Teavitused + Seadista hetkel esitatava meediavoo teavitusi + Uued meediavood + + %s uus meediavoog + %s uut meediavoogu + + Laadin meediavoo teavet… + Käivita uute meediavoogude kontroll + Uute meedivoogude teavitused + Tellimustega seotud uute meedivoogude teavitused + Võrguühendus on vajalik + Mis tahes võrk + Saa teavitusi + Sa oled nüüd selle kanali tellija + , + Lülita kõik sisse \ 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 004d5d7a8..d4bddf4a8 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -315,7 +315,7 @@ NewPipe proiektuak aintzat hartzen du zure pribatutasuna. Aplikazioak ez du zure baimenik gabe daturik jasotzen. \nNewPipe pribatutasun politikak azaltzen du zehazki bidali eta gordetako informazioa zein den kraskatze txosten bat bidaltzen duzunean. Irakurri pribatutasun politika - European General Data Protection Regulation (GDPR) legea betetzeko, NewPipe pribatutasun politika irakurtzera gonbidaatzen zaitugu. + Datuak Babesteko Araudi Orokorra (GDPR) betetzeko, NewPipe-en pribatutasun politika kontuan hartzera gonbidatzen zaitugu. Mesedez, irakurri kontu handiz. \nAkats txosten bat bidali ahal izateko onartu behar duzu. Onartu Ukatu @@ -664,9 +664,8 @@ Hasi erreproduzitzaile nagusia pantaila osoan Isatsari bideo hau erantsita Gehitu bideo hau isatsari - Erakutsi \"itxi erreproduzigailua\" + Erakutsi \"Itxi erreproduzigailua\" Prozesatzen... Itxoin mesedez - Atzeko planoan erreproduzitzen dagoeneko Erroreen txostenen jakinarazpena Jakinarazpenak erroreen berri emateko NewPipe-k errore bat aurkitu du, sakatu berri emateko @@ -684,4 +683,29 @@ Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du Erakutsi errore barra bat Sortu errore jakinarazpen bat + Konfiguratu uneko erreprodukzioaren jakinarazpenak + Jakinarazpenak + Erreproduzigailuaren jakinarazpenak + Jario berriak + Egiaztatu jario berriak + Jario berrien jakinarazpenak + Edozein sare + Jakinarazpenak desgaituta daude + Kanal honetara harpidetu zara + , + Txandakatu denak + Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiarazte bat behar du. + Harpidetzen jario berriei buruz jakinarazi + Ezabatu deskargatutako fitxategi guztiak biltegitik\? + Harpidetzentzako jario berrien jakinarazpenak + Jarioaren xehetasunak kargatzen… + + jario berri %s + %s jario berri + + LeakCanary ez dago eskuragarri + Egiaztapen maiztasuna + Jakinarazi + ExoPlayer lehenetsia + Beharrezko sare konexioa \ 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 7d139d347..dac49883d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -154,17 +154,17 @@ M B - %s مشترک + ۱ مشترک %s مشترک بدون بازدید - %s بازدید + ۱ بازدید %s بازدید بدون ویدیو - %s ویدیو + ۱ ویدیو %s ویدیو ایجاد @@ -438,7 +438,7 @@ جدید می‌خواهید این گروه را پاک کنید؟ - %d مورد گزیده + ۱ مورد گزیده %d مورد گزیده پردازش خوراک… @@ -446,19 +446,19 @@ بارگیری نشده: %d آخرین به‌روزرسانی خوراک: %s - %d روز + ۱ روز %d روز - %d ساعت + ۱ ساعت %d ساعت - %d دقیقه + ۱ دقیقه %d دقیقه - %d ثانیه + ۱ ثانیه %d ثانیه بله، و ویدیوهای ناقص دیده شده @@ -485,12 +485,12 @@ ∞ ویدیو بیش از ۱۰۰ ویدیو - %s شنونده + ۱ شنونده %s شنونده کسی در حال شنیدن نیست - %s بیننده + ۱ بیننده %s بیننده کسی در حال مشاهده نیست @@ -683,10 +683,29 @@ نیوپایپ به خطایی برخورد. برای گزارش، بزنید خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده - در حال پخش در پس‌زمینه لیک‌کاناری موجود نیست - گام سرعت - تنظیم زیر و بم با شبه‌تن‌ها تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند. - پیش‌گزیدهٔ اگزوپلیر + پیش‌گزیدهٔ اگزوپلیر + آگاهی‌ها + بار کردن جزییات جریان… + اجرای بررسی برای جریان‌های جدید + نیازمند اتّصال شبکه + ، + تغییر وضعیت همه + جریان‌های جدید + + ۱ جریان جدید + %s جریان جدید + + پیکربندی آگاهی جریان در حال پخش کنونی + آگاهی‌های جریان‌های جدید + آگاهی پخش‌کننده + آگاهی‌ها دربارهٔ جریان‌های جدید برای اشتراک‌ها + آگاهی‌ها از کار افتاده‌اند + آگاه شوید + بسامد بررسی + آگاه کردن دربارهٔ جریان‌های جدید از اشتراک‌ها + پاک کردن تمامی پرونده‌های بارگرفته از دیسک؟ + هر شبکه‌ای + اکنون مشترک این کانال شده‌اید \ No newline at end of file diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index c0197c3cf..db1fdfcd8 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -116,5 +116,91 @@ Gamitin ang mabilis ngunit di-saktong seek Haba ng fast forward/-rewind seek Ituloy ang pagpapalabas - Mga Patok Ngayon + Patok Ngayon + Subaybayan ang mga napanood nang video + Kumakailan + Kategorya + Mga Tag + Praybasi + Nakapatay ang Mga Notipikasyon + Publiko + Mga Puna + Nagda-dawnload ang NewPipe + Naka-bukas + Wika ng App + Tungkol dito + Ang video na ito ay may paghihigpit sa edad. +\nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas. + Notipikasyon sa NewPipe + + %s nakikinig + Mga %s nakikinig + + 100+ na mga video + ∞ na mga video + Walang Komento + Ipalabas Lahat + Mga Notipikasyon + Pinagbabawal ang pagkomento + Mga pinahihintulutang karakter sa pangalan ng file + Mga Lisensya + Kasaysayan + Laman ng pangunahing pahina + Live + Palagi + Gusto mo bang burahin ito sa kasaysayan ng paghanap\? + Laman + + %d oras + mga %d oras + + Karaniwan ng Sistema + Nakapribado ang content na ito, kaya hindi ito maipalabas o mai-download ng NewPipe. + Sinisimulan na ang Pagdownload + Pinusuan ng creator + Ni %s + Tulong + Naka-pin na komento + Buksan ang website + Lisensya + Wika + Pribado + URL ng Thumbnail + Hindi nakalista + Nakapatay + Bago at patok + Panimulang wika ng content + Itsura ng App + + %d segundo + Mga %d segundo + + Nilikha ni %s + Mga Kabanata + Walang app sa device mo ang makakabukas nito + Tampok + Huling Pinanood + Kasaysayan + Walang nakikinig + Walang nahanap + Pumalit sa Likuran + Linisin ang kasaysayan ng panonood + + %s nanonood + Mga %s nanonood + + Walang mga video + Madalas na Pinanood + + %s video + Mga %s na video + + + %d minuto + Mga %d minuto + + + %d araw + mga %d araw + \ 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 a90822091..1716cc06b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -685,10 +685,29 @@ Aucun gestionnaire de fichier approprié n\'a été trouvé pour cette action. \nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver \'%s\' dans les paramètres de téléchargement. Commentaire épinglé - Une lecture est déjà en arrière-plan LeakCanary n\'est pas disponible Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos . - Règler la hauteur par demi-tons musicaux - Pas du tempo - Valeur par défaut d’ExoPlayer + Valeur par défaut d’ExoPlayer + Nouveaux flux + Configurer la notification du flux en cours de lecture + Recevoir des notifications + Chargement des détails du flux… + + %s nouveau flux + %s nouveaux flux + + Connexion réseau requise + Notifications + Notifications désactivées + Vous êtes maintenant abonné(e) à cette chaîne + Notification du Lecteur + Notifications pour de nouveaux flux des abonnements + Supprimer tous les fichiers téléchargés du disque \? + Exécuter la vérification de nouveaux flux + Notifications pour de nouveaux flux + N\'importe quel réseau + Fréquence de vérification + Notifications pour de nouveaux flux des abonnements + , + Sélectionner/Désélectionner tout \ 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 f8b0b3a06..7b49adc6d 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -672,8 +672,6 @@ Enfileirado Procurar actualizacións Procurar manualmente novas versións - Axustar o ton do semitóns musicais - Paso do tempo A procurar actualizacións… A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado Cambia o tamaño do intervalo de carga (actualmente %s). Un valor menor pode acelerar o carregamento do vídeo. Cambios poden precisar un reinicio do reprodutor. @@ -682,7 +680,7 @@ Amosar fitas coloridas de Picasso na cima das imaxes que indican a súa fonte: vermello para a rede, azul para o disco e verde para a memoria O \'Sistema de Acceso ao almacenamento\' non está soportado en Android KitKat e anteriores Novos elementos - Predefinido do ExoPlayer + Predefinido do ExoPlayer Amosar \"Travar o reprodutor\" Amosar un snackbar de erro Amosa unha opción de travamento ao usar o reprodutor diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 90c85c483..4d4350f07 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -565,7 +565,7 @@ להתחיל לנגן אוטומטית — %s לנגן את התור לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? - הוספה אוטומטית לתור + סידור אוטומטי בתור התור מהנגן הפעיל יוחלף מעבר מנגן אחד למשנהו עלול להחליף את התור שלך לבקש אישור לפני מחיקת התור @@ -706,11 +706,32 @@ התראת דיווח שגיאה לא נמצאו מנהלי קבצים שמתאימים לפעולה הזאת. \nנא להתקין מנהל קבצים שתומך בתשתית גישה לאחסון. - כבר מתנגן ברקע הערה ננעצה LeakCanary אינה זמינה - התאמת גובה הצליל לפי חצאי טונים מוזיקליים - צעד מקצב - ברירת מחדל של ExoPlayer + ברירת מחדל של ExoPlayer שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית. שינויים דורשים את הפעלת הנגן מחדש. + התראות על תזרימים חדשים להרשמה + תדירות בדיקה + נדרש חיבור לרשת + קבלת הודעה + להחליף את המצב של הכול + הגדרת התראת התזרים שמתנגן כרגע + התראות + + תזרים חדש + %s תזרימים חדשים + %s תזרימים חדשים + %s תזרימים חדשים + + פרטי התזרים נטענים… + הרצת בדיקה על תזרימים חדשים + התראות תזרימים חדשים + הודעה על תזרימים חדשים מהמינויים + , + תזרימים חדשים + התראות נגן + רשת כלשהי + למחוק את כל הקבצים שהורדו מהכונן\? + התראות מושבתות + נרשמת לערוץ הזה \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 01cbab7f6..0ca0c75dc 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -340,7 +340,7 @@ NewPipe razvijaju volonteri koji provode vrijeme donoseći vam najbolje iskustvo. Vratite im kako biste programerima učinili da NewPipe bude još bolji dok uživate u šalici kave. Koje su kartice prikazane na glavnoj stranici Konferencije - Preferirana \'otvori\' akcija + Željena radnja otvaranja streama Zadana radnja pri otvaranju sadržaja — %s Titlovi Promijeni veličinu podnaslova reproduktora i pozadinske stilove reproduktora. Za stupanje na snagu, program se mora ponovo pokrenuti @@ -602,8 +602,8 @@ Ovaj je video dobno ograničen. \nZbog novih YouTube pravila za videa s dobnim ograničenjem, NewPipe ne može pristupiti nijednoj vlastitoj video emisiji i stoga je ne može reproducirati. Preuzimanje je započeto - Dolje možeš odabrati omiljenu noćnu temu - Odaberi omiljenu noćnu temu – %s + Dolje možete odabrati željenu noćnu temu + Odaberi željenu noćnu temu – %s Automatski (tema uređaja) Radio Istaknuto @@ -687,4 +687,29 @@ NewPipe je naišao na grešku, dodirni za prijavu Došlo je do greške, pogledaj obavijest Prekini rad playera + Obavijest reproduktora + Prilagođavanje obavijesti reproduktora + Obavijesti + Novi videozapisi + Obavijesti novih streamova pretplaćenih kanala + Želite li izbrisati sve preuzete datoteke\? + Obavijesti su onemogućene + Pretplatili ste se ovome kanalu + , + Uključiti/isključiti sve + Bilo kakva mreža + Obavijesti novih streamova pretplaćenih kanala + Pokaži zalogajnicu greške + Učitavanje pojedinosti streama… + Pokrenite provjeru novih streamova + Učestalost provjere + LeakCanary nije dostupno + Podešavanje visine tona po glazbenim polutonovima + Obavijesti o novim streamovima + Potrebna mrežna veza + Zadano za ExoPlayer + Primite obavijesti + Za ovu radnju nije pronađen odgovarajući upravitelj datoteka. +\nMolimo vas da instalirate upravitelj za datoteke ili da pokušate onemogućiti \'%s\' u postavkama preuzimanja. + Prikvačeni komentar \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index adaf6a8c0..e5457d3e1 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -683,6 +683,5 @@ %1$s letöltés törölve Rögzített megjegyzés - Már megy a lejátszás a háttérben LeakCanary nem elérhető \ No newline at end of file diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index e9d400be2..d5bc90e6f 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -229,7 +229,6 @@ Aperir con Suggestiones de recerca remote Cargar miniaturas - Notification Monstrante resultatos pro: %s Solmente alicun apparatos pote reproducer videos 2K/4K Initiar le reproductor principal in schermo plen diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index bf02517ac..1a88bb747 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -671,10 +671,28 @@ Tidak ada manajer file yang ditemukan untuk tindakan ini. \nMohon instal sebuah manajer file yang kompatibel dengan Storage Access Framework. Komentar dipin - Sudah diputar di latar belakang LeakCanary tidak tersedia - Langkah tempo - Default ExoPlayer - Atur nada berdasarkan semitone musik + Default ExoPlayer Ubah ukuran interval pemuatan (saat ini %s). Sebuah nilai yang rendah mungkin dapat membuat pemuatan video awal lebih cepat. Membutuhkan sebuah pemulaian ulang pada pemain. + Memuat detail stream… + Frekuensi pemeriksaan + Dibutuhkan koneksi jaringan + Jaringan apa saja + Beritahu saya + , + Alih semua + + %s stream baru + + Jalankan periksa untuk stream baru + Hapus semua file yang terunduh dari disk\? + Notifikasi dinonaktifkan + Notifikasi pemain + Notifikasi + Konfigurasi notifikasi permainan stream saat ini + Stream baru + Notifikasi tentang stream baru untuk langganan + Notifikasi stream baru + Beritahu tentang stream baru dari notifikasi + Anda sekarang berlangganan ke channel ini \ 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 9ab26ae6d..1726c32c3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -94,7 +94,7 @@ In sottofondo Popup Risoluzione predefinita lettore popup - Mostra altre risoluzioni + Mostra risoluzioni più elevate Solo alcuni dispositivi possono riprodurre video 2K/4K Formato video predefinito Ricorda proprietà lettore popup @@ -291,7 +291,7 @@ Elimina i dati delle pagine web memorizzati nella cache Cache metadati svuotata Controlli della velocità di riproduzione - Tempo + Velocità Tono Scollega (può causare distorsione) Nessun flusso disponibile per il download @@ -664,7 +664,7 @@ Avvia il lettore principale a schermo intero Aggiunto alla coda come prossimo Accoda come prossimo - Elaborazione... Potrebbe volerci un attimo + Elaborazione… Potrebbe volerci un attimo Controlla aggiornamenti Verifica manualmente la presenza di nuove versioni Controllo aggiornamenti… @@ -683,10 +683,29 @@ Non è stato trovato alcun gestore di file appropriato per questa azione. \nInstallane uno compatibile con Storage Access Framework. Commento in primo piano - Già in riproduzione in sottofondo LeakCanary non è disponibile - Regola il tono secondo i semitoni musicali - Predefinito ExoPlayer + Predefinito ExoPlayer Cambia la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video. La modifica richiede il riavvio del lettore. - Passo tempo + Notifiche di nuovi contenuti dalle iscrizioni + Frequenza controllo + Connessione di rete richiesta + Ricevi le notifiche + Sei ora iscritto a questo canale + , + Attiva/disattiva tutti + Notifiche per i nuovi contenuti + Notifica del lettore multimediale + Configura la notifica dell\'elemento attualmente in riproduzione + Notifiche + Nuovi contenuti + + %s nuovo contenuto + %s nuovi contenuti + + Caricando i dettagli della stream… + Cancellare tutti i file scaricati dal dispositivo\? + Controlla la presenza di nuovi contenuti + Qualsiasi rete + Le notifiche sono disabilitate + Notifica la presenza di nuovi contenuti dalle iscrizioni \ 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 2bb071f8e..9a15b25d1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -663,7 +663,6 @@ エラーが発生しました。通知をご覧ください NewPipe はエラーに遭遇しました。タップして報告 スナックバーにエラーを表示 - 既にバックグラウンドで再生されています 固定されたコメント この動作に適切なファイルマネージャが見つかりませんでした。 \nStorage Access Frameworkと互換性のあるファイルマネージャをインストールしてください。 @@ -673,5 +672,25 @@ エラー通知を作成 エラーを報告する通知 LeakCanaryが利用不可能です - 緩急音階 + プレイヤー通知 + ストリームの詳細を読み込んでいます… + 登録チャンネルの新しいストリームについて通知する + , + 通知は無効化されています + ExoPlayer のデフォルト + 通知を受け取る + このチャンネルを購読しました + ディスクからダウンロードしたすべてのファイルを削除しますか? + すべて切り替え + 確認する頻度 + 新しいストリームのチェックを実行 + 購読チャンネルの新しいストリームに関する通知 + 新しいストリームの通知 + + %s 件の新しいストリーム + + 新しいストリーム + 通知 + 現在再生しているストリームの通知を構成 + 読み込む間隔を変更します (現在 %s)。小さい値にすると初回読み込み時間が短くなります。変更にはプレイヤーの再起動が必要です。 \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index b163640b2..d0d54c62d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -25,7 +25,7 @@ 다음/유사한 비디오 표시 지원하지 않는 URL입니다 기본 컨텐츠 언어 - 비디오 & 오디오 + 비디오 및 오디오 비디오 재생, 구간: 업로더 썸네일 싫어요 @@ -43,7 +43,7 @@ 네트워크 오류 \"검색\" 버튼을 눌러서 시작하세요 컨텐츠 - 연령 제한 컨텐츠 + 연령 제한 컨텐츠 보여주기 라이브 오류 모든 썸네일을 불러올 수 없습니다 @@ -52,7 +52,7 @@ 컨텐츠를 사용할 수 없습니다 다운로드 메뉴를 설정할 수 없습니다 죄송합니다. 오류가 발생했습니다. - 이메일을 통해 오류 보고 + 이메일을 통해 이 오류 보고 죄송합니다. 오류가 발생했습니다. 보고 정보: @@ -81,7 +81,7 @@ 팝업 기본 팝업 해상도 높은 해상도 표시 - 일부 기기에서만 2K/4K 해상도 재생이 지원됩니다 + 일부 기기에서만 2K/4K 영상을 재생할 수 있습니다 기본 비디오 형식 검은 테마 팝업 크기 및 위치 기억 @@ -98,7 +98,7 @@ 비디오 상세 정보 페이지에서 백그라운드/팝업 재생 버튼을 누를 경우 팁을 표시합니다 플레이어 동작 - 기록 & 캐시 + 기록 및 캐시 팝업 모드에서 재생 중 오류 보고 전부 @@ -108,13 +108,13 @@ 되돌리기 전부 재생 NewPipe 알림 - NewPipe 백그라운드 및 팝업 플레이어 알림 + NewPipe 플레이어 알림 [알 수 없음] 앱/UI 충돌 이 스트림을 재생할 수 없습니다 복구할 수 없는 플레이어 오류가 발생했습니다 플레이어 오류로부터 복구 중 - 무엇을:\\n요청:\\n컨텐츠 언어:\\n서비스:\\nGMT 기준 시간:\\n패키지:\\n버전:\\n안드로이드 버전: + 무엇을:\\n요청:\\n컨텐츠 언어:\\컨텐츠 국가:\\n앱 언어:\\n서비스:\\nGMT 기준 시간:\\n패키지:\\n버전:\\n안드로이드 버전: 결과 없음 구독할 항목을 추가하세요 @@ -188,7 +188,7 @@ 재생목록 북마크 이곳에 추가 정확하지는 않지만 빠른 탐색 - 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다 + 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다. 5, 15, 25초 탐색은 이 기능과 같이 작동하지 않습니다 다음 스트림을 자동으로 대기열에 추가하기 이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생합니다 기본 콘텐츠 국가 @@ -201,7 +201,7 @@ 데이터베이스 가져오기 데이터베이스 내보내기 현재 시청 기록 및 구독 목록을 덮어쓰기 합니다 - 시청 기록, 구독 목록과 재생목록을 내보냅니다 + 시청 기록과 구독 목록, 재생 목록, 설정을 내보냅니다 외부 플레이어는 이러한 종류의 링크를 지원하지 않습니다 발견된 비디오 스트림 없음 발견된 오디오 스트림 없음 @@ -300,11 +300,11 @@ 시청 기록 삭제하기 동영상 시청 기록과 저장된 재생 위치를 삭제합니다 모든 시청 기록을 삭제하시겠습니까\? - 동영상 시청 기록이 삭제되었습니다. + 동영상 시청 기록이 삭제되었습니다 검색 기록 삭제 검색 기록을 모두 삭제합니다 모든 검색 기록을 삭제하시겠습니까\? - 검색 기록이 삭제되었습니다. + 검색 기록이 삭제되었습니다 NewPipe 개인정보 보호 정책 NewPipe 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. \nNewPipe 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다. @@ -393,7 +393,7 @@ 리스트 내 위치 표시 리스트에서 재생 위치를 표시합니다 데이터 삭제 - 재생위치 삭제완료. + 재생위치 삭제완료 파일이 이동되거나 삭제되었습니다 파일을 덮어쓰기할 수 없습니다 해당 이름으로 대기된 다운로드가 있습니다 @@ -431,7 +431,7 @@ 빠른-감기/되감기 찾는 시간 피어튜브 인스턴스 당신이 선호하는 피어튜브 인스턴스를 선택하세요. - %s에서 당신에게 가장 잘 어울리는 인스턴스를 찾으세요. + %s에서 당신이 좋아하는 인스턴스를 찾으세요. 인스턴스 추가하기 인스턴스 URL을 입력하세요. 인스턴스를 검증할 수 없습니다. @@ -517,4 +517,19 @@ 어두운 테마 최대 3개까지 축소 알림에 표시될 항목을 고를 수 있습니다! 아래 항목을 터치해서 편집하세요. 위에서부터 체크된 3개 항목은 축소 알림일 때도 표시됩니다 + 유튜브의 \"제한 모드\"를 활성화 + 비디오 해싱 진행 알림 + 새로운 스트림 + 구독에서 새 스트림이 있을 때 알림 + 오류 보고 알림 + reCAPTCHA 쿠키를 비웠습니다 + 플레이어 알림 + 알림 + 유튜브는 잔인할 수 있는 컨텐츠를 숨겨주는 \"제한 모드\"를 제공합니다 + reCAPTCHA 쿠키 비우기 + 플레이어 크래시 발생 + 없음 + 전체화면으로 주 플레이어 시작 + 비디오 해시 알림 + GitHub에 보고 \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index fe48ef520..b2829ba27 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -672,7 +672,6 @@ Viser et krasjalternativ ved bruk av avspilleren Det oppstod en feil. Sjekk merknaden. Festet kommentar - Spilles allerede i bakgrunnen Feilrapport-merknad Merknader for innrapportering av feil NewPipe-feil. Trykk for å rapportere. @@ -681,7 +680,5 @@ Installer en filbehandler først, eller skru av «%s» i nedlastingsinnstillingene. Installer en filbehandler som støtter lagringstilgangsrammeverk først. LeakCanary er ikke tilgjengelig - ExoPlayer-forvalg - Juster toneart etter musikalske halvtoner - Tempo-steg + ExoPlayer-forvalg \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index efbb64f6a..3a943d2ca 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -677,7 +677,6 @@ NewPipe meldt fout, tik voor bericht Foutmelding Maak een foutmelding - Speelt al op de achtergrond Korte foutmelding weergeven Er is geen geschikte bestandsbeheerder gevonden voor deze actie. \nInstalleer een bestandsbeheerder of probeer \'%s\' uit te schakelen in de download instellingen. @@ -686,7 +685,5 @@ Vastgemaakt commentaar LeakCanary is niet beschikbaar Verander de laad interval tijd (nu %s). Een lagere waarde kan het initiële laden van de video versnellen. De wijziging vereist een herstart van de speler. - Pas de toonhoogte aan met muzikale halve tonen - Tempo stap - ExoPlayer standaard + ExoPlayer standaard \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d755cbcaf..6e2c95119 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -22,7 +22,7 @@ Wybierz folder zapisywania plików audio Domyślna rozdzielczość Odtwórz w Kodi - Zainstalować brakującą aplikację Kore\? + Czy zainstalować brakującą aplikację Kore\? Pokazuj opcję „Odtwórz z Kodi” Wyświetlaj opcję odtwarzania wideo przez centrum multimedialne Kodi Dźwięk @@ -406,7 +406,7 @@ Wyczyść dane Usunięto pozycje odtwarzania Plik usunięty albo przeniesiony - Plik z tą nazwą już istnieje + Plik o tej nazwie już istnieje Nie udało się nadpisać pliku Plik o tej samej nazwie oczekuje na pobranie NewPipe został zamknięty podczas pracy nad plikiem @@ -539,7 +539,7 @@ Tak, i częściowo obejrzane wideo Wideo, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte. \nCzy na pewno\? Tego nie da się cofnąć! - Usunąć obejrzane wideo\? + Czy usunąć obejrzane wideo\? Usuń obejrzane Oryginalne teksty z usług będą widoczne w strumieniowanych pozycjach Pokazuj oryginalny czas na pozycjach @@ -701,12 +701,33 @@ \nZainstaluj menedżer plików lub spróbuj wyłączyć „%s” w ustawieniach pobierania. Nie znaleziono odpowiedniego menedżera plików dla tej akcji. \nZainstaluj menedżer plików zgodny z Storage Access Framework. - Już jest odtwarzane w tle Przypięty komentarz LeakCanary jest niedostępne Rozmiar interwału ładowania odtwarzania Zmień rozmiar interwału ładowania (aktualnie %s). Niższa wartość może przyspieszyć początkowe ładowanie wideo. Zmiany wymagają ponownego uruchomienia odtwarzacza - domyślny ExoPlayera - Dostosuj wysokość półtonami - Krok tempa + domyślny ExoPlayera + Powiadomienie odtwarzacza + Skonfiguruj powiadomienie aktualnie odtwarzanego strumienia + Uruchom sprawdzenie nowych strumieni + Dowolna sieć + Subskrybujesz teraz ten kanał + Powiadomienia + Nowe strumienie + Powiadomienia o nowych strumieniach dla subskrypcji + + %s nowy strumień + %s nowe strumienie + %s nowych strumieni + %s nowych strumieni + + Ładowanie szczegółów strumienia… + Powiadomienia o nowych strumieniach + Powiadamiaj o nowych strumieniach z subskrypcji + Częstotliwość sprawdzania + Wymagane połączenie sieciowe + Czy usunąć wszystkie pobrane pliki z dysku\? + Powiadomienia są wyłączone + Otrzymuj powiadomienia + , + Przełącz wszystkie \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 408d33e87..d19196c06 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -682,11 +682,30 @@ Mostrar um snackbar de erro Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download. - Já está tocando em segundo plano Comentário fixado O LeakCanary não está disponível - Passo do tempo Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player reinicie. - Ajustar o tom por semitons musicais - ExoPlayer padrão + ExoPlayer padrão + Notificação do reprodutor + Configurar a notificação do fluxo da reprodução atual + Notificações + Novos streams + Notificações sobre novas transmissões para inscrições + Notificações de novas transmissões + Notificar sobre novas transmissões de inscrições + Frequência de verificação + Nenhuma rede + Excluir todos os arquivos baixados do disco\? + Agora você se inscreveu neste canal + Alternar tudo + , + Carregando detalhes da transmissão… + + %s nova transmissão + %s novas transmissões + + Executar verificação de novas transmissões + Conexão de rede necessária + As notificações estão desativadas + Seja notificado \ 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 a9d43252b..aa3862b6b 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -683,10 +683,29 @@ Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework. Comentário fixado - Já está a reproduzir em segundo plano LeakCanary não está disponível Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. Se fizer alterações é necessário reiniciar. - Ajustar o tom por semitons musicais - Passo do tempo - Predefinido do ExoPlayer + Predefinido do ExoPlayer + Notificações + A carregar detalhes do fluxo… + Verificar se há novos fluxos + Notificações sobre novos fluxos + Frequência da verificação + Apagar todos os ficheiros descarregados do disco\? + Notificações são desativadas + + %s fluxo novo + %s fluxos novos + + Notificar sobre novos fluxos de assinaturas + Conexão de rede necessária + Qualquer rede + Alternar tudo + Notificações sobre novos fluxos para assinaturas + Notificação do reprodutor + Configurar a notificação da reprodução do fluxo atual + Seja notificado + Agora assinou este canal + , + Novos fluxos \ 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 f9b9856ee..9563c9a6f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -554,7 +554,6 @@ URL não reconhecido. Abrir com outra aplicação\? Enfileiramento automático Embaralhar - Notificação Apenas em Wi-Fi Nada Mudar de um reprodutor para outro pode substituir a sua fila @@ -683,11 +682,30 @@ \nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar. Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework. - Já está a reproduzir em segundo plano Comentário fixado LeakCanary não está disponível - Ajustar o tom por semitons musicais - Predefinido do ExoPlayer + Predefinido do ExoPlayer Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. Se fizer alterações é necessário reiniciar. - Passo do tempo + Notificação do reprodutor + Configurar a notificação da reprodução do fluxo atual + Notificações + A carregar detalhes do fluxo… + Verificar se há novos fluxos + Notificações sobre novos fluxos + Notificar sobre novos fluxos de assinaturas + Frequência da verificação + Conexão de rede necessária + Qualquer rede + Agora assinou este canal + Alternar tudo + Apagar todos os ficheiros descarregados do disco\? + Novos fluxos + Notificações sobre novos fluxos para assinaturas + + %s fluxo novo + %s fluxos novos + + Seja notificado + Notificações são desativadas + , \ 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 e83fc5462..67108b500 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -679,7 +679,6 @@ Procesarea.. Poate dura un moment Verifică dacă există actualizări Verifică manual dacă există versiuni noi - Se redă deja pe fundal Comentariu lipit Notificare cu raport de eroare Afișează opțiunea de a întrerupe atunci când utilizați playerul diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 93ae31506..2a16a4573 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -691,8 +691,6 @@ Проверить обновления Проверка обновлений… Новое на канале - Отчёт об ошибках плеера - Подробные отчёты об ошибках плеера вместо коротких всплывающих сообщений (полезно при диагностике проблем) Уведомления Новые видео Уведомления о новых видео в подписках @@ -718,11 +716,13 @@ \nПожалуйста, установите файловый менеджер, или попробуйте отключить \'%s\' в настройках загрузок. Для этого действия не найдено подходящего файлового менеджера. \nПожалуйста, установите файловый менеджер, совместимый со Storage Access Framework (SAF). - Уже проигрывается в фоне Закреплённый комментарий LeakCanary недоступна - Регулировка высоты тона по музыкальным полутонам - Шаг темпа - Стандартное значение ExoPlayer + Стандартное значение ExoPlayer Изменить размер интервала загрузки (сейчас %s). Меньшее значение может ускорить начальную загрузку видео. Изменение значения потребует перезапуска плеера. + Загрузка деталей трансляции… + Проверить на наличие новых трансляций + Удалить все загруженные файлы\? + Уведомления плеера + , \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 3fdd9b768..7c6120832 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -683,10 +683,29 @@ \nPro praghere installa unu gestore de documentos cumpatìbile cun su \"Sistema de Atzessu a s\'Archiviatzione\". Faghe serrare su riproduidore Cummentu apicadu - Giai in riprodutzione in s\'isfundu LeakCanary no est a disponimentu - Règula s\'intonatzione in base a sos semitonos musicales - Passu de su ritmu - Valore ExoPlayer predefinidu + Valore ExoPlayer predefinidu Muda sa mannària de s\'intervallu de carrigamentu (in custu momentu %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu de incumintzu de su vìdeu. Sas modìficas tenent bisòngiu de torrare a allùghere su riproduidore. + Cunfigura sa notìfica de su flussu in cursu de riprodutzione + Notìficas de flussos noos dae sas iscritziones + + %s flussu nou + %s flussos noos + + Carrighende sos detàllios de su flussu… + Avia una verìfica pro flussos noos + Notìficas pro sos flussos noos + Notìfica de flussos noos dae sas iscritziones + Frecuèntzia de controllu + Connessione de retze rechesta + Cale si siat retze + Sas notìficas sunt disabilitadas + Retzi notìficas + , + Ativa/disativa totu + Como ses iscritu a custu canale + Notìfica de su riproduidore + Notìficas + Flussos noos + Iscantzellare totu sos archìvios iscarrigados dae su discu\? \ 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 265dec114..c47562bb0 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -647,8 +647,6 @@ 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 videné - Načítavanie podrobností o kanáli… - Chyba pri zobrazení podrobností kanála Vypnuté Zapnuté Režim tabletu @@ -698,8 +696,16 @@ Zobrazí možnosť zlyhania pri používaní prehrávača Zobraziť krátke oznámenie chyby Oznámte chybu - Upraviť výšku poltónov - Krok tempa - ExoPlayer preddefinovaný + ExoPlayer preddefinovaný Zmeniť interval načítania (aktuálne %s). Menšia hodnota môže zvýšiť rýchlosť prvotného načítania videa. Zmena vyžaduje reštart. + Upozornenia + Frekvencia kontroly + Vymazať všetky stiahnuté súbory z disku\? + Upozornenia sú vypnuté + Upozornenie z prehrávača + Nastavte notifikáciu aktuálneho prehrávania + Je vyžadované pripojenie na internet + Začali ste odoberať tento kanál + , + Zapnúť všetko \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index d08bdbf12..b7e66a85b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -175,7 +175,7 @@ Välj en kanal Inga kanal prenumerationer ännu Välj en kiosk - Trend + Trendigt Topp 50 Nytt och populärt Ta bort @@ -243,7 +243,7 @@ Byt namn 1 objekt borttaget. Ingen app installerad för att spela upp filen - NewPipes Sekretesspolicy + NewPipes sekretesspolicy NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport. Läs sekretesspolicy @@ -258,7 +258,7 @@ Vill du också importera inställningar? Öppna navigationspanelen Stäng navigationspanelen - Föredragen \'öppna\' åtgärd + Föredragen \"öppna\" åtgärd Standardåtgärden när du öppnar innehåll — %s Videospelare Bakgrundsspelare @@ -524,7 +524,7 @@ Skapad av %s Ingen spellista har bokmärkts än Visa endast prenumerationer som inte grupperats - Skala tumnagel till 1:1-förhållande + Skala miniatyrbild till 1: 1 bildförhållande Endast över Wi-Fi Skala videominiatyrbilden som visas i aviseringen från 16:9- till 1:1-förhållande (kan orsaka bildförvrängning) Starta uppspelning automatiskt — %s @@ -637,7 +637,7 @@ Markera som sedd Ej listad Aktuellt - Nattema + Natt-tema Aviseringar för videohashningsframsteg Miniatyrbild-webbadress Inaktivera medietunnel om du upplever en svart skärm eller stamning vid videouppspelning @@ -682,11 +682,30 @@ \nInstallera en filhanterare eller testa att inaktivera \'%s\' i nedladdningsinställningarna. Ingen lämplig filhanterare hittades för denna åtgärd. \nInstallera en filhanterare som är kompatibel med Storage Access Framework. - Spelas redan i bakgrunden Fäst kommentar LeakCanary är inte tillgänglig - Justera tonhöjden med musikaliska halvtoner - ExoPlayer standard + ExoPlayer standard Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver omstart av spelaren. - Temposteg + Validera frekvens + Kräver nätverksanslutning + Alla nätverk + Radera alla nedladdade filer från disken\? + Notifikationer är avstängda + Bli medelad + Du har nu prenumenerat till denna kanalen + Notifikationer om nya strömmar för prenumenanter + + %s Ny ström + %s Nya strömmar + + Konfigurera meddelande om aktuell ström som spelas upp + Kör leta efter nya strömmar + Medela om nya strömmar från prenumenanter + Notifikationer + Nya strömmar + Laddar strömdetaljer… + Nya strömmnings notifikationer + , + Spelaravisering + Växla alla \ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index d7c920f2b..827da452a 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -253,7 +253,6 @@ இயக்குதலைத் மறுதொடர் நி நிகழ்வு ஏற்கனவே உள்ளது - அறிவிப்பு யூடியூபின் \"கட்டுப்பாடு பயன்முறை\"ஐ இயக்கு பாடல்கள் பிழைகளைப் புகாரளிக்க அறிவிப்புகள் diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 60542e0b6..3958e02b0 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -371,7 +371,6 @@ reCAPTCHA సవాలు reCAPTCHA సవాలు అభ్యర్థించబడింది ప్లేజాబితాను ఎంచుకోండి - ఇప్పటికే వెనుకగా ప్లే అవుతోంది డాటాబేసుని ఎగుమతిచేయుము యాప్ పునఃప్రారంభించబడిన తర్వాత భాష మారుతుంది ఛానెల్ వివరాలను చూపు diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index 82e0feaac..d41b317e8 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -65,4 +65,5 @@ \n \nBuksan ang \"%1$s\" sa ayos ng app kung gusto mong makita ito. Mga Artista + Nakalutang \ 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 12a2d4348..0f405f132 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -541,7 +541,7 @@ Lütfen hatanızı tartışan sorunun var olup olmadığını kontrol edin. Yinelenen istekler oluştururken, bizden asıl hatayı düzeltmek için harcayabileceğimiz zamanı alırsınız. Henüz oynatma listesi yer imleri yok Asla - Yalnızca Wi-Fi\'de + Yalnızca Wi-Fi Oynatmayı kendiliğinden başlat — %s Oynatma kuyruğu URL tanınamadı. Başka bir uygulamayla açılsın mı\? @@ -682,11 +682,30 @@ Hata raporları için bildirimler Oynatıcı kullanırken çöktürme seçeneği gösterir Oynatıcıyı çöktür - Zaten arka planda oynuyor Sabitlenmiş yorum LeakCanary yok Yükleme ara boyutunu değiştir (şu anda %s). Düşük bir değer videonun ilk yüklenişini hızlandırabilir. Değişiklikler oynatıcının yeniden başlatılmasını gerektirir. - ExoPlayer öntanımlısı - Tempo adımı - Perdeyi müzikal yarım tonlarla uyarla + ExoPlayer öntanımlısı + Yeni akış bildirimleri + Bildirimler + + %s yeni akış + %s yeni akış + + Yeni akışları denetlemeyi çalıştır + Oynatıcı bildirimi + Oynatılan akış bildirimini yapılandırın + Yeni akışlar + Akış ayrıntıları yükleniyor… + Abonelikler için yeni akışlarla ilgili bildirimler + Gerekli ağ bağlantısı + Bildirimler devre dışı + Bildirim alın + Artık bu kanala abone oldunuz + Aboneliklerden yeni akışlar hakkında bildirim gönder + Denetleme sıklığı + Herhangi bir ağ + İndirilen tüm dosyalar diskten silinsin mi\? + , + Tümünü değiştir \ 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 3f4d1e214..0768f241b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -58,7 +58,6 @@ Завантаження Звіт про помилку Усе - Так Вимкнено Збій застосунку/інтерфейсу Ваш коментар (англійською): @@ -699,11 +698,31 @@ \nУстановіть файловий менеджер, сумісний зі Storage Access Framework. Показати панель помилок Створити сповіщення про помилку - Уже відтворюється у фоновому режимі Закріплений коментар LeakCanary недоступний - Крок темпу - Регулювання висоти звуку за музичними півтонами - Типовий ExoPlayer + Типовий ExoPlayer Змінити розмір інтервалу завантаження (наразі %s). Менше значення може прискорити початкове завантаження відео. Зміни вимагають перезапуску програвача. + Ви підписалися на цей канал + , + Сповіщення про нові трансляції для підписок + + %s нова трансляція + %s нові трансляції + %s нових трансляцій + %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 71838b160..08bf7cae0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -672,8 +672,6 @@ \nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống. Thay đổi kích thước khoảng thời gian tải (tầm khoảng %s). Để ở giá trị thấp hơn có thể sẽ tăng tốc độ tải video hơn ban đầu. Khởi động lại trình phát để áp dụng thay đổi. LeakCanary không khả dụng - Điều chỉnh cao độ theo nhạc nền âm nhạc - Nhịp độ tiếp theo - ExoPlayer mặc định + ExoPlayer mặc định Bình luận được ghim \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 65054bebe..277fa6937 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -145,7 +145,7 @@ 睇過嘅紀錄 恢復播放 返返最後播放到去嗰個位 - 播放清單有排位 + 清單度睇到播到去邊 縮圖放到去 1:1 長寬比 顯示喺通知嘅影片縮圖由 16:9 放到去 1:1 長寬比 (話唔定會鬆郁矇) 通知色彩化 @@ -164,7 +164,7 @@ 顯示留言 關閉去隱藏留言 搜尋紀錄 - 喺播放清單顯示位置編號 + 喺清單入面顯示最後播放到去邊個位 抹除資料 顯示描述 抹除咗影像快取 @@ -526,7 +526,7 @@ 開啟網站 主機 - 喺影片「詳情:」度撳一下「幕後播」或者「浮面播」個掣嘅時候顯示提示 + 喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示 紀錄 紀錄 攝下個等陣播 @@ -577,7 +577,7 @@ \n您肯定?剷走咗冇得掹個囉喎! 「儲存空間存取框架」呢壇嘢,俾您下載落外置 SD 卡嗰度 Android 10 打上局住要用「儲存空間存取框架」 - ExoPlayer 預設值 + ExoPlayer 預設值 外置儲存空間用唔到 排隊尾輪候播 刪除咗搜尋紀錄 @@ -586,4 +586,25 @@ 收起播放清單 唔再收起 係咪要刪除呢個播放清單? + 播放器通知 + 調整目前播放緊嘅串流嘅通知 + 訂閱有新加串流嘅通知 + 載入緊串流詳細資料… + 通知訂閱有新加串流 + 檢查頻率 + 須要網絡連線 + 不拘任何網絡 + 收取通知 + 您現已訂閱呢個頻道 + 全部切換 + 執行檢查有冇新加串流 + 通知 + 新加串流 + + %s 個新加串流 + + 新加串流通知 + 係咪要喺磁碟機上面消除晒全部下載咗嘅檔案? + 通知已停用 + 單曲 \ 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 0f74f5bde..8b5a24661 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -539,7 +539,6 @@ 作用中播放器的佇列可能會被取代 從一個播放器切換到另一個可能會取代您的佇列 清除佇列前要求確認 - 通知 正在緩衝 隨機播放 @@ -638,8 +637,6 @@ 拖動列縮圖預覽 被創作者加心號 標記為已看過 - 正在載入頻道詳細資訊…… - 顯示頻道詳細資訊時發生錯誤 在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體 顯示圖片指示器 遠端搜尋建議 @@ -674,10 +671,28 @@ NewPipe 遇到錯誤,點擊以回報 發生錯誤,請檢視通知 釘選的留言 - 已經在背景播放 LeakCanary 無法使用 - 步進時間 - ExoPlayer 預設值 + ExoPlayer 預設值 變更載入間隔大小(目前為 %s)。較低的值可能會提昇初始影片載入速度。變更需要重新啟動播放器。 - 按音樂半音調整音高 + 播放器通知 + 通知 + 正在載入串流詳細資訊…… + 您已訂閱此頻道 + , + 切換全部 + 新串流通知 + 設定目前播放串流通知 + 需要網路連線 + 從磁碟抹除所有已下載的檔案? + 取得通知 + 新串流 + 關於訂閱的新串流通知 + 執行新串流檢查 + 通知來自訂閱的新串流 + 檢查頻率 + 通知已停用 + + %s 個新串流 + + 任意網路 \ No newline at end of file diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index d72be0ccf..bf42aaf0e 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -56,20 +56,21 @@ progressive_load_interval - default + 64 + exoplayer_default 1 KiB 16 KiB 64 KiB 256 KiB - @string/progressive_load_interval_default + @string/progressive_load_interval_exoplayer_default 1 16 - 64 + @string/progressive_load_interval_default_value 256 - default + @string/progressive_load_interval_exoplayer_default_value minimize_on_exit_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 792e6414b..80f79cfdd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -497,10 +497,10 @@ Pitch Unhook (may cause distortion) Fast-forward during silence - Adjust pitch by musical semitones Step - Tempo step Reset + Percent + Semitone In order to comply with the European General Data Protection Regulation (GDPR), we hereby draw your attention to NewPipe\'s privacy policy. Please read it carefully. \nYou must accept it to send us the bug report. @@ -733,7 +733,7 @@ On Off - ExoPlayer default + ExoPlayer default Notifications are disabled Get notified diff --git a/fastlane/metadata/android/ar_LY/changelogs/63.txt b/fastlane/metadata/android/ar_LY/changelogs/63.txt new file mode 100644 index 000000000..535376e48 --- /dev/null +++ b/fastlane/metadata/android/ar_LY/changelogs/63.txt @@ -0,0 +1,7 @@ +### تحسينات +- استيراد / تصدير إعدادات # 1333 +- تقليل السحب على المكشوف (تحسين الأداء) #1371 +- تحسينات رمز صغير # 1375 +- أضف كل شيء عن الناتج المحلي الإجمالي #1420 +### ثابت +- تنزيل: إصلاح تحطم على تحميل التنزيلات التي لم تنته من .ملفات جيجا # 1407 diff --git a/fastlane/metadata/android/ar_LY/changelogs/64.txt b/fastlane/metadata/android/ar_LY/changelogs/64.txt new file mode 100644 index 000000000..bb2e2f3fd --- /dev/null +++ b/fastlane/metadata/android/ar_LY/changelogs/64.txt @@ -0,0 +1,7 @@ +### تحسينات +- أضيفت القدرة على الحد من جودة الفيديو في حالة استخدام البيانات المتنقلة. #1339 +- تذكر السطوع للدورة # 1442 +- تحسين أداء التنزيل لوحدات المعالجة المركزية الأضعف # 1431 +- إضافة (العمل) دعم الدورة الإعلامية # 1433 +### إصلاح +- فيكس تحطم على فتح التنزيلات (فيكس متاحة الآن ليبني الإصدار) #1441 diff --git a/fastlane/metadata/android/ar_LY/full_description.txt b/fastlane/metadata/android/ar_LY/full_description.txt new file mode 100644 index 000000000..f1a39cbdd --- /dev/null +++ b/fastlane/metadata/android/ar_LY/full_description.txt @@ -0,0 +1 @@ +نيو بايب لا تستخدم أي مكتبات إطار جوجل ، أو يوتيوب API. إنه يوزع الموقع فقط من أجل الحصول على المعلومات التي يحتاجها. لذلك يمكن استخدام هذا التطبيق على الأجهزة دون تثبيت خدمات جوجل. أيضا ، لا تحتاج إلى حساب يوتيوب لاستخدام نيو بايب ، وانها الخيط. diff --git a/fastlane/metadata/android/ar_LY/short_description.txt b/fastlane/metadata/android/ar_LY/short_description.txt new file mode 100644 index 000000000..72c4d0ee6 --- /dev/null +++ b/fastlane/metadata/android/ar_LY/short_description.txt @@ -0,0 +1 @@ +واجهة يوتيوب خفيفة الوزن مجانية للاندرويد diff --git a/fastlane/metadata/android/de/changelogs/985.txt b/fastlane/metadata/android/de/changelogs/985.txt index e2a10be2e..43623578f 100644 --- a/fastlane/metadata/android/de/changelogs/985.txt +++ b/fastlane/metadata/android/de/changelogs/985.txt @@ -1 +1 @@ -Behoben, dass YouTube keinen Stream abspielte. +Behoben, dass YouTube keinen Stream abspielte diff --git a/fastlane/metadata/android/es/changelogs/66.txt b/fastlane/metadata/android/es/changelogs/66.txt new file mode 100644 index 000000000..ff20c3517 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/66.txt @@ -0,0 +1 @@ +- Revisado, minimizar el Reproductor a Imagen Sobre Imagen no destruye el Reproductor cuando no se permite el permiso para la ventana emergente. diff --git a/fastlane/metadata/android/es/changelogs/68.txt b/fastlane/metadata/android/es/changelogs/68.txt new file mode 100644 index 000000000..728f819f9 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/68.txt @@ -0,0 +1,8 @@ +- Mostrar "Recuento de suscriptores no disponible" en esos casos +- Corregir NPE cuando una lista de reproducción de YouTube está vacía +- Corrección rápida de los quioscos en SoundCloud +- Refactorización y corrección de errores #1623 + - Arreglar el resultado cíclico de la búsqueda #1562 + - Corrección de la barra de búsqueda no estática + - Fix YT Premium video no se bloquean correctamente + - Corregir los vídeos que a veces no se cargan (debido al análisis sintáctico de DASH) diff --git a/fastlane/metadata/android/es/changelogs/71.txt b/fastlane/metadata/android/es/changelogs/71.txt new file mode 100644 index 000000000..7c98dafa3 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/71.txt @@ -0,0 +1,6 @@ +### Mejoras +* Añadir notificación de actualización de la aplicación para la versión de GitHub (#1608 por @krtkush) +* Varias mejoras en el gestor de descargas (#1944 de @kapodamy): +* añadir los iconos blancos que faltan y utilizar la manera de cambiar los colores de los iconos + * comprobar si el iterador está inicializado (corrige #2031) + * permite reintentar las descargas con el error "post-procesamiento fallido" en el nuevo muxer diff --git a/fastlane/metadata/android/es/changelogs/730.txt b/fastlane/metadata/android/es/changelogs/730.txt new file mode 100644 index 000000000..45f336afd --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/730.txt @@ -0,0 +1,2 @@ +# Corregido +-Parche rápido del error de la función de descifrado de nuevo. diff --git a/fastlane/metadata/android/es/changelogs/770.txt b/fastlane/metadata/android/es/changelogs/770.txt index a043c0c9f..f0abd100d 100644 --- a/fastlane/metadata/android/es/changelogs/770.txt +++ b/fastlane/metadata/android/es/changelogs/770.txt @@ -1,4 +1,4 @@ Cambios en 0.17.2 Corregido -- Corregido no hay vídeo estaba disponible +- Corregido, el video no estaba disponible diff --git a/fastlane/metadata/android/fa/changelogs/850.txt b/fastlane/metadata/android/fa/changelogs/850.txt new file mode 100644 index 000000000..ef761776f --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/850.txt @@ -0,0 +1 @@ +در این نسخه سایت یوتیوب آپدیت شد. سایت قدیمی منسوخ شد و دیگر قابل استفاده نخواهد بود، درنتیجه لازم است که شما اپلیکیشن را آپدیت کنید. diff --git a/fastlane/metadata/android/fa/changelogs/982.txt b/fastlane/metadata/android/fa/changelogs/982.txt new file mode 100644 index 000000000..7c5f9147c --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/982.txt @@ -0,0 +1 @@ +مشکل عدم نمایش پخش‌زنده برطرف شد. diff --git a/fastlane/metadata/android/fa/changelogs/985.txt b/fastlane/metadata/android/fa/changelogs/985.txt new file mode 100644 index 000000000..ba5413d49 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/985.txt @@ -0,0 +1 @@ +مشکل عدم نمایش پخش‌زنده برطرف شد diff --git a/fastlane/metadata/android/he/changelogs/986.txt b/fastlane/metadata/android/he/changelogs/986.txt new file mode 100644 index 000000000..53dabb4cf --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/986.txt @@ -0,0 +1,16 @@ +חדש +• התראות על תזרימים חדשים +• מעבר חלק בין נגני רקע ווידאו +• שינוי גובה הצליל בחצאי טונים +• הוספת התור מהנגן הראשי לתור + +שיפורים +• גודל צעד מהירות/גובה צליל נשמר +• צמצום זמן הטעינה הראשונית בנגן הווידאו +• מנשק המשתמש בנגן Android TV השתפר +• אישור לפני מחיקת כל הקבצים שהורדו + +תיקונים +• תוקנה התופעה שכפתורי המדיה לא מסתירים את פקדי הנגן +• תוקנה איפוס נגינה בשינוי סוג נגן +• תוקנה החלפת חלונית רשימת הנגינה diff --git a/fastlane/metadata/android/id/changelogs/986.txt b/fastlane/metadata/android/id/changelogs/986.txt new file mode 100644 index 000000000..886467178 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/986.txt @@ -0,0 +1,16 @@ +Baru +• Notifikasi untuk stream baru +• Transisi tanpa batas antara pemutar latar belakang & video +• Ubah nada dgn semitone +• Tambahkan antrean pemain utama ke daftar putar + +Perbaikan +• Ingat ukuran langkah kecepatan/nada +• Kurangi buffering panjang awal di pemutar video +• Tingkatkan UI pemutar utk Android TV +• Konfirmasi sblm menghapus semua file yang diunduh + +Diperbaiki +• Tombol media agar tdk menyembunyikan kontrol pemain +• Reset pemutaran pada perubahan tipe pemutar +• Memutar dialog dftr putar diff --git a/fastlane/metadata/android/nb-NO/changelogs/986.txt b/fastlane/metadata/android/nb-NO/changelogs/986.txt new file mode 100644 index 000000000..d60a5e1d5 --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/986.txt @@ -0,0 +1,16 @@ +Nytt +• Merknader for nye strømmer +• Sømløs overgang i bakgrunn og videospillere +• Endre toneart med halvtoner +• Legg til hovedspillerkøen på slutten av en spilleliste + +Forbedret +• Husk hastighet/toneart-stegstørrelse +• Unngå lang mellomlagring i videospilleren +• Forbedret spillergrensesnitt for Android TV +• Bekreft sletting av alle nedlastede filer + +Fikset +• Mediaknapper som ikke skjuler avspillerkontroller +• Avspillingstilbakestilling ved endring av spillertype +• Rotering av spillelistedialog diff --git a/fastlane/metadata/android/pl/changelogs/986.txt b/fastlane/metadata/android/pl/changelogs/986.txt new file mode 100644 index 000000000..c9146e57c --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/986.txt @@ -0,0 +1,16 @@ +Nowe +• Powiadom. o nowych strumieniach +• Płynne przejście między odtwarzacz. w tle i wideo +• Zmiana wys. tonu o półtony +• Dołącz. głównej kolejki odtwarzacza do playlisty + +Ulepszone +• Zapamięt. wielkości kroku prędk./wys. dźwięku +• Zmniej. wstępne długie bufor. w odtwarzaczu +• Ulepsz. odtwarzacza dla Android TV +• Potwierdz. przed usun. wszystkich plików + +Naprawione +• Przycisk multimediów nie ukrywał kontrolek odtwarzacza +• Reset odtwarzania po zmianie typu odtwarzacz. +• Obracanie okna playlisty diff --git a/fastlane/metadata/android/ru/changelogs/982.txt b/fastlane/metadata/android/ru/changelogs/982.txt new file mode 100644 index 000000000..0ea2b74e6 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/982.txt @@ -0,0 +1 @@ +Исправлена ошибка, из-за которой YouTube не воспроизводил ни одну трансляцию. diff --git a/fastlane/metadata/android/sk/changelogs/64.txt b/fastlane/metadata/android/sk/changelogs/64.txt new file mode 100644 index 000000000..aa9fd1f03 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/64.txt @@ -0,0 +1,8 @@ +### Vylepšenia +- Pridaná možnosť obmedziť kvalitu videa pri používaní mobilných dát. #1339 +- Zapamätanie jasu pre reláciu #1442 +- Zlepšenie výkonu sťahovania pre slabšie procesory #1431 +- Pridanie (funkčnej) podpory pre reláciu médií #1433 + +### Opravy +- Oprava zlyhania pri otváraní sťahovania (oprava je teraz k dispozícii pre verzie vydania) #1441 diff --git a/fastlane/metadata/android/sv/changelogs/969.txt b/fastlane/metadata/android/sv/changelogs/969.txt new file mode 100644 index 000000000..a9ecf6b67 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/969.txt @@ -0,0 +1,13 @@ +• Tillåt installation på extern lagring + +• [Bandcamp] Stöd för att visa de tre första kommentarerna i en stream har lagts till. + +• Visa endast "nedladdning har börjat" när nedladdningen har påbörjats. + +• Ställ inte in reCaptcha-cookie när det inte finns någon cookie lagrad. + +• Player] Förbättra prestanda för cache + +• Avskaffa tidigare Snackbars när nedladdningar raderas + +• Fixat att försöka radera objekt som inte finns i listan diff --git a/fastlane/metadata/android/tr/changelogs/910.txt b/fastlane/metadata/android/tr/changelogs/910.txt new file mode 100644 index 000000000..c3bc3a516 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/910.txt @@ -0,0 +1 @@ +Bazı nadir durumlarda NewPipe'ın başlamasını engelleyen veri tabanı taşıması düzeltildi. diff --git a/fastlane/metadata/android/tr/changelogs/963.txt b/fastlane/metadata/android/tr/changelogs/963.txt new file mode 100644 index 000000000..f56a60157 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Kanal devam ettirme düzeltildi diff --git a/fastlane/metadata/android/tr/changelogs/982.txt b/fastlane/metadata/android/tr/changelogs/982.txt new file mode 100644 index 000000000..9e2b10e2d --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/982.txt @@ -0,0 +1 @@ +YouTube'un herhangi bir akışı oynatmaması düzeltildi. diff --git a/fastlane/metadata/android/tr/changelogs/985.txt b/fastlane/metadata/android/tr/changelogs/985.txt new file mode 100644 index 000000000..e5979c68d --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/985.txt @@ -0,0 +1 @@ +YouTube'un herhangi bir akışı oynatmaması düzeltildi diff --git a/fastlane/metadata/android/uk/changelogs/985.txt b/fastlane/metadata/android/uk/changelogs/985.txt index 41d4d11ce..905287c74 100644 --- a/fastlane/metadata/android/uk/changelogs/985.txt +++ b/fastlane/metadata/android/uk/changelogs/985.txt @@ -1 +1 @@ -Виправлено проблему невідтворюваності трансляцій YouTube. +Виправлено проблему невідтворюваності трансляцій diff --git a/fastlane/metadata/android/uk/changelogs/986.txt b/fastlane/metadata/android/uk/changelogs/986.txt new file mode 100644 index 000000000..f4e9472b1 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/986.txt @@ -0,0 +1,13 @@ +Нове +• Сповіщення про нові потоки +• Плавний перехід між фоновими та відеопрогравачем +• Додавання основної черги програвача до добірки + +Поліпшення +• Згладження початкової тривалої буферизації у відеопрогравачі +• Покращення інтерфейсу користувача програвача для Android TV +• Підтвердження перед видаленням усіх завантажених файлів + +Виправлення +• Виправлення кнопки мультимедіа, яка не приховує елементи керування програвачем +• Виправлено обертання діалогового вікна списку відтворення diff --git a/fastlane/metadata/android/zh-Hans/changelogs/986.txt b/fastlane/metadata/android/zh-Hans/changelogs/986.txt new file mode 100644 index 000000000..9a23508cb --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/986.txt @@ -0,0 +1,16 @@ +新增 +• 新串流的通知 +• 后台播放和(前台)d播放器之间的无缝过渡 +• 通过半音改变音高 +• 将主播放器队列追加至一播放列表 + +改进 +• 记住速度/音调步长 +• 减少视频播放器中初始时间缓冲 +• 改进 Android TV 的播放器界面 +• 在删除所有下载的文件之前进去确认 + +修复 +• 使用物理媒体按钮(如耳机按键等)不会隐藏播放器控件 +• 播放器类型更改时重置播放 +• 旋转播放列表对话框的异常 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/985.txt b/fastlane/metadata/android/zh-Hant/changelogs/985.txt new file mode 100644 index 000000000..4e8bf6537 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/985.txt @@ -0,0 +1 @@ +修正 YouTube 無法播放任何串流 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/986.txt b/fastlane/metadata/android/zh-Hant/changelogs/986.txt new file mode 100644 index 000000000..964a2d74f --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/986.txt @@ -0,0 +1,16 @@ +新增 +• 新串流通知 +• 背景與影片播放器之間無縫轉換 +• 按半音調整音高 +• 將主播放器佇列追加至播放清單中 + +改進 +• 記住速度/音高步距 +• 避免影片播放器初始緩衝太久 +• 改善 Android TV 的播放器介面 +• 刪除全部已下載檔案前先確認 + +修正 +• 修正媒體鍵未有隱藏播放器控制項 +• 修正播放器類型變更時重新播放 +• 修正播放清單對話方塊的縱橫旋轉 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt new file mode 100644 index 000000000..f1d67925f --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt @@ -0,0 +1 @@ +修正 YouTube 乜串流都播唔到 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt new file mode 100644 index 000000000..e451189ef --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt @@ -0,0 +1,16 @@ +新嘢 +• 新加串流有通知 +• 幕後同影片播放器無縫切換 +• 按半度調整音高 +• 將主版面播放器排隊播追加落播放清單 + +進步 +• 記住速率/音高調整步伐 +• 改善影片播放器開波時漫長緩衝 +• 完善 Android TV 嘅播放器版面 +• 刪除晒全部下載咗嘅檔案之前先確認 + +修正 +• 修正媒體掣冇隱藏到啲播放器控掣 +• 修正播放器類型有變時重頭再播 +• 修正播放器清單對話方塊嘅方向旋轉 diff --git a/fastlane/metadata/android/zh_Hant_HK/full_description.txt b/fastlane/metadata/android/zh_Hant_HK/full_description.txt index 1a516a17d..9fe7dfeb9 100644 --- a/fastlane/metadata/android/zh_Hant_HK/full_description.txt +++ b/fastlane/metadata/android/zh_Hant_HK/full_description.txt @@ -1 +1 @@ -NewPipe 沒有使用任何 Google 框架庫組件或是 YouTube API。NewPipe 只需解析網頁以獲取所需資訊,因此 NewPipe 可在沒有安裝 Google 服務的裝置上使用。此外,你亦無需 YouTube 帳號就能使用NewPipe,NewPipe 是自由及開放源碼軟件(FLOSS)。 +NewPipe 冇用到任何 Google 框架程式庫又或者 YouTube API,單憑解析網站去攞到所需嘅資訊,因此就算冇裝 Google 服務嘅機都用得呢個 app。此外,NewPipe 亦毋需您要有 YouTube 帳戶就用得,而且係自由同開放原始碼嘅軟件 (FLOSS)。 diff --git a/fastlane/metadata/android/zh_Hant_HK/short_description.txt b/fastlane/metadata/android/zh_Hant_HK/short_description.txt index fca9de0da..8f4a31c03 100644 --- a/fastlane/metadata/android/zh_Hant_HK/short_description.txt +++ b/fastlane/metadata/android/zh_Hant_HK/short_description.txt @@ -1 +1 @@ -一個自由輕量的 Android YouTube 前端。 +一個自由輕巧嘅 Android YouTube 前端。