Merge branch 'master' into dev

This commit is contained in:
Stypox 2023-02-08 22:48:14 +01:00
commit e0cb2892b8
No known key found for this signature in database
GPG key ID: 4BDF1B40A49FDD23
142 changed files with 1736 additions and 521 deletions

View file

@ -20,8 +20,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdk 21
targetSdk 33
versionCode 991
versionName "0.24.1"
versionCode 992
versionName "0.25.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -106,7 +106,7 @@ ext {
androidxWorkVersion = '2.7.1'
icepickVersion = '3.2.0'
exoPlayerVersion = '2.18.2'
exoPlayerVersion = '2.18.1'
googleAutoServiceVersion = '1.0.1'
groupieVersion = '2.10.1'
markwonVersion = '4.6.2'
@ -183,7 +183,7 @@ sonar {
dependencies {
/** Desugaring **/
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2'
/** NewPipe libraries **/
// You can use a local version by uncommenting a few lines in settings.gradle
@ -191,7 +191,7 @@ dependencies {
// name and the commit hash with the commit hash of the (pushed) commit you want to test
// This works thanks to JitPack: https://jitpack.io/
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:2211a24b6934a8a8cdf5547ea1b52daa4cb5de6c'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:7e793c11aec46358ccbfd8bcfcf521105f4f093a'
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
/** Checkstyle **/

View file

@ -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/" />

View file

@ -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);
}

View file

@ -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();

View file

@ -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() {
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);
// 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));
}
final String newVal = itemContentView.getText().subSequence(0, end) + "";
// 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;
}
linkify();
itemContentView.setMaxLines(COMMENT_DEFAULT_LINES);
if (hasEllipsis) {
denyLinkFocus();
} else {
determineLinkFocus();
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;
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);
}
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;
}
});
}
}

View file

@ -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());

View file

@ -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() {

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -89,14 +89,12 @@ public final class ShareUtils {
if (defaultPackageName.equals("android")) {
// 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 {
// 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
@ -104,7 +102,6 @@ public final class ShareUtils {
openAppChooser(context, intent, true);
}
}
}
return true;
}

View file

@ -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;
}
}

View file

@ -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

View file

@ -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
* @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 disposables disposables created by the method are added here and their lifecycle
* should be handled by the calling class
* @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,
public static void fromHtml(@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);
@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
* @param relatedInfoService if given, handle 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 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,
public static void fromPlainText(@NonNull final TextView textView,
@NonNull final String plainTextBlock,
@Nullable final Info relatedInfo,
@NonNull final CompositeDisposable disposables) {
@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
* @param relatedInfoService if given, handle 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 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 textView the {@link TextView} to 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 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,
private static void changeLinkIntents(@NonNull final TextView textView,
@NonNull final CharSequence chars,
@Nullable final Info relatedInfo,
@NonNull final CompositeDisposable disposables) {
textView.setMovementMethod(LongPressLinkMovementMethod.getInstance());
@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);
}
}
}

View file

@ -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

View file

@ -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>

View file

@ -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">ı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">ı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 &amp; 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"></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ı</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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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"></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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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));
}
}
}

View file

@ -0,0 +1 @@
https://hosted.weblate.org/translate/newpipe/metadata/bn/?checksum=2a64aca6716bd69b

View file

@ -0,0 +1,17 @@
Novinky
• Počet odběratelů v podrobnostech videa
• Stahování z fronty
• Permanentní nastavení náhledu playlistu
• Dlouhé podržení hashtagů a odkazů
• Režim zobrazení v kartách
Vylepšení
• Větší tlačítko k zavření minipřehrávače
• Jemnější zmenšování náhledů
• Cíl Android 13 (API 33)
• Posouvání v přehrávači jej již nezastaví
Opravy
• Oprava překrytí s DeX/myší
• Povolení přehrávače na pozadí bez oddělených streamů zvuku
• Různé opravy YouTube a další…

View file

@ -1,14 +1,14 @@
Neu
- Abonnementgruppen und sortierte Feeds
- Stummschalttaste in Playern
Neu:
Abonnementgruppen und sortierte Feeds
Stummschalttaste in Playern
Verbessert
- Das Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt
- Zwei Einstellungen wurden von "Erscheinungsbild" zu "Inhalt" verschoben
- Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist
Verbessert:
Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt
• Zwei Einstellungen von „Erscheinungsbild“ zu „Inhalt“ verschoben
Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist
Behoben
- einige WebM-Videos sind nicht suchbar
- Datenbank-Backup auf Android P
- Absturz beim Teilen einer heruntergeladenen Datei
- YouTube-Extraktionsprobleme, ...
Behoben:
• Einige WebM-Videos sind nicht suchbar
Datenbank-Backup auf Android P
Absturz beim Teilen einer heruntergeladenen Datei
• YouTube-Extraktionsprobleme und mehr …

View file

@ -1,15 +1,15 @@
Neu+verbessert
Option Miniansicht Ausblenden auf Sperrbildschirm wieder hinzugefügt
•Ziehen zum Feed aktualisieren
•Verbesserte Leistung beim Abruf lokaler Listen
Neu und verbessert:
Option Vorschaubild auf Sperrbildschirm ausblenden wieder hinzugefügt
Ziehen zum Feed aktualisieren
Verbesserte Leistung beim Abruf lokaler Listen
Behoben
Absturz, Start von NewPipe, nachdem es aus dem RAM entfernt wurde
•Absturz, Starten von NewPipe ohne Internetverbindung
•Einstellungen Helligkeits- und Lautstärkegesten
•[YT] Lange Wiedergabelisten
Behoben:
Absturz, NewPipe-Start nachdem es aus dem RAM entfernt wurde
Absturz, NewPipe-Start ohne Internetverbindung
Einstellungen Helligkeits- und Lautstärkegesten
[YT] Lange Wiedergabelisten
Sonstiges
Codebereinigung, verschiedene interne Verbesserungen
Aktualisierung Abhängigkeiten
Aktualisierte Übersetzungen
Sonstiges:
Codebereinigung, etliche interne Verbesserungen
• Abhängigkeiten aktualisiert
• Übersetzungen aktualisiert

View file

@ -1,11 +1,11 @@
Neu
• Inhaltsmetadaten (Tags, Kategorien, Lizenz, ...) unter der Beschreibung anzeigen
• Option "Kanaldetails anzeigen" in remote (nicht lokalen) Wiedergabelisten hinzugefügt
• Option "Im Browser öffnen" zum Langdruck-Menü hinzugefügt
Neu:
• Inhaltsmetadaten (Tags, Kategorien, Lizenz, ) unter der Beschreibung anzeigen
• Option „Kanaldetails anzeigen“ in remote (nicht lokalen) Wiedergabelisten hinzugefügt
• Option „Im Browser öffnen“ zum Langdruck-Menü hinzugefügt
Behoben
Behoben:
• Rotationsabsturz auf der Videodetailseite
"Mit Kodi spielen"-Button im Player fordert immer auf, Kore zu installieren
„Mit Kodi spielen“-Button im Player fordert immer auf, Kore zu installieren
• Setzen von Import- und Exportpfaden wurde behoben und verbessert
• [YouTube] Anzahl Kommentar-Likes korrigiert
Und vieles mehr

View file

@ -1,16 +1,17 @@
Neu
- Anzeige eines Vorschaubilds während der Suche
- Deaktivierte Kommentare erkennen
- Erlaubt das Markieren eines Feed-Elements als beobachtet
- Kommentarherzen anzeigen
Neu:
• Vorschaubild-Anzeige während der Suche
Deaktivierte Kommentare erkennen
• Feed-Element als beobachtet markieren
Kommentarherzen anzeigen
Verbessert
- Verbessertes Layout von Metadaten und Tags
- Dienstfarbe auf UI-Komponenten anwenden
Verbessert:
Layout von Metadaten und Tags
• Dienstfarbe für UI-Komponenten
Behoben
- Korrektur des Vorschaubilds im Mini-Player
- Behebung der endlosen Pufferung bei doppelten Warteschlangenelementen
- Einige Player-Fixes wie Rotation und schnelleres Schließen
- Behebung von ReCAPTCHA
...
Behoben:
• Vorschaubild im Mini-Player
• Endlose Pufferung bei doppelten Warteschlangenelementen
• Einige Player-Fixes wie Rotation und schnelleres Schließen
• ReCAPTCHA lädt im Hintergrund
• Klicks bei Feed-Aktualisierung deaktivieren
• Einige Downloader-Abstürze

View file

@ -1,10 +1,10 @@
- Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt
- Auswahl der anzuzeigenden Suchvorschläge möglich
- Dunkles Theme jetzt dunkler + dunkler Splash-Screen hinzugefügt
- Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen
- Import von YouTube-Abonnements behoben
- Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste
- Behoben: Audio-Sitzung schließen
...
Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt
Auswahl der anzuzeigenden Suchvorschläge möglich
• Dunkles Design nun dunkler + dunkler Splash-Screen hinzugefügt
Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen
Import von YouTube-Abonnements behoben
Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste
Behoben: Audio-Sitzung schließen
Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten.

View file

@ -1,9 +1,9 @@
- Die Schaltfläche "Weiter abspielen" wurde dem Langdruckmenü hinzugefügt
- YouTube Shorts Pfadpräfix zum Absichtsfilter hinzugefügt
- Import von Einstellungen behoben
- Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm vertauscht
- Verschiedene Korrekturen im Zusammenhang mit MediasessionManager
- Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen
...
• Die Schaltfläche „Weiter abspielen“ wurde dem Langdruckmenü hinzugefügt
YouTube Shorts Pfadpräfix zum Absichtsfilter hinzugefügt
Import von Einstellungen behoben
Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm vertauscht
Verschiedene Korrekturen im Zusammenhang mit MediasessionManager
Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen
Weitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf der Registerkarte Links unten.
Weitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten.

View file

@ -1,13 +1,13 @@
Neu
- Option "Zur Wiedergabeliste hinzufügen" zum Freigabemenü hinzugefügt
- Unterstützung für y2u.be und PeerTube Kurzlinks hinzugefügt
Neu:
• Option „Zur Wiedergabeliste hinzufügen“ zum Freigabemenü hinzugefügt
• Unterstützung für y2u.be- und PeerTube-Kurzlinks hinzugefügt
Verbessert
- Playback-Speed-Controls kompakter gemacht
- Feed hebt jetzt neue Elemente hervor
- "Beobachtete Artikel anzeigen" Option im Feed wird nun gespeichert
Verbessert:
Playback-Speed-Controls kompakter gemacht
Feed hebt jetzt neue Elemente hervor
• „Beobachtete Artikel anzeigen“-Option im Feed wird nun gespeichert
Behoben
- Extraktion von YouTube Likes und Dislikes behoben
- Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben
Behoben:
Extraktion von YouTube Likes und Dislikes behoben
Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben
Und vieles mehr

View file

@ -0,0 +1,16 @@
Neu:
• Benachrichtigungen für neue Streams
• Nahtloser Übergang zwischen Hintergrund- und Videoplayer
• Änderung der Tonhöhe um Halbtöne
• Warteschlange des Hauptplayers an Wiedergabeliste anfügen
Verbessert:
• Geschwindigkeit/Tonhöhenschrittgröße speichern
• Anfängliche lange Videoplayer-Pufferung verringert
• Player-UI für Android TV
• Löschbestätigung für alle heruntergeladenen Dateien
Behoben:
• Medienschaltfläche blendet die Steuerelemente des Players nicht aus
• Rücksetzung der Wiedergabe bei Änderung des Playertyps
• Drehung des Wiedergabelisten-Dialogs

View file

@ -1,12 +1,12 @@
Neu
- Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams
- Schaltfläche "Hinzufügen" zum Hinzufügen einer entfernten Wiedergabeliste zu einer lokalen Wiedergabeliste
- Bildvorschau im Android 10+ Teilen-Dialog
Neu:
Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams
• Schaltfläche um entfernte Wiedergabeliste einer lokalen Wiedergabeliste hinzuzufügen
Bildvorschau im Android 10+ Teilen-Dialog
Verbesserte
- Verbesserung des Dialogs für Wiedergabewerte
- Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschieben
Verbessert:
• Wiedergabewerte-Dialog
• Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschoben
Behoben
- Fix: Entfernen vollständig angesehener Videos aus der Wiedergabeliste
- Repariert das Thema des Freigabemenüs und den Eintrag "Zur Wiedergabeliste hinzufügen"
Behoben:
• Entfernung von vollständig angesehenen Videos aus der Wiedergabeliste
• Freigabemenü-Design und „Zur Wiedergabeliste hinzufügen“-Eintrag

View file

@ -1,15 +1,15 @@
Ab sofort entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist Android 5 Lollipop!
Mit dieser Version entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist nun Android 5 Lollipop!
Neu
- Herunterladen aus dem Langdruck-Menü
- Zukünftige Videos im Feed ausblenden
...
Neu:
• Herunterladen aus dem Langdruckmenü
Zukünftige Videos im Feed ausblenden
• Lokale Wiedergabelisten teilen
Verbessert
- Refaktorierung des Player-Codes in kleine Komponenten: weniger RAM-Verbrauch, weniger Bugs
- Verbesserter Skalierungsmodus für Miniaturansichten
...
Verbessert:
• Player-Code in kleine Komponenten refaktorisiert: weniger RAM-Verbrauch, weniger Bugs
• Skalierungsmodus für Miniaturansicht
Behoben
- Behebung verschiedener Probleme mit der Player-Benachrichtigung: veraltete/fehlende Medieninformationen, verzerrte Miniaturansicht
...
Behoben:
• Verschiedene Probleme mit Player-Benachrichtigung: veraltete/fehlende Medieninfos, verzerrte Miniaturansicht

View file

@ -1,13 +1,13 @@
Neu
- Schaltfläche "Im Browser öffnen" im Fehlerbedienfeld hinzugefügt
- Option zur Anzeige von Kanalgruppen als Liste hinzugefügt
- [YouTube] Langes Klicken auf Streamsegmente zum Teilen der Zeitstempel-URL
- Schaltfläche "Warteschlange abspielen" zum Mini-Player hinzugefügt
Neu:
• Neue Schaltfläche "Im Browser öffnen" im Fehler-Fenster
• Anzeigeoption von Kanalgruppen als Liste
• [YouTube] Langer Klick auf Streamsegmente um Zeitstempel-URL zu teilen
• Schaltfläche „Warteschlange abspielen“ im Mini-Player
Verbessert
- Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert
- Viele interne Verbesserungen
Verbessert:
Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert
Viele interne Verbesserungen
Behoben
- Mehrere Abstürze behoben
- [YouTube] Behebung von Problemen beim Laden von Kanälen...
Behoben:
Mehrere Abstürze behoben
• [YouTube] Fehlerbehebung für Laden von Kanälen, nicht zugeordnete Feeds und Wiedergabe in einigen Ländern

View file

@ -0,0 +1,17 @@
Neu:
• Anzahl der Abonnenten in den Videodetails
• Herunterladen aus der Warteschlange
• Dauerhaftes Einstellen einer Wiedergabelisten-Miniaturansicht
• Hashtags und Links lang drücken
• Kartenansicht-Modus
Verbessert:
• Größere Schaltfläche um Mini-Player zu schließen
• Glattere Miniaturansicht-Skalierung
• Android 13 (API 33)
• Suchen hält den Player nicht mehr an
Behoben:
• Overlay auf DeX/Maus
• Hintergrundplayer ohne separate Audiostreams
• YouTube-Korrekturen und mehr…

View file

@ -0,0 +1,17 @@
Nuevo
• Número de suscriptores en los detalles del video
• Descarga desde la cola
• Establecer permanentemente una miniatura de lista de reproducción
• Hashtags y enlaces con pulsación de larga duración
• Modo de vista de tarjeta
Mejorado
• Botón de cierre del minirreproductor más grande
• Reducción de escala de miniaturas más suave
• Objetivo Android 13 (API 33)
• Buscar ya no detiene el reproductor
Arreglos
• Solucionar superposición en DeX/ratón
• Permitir reproductor de fondo sin transmisiones de audio separadas
• Varias correcciones de YouTube y más…

View file

@ -0,0 +1,17 @@
Zer berri
• Harpidetza kopurua bideoen xehetasunetan
• Ilaratik deskargatu
• Erreprodukzio-zerrendei betirako izango den miniatura ezarri
• Luze sakatu traola eta estekentzako
• Txartel-bista modua
Hobekuntzak
• Mini-erreproduzitzailearen ixteko botoi handiago bat
• Miniaturen eskala murrizketa arinagoa
• Android 13 (API 33)
• Bilaketak ez du erreprodukzioa geldiaraziko
Konponketak
• DeX/saguaren gainezarpena konpondua
• Bigarren planoko erreprodukzioa baimendu bereizitako bi audio-jariorik gabe
• YouTube-kin zeuden arazoak konpondu eta are gehiago…

View file

@ -0,0 +1,8 @@
### सुधार
- मोबाइल डेटा का उपयोग करते समय वीडियो की गुणवत्ता को सीमित करने की क्षमता को जोड़ा गया। #1339
- सत्र # 1442 के लिए चमक याद रखें
- कमजोर सीपीयू # 1431 के लिए डाउनलोड प्रदर्शन में सुधार
- मीडिया सत्र # 1433 के लिए समर्थन जोड़ें (काम कर रहा है)
### फिक्स
- डाउनलोड खोलने पर क्रैश ठीक करें (रिलीज बिल्ड के लिए अब उपलब्ध है) # 1441

View file

