Merge branch 'master' into dev
This commit is contained in:
commit
a17c32fada
142 changed files with 1736 additions and 521 deletions
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue