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<FeedState>() {
         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<String> 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<String> 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<String> 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<Boolean, TextView> getPitchControlModeComponentMappings() {
+        final Map<Boolean, TextView> 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<Boolean, TextView> 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<Double, TextView> getStepSizeComponentMappings() {
+        final Map<Double, TextView> 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<Double, TextView> 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<Boolean> 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.
+     * <br/>
+     * 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.
+     *
+     * <p>
+     * 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.
+     * </p>
+     *
+     * @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.
+ * <br/>
+ * @see
+ * <a href="https://en.wikipedia.org/wiki/Equal_temperament#Twelve-tone_equal_temperament">
+ *     Wikipedia: Equal temperament#Twelve-tone equal temperament
+ * </a>
+ */
+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 @@
 <?xml version="1.0" encoding="utf-8"?>
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -29,9 +30,9 @@
         <RelativeLayout
             android:id="@+id/tempoControl"
             android:layout_width="match_parent"
-            android:layout_height="40dp"
+            android:layout_height="wrap_content"
             android:layout_below="@id/tempoControlText"
-            android:layout_marginTop="3dp"
+            android:layout_marginTop="1dp"
             android:orientation="horizontal">
 
             <org.schabi.newpipe.views.NewPipeTextView
@@ -39,7 +40,6 @@
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_alignParentStart="true"
-                android:layout_alignParentLeft="true"
                 android:layout_centerVertical="true"
                 android:background="?attr/selectableItemBackground"
                 android:clickable="true"
@@ -57,9 +57,7 @@
                 android:layout_marginLeft="4dp"
                 android:layout_marginRight="4dp"
                 android:layout_toStartOf="@id/tempoStepUp"
-                android:layout_toLeftOf="@id/tempoStepUp"
                 android:layout_toEndOf="@id/tempoStepDown"
-                android:layout_toRightOf="@id/tempoStepDown"
                 android:orientation="horizontal">
 
                 <org.schabi.newpipe.views.NewPipeTextView
@@ -67,9 +65,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignParentStart="true"
-                    android:layout_alignParentLeft="true"
                     android:layout_marginStart="4dp"
-                    android:layout_marginLeft="4dp"
                     android:gravity="center"
                     android:text="-.--x"
                     android:textColor="?attr/colorAccent"
@@ -93,9 +89,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignParentEnd="true"
-                    android:layout_alignParentRight="true"
                     android:layout_marginEnd="4dp"
-                    android:layout_marginRight="4dp"
                     android:gravity="center"
                     android:text="---%"
                     android:textColor="?attr/colorAccent"
@@ -108,7 +102,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_below="@id/tempoCurrentText"
-                    android:paddingBottom="4dp"
+                    android:paddingBottom="2dp"
                     tools:progress="50" />
             </RelativeLayout>
 
@@ -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" />
 
         <org.schabi.newpipe.views.NewPipeTextView
@@ -154,232 +146,268 @@
             android:textColor="?attr/colorAccent"
             android:textStyle="bold" />
 
-        <RelativeLayout
-            android:id="@+id/pitchControl"
+        <ImageView
+            android:id="@+id/pitchToogleControlModes"
+            android:layout_width="22dp"
+            android:layout_height="22dp"
+            android:layout_below="@id/separatorPitch"
+            android:layout_alignParentEnd="true"
+            android:clickable="true"
+            android:focusable="true"
+            app:srcCompat="@drawable/ic_expand_more"
+            tools:ignore="ContentDescription" />
+
+        <LinearLayout
+            android:id="@+id/pitchControlModeTabs"
             android:layout_width="match_parent"
-            android:layout_height="40dp"
+            android:layout_height="22dp"
             android:layout_below="@id/pitchControlText"
-            android:layout_marginTop="3dp"
-            android:orientation="horizontal">
+            android:layout_marginStart="22dp"
+            android:layout_marginEnd="22dp"
+            android:orientation="horizontal"
+            android:visibility="gone"
+            tools:visibility="visible">
 
             <org.schabi.newpipe.views.NewPipeTextView
-                android:id="@+id/pitchStepDown"
-                android:layout_width="wrap_content"
+                android:id="@+id/pitchControlModePercent"
+                android:layout_width="0dp"
                 android:layout_height="match_parent"
-                android:layout_alignParentStart="true"
-                android:layout_alignParentLeft="true"
-                android:layout_centerVertical="true"
+                android:layout_weight="1"
                 android:background="?attr/selectableItemBackground"
                 android:clickable="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:text="--%"
-                android:textColor="?attr/colorAccent"
-                android:textStyle="bold"
-                tools:ignore="HardcodedText"
-                tools:text="-5%" />
+                android:text="@string/percent"
+                android:textColor="?attr/colorAccent" />
+
+            <org.schabi.newpipe.views.NewPipeTextView
+                android:id="@+id/pitchControlModeSemitone"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:clickable="true"
+                android:focusable="true"
+                android:gravity="center"
+                android:text="@string/semitone"
+                android:textColor="?attr/colorAccent" />
+
+        </LinearLayout>
+
+        <RelativeLayout
+            android:id="@+id/pitchControlContainer"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/pitchControlModeTabs"
+            android:layout_marginTop="1dp">
 
             <RelativeLayout
-                android:id="@+id/pitchDisplay"
+                android:id="@+id/pitchPercentControl"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:layout_marginLeft="4dp"
-                android:layout_marginRight="4dp"
-                android:layout_toStartOf="@+id/pitchStepUp"
-                android:layout_toLeftOf="@+id/pitchStepUp"
-                android:layout_toEndOf="@+id/pitchStepDown"
-                android:layout_toRightOf="@+id/pitchStepDown"
                 android:orientation="horizontal">
 
                 <org.schabi.newpipe.views.NewPipeTextView
-                    android:id="@+id/pitchMinimumText"
+                    android:id="@+id/pitchPercentStepDown"
                     android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
+                    android:layout_height="match_parent"
                     android:layout_alignParentStart="true"
-                    android:layout_alignParentLeft="true"
-                    android:layout_marginStart="4dp"
-                    android:layout_marginLeft="4dp"
+                    android:layout_centerVertical="true"
+                    android:background="?attr/selectableItemBackground"
+                    android:clickable="true"
+                    android:focusable="true"
                     android:gravity="center"
-                    android:text="---%"
-                    android:textColor="?attr/colorAccent"
-                    tools:ignore="HardcodedText"
-                    tools:text="25%" />
-
-                <org.schabi.newpipe.views.NewPipeTextView
-                    android:id="@+id/pitchCurrentText"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_centerHorizontal="true"
-                    android:gravity="center"
-                    android:text="---%"
+                    android:text="--%"
                     android:textColor="?attr/colorAccent"
                     android:textStyle="bold"
                     tools:ignore="HardcodedText"
-                    tools:text="100%" />
+                    tools:text="-5%" />
+
+                <RelativeLayout
+                    android:id="@+id/pitchPercentDisplay"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginLeft="4dp"
+                    android:layout_marginRight="4dp"
+                    android:layout_toStartOf="@+id/pitchPercentStepUp"
+                    android:layout_toEndOf="@+id/pitchPercentStepDown"
+                    android:orientation="horizontal">
+
+                    <org.schabi.newpipe.views.NewPipeTextView
+                        android:id="@+id/pitchPercentMinimumText"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentStart="true"
+                        android:layout_marginStart="4dp"
+                        android:gravity="center"
+                        android:text="---%"
+                        android:textColor="?attr/colorAccent"
+                        tools:ignore="HardcodedText"
+                        tools:text="25%" />
+
+                    <org.schabi.newpipe.views.NewPipeTextView
+                        android:id="@+id/pitchPercentCurrentText"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerHorizontal="true"
+                        android:gravity="center"
+                        android:text="---%"
+                        android:textColor="?attr/colorAccent"
+                        android:textStyle="bold"
+                        tools:ignore="HardcodedText"
+                        tools:text="100%" />
+
+                    <org.schabi.newpipe.views.NewPipeTextView
+                        android:id="@+id/pitchPercentMaximumText"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:layout_marginEnd="4dp"
+                        android:gravity="center"
+                        android:text="---%"
+                        android:textColor="?attr/colorAccent"
+                        tools:ignore="HardcodedText"
+                        tools:text="300%" />
+
+                    <androidx.appcompat.widget.AppCompatSeekBar
+                        android:id="@+id/pitchPercentSeekbar"
+                        style="@style/Widget.AppCompat.SeekBar"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_below="@+id/pitchPercentCurrentText"
+                        android:paddingBottom="2dp"
+                        tools:progress="50" />
+                </RelativeLayout>
 
                 <org.schabi.newpipe.views.NewPipeTextView
-                    android:id="@+id/pitchMaximumText"
+                    android:id="@+id/pitchPercentStepUp"
                     android:layout_width="wrap_content"
-                    android:layout_height="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"
                     android:gravity="center"
-                    android:text="---%"
+                    android:text="+-%"
                     android:textColor="?attr/colorAccent"
+                    android:textStyle="bold"
                     tools:ignore="HardcodedText"
-                    tools:text="300%" />
-
-                <androidx.appcompat.widget.AppCompatSeekBar
-                    android:id="@+id/pitchSeekbar"
-                    style="@style/Widget.AppCompat.SeekBar"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_below="@+id/pitchCurrentText"
-                    android:paddingBottom="4dp"
-                    tools:progress="50" />
+                    tools:text="+5%" />
             </RelativeLayout>
 
-            <org.schabi.newpipe.views.NewPipeTextView
-                android:id="@+id/pitchStepUp"
-                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"
-                android:gravity="center"
-                android:text="+-%"
-                android:textColor="?attr/colorAccent"
-                android:textStyle="bold"
-                tools:ignore="HardcodedText"
-                tools:text="+5%" />
-        </RelativeLayout>
-
-        <RelativeLayout
-            android:id="@+id/semitoneControl"
-            android:layout_width="match_parent"
-            android:layout_height="40dp"
-            android:layout_below="@id/pitchControlText"
-            android:layout_marginTop="4dp"
-            android:orientation="horizontal">
-
-            <org.schabi.newpipe.views.NewPipeTextView
-                android:id="@+id/semitoneStepDown"
-                android:layout_width="24dp"
-                android:layout_height="match_parent"
-                android:layout_alignParentStart="true"
-                android:layout_alignParentLeft="true"
-                android:layout_centerVertical="true"
-                android:background="?attr/selectableItemBackground"
-                android:clickable="true"
-                android:focusable="true"
-                android:gravity="center"
-                android:text="♭"
-                android:textColor="?attr/colorAccent"
-                android:textSize="24sp"
-                android:textStyle="bold"
-                tools:ignore="HardcodedText" />
-
             <RelativeLayout
-                android:id="@+id/semitoneDisplay"
+                android:id="@+id/pitchSemitoneControl"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:layout_marginLeft="4dp"
-                android:layout_marginRight="4dp"
-                android:layout_toStartOf="@+id/semitoneStepUp"
-                android:layout_toLeftOf="@+id/semitoneStepUp"
-                android:layout_toEndOf="@+id/semitoneStepDown"
-                android:layout_toRightOf="@+id/semitoneStepDown"
-                android:orientation="horizontal">
+                android:orientation="horizontal"
+                tools:visibility="gone">
 
                 <org.schabi.newpipe.views.NewPipeTextView
-                    android:id="@+id/semitoneMinimumText"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
+                    android:id="@+id/pitchSemitoneStepDown"
+                    android:layout_width="24dp"
+                    android:layout_height="match_parent"
                     android:layout_alignParentStart="true"
-                    android:layout_alignParentLeft="true"
-                    android:layout_marginStart="4dp"
-                    android:layout_marginLeft="4dp"
-                    android:gravity="center"
-                    android:text="-12"
-                    android:textColor="?attr/colorAccent"
-                    tools:ignore="HardcodedText"/>
-
-                <org.schabi.newpipe.views.NewPipeTextView
-                    android:id="@+id/semitoneCurrentText"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_centerHorizontal="true"
+                    android:layout_centerVertical="true"
+                    android:background="?attr/selectableItemBackground"
+                    android:clickable="true"
+                    android:focusable="true"
                     android:gravity="center"
+                    android:text="♭"
                     android:textColor="?attr/colorAccent"
+                    android:textSize="24sp"
                     android:textStyle="bold"
-                    tools:text="0" />
-
-                <org.schabi.newpipe.views.NewPipeTextView
-                    android:id="@+id/semitoneMaximumText"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentEnd="true"
-                    android:layout_alignParentRight="true"
-                    android:layout_marginEnd="4dp"
-                    android:layout_marginRight="4dp"
-                    android:gravity="center"
-                    android:text="+12"
-                    android:textColor="?attr/colorAccent"
                     tools:ignore="HardcodedText" />
 
-                <androidx.appcompat.widget.AppCompatSeekBar
-                    android:id="@+id/semitoneSeekbar"
-                    style="@style/Widget.AppCompat.SeekBar"
+                <RelativeLayout
+                    android:id="@+id/pitchSemitoneDisplay"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_below="@+id/semitoneCurrentText"
-                    android:max="24"
-                    android:paddingBottom="4dp"
-                    android:progress="12" />
-            </RelativeLayout>
+                    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">
 
-            <org.schabi.newpipe.views.NewPipeTextView
-                android:id="@+id/semitoneStepUp"
-                android:layout_width="24dp"
-                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"
-                android:gravity="center"
-                android:text="♯"
-                android:textColor="?attr/colorAccent"
-                android:textSize="20sp"
-                android:textStyle="bold"
-                tools:ignore="HardcodedText" />
+                    <org.schabi.newpipe.views.NewPipeTextView
+                        android:id="@+id/pitchSemitoneMinimumText"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentStart="true"
+                        android:layout_marginStart="4dp"
+                        android:gravity="center"
+                        android:text="-12"
+                        android:textColor="?attr/colorAccent"
+                        tools:ignore="HardcodedText" />
+
+                    <org.schabi.newpipe.views.NewPipeTextView
+                        android:id="@+id/pitchSemitoneCurrentText"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerHorizontal="true"
+                        android:gravity="center"
+                        android:textColor="?attr/colorAccent"
+                        android:textStyle="bold"
+                        tools:text="0"
+                        tools:ignore="RelativeOverlap" />
+
+                    <org.schabi.newpipe.views.NewPipeTextView
+                        android:id="@+id/pitchSemitoneMaximumText"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:layout_marginEnd="4dp"
+                        android:gravity="center"
+                        android:text="+12"
+                        android:textColor="?attr/colorAccent"
+                        tools:ignore="HardcodedText" />
+
+                    <androidx.appcompat.widget.AppCompatSeekBar
+                        android:id="@+id/pitchSemitoneSeekbar"
+                        style="@style/Widget.AppCompat.SeekBar"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_below="@+id/pitchSemitoneCurrentText"
+                        android:max="24"
+                        android:paddingBottom="2dp"
+                        android:progress="12" />
+                </RelativeLayout>
+
+                <org.schabi.newpipe.views.NewPipeTextView
+                    android:id="@+id/pitchSemitoneStepUp"
+                    android:layout_width="24dp"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentEnd="true"
+                    android:layout_centerVertical="true"
+                    android:layout_marginEnd="4dp"
+                    android:background="?attr/selectableItemBackground"
+                    android:clickable="true"
+                    android:focusable="true"
+                    android:gravity="center"
+                    android:text="♯"
+                    android:textColor="?attr/colorAccent"
+                    android:textSize="20sp"
+                    android:textStyle="bold"
+                    tools:ignore="HardcodedText" />
+            </RelativeLayout>
         </RelativeLayout>
 
         <View
             android:id="@+id/separatorStepSizeSelector"
             android:layout_width="match_parent"
             android:layout_height="1dp"
-            android:layout_below="@+id/semitoneControl"
+            android:layout_below="@+id/pitchControlContainer"
             android:layout_marginStart="12dp"
-            android:layout_marginTop="6dp"
+            android:layout_marginTop="5dp"
             android:layout_marginEnd="12dp"
-            android:layout_marginBottom="6dp"
+            android:layout_marginBottom="5dp"
             android:background="?attr/separator_color" />
 
         <LinearLayout
             android:id="@+id/stepSizeSelector"
             android:layout_width="match_parent"
-            android:layout_height="32dp"
+            android:layout_height="30dp"
             android:layout_below="@id/separatorStepSizeSelector"
             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%" />
 
             <org.schabi.newpipe.views.NewPipeTextView
                 android:id="@+id/stepSizeFivePercent"
@@ -414,7 +443,8 @@
                 android:clickable="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:textColor="?attr/colorAccent" />
+                android:textColor="?attr/colorAccent"
+                tools:text="5%" />
 
             <org.schabi.newpipe.views.NewPipeTextView
                 android:id="@+id/stepSizeTenPercent"
@@ -425,7 +455,8 @@
                 android:clickable="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:textColor="?attr/colorAccent" />
+                android:textColor="?attr/colorAccent"
+                tools:text="10%" />
 
             <org.schabi.newpipe.views.NewPipeTextView
                 android:id="@+id/stepSizeTwentyFivePercent"
@@ -436,9 +467,10 @@
                 android:clickable="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:textColor="?attr/colorAccent" />
+                android:textColor="?attr/colorAccent"
+                tools:text="25%" />
 
-            <TextView
+            <org.schabi.newpipe.views.NewPipeTextView
                 android:id="@+id/stepSizeOneHundredPercent"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
@@ -447,7 +479,8 @@
                 android:clickable="true"
                 android:focusable="true"
                 android:gravity="center"
-                android:textColor="?attr/colorAccent" />
+                android:textColor="?attr/colorAccent"
+                tools:text="100%" />
         </LinearLayout>
 
         <View
@@ -456,9 +489,9 @@
             android:layout_height="1dp"
             android:layout_below="@+id/stepSizeSelector"
             android:layout_marginStart="12dp"
-            android:layout_marginTop="6dp"
+            android:layout_marginTop="5dp"
             android:layout_marginEnd="12dp"
-            android:layout_marginBottom="6dp"
+            android:layout_marginBottom="5dp"
             android:background="?attr/separator_color" />
 
         <LinearLayout
@@ -486,17 +519,6 @@
                 android:focusable="true"
                 android:text="@string/skip_silence_checkbox" />
 
-            <CheckBox
-                android:id="@+id/adjustBySemitonesCheckbox"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_below="@id/skipSilenceCheckbox"
-                android:layout_centerHorizontal="true"
-                android:checked="false"
-                android:clickable="true"
-                android:focusable="true"
-                android:maxLines="1"
-                android:text="@string/adjust_by_semitones_checkbox" />
         </LinearLayout>
 
         <!-- END HERE -->
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 @@
     <string name="show_error_snackbar">إظهار خطأ snackbar</string>
     <string name="no_appropriate_file_manager_message_android_10">لم يتم العثور على مدير ملفات مناسب لهذا الإجراء.
 \nالرجاء تثبيت مدير ملفات متوافق مع Storage Access Framework.</string>
-    <string name="background_player_already_playing_toast">يتم تشغيله في الخلفية</string>
     <string name="detail_pinned_comment_view_description">تعليق مثبت</string>
     <string name="leak_canary_not_available">LeakCanary غير متوفر</string>
-    <string name="adjust_by_semitones_checkbox">ضبط الصوت من خلال النغمات الموسيقية النصفية</string>
-    <string name="playback_tempo_step">خطوة الإيقاع</string>
-    <string name="progressive_load_interval_default">الافتراضي ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">الافتراضي ExoPlayer</string>
     <string name="progressive_load_interval_summary">تغيير حجم الفاصل الزمني للتحميل (حاليا %s). قد تؤدي القيمة الأقل إلى تسريع تحميل الفيديو الأولي. تتطلب التغييرات إعادة تشغيل المشغل.</string>
+    <string name="settings_category_player_notification_summary">تكوين إشعار مشغل البث الحالي</string>
+    <string name="notifications">الإشعارات</string>
+    <string name="loading_stream_details">تحميل تفاصيل البث…</string>
+    <string name="notifications_disabled">تم تعطيل الإشعارات</string>
+    <string name="streams_notification_channel_name">بث جديد</string>
+    <string name="settings_category_player_notification_title">إشعار المشغل</string>
+    <string name="you_successfully_subscribed">لقد اشتركت الآن في هذه القناة</string>
+    <string name="streams_notification_channel_description">الإخطارات حول التدفقات الجديدة للاشتراكات</string>
+    <string name="enable_streams_notifications_title">إشعارات أحداث البث الجديدة</string>
+    <string name="enable_streams_notifications_summary">الإخطار بأحداث البث الجديدة من الاشتراكات</string>
+    <string name="check_new_streams">تشغيل التحقق من وجود تدفقات جديدة</string>
+    <string name="streams_notifications_interval_title">معدل البحث</string>
+    <string name="streams_notifications_network_title">مطلوب اتصال الشبكة</string>
+    <string name="any_network">أي شبكة</string>
+    <string name="delete_downloaded_files_confirm">محو جميع الملفات التي تم تنزيلها من القرص؟</string>
+    <string name="get_notified">الحصول على إشعار</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">تبديل الكل</string>
+    <plurals name="new_streams">
+        <item quantity="zero">%s دفق جديد</item>
+        <item quantity="one">%s دفق جديد</item>
+        <item quantity="two">%s دفق جديد</item>
+        <item quantity="few">%s دفوق جديدة</item>
+        <item quantity="many">%s دفق جديد</item>
+        <item quantity="other">%s دفق جديد</item>
+    </plurals>
 </resources>
\ 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 @@
     <string name="no_appropriate_file_manager_message_android_10">找不到适合此操作的文件管理器。
 \n请安装与存储访问框架(SAF)兼容的文件管理器。</string>
     <string name="error_report_notification_title">NewPipe 遇到了一个错误,点击此处报告此错误</string>
-    <string name="background_player_already_playing_toast">已经在后台播放</string>
     <string name="detail_pinned_comment_view_description">置顶评论</string>
     <string name="leak_canary_not_available">LeakCanary 不可用</string>
-    <string name="adjust_by_semitones_checkbox">以音乐半音调整音高</string>
-    <string name="playback_tempo_step">节奏步长</string>
     <string name="progressive_load_interval_summary">改变加载间隔的大小(当前%s),较低的值可以加快初始的视频加载速度,改变需要重启播放器。</string>
-    <string name="progressive_load_interval_default">ExoPlayer 默认</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer 默认</string>
+    <string name="settings_category_player_notification_summary">配置当前正在播放的串流的通知</string>
+    <string name="enable_streams_notifications_title">新串流通知</string>
+    <string name="streams_notifications_interval_title">检查频率</string>
+    <string name="streams_notifications_network_title">所需的网络连接</string>
+    <string name="notifications_disabled">通知已被禁用</string>
+    <string name="you_successfully_subscribed">你刚刚订阅了此频道</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">全选</string>
+    <string name="settings_category_player_notification_title">播放器通知</string>
+    <string name="notifications">通知</string>
+    <string name="streams_notification_channel_name">新的串流</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s 条新串流</item>
+        <item quantity="other"/>
+    </plurals>
+    <string name="streams_notification_channel_description">被订阅的新串流的通知</string>
+    <string name="loading_stream_details">正在加载串流详情…</string>
+    <string name="check_new_streams">检查新串流</string>
+    <string name="any_network">任何网络</string>
+    <string name="delete_downloaded_files_confirm">清除所有下载的文件?</string>
+    <string name="get_notified">获取通知</string>
+    <string name="enable_streams_notifications_summary">来自订阅的新串流的通知</string>
 </resources>
\ 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 @@
     <string name="search_no_results">কোন রেজাল্ট নেই</string>
     <string name="invalid_directory">কোন ফোল্ডার নেই</string>
     <string name="download_to_sdcard_error_title">বাহ্যিক স্টোরেজ নেই</string>
-    <string name="search_history_deleted">সার্চ ইতিহাস ডিলিট হয়েছে।</string>
+    <string name="search_history_deleted">সার্চ ইতিহাস মোছা হয়েছে</string>
     <string name="name">নাম</string>
     <string name="rename_playlist">নাম পরিবর্তন</string>
     <string name="action_history">ইতিহাস</string>
@@ -198,7 +198,7 @@
     <string name="create">তৈরি করুন</string>
     <string name="retry">পুনরায় চেষ্টা করুন</string>
     <string name="help">সাহায্য</string>
-    <string name="watch_history_deleted">দেখার ইতিহাস মুছে গেছে।</string>
+    <string name="watch_history_deleted">দেখার ইতিহাস মুছে গেছে</string>
     <string name="delete_view_history_alert">সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\?</string>
     <string name="clear_views_history_title">দেখার ইতিহাস মুছে ফেলুন</string>
     <string name="export_data_title">ডাটা বেস এক্সপোর্ট করুন</string>
@@ -269,14 +269,14 @@
     <string name="enable_playback_state_lists_title">তালিকা তে পজিশন</string>
     <string name="enable_playback_resume_summary">শেষ প্লে ব্যাক পজিশন এ যান</string>
     <string name="enable_search_history_summary">সার্চ গুলি স্থানীয় ভাবে জমা করুন</string>
-    <string name="show_search_suggestions_summary">সার্চ এর সময় সাজেশন দেখান</string>
+    <string name="show_search_suggestions_summary">সার্চ এর সময় সাজেশন পছন্দ করুন</string>
     <string name="show_search_suggestions_title">সার্চ সাজেশন</string>
     <string name="feed_notification_loading">ফিড লোড হচ্ছে…</string>
     <string name="show_error">এরর দেখান</string>
     <string name="select_a_playlist">একটি প্লে লিস্ট পছন্দ করুন</string>
     <string name="tab_about">সম্পর্কিত</string>
     <string name="title_licenses">থার্ড-পার্টি লাইসেন্স সমূহ</string>
-    <string name="error_report_open_issue_button_text">গিটহাব এ এরর রিপোর্ট করুন</string>
+    <string name="error_report_open_issue_button_text">গিটহাব এ রিপোর্ট করুন</string>
     <string name="restore_defaults">ডিফল্ট এ ফিরে যান</string>
     <string name="search_showing_result_for">রেজাল্ট দেখান হচ্ছেঃ %s</string>
     <string name="clear_queue_confirmation_title">কিউ মোছার আগে নিশ্চিত করুন</string>
@@ -292,4 +292,12 @@
     <string name="show_meta_info_title">মেটা ইনফো দেখান</string>
     <string name="show_description_title">বিবরণ দেখান</string>
     <string name="night_theme_title">রাত্রি থিম</string>
+    <string name="notification_action_2_title">তৃতীয় অ্যাকশান বোতাম</string>
+    <string name="notification_action_3_title">চতুর্থ অ্যাকশান বোতাম</string>
+    <string name="clear_queue_confirmation_description">সক্রিয় প্লেয়ার ক্রম পরিবর্তিত হয়ে যাবে</string>
+    <string name="local_search_suggestions">স্থানীয় সার্চ সাজেশন</string>
+    <string name="notification_action_4_title">পঞ্চম অ্যাকশান বোতাম</string>
+    <string name="notification_action_0_title">প্রথম অ্যাকশান বোতাম</string>
+    <string name="notification_action_1_title">দ্বিতীয় অ্যাকশান বোতাম</string>
+    <string name="streams_notification_channel_name">নতুন স্ট্রিম</string>
 </resources>
\ 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 @@
     <string name="start_main_player_fullscreen_title">Inicia el reproductor principal en pantalla completa</string>
     <string name="main_page_content_swipe_remove">Llisqueu els elements per eliminar-los</string>
     <string name="start_main_player_fullscreen_summary">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</string>
-    <string name="background_player_already_playing_toast">Ja s\'està reproduint en segon pla</string>
     <string name="error_report_channel_name">Notificació d\'informe d\'error</string>
     <string name="crash_the_player">Tancar abruptament el reproductor</string>
     <string name="manual_update_title">Comprovar si hi ha actualitzacions</string>
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 @@
     <string name="show_crash_the_player_title">پیشاندانی ”کڕاش کردنی لێدەرەکە“</string>
     <string name="create_error_notification">سازاندنی پەیامی کێشەیەک</string>
     <string name="manual_update_title">پشکنین بۆ نوێکردنەوە</string>
-    <string name="background_player_already_playing_toast">وا لە پاشبنەمادا لێدەدرێت</string>
     <string name="error_report_channel_name">کێشە لە سکاڵا کردنی پەیام</string>
     <string name="error_report_channel_description">پەیامەکانی سکاڵاکردن لە کێشەکان</string>
     <string name="feed_new_items">بابەتە نوێیەکانی فیید</string>
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 @@
     <string name="create_error_notification">Vytvořit oznámení o chybě</string>
     <string name="checking_updates_toast">Kontrola aktualizací…</string>
     <string name="show_crash_the_player_title">Ukázat „Shodit přehrávač“</string>
-    <string name="background_player_already_playing_toast">Hraje již v pozadí</string>
     <string name="feed_new_items">Nové položky feedů</string>
     <string name="no_appropriate_file_manager_message_android_10">Pro tuto akci nebyl nalezen žádný vhodný správce souborů.
 \nProsím, nainstalujte správce souborů kompatibilní se Storage Access Framework.</string>
@@ -698,7 +697,5 @@
     <string name="crash_the_player">Shodit přehrávač</string>
     <string name="progressive_load_interval_summary">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.</string>
     <string name="leak_canary_not_available">LeakCanary není dostupné</string>
-    <string name="adjust_by_semitones_checkbox">Upravit výšku tónů po půltónech</string>
-    <string name="playback_tempo_step">Krok tempa</string>
-    <string name="progressive_load_interval_default">Výchozí ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Výchozí ExoPlayer</string>
 </resources>
\ 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 @@
     <string name="search_showing_result_for">Viser resultater for: %s</string>
     <string name="open_with">Åben med</string>
     <string name="leak_canary_not_available">LeakCanary er ikke tilgængelig</string>
+    <string name="mark_as_watched">Markér som set</string>
 </resources>
\ 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 @@
     <string name="start_main_player_fullscreen_title">Hauptplayer im Vollbildmodus starten</string>
     <string name="enqueued_next">Als Nächstes eingereiht</string>
     <string name="enqueue_next_stream">Als Nächstes in Wiedergabe einreihen</string>
-    <string name="processing_may_take_a_moment">Verarbeitung… Kann einen Moment dauern</string>
+    <string name="processing_may_take_a_moment">Verarbeitung … Kann einen Moment dauern</string>
     <string name="manual_update_title">Nach Aktualisierungen suchen</string>
-    <string name="checking_updates_toast">Suche nach Aktualisierungen…</string>
+    <string name="checking_updates_toast">Suche nach Aktualisierungen …</string>
     <string name="manual_update_description">Manuelle Prüfung auf neue Versionen</string>
     <string name="feed_new_items">Neue Feed-Elemente</string>
     <string name="show_crash_the_player_title">\"Player abstürzen lassen\" anzeigen</string>
@@ -684,11 +684,28 @@
 \nBitte installiere einen Dateimanager oder versuche, \'%s\' in den Downloadeinstellungen zu deaktivieren.</string>
     <string name="no_appropriate_file_manager_message_android_10">Es wurde kein geeigneter Dateimanager für diese Aktion gefunden.
 \nBitte installiere einen Storage Access Framework kompatiblen Dateimanager.</string>
-    <string name="background_player_already_playing_toast">Wird bereits im Hintergrund abgespielt</string>
     <string name="detail_pinned_comment_view_description">Angehefteter Kommentar</string>
     <string name="leak_canary_not_available">LeakCanary ist nicht verfügbar</string>
-    <string name="adjust_by_semitones_checkbox">Tonhöhe nach musikalischen Halbtönen anpassen</string>
     <string name="progressive_load_interval_summary">Ä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.</string>
-    <string name="playback_tempo_step">Geschwindigkeitsstufe</string>
-    <string name="progressive_load_interval_default">ExoPlayer Standard</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer Standard</string>
+    <string name="notifications">Benachrichtigungen</string>
+    <string name="streams_notification_channel_description">Benachrichtigen über neue abonnierbare Streams</string>
+    <string name="streams_notification_channel_name">Neue Streams</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s neuer Stream</item>
+        <item quantity="other">%s neue Streams</item>
+    </plurals>
+    <string name="loading_stream_details">Stream-Details laden …</string>
+    <string name="enable_streams_notifications_summary">Über neue Streams aus Abonnements benachrichtigen</string>
+    <string name="enumeration_comma">,</string>
+    <string name="any_network">Jedes Netzwerk</string>
+    <string name="enable_streams_notifications_title">Benachrichtigungen über neue Streams</string>
+    <string name="check_new_streams">Suche nach neuen Streams ausführen</string>
+    <string name="streams_notifications_network_title">Erforderliche Netzwerkverbindung</string>
+    <string name="notifications_disabled">Benachrichtigungen sind deaktiviert</string>
+    <string name="get_notified">Benachrichtigung erhalten</string>
+    <string name="delete_downloaded_files_confirm">Alle heruntergeladenen Dateien von der Festplatte löschen\?</string>
+    <string name="you_successfully_subscribed">Du hast jetzt diesen Kanal abonniert</string>
+    <string name="toggle_all">Alle umschalten</string>
+    <string name="streams_notifications_interval_title">Aktualisierungsintervall</string>
 </resources>
\ 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Εγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης.</string>
     <string name="error_report_notification_title">Το NewPipe παρουσίασε ένα σφάλμα. Πατήστε για αναφορά</string>
     <string name="show_error_snackbar">Εμφάνιση μιας snackbar σφάλματος</string>
-    <string name="background_player_already_playing_toast">Αναπαράγεται ήδη στο παρασκήνιο</string>
     <string name="detail_pinned_comment_view_description">Καρφιτσωμένο σχόλιο</string>
     <string name="leak_canary_not_available">Το LeakCanary δεν είναι διαθέσιμο</string>
-    <string name="adjust_by_semitones_checkbox">Προσαρμόστε τον τόνο με βάση τα μουσικά ημιτόνια</string>
-    <string name="playback_tempo_step">Βήμα τέμπο</string>
-    <string name="progressive_load_interval_default">Εξ\' ορισμού ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Εξ\' ορισμού ExoPlayer</string>
     <string name="progressive_load_interval_summary">Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής.</string>
+    <string name="notifications">Ειδοποιήσεις</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s νέα ροή</item>
+        <item quantity="other">%s νέες ροές</item>
+    </plurals>
+    <string name="streams_notifications_network_title">Απαιτούμενη σύνδεση δικτύου</string>
+    <string name="any_network">Οποιοδήποτε δίκτυο</string>
+    <string name="settings_category_player_notification_title">Ειδοποίηση αναπαραγωγής</string>
+    <string name="streams_notification_channel_name">Νέες ροές</string>
+    <string name="settings_category_player_notification_summary">Διαμόρφωση ειδοποίησης τρέχουσας αναπαραγωγής ροής</string>
+    <string name="streams_notifications_interval_title">Συχνότητα ελέγχου</string>
+    <string name="streams_notification_channel_description">Ειδοποιήσεις σχετικά με νέες ροές για συνδρομές</string>
+    <string name="loading_stream_details">Φόρτωση λεπτομερειών ροής…</string>
+    <string name="check_new_streams">Εκτελέστε έλεγχο για νέες ροές</string>
+    <string name="enable_streams_notifications_title">Ειδοποιήσεις για νέες ροές</string>
+    <string name="enable_streams_notifications_summary">Ειδοποίηση για νέες ροές από συνδρομές</string>
+    <string name="delete_downloaded_files_confirm">Διαγραφή όλων των ληφθέντων αρχείων από το δίσκο;</string>
+    <string name="notifications_disabled">Οι ειδοποιήσεις είναι απενεργοποιημένες</string>
+    <string name="enumeration_comma">,</string>
+    <string name="get_notified">Λάβετε ειδοποίηση</string>
+    <string name="you_successfully_subscribed">Έχετε εγγραφεί τώρα σε αυτό το κανάλι</string>
+    <string name="toggle_all">Εναλλαγή όλων</string>
 </resources>
\ 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 @@
     <string name="metadata_cache_wipe_summary">Quitar todos los datos guardados de páginas web</string>
     <string name="metadata_cache_wipe_complete_notice">Se vació la caché de metadatos</string>
     <string name="playback_speed_control">Controles de velocidad de reproducción</string>
-    <string name="playback_tempo">Tiempo</string>
+    <string name="playback_tempo">Tempo</string>
     <string name="playback_pitch">Tono</string>
     <string name="unhook_checkbox">Desvincular (puede causar distorsión)</string>
     <string name="no_streams_available_download">No hay streams disponibles para descargar</string>
@@ -686,10 +686,11 @@
     <string name="no_appropriate_file_manager_message_android_10">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\".</string>
     <string name="detail_pinned_comment_view_description">Comentario fijado</string>
-    <string name="background_player_already_playing_toast">Ya se reproduce en segundo plano</string>
     <string name="leak_canary_not_available">LeakCanary no está disponible</string>
-    <string name="progressive_load_interval_default">ExoPlayer valor por defecto</string>
-    <string name="playback_tempo_step">Paso de tempo</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer valor por defecto</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="adjust_by_semitones_checkbox">Ajustar el tono por semitonos musicales</string>
+    <string name="notifications">Notificaciones</string>
+    <string name="streams_notification_channel_name">Nuevos streams</string>
+    <string name="settings_category_player_notification_title">Notificación del reproductor</string>
+    <string name="settings_category_player_notification_summary">Configurar notificación de la reproducción en curso</string>
 </resources>
\ 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 @@
     <string name="error_report_notification_title">NewPipe töös tekkis viga, sellest teavitamiseks klõpsi</string>
     <string name="crash_the_player">Jooksuta meediamängija kokku</string>
     <string name="show_error_snackbar">Näita veateate akent</string>
-    <string name="background_player_already_playing_toast">Meedia esitamine taustal toimib juba</string>
     <string name="error_report_channel_name">Teavitus vigadest</string>
     <string name="error_report_channel_description">Teavitused vigadest informeerimiseks</string>
     <string name="error_report_notification_toast">Tekkis viga, vaata vastavat teadet</string>
@@ -685,6 +684,28 @@
 \nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku.</string>
     <string name="detail_pinned_comment_view_description">Esiletõstetud kommentaar</string>
     <string name="leak_canary_not_available">LeakCanary pole saadaval</string>
-    <string name="progressive_load_interval_default">ExoPlayer\'i vaikimisi väärtused</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer\'i vaikimisi väärtused</string>
     <string name="progressive_load_interval_summary">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.</string>
+    <string name="settings_category_player_notification_title">Meediamängija teavitused</string>
+    <string name="notifications_disabled">Teavitused pole kasutusel</string>
+    <string name="streams_notifications_interval_title">Kontrollimise sagedus</string>
+    <string name="streams_notification_channel_description">Tellimuste-kohaste uute meedivoogude teavitused</string>
+    <string name="delete_downloaded_files_confirm">Kas kustutame kõik allalaaditud failid andmekandjalt\?</string>
+    <string name="notifications">Teavitused</string>
+    <string name="settings_category_player_notification_summary">Seadista hetkel esitatava meediavoo teavitusi</string>
+    <string name="streams_notification_channel_name">Uued meediavood</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s uus meediavoog</item>
+        <item quantity="other">%s uut meediavoogu</item>
+    </plurals>
+    <string name="loading_stream_details">Laadin meediavoo teavet…</string>
+    <string name="check_new_streams">Käivita uute meediavoogude kontroll</string>
+    <string name="enable_streams_notifications_title">Uute meedivoogude teavitused</string>
+    <string name="enable_streams_notifications_summary">Tellimustega seotud uute meedivoogude teavitused</string>
+    <string name="streams_notifications_network_title">Võrguühendus on vajalik</string>
+    <string name="any_network">Mis tahes võrk</string>
+    <string name="get_notified">Saa teavitusi</string>
+    <string name="you_successfully_subscribed">Sa oled nüüd selle kanali tellija</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Lülita kõik sisse</string>
 </resources>
\ 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 @@
     <string name="privacy_policy_encouragement">NewPipe proiektuak aintzat hartzen du zure pribatutasuna. Aplikazioak ez du zure baimenik gabe daturik jasotzen.
 \nNewPipe pribatutasun politikak azaltzen du zehazki bidali eta gordetako informazioa zein den kraskatze txosten bat bidaltzen duzunean.</string>
     <string name="read_privacy_policy">Irakurri pribatutasun politika</string>
-    <string name="start_accept_privacy_policy">European General Data Protection Regulation (GDPR) legea betetzeko, NewPipe pribatutasun politika irakurtzera gonbidaatzen zaitugu.
+    <string name="start_accept_privacy_policy">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.</string>
     <string name="accept">Onartu</string>
     <string name="decline">Ukatu</string>
@@ -664,9 +664,8 @@
     <string name="start_main_player_fullscreen_title">Hasi erreproduzitzaile nagusia pantaila osoan</string>
     <string name="enqueued_next">Isatsari bideo hau erantsita</string>
     <string name="enqueue_next_stream">Gehitu bideo hau isatsari</string>
-    <string name="show_crash_the_player_title">Erakutsi \"itxi erreproduzigailua\"</string>
+    <string name="show_crash_the_player_title">Erakutsi \"Itxi erreproduzigailua\"</string>
     <string name="processing_may_take_a_moment">Prozesatzen... Itxoin mesedez</string>
-    <string name="background_player_already_playing_toast">Atzeko planoan erreproduzitzen dagoeneko</string>
     <string name="error_report_channel_name">Erroreen txostenen jakinarazpena</string>
     <string name="error_report_channel_description">Jakinarazpenak erroreen berri emateko</string>
     <string name="error_report_notification_title">NewPipe-k errore bat aurkitu du, sakatu berri emateko</string>
@@ -684,4 +683,29 @@
     <string name="show_crash_the_player_summary">Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du</string>
     <string name="show_error_snackbar">Erakutsi errore barra bat</string>
     <string name="create_error_notification">Sortu errore jakinarazpen bat</string>
+    <string name="settings_category_player_notification_summary">Konfiguratu uneko erreprodukzioaren jakinarazpenak</string>
+    <string name="notifications">Jakinarazpenak</string>
+    <string name="settings_category_player_notification_title">Erreproduzigailuaren jakinarazpenak</string>
+    <string name="streams_notification_channel_name">Jario berriak</string>
+    <string name="check_new_streams">Egiaztatu jario berriak</string>
+    <string name="enable_streams_notifications_title">Jario berrien jakinarazpenak</string>
+    <string name="any_network">Edozein sare</string>
+    <string name="notifications_disabled">Jakinarazpenak desgaituta daude</string>
+    <string name="you_successfully_subscribed">Kanal honetara harpidetu zara</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Txandakatu denak</string>
+    <string name="progressive_load_interval_summary">Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiarazte bat behar du.</string>
+    <string name="enable_streams_notifications_summary">Harpidetzen jario berriei buruz jakinarazi</string>
+    <string name="delete_downloaded_files_confirm">Ezabatu deskargatutako fitxategi guztiak biltegitik\?</string>
+    <string name="streams_notification_channel_description">Harpidetzentzako jario berrien jakinarazpenak</string>
+    <string name="loading_stream_details">Jarioaren xehetasunak kargatzen…</string>
+    <plurals name="new_streams">
+        <item quantity="one">jario berri %s</item>
+        <item quantity="other">%s jario berri</item>
+    </plurals>
+    <string name="leak_canary_not_available">LeakCanary ez dago eskuragarri</string>
+    <string name="streams_notifications_interval_title">Egiaztapen maiztasuna</string>
+    <string name="get_notified">Jakinarazi</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer lehenetsia</string>
+    <string name="streams_notifications_network_title">Beharrezko sare konexioa</string>
 </resources>
\ 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 @@
     <string name="short_million">M</string>
     <string name="short_billion">B</string>
     <plurals name="subscribers">
-        <item quantity="one">%s مشترک</item>
+        <item quantity="one">۱ مشترک</item>
         <item quantity="other">%s مشترک</item>
     </plurals>
     <string name="no_views">بدون بازدید</string>
     <plurals name="views">
-        <item quantity="one">%s بازدید</item>
+        <item quantity="one">۱ بازدید</item>
         <item quantity="other">%s بازدید</item>
     </plurals>
     <string name="no_videos">بدون ویدیو</string>
     <plurals name="videos">
-        <item quantity="one">%s ویدیو</item>
+        <item quantity="one">۱ ویدیو</item>
         <item quantity="other">%s ویدیو</item>
     </plurals>
     <string name="create">ایجاد</string>
@@ -438,7 +438,7 @@
     <string name="feed_create_new_group_button_title">جدید</string>
     <string name="feed_group_dialog_delete_message">می‌خواهید این گروه را پاک کنید؟</string>
     <plurals name="feed_group_dialog_selection_count">
-        <item quantity="one">%d مورد گزیده</item>
+        <item quantity="one">۱ مورد گزیده</item>
         <item quantity="other">%d مورد گزیده</item>
     </plurals>
     <string name="feed_processing_message">پردازش خوراک…</string>
@@ -446,19 +446,19 @@
     <string name="feed_subscription_not_loaded_count">بارگیری نشده: %d</string>
     <string name="feed_oldest_subscription_update">آخرین به‌روزرسانی خوراک: %s</string>
     <plurals name="days">
-        <item quantity="one">%d روز</item>
+        <item quantity="one">۱ روز</item>
         <item quantity="other">%d روز</item>
     </plurals>
     <plurals name="hours">
-        <item quantity="one">%d ساعت</item>
+        <item quantity="one">۱ ساعت</item>
         <item quantity="other">%d ساعت</item>
     </plurals>
     <plurals name="minutes">
-        <item quantity="one">%d دقیقه</item>
+        <item quantity="one">۱ دقیقه</item>
         <item quantity="other">%d دقیقه</item>
     </plurals>
     <plurals name="seconds">
-        <item quantity="one">%d ثانیه</item>
+        <item quantity="one">۱ ثانیه</item>
         <item quantity="other">%d ثانیه</item>
     </plurals>
     <string name="remove_watched_popup_yes_and_partially_watched_videos">بله، و ویدیوهای ناقص دیده شده</string>
@@ -485,12 +485,12 @@
     <string name="infinite_videos">∞ ویدیو</string>
     <string name="more_than_100_videos">بیش از ۱۰۰ ویدیو</string>
     <plurals name="listening">
-        <item quantity="one">%s شنونده</item>
+        <item quantity="one">۱ شنونده</item>
         <item quantity="other">%s شنونده</item>
     </plurals>
     <string name="no_one_listening">کسی در حال شنیدن نیست</string>
     <plurals name="watching">
-        <item quantity="one">%s بیننده</item>
+        <item quantity="one">۱ بیننده</item>
         <item quantity="other">%s بیننده</item>
     </plurals>
     <string name="no_one_watching">کسی در حال مشاهده نیست</string>
@@ -683,10 +683,29 @@
     <string name="error_report_notification_title">نیوپایپ به خطایی برخورد. برای گزارش، بزنید</string>
     <string name="error_report_notification_toast">خطایی رخ داد. آگاهی را ببینید</string>
     <string name="detail_pinned_comment_view_description">نظر سنجاق شده</string>
-    <string name="background_player_already_playing_toast">در حال پخش در پس‌زمینه</string>
     <string name="leak_canary_not_available">لیک‌کاناری موجود نیست</string>
-    <string name="playback_tempo_step">گام سرعت</string>
-    <string name="adjust_by_semitones_checkbox">تنظیم زیر و بم با شبه‌تن‌ها</string>
     <string name="progressive_load_interval_summary">تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند.</string>
-    <string name="progressive_load_interval_default">پیش‌گزیدهٔ اگزوپلیر</string>
+    <string name="progressive_load_interval_exoplayer_default">پیش‌گزیدهٔ اگزوپلیر</string>
+    <string name="notifications">آگاهی‌ها</string>
+    <string name="loading_stream_details">بار کردن جزییات جریان…</string>
+    <string name="check_new_streams">اجرای بررسی برای جریان‌های جدید</string>
+    <string name="streams_notifications_network_title">نیازمند اتّصال شبکه</string>
+    <string name="enumeration_comma">،</string>
+    <string name="toggle_all">تغییر وضعیت همه</string>
+    <string name="streams_notification_channel_name">جریان‌های جدید</string>
+    <plurals name="new_streams">
+        <item quantity="one">۱ جریان جدید</item>
+        <item quantity="other">%s جریان جدید</item>
+    </plurals>
+    <string name="settings_category_player_notification_summary">پیکربندی آگاهی جریان در حال پخش کنونی</string>
+    <string name="enable_streams_notifications_title">آگاهی‌های جریان‌های جدید</string>
+    <string name="settings_category_player_notification_title">آگاهی پخش‌کننده</string>
+    <string name="streams_notification_channel_description">آگاهی‌ها دربارهٔ جریان‌های جدید برای اشتراک‌ها</string>
+    <string name="notifications_disabled">آگاهی‌ها از کار افتاده‌اند</string>
+    <string name="get_notified">آگاه شوید</string>
+    <string name="streams_notifications_interval_title">بسامد بررسی</string>
+    <string name="enable_streams_notifications_summary">آگاه کردن دربارهٔ جریان‌های جدید از اشتراک‌ها</string>
+    <string name="delete_downloaded_files_confirm">پاک کردن تمامی پرونده‌های بارگرفته از دیسک؟</string>
+    <string name="any_network">هر شبکه‌ای</string>
+    <string name="you_successfully_subscribed">اکنون مشترک این کانال شده‌اید</string>
 </resources>
\ 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 @@
     <string name="use_inexact_seek_title">Gamitin ang mabilis ngunit di-saktong seek</string>
     <string name="seek_duration_title">Haba ng fast forward/-rewind seek</string>
     <string name="resume_on_audio_focus_gain_title">Ituloy ang pagpapalabas</string>
-    <string name="trending">Mga Patok Ngayon</string>
+    <string name="trending">Patok Ngayon</string>
+    <string name="enable_watch_history_summary">Subaybayan ang mga napanood nang video</string>
+    <string name="recent">Kumakailan</string>
+    <string name="metadata_category">Kategorya</string>
+    <string name="metadata_tags">Mga Tag</string>
+    <string name="metadata_privacy">Praybasi</string>
+    <string name="notifications_disabled">Nakapatay ang Mga Notipikasyon</string>
+    <string name="metadata_privacy_public">Publiko</string>
+    <string name="comments_tab_description">Mga Puna</string>
+    <string name="msg_running">Nagda-dawnload ang NewPipe</string>
+    <string name="on">Naka-bukas</string>
+    <string name="app_language_title">Wika ng App</string>
+    <string name="tab_about">Tungkol dito</string>
+    <string name="restricted_video_no_stream">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.</string>
+    <string name="notification_channel_name">Notipikasyon sa NewPipe</string>
+    <plurals name="listening">
+        <item quantity="one">%s nakikinig</item>
+        <item quantity="other">Mga %s nakikinig</item>
+    </plurals>
+    <string name="more_than_100_videos">100+ na mga video</string>
+    <string name="infinite_videos">∞ na mga video</string>
+    <string name="no_comments">Walang Komento</string>
+    <string name="play_all">Ipalabas Lahat</string>
+    <string name="notifications">Mga Notipikasyon</string>
+    <string name="comments_are_disabled">Pinagbabawal ang pagkomento</string>
+    <string name="settings_file_charset_title">Mga pinahihintulutang karakter sa pangalan ng file</string>
+    <string name="tab_licenses">Mga Lisensya</string>
+    <string name="title_activity_history">Kasaysayan</string>
+    <string name="main_page_content">Laman ng pangunahing pahina</string>
+    <string name="duration_live">Live</string>
+    <string name="always">Palagi</string>
+    <string name="delete_item_search_history">Gusto mo bang burahin ito sa kasaysayan ng paghanap\?</string>
+    <string name="content">Laman</string>
+    <plurals name="hours">
+        <item quantity="one">%d oras</item>
+        <item quantity="other">mga %d oras</item>
+    </plurals>
+    <string name="systems_language">Karaniwan ng Sistema</string>
+    <string name="private_content">Nakapribado ang content na ito, kaya hindi ito maipalabas o mai-download ng NewPipe.</string>
+    <string name="download_has_started">Sinisimulan na ang Pagdownload</string>
+    <string name="detail_heart_img_view_description">Pinusuan ng creator</string>
+    <string name="video_detail_by">Ni %s</string>
+    <string name="help">Tulong</string>
+    <string name="detail_pinned_comment_view_description">Naka-pin na komento</string>
+    <string name="open_website_license">Buksan ang website</string>
+    <string name="metadata_licence">Lisensya</string>
+    <string name="metadata_language">Wika</string>
+    <string name="metadata_privacy_private">Pribado</string>
+    <string name="metadata_thumbnail_url">URL ng Thumbnail</string>
+    <string name="metadata_privacy_unlisted">Hindi nakalista</string>
+    <string name="off">Nakapatay</string>
+    <string name="new_and_hot">Bago at patok</string>
+    <string name="content_language_title">Panimulang wika ng content</string>
+    <string name="settings_category_appearance_title">Itsura ng App</string>
+    <plurals name="seconds">
+        <item quantity="one">%d segundo</item>
+        <item quantity="other">Mga %d segundo</item>
+    </plurals>
+    <string name="channel_created_by">Nilikha ni %s</string>
+    <string name="chapters">Mga Kabanata</string>
+    <string name="no_app_to_open_intent">Walang app sa device mo ang makakabukas nito</string>
+    <string name="featured">Tampok</string>
+    <string name="title_last_played">Huling Pinanood</string>
+    <string name="action_history">Kasaysayan</string>
+    <string name="no_one_listening">Walang nakikinig</string>
+    <string name="search_no_results">Walang nahanap</string>
+    <string name="switch_to_background">Pumalit sa Likuran</string>
+    <string name="clear_views_history_title">Linisin ang kasaysayan ng panonood</string>
+    <plurals name="watching">
+        <item quantity="one">%s nanonood</item>
+        <item quantity="other">Mga %s nanonood</item>
+    </plurals>
+    <string name="no_videos">Walang mga video</string>
+    <string name="title_most_played">Madalas na Pinanood</string>
+    <plurals name="videos">
+        <item quantity="one">%s video</item>
+        <item quantity="other">Mga %s na video</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d minuto</item>
+        <item quantity="other">Mga %d minuto</item>
+    </plurals>
+    <plurals name="days">
+        <item quantity="one">%d araw</item>
+        <item quantity="other">mga %d araw</item>
+    </plurals>
 </resources>
\ 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 @@
     <string name="no_appropriate_file_manager_message">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.</string>
     <string name="detail_pinned_comment_view_description">Commentaire épinglé</string>
-    <string name="background_player_already_playing_toast">Une lecture est déjà en arrière-plan</string>
     <string name="leak_canary_not_available">LeakCanary n\'est pas disponible</string>
     <string name="progressive_load_interval_summary">Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos .</string>
-    <string name="adjust_by_semitones_checkbox">Règler la hauteur par demi-tons musicaux</string>
-    <string name="playback_tempo_step">Pas du tempo</string>
-    <string name="progressive_load_interval_default">Valeur par défaut d’ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Valeur par défaut d’ExoPlayer</string>
+    <string name="streams_notification_channel_name">Nouveaux flux</string>
+    <string name="settings_category_player_notification_summary">Configurer la notification du flux en cours de lecture</string>
+    <string name="get_notified">Recevoir des notifications</string>
+    <string name="loading_stream_details">Chargement des détails du flux…</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s nouveau flux</item>
+        <item quantity="other">%s nouveaux flux</item>
+    </plurals>
+    <string name="streams_notifications_network_title">Connexion réseau requise</string>
+    <string name="notifications">Notifications</string>
+    <string name="notifications_disabled">Notifications désactivées</string>
+    <string name="you_successfully_subscribed">Vous êtes maintenant abonné(e) à cette chaîne</string>
+    <string name="settings_category_player_notification_title">Notification du Lecteur</string>
+    <string name="streams_notification_channel_description">Notifications pour de nouveaux flux des abonnements</string>
+    <string name="delete_downloaded_files_confirm">Supprimer tous les fichiers téléchargés du disque \?</string>
+    <string name="check_new_streams">Exécuter la vérification de nouveaux flux</string>
+    <string name="enable_streams_notifications_title">Notifications pour de nouveaux flux</string>
+    <string name="any_network">N\'importe quel réseau</string>
+    <string name="streams_notifications_interval_title">Fréquence de vérification</string>
+    <string name="enable_streams_notifications_summary">Notifications pour de nouveaux flux des abonnements</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Sélectionner/Désélectionner tout</string>
 </resources>
\ 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 @@
     <string name="enqueued_next">Enfileirado</string>
     <string name="manual_update_title">Procurar actualizacións</string>
     <string name="manual_update_description">Procurar manualmente novas versións</string>
-    <string name="adjust_by_semitones_checkbox">Axustar o ton do semitóns musicais</string>
-    <string name="playback_tempo_step">Paso do tempo</string>
     <string name="checking_updates_toast">A procurar actualizacións…</string>
     <string name="downloads_storage_use_saf_summary_api_29">A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado</string>
     <string name="progressive_load_interval_summary">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.</string>
@@ -682,7 +680,7 @@
     <string name="show_image_indicators_summary">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</string>
     <string name="downloads_storage_use_saf_summary_api_19">O \'Sistema de Acceso ao almacenamento\' non está soportado en Android KitKat e anteriores</string>
     <string name="feed_new_items">Novos elementos</string>
-    <string name="progressive_load_interval_default">Predefinido do ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Predefinido do ExoPlayer</string>
     <string name="show_crash_the_player_title">Amosar \"Travar o reprodutor\"</string>
     <string name="show_error_snackbar">Amosar un snackbar de erro</string>
     <string name="show_crash_the_player_summary">Amosa unha opción de travamento ao usar o reprodutor</string>
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 @@
     <string name="autoplay_summary">להתחיל לנגן אוטומטית — %s</string>
     <string name="title_activity_play_queue">לנגן את התור</string>
     <string name="unsupported_url_dialog_message">לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\?</string>
-    <string name="auto_queue_toggle">הוספה אוטומטית לתור</string>
+    <string name="auto_queue_toggle">סידור אוטומטי בתור</string>
     <string name="clear_queue_confirmation_description">התור מהנגן הפעיל יוחלף</string>
     <string name="clear_queue_confirmation_summary">מעבר מנגן אחד למשנהו עלול להחליף את התור שלך</string>
     <string name="clear_queue_confirmation_title">לבקש אישור לפני מחיקת התור</string>
@@ -706,11 +706,32 @@
     <string name="error_report_channel_name">התראת דיווח שגיאה</string>
     <string name="no_appropriate_file_manager_message_android_10">לא נמצאו מנהלי קבצים שמתאימים לפעולה הזאת.
 \nנא להתקין מנהל קבצים שתומך בתשתית גישה לאחסון.</string>
-    <string name="background_player_already_playing_toast">כבר מתנגן ברקע</string>
     <string name="detail_pinned_comment_view_description">הערה ננעצה</string>
     <string name="leak_canary_not_available">LeakCanary אינה זמינה</string>
-    <string name="adjust_by_semitones_checkbox">התאמת גובה הצליל לפי חצאי טונים מוזיקליים</string>
-    <string name="playback_tempo_step">צעד מקצב</string>
-    <string name="progressive_load_interval_default">ברירת מחדל של ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">ברירת מחדל של ExoPlayer</string>
     <string name="progressive_load_interval_summary">שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית. שינויים דורשים את הפעלת הנגן מחדש.</string>
+    <string name="streams_notification_channel_description">התראות על תזרימים חדשים להרשמה</string>
+    <string name="streams_notifications_interval_title">תדירות בדיקה</string>
+    <string name="streams_notifications_network_title">נדרש חיבור לרשת</string>
+    <string name="get_notified">קבלת הודעה</string>
+    <string name="toggle_all">להחליף את המצב של הכול</string>
+    <string name="settings_category_player_notification_summary">הגדרת התראת התזרים שמתנגן כרגע</string>
+    <string name="notifications">התראות</string>
+    <plurals name="new_streams">
+        <item quantity="one">תזרים חדש</item>
+        <item quantity="two">%s תזרימים חדשים</item>
+        <item quantity="many">%s תזרימים חדשים</item>
+        <item quantity="other">%s תזרימים חדשים</item>
+    </plurals>
+    <string name="loading_stream_details">פרטי התזרים נטענים…</string>
+    <string name="check_new_streams">הרצת בדיקה על תזרימים חדשים</string>
+    <string name="enable_streams_notifications_title">התראות תזרימים חדשים</string>
+    <string name="enable_streams_notifications_summary">הודעה על תזרימים חדשים מהמינויים</string>
+    <string name="enumeration_comma">,</string>
+    <string name="streams_notification_channel_name">תזרימים חדשים</string>
+    <string name="settings_category_player_notification_title">התראות נגן</string>
+    <string name="any_network">רשת כלשהי</string>
+    <string name="delete_downloaded_files_confirm">למחוק את כל הקבצים שהורדו מהכונן\?</string>
+    <string name="notifications_disabled">התראות מושבתות</string>
+    <string name="you_successfully_subscribed">נרשמת לערוץ הזה</string>
 </resources>
\ 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 @@
     <string name="donation_encouragement">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.</string>
     <string name="main_page_content_summary">Koje su kartice prikazane na glavnoj stranici</string>
     <string name="conferences">Konferencije</string>
-    <string name="preferred_open_action_settings_title">Preferirana \'otvori\' akcija</string>
+    <string name="preferred_open_action_settings_title">Željena radnja otvaranja streama</string>
     <string name="preferred_open_action_settings_summary">Zadana radnja pri otvaranju sadržaja — %s</string>
     <string name="caption_setting_title">Titlovi</string>
     <string name="caption_setting_description">Promijeni veličinu podnaslova reproduktora i pozadinske stilove reproduktora. Za stupanje na snagu, program se mora ponovo pokrenuti</string>
@@ -602,8 +602,8 @@
     <string name="restricted_video_no_stream">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.</string>
     <string name="download_has_started">Preuzimanje je započeto</string>
-    <string name="select_night_theme_toast">Dolje možeš odabrati omiljenu noćnu temu</string>
-    <string name="night_theme_summary">Odaberi omiljenu noćnu temu – %s</string>
+    <string name="select_night_theme_toast">Dolje možete odabrati željenu noćnu temu</string>
+    <string name="night_theme_summary">Odaberi željenu noćnu temu – %s</string>
     <string name="auto_device_theme_title">Automatski (tema uređaja)</string>
     <string name="radio">Radio</string>
     <string name="featured">Istaknuto</string>
@@ -687,4 +687,29 @@
     <string name="error_report_notification_title">NewPipe je naišao na grešku, dodirni za prijavu</string>
     <string name="error_report_notification_toast">Došlo je do greške, pogledaj obavijest</string>
     <string name="crash_the_player">Prekini rad playera</string>
+    <string name="settings_category_player_notification_title">Obavijest reproduktora</string>
+    <string name="settings_category_player_notification_summary">Prilagođavanje obavijesti reproduktora</string>
+    <string name="notifications">Obavijesti</string>
+    <string name="streams_notification_channel_name">Novi videozapisi</string>
+    <string name="enable_streams_notifications_summary">Obavijesti novih streamova pretplaćenih kanala</string>
+    <string name="delete_downloaded_files_confirm">Želite li izbrisati sve preuzete datoteke\?</string>
+    <string name="notifications_disabled">Obavijesti su onemogućene</string>
+    <string name="you_successfully_subscribed">Pretplatili ste se ovome kanalu</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Uključiti/isključiti sve</string>
+    <string name="any_network">Bilo kakva mreža</string>
+    <string name="streams_notification_channel_description">Obavijesti novih streamova pretplaćenih kanala</string>
+    <string name="show_error_snackbar">Pokaži zalogajnicu greške</string>
+    <string name="loading_stream_details">Učitavanje pojedinosti streama…</string>
+    <string name="check_new_streams">Pokrenite provjeru novih streamova</string>
+    <string name="streams_notifications_interval_title">Učestalost provjere</string>
+    <string name="leak_canary_not_available">LeakCanary nije dostupno</string>
+    <string name="adjust_by_semitones_checkbox">Podešavanje visine tona po glazbenim polutonovima</string>
+    <string name="enable_streams_notifications_title">Obavijesti o novim streamovima</string>
+    <string name="streams_notifications_network_title">Potrebna mrežna veza</string>
+    <string name="progressive_load_interval_default">Zadano za ExoPlayer</string>
+    <string name="get_notified">Primite obavijesti</string>
+    <string name="no_appropriate_file_manager_message">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.</string>
+    <string name="detail_pinned_comment_view_description">Prikvačeni komentar</string>
 </resources>
\ 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 @@
         <item quantity="other">%1$s letöltés törölve</item>
     </plurals>
     <string name="detail_pinned_comment_view_description">Rögzített megjegyzés</string>
-    <string name="background_player_already_playing_toast">Már megy a lejátszás a háttérben</string>
     <string name="leak_canary_not_available">LeakCanary nem elérhető</string>
 </resources>
\ 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 @@
     <string name="open_with">Aperir con</string>
     <string name="remote_search_suggestions">Suggestiones de recerca remote</string>
     <string name="download_thumbnail_title">Cargar miniaturas</string>
-    <string name="settings_category_notification_title">Notification</string>
     <string name="search_showing_result_for">Monstrante resultatos pro: %s</string>
     <string name="show_higher_resolutions_summary">Solmente alicun apparatos pote reproducer videos 2K/4K</string>
     <string name="start_main_player_fullscreen_title">Initiar le reproductor principal in schermo plen</string>
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 @@
     <string name="no_appropriate_file_manager_message_android_10">Tidak ada manajer file yang ditemukan untuk tindakan ini.
 \nMohon instal sebuah manajer file yang kompatibel dengan Storage Access Framework.</string>
     <string name="detail_pinned_comment_view_description">Komentar dipin</string>
-    <string name="background_player_already_playing_toast">Sudah diputar di latar belakang</string>
     <string name="leak_canary_not_available">LeakCanary tidak tersedia</string>
-    <string name="playback_tempo_step">Langkah tempo</string>
-    <string name="progressive_load_interval_default">Default ExoPlayer</string>
-    <string name="adjust_by_semitones_checkbox">Atur nada berdasarkan semitone musik</string>
+    <string name="progressive_load_interval_exoplayer_default">Default ExoPlayer</string>
     <string name="progressive_load_interval_summary">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.</string>
+    <string name="loading_stream_details">Memuat detail stream…</string>
+    <string name="streams_notifications_interval_title">Frekuensi pemeriksaan</string>
+    <string name="streams_notifications_network_title">Dibutuhkan koneksi jaringan</string>
+    <string name="any_network">Jaringan apa saja</string>
+    <string name="get_notified">Beritahu saya</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Alih semua</string>
+    <plurals name="new_streams">
+        <item quantity="other">%s stream baru</item>
+    </plurals>
+    <string name="check_new_streams">Jalankan periksa untuk stream baru</string>
+    <string name="delete_downloaded_files_confirm">Hapus semua file yang terunduh dari disk\?</string>
+    <string name="notifications_disabled">Notifikasi dinonaktifkan</string>
+    <string name="settings_category_player_notification_title">Notifikasi pemain</string>
+    <string name="notifications">Notifikasi</string>
+    <string name="settings_category_player_notification_summary">Konfigurasi notifikasi permainan stream saat ini</string>
+    <string name="streams_notification_channel_name">Stream baru</string>
+    <string name="streams_notification_channel_description">Notifikasi tentang stream baru untuk langganan</string>
+    <string name="enable_streams_notifications_title">Notifikasi stream baru</string>
+    <string name="enable_streams_notifications_summary">Beritahu tentang stream baru dari notifikasi</string>
+    <string name="you_successfully_subscribed">Anda sekarang berlangganan ke channel ini</string>
 </resources>
\ 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 @@
     <string name="controls_background_title">In sottofondo</string>
     <string name="controls_popup_title">Popup</string>
     <string name="default_popup_resolution_title">Risoluzione predefinita lettore popup</string>
-    <string name="show_higher_resolutions_title">Mostra altre risoluzioni</string>
+    <string name="show_higher_resolutions_title">Mostra risoluzioni più elevate</string>
     <string name="show_higher_resolutions_summary">Solo alcuni dispositivi possono riprodurre video 2K/4K</string>
     <string name="default_video_format_title">Formato video predefinito</string>
     <string name="popup_remember_size_pos_title">Ricorda proprietà lettore popup</string>
@@ -291,7 +291,7 @@
     <string name="metadata_cache_wipe_summary">Elimina i dati delle pagine web memorizzati nella cache</string>
     <string name="metadata_cache_wipe_complete_notice">Cache metadati svuotata</string>
     <string name="playback_speed_control">Controlli della velocità di riproduzione</string>
-    <string name="playback_tempo">Tempo</string>
+    <string name="playback_tempo">Velocità</string>
     <string name="playback_pitch">Tono</string>
     <string name="unhook_checkbox">Scollega (può causare distorsione)</string>
     <string name="no_streams_available_download">Nessun flusso disponibile per il download</string>
@@ -664,7 +664,7 @@
     <string name="start_main_player_fullscreen_title">Avvia il lettore principale a schermo intero</string>
     <string name="enqueued_next">Aggiunto alla coda come prossimo</string>
     <string name="enqueue_next_stream">Accoda come prossimo</string>
-    <string name="processing_may_take_a_moment">Elaborazione... Potrebbe volerci un attimo</string>
+    <string name="processing_may_take_a_moment">Elaborazione… Potrebbe volerci un attimo</string>
     <string name="manual_update_title">Controlla aggiornamenti</string>
     <string name="manual_update_description">Verifica manualmente la presenza di nuove versioni</string>
     <string name="checking_updates_toast">Controllo aggiornamenti…</string>
@@ -683,10 +683,29 @@
     <string name="no_appropriate_file_manager_message_android_10">Non è stato trovato alcun gestore di file appropriato per questa azione.
 \nInstallane uno compatibile con Storage Access Framework.</string>
     <string name="detail_pinned_comment_view_description">Commento in primo piano</string>
-    <string name="background_player_already_playing_toast">Già in riproduzione in sottofondo</string>
     <string name="leak_canary_not_available">LeakCanary non è disponibile</string>
-    <string name="adjust_by_semitones_checkbox">Regola il tono secondo i semitoni musicali</string>
-    <string name="progressive_load_interval_default">Predefinito ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Predefinito ExoPlayer</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="playback_tempo_step">Passo tempo</string>
+    <string name="streams_notification_channel_description">Notifiche di nuovi contenuti dalle iscrizioni</string>
+    <string name="streams_notifications_interval_title">Frequenza controllo</string>
+    <string name="streams_notifications_network_title">Connessione di rete richiesta</string>
+    <string name="get_notified">Ricevi le notifiche</string>
+    <string name="you_successfully_subscribed">Sei ora iscritto a questo canale</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Attiva/disattiva tutti</string>
+    <string name="enable_streams_notifications_title">Notifiche per i nuovi contenuti</string>
+    <string name="settings_category_player_notification_title">Notifica del lettore multimediale</string>
+    <string name="settings_category_player_notification_summary">Configura la notifica dell\'elemento attualmente in riproduzione</string>
+    <string name="notifications">Notifiche</string>
+    <string name="streams_notification_channel_name">Nuovi contenuti</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s nuovo contenuto</item>
+        <item quantity="other">%s nuovi contenuti</item>
+    </plurals>
+    <string name="loading_stream_details">Caricando i dettagli della stream…</string>
+    <string name="delete_downloaded_files_confirm">Cancellare tutti i file scaricati dal dispositivo\?</string>
+    <string name="check_new_streams">Controlla la presenza di nuovi contenuti</string>
+    <string name="any_network">Qualsiasi rete</string>
+    <string name="notifications_disabled">Le notifiche sono disabilitate</string>
+    <string name="enable_streams_notifications_summary">Notifica la presenza di nuovi contenuti dalle iscrizioni</string>
 </resources>
\ 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 @@
     <string name="error_report_notification_toast">エラーが発生しました。通知をご覧ください</string>
     <string name="error_report_notification_title">NewPipe はエラーに遭遇しました。タップして報告</string>
     <string name="show_error_snackbar">スナックバーにエラーを表示</string>
-    <string name="background_player_already_playing_toast">既にバックグラウンドで再生されています</string>
     <string name="detail_pinned_comment_view_description">固定されたコメント</string>
     <string name="no_appropriate_file_manager_message_android_10">この動作に適切なファイルマネージャが見つかりませんでした。
 \nStorage Access Frameworkと互換性のあるファイルマネージャをインストールしてください。</string>
@@ -673,5 +672,25 @@
     <string name="create_error_notification">エラー通知を作成</string>
     <string name="error_report_channel_description">エラーを報告する通知</string>
     <string name="leak_canary_not_available">LeakCanaryが利用不可能です</string>
-    <string name="playback_tempo_step">緩急音階</string>
+    <string name="settings_category_player_notification_title">プレイヤー通知</string>
+    <string name="loading_stream_details">ストリームの詳細を読み込んでいます…</string>
+    <string name="enable_streams_notifications_summary">登録チャンネルの新しいストリームについて通知する</string>
+    <string name="enumeration_comma">,</string>
+    <string name="notifications_disabled">通知は無効化されています</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer のデフォルト</string>
+    <string name="get_notified">通知を受け取る</string>
+    <string name="you_successfully_subscribed">このチャンネルを購読しました</string>
+    <string name="delete_downloaded_files_confirm">ディスクからダウンロードしたすべてのファイルを削除しますか?</string>
+    <string name="toggle_all">すべて切り替え</string>
+    <string name="streams_notifications_interval_title">確認する頻度</string>
+    <string name="check_new_streams">新しいストリームのチェックを実行</string>
+    <string name="streams_notification_channel_description">購読チャンネルの新しいストリームに関する通知</string>
+    <string name="enable_streams_notifications_title">新しいストリームの通知</string>
+    <plurals name="new_streams">
+        <item quantity="other">%s 件の新しいストリーム</item>
+    </plurals>
+    <string name="streams_notification_channel_name">新しいストリーム</string>
+    <string name="notifications">通知</string>
+    <string name="settings_category_player_notification_summary">現在再生しているストリームの通知を構成</string>
+    <string name="progressive_load_interval_summary">読み込む間隔を変更します (現在 %s)。小さい値にすると初回読み込み時間が短くなります。変更にはプレイヤーの再起動が必要です。</string>
 </resources>
\ 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 @@
     <string name="show_next_and_similar_title">다음/유사한 비디오 표시</string>
     <string name="unsupported_url">지원하지 않는 URL입니다</string>
     <string name="content_language_title">기본 컨텐츠 언어</string>
-    <string name="settings_category_video_audio_title">비디오 &amp; 오디오</string>
+    <string name="settings_category_video_audio_title">비디오 및 오디오</string>
     <string name="detail_thumbnail_view_description">비디오 재생, 구간:</string>
     <string name="detail_uploader_thumbnail_view_description">업로더 썸네일</string>
     <string name="detail_dislikes_img_view_description">싫어요</string>
@@ -43,7 +43,7 @@
     <string name="network_error">네트워크 오류</string>
     <string name="main_bg_subtitle">\"검색\" 버튼을 눌러서 시작하세요</string>
     <string name="content">컨텐츠</string>
-    <string name="show_age_restricted_content_title">연령 제한 컨텐츠</string>
+    <string name="show_age_restricted_content_title">연령 제한 컨텐츠 보여주기</string>
     <string name="duration_live">라이브</string>
     <string name="general_error">오류</string>
     <string name="could_not_load_thumbnails">모든 썸네일을 불러올 수 없습니다</string>
@@ -52,7 +52,7 @@
     <string name="content_not_available">컨텐츠를 사용할 수 없습니다</string>
     <string name="could_not_setup_download_menu">다운로드 메뉴를 설정할 수 없습니다</string>
     <string name="sorry_string">죄송합니다. 오류가 발생했습니다.</string>
-    <string name="error_report_button_text">이메일을 통해 오류 보고</string>
+    <string name="error_report_button_text">이메일을 통해 이 오류 보고</string>
     <string name="error_snackbar_message">죄송합니다. 오류가 발생했습니다.</string>
     <string name="error_snackbar_action">보고</string>
     <string name="what_device_headline">정보:</string>
@@ -81,7 +81,7 @@
     <string name="controls_popup_title">팝업</string>
     <string name="default_popup_resolution_title">기본 팝업 해상도</string>
     <string name="show_higher_resolutions_title">높은 해상도 표시</string>
-    <string name="show_higher_resolutions_summary">일부 기기에서만 2K/4K 해상도 재생이 지원됩니다</string>
+    <string name="show_higher_resolutions_summary">일부 기기에서만 2K/4K 영상을 재생할 수 있습니다</string>
     <string name="default_video_format_title">기본 비디오 형식</string>
     <string name="black_theme_title">검은 테마</string>
     <string name="popup_remember_size_pos_title">팝업 크기 및 위치 기억</string>
@@ -98,7 +98,7 @@
     <string name="show_hold_to_append_summary">비디오 상세 정보 페이지에서 백그라운드/팝업 재생 버튼을 누를 경우 팁을 표시합니다</string>
     <string name="settings_category_player_title">플레이어</string>
     <string name="settings_category_player_behavior_title">동작</string>
-    <string name="settings_category_history_title">기록 &amp; 캐시</string>
+    <string name="settings_category_history_title">기록 및 캐시</string>
     <string name="popup_playing_toast">팝업 모드에서 재생 중</string>
     <string name="error_report_title">오류 보고</string>
     <string name="all">전부</string>
@@ -108,13 +108,13 @@
     <string name="undo">되돌리기</string>
     <string name="play_all">전부 재생</string>
     <string name="notification_channel_name">NewPipe 알림</string>
-    <string name="notification_channel_description">NewPipe 백그라운드 및 팝업 플레이어 알림</string>
+    <string name="notification_channel_description">NewPipe 플레이어 알림</string>
     <string name="unknown_content">[알 수 없음]</string>
     <string name="app_ui_crash">앱/UI 충돌</string>
     <string name="player_stream_failure">이 스트림을 재생할 수 없습니다</string>
     <string name="player_unrecoverable_failure">복구할 수 없는 플레이어 오류가 발생했습니다</string>
     <string name="player_recoverable_failure">플레이어 오류로부터 복구 중</string>
-    <string name="info_labels">무엇을:\\n요청:\\n컨텐츠 언어:\\n서비스:\\nGMT 기준 시간:\\n패키지:\\n버전:\\n안드로이드 버전:</string>
+    <string name="info_labels">무엇을:\\n요청:\\n컨텐츠 언어:\\컨텐츠 국가:\\n앱 언어:\\n서비스:\\nGMT 기준 시간:\\n패키지:\\n버전:\\n안드로이드 버전:</string>
     <string name="search_no_results">결과 없음</string>
     <string name="empty_subscription_feed_subtitle">구독할 항목을 추가하세요</string>
     <string name="short_thousand">천</string>
@@ -188,7 +188,7 @@
     <string name="tab_bookmarks">재생목록 북마크</string>
     <string name="controls_add_to_playlist_title">이곳에 추가</string>
     <string name="use_inexact_seek_title">정확하지는 않지만 빠른 탐색</string>
-    <string name="use_inexact_seek_summary">정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다</string>
+    <string name="use_inexact_seek_summary">정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다. 5, 15, 25초 탐색은 이 기능과 같이 작동하지 않습니다</string>
     <string name="auto_queue_title">다음 스트림을 자동으로 대기열에 추가하기</string>
     <string name="auto_queue_summary">이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생합니다</string>
     <string name="default_content_country_title">기본 콘텐츠 국가</string>
@@ -201,7 +201,7 @@
     <string name="import_data_title">데이터베이스 가져오기</string>
     <string name="export_data_title">데이터베이스 내보내기</string>
     <string name="import_data_summary">현재 시청 기록 및 구독 목록을 덮어쓰기 합니다</string>
-    <string name="export_data_summary">시청 기록, 구독 목록과 재생목록을 내보냅니다</string>
+    <string name="export_data_summary">시청 기록과 구독 목록, 재생 목록, 설정을 내보냅니다</string>
     <string name="external_player_unsupported_link_type">외부 플레이어는 이러한 종류의 링크를 지원하지 않습니다</string>
     <string name="video_streams_empty">발견된 비디오 스트림 없음</string>
     <string name="audio_streams_empty">발견된 오디오 스트림 없음</string>
@@ -300,11 +300,11 @@
     <string name="clear_views_history_title">시청 기록 삭제하기</string>
     <string name="clear_views_history_summary">동영상 시청 기록과 저장된 재생 위치를 삭제합니다</string>
     <string name="delete_view_history_alert">모든 시청 기록을 삭제하시겠습니까\?</string>
-    <string name="watch_history_deleted">동영상 시청 기록이 삭제되었습니다.</string>
+    <string name="watch_history_deleted">동영상 시청 기록이 삭제되었습니다</string>
     <string name="clear_search_history_title">검색 기록 삭제</string>
     <string name="clear_search_history_summary">검색 기록을 모두 삭제합니다</string>
     <string name="delete_search_history_alert">모든 검색 기록을 삭제하시겠습니까\?</string>
-    <string name="search_history_deleted">검색 기록이 삭제되었습니다.</string>
+    <string name="search_history_deleted">검색 기록이 삭제되었습니다</string>
     <string name="privacy_policy_title">NewPipe 개인정보 보호 정책</string>
     <string name="privacy_policy_encouragement">NewPipe 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. 
 \nNewPipe 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다.</string>
@@ -393,7 +393,7 @@
     <string name="enable_playback_state_lists_title">리스트 내 위치 표시</string>
     <string name="enable_playback_state_lists_summary">리스트에서 재생 위치를 표시합니다</string>
     <string name="settings_category_clear_data_title">데이터 삭제</string>
-    <string name="watch_history_states_deleted">재생위치 삭제완료.</string>
+    <string name="watch_history_states_deleted">재생위치 삭제완료</string>
     <string name="missing_file">파일이 이동되거나 삭제되었습니다</string>
     <string name="overwrite_failed">파일을 덮어쓰기할 수 없습니다</string>
     <string name="download_already_pending">해당 이름으로 대기된 다운로드가 있습니다</string>
@@ -431,7 +431,7 @@
     <string name="seek_duration_title">빠른-감기/되감기 찾는 시간</string>
     <string name="peertube_instance_url_title">피어튜브 인스턴스</string>
     <string name="peertube_instance_url_summary">당신이 선호하는 피어튜브 인스턴스를 선택하세요.</string>
-    <string name="peertube_instance_url_help">%s에서 당신에게 가장 잘 어울리는 인스턴스를 찾으세요.</string>
+    <string name="peertube_instance_url_help">%s에서 당신이 좋아하는 인스턴스를 찾으세요.</string>
     <string name="peertube_instance_add_title">인스턴스 추가하기</string>
     <string name="peertube_instance_add_help">인스턴스 URL을 입력하세요.</string>
     <string name="peertube_instance_add_fail">인스턴스를 검증할 수 없습니다.</string>
@@ -517,4 +517,19 @@
     <string name="night_theme_title">어두운 테마</string>
     <string name="notification_actions_at_most_three">최대 3개까지 축소 알림에 표시될 항목을 고를 수 있습니다!</string>
     <string name="notification_actions_summary">아래 항목을 터치해서 편집하세요. 위에서부터 체크된 3개 항목은 축소 알림일 때도 표시됩니다</string>
+    <string name="youtube_restricted_mode_enabled_title">유튜브의 \"제한 모드\"를 활성화</string>
+    <string name="hash_channel_description">비디오 해싱 진행 알림</string>
+    <string name="streams_notification_channel_name">새로운 스트림</string>
+    <string name="streams_notification_channel_description">구독에서 새 스트림이 있을 때 알림</string>
+    <string name="error_report_channel_name">오류 보고 알림</string>
+    <string name="recaptcha_cookies_cleared">reCAPTCHA 쿠키를 비웠습니다</string>
+    <string name="settings_category_player_notification_title">플레이어 알림</string>
+    <string name="notifications">알림</string>
+    <string name="youtube_restricted_mode_enabled_summary">유튜브는 잔인할 수 있는 컨텐츠를 숨겨주는 \"제한 모드\"를 제공합니다</string>
+    <string name="clear_cookie_title">reCAPTCHA 쿠키 비우기</string>
+    <string name="crash_the_player">플레이어 크래시 발생</string>
+    <string name="notification_action_nothing">없음</string>
+    <string name="start_main_player_fullscreen_title">전체화면으로 주 플레이어 시작</string>
+    <string name="hash_channel_name">비디오 해시 알림</string>
+    <string name="error_report_open_issue_button_text">GitHub에 보고</string>
 </resources>
\ 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 @@
     <string name="show_crash_the_player_summary">Viser et krasjalternativ ved bruk av avspilleren</string>
     <string name="error_report_notification_toast">Det oppstod en feil. Sjekk merknaden.</string>
     <string name="detail_pinned_comment_view_description">Festet kommentar</string>
-    <string name="background_player_already_playing_toast">Spilles allerede i bakgrunnen</string>
     <string name="error_report_channel_name">Feilrapport-merknad</string>
     <string name="error_report_channel_description">Merknader for innrapportering av feil</string>
     <string name="error_report_notification_title">NewPipe-feil. Trykk for å rapportere.</string>
@@ -681,7 +680,5 @@
     <string name="no_appropriate_file_manager_message">Installer en filbehandler først, eller skru av «%s» i nedlastingsinnstillingene.</string>
     <string name="no_appropriate_file_manager_message_android_10">Installer en filbehandler som støtter lagringstilgangsrammeverk først.</string>
     <string name="leak_canary_not_available">LeakCanary er ikke tilgjengelig</string>
-    <string name="progressive_load_interval_default">ExoPlayer-forvalg</string>
-    <string name="adjust_by_semitones_checkbox">Juster toneart etter musikalske halvtoner</string>
-    <string name="playback_tempo_step">Tempo-steg</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer-forvalg</string>
 </resources>
\ 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 @@
     <string name="error_report_notification_title">NewPipe meldt fout, tik voor bericht</string>
     <string name="error_report_notification_toast">Foutmelding</string>
     <string name="create_error_notification">Maak een foutmelding</string>
-    <string name="background_player_already_playing_toast">Speelt al op de achtergrond</string>
     <string name="show_error_snackbar">Korte foutmelding weergeven</string>
     <string name="no_appropriate_file_manager_message">Er is geen geschikte bestandsbeheerder gevonden voor deze actie.
 \nInstalleer een bestandsbeheerder of probeer \'%s\' uit te schakelen in de download instellingen.</string>
@@ -686,7 +685,5 @@
     <string name="detail_pinned_comment_view_description">Vastgemaakt commentaar</string>
     <string name="leak_canary_not_available">LeakCanary is niet beschikbaar</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="adjust_by_semitones_checkbox">Pas de toonhoogte aan met muzikale halve tonen</string>
-    <string name="playback_tempo_step">Tempo stap</string>
-    <string name="progressive_load_interval_default">ExoPlayer standaard</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer standaard</string>
 </resources>
\ 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 @@
     <string name="download_path_audio_dialog_title">Wybierz folder zapisywania plików audio</string>
     <string name="default_resolution_title">Domyślna rozdzielczość</string>
     <string name="play_with_kodi_title">Odtwórz w Kodi</string>
-    <string name="kore_not_found">Zainstalować brakującą aplikację Kore\?</string>
+    <string name="kore_not_found">Czy zainstalować brakującą aplikację Kore\?</string>
     <string name="show_play_with_kodi_title">Pokazuj opcję „Odtwórz z Kodi”</string>
     <string name="show_play_with_kodi_summary">Wyświetlaj opcję odtwarzania wideo przez centrum multimedialne Kodi</string>
     <string name="play_audio">Dźwięk</string>
@@ -406,7 +406,7 @@
     <string name="settings_category_clear_data_title">Wyczyść dane</string>
     <string name="watch_history_states_deleted">Usunięto pozycje odtwarzania</string>
     <string name="missing_file">Plik usunięty albo przeniesiony</string>
-    <string name="overwrite_unrelated_warning">Plik z tą nazwą już istnieje</string>
+    <string name="overwrite_unrelated_warning">Plik o tej nazwie już istnieje</string>
     <string name="overwrite_failed">Nie udało się nadpisać pliku</string>
     <string name="download_already_pending">Plik o tej samej nazwie oczekuje na pobranie</string>
     <string name="error_postprocessing_stopped">NewPipe został zamknięty podczas pracy nad plikiem</string>
@@ -539,7 +539,7 @@
     <string name="remove_watched_popup_yes_and_partially_watched_videos">Tak, i częściowo obejrzane wideo</string>
     <string name="remove_watched_popup_warning">Wideo, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte.
 \nCzy na pewno\? Tego nie da się cofnąć!</string>
-    <string name="remove_watched_popup_title">Usunąć obejrzane wideo\?</string>
+    <string name="remove_watched_popup_title">Czy usunąć obejrzane wideo\?</string>
     <string name="remove_watched">Usuń obejrzane</string>
     <string name="show_original_time_ago_summary">Oryginalne teksty z usług będą widoczne w strumieniowanych pozycjach</string>
     <string name="show_original_time_ago_title">Pokazuj oryginalny czas na pozycjach</string>
@@ -701,12 +701,33 @@
 \nZainstaluj menedżer plików lub spróbuj wyłączyć „%s” w ustawieniach pobierania.</string>
     <string name="no_appropriate_file_manager_message_android_10">Nie znaleziono odpowiedniego menedżera plików dla tej akcji.
 \nZainstaluj menedżer plików zgodny z Storage Access Framework.</string>
-    <string name="background_player_already_playing_toast">Już jest odtwarzane w tle</string>
     <string name="detail_pinned_comment_view_description">Przypięty komentarz</string>
     <string name="leak_canary_not_available">LeakCanary jest niedostępne</string>
     <string name="progressive_load_interval_title">Rozmiar interwału ładowania odtwarzania</string>
     <string name="progressive_load_interval_summary">Zmień rozmiar interwału ładowania (aktualnie %s). Niższa wartość może przyspieszyć początkowe ładowanie wideo. Zmiany wymagają ponownego uruchomienia odtwarzacza</string>
-    <string name="progressive_load_interval_default">domyślny ExoPlayera</string>
-    <string name="adjust_by_semitones_checkbox">Dostosuj wysokość półtonami</string>
-    <string name="playback_tempo_step">Krok tempa</string>
+    <string name="progressive_load_interval_exoplayer_default">domyślny ExoPlayera</string>
+    <string name="settings_category_player_notification_title">Powiadomienie odtwarzacza</string>
+    <string name="settings_category_player_notification_summary">Skonfiguruj powiadomienie aktualnie odtwarzanego strumienia</string>
+    <string name="check_new_streams">Uruchom sprawdzenie nowych strumieni</string>
+    <string name="any_network">Dowolna sieć</string>
+    <string name="you_successfully_subscribed">Subskrybujesz teraz ten kanał</string>
+    <string name="notifications">Powiadomienia</string>
+    <string name="streams_notification_channel_name">Nowe strumienie</string>
+    <string name="streams_notification_channel_description">Powiadomienia o nowych strumieniach dla subskrypcji</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s nowy strumień</item>
+        <item quantity="few">%s nowe strumienie</item>
+        <item quantity="many">%s nowych strumieni</item>
+        <item quantity="other">%s nowych strumieni</item>
+    </plurals>
+    <string name="loading_stream_details">Ładowanie szczegółów strumienia…</string>
+    <string name="enable_streams_notifications_title">Powiadomienia o nowych strumieniach</string>
+    <string name="enable_streams_notifications_summary">Powiadamiaj o nowych strumieniach z subskrypcji</string>
+    <string name="streams_notifications_interval_title">Częstotliwość sprawdzania</string>
+    <string name="streams_notifications_network_title">Wymagane połączenie sieciowe</string>
+    <string name="delete_downloaded_files_confirm">Czy usunąć wszystkie pobrane pliki z dysku\?</string>
+    <string name="notifications_disabled">Powiadomienia są wyłączone</string>
+    <string name="get_notified">Otrzymuj powiadomienia</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Przełącz wszystkie</string>
 </resources>
\ 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 @@
     <string name="show_error_snackbar">Mostrar um snackbar de erro</string>
     <string name="no_appropriate_file_manager_message">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.</string>
-    <string name="background_player_already_playing_toast">Já está tocando em segundo plano</string>
     <string name="detail_pinned_comment_view_description">Comentário fixado</string>
     <string name="leak_canary_not_available">O LeakCanary não está disponível</string>
-    <string name="playback_tempo_step">Passo do tempo</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="adjust_by_semitones_checkbox">Ajustar o tom por semitons musicais</string>
-    <string name="progressive_load_interval_default">ExoPlayer padrão</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer padrão</string>
+    <string name="settings_category_player_notification_title">Notificação do reprodutor</string>
+    <string name="settings_category_player_notification_summary">Configurar a notificação do fluxo da reprodução atual</string>
+    <string name="notifications">Notificações</string>
+    <string name="streams_notification_channel_name">Novos streams</string>
+    <string name="streams_notification_channel_description">Notificações sobre novas transmissões para inscrições</string>
+    <string name="enable_streams_notifications_title">Notificações de novas transmissões</string>
+    <string name="enable_streams_notifications_summary">Notificar sobre novas transmissões de inscrições</string>
+    <string name="streams_notifications_interval_title">Frequência de verificação</string>
+    <string name="any_network">Nenhuma rede</string>
+    <string name="delete_downloaded_files_confirm">Excluir todos os arquivos baixados do disco\?</string>
+    <string name="you_successfully_subscribed">Agora você se inscreveu neste canal</string>
+    <string name="toggle_all">Alternar tudo</string>
+    <string name="enumeration_comma">,</string>
+    <string name="loading_stream_details">Carregando detalhes da transmissão…</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s nova transmissão</item>
+        <item quantity="other">%s novas transmissões</item>
+    </plurals>
+    <string name="check_new_streams">Executar verificação de novas transmissões</string>
+    <string name="streams_notifications_network_title">Conexão de rede necessária</string>
+    <string name="notifications_disabled">As notificações estão desativadas</string>
+    <string name="get_notified">Seja notificado</string>
 </resources>
\ 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 @@
     <string name="no_appropriate_file_manager_message_android_10">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.</string>
     <string name="detail_pinned_comment_view_description">Comentário fixado</string>
-    <string name="background_player_already_playing_toast">Já está a reproduzir em segundo plano</string>
     <string name="leak_canary_not_available">LeakCanary não está disponível</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="adjust_by_semitones_checkbox">Ajustar o tom por semitons musicais</string>
-    <string name="playback_tempo_step">Passo do tempo</string>
-    <string name="progressive_load_interval_default">Predefinido do ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Predefinido do ExoPlayer</string>
+    <string name="notifications">Notificações</string>
+    <string name="loading_stream_details">A carregar detalhes do fluxo…</string>
+    <string name="check_new_streams">Verificar se há novos fluxos</string>
+    <string name="enable_streams_notifications_title">Notificações sobre novos fluxos</string>
+    <string name="streams_notifications_interval_title">Frequência da verificação</string>
+    <string name="delete_downloaded_files_confirm">Apagar todos os ficheiros descarregados do disco\?</string>
+    <string name="notifications_disabled">Notificações são desativadas</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s fluxo novo</item>
+        <item quantity="other">%s fluxos novos</item>
+    </plurals>
+    <string name="enable_streams_notifications_summary">Notificar sobre novos fluxos de assinaturas</string>
+    <string name="streams_notifications_network_title">Conexão de rede necessária</string>
+    <string name="any_network">Qualquer rede</string>
+    <string name="toggle_all">Alternar tudo</string>
+    <string name="streams_notification_channel_description">Notificações sobre novos fluxos para assinaturas</string>
+    <string name="settings_category_player_notification_title">Notificação do reprodutor</string>
+    <string name="settings_category_player_notification_summary">Configurar a notificação da reprodução do fluxo atual</string>
+    <string name="get_notified">Seja notificado</string>
+    <string name="you_successfully_subscribed">Agora assinou este canal</string>
+    <string name="enumeration_comma">,</string>
+    <string name="streams_notification_channel_name">Novos fluxos</string>
 </resources>
\ 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 @@
     <string name="unsupported_url_dialog_message">URL não reconhecido. Abrir com outra aplicação\?</string>
     <string name="auto_queue_toggle">Enfileiramento automático</string>
     <string name="notification_action_shuffle">Embaralhar</string>
-    <string name="settings_category_notification_title">Notificação</string>
     <string name="wifi_only">Apenas em Wi-Fi</string>
     <string name="notification_action_nothing">Nada</string>
     <string name="clear_queue_confirmation_summary">Mudar de um reprodutor para outro pode substituir a sua fila</string>
@@ -683,11 +682,30 @@
 \nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar.</string>
     <string name="no_appropriate_file_manager_message_android_10">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.</string>
-    <string name="background_player_already_playing_toast">Já está a reproduzir em segundo plano</string>
     <string name="detail_pinned_comment_view_description">Comentário fixado</string>
     <string name="leak_canary_not_available">LeakCanary não está disponível</string>
-    <string name="adjust_by_semitones_checkbox">Ajustar o tom por semitons musicais</string>
-    <string name="progressive_load_interval_default">Predefinido do ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Predefinido do ExoPlayer</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="playback_tempo_step">Passo do tempo</string>
+    <string name="settings_category_player_notification_title">Notificação do reprodutor</string>
+    <string name="settings_category_player_notification_summary">Configurar a notificação da reprodução do fluxo atual</string>
+    <string name="notifications">Notificações</string>
+    <string name="loading_stream_details">A carregar detalhes do fluxo…</string>
+    <string name="check_new_streams">Verificar se há novos fluxos</string>
+    <string name="enable_streams_notifications_title">Notificações sobre novos fluxos</string>
+    <string name="enable_streams_notifications_summary">Notificar sobre novos fluxos de assinaturas</string>
+    <string name="streams_notifications_interval_title">Frequência da verificação</string>
+    <string name="streams_notifications_network_title">Conexão de rede necessária</string>
+    <string name="any_network">Qualquer rede</string>
+    <string name="you_successfully_subscribed">Agora assinou este canal</string>
+    <string name="toggle_all">Alternar tudo</string>
+    <string name="delete_downloaded_files_confirm">Apagar todos os ficheiros descarregados do disco\?</string>
+    <string name="streams_notification_channel_name">Novos fluxos</string>
+    <string name="streams_notification_channel_description">Notificações sobre novos fluxos para assinaturas</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s fluxo novo</item>
+        <item quantity="other">%s fluxos novos</item>
+    </plurals>
+    <string name="get_notified">Seja notificado</string>
+    <string name="notifications_disabled">Notificações são desativadas</string>
+    <string name="enumeration_comma">,</string>
 </resources>
\ 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 @@
     <string name="processing_may_take_a_moment">Procesarea.. Poate dura un moment</string>
     <string name="manual_update_title">Verifică dacă există actualizări</string>
     <string name="manual_update_description">Verifică manual dacă există versiuni noi</string>
-    <string name="background_player_already_playing_toast">Se redă deja pe fundal</string>
     <string name="detail_pinned_comment_view_description">Comentariu lipit</string>
     <string name="error_report_channel_name">Notificare cu raport de eroare</string>
     <string name="show_crash_the_player_summary">Afișează opțiunea de a întrerupe atunci când utilizați playerul</string>
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 @@
     <string name="manual_update_title">Проверить обновления</string>
     <string name="checking_updates_toast">Проверка обновлений…</string>
     <string name="feed_new_items">Новое на канале</string>
-    <string name="report_player_errors_title">Отчёт об ошибках плеера</string>
-    <string name="report_player_errors_summary">Подробные отчёты об ошибках плеера вместо коротких всплывающих сообщений (полезно при диагностике проблем)</string>
     <string name="notifications">Уведомления</string>
     <string name="streams_notification_channel_name">Новые видео</string>
     <string name="streams_notification_channel_description">Уведомления о новых видео в подписках</string>
@@ -718,11 +716,13 @@
 \nПожалуйста, установите файловый менеджер, или попробуйте отключить \'%s\' в настройках загрузок.</string>
     <string name="no_appropriate_file_manager_message_android_10">Для этого действия не найдено подходящего файлового менеджера.
 \nПожалуйста, установите файловый менеджер, совместимый со Storage Access Framework (SAF).</string>
-    <string name="background_player_already_playing_toast">Уже проигрывается в фоне</string>
     <string name="detail_pinned_comment_view_description">Закреплённый комментарий</string>
     <string name="leak_canary_not_available">LeakCanary недоступна</string>
-    <string name="adjust_by_semitones_checkbox">Регулировка высоты тона по музыкальным полутонам</string>
-    <string name="playback_tempo_step">Шаг темпа</string>
-    <string name="progressive_load_interval_default">Стандартное значение ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Стандартное значение ExoPlayer</string>
     <string name="progressive_load_interval_summary">Изменить размер интервала загрузки (сейчас %s). Меньшее значение может ускорить начальную загрузку видео. Изменение значения потребует перезапуска плеера.</string>
+    <string name="loading_stream_details">Загрузка деталей трансляции…</string>
+    <string name="check_new_streams">Проверить на наличие новых трансляций</string>
+    <string name="delete_downloaded_files_confirm">Удалить все загруженные файлы\?</string>
+    <string name="settings_category_player_notification_title">Уведомления плеера</string>
+    <string name="enumeration_comma">,</string>
 </resources>
\ 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\".</string>
     <string name="crash_the_player">Faghe serrare su riproduidore</string>
     <string name="detail_pinned_comment_view_description">Cummentu apicadu</string>
-    <string name="background_player_already_playing_toast">Giai in riprodutzione in s\'isfundu</string>
     <string name="leak_canary_not_available">LeakCanary no est a disponimentu</string>
-    <string name="adjust_by_semitones_checkbox">Règula s\'intonatzione in base a sos semitonos musicales</string>
-    <string name="playback_tempo_step">Passu de su ritmu</string>
-    <string name="progressive_load_interval_default">Valore ExoPlayer predefinidu</string>
+    <string name="progressive_load_interval_exoplayer_default">Valore ExoPlayer predefinidu</string>
     <string name="progressive_load_interval_summary">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.</string>
+    <string name="settings_category_player_notification_summary">Cunfigura sa notìfica de su flussu in cursu de riprodutzione</string>
+    <string name="streams_notification_channel_description">Notìficas de flussos noos dae sas iscritziones</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s flussu nou</item>
+        <item quantity="other">%s flussos noos</item>
+    </plurals>
+    <string name="loading_stream_details">Carrighende sos detàllios de su flussu…</string>
+    <string name="check_new_streams">Avia una verìfica pro flussos noos</string>
+    <string name="enable_streams_notifications_title">Notìficas pro sos flussos noos</string>
+    <string name="enable_streams_notifications_summary">Notìfica de flussos noos dae sas iscritziones</string>
+    <string name="streams_notifications_interval_title">Frecuèntzia de controllu</string>
+    <string name="streams_notifications_network_title">Connessione de retze rechesta</string>
+    <string name="any_network">Cale si siat retze</string>
+    <string name="notifications_disabled">Sas notìficas sunt disabilitadas</string>
+    <string name="get_notified">Retzi notìficas</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Ativa/disativa totu</string>
+    <string name="you_successfully_subscribed">Como ses iscritu a custu canale</string>
+    <string name="settings_category_player_notification_title">Notìfica de su riproduidore</string>
+    <string name="notifications">Notìficas</string>
+    <string name="streams_notification_channel_name">Flussos noos</string>
+    <string name="delete_downloaded_files_confirm">Iscantzellare totu sos archìvios iscarrigados dae su discu\?</string>
 </resources>
\ 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 @@
     <string name="downloads_storage_ask_summary_no_saf_notice">Pri každom sťahovaní sa zobrazí výzva kam uložiť súbor</string>
     <string name="no_dir_yet">Nie je nastavený adresár na sťahovanie, nastavte ho teraz</string>
     <string name="mark_as_watched">Označiť ako videné</string>
-    <string name="loading_channel_details">Načítavanie podrobností o kanáli…</string>
-    <string name="error_show_channel_details">Chyba pri zobrazení podrobností kanála</string>
     <string name="off">Vypnuté</string>
     <string name="on">Zapnuté</string>
     <string name="tablet_mode_title">Režim tabletu</string>
@@ -698,8 +696,16 @@
     <string name="show_crash_the_player_summary">Zobrazí možnosť zlyhania pri používaní prehrávača</string>
     <string name="show_error_snackbar">Zobraziť krátke oznámenie chyby</string>
     <string name="create_error_notification">Oznámte chybu</string>
-    <string name="adjust_by_semitones_checkbox">Upraviť výšku poltónov</string>
-    <string name="playback_tempo_step">Krok tempa</string>
-    <string name="progressive_load_interval_default">ExoPlayer preddefinovaný</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer preddefinovaný</string>
     <string name="progressive_load_interval_summary">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.</string>
+    <string name="notifications">Upozornenia</string>
+    <string name="streams_notifications_interval_title">Frekvencia kontroly</string>
+    <string name="delete_downloaded_files_confirm">Vymazať všetky stiahnuté súbory z disku\?</string>
+    <string name="notifications_disabled">Upozornenia sú vypnuté</string>
+    <string name="settings_category_player_notification_title">Upozornenie z prehrávača</string>
+    <string name="settings_category_player_notification_summary">Nastavte notifikáciu aktuálneho prehrávania</string>
+    <string name="streams_notifications_network_title">Je vyžadované pripojenie na internet</string>
+    <string name="you_successfully_subscribed">Začali ste odoberať tento kanál</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Zapnúť všetko</string>
 </resources>
\ 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 @@
     <string name="select_a_channel">Välj en kanal</string>
     <string name="no_channel_subscribed_yet">Inga kanal prenumerationer ännu</string>
     <string name="select_a_kiosk">Välj en kiosk</string>
-    <string name="trending">Trend</string>
+    <string name="trending">Trendigt</string>
     <string name="top_50">Topp 50</string>
     <string name="new_and_hot">Nytt och populärt</string>
     <string name="play_queue_remove">Ta bort</string>
@@ -243,7 +243,7 @@
     <string name="rename">Byt namn</string>
     <string name="one_item_deleted">1 objekt borttaget.</string>
     <string name="toast_no_player">Ingen app installerad för att spela upp filen</string>
-    <string name="privacy_policy_title">NewPipes Sekretesspolicy</string>
+    <string name="privacy_policy_title">NewPipes sekretesspolicy</string>
     <string name="privacy_policy_encouragement">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.</string>
     <string name="read_privacy_policy">Läs sekretesspolicy</string>
@@ -258,7 +258,7 @@
     <string name="import_settings">Vill du också importera inställningar?</string>
     <string name="drawer_open">Öppna navigationspanelen</string>
     <string name="drawer_close">Stäng navigationspanelen</string>
-    <string name="preferred_open_action_settings_title">Föredragen \'öppna\' åtgärd</string>
+    <string name="preferred_open_action_settings_title">Föredragen \"öppna\" åtgärd</string>
     <string name="preferred_open_action_settings_summary">Standardåtgärden när du öppnar innehåll — %s</string>
     <string name="video_player">Videospelare</string>
     <string name="background_player">Bakgrundsspelare</string>
@@ -524,7 +524,7 @@
     <string name="channel_created_by">Skapad av %s</string>
     <string name="no_playlist_bookmarked_yet">Ingen spellista har bokmärkts än</string>
     <string name="feed_group_show_only_ungrouped_subscriptions">Visa endast prenumerationer som inte grupperats</string>
-    <string name="notification_scale_to_square_image_title">Skala tumnagel till 1:1-förhållande</string>
+    <string name="notification_scale_to_square_image_title">Skala miniatyrbild till 1: 1 bildförhållande</string>
     <string name="wifi_only">Endast över Wi-Fi</string>
     <string name="notification_scale_to_square_image_summary">Skala videominiatyrbilden som visas i aviseringen från 16:9- till 1:1-förhållande (kan orsaka bildförvrängning)</string>
     <string name="autoplay_summary">Starta uppspelning automatiskt — %s</string>
@@ -637,7 +637,7 @@
     <string name="mark_as_watched">Markera som sedd</string>
     <string name="metadata_privacy_unlisted">Ej listad</string>
     <string name="featured">Aktuellt</string>
-    <string name="night_theme_title">Nattema</string>
+    <string name="night_theme_title">Natt-tema</string>
     <string name="hash_channel_description">Aviseringar för videohashningsframsteg</string>
     <string name="metadata_thumbnail_url">Miniatyrbild-webbadress</string>
     <string name="disable_media_tunneling_summary">Inaktivera medietunnel om du upplever en svart skärm eller stamning vid videouppspelning</string>
@@ -682,11 +682,30 @@
 \nInstallera en filhanterare eller testa att inaktivera \'%s\' i nedladdningsinställningarna.</string>
     <string name="no_appropriate_file_manager_message_android_10">Ingen lämplig filhanterare hittades för denna åtgärd.
 \nInstallera en filhanterare som är kompatibel med Storage Access Framework.</string>
-    <string name="background_player_already_playing_toast">Spelas redan i bakgrunden</string>
     <string name="detail_pinned_comment_view_description">Fäst kommentar</string>
     <string name="leak_canary_not_available">LeakCanary är inte tillgänglig</string>
-    <string name="adjust_by_semitones_checkbox">Justera tonhöjden med musikaliska halvtoner</string>
-    <string name="progressive_load_interval_default">ExoPlayer standard</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer standard</string>
     <string name="progressive_load_interval_summary">Ä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.</string>
-    <string name="playback_tempo_step">Temposteg</string>
+    <string name="streams_notifications_interval_title">Validera frekvens</string>
+    <string name="streams_notifications_network_title">Kräver nätverksanslutning</string>
+    <string name="any_network">Alla nätverk</string>
+    <string name="delete_downloaded_files_confirm">Radera alla nedladdade filer från disken\?</string>
+    <string name="notifications_disabled">Notifikationer är avstängda</string>
+    <string name="get_notified">Bli medelad</string>
+    <string name="you_successfully_subscribed">Du har nu prenumenerat till denna kanalen</string>
+    <string name="streams_notification_channel_description">Notifikationer om nya strömmar för prenumenanter</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s Ny ström</item>
+        <item quantity="other">%s Nya strömmar</item>
+    </plurals>
+    <string name="settings_category_player_notification_summary">Konfigurera meddelande om aktuell ström som spelas upp</string>
+    <string name="check_new_streams">Kör leta efter nya strömmar</string>
+    <string name="enable_streams_notifications_summary">Medela om nya strömmar från prenumenanter</string>
+    <string name="notifications">Notifikationer</string>
+    <string name="streams_notification_channel_name">Nya strömmar</string>
+    <string name="loading_stream_details">Laddar strömdetaljer…</string>
+    <string name="enable_streams_notifications_title">Nya strömmnings notifikationer</string>
+    <string name="enumeration_comma">,</string>
+    <string name="settings_category_player_notification_title">Spelaravisering</string>
+    <string name="toggle_all">Växla alla</string>
 </resources>
\ 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 @@
     <string name="resume_on_audio_focus_gain_title">இயக்குதலைத் மறுதொடர்</string>
     <string name="short_billion">நி</string>
     <string name="peertube_instance_add_exists">நிகழ்வு ஏற்கனவே உள்ளது</string>
-    <string name="settings_category_notification_title">அறிவிப்பு</string>
     <string name="youtube_restricted_mode_enabled_title">யூடியூபின் \"கட்டுப்பாடு பயன்முறை\"ஐ இயக்கு</string>
     <string name="songs">பாடல்கள்</string>
     <string name="error_report_channel_description">பிழைகளைப் புகாரளிக்க அறிவிப்புகள்</string>
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 @@
     <string name="title_activity_recaptcha">reCAPTCHA సవాలు</string>
     <string name="recaptcha_request_toast">reCAPTCHA సవాలు అభ్యర్థించబడింది</string>
     <string name="select_a_playlist">ప్లేజాబితాను ఎంచుకోండి</string>
-    <string name="background_player_already_playing_toast">ఇప్పటికే వెనుకగా ప్లే అవుతోంది</string>
     <string name="export_data_title">డాటాబేసుని ఎగుమతిచేయుము</string>
     <string name="localization_changes_requires_app_restart">యాప్ పునఃప్రారంభించబడిన తర్వాత భాష మారుతుంది</string>
     <string name="show_channel_details">ఛానెల్ వివరాలను చూపు</string>
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.</string>
     <string name="artists">Mga Artista</string>
+    <string name="controls_popup_title">Nakalutang</string>
 </resources>
\ 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 @@
     <string name="error_report_open_github_notice">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.</string>
     <string name="no_playlist_bookmarked_yet">Henüz oynatma listesi yer imleri yok</string>
     <string name="never">Asla</string>
-    <string name="wifi_only">Yalnızca Wi-Fi\'de</string>
+    <string name="wifi_only">Yalnızca Wi-Fi</string>
     <string name="autoplay_summary">Oynatmayı kendiliğinden başlat — %s</string>
     <string name="title_activity_play_queue">Oynatma kuyruğu</string>
     <string name="unsupported_url_dialog_message">URL tanınamadı. Başka bir uygulamayla açılsın mı\?</string>
@@ -682,11 +682,30 @@
     <string name="error_report_channel_description">Hata raporları için bildirimler</string>
     <string name="show_crash_the_player_summary">Oynatıcı kullanırken çöktürme seçeneği gösterir</string>
     <string name="crash_the_player">Oynatıcıyı çöktür</string>
-    <string name="background_player_already_playing_toast">Zaten arka planda oynuyor</string>
     <string name="detail_pinned_comment_view_description">Sabitlenmiş yorum</string>
     <string name="leak_canary_not_available">LeakCanary yok</string>
     <string name="progressive_load_interval_summary">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.</string>
-    <string name="progressive_load_interval_default">ExoPlayer öntanımlısı</string>
-    <string name="playback_tempo_step">Tempo adımı</string>
-    <string name="adjust_by_semitones_checkbox">Perdeyi müzikal yarım tonlarla uyarla</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer öntanımlısı</string>
+    <string name="enable_streams_notifications_title">Yeni akış bildirimleri</string>
+    <string name="notifications">Bildirimler</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s yeni akış</item>
+        <item quantity="other">%s yeni akış</item>
+    </plurals>
+    <string name="check_new_streams">Yeni akışları denetlemeyi çalıştır</string>
+    <string name="settings_category_player_notification_title">Oynatıcı bildirimi</string>
+    <string name="settings_category_player_notification_summary">Oynatılan akış bildirimini yapılandırın</string>
+    <string name="streams_notification_channel_name">Yeni akışlar</string>
+    <string name="loading_stream_details">Akış ayrıntıları yükleniyor…</string>
+    <string name="streams_notification_channel_description">Abonelikler için yeni akışlarla ilgili bildirimler</string>
+    <string name="streams_notifications_network_title">Gerekli ağ bağlantısı</string>
+    <string name="notifications_disabled">Bildirimler devre dışı</string>
+    <string name="get_notified">Bildirim alın</string>
+    <string name="you_successfully_subscribed">Artık bu kanala abone oldunuz</string>
+    <string name="enable_streams_notifications_summary">Aboneliklerden yeni akışlar hakkında bildirim gönder</string>
+    <string name="streams_notifications_interval_title">Denetleme sıklığı</string>
+    <string name="any_network">Herhangi bir ağ</string>
+    <string name="delete_downloaded_files_confirm">İndirilen tüm dosyalar diskten silinsin mi\?</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">Tümünü değiştir</string>
 </resources>
\ 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 @@
     <string name="downloads_title">Завантаження</string>
     <string name="error_report_title">Звіт про помилку</string>
     <string name="all">Усе</string>
-    <string name="yes">Так</string>
     <string name="disabled">Вимкнено</string>
     <string name="app_ui_crash">Збій застосунку/інтерфейсу</string>
     <string name="your_comment">Ваш коментар (англійською):</string>
@@ -699,11 +698,31 @@
 \nУстановіть файловий менеджер, сумісний зі Storage Access Framework.</string>
     <string name="show_error_snackbar">Показати панель помилок</string>
     <string name="create_error_notification">Створити сповіщення про помилку</string>
-    <string name="background_player_already_playing_toast">Уже відтворюється у фоновому режимі</string>
     <string name="detail_pinned_comment_view_description">Закріплений коментар</string>
     <string name="leak_canary_not_available">LeakCanary недоступний</string>
-    <string name="playback_tempo_step">Крок темпу</string>
-    <string name="adjust_by_semitones_checkbox">Регулювання висоти звуку за музичними півтонами</string>
-    <string name="progressive_load_interval_default">Типовий ExoPlayer</string>
+    <string name="progressive_load_interval_exoplayer_default">Типовий ExoPlayer</string>
     <string name="progressive_load_interval_summary">Змінити розмір інтервалу завантаження (наразі %s). Менше значення може прискорити початкове завантаження відео. Зміни вимагають перезапуску програвача.</string>
+    <string name="you_successfully_subscribed">Ви підписалися на цей канал</string>
+    <string name="enumeration_comma">,</string>
+    <string name="streams_notification_channel_description">Сповіщення про нові трансляції для підписок</string>
+    <plurals name="new_streams">
+        <item quantity="one">%s нова трансляція</item>
+        <item quantity="few">%s нові трансляції</item>
+        <item quantity="many">%s нових трансляцій</item>
+        <item quantity="other">%s нових трансляцій</item>
+    </plurals>
+    <string name="loading_stream_details">Завантаження відомостей про трансляцію…</string>
+    <string name="check_new_streams">Запустити виявлення нових трансляцій</string>
+    <string name="enable_streams_notifications_summary">Сповіщати про нові трансляції з підписок</string>
+    <string name="notifications_disabled">Сповіщення вимкнено</string>
+    <string name="any_network">Будь-яка мережа</string>
+    <string name="delete_downloaded_files_confirm">Видалити всі завантажені файли з диска\?</string>
+    <string name="toggle_all">Перемкнути всі</string>
+    <string name="get_notified">Сповіщати</string>
+    <string name="settings_category_player_notification_title">Сповіщення програвача</string>
+    <string name="notifications">Сповіщення</string>
+    <string name="streams_notification_channel_name">Нові трансляції</string>
+    <string name="enable_streams_notifications_title">Сповіщення про нові трансляції</string>
+    <string name="streams_notifications_interval_title">Частота перевірки</string>
+    <string name="streams_notifications_network_title">Необхідний тип з\'єднання</string>
 </resources>
\ 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.</string>
     <string name="progressive_load_interval_summary">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.</string>
     <string name="leak_canary_not_available">LeakCanary không khả dụng</string>
-    <string name="adjust_by_semitones_checkbox">Điều chỉnh cao độ theo nhạc nền âm nhạc</string>
-    <string name="playback_tempo_step">Nhịp độ tiếp theo</string>
-    <string name="progressive_load_interval_default">ExoPlayer mặc định</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer mặc định</string>
     <string name="detail_pinned_comment_view_description">Bình luận được ghim</string>
 </resources>
\ 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 @@
     <string name="enable_watch_history_title">睇過嘅紀錄</string>
     <string name="enable_playback_resume_title">恢復播放</string>
     <string name="enable_playback_resume_summary">返返最後播放到去嗰個位</string>
-    <string name="enable_playback_state_lists_title">播放清單有排位</string>
+    <string name="enable_playback_state_lists_title">清單度睇到播到去邊</string>
     <string name="notification_scale_to_square_image_title">縮圖放到去 1:1 長寬比</string>
     <string name="notification_scale_to_square_image_summary">顯示喺通知嘅影片縮圖由 16:9 放到去 1:1 長寬比 (話唔定會鬆郁矇)</string>
     <string name="notification_colorize_title">通知色彩化</string>
@@ -164,7 +164,7 @@
     <string name="show_comments_title">顯示留言</string>
     <string name="show_comments_summary">關閉去隱藏留言</string>
     <string name="enable_search_history_title">搜尋紀錄</string>
-    <string name="enable_playback_state_lists_summary">喺播放清單顯示位置編號</string>
+    <string name="enable_playback_state_lists_summary">喺清單入面顯示最後播放到去邊個位</string>
     <string name="settings_category_clear_data_title">抹除資料</string>
     <string name="show_description_title">顯示描述</string>
     <string name="thumbnail_cache_wipe_complete_notice">抹除咗影像快取</string>
@@ -526,7 +526,7 @@
     <string name="open_website_license">開啟網站</string>
     <string name="off">關</string>
     <string name="metadata_host">主機</string>
-    <string name="show_hold_to_append_summary">喺影片「詳情:」度撳一下「幕後播」或者「浮面播」個掣嘅時候顯示提示</string>
+    <string name="show_hold_to_append_summary">喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示</string>
     <string name="title_activity_history">紀錄</string>
     <string name="action_history">紀錄</string>
     <string name="enqueue_next_stream">攝下個等陣播</string>
@@ -577,7 +577,7 @@
 \n您肯定?剷走咗冇得掹個囉喎!</string>
     <string name="downloads_storage_use_saf_summary">「儲存空間存取框架」呢壇嘢,俾您下載落外置 SD 卡嗰度</string>
     <string name="downloads_storage_use_saf_summary_api_29">Android 10 打上局住要用「儲存空間存取框架」</string>
-    <string name="progressive_load_interval_default">ExoPlayer 預設值</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer 預設值</string>
     <string name="download_to_sdcard_error_title">外置儲存空間用唔到</string>
     <string name="enqueue_stream">排隊尾輪候播</string>
     <string name="search_history_deleted">刪除咗搜尋紀錄</string>
@@ -586,4 +586,25 @@
     <string name="bookmark_playlist">收起播放清單</string>
     <string name="unbookmark_playlist">唔再收起</string>
     <string name="delete_playlist_prompt">係咪要刪除呢個播放清單?</string>
+    <string name="settings_category_player_notification_title">播放器通知</string>
+    <string name="settings_category_player_notification_summary">調整目前播放緊嘅串流嘅通知</string>
+    <string name="streams_notification_channel_description">訂閱有新加串流嘅通知</string>
+    <string name="loading_stream_details">載入緊串流詳細資料…</string>
+    <string name="enable_streams_notifications_summary">通知訂閱有新加串流</string>
+    <string name="streams_notifications_interval_title">檢查頻率</string>
+    <string name="streams_notifications_network_title">須要網絡連線</string>
+    <string name="any_network">不拘任何網絡</string>
+    <string name="get_notified">收取通知</string>
+    <string name="you_successfully_subscribed">您現已訂閱呢個頻道</string>
+    <string name="toggle_all">全部切換</string>
+    <string name="check_new_streams">執行檢查有冇新加串流</string>
+    <string name="notifications">通知</string>
+    <string name="streams_notification_channel_name">新加串流</string>
+    <plurals name="new_streams">
+        <item quantity="other">%s 個新加串流</item>
+    </plurals>
+    <string name="enable_streams_notifications_title">新加串流通知</string>
+    <string name="delete_downloaded_files_confirm">係咪要喺磁碟機上面消除晒全部下載咗嘅檔案?</string>
+    <string name="notifications_disabled">通知已停用</string>
+    <string name="tracks">單曲</string>
 </resources>
\ 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 @@
     <string name="clear_queue_confirmation_description">作用中播放器的佇列可能會被取代</string>
     <string name="clear_queue_confirmation_summary">從一個播放器切換到另一個可能會取代您的佇列</string>
     <string name="clear_queue_confirmation_title">清除佇列前要求確認</string>
-    <string name="settings_category_notification_title">通知</string>
     <string name="notification_action_nothing">無</string>
     <string name="notification_action_buffering">正在緩衝</string>
     <string name="notification_action_shuffle">隨機播放</string>
@@ -638,8 +637,6 @@
     <string name="seekbar_preview_thumbnail_title">拖動列縮圖預覽</string>
     <string name="detail_heart_img_view_description">被創作者加心號</string>
     <string name="mark_as_watched">標記為已看過</string>
-    <string name="loading_channel_details">正在載入頻道詳細資訊……</string>
-    <string name="error_show_channel_details">顯示頻道詳細資訊時發生錯誤</string>
     <string name="show_image_indicators_summary">在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體</string>
     <string name="show_image_indicators_title">顯示圖片指示器</string>
     <string name="remote_search_suggestions">遠端搜尋建議</string>
@@ -674,10 +671,28 @@
     <string name="error_report_notification_title">NewPipe 遇到錯誤,點擊以回報</string>
     <string name="error_report_notification_toast">發生錯誤,請檢視通知</string>
     <string name="detail_pinned_comment_view_description">釘選的留言</string>
-    <string name="background_player_already_playing_toast">已經在背景播放</string>
     <string name="leak_canary_not_available">LeakCanary 無法使用</string>
-    <string name="playback_tempo_step">步進時間</string>
-    <string name="progressive_load_interval_default">ExoPlayer 預設值</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer 預設值</string>
     <string name="progressive_load_interval_summary">變更載入間隔大小(目前為 %s)。較低的值可能會提昇初始影片載入速度。變更需要重新啟動播放器。</string>
-    <string name="adjust_by_semitones_checkbox">按音樂半音調整音高</string>
+    <string name="settings_category_player_notification_title">播放器通知</string>
+    <string name="notifications">通知</string>
+    <string name="loading_stream_details">正在載入串流詳細資訊……</string>
+    <string name="you_successfully_subscribed">您已訂閱此頻道</string>
+    <string name="enumeration_comma">,</string>
+    <string name="toggle_all">切換全部</string>
+    <string name="enable_streams_notifications_title">新串流通知</string>
+    <string name="settings_category_player_notification_summary">設定目前播放串流通知</string>
+    <string name="streams_notifications_network_title">需要網路連線</string>
+    <string name="delete_downloaded_files_confirm">從磁碟抹除所有已下載的檔案?</string>
+    <string name="get_notified">取得通知</string>
+    <string name="streams_notification_channel_name">新串流</string>
+    <string name="streams_notification_channel_description">關於訂閱的新串流通知</string>
+    <string name="check_new_streams">執行新串流檢查</string>
+    <string name="enable_streams_notifications_summary">通知來自訂閱的新串流</string>
+    <string name="streams_notifications_interval_title">檢查頻率</string>
+    <string name="notifications_disabled">通知已停用</string>
+    <plurals name="new_streams">
+        <item quantity="other">%s 個新串流</item>
+    </plurals>
+    <string name="any_network">任意網路</string>
 </resources>
\ 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 @@
     </string-array>
 
     <string name="progressive_load_interval_key">progressive_load_interval</string>
-    <string name="progressive_load_interval_default_value">default</string>
+    <string name="progressive_load_interval_default_value">64</string>
+    <string name="progressive_load_interval_exoplayer_default_value">exoplayer_default</string>
     <string-array name="progressive_load_interval_descriptions">
         <item>1 KiB</item>
         <item>16 KiB</item>
         <item>64 KiB</item>
         <item>256 KiB</item>
-        <item>@string/progressive_load_interval_default</item>
+        <item>@string/progressive_load_interval_exoplayer_default</item>
     </string-array>
     <string-array name="progressive_load_interval_values">
         <item>1</item>
         <item>16</item>
-        <item>64</item>
+        <item>@string/progressive_load_interval_default_value</item>
         <item>256</item>
-        <item>default</item>
+        <item>@string/progressive_load_interval_exoplayer_default_value</item>
     </string-array>
 
     <string name="minimize_on_exit_key">minimize_on_exit_key</string>
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 @@
     <string name="playback_pitch">Pitch</string>
     <string name="unhook_checkbox">Unhook (may cause distortion)</string>
     <string name="skip_silence_checkbox">Fast-forward during silence</string>
-    <string name="adjust_by_semitones_checkbox">Adjust pitch by musical semitones</string>
     <string name="playback_step">Step</string>
-    <string name="playback_tempo_step">Tempo step</string>
     <string name="playback_reset">Reset</string>
+    <string name="percent">Percent</string>
+    <string name="semitone">Semitone</string>
     <!-- GDPR dialog -->
     <string name="start_accept_privacy_policy">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.</string>
@@ -733,7 +733,7 @@
     <string name="on">On</string>
     <string name="off">Off</string>
     <!-- Progressive Load Interval -->
-    <string name="progressive_load_interval_default">ExoPlayer default</string>
+    <string name="progressive_load_interval_exoplayer_default">ExoPlayer default</string>
     <!-- New streams notifications -->
     <string name="notifications_disabled">Notifications are disabled</string>
     <string name="get_notified">Get notified</string>
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 前端。