@ -0,0 +1,26 @@
### Improvements
- Disable burgermenu icon animation #1486
- undo delete of downloads #1472
- Download option in share menu #1498
- Added share option to long tap menu #1454
- Minimize main player on exit #1354
- Library version update and database backup fix #1510
- ExoPlayer 2.8.2 Update #1392
- Reworked the playback speed control dialog to support different step sizes for faster speed change.
- Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\).
- Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts.
- Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.
- Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging
- Use new extractor with refactored architecture for multiservice
### Fixes
- Fix #1440 Broken Video Info Layout #1491
- View history fix #1497
- #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist.
- #1475, by registering a view in the database when the user starts a video on external player on detail fragment.
- Fix creen timeout in case of popup mode. #1463 (Fixed #640)
- Main video player fix #1509
- [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.
- Fixed minimizing player to popup does not destroy player when popup permission is not granted.

View file

@ -0,0 +1,33 @@
# Changelog of v0.13.7
### Fixed
- Fix sort filter issues of v0.13.6
# Changelog of v0.13.6
### Improvements
- Disable burgermenu icon animation #1486
- undo delete of downloads #1472
- Download option in share menu #1498
- Added share option to long tap menu #1454
- Minimize main player on exit #1354
- Library version update and database backup fix #1510
- ExoPlayer 2.8.2 Update #1392
- Reworked the playback speed control dialog to support different step sizes for faster speed change.
- Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\).
- Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts.
- Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.
- Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging
- Use new extractor with refactored architecture for multiservice
### Fixes
- Fix #1440 Broken Video Info Layout #1491
- View history fix #1497
- #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist.
- #1475, by registering a view in the database when the user starts a video on external player on detail fragment.
- Fix creen timeout in case of popup mode. #1463 (Fixed #640)
- Main video player fix #1509
- [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.
- Fixed minimizing player to popup does not destroy player when popup permission is not granted.

View file

@ -0,0 +1,31 @@
# changes of v0.14.1
### Fixed
- Fixed failed to decrypt video url #1659
- Fixed description link not extract well #1657
# changes of v0.14.0
### New
- New Drawer design #1461
- New customizable front page #1461
### Improvements
- Reworked Gesture controls #1604
- New way to close the popup player #1597
### Fixed
- Fix error when subscription count is not available. Closes #1649.
- Show "Subscriber count not available" in those cases
- Fix NPE when a YouTube playlist is empty
- Quick fix for the kiosks in SoundCloud
- Refactor and bugfix #1623
- Fix Cyclic search result #1562
- Fix Seek bar not statically lay outed
- Fix YT Premium video are not blocked correctly
- Fix Videos sometimes not loading (due to DASH parsing)
- Fix links in video description
- Show warning when someone tries to download to external sdcard
- fix nothing shown exception triggers report
- thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943)
- Fix registering of broadcast receiver. Closes #1641.

View file

@ -0,0 +1,19 @@
### New
- Long-tap delete and share in subscriptions #1516
- Tablet UI and grid list layout #1617
### Improvements
- store and reload the last used aspect ratio #1748
- Enable linear layout in Downloads activity with full video names #1771
- Delete and share subscriptions directly from within the subscriptions tab #1516
- Enqueuing now triggers video playing if the play queue has already ended #1783
- Separate settings for volume and brightness gestures #1644
- Add support for Localization #1792
### Fixes
- Fix time parsing for . format, so NewPipe can be used in Finland
- Fix subscription count
- Add foreground service permission for API 28+ devices #1830
### Known Bugs
- Playback state can not be saved on Android P

View file

@ -0,0 +1,25 @@
ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯
### Improvements
* downloaded files can now be opened with one click #1879
* drop support for android 4.1 - 4.3 #1884
* remove old player #1884
* remove streams from current play queue by swiping them to the right #1915
* remove auto queued stream when a new stream is enqueued manually #1878
* Postprocessing for downloads and implement missing features #1759 by @kapodamy
* Post-processing infrastructure
* Proper error handling "infrastructure" (for downloader)
* Queue instead of multiple downloads
* Move serialized pending downloads (`.giga` files) to app data
* Implement max download retry
* Proper multi-thread download pausing
* Stop downloads when swicthing to mobile network (never works, see 2nd point)
* Save the thread count for next downloads
* A lot of incoherences fixed
### Fixed
* Fix crash with default resolution set to best and limited mobile data resolution #1835
* pop-up player crash fixed #1874
* NPE when trying to open background player #1901
* Fix for inserting new streams when auto queuing is enabled #1878
* Fixed the decypering shuttown issue

View file

