mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-11-04 09:13:00 +00:00 
			
		
		
		
	Merge branch 'master' into dev
This commit is contained in:
		@@ -11,6 +11,14 @@
 | 
			
		||||
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 | 
			
		||||
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
 | 
			
		||||
 | 
			
		||||
    <!-- We need to be able to open links in the browser on API 30+ -->
 | 
			
		||||
    <queries>
 | 
			
		||||
        <intent>
 | 
			
		||||
            <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
            <data android:scheme="http|https|market" />
 | 
			
		||||
        </intent>
 | 
			
		||||
    </queries>
 | 
			
		||||
 | 
			
		||||
    <uses-feature
 | 
			
		||||
        android:name="android.hardware.touchscreen"
 | 
			
		||||
        android:required="false" />
 | 
			
		||||
@@ -165,6 +173,7 @@
 | 
			
		||||
                <data android:pathPrefix="/watch" />
 | 
			
		||||
                <data android:pathPrefix="/attribution_link" />
 | 
			
		||||
                <data android:pathPrefix="/shorts/" />
 | 
			
		||||
                <data android:pathPrefix="/live/" />
 | 
			
		||||
                <!-- channel prefix -->
 | 
			
		||||
                <data android:pathPrefix="/channel/" />
 | 
			
		||||
                <data android:pathPrefix="/user/" />
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import static android.text.TextUtils.isEmpty;
 | 
			
		||||
import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;
 | 
			
		||||
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
 | 
			
		||||
import static org.schabi.newpipe.util.Localization.getAppLocale;
 | 
			
		||||