@ -0,0 +1,10 @@
### Improvements
* Add app update notification for GitHub build (#1608 by @krtkush)
* Various improvements to the downloader (#1944 by @kapodamy):
* add missing white icons and use hardcored way for change the icon colors
* check if the iterator is initialized (fixes #2031)
* allow retry downloads with "post-processing failed" error in the new muxer
* new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039)
### Fixed
* YouTube live streams stop playing after a short time (#1996 by @yausername)

View file

@ -0,0 +1,2 @@
# हल किया गया
- हॉट फिक्स डिक्रिप्ट फ़ंक्शन त्रुटि फिर से।

View file

@ -0,0 +1,23 @@
<h4>Improvements</h4>
<ul>
<li>make links in comments clickable, increase text size</li>
<li>seek on clicking timestamp links in comments</li>
<li>show preferred tab based on recently selected state</li>
<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>
<li>search for shared text when it is not an URL</li>
<li>add &quot;share at current time&quot; button to the main video player</li>
<li>add close button to main player when video queue is finished</li>
<li>add &quot;Play directly in Background&quot; to longpress menu for video list items</li>
<li>improve English translations for Play/Enqueue commands</li>
<li>small performance improvements</li>
<li>remove unused files</li>
<li>update ExoPlayer to 2.9.6</li>
<li>add support for Invidious links</li>
</ul>
<h4>Fixed</h4>
<ul>
<li>fixed scroll w/ comments and related streams disabled</li>
<li>fixed CheckForNewAppVersionTask being executed when it shouldn&#39;t</li>
<li>fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title</li>
<li>fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading</li>
</ul>

View file

@ -0,0 +1,22 @@
New
Playback resume #2288
• Resume streams where you stopped last time
Downloader Enhancements #2149
• Use Storage Access Framework to store downloads on external SD-cards
• New mp4 muxer
• Optionally change the download directory before starting a download
• Respect metered networks
Improved
• Removed gema strings #2295
• Handle (auto)rotation changes during activity lifecycle #2444
• Make long-press menus consistent #2368
Fixed
• Fixed selected subtitle track name not being shown #2394
• Do not crash when check for app update fails (GitHub version) #2423
• Fixed downloads stuck at 99.9% #2440
• Update play queue metadata #2453
• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170
• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177

View file

@ -0,0 +1,43 @@
Changes in 0.17.1
New
• Thai localization
Improved
• Add start playing here action in long-press menus for playlists again #2518
• Add switch for SAF / legacy file picker #2521
Fixed
• Fix disappearing buttons in downloads view when switching apps #2487
• Fix playback position is stored although watch history is disabled
• Fix reduced performance caused by playback position in list views #2517
• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186
• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185
Changes in 0.17.0
New
Playback resume #2288
• Resume streams where you stopped last time
Downloader Enhancements #2149
• Use Storage Access Framework to store downloads on external SD-cards
• New mp4 muxer
• Optionally change the download directory before starting a download
• Respect metered networks
Improved
• Removed gema strings #2295
• Handle (auto)rotation changes during activity lifecycle #2444
• Make long-press menus consistent #2368
Fixed
• Fixed selected subtitle track name not being shown #2394
• Do not crash when check for app update fails (GitHub version) #2423
• Fixed downloads stuck at 99.9% #2440
• Update play queue metadata #2453
• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170
• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177

View file

@ -0,0 +1,4 @@
0.17.2 में परिवर्तन
फिक्स
• फिक्स कोई वीडियो उपलब्ध नहीं था

View file

@ -0,0 +1,12 @@
Changes in 0.17.3
Improved
• Added option to clear playback states #2550
• Show hidden directories in the file picker #2591
• Support URLs from `invidio.us` instances to be opened with NewPipe #2488
• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194
Fixed
• [YouTube] Fixed 'java.lang.IllegalArgumentException #192
• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195
• Fixed performance problem in android pie when downloading a stream #2592

View file

@ -0,0 +1,14 @@
Improved
• Add more titles to improve accessibility for blind people #2655
• Make language of download folder setting more consistent and less ambiguous #2637
Fixed
• Check if last byte in the block is downloaded #2646
• Fixed scrolling in video detail fragment #2672
• Remove double search clear box animations to one #2695
• [SoundCloud] Fix client_id extraction #2745
Development
• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535
• Migrate to AndroidX #2685
• Update to ExoPlayer 2.10.6 #2697, #2736

View file

@ -0,0 +1,27 @@
New
• PeerTube support without P2P (#2201) [Beta]:
◦ Watch and download videos from PeerTube instances
◦ Add instances in the settings to access the complete PeerTube world
◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error.
• Downloader (#2679):
◦ Calculate download ETA
◦ Download opus (webm files) as ogg
◦ Recover expired download links to resume downloads after a long pause
Improved
• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742
• Use new Localization and Downloader implementations from extractor #2713
• Make "Default kiosk" string translatable
• Black navigation bar for black theme #2569
Fixed
• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772
• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219
• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792
• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217
• [SoundCloud] Fix audio stream extraction
Development
• Update ExoPlayer to 2.10.8 #2791, #2816
• Update Gradle to 3.5.1 and add Kotlin support #2714

View file

@ -0,0 +1,19 @@
New
• Show video thumbnail on the lock screen when playing in the background
Improved
• Add local playlist to queue when long pressing on background / popup button
• Make main page tabs scrollable and hide when there is only a single tab
• Limit amount of notification thumbnail updates in background player
• Add dummy thumbnail for empty local playlists
• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown
• Add button to delete downloaded files or download history in "Downloads"
• [YouTube] Add support to /c/shortened_url channel links
Fixed
• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly
• Fixed player access out of its creation thread
• Fixed search result paging
• [YouTube] Fixed switching on null causing NPE
• [YouTube] Fixed viewing comments when opening an invidio.us url
• [SoundCloud] Updated client_id

View file

@ -0,0 +1 @@
फिक्स्ड डिक्रिप्ट फ़ंक्शन नाम रेगेक्स YouTube को अनुपयोगी बना रहा।

View file

@ -0,0 +1 @@
साउंडक्लाउड समस्याओं को ठीक करने के लिए साउंडक्लाउड क्लाइंट_आईडी अपडेट किया गया।

View file

@ -0,0 +1,22 @@
New
• Added language selector to change the app language
• Added send to Kodi button to player collapsible menu
• Added ability to copy comments on long press
Improved
• Fix ReCaptcha activity and correctly save obtained cookies
• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings
• Ask for display over other apps permission in settings correctly on Android 6 and later
• Rename local playlist by long-clicking in BookmarkFragment
• Various PeerTube improvements
• Improved several English source strings
Fixed
• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized
• Fix initial brightness value for gesture
• Fixed .srt subtitle downloads containing not all line breaks
• Fixed download to SD card failing because some Android 5 devices are not CTF compliant
• Fixed downloading on Android KitKat
• Fixed corrupt video .mp4 file being recognized as audio file
• Fixed multiple localization problems, including wrong Chinese language codes
• [YouTube] Timestamps in description are clickable again

View file

@ -0,0 +1 @@
इस रिलीज़ में YouTube वेबसाइट संस्करण अपडेट किया गया था। पुराना वेबसाइट संस्करण मार्च में बंद होने जा रहा है और इसलिए आपको न्यूपाइप को अपग्रेड करना होगा।

View file

@ -0,0 +1,7 @@
उन्नत
• सेव करें और रिस्टोर करें कि क्या पिच और टेंपो अनहुक हैं या नहीं
• प्लेयर में सपोर्ट डिस्प्ले कटआउट
• गोल दृश्य और ग्राहकों की संख्या
• कम डेटा का उपयोग करने के लिए YouTube को अनुकूलित किया गया
इस रिलीज़ में YouTube से संबंधित 15 से अधिक बग ठीक किए गए थे।

View file

@ -0,0 +1,2 @@
यह एक हॉटफिक्स रिलीज़ है जो न्यूपाइप को बिना किसी बड़ी परेशानी के फिर से साउंडक्लाउड का उपयोग करने की अनुमति देता है।
साउंडक्लाउड के v2 एपीआई का उपयोग अब एक्सट्रैक्टर में किया जाता है और अमान्य क्लाइंट आईडी का पता लगाने में सुधार किया गया है।

View file

@ -0,0 +1,14 @@
New
• Subscription groups and sorted feeds
• Mute button in players
Improved
• Allow opening music.youtube.com and media.ccc.de links in NewPipe
• Relocate two settings from Appearance to Content
• Hide 5, 15, 25 second seek options if inexact seek is enabled
Fixed
• some WebM videos are not seekable
• database backup on Android P
• crash when sharing a downloaded file
• tons of YouTube extraction issue and more ...

View file

@ -0,0 +1 @@
फिक्स्ड डेटाबेस माइग्रेशन जो न्यूपाइप को कुछ दुर्लभ मामलों में शुरू होने से रोकता है।

View file

@ -0,0 +1,9 @@
Improved
• Added upload date and view count on stream grid items
• Improvements for the drawer header layout
Fixed
• Fixed mute button causing crashes on API 19
• Fixed downloading of long 1080p 60fps videos

View file

@ -0,0 +1,19 @@
New
• Search on YouTube Music
• Basic Android TV support
Improved
• Added the ability to remove all watched videos from a local playlist
• Show message when content isn't supported yet instead of crashing
• Improved popup player resize with pinch gestures
• Enqueue streams on long press on background and popup buttons in channel
• Improved size handling of the drawer header title
Fixed
• Fixed age restricted content setting not working
• Fixed certain kinds of reCAPTCHAs
• Fixed crash when opening bookmarks while playlist is `null`
• Fixed detection of network related exceptions
• Fixed visibility of group sort button in the subscriptions fragment
and more

View file

@ -0,0 +1,16 @@
New
• Add support for SoundCloud comments
• Add YouTube restricted mode setting
• Show PeerTube parent channel details
Improved
• Show Kore button only for supported services
• Block player gestures that begin at the NavigationBar or StatusBar
• Change retry & subscribe buttons background color based on service color
Fixed
• Fix download dialog freeze
• Open in browser button now really opens in browser
• Fix crash on opening videos and "Could not play this stream"
and more

View file

@ -0,0 +1,4 @@
यह रिलीज़ तीन छोटे सुधार लाता है:
• Android 10+ पर फिक्स्ड स्टोरेज एक्सेस
• फिक्स्ड ओपनिंग कियोस्क
• लंबे वीडियो की निश्चित अवधि पार्सिंग

View file

@ -0,0 +1,17 @@
New
• Add search for subscription picker in the feed group dialog
• Add filter to the feed group dialog to show only ungrouped subscriptions
• Add playlist tab to main page
• Fast forward/rewind in background/pop-up player queue
• Display search suggestion: did you mean & showing result for
Improved
• Drop writing application metadata in muxed files
• Do not remove failed streams from the queue
• Update status bar color to match toolbar color
Fixed
• Fixed audio/video desync caused by floating point cumulative errors
• [PeerTube] Handle deleted comments
and more

View file

@ -0,0 +1,7 @@
Improved
• Auto-play is available for all services (instead of only for YouTube)
Fixed
• Fixed related streams by supporting YouTube's new continuations
• Fixed age restricted YouTube videos
• [Android TV] Fixed lingering focus highlight overlay

View file

@ -1,8 +1,9 @@
• नए एप्लिकेशन वर्कफ़्लो: विस्तार पृष्ठ पर वीडियो चलाएं, प्लेयर को छोटा करने के लिए नीचे स्वाइप करें
• मीडियास्टाइल सूचनाएँ: सूचनाएँ, प्रदर्शन सुधार में अनुकूलन योग्य क्रियाएँ
• मीडियास्टाइल सूचनाएँ: सूचनाओं में अनुकूलन योग्य क्रियाएं, प्रदर्शन सुधार
• डेस्कटॉप ऐप के रूप में न्यूपाइप का उपयोग करते समय मूल आकार परिवर्तन
• असमर्थित यूआरएल टोस्ट के मामले में खुले विकल्पों के साथ संवाद दिखाएं
• रिमोट सुझावों के अनुपलब्धता पर अनुभव में सुधार
• 720p60 (इन-ऐप प्लेयर) और 480p (पॉप-अप प्लेयर) के लिए डिफ़ॉल्ट वीडियो की गुणवत्ता वृद्धि
• त्रुटियों में सुधार और बोहोत कुछ
• त्रुटियों में सुधार और बहुत कुछ

View file

@ -1,5 +1,3 @@
त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप।
पीयरट्यूब उदाहरणों की अद्यतन सूची जो न्यूपाइप द्वारा स्वचालित रूप से खोली जा सकती है।
अपडेट किए गए अनुवाद।त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप।
पीयरट्यूब उदाहरणों की अद्यतन सूची जो न्यूपाइप द्वारा स्वचालित रूप से खोली जा सकती है।
पीरट्यूब इंस्टेंस सूची जो निऊपाईप द्वारा स्वचालित रूप से खोली जा सकती है।
अपडेट किए गए अनुवाद।

View file

@ -0,0 +1 @@
• [यूट्यूब] फिक्स्ड निश्चित चैनल निरंतरता

View file

@ -0,0 +1,8 @@
• Added support for chapters in player controls
• [PeerTube] Added Sepia search
• Re-added share button in video detail view and moved stream description into the tab layout
• Disable restoring brightness if brightness gesture is disabled
• Added list item to play video on kodi
• Fixed crash when no default browser is set on some devices and improve share dialogs
• Toggle play/pause with hardware space button in fullscreen player
• [media.ccc.de] Various fixes and improvements

View file

@ -0,0 +1,6 @@
Fixed crash which occurred when reordering channel groups.
Fixed getting more YouTube videos from channels and playlists.
Fixed getting YouTube comments.
Added support for /watch/, /v/ and /w/ subpaths in YouTube URLs.
Fixed extraction of SoundCloud client id and geo-restricted content.
Added Northern Kurdish localization.

View file

@ -0,0 +1,14 @@
New:
• Add a new service: Bandcamp
Improved:
• Add an option to have the app follow the device theme
• Prevent some crashes by showing an improved error panel
• Show more information on why content in unavailable
• Hardware space button triggers play/pause
• Show "Download started" toast
Fixed:
• Fix very small thumbnail in video details while playing in the background
• Fix empty title in minimized player
• Fix last resize mode not being restored correctly

Some files were not shown because too many files have changed in this diff Show more