import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD;
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
@@ -112,7 +113,10 @@ public class DescriptionFragment extends BaseFragment {
 | 
			
		||||
 | 
			
		||||
    private void disableDescriptionSelection() {
 | 
			
		||||
        // show description content again, otherwise some links are not clickable
 | 
			
		||||
        loadDescriptionContent();
 | 
			
		||||
        TextLinkifier.fromDescription(binding.detailDescriptionView,
 | 
			
		||||
                streamInfo.getDescription(), HtmlCompat.FROM_HTML_MODE_LEGACY,
 | 
			
		||||
                streamInfo.getService(), streamInfo.getUrl(),
 | 
			
		||||
                descriptionDisposables, SET_LINK_MOVEMENT_METHOD);
 | 
			
		||||
 | 
			
		||||
        binding.detailDescriptionNoteView.setVisibility(View.GONE);
 | 
			
		||||
        binding.detailDescriptionView.setTextIsSelectable(false);
 | 
			
		||||
@@ -123,27 +127,6 @@ public class DescriptionFragment extends BaseFragment {
 | 
			
		||||
        binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_select_all);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadDescriptionContent() {
 | 
			
		||||
        final Description description = streamInfo.getDescription();
 | 
			
		||||
        switch (description.getType()) {
 | 
			
		||||
            case Description.HTML:
 | 
			
		||||
                TextLinkifier.createLinksFromHtmlBlock(binding.detailDescriptionView,
 | 
			
		||||
                        description.getContent(), HtmlCompat.FROM_HTML_MODE_LEGACY, streamInfo,
 | 
			
		||||
                        descriptionDisposables);
 | 
			
		||||
                break;
 | 
			
		||||
            case Description.MARKDOWN:
 | 
			
		||||
                TextLinkifier.createLinksFromMarkdownText(binding.detailDescriptionView,
 | 
			
		||||
                        description.getContent(), streamInfo, descriptionDisposables);
 | 
			
		||||
                break;
 | 
			
		||||
            case Description.PLAIN_TEXT:
 | 
			
		||||
            default:
 | 
			
		||||
                TextLinkifier.createLinksFromPlainText(binding.detailDescriptionView,
 | 
			
		||||
                        description.getContent(), streamInfo, descriptionDisposables);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private void setupMetadata(final LayoutInflater inflater,
 | 
			
		||||
                               final LinearLayout layout) {
 | 
			
		||||
        addMetadataItem(inflater, layout, false, R.string.metadata_category,
 | 
			
		||||
@@ -193,8 +176,8 @@ public class DescriptionFragment extends BaseFragment {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (linkifyContent) {
 | 
			
		||||
            TextLinkifier.createLinksFromPlainText(itemBinding.metadataContentView, content,
 | 
			
		||||
                    null, descriptionDisposables);
 | 
			
		||||
            TextLinkifier.fromPlainText(itemBinding.metadataContentView, content, null, null,
 | 
			
		||||
                    descriptionDisposables, SET_LINK_MOVEMENT_METHOD);
 | 
			
		||||
        } else {
 | 
			
		||||
            itemBinding.metadataContentView.setText(content);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -865,7 +865,8 @@ public final class VideoDetailFragment
 | 
			
		||||
                            if (playQueue == null) {
 | 
			
		||||
                                playQueue = new SinglePlayQueue(result);
 | 
			
		||||
                            }
 | 
			
		||||
                            if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(playQueue)) {
 | 
			
		||||
                            if (stack.isEmpty() || !stack.peek().getPlayQueue()
 | 
			
		||||
                                    .equalStreams(playQueue)) {
 | 
			
		||||
                                stack.push(new StackItem(serviceId, url, title, playQueue));
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
@@ -1779,7 +1780,7 @@ public final class VideoDetailFragment
 | 
			
		||||
        // deleted/added items inside Channel/Playlist queue and makes possible to have
 | 
			
		||||
        // a history of played items
 | 
			
		||||
        @Nullable final StackItem stackPeek = stack.peek();
 | 
			
		||||
        if (stackPeek != null && !stackPeek.getPlayQueue().equals(queue)) {
 | 
			
		||||
        if (stackPeek != null && !stackPeek.getPlayQueue().equalStreams(queue)) {
 | 
			
		||||
            @Nullable final PlayQueueItem playQueueItem = queue.getItem();
 | 
			
		||||
            if (playQueueItem != null) {
 | 
			
		||||
                stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(),
 | 
			
		||||
@@ -1845,7 +1846,7 @@ public final class VideoDetailFragment
 | 
			
		||||
        // They are not equal when user watches something in popup while browsing in fragment and
 | 
			
		||||
        // then changes screen orientation. In that case the fragment will set itself as
 | 
			
		||||
        // a service listener and will receive initial call to onMetadataUpdate()
 | 
			
		||||
        if (!queue.equals(playQueue)) {
 | 
			
		||||
        if (!queue.equalStreams(playQueue)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -2102,7 +2103,7 @@ public final class VideoDetailFragment
 | 
			
		||||
        final Iterator<StackItem> iterator = stack.descendingIterator();
 | 
			
		||||
        while (iterator.hasNext()) {
 | 
			
		||||
            final StackItem next = iterator.next();
 | 
			
		||||
            if (next.getPlayQueue().equals(queue)) {
 | 
			
		||||
            if (next.getPlayQueue().equalStreams(queue)) {
 | 
			
		||||
                item = next;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
@@ -2117,7 +2118,7 @@ public final class VideoDetailFragment
 | 
			
		||||
        if (isClearingQueueConfirmationRequired(activity)
 | 
			
		||||
                && playerIsNotStopped()
 | 
			
		||||
                && activeQueue != null
 | 
			
		||||
                && !activeQueue.equals(playQueue)) {
 | 
			
		||||
                && !activeQueue.equalStreams(playQueue)) {
 | 
			
		||||
            showClearingQueueConfirmation(onAllow);
 | 
			
		||||
        } else {
 | 
			
		||||
            onAllow.run();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,10 @@
 | 
			
		||||
package org.schabi.newpipe.info_list.holder;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Paint;
 | 
			
		||||
import android.text.Layout;
 | 
			
		||||
import android.text.TextUtils;
 | 
			
		||||
import android.text.method.LinkMovementMethod;
 | 
			
		||||
import android.text.style.URLSpan;
 | 
			
		||||
import android.text.util.Linkify;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
@@ -11,27 +12,36 @@ import android.widget.ImageView;
 | 
			
		||||
import android.widget.RelativeLayout;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import androidx.core.text.util.LinkifyCompat;
 | 
			
		||||
import androidx.core.text.HtmlCompat;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.error.ErrorUtil;
 | 
			
		||||
import org.schabi.newpipe.extractor.InfoItem;
 | 
			
		||||
import org.schabi.newpipe.extractor.NewPipe;
 | 
			
		||||
import org.schabi.newpipe.extractor.ServiceList;
 | 
			
		||||
import org.schabi.newpipe.extractor.StreamingService;
 | 
			
		||||
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
 | 
			
		||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.Description;
 | 
			
		||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
 | 
			
		||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
 | 
			
		||||
import org.schabi.newpipe.util.text.CommentTextOnTouchListener;
 | 
			
		||||
import org.schabi.newpipe.util.DeviceUtils;
 | 
			
		||||
import org.schabi.newpipe.util.Localization;
 | 
			
		||||
import org.schabi.newpipe.util.NavigationHelper;
 | 
			
		||||
import org.schabi.newpipe.util.PicassoHelper;
 | 
			
		||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
 | 
			
		||||
import org.schabi.newpipe.util.text.TimestampExtractor;
 | 
			
		||||
import org.schabi.newpipe.util.text.CommentTextOnTouchListener;
 | 
			
		||||
import org.schabi.newpipe.util.text.TextLinkifier;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
 | 
			
		||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
 | 
			
		||||
 | 
			
		||||
public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
    private static final String TAG = "CommentsMiniIIHolder";
 | 
			
		||||
    private static final String ELLIPSIS = "…";
 | 
			
		||||
 | 
			
		||||
    private static final int COMMENT_DEFAULT_LINES = 2;
 | 
			
		||||
    private static final int COMMENT_EXPANDED_LINES = 1000;
 | 
			
		||||
@@ -39,13 +49,18 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
    private final int commentHorizontalPadding;
 | 
			
		||||
    private final int commentVerticalPadding;
 | 
			
		||||
 | 
			
		||||
    private final Paint paintAtContentSize;
 | 
			
		||||
    private final float ellipsisWidthPx;
 | 
			
		||||
 | 
			
		||||
    private final RelativeLayout itemRoot;
 | 
			
		||||
    private final ImageView itemThumbnailView;
 | 
			
		||||
    private final TextView itemContentView;
 | 
			
		||||
    private final TextView itemLikesCountView;
 | 
			
		||||
    private final TextView itemPublishedTime;
 | 
			
		||||
 | 
			
		||||
    private String commentText;
 | 
			
		||||
    private final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    private Description commentText;
 | 
			
		||||
    private StreamingService streamService;
 | 
			
		||||
    private String streamUrl;
 | 
			
		||||
 | 
			
		||||
    CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,
 | 
			
		||||
@@ -62,6 +77,10 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
                .getResources().getDimension(R.dimen.comments_horizontal_padding);
 | 
			
		||||
        commentVerticalPadding = (int) infoItemBuilder.getContext()
 | 
			
		||||
                .getResources().getDimension(R.dimen.comments_vertical_padding);
 | 
			
		||||
 | 
			
		||||
        paintAtContentSize = new Paint();
 | 
			
		||||
        paintAtContentSize.setTextSize(itemContentView.getTextSize());
 | 
			
		||||
        ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,
 | 
			
		||||
@@ -91,18 +110,20 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
 | 
			
		||||
        itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item));
 | 
			
		||||
 | 
			
		||||
        streamUrl = item.getUrl();
 | 
			
		||||
 | 
			
		||||
        itemContentView.setLines(COMMENT_DEFAULT_LINES);
 | 
			
		||||
        commentText = item.getCommentText();
 | 
			
		||||
        itemContentView.setText(commentText, TextView.BufferType.SPANNABLE);
 | 
			
		||||
        itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
 | 
			
		||||
 | 
			
		||||
        if (itemContentView.getLineCount() == 0) {
 | 
			
		||||
            itemContentView.post(this::ellipsize);
 | 
			
		||||
        } else {
 | 
			
		||||
            ellipsize();
 | 
			
		||||
        try {
 | 
			
		||||
            streamService = NewPipe.getService(item.getServiceId());
 | 
			
		||||
        } catch (final ExtractionException e) {
 | 
			
		||||
            // should never happen
 | 
			
		||||
            ErrorUtil.showUiErrorSnackbar(itemBuilder.getContext(), "Getting StreamingService", e);
 | 
			
		||||
            Log.w(TAG, "Cannot obtain service from comment service id, defaulting to YouTube", e);
 | 
			
		||||
            streamService = ServiceList.YouTube;
 | 
			
		||||
        }
 | 
			
		||||
        streamUrl = item.getUrl();
 | 
			
		||||
        commentText = item.getCommentText();
 | 
			
		||||
        ellipsize();
 | 
			
		||||
 | 
			
		||||
        //noinspection ClickableViewAccessibility
 | 
			
		||||
        itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
 | 
			
		||||
 | 
			
		||||
        if (item.getLikeCount() >= 0) {
 | 
			
		||||
            itemLikesCountView.setText(
 | 
			
		||||
@@ -132,7 +153,8 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
            if (DeviceUtils.isTv(itemBuilder.getContext())) {
 | 
			
		||||
                openCommentAuthor(item);
 | 
			
		||||
            } else {
 | 
			
		||||
                ShareUtils.copyToClipboard(itemBuilder.getContext(), commentText);
 | 
			
		||||
                ShareUtils.copyToClipboard(itemBuilder.getContext(),
 | 
			
		||||
                        itemContentView.getText().toString());
 | 
			
		||||
            }
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
@@ -172,7 +194,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
        return urls != null && urls.length != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void determineLinkFocus() {
 | 
			
		||||
    private void determineMovementMethod() {
 | 
			
		||||
        if (shouldFocusLinks()) {
 | 
			
		||||
            allowLinkFocus();
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -181,63 +203,73 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void ellipsize() {
 | 
			
		||||
        boolean hasEllipsis = false;
 | 
			
		||||
        itemContentView.setMaxLines(COMMENT_EXPANDED_LINES);
 | 
			
		||||
        linkifyCommentContentView(v -> {
 | 
			
		||||
            boolean hasEllipsis = false;
 | 
			
		||||
 | 
			
		||||
        if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
 | 
			
		||||
            final int endOfLastLine = itemContentView
 | 
			
		||||
                    .getLayout()
 | 
			
		||||
                    .getLineEnd(COMMENT_DEFAULT_LINES - 1);
 | 
			
		||||
            int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine - 2);
 | 
			
		||||
            if (end == -1) {
 | 
			
		||||
                end = Math.max(endOfLastLine - 2, 0);
 | 
			
		||||
            if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
 | 
			
		||||
                // Note that converting to String removes spans (i.e. links), but that's something
 | 
			
		||||
                // we actually want since when the text is ellipsized we want all clicks on the
 | 
			
		||||
                // comment to expand the comment, not to open links.
 | 
			
		||||
                final String text = itemContentView.getText().toString();
 | 
			
		||||
 | 
			
		||||
                final Layout layout = itemContentView.getLayout();
 | 
			
		||||
                final float lineWidth = layout.getLineWidth(COMMENT_DEFAULT_LINES - 1);
 | 
			
		||||
                final float layoutWidth = layout.getWidth();
 | 
			
		||||
                final int lineStart = layout.getLineStart(COMMENT_DEFAULT_LINES - 1);
 | 
			
		||||
                final int lineEnd = layout.getLineEnd(COMMENT_DEFAULT_LINES - 1);
 | 
			
		||||
 | 
			
		||||
                // remove characters up until there is enough space for the ellipsis
 | 
			
		||||
                // (also summing 2 more pixels, just to be sure to avoid float rounding errors)
 | 
			
		||||
                int end = lineEnd;
 | 
			
		||||
                float removedCharactersWidth = 0.0f;
 | 
			
		||||
                while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth
 | 
			
		||||
                        && end >= lineStart) {
 | 
			
		||||
                    end -= 1;
 | 
			
		||||
                    // recalculate each time to account for ligatures or other similar things
 | 
			
		||||
                    removedCharactersWidth = paintAtContentSize.measureText(
 | 
			
		||||
                            text.substring(end, lineEnd));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // remove trailing spaces and newlines
 | 
			
		||||
                while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) {
 | 
			
		||||
                    end -= 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                final String newVal = text.substring(0, end) + ELLIPSIS;
 | 
			
		||||
                itemContentView.setText(newVal);
 | 
			
		||||
                hasEllipsis = true;
 | 
			
		||||
            }
 | 
			
		||||
            final String newVal = itemContentView.getText().subSequence(0, end) + " …";
 | 
			
		||||
            itemContentView.setText(newVal);
 | 
			
		||||
            hasEllipsis = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        linkify();
 | 
			
		||||
 | 
			
		||||
        if (hasEllipsis) {
 | 
			
		||||
            denyLinkFocus();
 | 
			
		||||
        } else {
 | 
			
		||||
            determineLinkFocus();
 | 
			
		||||
        }
 | 
			
		||||
            itemContentView.setMaxLines(COMMENT_DEFAULT_LINES);
 | 
			
		||||
            if (hasEllipsis) {
 | 
			
		||||
                denyLinkFocus();
 | 
			
		||||
            } else {
 | 
			
		||||
                determineMovementMethod();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void toggleEllipsize() {
 | 
			
		||||
        if (itemContentView.getText().toString().equals(commentText)) {
 | 
			
		||||
            if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
 | 
			
		||||
                ellipsize();
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
        final CharSequence text = itemContentView.getText();
 | 
			
		||||
        if (text.charAt(text.length() - 1) == ELLIPSIS.charAt(0)) {
 | 
			
		||||
            expand();
 | 
			
		||||
        } else if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) {
 | 
			
		||||
            ellipsize();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void expand() {
 | 
			
		||||
        itemContentView.setMaxLines(COMMENT_EXPANDED_LINES);
 | 
			
		||||
        itemContentView.setText(commentText);
 | 
			
		||||
        linkify();
 | 
			
		||||
        determineLinkFocus();
 | 
			
		||||
        linkifyCommentContentView(v -> determineMovementMethod());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void linkify() {
 | 
			
		||||
        LinkifyCompat.addLinks(itemContentView, Linkify.WEB_URLS);
 | 
			
		||||
        LinkifyCompat.addLinks(itemContentView, TimestampExtractor.TIMESTAMPS_PATTERN, null, null,
 | 
			
		||||
                (match, url) -> {
 | 
			
		||||
                    try {
 | 
			
		||||
                        final var timestampMatch = TimestampExtractor
 | 
			
		||||
                                .getTimestampFromMatcher(match, commentText);
 | 
			
		||||
                        if (timestampMatch == null) {
 | 
			
		||||
                            return url;
 | 
			
		||||
                        }
 | 
			
		||||
                        return streamUrl + url.replace(Objects.requireNonNull(match.group(0)),
 | 
			
		||||
                                "#timestamp=" + timestampMatch.seconds());
 | 
			
		||||
                    } catch (final Exception ex) {
 | 
			
		||||
                        Log.e(TAG, "Unable to process url='" + url + "' as timestampLink", ex);
 | 
			
		||||
                        return url;
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
    private void linkifyCommentContentView(@Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        disposables.clear();
 | 
			
		||||
        if (commentText != null) {
 | 
			
		||||
            TextLinkifier.fromDescription(itemContentView, commentText,
 | 
			
		||||
                    HtmlCompat.FROM_HTML_MODE_LEGACY, streamService, streamUrl, disposables,
 | 
			
		||||
                    onCompletion);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -348,7 +348,7 @@ public final class Player implements PlaybackListener, Listener {
 | 
			
		||||
        final boolean playbackSkipSilence = getPrefs().getBoolean(getContext().getString(
 | 
			
		||||
                R.string.playback_skip_silence_key), getPlaybackSkipSilence());
 | 
			
		||||
 | 
			
		||||
        final boolean samePlayQueue = playQueue != null && playQueue.equals(newQueue);
 | 
			
		||||
        final boolean samePlayQueue = playQueue != null && playQueue.equalStreamsAndIndex(newQueue);
 | 
			
		||||
        final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode());
 | 
			
		||||
        final boolean playWhenReady = intent.getBooleanExtra(PLAY_WHEN_READY, true);
 | 
			
		||||
        final boolean isMuted = intent.getBooleanExtra(IS_MUTED, isMuted());
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,27 @@
 | 
			
		||||
package org.schabi.newpipe.player.mediasource;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import com.google.android.exoplayer2.MediaItem;
 | 
			
		||||
import com.google.android.exoplayer2.Timeline;
 | 
			
		||||
import com.google.android.exoplayer2.source.CompositeMediaSource;
 | 
			
		||||
import com.google.android.exoplayer2.source.MediaPeriod;
 | 
			
		||||
import com.google.android.exoplayer2.source.MediaSource;
 | 
			
		||||
import com.google.android.exoplayer2.source.WrappingMediaSource;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.Allocator;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.TransferListener;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
 | 
			
		||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
 | 
			
		||||
 | 
			
		||||
public class LoadedMediaSource extends WrappingMediaSource implements ManagedMediaSource {
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
public class LoadedMediaSource extends CompositeMediaSource<Integer> implements ManagedMediaSource {
 | 
			
		||||
    private final MediaSource source;
 | 
			
		||||
    private final PlayQueueItem stream;
 | 
			
		||||
    private final MediaItem mediaItem;
 | 
			
		||||
    private final long expireTimestamp;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource}
 | 
			
		||||
     * Uses a {@link CompositeMediaSource} to wrap one or more child {@link MediaSource}s
 | 
			
		||||
     * containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration
 | 
			
		||||
     * timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under
 | 
			
		||||
     * {@link ManagedMediaSourcePlaylist}.
 | 
			
		||||
@@ -30,7 +36,7 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed
 | 
			
		||||
                             @NonNull final MediaItemTag tag,
 | 
			
		||||
                             @NonNull final PlayQueueItem stream,
 | 
			
		||||
                             final long expireTimestamp) {
 | 
			
		||||
        super(source);
 | 
			
		||||
        this.source = source;
 | 
			
		||||
        this.stream = stream;
 | 
			
		||||
        this.expireTimestamp = expireTimestamp;
 | 
			
		||||
 | 
			
		||||
@@ -45,6 +51,51 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed
 | 
			
		||||
        return System.currentTimeMillis() >= expireTimestamp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Delegates the preparation of child {@link MediaSource}s to the
 | 
			
		||||
     * {@link CompositeMediaSource} wrapper. Since all {@link LoadedMediaSource}s use only
 | 
			
		||||
     * a single child media, the child id of 0 is always used (sonar doesn't like null as id here).
 | 
			
		||||
     *
 | 
			
		||||
     * @param mediaTransferListener A data transfer listener that will be registered by the
 | 
			
		||||
     *                              {@link CompositeMediaSource} for child source preparation.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void prepareSourceInternal(@Nullable final TransferListener mediaTransferListener) {
 | 
			
		||||
        super.prepareSourceInternal(mediaTransferListener);
 | 
			
		||||
        prepareChildSource(0, source);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * When any child {@link MediaSource} is prepared, the refreshed {@link Timeline} can
 | 
			
		||||
     * be listened to here. But since {@link LoadedMediaSource} has only a single child source,
 | 
			
		||||
     * this method is called only once until {@link #releaseSourceInternal()} is called.
 | 
			
		||||
     * <br><br>
 | 
			
		||||
     * On refresh, the {@link CompositeMediaSource} delegate will be notified with the
 | 
			
		||||
     * new {@link Timeline}, otherwise {@link #createPeriod(MediaPeriodId, Allocator, long)}
 | 
			
		||||
     * will not be called and playback may be stalled.
 | 
			
		||||
     *
 | 
			
		||||
     * @param id            The unique id used to prepare the child source.
 | 
			
		||||
     * @param mediaSource   The child source whose source info has been refreshed.
 | 
			
		||||
     * @param timeline      The new timeline of the child source.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onChildSourceInfoRefreshed(final Integer id,
 | 
			
		||||
                                              final MediaSource mediaSource,
 | 
			
		||||
                                              final Timeline timeline) {
 | 
			
		||||
        refreshSourceInfo(timeline);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public MediaPeriod createPeriod(final MediaPeriodId id, final Allocator allocator,
 | 
			
		||||
                                    final long startPositionUs) {
 | 
			
		||||
        return source.createPeriod(id, allocator, startPositionUs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void releasePeriod(final MediaPeriod mediaPeriod) {
 | 
			
		||||
        source.releasePeriod(mediaPeriod);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public MediaItem getMediaItem() {
 | 
			
		||||
 
 | 
			
		||||
@@ -518,12 +518,10 @@ public abstract class PlayQueue implements Serializable {
 | 
			
		||||
     * This method also gives a chance to track history of items in a queue in
 | 
			
		||||
     * VideoDetailFragment without duplicating items from two identical queues
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(@Nullable final Object obj) {
 | 
			
		||||
        if (!(obj instanceof PlayQueue)) {
 | 
			
		||||
    public boolean equalStreams(@Nullable final PlayQueue other) {
 | 
			
		||||
        if (other == null) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        final PlayQueue other = (PlayQueue) obj;
 | 
			
		||||
        if (size() != other.size()) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
@@ -539,9 +537,11 @@ public abstract class PlayQueue implements Serializable {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        return streams.hashCode();
 | 
			
		||||
    public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) {
 | 
			
		||||
        if (equalStreams(other)) {
 | 
			
		||||
            return other.getIndex() == getIndex();
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isDisposed() {
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
package org.schabi.newpipe.util;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
 | 
			
		||||
import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
@@ -319,8 +320,9 @@ public final class ExtractorHelper {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            metaInfoSeparator.setVisibility(View.VISIBLE);
 | 
			
		||||
            TextLinkifier.createLinksFromHtmlBlock(metaInfoTextView, stringBuilder.toString(),
 | 
			
		||||
                    HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, disposables);
 | 
			
		||||
            TextLinkifier.fromHtml(metaInfoTextView, stringBuilder.toString(),
 | 
			
		||||
                    HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, null, disposables,
 | 
			
		||||
                    SET_LINK_MOVEMENT_METHOD);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -90,19 +90,16 @@ public final class ShareUtils {
 | 
			
		||||
            // No browser set as default (doesn't work on some devices)
 | 
			
		||||
            openAppChooser(context, intent, true);
 | 
			
		||||
        } else {
 | 
			
		||||
            if (defaultPackageName.isEmpty()) {
 | 
			
		||||
                // No app installed to open a web url
 | 
			
		||||
                Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show();
 | 
			
		||||
                return false;
 | 
			
		||||
            } else {
 | 
			
		||||
                try {
 | 
			
		||||
            try {
 | 
			
		||||
                // will be empty on Android 12+
 | 
			
		||||
                if (!defaultPackageName.isEmpty()) {
 | 
			
		||||
                    intent.setPackage(defaultPackageName);
 | 
			
		||||
                    context.startActivity(intent);
 | 
			
		||||
                } catch (final ActivityNotFoundException e) {
 | 
			
		||||
                    // Not a browser but an app chooser because of OEMs changes
 | 
			
		||||
                    intent.setPackage(null);
 | 
			
		||||
                    openAppChooser(context, intent, true);
 | 
			
		||||
                }
 | 
			
		||||
                context.startActivity(intent);
 | 
			
		||||
            } catch (final ActivityNotFoundException e) {
 | 
			
		||||
                // Not a browser but an app chooser because of OEMs changes
 | 
			
		||||
                intent.setPackage(null);
 | 
			
		||||
                openAppChooser(context, intent, true);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,51 +2,37 @@ package org.schabi.newpipe.util.text;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine;
 | 
			
		||||
 | 
			
		||||
import android.text.Selection;
 | 
			
		||||
import android.text.Spannable;
 | 
			
		||||
import android.annotation.SuppressLint;
 | 
			
		||||
import android.text.Spanned;
 | 
			
		||||
import android.text.style.ClickableSpan;
 | 
			
		||||
import android.text.style.URLSpan;
 | 
			
		||||
import android.view.MotionEvent;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
 | 
			
		||||
 | 
			
		||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
 | 
			
		||||
 | 
			
		||||
public class CommentTextOnTouchListener implements View.OnTouchListener {
 | 
			
		||||
    public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener();
 | 
			
		||||
 | 
			
		||||
    @SuppressLint("ClickableViewAccessibility")
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onTouch(final View v, final MotionEvent event) {
 | 
			
		||||
        if (!(v instanceof TextView)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        final TextView widget = (TextView) v;
 | 
			
		||||
        final Object text = widget.getText();
 | 
			
		||||
        final CharSequence text = widget.getText();
 | 
			
		||||
        if (text instanceof Spanned) {
 | 
			
		||||
            final Spannable buffer = (Spannable) text;
 | 
			
		||||
 | 
			
		||||
            final Spanned buffer = (Spanned) text;
 | 
			
		||||
            final int action = event.getAction();
 | 
			
		||||
 | 
			
		||||
            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
 | 
			
		||||
                final int offset = getOffsetForHorizontalLine(widget, event);
 | 
			
		||||
                final ClickableSpan[] link = buffer.getSpans(offset, offset, ClickableSpan.class);
 | 
			
		||||
                final ClickableSpan[] links = buffer.getSpans(offset, offset, ClickableSpan.class);
 | 
			
		||||
 | 
			
		||||
                if (link.length != 0) {
 | 
			
		||||
                if (links.length != 0) {
 | 
			
		||||
                    if (action == MotionEvent.ACTION_UP) {
 | 
			
		||||
                        if (link[0] instanceof URLSpan) {
 | 
			
		||||
                            final String url = ((URLSpan) link[0]).getURL();
 | 
			
		||||
                            if (!InternalUrlsHandler.handleUrlCommentsTimestamp(
 | 
			
		||||
                                    new CompositeDisposable(), v.getContext(), url)) {
 | 
			
		||||
                                ShareUtils.openUrlInBrowser(v.getContext(), url, false);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else if (action == MotionEvent.ACTION_DOWN) {
 | 
			
		||||
                        Selection.setSelection(buffer, buffer.getSpanStart(link[0]),
 | 
			
		||||
                                buffer.getSpanEnd(link[0]));
 | 
			
		||||
                        links[0].onClick(widget);
 | 
			
		||||
                    }
 | 
			
		||||
                    // we handle events that intersect links, so return true
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import android.view.View;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.extractor.Info;
 | 
			
		||||
import org.schabi.newpipe.util.NavigationHelper;
 | 
			
		||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
 | 
			
		||||
 | 
			
		||||
@@ -15,20 +14,19 @@ final class HashtagLongPressClickableSpan extends LongPressClickableSpan {
 | 
			
		||||
    private final Context context;
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private final String parsedHashtag;
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private final Info relatedInfo;
 | 
			
		||||
    private final int relatedInfoServiceId;
 | 
			
		||||
 | 
			
		||||
    HashtagLongPressClickableSpan(@NonNull final Context context,
 | 
			
		||||
                                  @NonNull final String parsedHashtag,
 | 
			
		||||
                                  @NonNull final Info relatedInfo) {
 | 
			
		||||
                                  final int relatedInfoServiceId) {
 | 
			
		||||
        this.context = context;
 | 
			
		||||
        this.parsedHashtag = parsedHashtag;
 | 
			
		||||
        this.relatedInfo = relatedInfo;
 | 
			
		||||
        this.relatedInfoServiceId = relatedInfoServiceId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onClick(@NonNull final View view) {
 | 
			
		||||
        NavigationHelper.openSearch(context, relatedInfo.getServiceId(), parsedHashtag);
 | 
			
		||||
        NavigationHelper.openSearch(context, relatedInfoServiceId, parsedHashtag);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,12 @@ import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.core.text.HtmlCompat;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.extractor.Info;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
 | 
			
		||||
import org.schabi.newpipe.extractor.StreamingService;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.Description;
 | 
			
		||||
import org.schabi.newpipe.util.NavigationHelper;
 | 
			
		||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
 | 
			
		||||
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
import java.util.regex.Matcher;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
@@ -33,88 +34,155 @@ public final class TextLinkifier {
 | 
			
		||||
    // Looks for hashtags with characters from any language (\p{L}), numbers, or underscores
 | 
			
		||||
    private static final Pattern HASHTAGS_PATTERN = Pattern.compile("(#[\\p{L}0-9_]+)");
 | 
			
		||||
 | 
			
		||||
    public static final Consumer<TextView> SET_LINK_MOVEMENT_METHOD =
 | 
			
		||||
            v -> v.setMovementMethod(LongPressLinkMovementMethod.getInstance());
 | 
			
		||||
 | 
			
		||||
    private TextLinkifier() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create links for contents with an {@link Description} in the various possible formats.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * This will call one of these three functions based on the format: {@link #fromHtml},
 | 
			
		||||
     * {@link #fromMarkdown} or {@link #fromPlainText}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param textView           the TextView to set the htmlBlock linked
 | 
			
		||||
     * @param description        the htmlBlock to be linked
 | 
			
		||||
     * @param htmlCompatFlag     the int flag to be set if {@link HtmlCompat#fromHtml(String, int)}
 | 
			
		||||
     *                           will be called (not used for formats different than HTML)
 | 
			
		||||
     * @param relatedInfoService if given, handle hashtags to search for the term in the correct
 | 
			
		||||
     *                           service
 | 
			
		||||
     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle
 | 
			
		||||
     *                           timestamps to open the stream in the popup player at the specific
 | 
			
		||||
     *                           time
 | 
			
		||||
     * @param disposables        disposables created by the method are added here and their
 | 
			
		||||
     *                           lifecycle should be handled by the calling class
 | 
			
		||||
     * @param onCompletion       will be run when setting text to the textView completes; use {@link
 | 
			
		||||
     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
 | 
			
		||||
     */
 | 
			
		||||
    public static void fromDescription(@NonNull final TextView textView,
 | 
			
		||||
                                       @NonNull final Description description,
 | 
			
		||||
                                       final int htmlCompatFlag,
 | 
			
		||||
                                       @Nullable final StreamingService relatedInfoService,
 | 
			
		||||
                                       @Nullable final String relatedStreamUrl,
 | 
			
		||||
                                       @NonNull final CompositeDisposable disposables,
 | 
			
		||||
                                       @Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        switch (description.getType()) {
 | 
			
		||||
            case Description.HTML:
 | 
			
		||||
                TextLinkifier.fromHtml(textView, description.getContent(), htmlCompatFlag,
 | 
			
		||||
                        relatedInfoService, relatedStreamUrl, disposables, onCompletion);
 | 
			
		||||
                break;
 | 
			
		||||
            case Description.MARKDOWN:
 | 
			
		||||
                TextLinkifier.fromMarkdown(textView, description.getContent(),
 | 
			
		||||
                        relatedInfoService, relatedStreamUrl, disposables, onCompletion);
 | 
			
		||||
                break;
 | 
			
		||||
            case Description.PLAIN_TEXT: default:
 | 
			
		||||
                TextLinkifier.fromPlainText(textView, description.getContent(),
 | 
			
		||||
                        relatedInfoService, relatedStreamUrl, disposables, onCompletion);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create links for contents with an HTML description.
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info,
 | 
			
		||||
     * CompositeDisposable)} after having linked the URLs with
 | 
			
		||||
     * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,
 | 
			
		||||
     * String, CompositeDisposable, Consumer)} after having linked the URLs with
 | 
			
		||||
     * {@link HtmlCompat#fromHtml(String, int)}.
 | 
			
		||||
     * </p>
 | 
			
		||||
     *
 | 
			
		||||
     * @param textView       the {@link TextView} to set the the HTML string block linked
 | 
			
		||||
     * @param htmlBlock      the HTML string block to be linked
 | 
			
		||||
     * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, int)}
 | 
			
		||||
     *                       will be called
 | 
			
		||||
     * @param relatedInfo    if given, handle timestamps to open the stream in the popup player at
 | 
			
		||||
     *                       the specific time, and hashtags to search for the term in the correct
 | 
			
		||||
     *                       service
 | 
			
		||||
     * @param disposables    disposables created by the method are added here and their lifecycle
 | 
			
		||||
     *                       should be handled by the calling class
 | 
			
		||||
     * @param textView           the {@link TextView} to set the the HTML string block linked
 | 
			
		||||
     * @param htmlBlock          the HTML string block to be linked
 | 
			
		||||
     * @param htmlCompatFlag     the int flag to be set when {@link HtmlCompat#fromHtml(String,
 | 
			
		||||
     *                           int)} will be called
 | 
			
		||||
     * @param relatedInfoService if given, handle hashtags to search for the term in the correct
 | 
			
		||||
     *                           service
 | 
			
		||||
     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle
 | 
			
		||||
     *                           timestamps to open the stream in the popup player at the specific
 | 
			
		||||
     *                           time
 | 
			
		||||
     * @param disposables        disposables created by the method are added here and their
 | 
			
		||||
     *                           lifecycle should be handled by the calling class
 | 
			
		||||
     * @param onCompletion       will be run when setting text to the textView completes; use {@link
 | 
			
		||||
     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
 | 
			
		||||
     */
 | 
			
		||||
    public static void createLinksFromHtmlBlock(@NonNull final TextView textView,
 | 
			
		||||
                                                @NonNull final String htmlBlock,
 | 
			
		||||
                                                final int htmlCompatFlag,
 | 
			
		||||
                                                @Nullable final Info relatedInfo,
 | 
			
		||||
                                                @NonNull final CompositeDisposable disposables) {
 | 
			
		||||
        changeIntentsOfDescriptionLinks(textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag),
 | 
			
		||||
                relatedInfo, disposables);
 | 
			
		||||
    public static void fromHtml(@NonNull final TextView textView,
 | 
			
		||||
                                @NonNull final String htmlBlock,
 | 
			
		||||
                                final int htmlCompatFlag,
 | 
			
		||||
                                @Nullable final StreamingService relatedInfoService,
 | 
			
		||||
                                @Nullable final String relatedStreamUrl,
 | 
			
		||||
                                @NonNull final CompositeDisposable disposables,
 | 
			
		||||
                                @Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        changeLinkIntents(
 | 
			
		||||
                textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfoService,
 | 
			
		||||
                relatedStreamUrl, disposables, onCompletion);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create links for contents with a plain text description.
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info,
 | 
			
		||||
     * CompositeDisposable)} after having linked the URLs with {@link TextView#setAutoLinkMask(int)}
 | 
			
		||||
     * and {@link TextView#setText(CharSequence, TextView.BufferType)}.
 | 
			
		||||
     * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,
 | 
			
		||||
     * String, CompositeDisposable, Consumer)} after having linked the URLs with
 | 
			
		||||
     * {@link TextView#setAutoLinkMask(int)} and
 | 
			
		||||
     * {@link TextView#setText(CharSequence, TextView.BufferType)}.
 | 
			
		||||
     * </p>
 | 
			
		||||
     *
 | 
			
		||||
     * @param textView       the {@link TextView} to set the plain text block linked
 | 
			
		||||
     * @param plainTextBlock the block of plain text to be linked
 | 
			
		||||
     * @param relatedInfo    if given, handle timestamps to open the stream in the popup player, at
 | 
			
		||||
     *                       the specified time, and hashtags to search for the term in the correct
 | 
			
		||||
     *                       service
 | 
			
		||||
     * @param disposables    disposables created by the method are added here and their lifecycle
 | 
			
		||||
     *                       should be handled by the calling class
 | 
			
		||||
     * @param textView           the {@link TextView} to set the plain text block linked
 | 
			
		||||
     * @param plainTextBlock     the block of plain text to be linked
 | 
			
		||||
     * @param relatedInfoService if given, handle hashtags to search for the term in the correct
 | 
			
		||||
     *                           service
 | 
			
		||||
     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle
 | 
			
		||||
     *                           timestamps to open the stream in the popup player at the specific
 | 
			
		||||
     *                           time
 | 
			
		||||
     * @param disposables        disposables created by the method are added here and their
 | 
			
		||||
     *                           lifecycle should be handled by the calling class
 | 
			
		||||
     * @param onCompletion       will be run when setting text to the textView completes; use {@link
 | 
			
		||||
     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
 | 
			
		||||
     */
 | 
			
		||||
    public static void createLinksFromPlainText(@NonNull final TextView textView,
 | 
			
		||||
                                                @NonNull final String plainTextBlock,
 | 
			
		||||
                                                @Nullable final Info relatedInfo,
 | 
			
		||||
                                                @NonNull final CompositeDisposable disposables) {
 | 
			
		||||
    public static void fromPlainText(@NonNull final TextView textView,
 | 
			
		||||
                                     @NonNull final String plainTextBlock,
 | 
			
		||||
                                     @Nullable final StreamingService relatedInfoService,
 | 
			
		||||
                                     @Nullable final String relatedStreamUrl,
 | 
			
		||||
                                     @NonNull final CompositeDisposable disposables,
 | 
			
		||||
                                     @Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        textView.setAutoLinkMask(Linkify.WEB_URLS);
 | 
			
		||||
        textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE);
 | 
			
		||||
        changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables);
 | 
			
		||||
        changeLinkIntents(textView, textView.getText(), relatedInfoService,
 | 
			
		||||
                relatedStreamUrl, disposables, onCompletion);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create links for contents with a markdown description.
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
     * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info,
 | 
			
		||||
     * CompositeDisposable)} after creating a {@link Markwon} object and using
 | 
			
		||||
     * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,
 | 
			
		||||
     * String, CompositeDisposable, Consumer)} after creating a {@link Markwon} object and using
 | 
			
		||||
     * {@link Markwon#setMarkdown(TextView, String)}.
 | 
			
		||||
     * </p>
 | 
			
		||||
     *
 | 
			
		||||
     * @param textView      the {@link TextView} to set the plain text block linked
 | 
			
		||||
     * @param markdownBlock the block of markdown text to be linked
 | 
			
		||||
     * @param relatedInfo   if given, handle timestamps to open the stream in the popup player at
 | 
			
		||||
     *                      the specific time, and hashtags to search for the term in the correct
 | 
			
		||||
     *                      service
 | 
			
		||||
     * @param disposables   disposables created by the method are added here and their lifecycle
 | 
			
		||||
     *                      should be handled by the calling class
 | 
			
		||||
     * @param textView           the {@link TextView} to set the plain text block linked
 | 
			
		||||
     * @param markdownBlock      the block of markdown text to be linked
 | 
			
		||||
     * @param relatedInfoService if given, handle hashtags to search for the term in the correct
 | 
			
		||||
     *                           service
 | 
			
		||||
     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle
 | 
			
		||||
     *                           timestamps to open the stream in the popup player at the specific
 | 
			
		||||
     *                           time
 | 
			
		||||
     * @param disposables        disposables created by the method are added here and their
 | 
			
		||||
     *                           lifecycle should be handled by the calling class
 | 
			
		||||
     * @param onCompletion       will be run when setting text to the textView completes; use {@link
 | 
			
		||||
     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
 | 
			
		||||
     */
 | 
			
		||||
    public static void createLinksFromMarkdownText(@NonNull final TextView textView,
 | 
			
		||||
                                                   final String markdownBlock,
 | 
			
		||||
                                                   @Nullable final Info relatedInfo,
 | 
			
		||||
                                                   final CompositeDisposable disposables) {
 | 
			
		||||
    public static void fromMarkdown(@NonNull final TextView textView,
 | 
			
		||||
                                    @NonNull final String markdownBlock,
 | 
			
		||||
                                    @Nullable final StreamingService relatedInfoService,
 | 
			
		||||
                                    @Nullable final String relatedStreamUrl,
 | 
			
		||||
                                    @NonNull final CompositeDisposable disposables,
 | 
			
		||||
                                    @Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        final Markwon markwon = Markwon.builder(textView.getContext())
 | 
			
		||||
                .usePlugin(LinkifyPlugin.create()).build();
 | 
			
		||||
        changeIntentsOfDescriptionLinks(textView, markwon.toMarkdown(markdownBlock), relatedInfo,
 | 
			
		||||
                disposables);
 | 
			
		||||
        changeLinkIntents(textView, markwon.toMarkdown(markdownBlock),
 | 
			
		||||
                relatedInfoService, relatedStreamUrl, disposables, onCompletion);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -131,9 +199,9 @@ public final class TextLinkifier {
 | 
			
		||||
     * This method will also add click listeners on timestamps in this description, which will play
 | 
			
		||||
     * the content in the popup player at the time indicated in the timestamp, by using
 | 
			
		||||
     * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder,
 | 
			
		||||
     * StreamInfo, CompositeDisposable)} method and click listeners on hashtags, by using
 | 
			
		||||
     * {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, Info)})},
 | 
			
		||||
     * which will open a search on the current service with the hashtag.
 | 
			
		||||
     * StreamingService, String, CompositeDisposable)} method and click listeners on hashtags, by
 | 
			
		||||
     * using {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder,
 | 
			
		||||
     * StreamingService)}, which will open a search on the current service with the hashtag.
 | 
			
		||||
     * </p>
 | 
			
		||||
     *
 | 
			
		||||
     * <p>
 | 
			
		||||
@@ -141,20 +209,25 @@ public final class TextLinkifier {
 | 
			
		||||
     * before opening a web link.
 | 
			
		||||
     * </p>
 | 
			
		||||
     *
 | 
			
		||||
     * @param textView    the {@link TextView} in which the converted {@link CharSequence} will be
 | 
			
		||||
     *                    applied
 | 
			
		||||
     * @param chars       the {@link CharSequence} to be parsed
 | 
			
		||||
     * @param relatedInfo if given, handle timestamps to open the stream in the popup player at the
 | 
			
		||||
     *                    specific time, and hashtags to search for the term in the correct service
 | 
			
		||||
     * @param disposables disposables created by the method are added here and their lifecycle
 | 
			
		||||
     *                    should be handled by the calling class
 | 
			
		||||
     * @param textView           the {@link TextView} to which the converted {@link CharSequence}
 | 
			
		||||
     *                           will be applied
 | 
			
		||||
     * @param chars              the {@link CharSequence} to be parsed
 | 
			
		||||
     * @param relatedInfoService if given, handle hashtags to search for the term in the correct
 | 
			
		||||
     *                           service
 | 
			
		||||
     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle
 | 
			
		||||
     *                           timestamps to open the stream in the popup player at the specific
 | 
			
		||||
     *                           time
 | 
			
		||||
     * @param disposables        disposables created by the method are added here and their
 | 
			
		||||
     *                           lifecycle should be handled by the calling class
 | 
			
		||||
     * @param onCompletion       will be run when setting text to the textView completes; use {@link
 | 
			
		||||
     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable
 | 
			
		||||
     */
 | 
			
		||||
    private static void changeIntentsOfDescriptionLinks(
 | 
			
		||||
            @NonNull final TextView textView,
 | 
			
		||||
            @NonNull final CharSequence chars,
 | 
			
		||||
            @Nullable final Info relatedInfo,
 | 
			
		||||
            @NonNull final CompositeDisposable disposables) {
 | 
			
		||||
        textView.setMovementMethod(LongPressLinkMovementMethod.getInstance());
 | 
			
		||||
    private static void changeLinkIntents(@NonNull final TextView textView,
 | 
			
		||||
                                          @NonNull final CharSequence chars,
 | 
			
		||||
                                          @Nullable final StreamingService relatedInfoService,
 | 
			
		||||
                                          @Nullable final String relatedStreamUrl,
 | 
			
		||||
                                          @NonNull final CompositeDisposable disposables,
 | 
			
		||||
                                          @Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        disposables.add(Single.fromCallable(() -> {
 | 
			
		||||
                    final Context context = textView.getContext();
 | 
			
		||||
 | 
			
		||||
@@ -176,26 +249,26 @@ public final class TextLinkifier {
 | 
			
		||||
                        textBlockLinked.removeSpan(span);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (relatedInfo != null) {
 | 
			
		||||
                        // add click actions on plain text timestamps only for description of
 | 
			
		||||
                        // contents, unneeded for meta-info or other TextViews
 | 
			
		||||
                        if (relatedInfo instanceof StreamInfo) {
 | 
			
		||||
                    // add click actions on plain text timestamps only for description of contents,
 | 
			
		||||
                    // unneeded for meta-info or other TextViews
 | 
			
		||||
                    if (relatedInfoService != null) {
 | 
			
		||||
                        if (relatedStreamUrl != null) {
 | 
			
		||||
                            addClickListenersOnTimestamps(context, textBlockLinked,
 | 
			
		||||
                                    (StreamInfo) relatedInfo, disposables);
 | 
			
		||||
                                    relatedInfoService, relatedStreamUrl, disposables);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        addClickListenersOnHashtags(context, textBlockLinked, relatedInfo);
 | 
			
		||||
                        addClickListenersOnHashtags(context, textBlockLinked, relatedInfoService);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return textBlockLinked;
 | 
			
		||||
                }).subscribeOn(Schedulers.computation())
 | 
			
		||||
                .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
                .subscribe(
 | 
			
		||||
                        textBlockLinked -> setTextViewCharSequence(textView, textBlockLinked),
 | 
			
		||||
                        textBlockLinked ->
 | 
			
		||||
                                setTextViewCharSequence(textView, textBlockLinked, onCompletion),
 | 
			
		||||
                        throwable -> {
 | 
			
		||||
                            Log.e(TAG, "Unable to linkify text", throwable);
 | 
			
		||||
                            // this should never happen, but if it does, just fallback to it
 | 
			
		||||
                            setTextViewCharSequence(textView, chars);
 | 
			
		||||
                            setTextViewCharSequence(textView, chars, onCompletion);
 | 
			
		||||
                        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -213,12 +286,12 @@ public final class TextLinkifier {
 | 
			
		||||
     * @param context              the {@link Context} to use
 | 
			
		||||
     * @param spannableDescription the {@link SpannableStringBuilder} with the text of the
 | 
			
		||||
     *                             content description
 | 
			
		||||
     * @param relatedInfo          used to search for the term in the correct service
 | 
			
		||||
     * @param relatedInfoService   used to search for the term in the correct service
 | 
			
		||||
     */
 | 
			
		||||
    private static void addClickListenersOnHashtags(
 | 
			
		||||
            @NonNull final Context context,
 | 
			
		||||
            @NonNull final SpannableStringBuilder spannableDescription,
 | 
			
		||||
            @NonNull final Info relatedInfo) {
 | 
			
		||||
            @NonNull final StreamingService relatedInfoService) {
 | 
			
		||||
        final String descriptionText = spannableDescription.toString();
 | 
			
		||||
        final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText);
 | 
			
		||||
 | 
			
		||||
@@ -231,8 +304,9 @@ public final class TextLinkifier {
 | 
			
		||||
            // of an URL, already parsed before
 | 
			
		||||
            if (spannableDescription.getSpans(hashtagStart, hashtagEnd,
 | 
			
		||||
                    LongPressClickableSpan.class).length == 0) {
 | 
			
		||||
                final int serviceId = relatedInfoService.getServiceId();
 | 
			
		||||
                spannableDescription.setSpan(
 | 
			
		||||
                        new HashtagLongPressClickableSpan(context, parsedHashtag, relatedInfo),
 | 
			
		||||
                        new HashtagLongPressClickableSpan(context, parsedHashtag, serviceId),
 | 
			
		||||
                        hashtagStart, hashtagEnd, 0);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -251,14 +325,16 @@ public final class TextLinkifier {
 | 
			
		||||
     * @param context              the {@link Context} to use
 | 
			
		||||
     * @param spannableDescription the {@link SpannableStringBuilder} with the text of the
 | 
			
		||||
     *                             content description
 | 
			
		||||
     * @param streamInfo           what to open in the popup player when timestamps are clicked
 | 
			
		||||
     * @param relatedInfoService   the service of the {@code relatedStreamUrl}
 | 
			
		||||
     * @param relatedStreamUrl     what to open in the popup player when timestamps are clicked
 | 
			
		||||
     * @param disposables          disposables created by the method are added here and their
 | 
			
		||||
     *                             lifecycle should be handled by the calling class
 | 
			
		||||
     */
 | 
			
		||||
    private static void addClickListenersOnTimestamps(
 | 
			
		||||
            @NonNull final Context context,
 | 
			
		||||
            @NonNull final SpannableStringBuilder spannableDescription,
 | 
			
		||||
            @NonNull final StreamInfo streamInfo,
 | 
			
		||||
            @NonNull final StreamingService relatedInfoService,
 | 
			
		||||
            @NonNull final String relatedStreamUrl,
 | 
			
		||||
            @NonNull final CompositeDisposable disposables) {
 | 
			
		||||
        final String descriptionText = spannableDescription.toString();
 | 
			
		||||
        final Matcher timestampsMatches = TimestampExtractor.TIMESTAMPS_PATTERN.matcher(
 | 
			
		||||
@@ -272,8 +348,9 @@ public final class TextLinkifier {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            spannableDescription.setSpan(new TimestampLongPressClickableSpan(
 | 
			
		||||
                    context, descriptionText, disposables, streamInfo, timestampMatchDTO),
 | 
			
		||||
            spannableDescription.setSpan(
 | 
			
		||||
                    new TimestampLongPressClickableSpan(context, descriptionText, disposables,
 | 
			
		||||
                            relatedInfoService, relatedStreamUrl, timestampMatchDTO),
 | 
			
		||||
                    timestampMatchDTO.timestampStart(),
 | 
			
		||||
                    timestampMatchDTO.timestampEnd(),
 | 
			
		||||
                    0);
 | 
			
		||||
@@ -281,8 +358,12 @@ public final class TextLinkifier {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void setTextViewCharSequence(@NonNull final TextView textView,
 | 
			
		||||
                                                @Nullable final CharSequence charSequence) {
 | 
			
		||||
                                                @Nullable final CharSequence charSequence,
 | 
			
		||||
                                                @Nullable final Consumer<TextView> onCompletion) {
 | 
			
		||||
        textView.setText(charSequence);
 | 
			
		||||
        textView.setVisibility(View.VISIBLE);
 | 
			
		||||
        if (onCompletion != null) {
 | 
			
		||||
            onCompletion.accept(textView);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.extractor.ServiceList;
 | 
			
		||||
import org.schabi.newpipe.extractor.StreamingService;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
 | 
			
		||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
 | 
			
		||||
 | 
			
		||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
 | 
			
		||||
@@ -23,7 +22,9 @@ final class TimestampLongPressClickableSpan extends LongPressClickableSpan {
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private final CompositeDisposable disposables;
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private final StreamInfo streamInfo;
 | 
			
		||||
    private final StreamingService relatedInfoService;
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private final String relatedStreamUrl;
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private final TimestampExtractor.TimestampMatchDTO timestampMatchDTO;
 | 
			
		||||
 | 
			
		||||
@@ -31,41 +32,43 @@ final class TimestampLongPressClickableSpan extends LongPressClickableSpan {
 | 
			
		||||
            @NonNull final Context context,
 | 
			
		||||
            @NonNull final String descriptionText,
 | 
			
		||||
            @NonNull final CompositeDisposable disposables,
 | 
			
		||||
            @NonNull final StreamInfo streamInfo,
 | 
			
		||||
            @NonNull final StreamingService relatedInfoService,
 | 
			
		||||
            @NonNull final String relatedStreamUrl,
 | 
			
		||||
            @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) {
 | 
			
		||||
        this.context = context;
 | 
			
		||||
        this.descriptionText = descriptionText;
 | 
			
		||||
        this.disposables = disposables;
 | 
			
		||||
        this.streamInfo = streamInfo;
 | 
			
		||||
        this.relatedInfoService = relatedInfoService;
 | 
			
		||||
        this.relatedStreamUrl = relatedStreamUrl;
 | 
			
		||||
        this.timestampMatchDTO = timestampMatchDTO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onClick(@NonNull final View view) {
 | 
			
		||||
        playOnPopup(context, streamInfo.getUrl(), streamInfo.getService(),
 | 
			
		||||
        playOnPopup(context, relatedStreamUrl, relatedInfoService,
 | 
			
		||||
                timestampMatchDTO.seconds(), disposables);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLongClick(@NonNull final View view) {
 | 
			
		||||
        ShareUtils.copyToClipboard(context,
 | 
			
		||||
                getTimestampTextToCopy(streamInfo, descriptionText, timestampMatchDTO));
 | 
			
		||||
        ShareUtils.copyToClipboard(context, getTimestampTextToCopy(
 | 
			
		||||
                relatedInfoService, relatedStreamUrl, descriptionText, timestampMatchDTO));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private static String getTimestampTextToCopy(
 | 
			
		||||
            @NonNull final StreamInfo relatedInfo,
 | 
			
		||||
            @NonNull final StreamingService relatedInfoService,
 | 
			
		||||
            @NonNull final String relatedStreamUrl,
 | 
			
		||||
            @NonNull final String descriptionText,
 | 
			
		||||
            @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) {
 | 
			
		||||
        // TODO: use extractor methods to get timestamps when this feature will be implemented in it
 | 
			
		||||
        final StreamingService streamingService = relatedInfo.getService();
 | 
			
		||||
        if (streamingService == ServiceList.YouTube) {
 | 
			
		||||
            return relatedInfo.getUrl() + "&t=" + timestampMatchDTO.seconds();
 | 
			
		||||
        } else if (streamingService == ServiceList.SoundCloud
 | 
			
		||||
                || streamingService == ServiceList.MediaCCC) {
 | 
			
		||||
            return relatedInfo.getUrl() + "#t=" + timestampMatchDTO.seconds();
 | 
			
		||||
        } else if (streamingService == ServiceList.PeerTube) {
 | 
			
		||||
            return relatedInfo.getUrl() + "?start=" + timestampMatchDTO.seconds();
 | 
			
		||||
        if (relatedInfoService == ServiceList.YouTube) {
 | 
			
		||||
            return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds();
 | 
			
		||||
        } else if (relatedInfoService == ServiceList.SoundCloud
 | 
			
		||||
                || relatedInfoService == ServiceList.MediaCCC) {
 | 
			
		||||
            return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds();
 | 
			
		||||
        } else if (relatedInfoService == ServiceList.PeerTube) {
 | 
			
		||||
            return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Return timestamp text for other services
 | 
			
		||||
 
 | 
			
		||||
@@ -782,4 +782,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">إلغاء تعيين الصورة المصغرة الدائمة</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">فشل النسخ إلى الحافظة</string>
 | 
			
		||||
    <string name="card">البطاقة</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">تمت إضافة وقت (أوقات) مكررة %d</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
    <string name="main_bg_subtitle">Başlamaq üçün böyüdücü güzgüyə toxun.</string>
 | 
			
		||||
    <string name="upload_date_text">%1$s tarixində yayımlanıb</string>
 | 
			
		||||
    <string name="no_player_found">Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\?</string>
 | 
			
		||||
    <string name="no_player_found_toast">Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC\'ni quraşdıra bilərsiniz).</string>
 | 
			
		||||
    <string name="no_player_found_toast">Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz).</string>
 | 
			
		||||
    <string name="install">Yüklə</string>
 | 
			
		||||
    <string name="cancel">Ləğv et</string>
 | 
			
		||||
    <string name="open_in_browser">Brauzerdə aç</string>
 | 
			
		||||
@@ -12,59 +12,59 @@
 | 
			
		||||
    <string name="controls_download_desc">Yayım faylını endir</string>
 | 
			
		||||
    <string name="search">Axtarış</string>
 | 
			
		||||
    <string name="settings">Tənzimləmələr</string>
 | 
			
		||||
    <string name="did_you_mean">Bunu nəzərdə tuturdunuz: \"%1$s\"\?</string>
 | 
			
		||||
    <string name="did_you_mean">Bunu demək istəyirdiniz: \"%1$s\"\?</string>
 | 
			
		||||
    <string name="share_dialog_title">ilə paylaş</string>
 | 
			
		||||
    <string name="use_external_video_player_title">Xarici video oynadıcı istifadə et</string>
 | 
			
		||||
    <string name="use_external_video_player_summary">Bəzi qətnamələrdə səsi silir</string>
 | 
			
		||||
    <string name="use_external_video_player_summary">Bəzi ayırdetmələrdə səsi silir</string>
 | 
			
		||||
    <string name="use_external_audio_player_title">Xarici səs oynadıcı istifadə et</string>
 | 
			
		||||
    <string name="subscribe_button_title">Abunə Ol</string>
 | 
			
		||||
    <string name="subscribed_button_title">Abunə olundu</string>
 | 
			
		||||
    <string name="channel_unsubscribed">Kanal abunəliyi ləğv edildi</string>
 | 
			
		||||
    <string name="show_info">Məlumat göstər</string>
 | 
			
		||||
    <string name="tab_subscriptions">Abunəliklər</string>
 | 
			
		||||
    <string name="tab_subscriptions">Abunələr</string>
 | 
			
		||||
    <string name="tab_bookmarks">Əlfəcinlənmiş Pleylistlər</string>
 | 
			
		||||
    <string name="fragment_feed_title">Yeniliklər</string>
 | 
			
		||||
    <string name="controls_background_title">Fon</string>
 | 
			
		||||
    <string name="download_path_title">Video endirmə qovluğu</string>
 | 
			
		||||
    <string name="download_path_summary">Endirilmiş video fayllar burada saxlanılır</string>
 | 
			
		||||
    <string name="download_path_dialog_title">Video faylları üçün endirmə qovluğunu seç</string>
 | 
			
		||||
    <string name="download_path_dialog_title">Video fayllar üçün endirmə qovluğu seç</string>
 | 
			
		||||
    <string name="download_path_audio_title">Səs endirmə qovluğu</string>
 | 
			
		||||
    <string name="download_path_audio_summary">Endirilmiş səs faylları burada saxlanılır</string>
 | 
			
		||||
    <string name="download_path_audio_dialog_title">Səs faylları üçün endirmə qovluğu seç</string>
 | 
			
		||||
    <string name="default_resolution_title">Defolt keyfiyyət</string>
 | 
			
		||||
    <string name="show_higher_resolutions_title">Daha böyük keyfiyyət seçimləri göstər</string>
 | 
			
		||||
    <string name="default_resolution_title">Standart ayırdetmə</string>
 | 
			
		||||
    <string name="show_higher_resolutions_title">Daha böyük ayırdetmələr göstər</string>
 | 
			
		||||
    <string name="play_with_kodi_title">\"Kodi\" ilə Oynat</string>
 | 
			
		||||
    <string name="kore_not_found">Çatışmayan \"Kore\" tətbiqi yüklənilsin\?</string>
 | 
			
		||||
    <string name="show_play_with_kodi_title">\"Kodi ilə Oynat\" seçimini göstər</string>
 | 
			
		||||
    <string name="show_play_with_kodi_summary">Videonu Kodi media mərkəzi ilə oynatmaq üçün seçim göstər</string>
 | 
			
		||||
    <string name="show_play_with_kodi_summary">Kodi media mərkəzindən video oynatmaq üçün seçim göstər</string>
 | 
			
		||||
    <string name="play_audio">Səs</string>
 | 
			
		||||
    <string name="default_audio_format_title">Defolt səs formatı</string>
 | 
			
		||||
    <string name="default_video_format_title">Defolt video formatı</string>
 | 
			
		||||
    <string name="default_audio_format_title">Standart səs formatı</string>
 | 
			
		||||
    <string name="default_video_format_title">Standart video formatı</string>
 | 
			
		||||
    <string name="theme_title">Tema</string>
 | 
			
		||||
    <string name="light_theme_title">İşıqlı</string>
 | 
			
		||||
    <string name="dark_theme_title">Qaranlıq</string>
 | 
			
		||||
    <string name="black_theme_title">Qara</string>
 | 
			
		||||
    <string name="unsubscribe">Abunəlikdən çıxın</string>
 | 
			
		||||
    <string name="unsubscribe">Abunə olma</string>
 | 
			
		||||
    <string name="open_in_popup_mode">Ani görüntü rejimində aç</string>
 | 
			
		||||
    <string name="autoplay_title">Avtomatik oynat</string>
 | 
			
		||||
    <string name="download_dialog_title">Endir</string>
 | 
			
		||||
    <string name="resume_on_audio_focus_gain_summary">Fasilələrdən sonra (məsələn, telefon zəngləri) oynatmağa davam etdir</string>
 | 
			
		||||
    <string name="download_dialog_title">Yüklə</string>
 | 
			
		||||
    <string name="resume_on_audio_focus_gain_summary">Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam etdir</string>
 | 
			
		||||
    <string name="resume_on_audio_focus_gain_title">Oynatmanı davam etdir</string>
 | 
			
		||||
    <string name="enable_watch_history_summary">Baxılmış videoların saxlanılması</string>
 | 
			
		||||
    <string name="settings_category_clear_data_title">Məlumat təmizlə</string>
 | 
			
		||||
    <string name="enable_playback_state_lists_summary">Siyahılarda oynatma mövqelərini göstər</string>
 | 
			
		||||
    <string name="enable_playback_state_lists_summary">Siyahılarda oynatma mövqe göstəricilərini göstər</string>
 | 
			
		||||
    <string name="enable_playback_state_lists_title">Siyahılardakı mövqelər</string>
 | 
			
		||||
    <string name="enable_playback_resume_summary">Son oynatma mövqeyini qaytar</string>
 | 
			
		||||
    <string name="enable_playback_resume_title">Oynatmanı davam etdir</string>
 | 
			
		||||
    <string name="enable_watch_history_title">Baxış tarixçəsi</string>
 | 
			
		||||
    <string name="enable_search_history_summary">Axtarış sorğularını yerli olaraq saxla</string>
 | 
			
		||||
    <string name="enable_search_history_title">Axtarış tarixçəsi</string>
 | 
			
		||||
    <string name="show_search_suggestions_summary">Axtarış edərkən göstəriləcək təklifləri seç</string>
 | 
			
		||||
    <string name="show_search_suggestions_summary">Axtarış zamanı göstərmək üçün təklifləri seç</string>
 | 
			
		||||
    <string name="show_search_suggestions_title">Axtarış təklifləri</string>
 | 
			
		||||
    <string name="brightness_gesture_control_summary">Oynadıcının parlaqlığını nizamlamaq üçün jestləri istifadə et</string>
 | 
			
		||||
    <string name="brightness_gesture_control_title">Parlaqlığı jestlə nizamlamaq</string>
 | 
			
		||||
    <string name="volume_gesture_control_summary">Oynadıcı səsini nizamlamaq üçün jestləri istifadə et</string>
 | 
			
		||||
    <string name="volume_gesture_control_title">Səsi jestlə idarə etmək</string>
 | 
			
		||||
    <string name="brightness_gesture_control_summary">Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et</string>
 | 
			
		||||
    <string name="brightness_gesture_control_title">Parlaqlıq jesti idarəetməsi</string>
 | 
			
		||||
    <string name="volume_gesture_control_summary">Oynadıcı səsini nizamlamaq üçün jestlər istifadə et</string>
 | 
			
		||||
    <string name="volume_gesture_control_title">Səs səviyyəsi jesti idarəetməsi</string>
 | 
			
		||||
    <string name="auto_queue_toggle">Avto-növbələ</string>
 | 
			
		||||
    <string name="auto_queue_title">Növbəti Yayımı Avto-növbələ</string>
 | 
			
		||||
    <string name="metadata_cache_wipe_complete_notice">Üst məlumat keşi silindi</string>
 | 
			
		||||
@@ -73,10 +73,10 @@
 | 
			
		||||
    <string name="thumbnail_cache_wipe_complete_notice">Şəkil keşi silindi</string>
 | 
			
		||||
    <string name="show_comments_summary">Şərhləri gizlətmək üçün bağla</string>
 | 
			
		||||
    <string name="show_comments_title">Şərhləri göstər</string>
 | 
			
		||||
    <string name="clear_queue_confirmation_description">Aktiv oynadıcının növbəsi dəyişdiriləcək</string>
 | 
			
		||||
    <string name="clear_queue_confirmation_description">Aktiv oynadıcı növbəsi dəyişdiriləcək</string>
 | 
			
		||||
    <string name="clear_queue_confirmation_summary">Bir oynadıcıdan digərinə keçid növbənizi dəyişdirə bilər</string>
 | 
			
		||||
    <string name="clear_queue_confirmation_title">Növbəni təmizləməzdən əvvəl təsdiq üçün soruş</string>
 | 
			
		||||
    <string name="use_inexact_seek_title">Sürətli qeyri-dəqiq axtarışdan istifadə et</string>
 | 
			
		||||
    <string name="use_inexact_seek_title">Sürətli qeyri-dəqiq axtarış istifadə et</string>
 | 
			
		||||
    <string name="use_inexact_seek_summary">Qeyri-dəqiq axtarış oynadıcıya azaldılmış dəqiqliklə mövqeləri daha sürətli axtarmağa imkan verir. 5, 15 və ya 25 saniyəlik axtarış bununla işləmir</string>
 | 
			
		||||
    <string name="seek_duration_title">Sürətli irəli/geri çəkmə axtarış müddəti</string>
 | 
			
		||||
    <string name="notification_action_nothing">Heç nə</string>
 | 
			
		||||
@@ -89,9 +89,9 @@
 | 
			
		||||
    <string name="notification_action_1_title">İkinci fəaliyyət düyməsi</string>
 | 
			
		||||
    <string name="notification_action_0_title">Birinci fəaliyyət düyməsi</string>
 | 
			
		||||
    <string name="show_higher_resolutions_summary">Yalnız bəzi cihazlar 2K/4K videoları oynada bilir</string>
 | 
			
		||||
    <string name="default_popup_resolution_title">Defolt ani pəncərə keyfiyyəti</string>
 | 
			
		||||
    <string name="default_popup_resolution_title">Standart ani görüntü ayırdetməsi</string>
 | 
			
		||||
    <string name="controls_add_to_playlist_title">Əlavə Et</string>
 | 
			
		||||
    <string name="controls_popup_title">Ani Pəncərə</string>
 | 
			
		||||
    <string name="controls_popup_title">Ani Görüntü</string>
 | 
			
		||||
    <string name="tab_choose">Paneli Seç</string>
 | 
			
		||||
    <string name="subscription_update_failed">Abunəliyi yeniləmək alınmadı</string>
 | 
			
		||||
    <string name="subscription_change_failed">Abunəliyi dəyişmək alınmadı</string>
 | 
			
		||||
@@ -102,7 +102,7 @@
 | 
			
		||||
    <string name="show_age_restricted_content_summary">Yaş həddi səbəbiylə (məsələn, 18+) uşaqlar üçün uyğun olmayan məzmunu göstər</string>
 | 
			
		||||
    <string name="show_age_restricted_content_title">Yaş məhdudiyyətli məzmunu göstər</string>
 | 
			
		||||
    <string name="content">Məzmun</string>
 | 
			
		||||
    <string name="popup_playing_toast">Ani pəncərə rejimində oynadılır</string>
 | 
			
		||||
    <string name="popup_playing_toast">Ani görüntü rejimində oynadılır</string>
 | 
			
		||||
    <string name="background_player_playing_toast">Fonda oynadılır</string>
 | 
			
		||||
    <string name="settings_category_updates_title">Yeniləmələr</string>
 | 
			
		||||
    <string name="settings_category_debug_title">Sazlama</string>
 | 
			
		||||
@@ -111,23 +111,23 @@
 | 
			
		||||
    <string name="settings_category_video_audio_title">Video və səs</string>
 | 
			
		||||
    <string name="settings_category_player_behavior_title">Davranış</string>
 | 
			
		||||
    <string name="settings_category_player_title">Oynadıcı</string>
 | 
			
		||||
    <string name="content_language_title">Defolt məzmun dili</string>
 | 
			
		||||
    <string name="default_content_country_title">Defolt məzmun ölkəsi</string>
 | 
			
		||||
    <string name="content_language_title">Cari məzmun dili</string>
 | 
			
		||||
    <string name="default_content_country_title">Cari məzmun ölkəsi</string>
 | 
			
		||||
    <string name="unsupported_url_dialog_message">URL\'i tanımaq olmadı. Başqa tətbiqlə açılsın\?</string>
 | 
			
		||||
    <string name="unsupported_url">Dəstəklənməyən URL\'i</string>
 | 
			
		||||
    <string name="show_hold_to_append_title">\"Növbələmək üçün basılı saxla\" tövsiyəsin göstər</string>
 | 
			
		||||
    <string name="show_next_and_similar_title">\"Növbəti\" və \"Bənzər\" videoları göstər</string>
 | 
			
		||||
    <string name="export_data_summary">Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac edin</string>
 | 
			
		||||
    <string name="export_data_summary">Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac et</string>
 | 
			
		||||
    <string name="import_data_summary">Cari tarixçənizi, abunəliklərinizi, pleylistlərinizi və (könüllü) tənzimləmələrinizi etibarsız edir</string>
 | 
			
		||||
    <string name="recaptcha_cookies_cleared">reCAPTCHA kukiləri təmizləndi</string>
 | 
			
		||||
    <string name="clear_cookie_title">reCAPTCHA kukilərini təmizlə</string>
 | 
			
		||||
    <string name="recaptcha_cookies_cleared">reCAPTCHA bazaları təmizləndi</string>
 | 
			
		||||
    <string name="clear_cookie_title">reCAPTCHA bazalarını təmizlə</string>
 | 
			
		||||
    <string name="export_data_title">Məlumat bazasını ixrac et</string>
 | 
			
		||||
    <string name="import_data_title">Məlumat bazasını idxal et</string>
 | 
			
		||||
    <string name="switch_to_main">Əsas Görünüşə Keçid</string>
 | 
			
		||||
    <string name="switch_to_popup">Ani Pəncərəyə Keçid</string>
 | 
			
		||||
    <string name="switch_to_popup">Ani Görüntüyə Keçid</string>
 | 
			
		||||
    <string name="switch_to_background">Fona Keçid</string>
 | 
			
		||||
    <string name="unknown_content">[Naməlum]</string>
 | 
			
		||||
    <string name="app_update_notification_channel_description">Yeni \"NewPipe\" versiyası üçün bildirişlər</string>
 | 
			
		||||
    <string name="app_update_notification_channel_description">Yeni \"NewPipe\" versiyaları üçün bildirişlər</string>
 | 
			
		||||
    <string name="app_update_notification_channel_name">Tətbiq yeniləmə bildirişi</string>
 | 
			
		||||
    <string name="notification_channel_description">NewPipe oynadıcısı üçün bildirişlər</string>
 | 
			
		||||
    <string name="all">Hamısı</string>
 | 
			
		||||
@@ -141,7 +141,7 @@
 | 
			
		||||
    <string name="youtube_restricted_mode_enabled_summary">YouTube potensial yetkin məzmunu gizlədən \"Məhdud Rejim\" təmin edir</string>
 | 
			
		||||
    <string name="peertube_instance_url_title">\"PeerTube\" nümunələri</string>
 | 
			
		||||
    <string name="download_thumbnail_title">Miniatürləri yüklə</string>
 | 
			
		||||
    <string name="notification_actions_at_most_three">Siz yığcam bildirişdə göstərilməsi üçün ən çoxu üç fəaliyyət seçə bilərsiniz!</string>
 | 
			
		||||
    <string name="notification_actions_at_most_three">Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz!</string>
 | 
			
		||||
    <string name="feed_update_threshold_option_always_update">Həmişə yenilə</string>
 | 
			
		||||
    <string name="settings_category_feed_title">Axın</string>
 | 
			
		||||
    <string name="feed_group_show_only_ungrouped_subscriptions">Yalnız qruplaşdırılmamış abunəlikləri göstər</string>
 | 
			
		||||
@@ -153,7 +153,7 @@
 | 
			
		||||
        <item quantity="other">%d seçildi</item>
 | 
			
		||||
    </plurals>
 | 
			
		||||
    <string name="feed_group_dialog_empty_selection">Abunəlik seçilməyib</string>
 | 
			
		||||
    <string name="feed_group_dialog_select_subscriptions">Abunəlikləri seçin</string>
 | 
			
		||||
    <string name="feed_group_dialog_select_subscriptions">Abunəlikləri seç</string>
 | 
			
		||||
    <string name="feed_processing_message">Axın emal edilir…</string>
 | 
			
		||||
    <string name="feed_notification_loading">Axın yüklənir…</string>
 | 
			
		||||
    <string name="feed_subscription_not_loaded_count">Yüklənmədi: %d</string>
 | 
			
		||||
@@ -179,8 +179,8 @@
 | 
			
		||||
    <string name="general_error">Xəta</string>
 | 
			
		||||
    <string name="search_history_deleted">Axtarış tarixçəsi silindi</string>
 | 
			
		||||
    <string name="delete_search_history_alert">Bütün axtarış tarixçəsi silinsin\?</string>
 | 
			
		||||
    <string name="clear_search_history_summary">Açar sözləri axtarışının tarixçəsini silir</string>
 | 
			
		||||
    <string name="clear_search_history_title">Axtarış tarixçəsini silin</string>
 | 
			
		||||
    <string name="clear_search_history_summary">Açar sözləri axtarışı tarixçəsini silir</string>
 | 
			
		||||
    <string name="clear_search_history_title">Axtarış tarixçəsini sil</string>
 | 
			
		||||
    <string name="watch_history_states_deleted">Oynatma mövqeləri silindi</string>
 | 
			
		||||
    <string name="delete_playback_states_alert">Bütün oynatma mövqeləri silinsin\?</string>
 | 
			
		||||
    <string name="clear_playback_states_summary">Bütün oynatma mövqelərini silir</string>
 | 
			
		||||
@@ -188,7 +188,7 @@
 | 
			
		||||
    <string name="watch_history_deleted">Baxış tarixçəsi silindi</string>
 | 
			
		||||
    <string name="delete_view_history_alert">Bütün baxış tarixçəsi silinsin\?</string>
 | 
			
		||||
    <string name="clear_views_history_title">Baxış tarixçəsini təmizlə</string>
 | 
			
		||||
    <string name="clear_cookie_summary">reCAPTCHA həll edərkən NewPipe\'ın saxladığı kukiləri silin</string>
 | 
			
		||||
    <string name="clear_cookie_summary">reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil</string>
 | 
			
		||||
    <string name="channel_created_by">%s tərəfindən yaradıldı</string>
 | 
			
		||||
    <string name="resize_zoom">Yaxınlaşdır</string>
 | 
			
		||||
    <string name="resize_fill">Doldur</string>
 | 
			
		||||
@@ -198,22 +198,22 @@
 | 
			
		||||
    <string name="no_channel_subscribed_yet">Hələ ki, kanal abunəliyi yoxdur</string>
 | 
			
		||||
    <string name="select_a_channel">Kanal seç</string>
 | 
			
		||||
    <string name="channel_page_summary">Kanal Səhifəsi</string>
 | 
			
		||||
    <string name="default_kiosk_page_summary">Defolt Köşk</string>
 | 
			
		||||
    <string name="kiosk_page_summary">Köşk Səhifəsi</string>
 | 
			
		||||
    <string name="default_kiosk_page_summary">Standart Köşk</string>
 | 
			
		||||
    <string name="kiosk_page_summary">Köşk Səhifə</string>
 | 
			
		||||
    <string name="blank_page_summary">Boş Səhifə</string>
 | 
			
		||||
    <string name="main_page_content_summary">Əsas səhifədə hansı tablar göstərilir</string>
 | 
			
		||||
    <string name="main_page_content">Əsas səhifənin məzmunu</string>
 | 
			
		||||
    <string name="main_page_content">Əsas səhifə məzmunu</string>
 | 
			
		||||
    <string name="updates_setting_description">Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər</string>
 | 
			
		||||
    <string name="updates_setting_title">Yeniləmələr</string>
 | 
			
		||||
    <string name="limit_mobile_data_usage_title">Mobil internet istifadə edərkən görüntü keyfiyyətini məhdudlaşdır</string>
 | 
			
		||||
    <string name="limit_mobile_data_usage_title">Mobil internet istifadə edərkən ayırdetməni məhdudlaşdır</string>
 | 
			
		||||
    <string name="limit_data_usage_none_description">Limitsiz</string>
 | 
			
		||||
    <string name="one_item_deleted">1 element silindi.</string>
 | 
			
		||||
    <string name="peertube_instance_add_title">Nümunə əlavə et</string>
 | 
			
		||||
    <string name="peertube_instance_url_summary">Sevimli \"PeerTube\" nümunələrinizi seçin</string>
 | 
			
		||||
    <string name="delete_downloaded_files">Endirilmiş faylları silin</string>
 | 
			
		||||
    <string name="confirm_prompt">Endirmə tarixçənizi təmizləmək və ya endirilmiş bütün faylları silmək istəyirsiniz\?</string>
 | 
			
		||||
    <string name="delete_downloaded_files">Endirilmiş faylları sil</string>
 | 
			
		||||
    <string name="confirm_prompt">Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz\?</string>
 | 
			
		||||
    <string name="clear_download_history">Endirmə tarixçəsini təmizlə</string>
 | 
			
		||||
    <string name="start_downloads">Endirmələrə başla</string>
 | 
			
		||||
    <string name="start_downloads">Endirmələri başlat</string>
 | 
			
		||||
    <string name="pause_downloads">Endirmələri dayandır</string>
 | 
			
		||||
    <string name="downloads_storage_ask_title">Haraya endiriləcəyini soruş</string>
 | 
			
		||||
    <string name="downloads_storage_ask_summary">Sizdən hər endirmənin harada saxlanılacağı soruşulacaq.
 | 
			
		||||
@@ -241,13 +241,13 @@
 | 
			
		||||
    <string name="feed_update_threshold_title">Axın yeniləmə astanası</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_enable_button">Sürətli rejimi aktivləşdir</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_disable_button">Sürətli rejimi deaktiv et</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_help_text">Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdən dəyişə və ya aşağıdakı düyməni basa bilərsiniz).
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_help_text">Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdə dəyişə və ya aşağıdakı düyməni basa bilərsiniz).
 | 
			
		||||
\n
 | 
			
		||||
\nNewPipe axını yükləmək üçün 2 metod təklif edir:
 | 
			
		||||
\n• Bütün abunəlik kanallarını gətirtmək, bu yavaş olsa da tamdır;
 | 
			
		||||
\n• Ayrılmış xidmət uc nöqtəsi istifadə etmək, bu sürətlidir, amma tam deyil.
 | 
			
		||||
\n
 | 
			
		||||
\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az element gətirir.
 | 
			
		||||
\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az elementlər gətirir.
 | 
			
		||||
\n
 | 
			
		||||
\nYouTube öz RSS axını ilə bu sürətli metodu təklif edən xidmətlərdən biridir.
 | 
			
		||||
\n
 | 
			
		||||
@@ -262,9 +262,9 @@
 | 
			
		||||
    <string name="download_to_sdcard_error_title">Xarici yaddaş əlçatan deyil</string>
 | 
			
		||||
    <string name="clear_views_history_summary">Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir</string>
 | 
			
		||||
    <string name="show_meta_info_title">Üst məlumatı göstər</string>
 | 
			
		||||
    <string name="show_description_summary">Video açıqlamasını və əlavə məlumatı gizlətmək üçün bağla</string>
 | 
			
		||||
    <string name="show_description_summary">Video açıqlamanı və əlavə məlumatı gizlətmək üçün bağla</string>
 | 
			
		||||
    <string name="show_description_title">Açıqlamanı göstər</string>
 | 
			
		||||
    <string name="notification_colorize_title">Bildirişi rəngləndir</string>
 | 
			
		||||
    <string name="notification_colorize_title">Bildirişi rənglə</string>
 | 
			
		||||
    <string name="invalid_directory">Belə qovluq yoxdur</string>
 | 
			
		||||
    <string name="start_main_player_fullscreen_title">Əsas oynadıcını tam ekranda başlat</string>
 | 
			
		||||
    <string name="external_player_unsupported_link_type">Xarici oynadıcılar bu cür linkləri dəstəkləmir</string>
 | 
			
		||||
@@ -281,7 +281,7 @@
 | 
			
		||||
    <string name="description_tab_description">Açıqlama</string>
 | 
			
		||||
    <string name="empty_list_subtitle">Burada kriketlərdən başqa heç nə yoxdur</string>
 | 
			
		||||
    <string name="search_no_results">Nəticə yoxdur</string>
 | 
			
		||||
    <string name="restore_defaults">İlkin tənzimləmələri qaytar</string>
 | 
			
		||||
    <string name="restore_defaults">Standartları qaytar</string>
 | 
			
		||||
    <string name="missing_file">Fayl köçürüldü və ya silindi</string>
 | 
			
		||||
    <string name="player_recoverable_failure">Oynadıcı xətası bərpa edilir</string>
 | 
			
		||||
    <string name="player_unrecoverable_failure">Bərpa olunmayan oynatma xətası baş verdi</string>
 | 
			
		||||
@@ -291,28 +291,28 @@
 | 
			
		||||
    <string name="audio_streams_empty">Səs yayımı tapılmadı</string>
 | 
			
		||||
    <string name="permission_display_over_apps">Digər tətbiqlərin üzərində göstərməyə icazə ver</string>
 | 
			
		||||
    <string name="restore_defaults_confirmation">İlkin tənzimləmələri qaytarmaq istəyirsiniz\?</string>
 | 
			
		||||
    <string name="download_thumbnail_summary">Miniatürlərin yüklənməsini, dataya qənaət etmək və yaddaşdan istifadəni azaltmaq üçün söndürün. Dəyişikliklər həm yaddaşdaxili, həm də diskdə olan təsvir keşini təmizləyir</string>
 | 
			
		||||
    <string name="download_thumbnail_summary">Miniatürləri yükləməyi, məlumata qənaət və yaddaş istifadəsin azaltmaq üçün söndür. Dəyişikliklər həm yaddaşdaxilində, həm də diskdə təsvir keşini təmizləyir</string>
 | 
			
		||||
    <string name="enqueue_next_stream">Növbətini növbələ</string>
 | 
			
		||||
    <string name="retry">Yenidən Cəhd Et</string>
 | 
			
		||||
    <string name="retry">Təkrar Cəhd Et</string>
 | 
			
		||||
    <string name="settings_category_player_notification_summary">Cari oynatma yayımı bildirişini konfiqurasiya et</string>
 | 
			
		||||
    <string name="notifications">Bildirişlər</string>
 | 
			
		||||
    <string name="hash_channel_name">Video fayl xülasəsi bildirişi</string>
 | 
			
		||||
    <string name="streams_notification_channel_description">Abunəliklər üçün yeni yayımlar haqqında bildirişlər</string>
 | 
			
		||||
    <string name="error_report_channel_description">Xəta hesabatları üçün bildirişlər</string>
 | 
			
		||||
    <string name="file_name_empty_error">Fayl adı boş ola bilməz</string>
 | 
			
		||||
    <string name="saved_tabs_invalid_json">Yadda saxlanmış tabları oxumaq mümkün olmadı, buna görə defolt tablardan istifadə edin</string>
 | 
			
		||||
    <string name="saved_tabs_invalid_json">Saxlanmış tabları oxumaq mümkün olmadı, buna görə standart tabları istifadə et</string>
 | 
			
		||||
    <string name="error_report_notification_title">NewPipe xəta ilə qarşılaşdı, bildirmək üçün toxun</string>
 | 
			
		||||
    <string name="sorry_string">Bağışlayın, o baş verməməli idi.</string>
 | 
			
		||||
    <string name="error_report_button_text">Bu xətanı e-poçt vasitəsilə bildirin</string>
 | 
			
		||||
    <string name="error_report_open_issue_button_text">GitHub\'da Hesabat Ver</string>
 | 
			
		||||
    <string name="sorry_string">Bağışla, o baş verməməli idi.</string>
 | 
			
		||||
    <string name="error_report_button_text">Bu xətanı e-poçt-dan bildir</string>
 | 
			
		||||
    <string name="error_report_open_issue_button_text">GitHub\'da Məlumat Ver</string>
 | 
			
		||||
    <string name="error_report_open_github_notice">Zəhmət olmasa, xətanızı müzakirə edən məsələnin mövcud olub-olmadığını yoxlayın. Dublikat biletləri yaradarkən, bizdən faktiki səhvi düzəltməyə sərf edəcəyimiz vaxt alırsınız.</string>
 | 
			
		||||
    <string name="error_snackbar_action">Hesabat Bildir</string>
 | 
			
		||||
    <string name="error_snackbar_action">Məlumat Ver</string>
 | 
			
		||||
    <string name="what_device_headline">Məlumat:</string>
 | 
			
		||||
    <string name="what_happened_headline">Nə baş verdi:</string>
 | 
			
		||||
    <string name="detail_uploader_thumbnail_view_description">Yükləyənin avatar miniatürü</string>
 | 
			
		||||
    <string name="detail_likes_img_view_description">Bəyən</string>
 | 
			
		||||
    <string name="detail_dislikes_img_view_description">Bəyənmə</string>
 | 
			
		||||
    <string name="detail_drag_description">Yenidən sıralamaq üçün sürüşdür</string>
 | 
			
		||||
    <string name="detail_drag_description">Yenidən sıralamaq üçün sürüklə</string>
 | 
			
		||||
    <string name="short_thousand">min</string>
 | 
			
		||||
    <string name="short_million">Mln</string>
 | 
			
		||||
    <string name="short_billion">Mlrd</string>
 | 
			
		||||
@@ -324,13 +324,13 @@
 | 
			
		||||
    <string name="no_videos">Video yoxdur</string>
 | 
			
		||||
    <string name="comments_are_disabled">Şərhlər qeyri-aktivdir</string>
 | 
			
		||||
    <string name="start">Başlat</string>
 | 
			
		||||
    <string name="pause">Fasilə</string>
 | 
			
		||||
    <string name="pause">Dayandır</string>
 | 
			
		||||
    <string name="checksum">Təsdiqləmə</string>
 | 
			
		||||
    <string name="dismiss">İmtina</string>
 | 
			
		||||
    <string name="msg_error">Xəta</string>
 | 
			
		||||
    <string name="msg_running_detail">Detallar üçün toxun</string>
 | 
			
		||||
    <string name="msg_wait">Zəhmət olmasa, gözləyin…</string>
 | 
			
		||||
    <string name="no_dir_yet">Hələ endirmə qovluğu təyin edilməyib, indi defolt endirmə qovluğunu seç</string>
 | 
			
		||||
    <string name="no_dir_yet">Hələ endirmə qovluğu təyin edilməyib, indi standart endirmə qovluğu seç</string>
 | 
			
		||||
    <string name="title_activity_recaptcha">reCAPTCHA çağırışı</string>
 | 
			
		||||
    <string name="recaptcha_request_toast">reCAPTCHA sorğusu göndərildi</string>
 | 
			
		||||
    <string name="recaptcha_done_button">Bitdi</string>
 | 
			
		||||
@@ -340,15 +340,15 @@
 | 
			
		||||
    <string name="title_licenses">Üçüncü Tərəf Lisenziyaları</string>
 | 
			
		||||
    <string name="tab_about">Haqqında & T-TSS</string>
 | 
			
		||||
    <string name="contribution_title">Töhfə Ver</string>
 | 
			
		||||
    <string name="contribution_encouragement">Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kodun təmizlənməsi və ya real ağırlıqlı kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar!</string>
 | 
			
		||||
    <string name="contribution_encouragement">Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kod təmizlənməsi və ya real ağır kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar!</string>
 | 
			
		||||
    <string name="give_back">İanə Et</string>
 | 
			
		||||
    <string name="website_title">Veb sayt</string>
 | 
			
		||||
    <string name="website_encouragement">Əlavə məlumat və xəbərlər üçün NewPipe Veb saytına daxil olun.</string>
 | 
			
		||||
    <string name="privacy_policy_title">NewPipe\'ın Məxfilik Siyasəti</string>
 | 
			
		||||
    <string name="privacy_policy_encouragement">NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Buna görə də, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır.
 | 
			
		||||
\nNewPipe\'ın məxfilik siyasəti qəza hesabatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir.</string>
 | 
			
		||||
    <string name="read_privacy_policy">Məxfilik siyasətini oxu</string>
 | 
			
		||||
    <string name="app_license_title">NewPipe\'ın Lisenziyası</string>
 | 
			
		||||
    <string name="website_encouragement">Əlavə məlumat və xəbərlər üçün NewPipe Veb saytını ziyarət et.</string>
 | 
			
		||||
    <string name="privacy_policy_title">NewPipe Məxfilik Siyasəti</string>
 | 
			
		||||
    <string name="privacy_policy_encouragement">NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Nəticə etibarı ilə, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır.
 | 
			
		||||
\nNewPipe məxfilik siyasəti xəta məlumatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir.</string>
 | 
			
		||||
    <string name="read_privacy_policy">Məxfilik Siyasətini Oxu</string>
 | 
			
		||||
    <string name="app_license_title">NewPipe Lisenziyası</string>
 | 
			
		||||
    <string name="action_history">Tarixçə</string>
 | 
			
		||||
    <string name="delete_item_search_history">Bu elementi axtarış tarixçəsindən silmək istəyirsiniz\?</string>
 | 
			
		||||
    <string name="title_last_played">Son Oynadılan</string>
 | 
			
		||||
@@ -367,7 +367,7 @@
 | 
			
		||||
    <string name="title_activity_play_queue">Oynatma növbəsi</string>
 | 
			
		||||
    <string name="play_queue_stream_detail">Detallar</string>
 | 
			
		||||
    <string name="show_channel_details">Kanal təfərrüatlarını göstər</string>
 | 
			
		||||
    <string name="start_here_on_popup">Ani pəncərədə oynatmağa başla</string>
 | 
			
		||||
    <string name="start_here_on_popup">Ani görüntüdə oynatmağa başla</string>
 | 
			
		||||
    <string name="preferred_open_action_settings_title">\"Açıq\" fəaliyyətə üstünlük verilir</string>
 | 
			
		||||
    <string name="background_player">Fon oynadıcı</string>
 | 
			
		||||
    <string name="always_ask_open_action">Həmişə soruş</string>
 | 
			
		||||
@@ -403,7 +403,7 @@
 | 
			
		||||
\nDavam etmək istəyirsiniz\?</string>
 | 
			
		||||
    <string name="skip_silence_checkbox">Səssizlik zamanı sürətlə irəli</string>
 | 
			
		||||
    <string name="enable_streams_notifications_title">Yeni yayım bildirişləri</string>
 | 
			
		||||
    <string name="enable_streams_notifications_summary">Abunəliklərdən yeni yayımlar haqqında bildiriş göndər</string>
 | 
			
		||||
    <string name="enable_streams_notifications_summary">Abunəliklərdən yeni yayımlar haqqında bildir</string>
 | 
			
		||||
    <string name="streams_notifications_interval_title">Yoxlama tezliyi</string>
 | 
			
		||||
    <string name="streams_notifications_network_title">Tələb olunan şəbəkə bağlantısı</string>
 | 
			
		||||
    <string name="any_network">İstənilən şəbəkə</string>
 | 
			
		||||
@@ -426,7 +426,7 @@
 | 
			
		||||
    <string name="content_not_supported">Bu məzmun hələ NewPipe tərəfindən dəstəklənmir.
 | 
			
		||||
\n 
 | 
			
		||||
\nÜmid edirik ki, gələcək versiyada dəstəklənəcək.</string>
 | 
			
		||||
    <string name="show_thumbnail_summary">Həm kilid ekranı fonu, həm də bildirişlər üçün miniatürdən istifadə et</string>
 | 
			
		||||
    <string name="show_thumbnail_summary">Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et</string>
 | 
			
		||||
    <string name="recent">Ən Yeni</string>
 | 
			
		||||
    <string name="georestricted_content">Bu məzmun ölkənizdə mövcud deyil.</string>
 | 
			
		||||
    <string name="paid_content">Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlana və ya endirilə bilməz.</string>
 | 
			
		||||
@@ -468,10 +468,10 @@
 | 
			
		||||
    <string name="notification_colorize_summary">Android\'in bildiriş rəngini miniatürdəki əsas rəngə uyğun fərdiləşdirməsini təmin et (qeyd edək ki, bu, bütün cihazlarda mövcud deyil)</string>
 | 
			
		||||
    <string name="view_on_github">GitHub\'da Bax</string>
 | 
			
		||||
    <string name="donation_title">İanə Et</string>
 | 
			
		||||
    <string name="donation_encouragement">NewPipe, sizə ən yaxşı istifadəçi təcrübəsini göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin.</string>
 | 
			
		||||
    <string name="donation_encouragement">NewPipe, sizə ən yaxşı istifadəçi təcrübəsi göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin.</string>
 | 
			
		||||
    <string name="most_liked">Ən çox bəyənildi</string>
 | 
			
		||||
    <string name="enqueued">Növbəyə salındı</string>
 | 
			
		||||
    <string name="preferred_open_action_settings_summary">Məzmunu açarkən defolt hərəkət — %s</string>
 | 
			
		||||
    <string name="preferred_open_action_settings_summary">Məzmunu açarkən standart hərəkət — %s</string>
 | 
			
		||||
    <string name="name">Ad</string>
 | 
			
		||||
    <string name="set_as_playlist_thumbnail">Pleylist miniatürü kimi təyin et</string>
 | 
			
		||||
    <string name="wifi_only">Yalnız Wi-Fi\'da</string>
 | 
			
		||||
@@ -488,7 +488,7 @@
 | 
			
		||||
    <string name="metadata_licence">Lisenziya</string>
 | 
			
		||||
    <string name="feed_load_error_terminated">Müəllifin hesabı bağlanıb.
 | 
			
		||||
\nNewPipe gələcəkdə bu axını yükləyə bilməyəcək.
 | 
			
		||||
\nBu kanala abunəlikdən çıxmaq istəyirsiniz\?</string>
 | 
			
		||||
\nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\?</string>
 | 
			
		||||
    <string name="feed_toggle_show_played_items">Baxılan elementləri göstər</string>
 | 
			
		||||
    <string name="featured">Seçilmiş</string>
 | 
			
		||||
    <string name="drawer_close">Çəkməcəni Bağla</string>
 | 
			
		||||
@@ -496,12 +496,12 @@
 | 
			
		||||
    <string name="hash_channel_description">Video fayl xülasəsi prosesi üçün bildirişlər</string>
 | 
			
		||||
    <string name="on">Aç</string>
 | 
			
		||||
    <string name="notification_scale_to_square_image_title">Miniatürü 1:1 görünüş nisbətinə kəs</string>
 | 
			
		||||
    <string name="progressive_load_interval_summary">Yükləmə intervalının həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcının yenidən başladılmasını tələb edir</string>
 | 
			
		||||
    <string name="show_meta_info_summary">Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndürün</string>
 | 
			
		||||
    <string name="progressive_load_interval_summary">Yükləmə intervalı həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcını yenidən başlatmağı tələb edir</string>
 | 
			
		||||
    <string name="show_meta_info_summary">Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndür</string>
 | 
			
		||||
    <string name="auto_queue_summary">Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir</string>
 | 
			
		||||
    <string name="remote_search_suggestions">Kənar axtarış təklifləri</string>
 | 
			
		||||
    <string name="peertube_instance_add_exists">Nümunə artıq mövcuddur</string>
 | 
			
		||||
    <string name="start_main_player_fullscreen_summary">Videoları mini oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz</string>
 | 
			
		||||
    <string name="start_main_player_fullscreen_summary">Videoları kiçik oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz</string>
 | 
			
		||||
    <string name="more_than_100_videos">100+ video</string>
 | 
			
		||||
    <string name="infinite_videos">∞ video</string>
 | 
			
		||||
    <string name="no_comments">Şərhlər yoxdur</string>
 | 
			
		||||
@@ -532,7 +532,7 @@
 | 
			
		||||
    <string name="metadata_tags">Etiketlər</string>
 | 
			
		||||
    <string name="tablet_mode_title">Planşet rejimi</string>
 | 
			
		||||
    <string name="off">Bağla</string>
 | 
			
		||||
    <string name="detail_heart_img_view_description">Müəllifə ürəkləndi</string>
 | 
			
		||||
    <string name="detail_heart_img_view_description">Müəllifdən ürəkləndi</string>
 | 
			
		||||
    <string name="open_website_license">Veb saytı aç</string>
 | 
			
		||||
    <plurals name="views">
 | 
			
		||||
        <item quantity="one">%s baxış</item>
 | 
			
		||||
@@ -550,11 +550,11 @@
 | 
			
		||||
        <item quantity="one">Endirmə tamamlandı</item>
 | 
			
		||||
        <item quantity="other">%s endirmə tamamlandı</item>
 | 
			
		||||
    </plurals>
 | 
			
		||||
    <string name="progressive_load_interval_exoplayer_default">Defolt ExoPlayer</string>
 | 
			
		||||
    <string name="progressive_load_interval_exoplayer_default">Standart ExoPlayer</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_title">Mövcud olduqda xüsusi axından al</string>
 | 
			
		||||
    <string name="remove_watched_popup_title">Baxılmış videolar silinsin\?</string>
 | 
			
		||||
    <string name="remove_watched">İzləniləni sil</string>
 | 
			
		||||
    <string name="downloads_storage_use_saf_title">Sistem qovluğu seçicisini (SAF) istifadə edin</string>
 | 
			
		||||
    <string name="downloads_storage_use_saf_title">Sistem qovluğu seçicisini (SAF) istifadə et</string>
 | 
			
		||||
    <string name="error_timeout">Bağlantı fasiləsi</string>
 | 
			
		||||
    <string name="error_insufficient_storage">Cihazda yer qalmayıb</string>
 | 
			
		||||
    <string name="error_postprocessing_stopped">Fayl üzərində işləyərkən NewPipe bağlandı</string>
 | 
			
		||||
@@ -582,7 +582,7 @@
 | 
			
		||||
    <string name="import_ongoing">İdxal edilir…</string>
 | 
			
		||||
    <string name="playlist_add_stream_success">Pleylistə salındı</string>
 | 
			
		||||
    <string name="mute">Səsi bağla</string>
 | 
			
		||||
    <string name="popup_player">Ani pəncərə oynadıcı</string>
 | 
			
		||||
    <string name="popup_player">Ani görüntü oynadıcı</string>
 | 
			
		||||
    <string name="drawer_open">Çəkməcəni Aç</string>
 | 
			
		||||
    <string name="hold_to_append">Növbələşdirmək üçün basılı tut</string>
 | 
			
		||||
    <string name="play_queue_remove">Sil</string>
 | 
			
		||||
@@ -590,7 +590,7 @@
 | 
			
		||||
    <string name="copyright">© %1$s, %2$s tərəfindən %3$s altında</string>
 | 
			
		||||
    <string name="toast_no_player">Bu faylı oynatmaq üçün heç bir tətbiq quraşdırılmayıb</string>
 | 
			
		||||
    <string name="settings_category_downloads_title">Endirmə</string>
 | 
			
		||||
    <string name="msg_popup_permission">Bu icazə, ani pəncərə rejimində 
 | 
			
		||||
    <string name="msg_popup_permission">Bu icazə, ani görüntü rejimində
 | 
			
		||||
\naçmaq üçün lazımdır</string>
 | 
			
		||||
    <string name="msg_copied">Buferə kopyalandı</string>
 | 
			
		||||
    <string name="msg_threads">Parçalar</string>
 | 
			
		||||
@@ -608,22 +608,22 @@
 | 
			
		||||
    <string name="peertube_instance_add_help">Nümunə URL\'sini daxil et</string>
 | 
			
		||||
    <string name="peertube_instance_add_fail">Nümunəni doğrulamaq mümkün olmadı</string>
 | 
			
		||||
    <string name="peertube_instance_url_help">%s-də bəyəndiyiniz nümunələri tapın</string>
 | 
			
		||||
    <string name="show_hold_to_append_summary">Video \"Təfsilatlar:\"səhifəsində fon və ya ani pəncərə düyməsini basarkən ipucu göstər</string>
 | 
			
		||||
    <string name="caption_setting_description">Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdirin. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur</string>
 | 
			
		||||
    <string name="show_hold_to_append_summary">Video \"Təfsilatlar:\"səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər</string>
 | 
			
		||||
    <string name="caption_setting_description">Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur</string>
 | 
			
		||||
    <string name="error_occurred_detail">Xəta baş verdi: %1$s</string>
 | 
			
		||||
    <string name="invalid_file">Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur</string>
 | 
			
		||||
    <string name="parsing_error">Veb saytı təhlil etmək alınmadı</string>
 | 
			
		||||
    <string name="playback_pitch">Ucalıq</string>
 | 
			
		||||
    <string name="radio">Radio</string>
 | 
			
		||||
    <string name="show_crash_the_player_title">\"Oynadıcını çökdür\" Göstər</string>
 | 
			
		||||
    <string name="show_crash_the_player_summary">Oynadıcıdan istifadə edərkən çökdürmə seçimini göstər</string>
 | 
			
		||||
    <string name="show_crash_the_player_summary">Oynadıcını istifadə edərkən çökdürmə seçimini göstər</string>
 | 
			
		||||
    <string name="show_error_snackbar">Xəta balonu göstər</string>
 | 
			
		||||
    <string name="create_error_notification">Xəta bildirişi yarat</string>
 | 
			
		||||
    <string name="import_from">Burdan idxal edin</string>
 | 
			
		||||
    <string name="export_to">Bura ixrac edin</string>
 | 
			
		||||
    <string name="import_from">Burdan idxal et</string>
 | 
			
		||||
    <string name="export_to">Bura ixrac et</string>
 | 
			
		||||
    <string name="import_file_title">Faylı idxal et</string>
 | 
			
		||||
    <string name="subscriptions_import_unsuccessful">Abunəlikləri idxal etmək mümkün olmadı</string>
 | 
			
		||||
    <string name="start_accept_privacy_policy">Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe\'ın məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatını bizə göndərmək üçün onu qəbul etməlisiniz.</string>
 | 
			
		||||
    <string name="start_accept_privacy_policy">Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatın bizə göndərmək üçün qəbul etməlisiniz.</string>
 | 
			
		||||
    <string name="overwrite_unrelated_warning">Bu adda fayl artıq mövcuddur</string>
 | 
			
		||||
    <string name="download_already_pending">Bu adla gözlənilən bir endirmə var</string>
 | 
			
		||||
    <string name="error_path_creation">Təyinat qovluğu yaradıla bilməz</string>
 | 
			
		||||
@@ -643,7 +643,7 @@
 | 
			
		||||
    <string name="metadata_language">Dil</string>
 | 
			
		||||
    <string name="metadata_privacy_public">İctimai</string>
 | 
			
		||||
    <string name="subscribers_count_not_available">Abunəçi sayı əlçatan deyil</string>
 | 
			
		||||
    <string name="read_full_license">Lisenziyanı oxuyun</string>
 | 
			
		||||
    <string name="read_full_license">Lisenziyanı Oxu</string>
 | 
			
		||||
    <string name="title_activity_history">Tarixçə</string>
 | 
			
		||||
    <string name="charset_letters_and_digits">Hərflər və rəqəmlər</string>
 | 
			
		||||
    <string name="crash_the_player">Oynadıcını çökdür</string>
 | 
			
		||||
@@ -651,18 +651,18 @@
 | 
			
		||||
    <string name="settings_category_player_notification_title">Oynadıcı bildirişi</string>
 | 
			
		||||
    <string name="streams_notification_channel_name">Yeni yayımlar</string>
 | 
			
		||||
    <string name="error_report_channel_name">Xəta hesabatı bildirişi</string>
 | 
			
		||||
    <string name="youtube_signature_deobfuscation_error">Video URL\'i imzasının şifrəsi qırılmadı</string>
 | 
			
		||||
    <string name="no_streams_available_download">Endirmək üçün heç bir yayım yoxdur</string>
 | 
			
		||||
    <string name="error_report_notification_toast">Xəta baş verdi, bildirişə baxın</string>
 | 
			
		||||
    <string name="youtube_signature_deobfuscation_error">Video URL\'i imzası şifrəsi qırılmadı</string>
 | 
			
		||||
    <string name="no_streams_available_download">Endirmək üçün yayım mövcud deyil</string>
 | 
			
		||||
    <string name="error_report_notification_toast">Xəta baş verdi, bildirişi gör</string>
 | 
			
		||||
    <string name="your_comment">Şərhiniz (İngiliscə):</string>
 | 
			
		||||
    <string name="detail_thumbnail_view_description">Video oynat, müddət:</string>
 | 
			
		||||
    <string name="no_available_dir">Zəhmət olmasa, daha sonra tənzimləmələrdə endirmə qovluğunu təyin et</string>
 | 
			
		||||
    <string name="no_available_dir">Zəhmət olmasa, endirmə qovluğunu daha sonra tənzimləmələrdə təyin et</string>
 | 
			
		||||
    <string name="msg_running">NewPipe Endirilir</string>
 | 
			
		||||
    <string name="msg_calculating_hash">Hash hesablanır</string>
 | 
			
		||||
    <string name="settings_file_charset_title">Fayl adlarında icazə verilən simvollar</string>
 | 
			
		||||
    <string name="title_activity_about">NewPipe Haqqında</string>
 | 
			
		||||
    <string name="tab_licenses">Lisenziyalar</string>
 | 
			
		||||
    <string name="app_license">NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziyanın şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz.</string>
 | 
			
		||||
    <string name="app_license">NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziya şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz.</string>
 | 
			
		||||
    <string name="export_complete_toast">İxrac edildi</string>
 | 
			
		||||
    <string name="main_page_content_swipe_remove">Elementləri silmək üçün sürüşdür</string>
 | 
			
		||||
    <string name="no_playlist_bookmarked_yet">Hələ,əlfəcinlənmiş pleylistlər yoxdur</string>
 | 
			
		||||
@@ -705,7 +705,7 @@
 | 
			
		||||
    <string name="youtube_music_premium_content">Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil.</string>
 | 
			
		||||
    <string name="description_select_note">İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və keçidlər kliklənməyə bilər.</string>
 | 
			
		||||
    <string name="notification_scale_to_square_image_summary">Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs</string>
 | 
			
		||||
    <string name="notification_actions_summary">Aşağıdakı bildiriş fəaliyyətini hər birinin üzərinə toxunaraq redaktə edin. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərilməsi üçün onların üçə qədərini seç</string>
 | 
			
		||||
    <string name="notification_actions_summary">Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç</string>
 | 
			
		||||
    <string name="invalid_source">Belə fayl/məzmun mənbəyi yoxdur</string>
 | 
			
		||||
    <string name="selected_stream_external_player_not_supported">Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir</string>
 | 
			
		||||
    <string name="streams_not_yet_supported_removed">Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir</string>
 | 
			
		||||
@@ -718,7 +718,7 @@
 | 
			
		||||
    <string name="feed_toggle_show_future_items">Gələcək elementləri göstər</string>
 | 
			
		||||
    <string name="feed_toggle_hide_played_items">Baxılan elementləri gizlət</string>
 | 
			
		||||
    <string name="feed_toggle_hide_future_items">Gələcək elementləri gizlət</string>
 | 
			
		||||
    <string name="faq_description">Tətbiqdən istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabların yoxlanıldığına əmin olun!</string>
 | 
			
		||||
    <string name="faq_description">Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun!</string>
 | 
			
		||||
    <string name="faq_title">Tez-tez soruşulan suallar</string>
 | 
			
		||||
    <string name="faq">Veb Saytında bax</string>
 | 
			
		||||
    <string name="sort">Çeşidlə</string>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Daimi miniatürü ləğv et</string>
 | 
			
		||||
    <string name="card">Kart</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Buferə kopyalamaq alınmadı</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Boz rəngdə olan pleylistlərdə artıq bu element var.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Dublikat %d dəfə əlavə edildi</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -11,16 +11,16 @@
 | 
			
		||||
    <string name="settings">Nastavení</string>
 | 
			
		||||
    <string name="did_you_mean">Mysleli jste „%1$s“\?</string>
 | 
			
		||||
    <string name="share_dialog_title">Sdílet s</string>
 | 
			
		||||
    <string name="use_external_video_player_title">Použít externí video přehrávač</string>
 | 
			
		||||
    <string name="use_external_video_player_title">Použít externí přehrávač videí</string>
 | 
			
		||||
    <string name="use_external_audio_player_title">Použít externí audio přehrávač</string>
 | 
			
		||||
    <string name="download_path_audio_summary">Stažené audio je uloženo zde</string>
 | 
			
		||||
    <string name="download_path_audio_summary">Sem bude ukládáno stažené audio</string>
 | 
			
		||||
    <string name="download_path_audio_dialog_title">Zvolte adresář pro stažené audio soubory</string>
 | 
			
		||||
    <string name="download_path_audio_title">Adresář pro stažené audio</string>
 | 
			
		||||
    <string name="default_resolution_title">Výchozí rozlišení</string>
 | 
			
		||||
    <string name="play_with_kodi_title">Přehrát pomocí Kodi</string>
 | 
			
		||||
    <string name="kore_not_found">Nainstalovat chybějící aplikaci Kore\?</string>
 | 
			
		||||
    <string name="download_path_title">Adresář pro stažená videa</string>
 | 
			
		||||
    <string name="download_path_summary">Stažená videa jsou uložena tady</string>
 | 
			
		||||
    <string name="download_path_summary">Sem budou ukládána stažená videa</string>
 | 
			
		||||
    <string name="download_path_dialog_title">Zvolte adresář pro stažená videa</string>
 | 
			
		||||
    <string name="show_play_with_kodi_title">Zobrazit možnost „Přehrát pomocí Kodi“</string>
 | 
			
		||||
    <string name="show_play_with_kodi_summary">Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi</string>
 | 
			
		||||
@@ -213,7 +213,7 @@
 | 
			
		||||
    <string name="no_valid_zip_file">Žádný platný soubor ZIP</string>
 | 
			
		||||
    <string name="could_not_import_all_files">Upozornění: Nelze importovat všechny soubory.</string>
 | 
			
		||||
    <string name="override_current_data">Tímto se anuluje vaše aktuální nastavení.</string>
 | 
			
		||||
    <string name="video_player">Video přehrávač</string>
 | 
			
		||||
    <string name="video_player">Přehrávač videa</string>
 | 
			
		||||
    <string name="background_player">Přehrávač na pozadí</string>
 | 
			
		||||
    <string name="popup_player">Přehrávač v okně</string>
 | 
			
		||||
    <string name="preferred_player_fetcher_notification_title">Získávám informace…</string>
 | 
			
		||||
@@ -298,7 +298,7 @@
 | 
			
		||||
    <string name="playback_pitch">Výška tónu</string>
 | 
			
		||||
    <string name="unhook_checkbox">Odpojit (může způsobit zkreslení)</string>
 | 
			
		||||
    <string name="no_streams_available_download">Ke stažení nejsou dostupné žádné streamy</string>
 | 
			
		||||
    <string name="preferred_open_action_settings_title">Preferovaná \'otevřít\' akce</string>
 | 
			
		||||
    <string name="preferred_open_action_settings_title">Preferovaná akce „otevření“</string>
 | 
			
		||||
    <string name="preferred_open_action_settings_summary">Výchozí chování při otevírání obsahu — %s</string>
 | 
			
		||||
    <string name="caption_setting_title">Titulky</string>
 | 
			
		||||
    <string name="caption_setting_description">Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace</string>
 | 
			
		||||
@@ -550,7 +550,7 @@
 | 
			
		||||
    <string name="search_showing_result_for">Ukazuji výsledky pro: %s</string>
 | 
			
		||||
    <string name="never">Nikdy</string>
 | 
			
		||||
    <string name="wifi_only">Pouze na Wi-Fi</string>
 | 
			
		||||
    <string name="autoplay_summary">Zahájit playback automaticky — %s</string>
 | 
			
		||||
    <string name="autoplay_summary">Automaticky zahájit přehrávání — %s</string>
 | 
			
		||||
    <string name="title_activity_play_queue">Přehrát frontu</string>
 | 
			
		||||
    <string name="unsupported_url_dialog_message">Nelze rozpoznat zadané URL. Otevřít pomocí jiné aplikace\?</string>
 | 
			
		||||
    <string name="auto_queue_toggle">Auto-fronta</string>
 | 
			
		||||
@@ -668,7 +668,7 @@
 | 
			
		||||
    <string name="show_image_indicators_title">Ukázat indikátory obrázků</string>
 | 
			
		||||
    <string name="remote_search_suggestions">Vzdálené návrhy vyhledávání</string>
 | 
			
		||||
    <string name="local_search_suggestions">Lokální návrhy vyhledávání</string>
 | 
			
		||||
    <string name="start_main_player_fullscreen_summary">Pokud je vypnuté automatické otáčení, nespouštějte video v mini přehrávači, ale přepněte se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky</string>
 | 
			
		||||
    <string name="start_main_player_fullscreen_summary">Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky</string>
 | 
			
		||||
    <string name="enqueued_next">Další ve frontě</string>
 | 
			
		||||
    <string name="enqueue_next_stream">Přidat do fronty (další)</string>
 | 
			
		||||
    <string name="main_page_content_swipe_remove">Tažením položky odstraníte</string>
 | 
			
		||||
@@ -728,7 +728,7 @@
 | 
			
		||||
    <string name="feed_toggle_show_future_items">Zobrazit nadcházející položky</string>
 | 
			
		||||
    <string name="streams_not_yet_supported_removed">Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny</string>
 | 
			
		||||
    <string name="select_quality_external_players">Vyberte kvalitu pro externí přehrávače</string>
 | 
			
		||||
    <string name="no_video_streams_available_for_external_players">U externích přehrávačů nejsou dostupné žádné video streamy</string>
 | 
			
		||||
    <string name="no_video_streams_available_for_external_players">U externích přehrávačů nejsou k dispozici žádné videostreamy</string>
 | 
			
		||||
    <string name="feed_toggle_hide_played_items">Skrýt zhlédnuté položky</string>
 | 
			
		||||
    <string name="feed_toggle_hide_future_items">Skrýt nadcházející položky</string>
 | 
			
		||||
    <string name="faq_title">Často kladené dotazy</string>
 | 
			
		||||
@@ -743,4 +743,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Zrušení nastavení trvalého náhledu</string>
 | 
			
		||||
    <string name="card">Karta</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Kopírování do schránky se nezdařilo</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Zašedlé playlisty již obsahují tuto položku.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplikát přidán %dkrát</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Dauerhaftes Vorschaubild aufheben</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Kopieren in die Zwischenablage fehlgeschlagen</string>
 | 
			
		||||
    <string name="card">Karte</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplikat %d mal hinzugefügt</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Κατάργηση μόνιμης μικρογραφίας</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Αποτυχία αντιγραφής στο πρόχειρο</string>
 | 
			
		||||
    <string name="card">Κάρτα</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Οι λίστες αναπαραγωγής που είναι γκριζαρισμένες περιέχουν ήδη αυτό το στοιχείο.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Προστέθηκε διπλότυπο %d φορά(ες)</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -746,4 +746,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Desactivar las miniaturas permanente</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Error al copiar al portapapeles</string>
 | 
			
		||||
    <string name="card">Tarjeta</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicado añadido %d vez/veces</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Las listas de reproducción que están en gris ya contienen este elemento.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="msg_failed_to_copy">Lõikelauale kopeerimine ei õnnestunud</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Eemalda püsiv pisipilt</string>
 | 
			
		||||
    <string name="card">Kaart</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Hallina kuvatud esitusloendid juba sisaldavad seda kirjet.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Topeltkirje lisatud %d kord(a)</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -108,7 +108,7 @@
 | 
			
		||||
    <string name="title_activity_about">NewPipe aplikazioari buruz</string>
 | 
			
		||||
    <string name="title_licenses">Hirugarrengoen lizentziak</string>
 | 
			
		||||
    <string name="copyright" formatted="true">© %1$s %2$s. %3$s</string>
 | 
			
		||||
    <string name="tab_about">Honi buruz</string>
 | 
			
		||||
    <string name="tab_about">Honi buruz eta ohiko galderak</string>
 | 
			
		||||
    <string name="tab_licenses">Lizentziak</string>
 | 
			
		||||
    <string name="app_description">Androiderako streaming libre eta arina.</string>
 | 
			
		||||
    <string name="view_on_github">Ikusi GitHub zerbitzarian</string>
 | 
			
		||||
@@ -718,4 +718,18 @@
 | 
			
		||||
    <string name="select_quality_external_players">Hautatu kanpoko erreproduzigailuen kalitatea</string>
 | 
			
		||||
    <string name="feed_toggle_hide_future_items">Ezkutatu etorkizuneko elementuak</string>
 | 
			
		||||
    <string name="feed_toggle_hide_played_items">Ezkutatu ikusitako elementuak</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau.</string>
 | 
			
		||||
    <string name="faq">Webgunean ikusi</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Akatsa arbelera kopiatzean</string>
 | 
			
		||||
    <string name="faq_description">Arazoren bat baduzu aplikazioa erabiltzerakoan, irakur itzazu ohiko galdera hauen erantzunak!</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Betiko miniatura kendu</string>
 | 
			
		||||
    <string name="app_update_unavailable_toast">NewPipe-en azken bertsioa erabiltzen ari zara</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Sakatu %s deskargatzeko</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Kopia %d behin/aldiz gehitua</string>
 | 
			
		||||
    <string name="card">Txartela</string>
 | 
			
		||||
    <string name="night_theme_available">Aukera hau Gaiarako %s aukeratua badago soilik dago erabilgarri</string>
 | 
			
		||||
    <string name="sort">Ordenatu</string>
 | 
			
		||||
    <string name="fast_mode">Modu azkarra</string>
 | 
			
		||||
    <string name="import_subscriptions_hint">Hiru-puntutako menutik harpidetzak inportatu edo esportatu</string>
 | 
			
		||||
    <string name="faq_title">Maiz galdetutako galderak</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -743,4 +743,6 @@
 | 
			
		||||
    <string name="app_update_available_notification_text">Appuyez pour télécharger %s</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Échec de la copie dans le presse-papiers</string>
 | 
			
		||||
    <string name="night_theme_available">Cette option est disponible seulement si %s est sélectionné pour le thème</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Les listes de lecture grisées contiennent déjà cet élément.</string>
 | 
			
		||||
    <string name="card">Carte</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="msg_failed_to_copy">Produciuse un erro ao copiar no portapapeis</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Desactivala miniatura permanente</string>
 | 
			
		||||
    <string name="card">Tarxeta</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">As listas de reprodución que se atopan atenuadas xa conteñen este elemento.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicado engadido %d vez/veces</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -756,4 +756,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">ביטול הגדרת תמונה ייצוגית קבועה</string>
 | 
			
		||||
    <string name="card">כרטיס</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">ההעתקה ללוח הגזירים נכשלה</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">רשימות הנגינה שבוטלו וסומנו באפור כבר מכילות את הפריט הזה.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">הכפיל נוסף %d פעמים</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -717,4 +717,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Batalkan penetapan gambar kecil permanen</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Gagal menyalin ke papan klip</string>
 | 
			
		||||
    <string name="card">Kartu</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Daftar putar yang bewarna abu-abu sudah berisi item ini.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplikat ditambahkan %d kali</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -742,5 +742,7 @@
 | 
			
		||||
    <string name="night_theme_available">Questa opzione è disponibile solo se %s è selezionato come Tema</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Copia negli appunti non riuscita</string>
 | 
			
		||||
    <string name="card">Schede</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Disattiva la miniatura permanente</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Disattiva copertina permanente</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Le playlist in grigio contengono già questo elemento.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Doppione aggiunto %d volta/e</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -716,4 +716,6 @@
 | 
			
		||||
    <string name="import_subscriptions_hint">3 点メニューから登録チャンネルをインポートまたはエクスポートします</string>
 | 
			
		||||
    <string name="card">カード</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">クリップボードへのコピーに失敗しました</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">%d 回重複追加されました</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -715,4 +715,8 @@
 | 
			
		||||
    <string name="app_update_available_notification_text">%s를 다운로드하려면 탭하세요.</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">영구 썸네일 설정 해제</string>
 | 
			
		||||
    <string name="night_theme_available">이 옵션은 테마로 %s를 선택한 경우에만 사용할 수 있음</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">중복 추가 %d 번</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다.</string>
 | 
			
		||||
    <string name="card">카드</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">클립보드 복사 실패</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -21,18 +21,18 @@
 | 
			
		||||
    <string name="download_path_audio_dialog_title">Velg nedlastingsmappe for lydfiler</string>
 | 
			
		||||
    <string name="default_resolution_title">Forvalgt oppløsning</string>
 | 
			
		||||
    <string name="play_with_kodi_title">Spill av med Kodi</string>
 | 
			
		||||
    <string name="kore_not_found">Installer manglende Kore-program\?</string>
 | 
			
		||||
    <string name="kore_not_found">Installer manglende Kore-app\?</string>
 | 
			
		||||
    <string name="show_play_with_kodi_title">Vis \"Spill av med Kodi\"-valg</string>
 | 
			
		||||
    <string name="show_play_with_kodi_summary">Vis valg for avspilling via Kodi mediasenter</string>
 | 
			
		||||
    <string name="play_audio">Lyd</string>
 | 
			
		||||
    <string name="default_audio_format_title">Forvalgt lydformat</string>
 | 
			
		||||
    <string name="theme_title">Drakt</string>
 | 
			
		||||
    <string name="theme_title">Tema</string>
 | 
			
		||||
    <string name="dark_theme_title">Mørk</string>
 | 
			
		||||
    <string name="light_theme_title">Lys</string>
 | 
			
		||||
    <string name="download_dialog_title">Last ned</string>
 | 
			
		||||
    <string name="show_next_and_similar_title">Vis \"Neste\" og \"Lignende\" -videoer</string>
 | 
			
		||||
    <string name="unsupported_url">Nettadressen støttes ikke</string>
 | 
			
		||||
    <string name="content_language_title">Foretrukket innholdsspråk</string>
 | 
			
		||||
    <string name="content_language_title">Forvalgt innholdsspråk</string>
 | 
			
		||||
    <string name="settings_category_video_audio_title">Video og lyd</string>
 | 
			
		||||
    <string name="settings_category_appearance_title">Utseende</string>
 | 
			
		||||
    <string name="background_player_playing_toast">Spiller i bakgrunnen</string>
 | 
			
		||||
@@ -65,7 +65,7 @@
 | 
			
		||||
    <string name="downloads">Nedlastinger</string>
 | 
			
		||||
    <string name="downloads_title">Nedlastinger</string>
 | 
			
		||||
    <string name="error_report_title">Feilrapport</string>
 | 
			
		||||
    <string name="app_ui_crash">Program/brukergrensesnitt krasjet</string>
 | 
			
		||||
    <string name="app_ui_crash">App/brukergrensesnitt krasjet</string>
 | 
			
		||||
    <string name="pause">Pause</string>
 | 
			
		||||
    <string name="delete">Slett</string>
 | 
			
		||||
    <string name="checksum">Sjekksum</string>
 | 
			
		||||
@@ -77,7 +77,7 @@
 | 
			
		||||
    <string name="msg_running_detail">Trykk for detaljer</string>
 | 
			
		||||
    <string name="msg_wait">Vent…</string>
 | 
			
		||||
    <string name="msg_copied">Kopiert til utklippstavle</string>
 | 
			
		||||
    <string name="info_labels">Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nProgramspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon:</string>
 | 
			
		||||
    <string name="info_labels">Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nAppspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon:</string>
 | 
			
		||||
    <string name="start">Start</string>
 | 
			
		||||
    <string name="no_available_dir">Definer en nedlastingsmappe senere i innstillingene</string>
 | 
			
		||||
    <string name="title_activity_recaptcha">reCAPTCHA-oppgave</string>
 | 
			
		||||
@@ -241,15 +241,15 @@
 | 
			
		||||
    <string name="resize_fit">Tilpass</string>
 | 
			
		||||
    <string name="resize_fill">Fyll</string>
 | 
			
		||||
    <string name="resize_zoom">Forstørr</string>
 | 
			
		||||
    <string name="use_inexact_seek_title">Bruk rask unøyaktig blafring</string>
 | 
			
		||||
    <string name="settings_category_debug_title">Feilretting</string>
 | 
			
		||||
    <string name="use_inexact_seek_title">Bruk rask unøyaktig spoling</string>
 | 
			
		||||
    <string name="settings_category_debug_title">Feilsøking</string>
 | 
			
		||||
    <string name="file">Fil</string>
 | 
			
		||||
    <string name="invalid_directory">Ingen slik mappe</string>
 | 
			
		||||
    <string name="invalid_source">Ingen slik fil/innholdskilde</string>
 | 
			
		||||
    <string name="invalid_file">Filen finnes ikke eller så har du ikke tilgang til å lese eller skrive til den</string>
 | 
			
		||||
    <string name="file_name_empty_error">Filnavn kan ikke være tomt</string>
 | 
			
		||||
    <string name="error_occurred_detail">En feil inntraff: %1$s</string>
 | 
			
		||||
    <string name="caption_auto_generated">Auto-generert</string>
 | 
			
		||||
    <string name="caption_auto_generated">Autogenerert</string>
 | 
			
		||||
    <string name="import_title">Importer</string>
 | 
			
		||||
    <string name="import_from">Importer fra</string>
 | 
			
		||||
    <string name="export_to">Eksporter til</string>
 | 
			
		||||
@@ -282,10 +282,10 @@
 | 
			
		||||
    <string name="delete_search_history_alert">Slett hele søkehistorikken\?</string>
 | 
			
		||||
    <string name="search_history_deleted">Søkehistorikken er slettet</string>
 | 
			
		||||
    <string name="one_item_deleted">Ett element slettet.</string>
 | 
			
		||||
    <string name="toast_no_player">Inget program installert for avspilling av denne filen</string>
 | 
			
		||||
    <string name="toast_no_player">Ingen app installert for å spille av denne filen</string>
 | 
			
		||||
    <string name="caption_setting_title">Undertekster</string>
 | 
			
		||||
    <string name="caption_setting_description">Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft</string>
 | 
			
		||||
    <string name="app_license">NewPipe er copyleft-fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon.</string>
 | 
			
		||||
    <string name="app_license">NewPipe er copyleft fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon.</string>
 | 
			
		||||
    <string name="import_settings">Ønsker du også å importere innstillinger?</string>
 | 
			
		||||
    <string name="subscriptions_import_unsuccessful">Kunne ikke importere abonnementer</string>
 | 
			
		||||
    <string name="subscriptions_export_unsuccessful">Kunne ikke eksportere abonnementer</string>
 | 
			
		||||
@@ -295,7 +295,7 @@
 | 
			
		||||
\n2. Logg inn når forespurt
 | 
			
		||||
\n3. Klikk på \"All data inkludert\", så på \"Fjern merket for alle\", så på kun \"Abonnementer\", og klikk så \"OK\"
 | 
			
		||||
\n4. Klikk på \"Neste steg\" og så på \"Opprett eksport\"
 | 
			
		||||
\n5. Klikk på \"Last ned\"-knappen etter den vises%1$s
 | 
			
		||||
\n5. Klikk på \"Last ned\"-knappen etter den vises
 | 
			
		||||
\n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen
 | 
			
		||||
\n7. [Dersom .zip importen feiler] Pakk ut .csv filen (vanligvis under \"YouTube og YouTube Music/subscriptions/subscriptions.csv\"), klikk på IMPORTER FIL under og velg den utpakkede csv filen</string>
 | 
			
		||||
    <string name="import_soundcloud_instructions">Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID:
 | 
			
		||||
@@ -304,15 +304,15 @@
 | 
			
		||||
\n2. Gå til denne nettadressen: %1$s
 | 
			
		||||
\n3. Logg inn når forespurt
 | 
			
		||||
\n4. Kopier profil-nettadressen du ble videresendt til.</string>
 | 
			
		||||
    <string name="use_inexact_seek_summary">Unøyaktig blafring lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette</string>
 | 
			
		||||
    <string name="use_inexact_seek_summary">Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette</string>
 | 
			
		||||
    <string name="download_thumbnail_summary">Skru av for å stoppe innlasting av miniatyrbilder, noe som sparer data- og minnebruk. Endring av dette vil tømme både disk- og minne-hurtiglager</string>
 | 
			
		||||
    <string name="auto_queue_summary">Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm</string>
 | 
			
		||||
    <string name="enable_leak_canary_summary">Minnelekkasjeoppsyn kan forårsake programmet å opptre uresponsivt under haugdumping</string>
 | 
			
		||||
    <string name="enable_leak_canary_summary">Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping</string>
 | 
			
		||||
    <string name="enable_disposed_exceptions_title">Rapporter feil utenfor livssyklusen</string>
 | 
			
		||||
    <string name="enable_disposed_exceptions_summary">Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse</string>
 | 
			
		||||
    <string name="unhook_checkbox">Avhekt (kan forårsake forvrenging)</string>
 | 
			
		||||
    <string name="privacy_policy_title">NewPipes personvernspraksis</string>
 | 
			
		||||
    <string name="privacy_policy_encouragement">NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke programmet inn data uten ditt samtykke.
 | 
			
		||||
    <string name="privacy_policy_encouragement">NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke appen inn data uten ditt samtykke.
 | 
			
		||||
\nNewPipes personvernspraksis forklarer i detalj hvilken data som sendes og lagres når du sender en krasjrapport.</string>
 | 
			
		||||
    <string name="read_privacy_policy">Les personvernspraksis</string>
 | 
			
		||||
    <string name="start_accept_privacy_policy">For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye.
 | 
			
		||||
@@ -321,8 +321,8 @@
 | 
			
		||||
    <string name="decline">Avslå</string>
 | 
			
		||||
    <string name="limit_data_usage_none_description">Ubegrenset</string>
 | 
			
		||||
    <string name="limit_mobile_data_usage_title">Begrens oppløsning når mobildata brukes</string>
 | 
			
		||||
    <string name="minimize_on_exit_title">Minimer ved programbytte</string>
 | 
			
		||||
    <string name="minimize_on_exit_summary">Handling ved bytting til annet program fra hovedspiller — %s</string>
 | 
			
		||||
    <string name="minimize_on_exit_title">Minimer ved appbytte</string>
 | 
			
		||||
    <string name="minimize_on_exit_summary">Handling ved bytting til annen app fra hovedspiller — %s</string>
 | 
			
		||||
    <string name="minimize_on_exit_none_description">Ingen</string>
 | 
			
		||||
    <string name="minimize_on_exit_background_description">Minimer til bakgrunnsspiller</string>
 | 
			
		||||
    <string name="minimize_on_exit_popup_description">Minimer til oppsprettsspiller</string>
 | 
			
		||||
@@ -342,7 +342,7 @@
 | 
			
		||||
    <string name="settings_category_updates_title">Oppdateringer</string>
 | 
			
		||||
    <string name="events">Hendelser</string>
 | 
			
		||||
    <string name="file_deleted">Fil slettet</string>
 | 
			
		||||
    <string name="app_update_notification_channel_name">Programoppgraderingsmerknad</string>
 | 
			
		||||
    <string name="app_update_notification_channel_name">Varsel om appoppdatering</string>
 | 
			
		||||
    <string name="app_update_notification_channel_description">Merknader for nye NewPipe-versjoner</string>
 | 
			
		||||
    <string name="download_to_sdcard_error_title">Ekstern lagring utilgjengelig</string>
 | 
			
		||||
    <string name="download_to_sdcard_error_message">Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\?</string>
 | 
			
		||||
@@ -353,11 +353,11 @@
 | 
			
		||||
    <string name="main_page_content_summary">Hvilke faner vises på hovedsiden</string>
 | 
			
		||||
    <string name="conferences">Konferanser</string>
 | 
			
		||||
    <string name="updates_setting_title">Oppdatering</string>
 | 
			
		||||
    <string name="updates_setting_description">Varsle om programoppdatering når en ny versjon er tilgjengelig</string>
 | 
			
		||||
    <string name="list_view_mode">Listevisningmodus</string>
 | 
			
		||||
    <string name="updates_setting_description">Vis varsel om appoppdatering når en ny versjon er tilgjengelig</string>
 | 
			
		||||
    <string name="list_view_mode">Listevisningsmodus</string>
 | 
			
		||||
    <string name="list">Liste</string>
 | 
			
		||||
    <string name="grid">Rutenett</string>
 | 
			
		||||
    <string name="auto">Auto</string>
 | 
			
		||||
    <string name="auto">Automatisk</string>
 | 
			
		||||
    <string name="app_update_available_notification_title">Ny NewPipe-versjon er tilgjengelig!</string>
 | 
			
		||||
    <string name="missions_header_finished">Fullført</string>
 | 
			
		||||
    <string name="paused">pauset</string>
 | 
			
		||||
@@ -430,7 +430,7 @@
 | 
			
		||||
        <item quantity="one">%s lytter</item>
 | 
			
		||||
        <item quantity="other">%s lyttere</item>
 | 
			
		||||
    </plurals>
 | 
			
		||||
    <string name="localization_changes_requires_app_restart">Språket vil først bli endret etter at programmet har blitt omstartet</string>
 | 
			
		||||
    <string name="localization_changes_requires_app_restart">Språket vil endres etter at appen har startet på nytt</string>
 | 
			
		||||
    <string name="default_kiosk_page_summary">Standard kiosk</string>
 | 
			
		||||
    <string name="peertube_instance_url_title">PeerTube-instanser</string>
 | 
			
		||||
    <string name="local">Lokal</string>
 | 
			
		||||
@@ -449,7 +449,7 @@
 | 
			
		||||
    <string name="playlist_no_uploader">Autogenerert (fant ingen opplaster)</string>
 | 
			
		||||
    <string name="recovering">gjenoppretter</string>
 | 
			
		||||
    <string name="error_download_resource_gone">Kan ikke gjenopprette denne nedlastingen</string>
 | 
			
		||||
    <string name="seek_duration_title">Hurtigframoverspoling/-tilbakeblafringsvarighet</string>
 | 
			
		||||
    <string name="seek_duration_title">Hurtigframoverspoling/-tilbakespolingsvarighet</string>
 | 
			
		||||
    <string name="permission_display_over_apps">Gi tillatelse til å vise over andre apper</string>
 | 
			
		||||
    <string name="app_language_title">Programspråk</string>
 | 
			
		||||
    <string name="systems_language">Systemforvalg</string>
 | 
			
		||||
@@ -486,7 +486,7 @@
 | 
			
		||||
    <string name="feed_group_dialog_empty_selection">Ingen abonnement valgt</string>
 | 
			
		||||
    <string name="feed_group_dialog_select_subscriptions">Velg abonnementer</string>
 | 
			
		||||
    <string name="feed_groups_header_title">Kanalgrupper</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_disable_button">Skru av raskt modus</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_disable_button">Skru av hurtigmodus</string>
 | 
			
		||||
    <string name="feed_update_threshold_title">Strømoppdateringsterskel</string>
 | 
			
		||||
    <string name="settings_category_feed_title">Strøm</string>
 | 
			
		||||
    <string name="feed_processing_message">Behandler strøm…</string>
 | 
			
		||||
@@ -505,7 +505,7 @@
 | 
			
		||||
    <string name="remove_watched">Fjern sette</string>
 | 
			
		||||
    <string name="channel_created_by">Opprettet av %s</string>
 | 
			
		||||
    <string name="video_detail_by">Av %s</string>
 | 
			
		||||
    <string name="youtube_restricted_mode_enabled_title">Slå på YouTubes \"begrensede modus\"</string>
 | 
			
		||||
    <string name="youtube_restricted_mode_enabled_title">Slå på YouTubes \"Begrenset modus\"</string>
 | 
			
		||||
    <string name="never">Aldri</string>
 | 
			
		||||
    <string name="wifi_only">Kun på Wi-Fi</string>
 | 
			
		||||
    <string name="select_a_playlist">Velg en spilleliste</string>
 | 
			
		||||
@@ -524,7 +524,7 @@
 | 
			
		||||
\n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig.
 | 
			
		||||
\n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig.
 | 
			
		||||
\n
 | 
			
		||||
\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skjelne mellom sanntidsvideoer og normale) og det kan gi færre elementer.
 | 
			
		||||
\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skille mellom direktesendinger og normale videoer) og det kan gi færre elementer.
 | 
			
		||||
\n
 | 
			
		||||
\nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal.
 | 
			
		||||
\n
 | 
			
		||||
@@ -537,17 +537,17 @@
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_summary">Tilgjengelig i noen tjenester, det er vanligvis mye raskere, men kan gi et begrenset antall elementer, og ofte ufullstendig informasjon (f.eks. ingen varighet, elementtype, eller sanntidsstatus)</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_title">Hent fra dedikert strøm når tilgjengelig</string>
 | 
			
		||||
    <string name="feed_update_threshold_summary">Tid siden siste oppdatering før et abonnement vurderes utdatert — %s</string>
 | 
			
		||||
    <string name="new_seek_duration_toast">Som følge av begrensninger i ExoPlayer er blafringsdistansen begrenset til %d sekunder</string>
 | 
			
		||||
    <string name="new_seek_duration_toast">Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder</string>
 | 
			
		||||
    <string name="remove_watched_popup_warning">Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet.
 | 
			
		||||
\nEr du sikker\? Dette kan ikke angres!</string>
 | 
			
		||||
    <string name="autoplay_summary">Start avspilling automatisk — %s</string>
 | 
			
		||||
    <string name="unsupported_url_dialog_message">Kunne ikke gjenkjenne angitt nettadresse. Åpne den med annet program\?</string>
 | 
			
		||||
    <string name="unsupported_url_dialog_message">Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\?</string>
 | 
			
		||||
    <string name="content_not_supported">Innholdet støttes ikke enda av NewPipe.
 | 
			
		||||
\n
 | 
			
		||||
\nStøtte vil forhåpentligvis komme til i en senere versjon.</string>
 | 
			
		||||
    <string name="playlist_page_summary">Spillelisteside</string>
 | 
			
		||||
    <string name="detail_sub_channel_thumbnail_view_description">Kanalens avatar-miniatyrbilde</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_enable_button">Skru på raskt modus</string>
 | 
			
		||||
    <string name="feed_use_dedicated_fetch_method_enable_button">Skru på hurtigmodus</string>
 | 
			
		||||
    <string name="feed_group_show_only_ungrouped_subscriptions">Vis kun ugrupperte abonnementer</string>
 | 
			
		||||
    <string name="title_activity_play_queue">Spill kø</string>
 | 
			
		||||
    <string name="no_playlist_bookmarked_yet">Ingen spillelistebokmerker enda</string>
 | 
			
		||||
@@ -595,18 +595,18 @@
 | 
			
		||||
    <string name="soundcloud_go_plus_content">Dette er et spor fra SoundCloud Go+, ihvertfall i ditt land, så det kan ikke strømmes eller lastes ned av NewPipe.</string>
 | 
			
		||||
    <string name="georestricted_content">Innholdet er ikke tilgjengelig i din region.</string>
 | 
			
		||||
    <string name="download_has_started">Nedlastingen har startet</string>
 | 
			
		||||
    <string name="select_night_theme_toast">Du kan velge din favorittnattdrakt nedenfor</string>
 | 
			
		||||
    <string name="night_theme_summary">Velg din favorittnattdrakt — %s</string>
 | 
			
		||||
    <string name="auto_device_theme_title">Automatisk (enhetsdrakt)</string>
 | 
			
		||||
    <string name="select_night_theme_toast">Du kan velge ditt favorittnattema nedenfor</string>
 | 
			
		||||
    <string name="night_theme_summary">Velg ditt favorittnattema — %s</string>
 | 
			
		||||
    <string name="auto_device_theme_title">Automatisk (enhetstema)</string>
 | 
			
		||||
    <string name="radio">Radio</string>
 | 
			
		||||
    <string name="featured">Framhevet</string>
 | 
			
		||||
    <string name="recaptcha_solve">Løs</string>
 | 
			
		||||
    <string name="night_theme_title">Nattdrakt</string>
 | 
			
		||||
    <string name="night_theme_title">Nattema</string>
 | 
			
		||||
    <string name="show_channel_details">Vis kanaldetaljer</string>
 | 
			
		||||
    <string name="disable_media_tunneling_summary">Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking</string>
 | 
			
		||||
    <string name="disable_media_tunneling_title">Skru av media-tunnelering</string>
 | 
			
		||||
    <string name="description_select_note">Du kan nå velge tekst inne i beskrivelsen. Merk at siden kan flimre og lenker er kanskje ikke klikkbare i utvalgsmodus.</string>
 | 
			
		||||
    <string name="feed_load_error_fast_unknown">Raskt modus for informasjonskanal tilbyr ikke mer info om dette.</string>
 | 
			
		||||
    <string name="feed_load_error_fast_unknown">Hurtigmodus for informasjonskanal tilbyr ikke mer info om dette.</string>
 | 
			
		||||
    <string name="feed_load_error_terminated">Skaperens konto har blitt terminert.
 | 
			
		||||
\nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden.
 | 
			
		||||
\nØnsker du å oppheve ditt abonnement på denne kanalen\?</string>
 | 
			
		||||
@@ -619,7 +619,7 @@
 | 
			
		||||
    <string name="feed_load_error">Kunne ikke laste inn informasjonskanal</string>
 | 
			
		||||
    <string name="downloads_storage_use_saf_summary_api_29">Fra Android 10 er kun «lagringstilgangsrammeverk» støttet</string>
 | 
			
		||||
    <string name="downloads_storage_ask_summary_no_saf_notice">Du vil bli spurt om hvor du vil lagre hver nedlastning</string>
 | 
			
		||||
    <string name="seekbar_preview_thumbnail_title">Forhåndsvisning av miniatyrbilde i søkefelt</string>
 | 
			
		||||
    <string name="seekbar_preview_thumbnail_title">Forhåndsvisning av miniatyrbilde på spolelinjen</string>
 | 
			
		||||
    <string name="no_dir_yet">Ingen nedlastingsmappe er satt ennå, velg en standard nedlastingsmappe nå</string>
 | 
			
		||||
    <string name="off">Av</string>
 | 
			
		||||
    <string name="on">På</string>
 | 
			
		||||
@@ -722,4 +722,12 @@
 | 
			
		||||
    <string name="sort">Sorter</string>
 | 
			
		||||
    <string name="toggle_all">Velg alle</string>
 | 
			
		||||
    <string name="faq_description">Hvis du har problemer med å bruke appen, så bør du sjekke ut disse svarene fra generelle spørsmål!</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Skru av vedvarende miniatyrbilde</string>
 | 
			
		||||
    <string name="night_theme_available">Dette valget er kun tilgjengelig dersom %s er valgt som tema</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Klarte ikke å kopiere til utklippstavlen</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Trykk for å laste ned %s</string>
 | 
			
		||||
    <string name="app_update_unavailable_toast">Du bruker den nyeste versjonen av NewPipe</string>
 | 
			
		||||
    <string name="card">Kort</string>
 | 
			
		||||
    <string name="import_subscriptions_hint">Importer eller eksporter fra trepunktsmenyen</string>
 | 
			
		||||
    <string name="fast_mode">Hurtigmodus</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -727,7 +727,9 @@
 | 
			
		||||
    <string name="app_update_unavailable_toast">U heeft de laatste versie van NewPipe</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Klik om %s te downloaden</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Kon niet naar klembord kopiëren</string>
 | 
			
		||||
    <string name="night_theme_available">Deze instelling is alleen beschikbaar als %s als thema ingesteld is</string>
 | 
			
		||||
    <string name="night_theme_available">Deze instelling is alleen beschikbaar als %s als Thema ingesteld is</string>
 | 
			
		||||
    <string name="card">Kaart</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Miniatuur niet ingesteld</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">De afspeellijsten die grijs zijn, bevatten dit item al.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicaat is %d tijd(en) toegevoegd</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="card">କାର୍ଡ</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">କ୍ଲିପବୋର୍ଡରେ କପି କରିବାରେ ବିଫଳ</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">ଧୂସର ହୋଇଯାଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ ପୂର୍ବରୁ ଏହି ଆଇଟମ୍ ଧାରଣ କରିଥାଏ ।</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">ନକଲ %d ସମୟ (ମୋଟ) ଯୋଡି ହୋଇଛି</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -422,7 +422,7 @@
 | 
			
		||||
    <string name="error_timeout">Minął czas połączenia</string>
 | 
			
		||||
    <string name="downloads_storage_use_saf_title">Używaj systemowego selektora folderów (SAF)</string>
 | 
			
		||||
    <string name="downloads_storage_use_saf_summary">Systemowy selektor folderów (SAF) umożliwia pobieranie na kartę pamięci</string>
 | 
			
		||||
    <string name="clear_playback_states_title">Usuń pozycje odtwarzania</string>
 | 
			
		||||
    <string name="clear_playback_states_title">Wyczyść pozycje odtwarzania</string>
 | 
			
		||||
    <string name="clear_playback_states_summary">Usuwa wszystkie pozycje odtwarzania</string>
 | 
			
		||||
    <string name="delete_playback_states_alert">Usunąć wszystkie pozycje odtwarzania\?</string>
 | 
			
		||||
    <string name="drawer_header_description">Przełącz usługę, aktualnie wybrana:</string>
 | 
			
		||||
@@ -531,7 +531,7 @@
 | 
			
		||||
    <string name="artists">Artyści</string>
 | 
			
		||||
    <string name="albums">Albumy</string>
 | 
			
		||||
    <string name="songs">Piosenki</string>
 | 
			
		||||
    <string name="restricted_video">To wideo ma ograniczenia wiekowe.
 | 
			
		||||
    <string name="restricted_video">To wideo jest objęte ograniczeniem wiekowym.
 | 
			
		||||
\n
 | 
			
		||||
\nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć.</string>
 | 
			
		||||
    <string name="remove_watched_popup_yes_and_partially_watched_videos">Tak, i częściowo obejrzane wideo</string>
 | 
			
		||||
@@ -578,7 +578,7 @@
 | 
			
		||||
    <string name="enqueued">Dodano do kolejki</string>
 | 
			
		||||
    <string name="enqueue_stream">Dodaj do kolejki</string>
 | 
			
		||||
    <string name="show_memory_leaks">Pokaż wycieki pamięci</string>
 | 
			
		||||
    <string name="clear_cookie_summary">Wyczyść ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA</string>
 | 
			
		||||
    <string name="clear_cookie_summary">Usuwa ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA</string>
 | 
			
		||||
    <string name="recaptcha_cookies_cleared">Ciasteczka reCAPTCHA zostały wyczyszczone</string>
 | 
			
		||||
    <string name="clear_cookie_title">Wyczyść ciasteczka reCAPTCHA</string>
 | 
			
		||||
    <string name="youtube_restricted_mode_enabled_summary">YouTube udostępnia „Tryb ograniczonego dostępu”, który ukrywa potencjalne treści dla dorosłych</string>
 | 
			
		||||
@@ -751,4 +751,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Usuń stałą miniaturę</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Nie udało się skopiować do schowka</string>
 | 
			
		||||
    <string name="card">Karta</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Wyszarzone playlisty zawierają już tę pozycję</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Dodano duplikat %d raz(y)</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -743,4 +743,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Desativar miniatura permanente</string>
 | 
			
		||||
    <string name="card">Cartão</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Falha ao copiar para a área de transferência</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicata adicionada %d vez(es)</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">As playlists em cinza já contêm este item.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Desativar miniatura permanente</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Não foi possível copiar para a área de transferência</string>
 | 
			
		||||
    <string name="card">Cartão</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">As listas de reprodução acinzentadas já contêm este item.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicar adicionado %d vez(es)</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -739,8 +739,10 @@
 | 
			
		||||
    <string name="import_subscriptions_hint">Importar ou exportar subscrições do menu de 3 pontos</string>
 | 
			
		||||
    <string name="app_update_unavailable_toast">Já está a executar a versão mais recente do NewPipe</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Toque para descarregar %s</string>
 | 
			
		||||
    <string name="night_theme_available">Esta opção só está disponível se %s for selecionado para o tema</string>
 | 
			
		||||
    <string name="night_theme_available">Esta opção só está disponível se estiver selecionado %s para o tema</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Desativar miniatura permanente</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Não foi possível copiar para a área de transferência</string>
 | 
			
		||||
    <string name="card">Cartão</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">As listas de reprodução acinzentadas já contêm este item.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicar adicionado %d vez(es)</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -740,4 +740,7 @@
 | 
			
		||||
    <string name="app_update_unavailable_toast">Rulați cea mai recentă versiune NewPipe</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Atingeți pentru a descărca %s</string>
 | 
			
		||||
    <string name="night_theme_available">Această opțiune este disponibilă numai dacă %s este selectată ca temă</string>
 | 
			
		||||
    <string name="card">Cartelă</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Nu s-a reușit copierea în clipboard</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Dezactivare miniatură permanentă</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -661,7 +661,7 @@
 | 
			
		||||
    <string name="high_quality_larger">Высокое качество (крупнее)</string>
 | 
			
		||||
    <string name="seekbar_preview_thumbnail_title">Миниатюра над полосой прокрутки</string>
 | 
			
		||||
    <string name="detail_heart_img_view_description">Автору видео понравилось это</string>
 | 
			
		||||
    <string name="mark_as_watched">Пометить просмотренными</string>
 | 
			
		||||
    <string name="mark_as_watched">Пометить проигранным</string>
 | 
			
		||||
    <string name="show_image_indicators_summary">Picasso: указать цветом источник изображений (красный — сеть, синий — диск, зелёный — память)</string>
 | 
			
		||||
    <string name="show_image_indicators_title">Цветные метки на изображениях</string>
 | 
			
		||||
    <string name="remote_search_suggestions">Серверные предложения поиска</string>
 | 
			
		||||
@@ -747,4 +747,6 @@
 | 
			
		||||
    <string name="msg_failed_to_copy">Не удалось скопировать в буфер обмена</string>
 | 
			
		||||
    <string name="night_theme_available">Доступно, когда Тема установлена в %s</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Убрать постоянную миниатюру</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Дубликат добавлен %d раз(а)</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Плейлисты, выделенные серым уже содержат этот объект.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="card">Carta</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Còpia in punta de billete fallida</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Disativa sa miniadura permanente</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Sas iscalitas in colore murru tenent giai custu elementu.</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplicadu annantu %d borta(s)</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -735,4 +735,14 @@
 | 
			
		||||
    <string name="faq">Pozrieť na webovej stránke</string>
 | 
			
		||||
    <string name="sort">Usporiadať</string>
 | 
			
		||||
    <string name="faq_description">Ak máte problémy s používaním aplikácie, určite si prečítajte tieto odpovede na časté otázky!</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Vypnutie trvalého náhľadu</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Kopírovanie do schránky zlyhalo</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Zoznamy zobrazené šedou farbou už obsahujú danú položku.</string>
 | 
			
		||||
    <string name="card">Karta</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Dotykom stiahnite %s</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Duplikát bol pridaný %d-krát</string>
 | 
			
		||||
    <string name="app_update_unavailable_toast">Používate najnovšiu verziu NewPipe</string>
 | 
			
		||||
    <string name="night_theme_available">Táto možnosť je dostupná len pre motív %s</string>
 | 
			
		||||
    <string name="fast_mode">Rýchly režim</string>
 | 
			
		||||
    <string name="import_subscriptions_hint">Import alebo export odberov z 3-bodkovej ponuky</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -727,4 +727,7 @@
 | 
			
		||||
    <string name="app_update_unavailable_toast">Du använder den senaste versionen av NewPipe</string>
 | 
			
		||||
    <string name="app_update_available_notification_text">Tryck för att ladda ner %s</string>
 | 
			
		||||
    <string name="night_theme_available">Det här alternativet är endast tillgängligt om %s har valts som Tema</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Inaktivera permanent miniatyrbild</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Det gick inte att kopiera till urklipp</string>
 | 
			
		||||
    <string name="card">Kort</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
    <string name="settings">ตั้งค่า</string>
 | 
			
		||||
    <string name="did_you_mean">หรือคุณหมายถึง \"%1$s\"\?</string>
 | 
			
		||||
    <string name="share_dialog_title">แชร์ด้วย</string>
 | 
			
		||||
    <string name="use_external_video_player_title">Use external video player</string>
 | 
			
		||||
    <string name="use_external_video_player_title">ใช้เครื่องเล่นวีดิโอภายนอก</string>
 | 
			
		||||
    <string name="use_external_audio_player_title">ใช้แอปเล่นเสียงภายนอก</string>
 | 
			
		||||
    <string name="subscribe_button_title">ติดตาม</string>
 | 
			
		||||
    <string name="subscribed_button_title">ติดตามแล้ว</string>
 | 
			
		||||
@@ -357,7 +357,7 @@
 | 
			
		||||
    <string name="pause_downloads_on_mobile">หยุดชั่วคราวเมื่อเปลี่ยนเป็นข้อมูลมือถือ</string>
 | 
			
		||||
    <string name="pause_downloads_on_mobile_desc">การดาวน์โหลดที่ไม่สามารถหยุดพักได้จะเริ่มต้นใหม่</string>
 | 
			
		||||
    <string name="close">ปิด</string>
 | 
			
		||||
    <string name="use_external_video_player_summary">Removes audio at some resolutions</string>
 | 
			
		||||
    <string name="use_external_video_player_summary">บางความละเอียดอาจไม่มีเสียง</string>
 | 
			
		||||
    <string name="metadata_cache_wipe_complete_notice">แคช metadate ถูกลบแล้ว</string>
 | 
			
		||||
    <string name="resume_on_audio_focus_gain_title">เล่นต่อหลังจากการขัดจังหวะ</string>
 | 
			
		||||
    <string name="enable_playback_resume_title">เล่นต่อ</string>
 | 
			
		||||
@@ -369,4 +369,13 @@
 | 
			
		||||
    <string name="open_with">เปิดด้วย</string>
 | 
			
		||||
    <string name="mark_as_watched">ทำเครื่องหมายว่าดูแล้ว</string>
 | 
			
		||||
    <string name="ok">ตกลง</string>
 | 
			
		||||
    <string name="notification_action_3_title">ปุ่มการกระทำที่สี่</string>
 | 
			
		||||
    <string name="notification_action_0_title">ปุ่มการกระทำแรก</string>
 | 
			
		||||
    <string name="notification_action_2_title">ปุ่มการกระทำที่สาม</string>
 | 
			
		||||
    <string name="notification_action_4_title">ปุ่มการกระทำที่ห้า</string>
 | 
			
		||||
    <string name="notification_actions_summary">แก้ไขการกระทำของการแต่การแจ้งเตือนด้วยการแตะไปที่มัน เลือกสามรายการที่จะแสดงในการแจ้งเตือนในการแจ้งเตือนแบบกระทัดรัดโดยใช้ปุ่มกาเครื่องหมายทางขวา</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="crash_the_player">ทำเครื่องเล่นพัง</string>
 | 
			
		||||
    <string name="notification_action_1_title">ปุ่มการกระทำรอง</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -730,4 +730,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Kalıcı küçük resmin ayarını kaldır</string>
 | 
			
		||||
    <string name="card">Kart</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Panoya kopyalanamadı</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">%d kez kopyası eklendi</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">Gri oynatma listeleri halihazırda bu ögeyi içeriyor.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -52,7 +52,7 @@
 | 
			
		||||
    <string name="error_snackbar_action">Звіт</string>
 | 
			
		||||
    <string name="what_device_headline">Інформація:</string>
 | 
			
		||||
    <string name="what_happened_headline">Що сталося:</string>
 | 
			
		||||
    <string name="main_bg_subtitle">Натисніть на «лупу», щоб почати.</string>
 | 
			
		||||
    <string name="main_bg_subtitle">Торкніться лупи, щоб розпочати.</string>
 | 
			
		||||
    <string name="black_theme_title">Чорна</string>
 | 
			
		||||
    <string name="downloads">Завантаження</string>
 | 
			
		||||
    <string name="downloads_title">Завантаження</string>
 | 
			
		||||
@@ -747,4 +747,6 @@
 | 
			
		||||
    <string name="unset_playlist_thumbnail">Прибрати постійну мініатюру</string>
 | 
			
		||||
    <string name="card">Картки</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">Не вдалося скопіювати до буфера обміну</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">Дублікат додано %d раз(ів)</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">У виділених сірим кольором добірках цей елемент уже є.</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -605,7 +605,7 @@
 | 
			
		||||
    <string name="metadata_support">支持</string>
 | 
			
		||||
    <string name="metadata_language">语言</string>
 | 
			
		||||
    <string name="metadata_age_limit">年龄限制</string>
 | 
			
		||||
    <string name="metadata_privacy">私有性</string>
 | 
			
		||||
    <string name="metadata_privacy">私密性</string>
 | 
			
		||||
    <string name="metadata_licence">许可</string>
 | 
			
		||||
    <string name="metadata_tags">标签</string>
 | 
			
		||||
    <string name="metadata_category">类别</string>
 | 
			
		||||
@@ -716,5 +716,7 @@
 | 
			
		||||
    <string name="night_theme_available">只有在主题中选择了 %s 该选项才可用</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">取消设置永久缩略图</string>
 | 
			
		||||
    <string name="card">卡片</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">未能复制到剪贴板</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">无法复制到剪贴板</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">变灰的播放列表已经包含此项目。</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">重复添加了 %d 次</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -717,4 +717,6 @@
 | 
			
		||||
    <string name="night_theme_available">色系揀做%s嘅時候至有得揀</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">複製唔到去剪貼簿</string>
 | 
			
		||||
    <string name="card">一張張</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">灰咗嘅播放清單,即係已經有呢個項目。</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">重複加入咗 %d 次</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -717,4 +717,6 @@
 | 
			
		||||
    <string name="card">卡片</string>
 | 
			
		||||
    <string name="unset_playlist_thumbnail">取消設定永久縮圖</string>
 | 
			
		||||
    <string name="msg_failed_to_copy">無法複製到剪貼簿</string>
 | 
			
		||||
    <string name="playlist_add_stream_success_duplicate">重複新增 %d 次</string>
 | 
			
		||||
    <string name="duplicate_in_playlist">變灰的播放清單已經包含此項目。</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -13,7 +13,6 @@ import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.junit.Assert.assertNotEquals;
 | 
			
		||||
import static org.junit.Assert.assertNull;
 | 
			
		||||
import static org.junit.Assert.assertSame;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
@@ -169,7 +168,8 @@ public class PlayQueueTest {
 | 
			
		||||
            final List<PlayQueueItem> streams = Collections.nCopies(5, item1);
 | 
			
		||||
            final PlayQueue queue1 = makePlayQueue(0, streams);
 | 
			
		||||
            final PlayQueue queue2 = makePlayQueue(0, streams);
 | 
			
		||||
            assertEquals(queue1, queue2);
 | 
			
		||||
            assertTrue(queue1.equalStreams(queue2));
 | 
			
		||||
            assertTrue(queue1.equalStreamsAndIndex(queue2));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Test
 | 
			
		||||
@@ -177,7 +177,8 @@ public class PlayQueueTest {
 | 
			
		||||
            final List<PlayQueueItem> streams = Collections.nCopies(5, item1);
 | 
			
		||||
            final PlayQueue queue1 = makePlayQueue(1, streams);
 | 
			
		||||
            final PlayQueue queue2 = makePlayQueue(4, streams);
 | 
			
		||||
            assertEquals(queue1, queue2);
 | 
			
		||||
            assertTrue(queue1.equalStreams(queue2));
 | 
			
		||||
            assertFalse(queue1.equalStreamsAndIndex(queue2));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Test
 | 
			
		||||
@@ -186,7 +187,7 @@ public class PlayQueueTest {
 | 
			
		||||
            final List<PlayQueueItem> streams2 = Collections.nCopies(5, item2);
 | 
			
		||||
            final PlayQueue queue1 = makePlayQueue(0, streams1);
 | 
			
		||||
            final PlayQueue queue2 = makePlayQueue(0, streams2);
 | 
			
		||||
            assertNotEquals(queue1, queue2);
 | 
			
		||||
            assertFalse(queue1.equalStreams(queue2));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Test
 | 
			
		||||
@@ -195,7 +196,7 @@ public class PlayQueueTest {
 | 
			
		||||
            final List<PlayQueueItem> streams2 = Collections.nCopies(6, item2);
 | 
			
		||||
            final PlayQueue queue1 = makePlayQueue(0, streams1);
 | 
			
		||||
            final PlayQueue queue2 = makePlayQueue(0, streams2);
 | 
			
		||||
            assertNotEquals(queue1, queue2);
 | 
			
		||||
            assertFalse(queue1.equalStreams(queue2));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user