Merge branch 'dev' into patch-1

This commit is contained in:
Andrew 2019-08-14 17:39:57 +01:00 committed by GitHub
commit 89f2cd6ec0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
87 changed files with 413 additions and 656 deletions

View File

@ -8,8 +8,8 @@ android {
applicationId "org.schabi.newpipe"
minSdkVersion 19
targetSdkVersion 28
versionCode 740
versionName "0.16.2"
versionCode 750
versionName "0.17.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true

View File

@ -3,15 +3,24 @@ package org.schabi.newpipe.database;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.room.migration.Migration;
import android.support.annotation.NonNull;
import android.util.Log;
import org.schabi.newpipe.BuildConfig;
public class Migrations {
public static final int DB_VER_11_0 = 1;
public static final int DB_VER_12_0 = 2;
public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release");
private static final String TAG = Migrations.class.getName();
public static final Migration MIGRATION_11_12 = new Migration(DB_VER_11_0, DB_VER_12_0) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
if(DEBUG) {
Log.d(TAG, "Start migrating database");
}
/*
* Unfortunately these queries must be hardcoded due to the possibility of
* schema and names changing at a later date, thus invalidating the older migration
@ -56,6 +65,10 @@ public class Migrations {
"ORDER BY creation_date DESC");
database.execSQL("DROP TABLE IF EXISTS watch_history");
if(DEBUG) {
Log.d(TAG, "Stop migrating database");
}
}
};
}

View File

@ -61,6 +61,7 @@ public class DownloadActivity extends AppCompatActivity {
.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
@ -86,9 +87,4 @@ public class DownloadActivity extends AppCompatActivity {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onRestoreInstanceState(Bundle inState){
super.onRestoreInstanceState(inState);
}
}

View File

@ -75,7 +75,6 @@ import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.report.UserAction;
import org.schabi.newpipe.util.AnimationUtils;
import org.schabi.newpipe.util.Constants;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.ImageDisplayConstants;
@ -963,7 +962,7 @@ public class VideoDetailFragment
}
private void showContent() {
AnimationUtils.slideUp(contentRootLayoutHiding,120, 96, 0.06f);
contentRootLayoutHiding.setVisibility(View.VISIBLE);
}
protected void setInitialData(int serviceId, String url, String name) {
@ -996,9 +995,14 @@ public class VideoDetailFragment
@Override
public void showLoading() {
super.showLoading();
contentRootLayoutHiding.setVisibility(View.INVISIBLE);
//if data is already cached, transition from VISIBLE -> INVISIBLE -> VISIBLE is not required
if(!ExtractorHelper.isCached(serviceId, url, InfoItem.InfoType.STREAM)){
contentRootLayoutHiding.setVisibility(View.INVISIBLE);
}
animateView(spinnerToolbar, false, 200);
animateView(thumbnailPlayButton, false, 50);
animateView(detailDurationView, false, 100);

View File

@ -64,7 +64,6 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I> implem
@Override
public void onDetach() {
infoListAdapter.dispose();
super.onDetach();
}
@ -97,8 +96,6 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I> implem
}
updateFlags = 0;
}
itemsList.post(infoListAdapter::updateStates);
}
/*//////////////////////////////////////////////////////////////////////////

View File

@ -1,8 +1,11 @@
package org.schabi.newpipe.fragments.list.playlist;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
@ -26,7 +29,9 @@ import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.fragments.list.BaseListInfoFragment;
import org.schabi.newpipe.info_list.InfoItemDialog;
import org.schabi.newpipe.local.playlist.RemotePlaylistManager;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;
@ -36,6 +41,7 @@ import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ShareUtils;
import org.schabi.newpipe.util.StreamDialogEntry;
import org.schabi.newpipe.util.ThemeHelper;
import java.util.ArrayList;
@ -130,6 +136,42 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
infoListAdapter.useMiniItemVariants(true);
}
private PlayQueue getPlayQueueStartingAt(StreamInfoItem infoItem) {
return getPlayQueue(Math.max(infoListAdapter.getItemsList().indexOf(infoItem), 0));
}
@Override
protected void showStreamDialog(StreamInfoItem item) {
final Context context = getContext();
final Activity activity = getActivity();
if (context == null || context.getResources() == null || activity == null) return;
if (item.getStreamType() == StreamType.AUDIO_STREAM) {
StreamDialogEntry.setEnabledEntries(
StreamDialogEntry.enqueue_on_background,
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.append_playlist,
StreamDialogEntry.share);
} else {
StreamDialogEntry.setEnabledEntries(
StreamDialogEntry.enqueue_on_background,
StreamDialogEntry.enqueue_on_popup,
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.start_here_on_popup,
StreamDialogEntry.append_playlist,
StreamDialogEntry.share);
StreamDialogEntry.start_here_on_popup.setCustomAction(
(fragment, infoItem) -> NavigationHelper.playOnPopupPlayer(context, getPlayQueueStartingAt(infoItem), true));
}
StreamDialogEntry.start_here_on_background.setCustomAction(
(fragment, infoItem) -> NavigationHelper.playOnBackgroundPlayer(context, getPlayQueueStartingAt(infoItem), true));
new InfoItemDialog(activity, item, StreamDialogEntry.getCommands(context), (dialog, which) ->
StreamDialogEntry.clickOn(which, this, item)).show();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu +

View File

@ -2,14 +2,11 @@ package org.schabi.newpipe.info_list;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
@ -24,6 +21,7 @@ import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder;
import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder;
import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder;
import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.OnClickGesture;
/*
@ -61,14 +59,14 @@ public class InfoItemBuilder {
this.context = context;
}
public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem, @Nullable StreamStateEntity state) {
return buildView(parent, infoItem, state, false);
public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
return buildView(parent, infoItem, historyRecordManager, false);
}
public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem,
@Nullable StreamStateEntity state, boolean useMiniVariant) {
final HistoryRecordManager historyRecordManager, boolean useMiniVariant) {
InfoItemHolder holder = holderFromInfoType(parent, infoItem.getInfoType(), useMiniVariant);
holder.updateFromItem(infoItem, state);
holder.updateFromItem(infoItem, historyRecordManager);
return holder.itemView;
}
@ -83,7 +81,6 @@ public class InfoItemBuilder {
case COMMENT:
return useMiniVariant ? new CommentsMiniInfoItemHolder(this, parent) : new CommentsInfoItemHolder(this, parent);
default:
Log.e(TAG, "Trollolo");
throw new RuntimeException("InfoType not expected = " + infoType.name());
}
}

View File

@ -1,6 +1,6 @@
package org.schabi.newpipe.info_list;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
@ -27,6 +27,7 @@ import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder;
import org.schabi.newpipe.info_list.holder.StreamGridInfoItemHolder;
import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder;
import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.FallbackViewHolder;
import org.schabi.newpipe.util.OnClickGesture;
@ -53,7 +54,7 @@ import java.util.List;
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
*/
public class InfoListAdapter extends StateObjectsListAdapter {
public class InfoListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = InfoListAdapter.class.getSimpleName();
private static final boolean DEBUG = false;
@ -74,6 +75,8 @@ public class InfoListAdapter extends StateObjectsListAdapter {
private final InfoItemBuilder infoItemBuilder;
private final ArrayList<InfoItem> infoItemList;
private final HistoryRecordManager recordManager;
private boolean useMiniVariant = false;
private boolean useGridVariant = false;
private boolean showFooter = false;
@ -89,9 +92,9 @@ public class InfoListAdapter extends StateObjectsListAdapter {
}
}
public InfoListAdapter(Activity a) {
super(a.getApplicationContext());
infoItemBuilder = new InfoItemBuilder(a);
public InfoListAdapter(Context context) {
this.recordManager = new HistoryRecordManager(context);
infoItemBuilder = new InfoItemBuilder(context);
infoItemList = new ArrayList<>();
}
@ -120,63 +123,52 @@ public class InfoListAdapter extends StateObjectsListAdapter {
}
public void addInfoItemList(@Nullable final List<InfoItem> data) {
if (data != null) {
loadStates(data, infoItemList.size(), () -> addInfoItemListImpl(data));
}
}
private void addInfoItemListImpl(@NonNull List<InfoItem> data) {
if (DEBUG) {
Log.d(TAG, "addInfoItemList() before > infoItemList.size() = " + infoItemList.size() + ", data.size() = " + data.size());
if (data == null) {
return;
}
if (DEBUG) Log.d(TAG, "addInfoItemList() before > infoItemList.size() = " +
infoItemList.size() + ", data.size() = " + data.size());
int offsetStart = sizeConsideringHeaderOffset();
infoItemList.addAll(data);
if (DEBUG) {
Log.d(TAG, "addInfoItemList() after > offsetStart = " + offsetStart + ", infoItemList.size() = " + infoItemList.size() + ", header = " + header + ", footer = " + footer + ", showFooter = " + showFooter);
}
if (DEBUG) Log.d(TAG, "addInfoItemList() after > offsetStart = " + offsetStart +
", infoItemList.size() = " + infoItemList.size() +
", header = " + header + ", footer = " + footer +
", showFooter = " + showFooter);
notifyItemRangeInserted(offsetStart, data.size());
if (footer != null && showFooter) {
int footerNow = sizeConsideringHeaderOffset();
notifyItemMoved(offsetStart, footerNow);
if (DEBUG) Log.d(TAG, "addInfoItemList() footer from " + offsetStart + " to " + footerNow);
if (DEBUG) Log.d(TAG, "addInfoItemList() footer from " + offsetStart +
" to " + footerNow);
}
}
public void addInfoItem(@Nullable InfoItem data) {
if (data != null) {
loadState(data, infoItemList.size(), () -> addInfoItemImpl(data));
}
}
private void addInfoItemImpl(@NonNull InfoItem data) {
if (DEBUG) {
Log.d(TAG, "addInfoItem() before > infoItemList.size() = " + infoItemList.size() + ", thread = " + Thread.currentThread());
if (data == null) {
return;
}
if (DEBUG) Log.d(TAG, "addInfoItem() before > infoItemList.size() = " +
infoItemList.size() + ", thread = " + Thread.currentThread());
int positionInserted = sizeConsideringHeaderOffset();
infoItemList.add(data);
if (DEBUG) {
Log.d(TAG, "addInfoItem() after > position = " + positionInserted + ", infoItemList.size() = " + infoItemList.size() + ", header = " + header + ", footer = " + footer + ", showFooter = " + showFooter);
}
if (DEBUG) Log.d(TAG, "addInfoItem() after > position = " + positionInserted +
", infoItemList.size() = " + infoItemList.size() +
", header = " + header + ", footer = " + footer +
", showFooter = " + showFooter);
notifyItemInserted(positionInserted);
if (footer != null && showFooter) {
int footerNow = sizeConsideringHeaderOffset();
notifyItemMoved(positionInserted, footerNow);
if (DEBUG) Log.d(TAG, "addInfoItem() footer from " + positionInserted + " to " + footerNow);
}
}
public void updateStates() {
if (!infoItemList.isEmpty()) {
updateAllStates(infoItemList);
if (DEBUG) Log.d(TAG, "addInfoItem() footer from " + positionInserted +
" to " + footerNow);
}
}
@ -185,7 +177,6 @@ public class InfoListAdapter extends StateObjectsListAdapter {
return;
}
infoItemList.clear();
clearStates();
notifyDataSetChanged();
}
@ -254,7 +245,6 @@ public class InfoListAdapter extends StateObjectsListAdapter {
case COMMENT:
return useMiniVariant ? MINI_COMMENT_HOLDER_TYPE : COMMENT_HOLDER_TYPE;
default:
Log.e(TAG, "Trollolo");
return -1;
}
}
@ -292,7 +282,6 @@ public class InfoListAdapter extends StateObjectsListAdapter {
case COMMENT_HOLDER_TYPE:
return new CommentsInfoItemHolder(infoItemBuilder, parent);
default:
Log.e(TAG, "Trollolo");
return new FallbackViewHolder(new View(parent.getContext()));
}
}
@ -304,7 +293,7 @@ public class InfoListAdapter extends StateObjectsListAdapter {
// If header isn't null, offset the items by -1
if (header != null) position--;
((InfoItemHolder) holder).updateFromItem(infoItemList.get(position), getState(position));
((InfoItemHolder) holder).updateFromItem(infoItemList.get(position), recordManager);
} else if (holder instanceof HFHolder && position == 0 && header != null) {
((HFHolder) holder).view = header;
} else if (holder instanceof HFHolder && position == sizeConsideringHeaderOffset() && footer != null && showFooter) {
@ -317,11 +306,9 @@ public class InfoListAdapter extends StateObjectsListAdapter {
if (!payloads.isEmpty() && holder instanceof InfoItemHolder) {
for (Object payload : payloads) {
if (payload instanceof StreamStateEntity) {
((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1),
(StreamStateEntity) payload);
((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1), recordManager);
} else if (payload instanceof Boolean) {
((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1),
null);
((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1), recordManager);
}
}
} else {
@ -329,11 +316,6 @@ public class InfoListAdapter extends StateObjectsListAdapter {
}
}
@Override
protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) {
notifyItemChanged(header == null ? position : position + 1, state != null ? state : false);
}
public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {
return new GridLayoutManager.SpanSizeLookup() {
@Override

View File

@ -1,189 +0,0 @@
package org.schabi.newpipe.info_list;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.SparseArrayUtils;
import java.util.List;
import java.util.Objects;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
public abstract class StateObjectsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final SparseArray<StreamStateEntity> states;
private final HistoryRecordManager recordManager;
private final CompositeDisposable stateLoaders;
private final Context context;
public StateObjectsListAdapter(Context context) {
this.states = new SparseArray<>();
this.recordManager = new HistoryRecordManager(context);
this.context = context;
this.stateLoaders = new CompositeDisposable();
}
@Nullable
public StreamStateEntity getState(int position) {
return states.get(position);
}
protected void clearStates() {
states.clear();
}
private void appendStates(List<StreamStateEntity> statesEntities, int offset) {
for (int i = 0; i < statesEntities.size(); i++) {
final StreamStateEntity state = statesEntities.get(i);
if (state != null) {
states.append(offset + i, state);
}
}
}
private void appendState(StreamStateEntity statesEntity, int offset) {
if (statesEntity != null) {
states.append(offset, statesEntity);
}
}
protected void removeState(int index) {
states.remove(index);
}
protected void moveState(int from, int to) {
final StreamStateEntity item = states.get(from);
if (from < to) {
SparseArrayUtils.shiftItemsDown(states, from, to);
} else {
SparseArrayUtils.shiftItemsUp(states, to, from);
}
states.put(to, item);
}
protected void loadStates(List<InfoItem> list, int offset, Runnable callback) {
if (isPlaybackStatesVisible()) {
stateLoaders.add(
recordManager.loadStreamStateBatch(list)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(streamStateEntities -> {
appendStates(streamStateEntities, offset);
callback.run();
}, throwable -> {
if (BuildConfig.DEBUG) throwable.printStackTrace();
callback.run();
})
);
} else {
callback.run();
}
}
protected void loadState(InfoItem item, int offset, Runnable callback) {
if (isPlaybackStatesVisible()) {
stateLoaders.add(
recordManager.loadStreamState(item)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(streamStateEntities -> {
appendState(streamStateEntities[0], offset);
callback.run();
}, throwable -> {
if (BuildConfig.DEBUG) throwable.printStackTrace();
callback.run();
})
);
} else {
callback.run();
}
}
protected void loadStatesForLocal(List<? extends LocalItem> list, int offset, Runnable callback) {
if (isPlaybackStatesVisible()) {
stateLoaders.add(
recordManager.loadLocalStreamStateBatch(list)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(streamStateEntities -> {
appendStates(streamStateEntities, offset);
callback.run();
}, throwable -> {
if (BuildConfig.DEBUG) throwable.printStackTrace();
callback.run();
})
);
} else {
callback.run();
}
}
private void processStatesUpdates(List<StreamStateEntity> streamStateEntities) {
for (int i = 0; i < streamStateEntities.size(); i++) {
final StreamStateEntity newState = streamStateEntities.get(i);
if (!Objects.equals(states.get(i), newState)) {
if (newState == null) {
states.remove(i);
} else {
states.put(i, newState);
}
onItemStateChanged(i, newState);
}
}
}
protected void updateAllStates(List<InfoItem> list) {
if (isPlaybackStatesVisible()) {
stateLoaders.add(
recordManager.loadStreamStateBatch(list)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::processStatesUpdates, throwable -> {
if (BuildConfig.DEBUG) throwable.printStackTrace();
})
);
} else {
final int[] positions = SparseArrayUtils.getKeys(states);
states.clear();
for (int pos : positions) onItemStateChanged(pos, null);
}
}
protected void updateAllLocalStates(List<? extends LocalItem> list) {
if (isPlaybackStatesVisible()) {
stateLoaders.add(
recordManager.loadLocalStreamStateBatch(list)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::processStatesUpdates, throwable -> {
if (BuildConfig.DEBUG) throwable.printStackTrace();
})
);
} else {
final int[] positions = SparseArrayUtils.getKeys(states);
states.clear();
for (int pos : positions) onItemStateChanged(pos, null);
}
}
public void dispose() {
stateLoaders.dispose();
}
protected boolean isPlaybackStatesVisible() {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true)
&& prefs.getBoolean(context.getString(R.string.enable_playback_resume_key), true)
&& prefs.getBoolean(context.getString(R.string.enable_playback_state_lists_key), true);
}
protected abstract void onItemStateChanged(int position, @Nullable StreamStateEntity state);
}

View File

@ -1,14 +1,13 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.widget.TextView;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.Localization;
/*
@ -40,8 +39,8 @@ public class ChannelInfoItemHolder extends ChannelMiniInfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
super.updateFromItem(infoItem, state);
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
super.updateFromItem(infoItem, historyRecordManager);
if (!(infoItem instanceof ChannelInfoItem)) return;
final ChannelInfoItem item = (ChannelInfoItem) infoItem;

View File

@ -1,14 +1,13 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.widget.TextView;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
@ -32,7 +31,7 @@ public class ChannelMiniInfoItemHolder extends InfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
if (!(infoItem instanceof ChannelInfoItem)) return;
final ChannelInfoItem item = (ChannelInfoItem) infoItem;

View File

@ -1,14 +1,13 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.widget.TextView;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
/*
* Created by Christian Schabesberger on 12.02.17.
@ -41,8 +40,8 @@ public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
super.updateFromItem(infoItem, state);
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
super.updateFromItem(infoItem, historyRecordManager);
if (!(infoItem instanceof CommentsInfoItem)) return;
final CommentsInfoItem item = (CommentsInfoItem) infoItem;

View File

@ -1,18 +1,16 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.util.Linkify;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.jsoup.helper.StringUtil;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.util.CommentTextOnTouchListener;
import org.schabi.newpipe.util.ImageDisplayConstants;
@ -48,7 +46,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
if(hours != null) timestamp += (Integer.parseInt(hours.replace(":", ""))*3600);
if(minutes != null) timestamp += (Integer.parseInt(minutes.replace(":", ""))*60);
if(seconds != null) timestamp += (Integer.parseInt(seconds));
return streamUrl + url.replace(match.group(0), "#timestamp=" + String.valueOf(timestamp));
return streamUrl + url.replace(match.group(0), "#timestamp=" + timestamp);
}
};
@ -67,7 +65,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
if (!(infoItem instanceof CommentsInfoItem)) return;
final CommentsInfoItem item = (CommentsInfoItem) infoItem;
@ -76,20 +74,17 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
itemThumbnailView,
ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS);
itemThumbnailView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(StringUtil.isBlank(item.getAuthorEndpoint())) return;
try {
final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext();
NavigationHelper.openChannelFragment(
activity.getSupportFragmentManager(),
item.getServiceId(),
item.getAuthorEndpoint(),
item.getAuthorName());
} catch (Exception e) {
ErrorActivity.reportUiError((AppCompatActivity) itemBuilder.getContext(), e);
}
itemThumbnailView.setOnClickListener(view -> {
if(StringUtil.isBlank(item.getAuthorEndpoint())) return;
try {
final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext();
NavigationHelper.openChannelFragment(
activity.getSupportFragmentManager(),
item.getServiceId(),
item.getAuthorEndpoint(),
item.getAuthorName());
} catch (Exception e) {
ErrorActivity.reportUiError((AppCompatActivity) itemBuilder.getContext(), e);
}
});
@ -101,7 +96,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
if (itemContentView.getLineCount() == 0) {
itemContentView.post(() -> ellipsize());
itemContentView.post(this::ellipsize);
} else {
ellipsize();
}

View File

@ -1,13 +1,12 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
/*
* Created by Christian Schabesberger on 12.02.17.
@ -37,8 +36,8 @@ public abstract class InfoItemHolder extends RecyclerView.ViewHolder {
this.itemBuilder = infoItemBuilder;
}
public abstract void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state);
public abstract void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager);
public void updateState(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
public void updateState(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
}
}

View File

@ -1,15 +1,14 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.ImageDisplayConstants;
public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
@ -32,7 +31,7 @@ public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
if (!(infoItem instanceof PlaylistInfoItem)) return;
final PlaylistInfoItem item = (PlaylistInfoItem) infoItem;

View File

@ -1,15 +1,14 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.ViewGroup;
import android.widget.TextView;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.Localization;
/*
@ -42,8 +41,8 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
super.updateFromItem(infoItem, state);
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
super.updateFromItem(infoItem, historyRecordManager);
if (!(infoItem instanceof StreamInfoItem)) return;
final StreamInfoItem item = (StreamInfoItem) infoItem;

View File

@ -1,6 +1,5 @@
package org.schabi.newpipe.info_list.holder;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.view.ViewGroup;
@ -13,6 +12,7 @@ import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.AnimationUtils;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
@ -43,7 +43,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
}
@Override
public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
if (!(infoItem instanceof StreamInfoItem)) return;
final StreamInfoItem item = (StreamInfoItem) infoItem;
@ -55,10 +55,12 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),
R.color.duration_background_color));
itemDurationView.setVisibility(View.VISIBLE);
if (state != null) {
StreamStateEntity state2 = historyRecordManager.loadStreamState(infoItem).blockingGet()[0];
if (state2 != null) {
itemProgressView.setVisibility(View.VISIBLE);
itemProgressView.setMax((int) item.getDuration());
itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state2.getProgressTime()));
} else {
itemProgressView.setVisibility(View.GONE);
}
@ -101,8 +103,10 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
}
@Override
public void updateState(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
public void updateState(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) {
final StreamInfoItem item = (StreamInfoItem) infoItem;
StreamStateEntity state = historyRecordManager.loadStreamState(infoItem).blockingGet()[0];
if (state != null && item.getDuration() > 0 && item.getStreamType() != StreamType.LIVE_STREAM) {
itemProgressView.setMax((int) item.getDuration());
if (itemProgressView.getVisibility() == View.VISIBLE) {
@ -130,4 +134,4 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
itemView.setLongClickable(false);
itemView.setOnLongClickListener(null);
}
}
}

View File

@ -76,8 +76,6 @@ public abstract class BaseLocalListFragment<I, N> extends BaseStateFragment<I>
}
updateFlags = 0;
}
itemsList.post(itemListAdapter::updateStates);
}
/*//////////////////////////////////////////////////////////////////////////
@ -152,7 +150,6 @@ public abstract class BaseLocalListFragment<I, N> extends BaseStateFragment<I>
public void onDestroyView() {
super.onDestroyView();
itemsList = null;
itemListAdapter.dispose();
itemListAdapter = null;
}

View File

@ -1,6 +1,6 @@
package org.schabi.newpipe.local;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
@ -11,7 +11,7 @@ import android.view.ViewGroup;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.info_list.StateObjectsListAdapter;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.local.holder.LocalItemHolder;
import org.schabi.newpipe.local.holder.LocalPlaylistGridItemHolder;
import org.schabi.newpipe.local.holder.LocalPlaylistItemHolder;
@ -49,7 +49,7 @@ import java.util.List;
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
*/
public class LocalItemListAdapter extends StateObjectsListAdapter {
public class LocalItemListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = LocalItemListAdapter.class.getSimpleName();
private static final boolean DEBUG = false;
@ -68,6 +68,7 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
private final LocalItemBuilder localItemBuilder;
private final ArrayList<LocalItem> localItems;
private final HistoryRecordManager recordManager;
private final DateFormat dateFormat;
private boolean showFooter = false;
@ -75,12 +76,12 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
private View header = null;
private View footer = null;
public LocalItemListAdapter(Activity activity) {
super(activity.getApplicationContext());
localItemBuilder = new LocalItemBuilder(activity);
public LocalItemListAdapter(Context context) {
recordManager = new HistoryRecordManager(context);
localItemBuilder = new LocalItemBuilder(context);
localItems = new ArrayList<>();
dateFormat = DateFormat.getDateInstance(DateFormat.SHORT,
Localization.getPreferredLocale(activity));
Localization.getPreferredLocale(context));
}
public void setSelectedListener(OnClickGesture<LocalItem> listener) {
@ -92,27 +93,19 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
}
public void addItems(@Nullable List<? extends LocalItem> data) {
if (data != null) {
loadStatesForLocal(data, localItems.size(), () -> addItemsImpl(data));
}
}
private void addItemsImpl(@NonNull List<? extends LocalItem> data) {
if (DEBUG) {
Log.d(TAG, "addItems() before > localItems.size() = " +
localItems.size() + ", data.size() = " + data.size());
if (data == null) {
return;
}
if (DEBUG) Log.d(TAG, "addItems() before > localItems.size() = " +
localItems.size() + ", data.size() = " + data.size());
int offsetStart = sizeConsideringHeader();
localItems.addAll(data);
if (DEBUG) {
Log.d(TAG, "addItems() after > offsetStart = " + offsetStart +
", localItems.size() = " + localItems.size() +
", header = " + header + ", footer = " + footer +
", showFooter = " + showFooter);
}
if (DEBUG) Log.d(TAG, "addItems() after > offsetStart = " + offsetStart +
", localItems.size() = " + localItems.size() +
", header = " + header + ", footer = " + footer +
", showFooter = " + showFooter);
notifyItemRangeInserted(offsetStart, data.size());
if (footer != null && showFooter) {
@ -124,16 +117,9 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
}
}
public void updateStates() {
if (!localItems.isEmpty()) {
updateAllLocalStates(localItems);
}
}
public void removeItem(final LocalItem data) {
final int index = localItems.indexOf(data);
localItems.remove(index);
removeState(index);
notifyItemRemoved(index + (header != null ? 1 : 0));
}
@ -145,7 +131,6 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
if (actualFrom >= localItems.size() || actualTo >= localItems.size()) return false;
localItems.add(actualTo, localItems.remove(actualFrom));
moveState(actualFrom, actualTo);
notifyItemMoved(fromAdapterPosition, toAdapterPosition);
return true;
}
@ -155,7 +140,6 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
return;
}
localItems.clear();
clearStates();
notifyDataSetChanged();
}
@ -236,8 +220,9 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int type) {
if (DEBUG) Log.d(TAG, "onCreateViewHolder() called with: parent = [" +
parent + "], type = [" + type + "]");
switch (type) {
@ -268,7 +253,7 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (DEBUG) Log.d(TAG, "onBindViewHolder() called with: holder = [" +
holder.getClass().getSimpleName() + "], position = [" + position + "]");
@ -276,7 +261,7 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
// If header isn't null, offset the items by -1
if (header != null) position--;
((LocalItemHolder) holder).updateFromItem(localItems.get(position), getState(position), dateFormat);
((LocalItemHolder) holder).updateFromItem(localItems.get(position), recordManager, dateFormat);
} else if (holder instanceof HeaderFooterHolder && position == 0 && header != null) {
((HeaderFooterHolder) holder).view = header;
} else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader()
@ -290,11 +275,9 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
if (!payloads.isEmpty() && holder instanceof LocalItemHolder) {
for (Object payload : payloads) {
if (payload instanceof StreamStateEntity) {
((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1),
(StreamStateEntity) payload);
((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1), recordManager);
} else if (payload instanceof Boolean) {
((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1),
null);
((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1), recordManager);
}
}
} else {
@ -302,11 +285,6 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
}
}
@Override
protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) {
notifyItemChanged(header == null ? position : position + 1, state != null ? state : false);
}
public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {
return new GridLayoutManager.SpanSizeLookup() {
@Override

View File

@ -1,6 +1,5 @@
package org.schabi.newpipe.local.dialog;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@ -28,7 +27,7 @@ import java.util.Collections;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.disposables.CompositeDisposable;
public final class PlaylistAppendDialog extends PlaylistDialog {
private static final String TAG = PlaylistAppendDialog.class.getCanonicalName();
@ -36,7 +35,7 @@ public final class PlaylistAppendDialog extends PlaylistDialog {
private RecyclerView playlistRecyclerView;
private LocalItemListAdapter playlistAdapter;
private Disposable playlistReactor;
private CompositeDisposable playlistDisposables = new CompositeDisposable();
public static PlaylistAppendDialog fromStreamInfo(final StreamInfo info) {
PlaylistAppendDialog dialog = new PlaylistAppendDialog();
@ -99,9 +98,9 @@ public final class PlaylistAppendDialog extends PlaylistDialog {
final View newPlaylistButton = view.findViewById(R.id.newPlaylist);
newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog());
playlistReactor = playlistManager.getPlaylists()
playlistDisposables.add(playlistManager.getPlaylists()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onPlaylistsReceived);
.subscribe(this::onPlaylistsReceived));
}
/*//////////////////////////////////////////////////////////////////////////
@ -111,13 +110,12 @@ public final class PlaylistAppendDialog extends PlaylistDialog {
@Override
public void onDestroyView() {
super.onDestroyView();
if (playlistReactor != null) playlistReactor.dispose();
playlistDisposables.dispose();
if (playlistAdapter != null) {
playlistAdapter.dispose();
playlistAdapter.unsetSelectedListener();
}
playlistReactor = null;
playlistDisposables.clear();
playlistRecyclerView = null;
playlistAdapter = null;
}
@ -151,13 +149,12 @@ public final class PlaylistAppendDialog extends PlaylistDialog {
@NonNull List<StreamEntity> streams) {
if (getStreams() == null) return;
@SuppressLint("ShowToast")
final Toast successToast = Toast.makeText(getContext(),
R.string.playlist_add_stream_success, Toast.LENGTH_SHORT);
manager.appendToPlaylist(playlist.uid, streams)
playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(ignored -> successToast.show());
.subscribe(ignored -> successToast.show()));
getDialog().dismiss();
}

View File

@ -51,6 +51,7 @@ import java.util.List;
import io.reactivex.Completable;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.Scheduler;
import io.reactivex.Single;
import io.reactivex.schedulers.Schedulers;
@ -109,6 +110,11 @@ public class HistoryRecordManager {
.subscribeOn(Schedulers.io());
}
public Single<Integer> deleteCompelteStreamStateHistory() {
return Single.fromCallable(streamStateTable::deleteAll)
.subscribeOn(Schedulers.io());
}
public Flowable<List<StreamHistoryEntry>> getStreamHistory() {
return streamHistoryTable.getHistory().subscribeOn(Schedulers.io());
}
@ -165,7 +171,7 @@ public class HistoryRecordManager {
.subscribeOn(Schedulers.io());
}
public Single<Integer> deleteWholeSearchHistory() {
public Single<Integer> deleteCompleteSearchHistory() {
return Single.fromCallable(searchHistoryTable::deleteAll)
.subscribeOn(Schedulers.io());
}
@ -291,4 +297,5 @@ public class HistoryRecordManager {
public Single<Integer> removeOrphanedRecords() {
return Single.fromCallable(streamTable::deleteOrphans).subscribeOn(Schedulers.io());
}
}

View File

@ -22,6 +22,7 @@ import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.playlist.PlaylistStreamEntry;
import org.schabi.newpipe.database.stream.StreamStatisticsEntry;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.extractor.stream.StreamType;
@ -180,7 +181,7 @@ public class StatisticsPlaylistFragment
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
howManyDeleted -> Toast.makeText(getContext(),
R.string.view_history_deleted,
R.string.watch_history_deleted,
Toast.LENGTH_SHORT).show(),
throwable -> ErrorActivity.reportError(getContext(),
throwable,
@ -357,6 +358,10 @@ public class StatisticsPlaylistFragment
startLoading(true);
}
private PlayQueue getPlayQueueStartingAt(StreamStatisticsEntry infoItem) {
return getPlayQueue(Math.max(itemListAdapter.getItemsList().indexOf(infoItem), 0));
}
private void showStreamDialog(final StreamStatisticsEntry item) {
final Context context = getContext();
final Activity activity = getActivity();
@ -379,8 +384,13 @@ public class StatisticsPlaylistFragment
StreamDialogEntry.delete,
StreamDialogEntry.append_playlist,
StreamDialogEntry.share);
StreamDialogEntry.start_here_on_popup.setCustomAction(
(fragment, infoItemDuplicate) -> NavigationHelper.playOnPopupPlayer(context, getPlayQueueStartingAt(item), true));
}
StreamDialogEntry.start_here_on_background.setCustomAction(
(fragment, infoItemDuplicate) -> NavigationHelper.playOnBackgroundPlayer(context, getPlayQueueStartingAt(item), true));
StreamDialogEntry.delete.setCustomAction((fragment, infoItemDuplicate) ->
deleteEntry(Math.max(itemListAdapter.getItemsList().indexOf(item), 0)));

View File

@ -1,13 +1,12 @@
package org.schabi.newpipe.local.holder;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import java.text.DateFormat;
@ -40,8 +39,8 @@ public abstract class LocalItemHolder extends RecyclerView.ViewHolder {
this.itemBuilder = itemBuilder;
}
public abstract void updateFromItem(final LocalItem item, @Nullable final StreamStateEntity state, final DateFormat dateFormat);
public abstract void updateFromItem(final LocalItem item, HistoryRecordManager historyRecordManager, final DateFormat dateFormat);
public void updateState(final LocalItem localItem, @Nullable final StreamStateEntity state) {
public void updateState(final LocalItem localItem, HistoryRecordManager historyRecordManager) {
}
}

View File

@ -1,13 +1,12 @@
package org.schabi.newpipe.local.holder;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.ImageDisplayConstants;
import java.text.DateFormat;
@ -23,7 +22,7 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder {
}
@Override
public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) {
public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) {
if (!(localItem instanceof PlaylistMetadataEntry)) return;
final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem;
@ -34,6 +33,6 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder {
itemBuilder.displayImage(item.thumbnailUrl, itemThumbnailView,
ImageDisplayConstants.DISPLAY_PLAYLIST_OPTIONS);
super.updateFromItem(localItem, state, dateFormat);
super.updateFromItem(localItem, historyRecordManager, dateFormat);
}
}

View File

@ -1,6 +1,5 @@
package org.schabi.newpipe.local.holder;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.view.MotionEvent;
import android.view.View;
@ -14,12 +13,14 @@ import org.schabi.newpipe.database.playlist.PlaylistStreamEntry;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.AnimationUtils;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.views.AnimatedProgressBar;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
@ -47,7 +48,7 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
}
@Override
public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) {
public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) {
if (!(localItem instanceof PlaylistStreamEntry)) return;
final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem;
@ -60,6 +61,8 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),
R.color.duration_background_color));
itemDurationView.setVisibility(View.VISIBLE);
StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList<LocalItem>() {{ add(localItem); }}).blockingGet().get(0);
if (state != null) {
itemProgressView.setVisibility(View.VISIBLE);
itemProgressView.setMax((int) item.duration);
@ -94,9 +97,11 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
}
@Override
public void updateState(LocalItem localItem, @Nullable StreamStateEntity state) {
public void updateState(LocalItem localItem, HistoryRecordManager historyRecordManager) {
if (!(localItem instanceof PlaylistStreamEntry)) return;
final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem;
StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList<LocalItem>() {{ add(localItem); }}).blockingGet().get(0);
if (state != null && item.duration > 0) {
itemProgressView.setMax((int) item.duration);
if (itemProgressView.getVisibility() == View.VISIBLE) {

View File

@ -13,12 +13,14 @@ import org.schabi.newpipe.database.stream.StreamStatisticsEntry;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.AnimationUtils;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.views.AnimatedProgressBar;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
/*
@ -76,7 +78,7 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
}
@Override
public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) {
public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) {
if (!(localItem instanceof StreamStatisticsEntry)) return;
final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem;
@ -88,6 +90,8 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),
R.color.duration_background_color));
itemDurationView.setVisibility(View.VISIBLE);
StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList<LocalItem>() {{ add(localItem); }}).blockingGet().get(0);
if (state != null) {
itemProgressView.setVisibility(View.VISIBLE);
itemProgressView.setMax((int) item.duration);
@ -124,9 +128,11 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
}
@Override
public void updateState(LocalItem localItem, @Nullable StreamStateEntity state) {
public void updateState(LocalItem localItem, HistoryRecordManager historyRecordManager) {
if (!(localItem instanceof StreamStatisticsEntry)) return;
final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem;
StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList<LocalItem>() {{ add(localItem); }}).blockingGet().get(0);
if (state != null && item.duration > 0) {
itemProgressView.setMax((int) item.duration);
if (itemProgressView.getVisibility() == View.VISIBLE) {

View File

@ -1,14 +1,13 @@
package org.schabi.newpipe.local.holder;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import java.text.DateFormat;
@ -33,7 +32,7 @@ public abstract class PlaylistItemHolder extends LocalItemHolder {
}
@Override
public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) {
public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) {
itemView.setOnClickListener(view -> {
if (itemBuilder.getOnItemSelectedListener() != null) {
itemBuilder.getOnItemSelectedListener().selected(localItem);

View File

@ -1,13 +1,12 @@
package org.schabi.newpipe.local.holder;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
@ -23,7 +22,7 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder {
}
@Override
public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) {
public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) {
if (!(localItem instanceof PlaylistRemoteEntity)) return;
final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem;
@ -35,6 +34,6 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder {
itemBuilder.displayImage(item.getThumbnailUrl(), itemThumbnailView,
ImageDisplayConstants.DISPLAY_PLAYLIST_OPTIONS);
super.updateFromItem(localItem, state, dateFormat);
super.updateFromItem(localItem, historyRecordManager, dateFormat);
}
}

View File

@ -511,6 +511,10 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
// Utils
//////////////////////////////////////////////////////////////////////////*/
private PlayQueue getPlayQueueStartingAt(PlaylistStreamEntry infoItem) {
return getPlayQueue(Math.max(itemListAdapter.getItemsList().indexOf(infoItem), 0));
}
protected void showStreamItemDialog(final PlaylistStreamEntry item) {
final Context context = getContext();
final Activity activity = getActivity();
@ -535,8 +539,13 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
StreamDialogEntry.delete,
StreamDialogEntry.append_playlist,
StreamDialogEntry.share);
StreamDialogEntry.start_here_on_popup.setCustomAction(
(fragment, infoItemDuplicate) -> NavigationHelper.playOnPopupPlayer(context, getPlayQueueStartingAt(item), true));
}
StreamDialogEntry.start_here_on_background.setCustomAction(
(fragment, infoItemDuplicate) -> NavigationHelper.playOnBackgroundPlayer(context, getPlayQueueStartingAt(item), true));
StreamDialogEntry.set_as_playlist_thumbnail.setCustomAction(
(fragment, infoItemDuplicate) -> changeThumbnailUrl(item.thumbnailUrl));
StreamDialogEntry.delete.setCustomAction(

View File

@ -130,7 +130,6 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
@Override
public void onDetach() {
infoListAdapter.dispose();
super.onDetach();
}
@ -153,8 +152,6 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
}
updateFlags = 0;
}
itemsList.post(infoListAdapter::updateStates);
}
@Override
@ -382,7 +379,6 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
});
//noinspection ConstantConditions
whatsNewItemListHeader.setOnClickListener(v -> {
FragmentManager fragmentManager = getFM();
NavigationHelper.openWhatsNewFragment(fragmentManager);
@ -430,12 +426,12 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
}
private void shareChannel (ChannelInfoItem selectedItem) {
ShareUtils.shareUrl(this.getContext(), selectedItem.getName(), selectedItem.getUrl());
private void shareChannel(ChannelInfoItem selectedItem) {
ShareUtils.shareUrl(getContext(), selectedItem.getName(), selectedItem.getUrl());
}
@SuppressLint("CheckResult")
private void deleteChannel (ChannelInfoItem selectedItem) {
private void deleteChannel(ChannelInfoItem selectedItem) {
subscriptionService.subscriptionTable()
.getSubscription(selectedItem.getServiceId(), selectedItem.getUrl())
.toObservable()
@ -447,7 +443,7 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
private Observer<List<SubscriptionEntity>> getDeleteObserver(){
private Observer<List<SubscriptionEntity>> getDeleteObserver() {
return new Observer<List<SubscriptionEntity>>() {
@Override
public void onSubscribe(Disposable d) {

View File

@ -187,6 +187,7 @@ public abstract class BasePlayer implements
protected MediaSessionManager mediaSessionManager;
private boolean isPrepared = false;
private Disposable stateLoader;
//////////////////////////////////////////////////////////////////////////*/
@ -283,16 +284,14 @@ public abstract class BasePlayer implements
) {
simpleExoPlayer.seekTo(playQueue.getIndex(), queue.getItem().getRecoveryPosition());
return;
} else if (intent.getBooleanExtra(RESUME_PLAYBACK, false) && isPlaybackResumeEnabled()) {
final PlayQueueItem item = queue.getItem();
if (item != null && item.getRecoveryPosition() == PlayQueueItem.RECOVERY_UNSET && isPlaybackResumeEnabled()) {
final Disposable stateLoader = recordManager.loadStreamState(item)
if (item != null && item.getRecoveryPosition() == PlayQueueItem.RECOVERY_UNSET) {
stateLoader = recordManager.loadStreamState(item)
.observeOn(AndroidSchedulers.mainThread())
.doFinally(() -> {
if (simpleExoPlayer == null) return; // doFinally called while closing
initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence,
/*playOnInit=*/true);
})
.doFinally(() -> initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence,
/*playOnInit=*/true))
.subscribe(
state -> queue.setRecovery(queue.getIndex(), state.getProgressTime()),
error -> {
@ -334,13 +333,13 @@ public abstract class BasePlayer implements
simpleExoPlayer.removeListener(this);
simpleExoPlayer.stop();
simpleExoPlayer.release();
simpleExoPlayer = null;
}
if (isProgressLoopRunning()) stopProgressLoop();
if (playQueue != null) playQueue.dispose();
if (audioReactor != null) audioReactor.dispose();
if (playbackManager != null) playbackManager.dispose();
if (mediaSessionManager != null) mediaSessionManager.dispose();
if (stateLoader != null) stateLoader.dispose();
if (playQueueAdapter != null) {
playQueueAdapter.unsetSelectedListener();
@ -1050,27 +1049,33 @@ public abstract class BasePlayer implements
private void savePlaybackState(final StreamInfo info, final long progress) {
if (info == null) return;
if (DEBUG) Log.d(TAG, "savePlaybackState() called");
final Disposable stateSaver = recordManager.saveStreamState(info, progress)
.observeOn(AndroidSchedulers.mainThread())
.doOnError((e) -> {
if (DEBUG) e.printStackTrace();
})
.onErrorComplete()
.subscribe();
databaseUpdateReactor.add(stateSaver);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true)) {
final Disposable stateSaver = recordManager.saveStreamState(info, progress)
.observeOn(AndroidSchedulers.mainThread())
.doOnError((e) -> {
if (DEBUG) e.printStackTrace();
})
.onErrorComplete()
.subscribe();
databaseUpdateReactor.add(stateSaver);
}
}
private void resetPlaybackState(final PlayQueueItem queueItem) {
if (queueItem == null) return;
final Disposable stateSaver = queueItem.getStream()
.flatMapCompletable(info -> recordManager.saveStreamState(info, 0))
.observeOn(AndroidSchedulers.mainThread())
.doOnError((e) -> {
if (DEBUG) e.printStackTrace();
})
.onErrorComplete()
.subscribe();
databaseUpdateReactor.add(stateSaver);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true)) {
final Disposable stateSaver = queueItem.getStream()
.flatMapCompletable(info -> recordManager.saveStreamState(info, 0))
.observeOn(AndroidSchedulers.mainThread())
.doOnError((e) -> {
if (DEBUG) e.printStackTrace();
})
.onErrorComplete()
.subscribe();
databaseUpdateReactor.add(stateSaver);
}
}
public void resetPlaybackState(final StreamInfo info) {

View File

@ -274,7 +274,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
else if (v instanceof String)
prefEdit.putString(key, ((String) v));
}
prefEdit.apply();
prefEdit.commit();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {

View File

@ -18,7 +18,7 @@ import io.reactivex.disposables.Disposable;
public class HistorySettingsFragment extends BasePreferenceFragment {
private String cacheWipeKey;
private String viewsHistroyClearKey;
private String viewsHistoryClearKey;
private String searchHistoryClearKey;
private HistoryRecordManager recordManager;
private CompositeDisposable disposables;
@ -27,7 +27,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cacheWipeKey = getString(R.string.metadata_cache_wipe_key);
viewsHistroyClearKey = getString(R.string.clear_views_history_key);
viewsHistoryClearKey = getString(R.string.clear_views_history_key);
searchHistoryClearKey = getString(R.string.clear_search_history_key);
recordManager = new HistoryRecordManager(getActivity());
disposables = new CompositeDisposable();
@ -46,16 +46,31 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
Toast.LENGTH_SHORT).show();
}
if (preference.getKey().equals(viewsHistroyClearKey)) {
if (preference.getKey().equals(viewsHistoryClearKey)) {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.delete_view_history_alert)
.setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))
.setPositiveButton(R.string.delete, ((dialog, which) -> {
final Disposable onDeletePlaybackStates = recordManager.deleteCompelteStreamStateHistory()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
howManyDeleted -> Toast.makeText(getActivity(),
R.string.watch_history_states_deleted,
Toast.LENGTH_SHORT).show(),
throwable -> ErrorActivity.reportError(getContext(),
throwable,
SettingsActivity.class, null,
ErrorActivity.ErrorInfo.make(
UserAction.DELETE_FROM_HISTORY,
"none",
"Delete view history",
R.string.general_error)));
final Disposable onDelete = recordManager.deleteWholeStreamHistory()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
howManyDeleted -> Toast.makeText(getActivity(),
R.string.view_history_deleted,
R.string.watch_history_deleted,
Toast.LENGTH_SHORT).show(),
throwable -> ErrorActivity.reportError(getContext(),
throwable,
@ -78,6 +93,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
"none",
"Delete search history",
R.string.general_error)));
disposables.add(onDeletePlaybackStates);
disposables.add(onClearOrphans);
disposables.add(onDelete);
}))
@ -90,7 +106,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
.setTitle(R.string.delete_search_history_alert)
.setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))
.setPositiveButton(R.string.delete, ((dialog, which) -> {
final Disposable onDelete = recordManager.deleteWholeSearchHistory()
final Disposable onDelete = recordManager.deleteCompleteSearchHistory()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
howManyDeleted -> Toast.makeText(getActivity(),

View File

@ -228,6 +228,10 @@ public final class ExtractorHelper {
});
}
public static boolean isCached(final int serviceId, final String url, InfoItem.InfoType infoType) {
return null != loadFromCache(serviceId, url, infoType).blockingGet();
}
/**
* A simple and general error handler that show a Toast for known exceptions, and for others, opens the report error activity with the (optional) error message.
*/

View File

@ -666,9 +666,9 @@ public class DownloadManager {
continue;
if (mission.running)
paused = true;
else
running = true;
else
paused = true;
}
}

View File

@ -122,14 +122,8 @@ public class MissionAdapter extends Adapter<ViewHolder> {
break;
}
if (mStartButton != null && mPauseButton != null) switch (msg.what) {
case DownloadManagerService.MESSAGE_DELETED:
case DownloadManagerService.MESSAGE_ERROR:
case DownloadManagerService.MESSAGE_FINISHED:
case DownloadManagerService.MESSAGE_PAUSED:
checkMasterButtonsVisibility();
break;
}
if (mStartButton != null && mPauseButton != null)
checkMasterButtonsVisibility();
}
};
@ -163,8 +157,7 @@ public class MissionAdapter extends Adapter<ViewHolder> {
mPendingDownloadsItems.remove(h);
if (mPendingDownloadsItems.size() < 1) {
setAutoRefresh(false);
if (mStartButton != null) mStartButton.setVisible(false);
if (mPauseButton != null) mPauseButton.setVisible(false);
checkMasterButtonsVisibility();
}
}
@ -664,11 +657,11 @@ public class MissionAdapter extends Adapter<ViewHolder> {
if (mEmptyMessage.getVisibility() != flag) mEmptyMessage.setVisibility(flag);
}
private void checkMasterButtonsVisibility() {
public void checkMasterButtonsVisibility() {
boolean[] state = mIterator.hasValidPendingMissions();
mStartButton.setVisible(state[0]);
mPauseButton.setVisible(state[1]);
mPauseButton.setVisible(state[0]);
mStartButton.setVisible(state[1]);
}
public void ensurePausedMissions() {

View File

@ -138,6 +138,7 @@ public class MissionsFragment extends Fragment {
* deprecated in API level 23,
* but must remain to allow compatibility with api<23
*/
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
@ -273,6 +274,7 @@ public class MissionsFragment extends Fragment {
}
mBinder.addMissionEventListener(mAdapter.getMessenger());
mAdapter.checkMasterButtonsVisibility();
}
if (mBinder != null) mBinder.enableNotifications(false);
}

View File

@ -1,11 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/switch_mode"
android:icon="?attr/ic_grid"
android:title="@string/grid"
app:showAsAction="ifRoom" />
tools:ignore="AlwaysShowAction"
app:showAsAction="always" />
<item android:id="@+id/start_downloads"
android:visible="false"

View File

@ -307,11 +307,6 @@
<string name="playlist_delete_failure">لا يمكن حذف قائمة التشغيل.</string>
<string name="resize_fill">ملئ الشاشة</string>
<string name="resize_zoom">تكبير</string>
<string name="caption_font_size_settings_title">حجم خط التسمية</string>
<string name="smaller_caption_font_size">أصغر خط</string>
<string name="normal_caption_font_size">خط عادي</string>
<string name="larger_caption_font_size">خط ذو حجم كبير</string>
<string name="live_sync">مُزامَنة</string>
<string name="controls_download_desc">تنزيل ملف البث</string>
<string name="tab_bookmarks">الإشارات المرجعية</string>
<string name="use_inexact_seek_title">استعمال التقديم السريع الغير دقيق</string>
@ -354,7 +349,7 @@
<string name="clear_views_history_title">محو سجل المشاهدة</string>
<string name="clear_views_history_summary">احذف سِجل الفيديوهات التي تم تشغيلها</string>
<string name="delete_view_history_alert">حذف سجل المشاهدة بالكامل\?</string>
<string name="view_history_deleted">تم حذف سجل المشاهدة.</string>
<string name="watch_history_deleted">تم حذف سجل المشاهدة.</string>
<string name="clear_search_history_title">محو سجل البحث</string>
<string name="clear_search_history_summary">يحذف تاريخ البحث عن الكلمات الرئيسية</string>
<string name="delete_search_history_alert">حذف سِجل البحث بالكامل\?</string>
@ -496,6 +491,5 @@
</plurals>
<string name="no_comments">لا توجد تعليقات</string>
<string name="error_unable_to_load_comments">تعذر تحميل التعليقات</string>
<string name="direct_on_background">التشغيل مباشرة في الخلفية</string>
<string name="close">إغلاق</string>
</resources>

View File

@ -368,11 +368,6 @@
<string name="resize_fill">RELLENAR</string>
<string name="resize_zoom">ZOOM</string>
<string name="caption_font_size_settings_title">Tamañu de fonte de sotítulos</string>
<string name="smaller_caption_font_size">Fonte más pequeña</string>
<string name="normal_caption_font_size">Fonte media</string>
<string name="larger_caption_font_size">Fonte más grande</string>
<string name="enable_leak_canary_title">Activar LeakCanary</string>
<string name="enable_leak_canary_summary">La supervisión d\'escapes de memoria podría facer que l\'aplicación nun respuenda al volquiar la pila</string>

View File

@ -143,7 +143,7 @@
<string name="clear_views_history_title">Ачысціць гісторыю праглядаў</string>
<string name="clear_views_history_summary">Выдаліць гісторыю прайграных патокаў</string>
<string name="delete_view_history_alert">Выдаліць усю гісторыю праглядаў.</string>
<string name="view_history_deleted">Гісторыя праглядаў выдалена.</string>
<string name="watch_history_deleted">Гісторыя праглядаў выдалена.</string>
<string name="clear_search_history_title">Ачысціць гісторыю пошуку</string>
<string name="clear_search_history_summary">Выдаліць гісторыю пошукавых запытаў</string>
<string name="delete_search_history_alert">Выдаліць усю гісторыю пошуку.</string>
@ -405,5 +405,4 @@
<string name="minimize_on_exit_background_description">Фонавы плэер</string>
<string name="minimize_on_exit_popup_description">Плэер у акне</string>
<string name="unsubscribe">Адпісацца</string>
<string name="direct_on_background">Іграць \"у фоне\"</string>
</resources>

View File

@ -216,7 +216,7 @@
<string name="export_data_summary">Експортиране на историята, абонаментите и плейлистите</string>
<string name="clear_views_history_title">Изтрий историята с изгледани</string>
<string name="delete_view_history_alert">Изтрий цялата история с изгледани\?</string>
<string name="view_history_deleted">Историята с изгледани е изтрита.</string>
<string name="watch_history_deleted">Историята с изгледани е изтрита.</string>
<string name="clear_search_history_title">Изтрий историята на търсенията</string>
<string name="clear_search_history_summary">Изтрива историята с въвежданите за търсене ключови думи</string>
<string name="delete_search_history_alert">Изтрий цялата история на търсенията\?</string>

View File

@ -333,18 +333,13 @@
<string name="resize_fill">Omple</string>
<string name="resize_zoom">Escala</string>
<string name="caption_auto_generated">Generats automàticament</string>
<string name="caption_font_size_settings_title">Mida dels subtítols</string>
<string name="smaller_caption_font_size">Mida més petita</string>
<string name="normal_caption_font_size">Mida normal</string>
<string name="larger_caption_font_size">Mida més gran</string>
<string name="enable_leak_canary_title">Habilita el LeakCanary</string>
<string name="previous_export">Darrera exportació</string>
<string name="subscriptions_import_unsuccessful">No s\'han pogut importar les subscripcions</string>
<string name="subscriptions_export_unsuccessful">No s\'han pogut exportar les subscripcions</string>
<string name="unhook_checkbox">Desvincula (pot provocar distorsió)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="metadata_cache_wipe_summary">Elimina totes les dades de llocs web de la memòria cau</string>
<string name="auto_queue_summary">Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició.</string>
<string name="auto_queue_summary">Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició</string>
<string name="show_hold_to_append_title">Mostra els missatges d\'ajuda</string>
<string name="show_hold_to_append_summary">Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo</string>
<string name="info_labels">Què ha passat:\\nPetició:\\nIdioma del contingut:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO:</string>
@ -376,7 +371,7 @@
<string name="clear_views_history_title">Esborra l\'historial de reproduccions</string>
<string name="clear_views_history_summary">Esborra l\'historial dels vídeos que s\'han reproduït</string>
<string name="delete_view_history_alert">Voleu esborrar tot l\'historial de reproduccions\?</string>
<string name="view_history_deleted">S\'ha esborrat l\'historial de reproduccions.</string>
<string name="watch_history_deleted">S\'ha esborrat l\'historial de reproduccions.</string>
<string name="clear_search_history_title">Esborra l\'historial de cerca</string>
<string name="clear_search_history_summary">Esborra l\'historial de paraules cercades</string>
<string name="delete_search_history_alert">Voleu esborrar tot l\'historial de cerca\?</string>
@ -465,6 +460,13 @@
<string name="autoplay_title">Reproducció automàtica</string>
<string name="no_comments">No hi ha comentaris</string>
<string name="error_unable_to_load_comments">No s\'han pogut carregar els comentaris</string>
<string name="direct_on_background">Reprodueix directament en segon pla</string>
<string name="close">Tanca</string>
<string name="saved_tabs_invalid_json">S\'estan utilitzant les pestanyes per defecte, s\'ha produït un error en llegir les pestanyes desades</string>
<string name="updates_setting_description">Mostra una notificació per demanar l\'actualització de l\'aplicació si hi ha una nova versió disponible</string>
<string name="app_update_notification_content_text">Toca per baixar</string>
<string name="error_http_no_content">El servidor no està enviant dades</string>
<plurals name="comments">
<item quantity="one">Comentaris</item>
<item quantity="other"></item>
</plurals>
</resources>

View File

@ -134,7 +134,6 @@
<string name="url_not_supported_toast">不支持该网址</string>
<string name="default_content_country_title">默认内容的国家</string>
<string name="service_title">服务</string>
<string name="search_language_title">默认内容的语言</string>
<string name="settings_category_player_title">播放器</string>
<string name="settings_category_player_behavior_title">行为</string>
<string name="settings_category_video_audio_title">视频与音频</string>
@ -188,7 +187,7 @@
<string name="export_data_summary">导出历史记录、订阅和播放列表</string>
<string name="clear_views_history_summary">删除播放过的媒体历史记录</string>
<string name="delete_view_history_alert">确定要清除所有观看历史记录吗?</string>
<string name="view_history_deleted">观看历史记录已清除。</string>
<string name="watch_history_deleted">观看历史记录已清除。</string>
<string name="clear_search_history_title">清除搜索历史记录</string>
<string name="clear_search_history_summary">清除搜索关键词的历史记录</string>
<string name="delete_search_history_alert">确定要清除所有搜索历史记录吗?</string>

View File

@ -316,13 +316,7 @@ otevření ve vyskakovacím okně</string>
<string name="resize_fit">Přizpůsobit</string>
<string name="resize_fill">Vyplnit</string>
<string name="resize_zoom">Zvětšit</string>
<string name="caption_font_size_settings_title">Velikost písma nadpisu</string>
<string name="smaller_caption_font_size">Menší písmo</string>
<string name="normal_caption_font_size">Normální písmo</string>
<string name="larger_caption_font_size">Větší písmo</string>
<string name="toggle_leak_canary">Sledovat únik paměti</string>
<string name="disable_leak_canary_notice">Sledování úniku paměti vypnuto</string>
<string name="enable_leak_canary_notice">Sledování úniku paměti povoleno, aplikace může při zátěži přestat reagovat</string>
<string name="settings_category_debug_title">Ladění</string>
<string name="caption_auto_generated">"Automaticky generováno "</string>
<string name="enable_leak_canary_title">Povolit službu LeakCanary</string>
@ -377,7 +371,6 @@ otevření ve vyskakovacím okně</string>
<string name="playback_tempo">Rychlost</string>
<string name="playback_pitch">Výška tónu</string>
<string name="unhook_checkbox">Rozpojit (může způsobit zkreslení)</string>
<string name="playback_nightcore">Nightcore mód</string>
<string name="playback_default">Výchozí nastavení</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>
@ -388,7 +381,7 @@ otevření ve vyskakovacím okně</string>
<string name="clear_views_history_title">Vymazat historii sledování</string>
<string name="clear_views_history_summary">Vymaže historii přehrávaných streamů</string>
<string name="delete_view_history_alert">Vymazat celkovou historii sledování\?</string>
<string name="view_history_deleted">Historie sledování smazána.</string>
<string name="watch_history_deleted">Historie sledování smazána.</string>
<string name="clear_search_history_title">Vymazat historii vyhledávání</string>
<string name="clear_search_history_summary">Vymaže historii vyhledávaných klíčových slov</string>
<string name="delete_search_history_alert">Vymazat celkovou historii vyhledávání\?</string>
@ -492,7 +485,6 @@ otevření ve vyskakovacím okně</string>
</plurals>
<string name="no_comments">Žádné komentáře</string>
<string name="error_unable_to_load_comments">Nelze načíst komentáře</string>
<string name="direct_on_background">Přehrát přímo na pozadí</string>
<string name="close">Zavřít</string>
<string name="download_to_sdcard_error_message">Stahování na externí SD kartu ještě není možné. Resetovat umístění složky pro stahování\?</string>
</resources>

View File

@ -158,7 +158,7 @@
<string name="clear_views_history_title">Slet visningshistorik</string>
<string name="clear_views_history_summary">Sletter historikken for viste videoer</string>
<string name="delete_view_history_alert">Slet hele visningshistorikken\?</string>
<string name="view_history_deleted">Visningshistorikken blev slettet.</string>
<string name="watch_history_deleted">Visningshistorikken blev slettet.</string>
<string name="clear_search_history_title">Slet søgehistorik</string>
<string name="clear_search_history_summary">Sletter historikken for søgeord</string>
<string name="delete_search_history_alert">Slet hele søgehistorikken\?</string>

View File

@ -302,9 +302,7 @@
<string name="playlist_thumbnail_change_success">Vorschaubild der Wiedergabeliste geändert.</string>
<string name="playlist_delete_failure">Konnte Wiedergabeliste nicht löschen.</string>
<string name="caption_none">Keine Untertitel</string>
<string name="caption_font_size_settings_title">Schriftgröße der Untertitel</string>
<string name="dismiss">Abbrechen</string>
<string name="normal_caption_font_size">Normale Schriftgröße</string>
<string name="controls_download_desc">Stream-Datei herunterladen</string>
<string name="use_inexact_seek_title">Schnelle, ungenaue Suche verwenden</string>
<string name="use_inexact_seek_summary">Mit ungenauem Suchen kann die Abspielposition schneller erreicht werden, aber auf Kosten der Genauigkeit</string>
@ -314,8 +312,6 @@
<string name="file_name_empty_error">Dateiname darf nicht leer sein</string>
<string name="error_occurred_detail">Ein Fehler ist aufgetreten: %1$s</string>
<string name="caption_auto_generated">Automatisch erzeugt</string>
<string name="smaller_caption_font_size">Kleinere Schrift</string>
<string name="larger_caption_font_size">Größere Schrift</string>
<string name="enable_leak_canary_title">LeakCanary aktivieren</string>
<string name="import_from">Import von</string>
<string name="export_to">Export nach</string>
@ -344,7 +340,6 @@
<string name="playback_tempo">Geschwindigkeit</string>
<string name="playback_pitch">Tonhöhe</string>
<string name="unhook_checkbox">Verknüpfung aufheben (kann zu Verzerrungen führen)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">Standard</string>
<string name="download_thumbnail_summary">Abschalten, um das Laden von Miniaturansichten zu verhindern, was Daten- und Speicherverbrauch spart. Änderungen löschen den Bildzwischenspeicher sowohl im Arbeitsspeicher als auch auf dem internen Speicher.</string>
<string name="auto_queue_title">Nächsten Stream automatisch einreihen</string>
@ -378,7 +373,7 @@
<string name="clear_views_history_title">Wiedergabeverlauf löschen</string>
<string name="clear_views_history_summary">Löscht den Verlauf der abgespielten Streams</string>
<string name="delete_view_history_alert">Den ganzen Wiedergabeverlauf löschen\?</string>
<string name="view_history_deleted">Wiedergabeverlauf gelöscht.</string>
<string name="watch_history_deleted">Wiedergabeverlauf gelöscht.</string>
<string name="clear_search_history_title">Suchverlauf löschen</string>
<string name="clear_search_history_summary">Löscht den Verlauf der Suchbegriffe</string>
<string name="delete_search_history_alert">Den gesamten Suchverlauf löschen\?</string>
@ -482,6 +477,5 @@
</plurals>
<string name="no_comments">Keine Kommentare</string>
<string name="error_unable_to_load_comments">Kommentare konnten nicht geladen werden</string>
<string name="direct_on_background">Direkt im Hintergrund wiedergeben</string>
<string name="close">Schließen</string>
</resources>

View File

@ -175,7 +175,7 @@
<string name="clear_views_history_title">Εκκαθάριση ιστορικού προβολής</string>
<string name="clear_views_history_summary">Διαγράφει το ιστορικό των ροών που έχουν αναπαραχθεί</string>
<string name="delete_view_history_alert">Διαγραφή ολόκληρου του ιστορικού προβολής;</string>
<string name="view_history_deleted">Το στορικό προβολής διαγράφηκε.</string>
<string name="watch_history_deleted">Το στορικό προβολής διαγράφηκε.</string>
<string name="clear_search_history_title">Διαγραφή ιστορικού αναζητήσεων</string>
<string name="clear_search_history_summary">Διαγράφει το ιστορικό αναζητήσεών σας</string>
<string name="delete_search_history_alert">Διαγραφή ολόκληρου του ιστορικού αναζητήσεων;</string>
@ -475,6 +475,5 @@
</plurals>
<string name="no_comments">Χωρίς σχόλια</string>
<string name="error_unable_to_load_comments">Δεν ήταν δυνατή η φόρτωση σχολίων</string>
<string name="direct_on_background">Αναπαραγωγή απευθείας στο παρασκήνιο</string>
<string name="close">Κλείσιμο</string>
</resources>

View File

@ -1,4 +1,4 @@
<?xml version='1.0' encoding='UTF-8'?>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="view_count_text">%1$s vidoj</string>
<string name="upload_date_text">Eldonita je %1$s</string>
@ -15,7 +15,6 @@
<string name="screen_rotation">turno</string>
<string name="use_external_video_player_title">Uzi eksteran videoludilon</string>
<string name="use_external_audio_player_title">Uzi eksteran sonludilon</string>
<string name="default_resolution_title">Defaŭlta distingivo</string>
<string name="play_with_kodi_title">Ludi per Kodi</string>
<string name="show_play_with_kodi_title">Montri \"Ludi per Kodi\"-opcion</string>
@ -24,7 +23,6 @@
<string name="theme_title">Etoso</string>
<string name="dark_theme_title">Malluma</string>
<string name="light_theme_title">Luma</string>
<string name="download_dialog_title">Elŝuti</string>
<string name="next_video_title">Sekva video</string>
<string name="url_not_supported_toast">Ligilo ne subtenita</string>
@ -37,7 +35,6 @@
<string name="general_error">Eraro</string>
<string name="network_error">Reteraro</string>
<string name="content_not_available">Enhavo ne estas disponebla</string>
<string name="detail_likes_img_view_description">Ŝatoj</string>
<string name="detail_dislikes_img_view_description">Malŝatoj</string>
<string name="use_tor_title">Uzi la programon Tor</string>
@ -55,27 +52,22 @@
<string name="download_path_title">Elŝutujo por videoj</string>
<string name="download_path_audio_title">Elŝutujo por muziko</string>
<string name="use_tor_summary">(Eksperimenta) Devigi elŝuttrafikon tra Tor por pli bona privateco (elsendfluaj videoj estas ankoraŭ ne subtenitaj).</string>
<string name="show_play_with_kodi_summary">Montri opcion por ludi videon per la aplikaĵo Kodi</string>
<string name="download_path_summary">Dosierujo por konservi elŝutitajn videojn</string>
<string name="download_path_audio_summary">Dosierujo por konservi elŝutitan muzikon</string>
<string name="download_path_dialog_title">Elektu lokon por konservi elŝutitajn videojn</string>
<string name="download_path_audio_dialog_title">Elektu lokon por konservi elŝutitan muzikon</string>
<string name="content">Enhavo</string>
<string name="error_report_button_text">Raporti eraron per retpoŝto</string>
<string name="error_snackbar_action">RAPORTI</string>
<string name="what_device_headline">Informoj:</string>
<string name="your_comment">Via komento (en la angla):</string>
<string name="error_details_headline">Detaloj:</string>
<string name="report_error">Raporti eraron</string>
<string name="video">Video</string>
<string name="retry">Reprovi</string>
<string name="main_bg_subtitle">Tapu serĉo por komenci</string>
<string name="no_player_found_toast">Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin)</string>
<string name="main_bg_subtitle">Tapu serĉo por komenci</string>
<string name="no_player_found_toast">Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin).</string>
<string name="open_in_popup_mode">Malfermi en ŝprucfenestron modon</string>
<string name="use_external_video_player_summary">Iuj rezolucioj NE havos aŭdion kiam ĉi tiu eblo estas ebligita</string>
<string name="popup_mode_share_menu_title">NewPipe ŝprucfenestron modon</string>
@ -83,20 +75,16 @@
<string name="subscribed_button_title">Abonita</string>
<string name="channel_unsubscribed">Kanalo malabonita</string>
<string name="subscription_change_failed">Neebla ŝanĝi abonon</string>
<string name="controls_download_desc">Elŝutu dosieron.</string>
<string name="controls_download_desc">Elŝutu dosieron</string>
<string name="subscription_update_failed">Ne eblas ĝisdatigi abonon</string>
<string name="show_info">Montri informon</string>
<string name="tab_main">Ĉefa</string>
<string name="tab_subscriptions">Abonoj</string>
<string name="tab_bookmarks">Legosigno</string>
<string name="fragment_whats_new">Kio novas</string>
<string name="controls_background_title">Fono</string>
<string name="controls_popup_title">ŝprucfenestron</string>
<string name="controls_add_to_playlist_title">Aldonu al</string>
<string name="autoplay_by_calling_app_title">Aŭtomata play</string>
<string name="autoplay_by_calling_app_summary">Ludas video kiam NewPipe vokas de alia programo</string>
<string name="default_popup_resolution_title">Defaŭlta popup rezolucio</string>
@ -109,4 +97,4 @@
<string name="use_inexact_seek_title">Uzu rapide, ne preciza serĉon</string>
<string name="use_inexact_seek_summary">Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco</string>
<string name="download_thumbnail_title">Ŝarĝi bildetojn</string>
</resources>
</resources>

View File

@ -322,8 +322,6 @@ abrir en modo popup</string>
<string name="use_inexact_seek_summary">La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión</string>
<string name="auto_queue_title">Auto-encolar la siguiente transmisión</string>
<string name="auto_queue_summary">Añadir de forma automática un vídeo relacionado con el último vídeo reproducido en una cola no repetitiva</string>
<string name="live">DIRECTO</string>
<string name="live_sync">SINCRONIZAR</string>
<string name="file">Archivo</string>
<string name="missing_file">Archivo movido o eliminado</string>
<string name="invalid_directory">No existe el directorio</string>
@ -375,7 +373,7 @@ abrir en modo popup</string>
<string name="clear_views_history_title">Borrar historial de reproducciones</string>
<string name="clear_views_history_summary">Elimina el historial de las transmisiones reproducidas</string>
<string name="delete_view_history_alert">¿Eliminar todo el historial de reproducciones\?</string>
<string name="view_history_deleted">Historial de reproducciones eliminado.</string>
<string name="watch_history_deleted">Historial de reproducciones eliminado.</string>
<string name="clear_search_history_title">Borrar historial de búsqueda</string>
<string name="clear_search_history_summary">Elimina el historial de palabras clave de búsqueda</string>
<string name="delete_search_history_alert">¿Eliminar todo el historial de búsqueda\?</string>
@ -498,6 +496,5 @@ abrir en modo popup</string>
</plurals>
<string name="no_comments">Sin comentarios</string>
<string name="error_unable_to_load_comments">No se pudo cargar comentarios</string>
<string name="direct_on_background">Reproducir directamente en segundo plano</string>
<string name="close">Cerrar</string>
</resources>

View File

@ -137,7 +137,7 @@
<string name="clear_views_history_title">Puhasta vaatamiste ajalugu</string>
<string name="clear_views_history_summary">Kustutab vaadatud voogude ajaloo</string>
<string name="delete_view_history_alert">Kas kustutada kogu vaatamiste ajalugu\?</string>
<string name="view_history_deleted">Vaatamiste ajalugu kustutati.</string>
<string name="watch_history_deleted">Vaatamiste ajalugu kustutati.</string>
<string name="clear_search_history_title">Kustuta otsinguajalugu</string>
<string name="clear_search_history_summary">Kustutab otsisõnade ajaloo</string>
<string name="delete_search_history_alert">Kas kustutada kogu otsinguajalugu\?</string>

View File

@ -290,7 +290,7 @@
<string name="clear_views_history_title">Garbitu ikusitakoaren historiala</string>
<string name="clear_views_history_summary">Jotako jarioen historiala ezabatzen du</string>
<string name="delete_view_history_alert">Ezabatu ikusitakoaren historia osoa\?</string>
<string name="view_history_deleted">Ikusitakoaren historiala ezabatuta.</string>
<string name="watch_history_deleted">Ikusitakoaren historiala ezabatuta.</string>
<string name="clear_search_history_title">Garbitu bilaketa historiala</string>
<string name="clear_search_history_summary">Ezabatu bilaketa gakoen historiala</string>
<string name="delete_search_history_alert">Ezabatu bilaketen historia osoa\?</string>
@ -374,7 +374,6 @@
<string name="playback_tempo">Tempoa</string>
<string name="playback_pitch">Tonua</string>
<string name="unhook_checkbox">Deslotu (distortsioa sor lezake)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">Lehenetsia</string>
<string name="import_settings">Ezarpenak ere inportatu nahi dituzu?</string>
<string name="use_inexact_seek_summary">Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du</string>
@ -477,6 +476,5 @@
</plurals>
<string name="no_comments">Iruzkinik ez</string>
<string name="error_unable_to_load_comments">Ezin izan dira iruzkinak kargatu</string>
<string name="direct_on_background">Erreproduzitu zuzenean bigarren planoan</string>
<string name="close">Itxi</string>
</resources>

View File

@ -55,10 +55,10 @@
<string name="general_error">خطا</string>
<string name="network_error">خطای شبکه</string>
<string name="could_not_load_thumbnails">نمی‌توان تمام بندانگشتی‌ها را بار کرد</string>
<string name="youtube_signature_decryption_error">نمی‌توان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد.</string>
<string name="parsing_error">نمی‌توان پایگاه وب را تجزیه کرد.</string>
<string name="light_parsing_error">نمی‌توان پایگاه وب را به صورت کامل تجزیه کرد.</string>
<string name="content_not_available">محتوا در دسترس نیست.</string>
<string name="youtube_signature_decryption_error">نمی‌توان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد</string>
<string name="parsing_error">نمی‌توان پایگاه وب را تجزیه کرد</string>
<string name="light_parsing_error">نمی‌توان پایگاه وب را به صورت کامل تجزیه کرد</string>
<string name="content_not_available">محتوا در دسترس نیست</string>
<string name="could_not_setup_download_menu">نمی‌توان فهرست بارگیری را برپا ساخت.</string>
<string name="live_streams_not_supported">جریان‌های زنده هنوز پشتیبانی نمی‌شوند</string>
<string name="could_not_get_stream">نمی‌توان هیچ جریانی را گرفت</string>
@ -170,7 +170,7 @@
<string name="minimize_on_exit_none_description">هیچ</string>
<string name="best_resolution">بهترین وضوح</string>
<string name="delete_view_history_alert">تمام تاریخچه نمایش پاک شود؟</string>
<string name="view_history_deleted">تاریخچه نمایش پاک شد.</string>
<string name="watch_history_deleted">تاریخچه نمایش پاک شد.</string>
<string name="clear_search_history_title">پاک‌کردن تاریخچه جستجو</string>
<string name="clear_search_history_summary">تاریخچه کلیدواژه‌های جستجو را پاک می‌کند</string>
<string name="delete_search_history_alert">تمام تاریخچه جستجو پاک شود؟</string>

View File

@ -315,7 +315,7 @@
<string name="clear_views_history_title">Poista katseluhistoria</string>
<string name="clear_views_history_summary">Poistaa toistohistorian</string>
<string name="delete_view_history_alert">Poista koko katseluhistoria.</string>
<string name="view_history_deleted">Katseluhistoria onnistuneesti poistettu.</string>
<string name="watch_history_deleted">Katseluhistoria onnistuneesti poistettu.</string>
<string name="clear_search_history_title">Poista hakuhistoria</string>
<string name="clear_search_history_summary">Poistaa historian haetuista videoista</string>
<string name="delete_search_history_alert">Poista koko hakuhistoria.</string>

View File

@ -308,10 +308,6 @@
<string name="caption_none">Aucuns sous-titres</string>
<string name="resize_fit">Ajuster</string>
<string name="resize_zoom">Zoom</string>
<string name="caption_font_size_settings_title">Taille des sous-titres</string>
<string name="smaller_caption_font_size">Petite</string>
<string name="normal_caption_font_size">Normale</string>
<string name="larger_caption_font_size">Grande</string>
<string name="use_inexact_seek_title">Recherche rapide approximative</string>
<string name="use_inexact_seek_summary">Permettre au lecteur d\'accéder plus rapidement à une position au détriment de la précision</string>
<string name="download_thumbnail_title">Charger les miniatures</string>
@ -373,12 +369,11 @@
<string name="caption_setting_title">Sous-titres</string>
<string name="caption_setting_description">Modifier la taille du texte et les styles d\'arrière-plan du lecteur. Redémarrage requis pour prendre effet.</string>
<string name="playback_pitch">Ton</string>
<string name="playback_nightcore">Nightcore</string>
<string name="toast_no_player">Aucune application installée pour lire ce fichier</string>
<string name="clear_views_history_title">Effacer l\'historique</string>
<string name="clear_views_history_summary">Supprimer l\'historique des flux regardés</string>
<string name="delete_view_history_alert">Supprimer tout l\'historique regardé \?</string>
<string name="view_history_deleted">Historique des vidéos vues supprimé.</string>
<string name="watch_history_deleted">Historique des vidéos vues supprimé.</string>
<string name="clear_search_history_title">Supprimer l\'historique des recherches</string>
<string name="clear_search_history_summary">Supprimer l\'historique de recherche par mot clef</string>
<string name="delete_search_history_alert">Supprimer tout l\'historique de recherche \?</string>
@ -483,6 +478,5 @@
</plurals>
<string name="no_comments">Pas de commentaires</string>
<string name="error_unable_to_load_comments">Impossible de charger les commentaires</string>
<string name="direct_on_background">Jouer directement en arrière-plan</string>
<string name="close">Fermer</string>
</resources>

View File

@ -93,7 +93,6 @@
<string name="url_not_supported_toast">Este URL non está soportado</string>
<string name="default_content_country_title">País predeterminado para o contido</string>
<string name="service_title">Servizo</string>
<string name="search_language_title">Idioma predeterminado do contido</string>
<string name="settings_category_player_title">Reprodutor</string>
<string name="settings_category_player_behavior_title">Comportamento</string>
<string name="settings_category_video_audio_title">Vídeo e audio</string>
@ -152,7 +151,7 @@
<string name="clear_views_history_title">Limpar historial de reproducións</string>
<string name="clear_views_history_summary">Elimina o historial de emisións reproducidas</string>
<string name="delete_view_history_alert">Elimina todo o historial de reproducións.</string>
<string name="view_history_deleted">O historial de reproducións foi eliminado.</string>
<string name="watch_history_deleted">O historial de reproducións foi eliminado.</string>
<string name="clear_search_history_title">Limpar o historial de procura</string>
<string name="clear_search_history_summary">Elimina o historial de termos procurados</string>
<string name="delete_search_history_alert">Elimina todo o historial de procura.</string>

View File

@ -277,7 +277,7 @@
<string name="metadata_cache_wipe_complete_notice">מטמון נתוני העל התרוקן</string>
<string name="export_data_summary">ייצוא היסטוריה, מינויים ורשימות נגינה</string>
<string name="clear_views_history_title">מחיקת היסטוריית הצפייה</string>
<string name="view_history_deleted">היסטוריית הצפייה נמחקה.</string>
<string name="watch_history_deleted">היסטוריית הצפייה נמחקה.</string>
<string name="clear_search_history_title">מחיקת היסטוריית החיפוש</string>
<string name="search_history_deleted">היסטוריית החיפוש נמחקה.</string>
<string name="invalid_file">הקובץ אינו קיים או שחסרה הרשאה לקרוא אותו או לכתוב אליו</string>
@ -471,7 +471,6 @@
<string name="max_retry_desc">מספר הניסיונות החוזרים המרבי בטרם ביטול ההורדה</string>
<string name="pause_downloads_on_mobile">להשהות בעת מעבר לתקשורת נתונים סלולרית</string>
<string name="pause_downloads_on_mobile_desc">הורדות שלא ניתן להשהות יופעלו מחדש</string>
<string name="missions_header_pending">בהמתנה</string>
<string name="show_comments_title">הצגת תגובות</string>
<string name="show_comments_summary">יש להשבית כדי להפסיק הצגת תגובות</string>
<string name="autoplay_title">ניגון אוטומטי</string>
@ -483,6 +482,5 @@
</plurals>
<string name="no_comments">אין תגובות</string>
<string name="error_unable_to_load_comments">לא ניתן לטעון תגובות</string>
<string name="direct_on_background">לנגן ישירות ברקע</string>
<string name="close">סגירה</string>
</resources>

View File

@ -310,10 +310,6 @@
<string name="resize_fit">फिट</string>
<string name="resize_fill">भरें</string>
<string name="resize_zoom">ज़ूम करें</string>
<string name="caption_font_size_settings_title">कैप्शन फ़ॉंट आकार</string>
<string name="smaller_caption_font_size">छोटे फ़ॉंट</string>
<string name="normal_caption_font_size">सामांय फ़ॉंट</string>
<string name="larger_caption_font_size">बड़ा फ़ॉंट</string>
<string name="settings_category_debug_title">डीबग करें</string>
<string name="caption_auto_generated">ऑटो-जनरेटेड</string>
<string name="enable_leak_canary_title">LeakCanary सक्षम करें</string>
@ -337,7 +333,7 @@
<string name="clear_views_history_title">देखे हुए वीडियो की सूची साफ करें</string>
<string name="clear_views_history_summary">चलाये गए स्ट्रीम का इतिहास साफ करता है</string>
<string name="delete_view_history_alert">देखे गए सभी का इतिहास साफ करें\?</string>
<string name="view_history_deleted">देखे हुए का इतिहास साफ कर दिया गया।</string>
<string name="watch_history_deleted">देखे हुए का इतिहास साफ कर दिया गया।</string>
<string name="clear_search_history_title">ढूंढने के इतिहास को साफ करें</string>
<string name="clear_search_history_summary">ढूंढे गए शब्दो का इतिहास साफ करता है</string>
<string name="delete_search_history_alert">पूरे खोज इतिहास को मिटा दे \?</string>

View File

@ -276,10 +276,6 @@
<string name="resize_fill">Ispuniti</string>
<string name="resize_zoom">Povećaj</string>
<string name="caption_auto_generated">Auto generirano</string>
<string name="caption_font_size_settings_title">Veličina fonta naslova</string>
<string name="smaller_caption_font_size">Manji font</string>
<string name="normal_caption_font_size">Normalni font</string>
<string name="larger_caption_font_size">Veći font</string>
<string name="enable_leak_canary_title">Omogući \"LeakCanary\"</string>
<string name="enable_leak_canary_summary">Monitoring curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile</string>
<string name="enable_disposed_exceptions_title">Izvijestite o pogreškama izvan životnog ciklusa</string>
@ -307,7 +303,7 @@
<string name="clear_views_history_title">Očisti povijest gledanja</string>
<string name="clear_views_history_summary">Briše povijest reproduciranih streamova</string>
<string name="delete_view_history_alert">Obriši cijelu povijest gledanja\?</string>
<string name="view_history_deleted">Povijest gledanja izbrisana.</string>
<string name="watch_history_deleted">Povijest gledanja izbrisana.</string>
<string name="clear_search_history_title">Obriši povijest pretraživanja</string>
<string name="delete_search_history_alert">Obriši cijelu povijest pretraživanja\?</string>
<string name="search_history_deleted">Povijest pretraživanja obrisana.</string>
@ -478,7 +474,6 @@
</plurals>
<string name="no_comments">Nema komentara</string>
<string name="error_unable_to_load_comments">Komentare nije moguće učitati</string>
<string name="direct_on_background">Sviraj izravno u pozadini</string>
<string name="close">Zatvori</string>
<string name="app_license">NewPipe je copyleft libre software: možete ga koristiti, proučavati i poboljšavati po volji. Konkretno, možete ga redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila Free Software Foundation, bilo verzije 3 Licence, ili (po vašem izboru) bilo koje kasnije verzije.</string>
<string name="privacy_policy_encouragement">"Projekt NewPipe ozbiljno shvaća vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka.

View File

@ -215,7 +215,7 @@
<string name="clear_views_history_title">Megtekintési előzmények törlése</string>
<string name="clear_views_history_summary">Eltávolítja a megtekintési előzményeket</string>
<string name="delete_view_history_alert">Törlöd az összes megtekintési előzményt\?</string>
<string name="view_history_deleted">Megtekintési előzmények törölve.</string>
<string name="watch_history_deleted">Megtekintési előzmények törölve.</string>
<string name="clear_search_history_title">Keresési előzmények törlése</string>
<string name="clear_search_history_summary">Eltávolítja a kereséshez használt kifejezéseket az előzményekből</string>
<string name="delete_search_history_alert">Törlöd az összes keresési előzményt\?</string>

View File

@ -312,12 +312,7 @@
<string name="resize_fill">Isi</string>
<string name="resize_zoom">Perbesar</string>
<string name="caption_auto_generated">Otomatis dibuat</string>
<string name="caption_font_size_settings_title">Ukuran fon deskripsi</string>
<string name="smaller_caption_font_size">Fon lebih kecil</string>
<string name="normal_caption_font_size">Fon normal</string>
<string name="larger_caption_font_size">Fon lebih besar</string>
<string name="enable_leak_canary_title">Aktifkan LeakCanary</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">Bawaan</string>
<string name="no_player_found_toast">Pemutar stream tidak ditemukan (anda bisa memasang VLC untuk memutarnya).</string>
<string name="controls_download_desc">Unduh berkas stream</string>
@ -327,7 +322,7 @@
<string name="clear_views_history_title">Hapus riwayat tontonan</string>
<string name="clear_views_history_summary">Hapus riwayat stream yang telah diputar</string>
<string name="delete_view_history_alert">Hapus seluruh riwayat tontonan\?</string>
<string name="view_history_deleted">Riwayat tontonan dihapus.</string>
<string name="watch_history_deleted">Riwayat tontonan dihapus.</string>
<string name="clear_search_history_title">Hapus riwayat pencarian</string>
<string name="clear_search_history_summary">Hapus riwayat lema pencarian</string>
<string name="delete_search_history_alert">Hapus seluruh riwayat pencarian\?</string>
@ -476,6 +471,5 @@
</plurals>
<string name="no_comments">Tidak ada komentar</string>
<string name="error_unable_to_load_comments">Tidak bisa memuat komentar</string>
<string name="direct_on_background">Putar di latar belakang</string>
<string name="close">Tutup</string>
</resources>

View File

@ -310,10 +310,6 @@
<string name="resize_fit">Rientrato</string>
<string name="resize_fill">Pieno</string>
<string name="resize_zoom">Ingrandito</string>
<string name="caption_font_size_settings_title">Dimensione dei caratteri dei sottotitoli</string>
<string name="smaller_caption_font_size">Carattere più piccolo</string>
<string name="normal_caption_font_size">Carattere normale</string>
<string name="larger_caption_font_size">Carattere più grande</string>
<string name="drawer_header_action_paceholder_text">A breve qualcosa apparirà qui ;D</string>
<string name="settings_category_debug_title">Debug</string>
<string name="caption_auto_generated">Generato automaticamente</string>
@ -325,7 +321,6 @@
<string name="use_inexact_seek_summary">La ricerca imprecisa permette al lettore multimediale di spostarsi nelle posizioni più velocemente con una precisione ridotta</string>
<string name="auto_queue_title">Metti in coda automaticamente il prossimo flusso</string>
<string name="auto_queue_summary">Aggiungi automaticamente uno stream correlato raggiunta la fine della coda se la ripetizione è disattivata</string>
<string name="live_sync">SINCRONIZZAZIONE</string>
<string name="file">File</string>
<string name="invalid_directory">Nessuna cartella</string>
<string name="invalid_source">Nessun file o cartella che contiene sorgenti</string>
@ -367,7 +362,6 @@
<string name="playback_tempo">Tempo</string>
<string name="playback_pitch">Tono</string>
<string name="unhook_checkbox">Scollega (può causare distorsione)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">Valore predefinito</string>
<string name="no_streams_available_download">Nessun flusso disponibile per il download</string>
<string name="preferred_open_action_settings_title">\'Apri\' preferibilmente con</string>
@ -378,7 +372,7 @@
<string name="clear_views_history_title">Pulisci cronologia visualizzazioni</string>
<string name="clear_views_history_summary">Elimina la cronologia dei flussi riprodotti</string>
<string name="delete_view_history_alert">Elimina l\'intera cronologia delle visualizzazioni\?</string>
<string name="view_history_deleted">Cronologia visualizzazioni eliminata.</string>
<string name="watch_history_deleted">Cronologia visualizzazioni eliminata.</string>
<string name="clear_search_history_title">Pulisci cronologia delle ricerche</string>
<string name="clear_search_history_summary">Cancella la cronologia dei termini di ricerca</string>
<string name="delete_search_history_alert">Elimina l\'intera cronologia delle ricerche\?</string>
@ -482,6 +476,5 @@
</plurals>
<string name="no_comments">Nessun commento</string>
<string name="error_unable_to_load_comments">Impossibile caricare i commenti</string>
<string name="direct_on_background">Riproduci direttamente in sottofondo</string>
<string name="close">Chiudi</string>
</resources>

View File

@ -294,7 +294,6 @@
<string name="playlist_thumbnail_change_success">プレイリストのサムネイルを変更しました。</string>
<string name="playlist_delete_failure">プレイリストを削除できませんでした。</string>
<string name="caption_none">字幕表示なし</string>
<string name="caption_font_size_settings_title">字幕の文字サイズ</string>
<string name="import_export_title">インポート/エクスポート</string>
<string name="import_title">インポート</string>
<string name="import_from">インポート元</string>
@ -312,7 +311,7 @@
<string name="popup_playing_append">ポップアップ再生の順番待ちに追加</string>
<string name="clear_views_history_title">再生履歴を消去</string>
<string name="clear_views_history_summary">再生した動画の履歴を削除します</string>
<string name="view_history_deleted">再生履歴を削除しました。</string>
<string name="watch_history_deleted">再生履歴を削除しました。</string>
<string name="clear_search_history_title">検索履歴を消去</string>
<string name="clear_search_history_summary">検索キーワードの履歴を削除します</string>
<string name="search_history_deleted">検索履歴を削除しました。</string>
@ -463,9 +462,9 @@
<string name="main_page_content_summary">メインページに表示されるタブ</string>
<string name="updates_setting_description">新しいバージョンが利用可能なときにアプリの更新を確認する通知を表示します</string>
<string name="msg_pending_downloads">ダウンロードから %s の保留中の転送を続行します</string>
<string name="pause_downloads_on_mobile">モバイルデータ通信に切り替え時に休止</string>
<string name="pause_downloads_on_mobile_desc">休止できないダウンロードが再開されます</string>
<string name="error_timeout">接続タイムアウト</string>
<string name="pause_downloads_on_mobile">モバイルデータ通信に切替時に、一時停止する</string>
<string name="pause_downloads_on_mobile_desc">一時停止できない場合は再開して継続されます</string>
<string name="show_comments_title">コメントを表示</string>
<string name="show_comments_summary">無効にするとコメントの表示を停止します</string>
<string name="autoplay_title">自動再生</string>
<plurals name="comments">
@ -473,7 +472,6 @@
</plurals>
<string name="no_comments">コメントはありません</string>
<string name="error_unable_to_load_comments">コメントを読み込めませんでした</string>
<string name="direct_on_background">バックグラウンドで直接再生</string>
<string name="close">閉じる</string>
<string name="show_comments_title">コメントを表示</string>
</resources>
<string name="error_timeout">接続タイムアウト</string>
</resources>

View File

@ -257,7 +257,6 @@
<string name="default_content_country_title">기본 콘텐츠 국가</string>
<string name="service_title">서비스</string>
<string name="settings_category_debug_title">디버그</string>
<string name="live">라이브 (LIVE)</string>
<string name="always">항상</string>
<string name="just_once">한번만</string>
<string name="toggle_orientation">디바이스 방향 토글</string>
@ -315,11 +314,6 @@
<string name="resize_fill">채우기</string>
<string name="resize_zoom">확대</string>
<string name="caption_auto_generated">자동 생성됨</string>
<string name="caption_font_size_settings_title">자막 폰트 크기</string>
<string name="smaller_caption_font_size">작은 폰트</string>
<string name="normal_caption_font_size">보통 폰트</string>
<string name="larger_caption_font_size">큰 폰트</string>
<string name="live_sync">동기화</string>
<string name="enable_leak_canary_title">LeakCanary 할성화</string>
<string name="enable_leak_canary_summary">힙 덤프 중 메모리 누수 점검으로 앱이 불안정해질 수 있습니다</string>
<string name="enable_disposed_exceptions_title">out-of-lifecycle 오류 보고</string>
@ -368,7 +362,6 @@
<string name="playback_tempo">템포</string>
<string name="playback_pitch">피치</string>
<string name="unhook_checkbox">영상과 소리 분리 (소리가 깨질 수 있음)</string>
<string name="playback_nightcore">나이트코어</string>
<string name="playback_default">기본</string>
<string name="no_streams_available_download">다운로드 가능한 스트림이 없습니다</string>
<string name="toast_no_player">이 파일을 재생할 수 있는 플레이어 앱이 없습니다</string>
@ -381,7 +374,7 @@
<string name="clear_views_history_title">시청 기록 삭제하기</string>
<string name="clear_views_history_summary">동영상 시청 기록을 삭제합니다</string>
<string name="delete_view_history_alert">모든 시청 기록을 삭제하시겠습니까\?</string>
<string name="view_history_deleted">동영상 시청 기록이 삭제되었습니다.</string>
<string name="watch_history_deleted">동영상 시청 기록이 삭제되었습니다.</string>
<string name="clear_search_history_title">검색 기록 삭제</string>
<string name="clear_search_history_summary">검색 기록을 모두 삭제합니다</string>
<string name="delete_search_history_alert">모든 검색 기록을 삭제하시겠습니까\?</string>
@ -481,6 +474,5 @@
</plurals>
<string name="no_comments">댓글 없음</string>
<string name="error_unable_to_load_comments">댓글을 불러올 수 없음</string>
<string name="direct_on_background">백그라운드에서 바로 재생</string>
<string name="close">닫기</string>
</resources>

View File

@ -362,10 +362,6 @@
<string name="resize_zoom">Priartinti</string>
<string name="caption_auto_generated">Automatiškai sugeneruotas</string>
<string name="caption_font_size_settings_title">Antraštės šrifto dydis</string>
<string name="smaller_caption_font_size">Mažesnis šriftas</string>
<string name="normal_caption_font_size">Normalus šriftas</string>
<string name="larger_caption_font_size">Didesnis šriftas</string>
<string name="enable_leak_canary_title">Įjungti LeakCanary</string>
<string name="enable_leak_canary_summary">Atminties nutekėjimo stebėjimas gali padaryti programėlę nestabilią</string>

View File

@ -368,10 +368,6 @@
<string name="resize_zoom">Зумирај</string>
<string name="caption_auto_generated">Автоматски создадено</string>
<string name="caption_font_size_settings_title">Големина на преводот</string>
<string name="smaller_caption_font_size">Помал фонт</string>
<string name="normal_caption_font_size">Нормален фонт</string>
<string name="larger_caption_font_size">Поголем фонт</string>
<string name="enable_leak_canary_title">Вклучи LeakCanary</string>
<string name="enable_leak_canary_summary">Следењето на мемориските грешки може да ја прикочува апликацијата</string>
@ -414,12 +410,11 @@
<string name="playback_tempo">Темпо</string>
<string name="playback_pitch">Тон</string>
<string name="unhook_checkbox">Откачи (може да создаде мутации)</string>
<string name="playback_nightcore">„Nightcore“</string>
<string name="playback_default">Стандардно</string>
<string name="clear_views_history_title">Избриши историја на гледаност</string>
<string name="clear_views_history_summary">Ја брише историјата на пуштени видеа</string>
<string name="delete_view_history_alert">Избриши ја целата историја на гледаност.</string>
<string name="view_history_deleted">Избришана е историјата на гледаност.</string>
<string name="watch_history_deleted">Избришана е историјата на гледаност.</string>
<string name="clear_search_history_title">Избриши историја на пребарувања</string>
<string name="clear_search_history_summary">Ја брише историјата на пребарувања</string>
<string name="delete_search_history_alert">Избриши ја целата историја на пребарувања.</string>

View File

@ -158,7 +158,7 @@
<string name="clear_views_history_title">Hapuskan sejarah tontonan</string>
<string name="clear_views_history_summary">Hapuskan sejarah strim yang telah dimain</string>
<string name="delete_view_history_alert">Padamkan seluruh sejarah tontonan\?</string>
<string name="view_history_deleted">Sejarah tontonan dipadamkan.</string>
<string name="watch_history_deleted">Sejarah tontonan dipadamkan.</string>
<string name="clear_search_history_title">Hapuskan sejarah carian</string>
<string name="clear_search_history_summary">Padamkan sejarah kata kunci carian</string>
<string name="delete_search_history_alert">Padamkan seluruh sejarah carian\?</string>

View File

@ -310,10 +310,6 @@
<string name="resize_fit">Tilpass</string>
<string name="resize_fill">Fyll</string>
<string name="resize_zoom">Forstørr</string>
<string name="caption_font_size_settings_title">Bildetekstens størrelse</string>
<string name="smaller_caption_font_size">Mindre skrift</string>
<string name="normal_caption_font_size">Normal skrift</string>
<string name="larger_caption_font_size">Større skrift</string>
<string name="use_inexact_seek_title">Bruk raskt unøyaktig blafring</string>
<string name="settings_category_debug_title">Feilretting</string>
<string name="file">Fil</string>
@ -353,7 +349,7 @@
<string name="clear_views_history_title">Tøm avspillingshistorikk</string>
<string name="clear_views_history_summary">Slett historikken for avspilte strømmer</string>
<string name="delete_view_history_alert">Slett hele visningshistorikken\?</string>
<string name="view_history_deleted">Visningshistorikk slettet.</string>
<string name="watch_history_deleted">Visningshistorikk slettet.</string>
<string name="clear_search_history_title">Tøm søkehistorikk</string>
<string name="clear_search_history_summary">Sletter historikken for søkte nøkkelord</string>
<string name="delete_search_history_alert">Slett hele søkehistorikken\?</string>
@ -383,7 +379,6 @@
<string name="enable_disposed_exceptions_title">Rapporter feil som opptrer utenfor sin levetid</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="playback_nightcore">Nightcore</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.
\nNewPipes personvernspraksis forklarer i detalj hvilken deta som sendes og lagres når du sender en kræsjrapport.</string>
@ -478,6 +473,5 @@
</plurals>
<string name="no_comments">Ingen kommenterer</string>
<string name="error_unable_to_load_comments">Kunne ikke laste inn kommentarer</string>
<string name="direct_on_background">Spill direkte i bakgrunnen</string>
<string name="close">Lukk</string>
</resources>

View File

@ -367,12 +367,11 @@
<string name="playback_tempo">Tempo</string>
<string name="playback_pitch">Toon</string>
<string name="unhook_checkbox">Ontkoppelen (kan ruis veroorzaken)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">Standaard</string>
<string name="clear_views_history_title">Kijkgeschiedenis wissen</string>
<string name="clear_views_history_summary">Verwijdert de geschiedenis van afgespeelde streams</string>
<string name="delete_view_history_alert">De ganse kijkgeschiedenis verwijderen\?</string>
<string name="view_history_deleted">Kijkgeschiedenis verwijderd.</string>
<string name="watch_history_deleted">Kijkgeschiedenis verwijderd.</string>
<string name="clear_search_history_title">Zoekgeschiedenis wissen</string>
<string name="clear_search_history_summary">Verwijdert de gebruikte zoektermen</string>
<string name="delete_search_history_alert">De ganse zoekgeschiedenis verwijderen\?</string>
@ -474,6 +473,5 @@
</plurals>
<string name="no_comments">Geen commentaren</string>
<string name="error_unable_to_load_comments">Kan commentaren niet laden</string>
<string name="direct_on_background">Rechtstreeks in achtergrond afspelen</string>
<string name="close">Sluiten</string>
</resources>

View File

@ -310,10 +310,6 @@
<string name="resize_fit">Inpassen</string>
<string name="resize_fill">Opvullen</string>
<string name="resize_zoom">Inzoomen</string>
<string name="caption_font_size_settings_title">Lettergrootte van bijschrift</string>
<string name="smaller_caption_font_size">Kleiner lettertype</string>
<string name="normal_caption_font_size">Normaal lettertype</string>
<string name="larger_caption_font_size">Groter lettertype</string>
<string name="drawer_header_action_paceholder_text">Hier zal binnenkort iets verschijnen ;D</string>
<string name="settings_category_debug_title">Foutopsporing</string>
<string name="caption_auto_generated">Automatisch gegenereerd</string>
@ -325,7 +321,6 @@
<string name="use_inexact_seek_summary">Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie</string>
<string name="auto_queue_title">Volgende stream automatisch in wachtrij plaatsen</string>
<string name="auto_queue_summary">Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst</string>
<string name="live_sync">SYNCHRONISEREN</string>
<string name="file">Bestand</string>
<string name="invalid_directory">Deze map bestaat niet</string>
<string name="invalid_source">Bestand/Inhoudsbron bestaat niet</string>
@ -367,7 +362,6 @@
<string name="playback_tempo">Tempo</string>
<string name="playback_pitch">Toon</string>
<string name="unhook_checkbox">Ontlinken (kan ruis veroorzaken)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">Standaard</string>
<string name="preferred_open_action_settings_title">Voorkeursactie voor openen</string>
<string name="preferred_open_action_settings_summary">Standaardactie bij openen van inhoud — %s</string>
@ -378,7 +372,7 @@
<string name="clear_views_history_title">Kijkgeschiedenis wissen</string>
<string name="clear_views_history_summary">Verwijdert de geschiedenis van afgespeelde streams</string>
<string name="delete_view_history_alert">De gehele kijkgeschiedenis wissen\?</string>
<string name="view_history_deleted">Kijkgeschiedenis gewist.</string>
<string name="watch_history_deleted">Kijkgeschiedenis gewist.</string>
<string name="clear_search_history_title">Zoekgeschiedenis wissen</string>
<string name="clear_search_history_summary">Verwijdert de gebruikte zoektermen</string>
<string name="delete_search_history_alert">De gehele zoekgeschiedenis wissen\?</string>
@ -482,6 +476,5 @@
</plurals>
<string name="no_comments">Geen reacties</string>
<string name="error_unable_to_load_comments">Kan reacties niet laden</string>
<string name="direct_on_background">Direct spelen in achtergrond</string>
<string name="close">Sluiten</string>
</resources>

View File

@ -375,7 +375,7 @@
<string name="clear_views_history_title">Wyczyść historię oglądania</string>
<string name="clear_views_history_summary">Usuwa historię odtworzonych strumieni</string>
<string name="delete_view_history_alert">Usunąć całą historię oglądania\?</string>
<string name="view_history_deleted">Usunięto historię oglądania.</string>
<string name="watch_history_deleted">Usunięto historię oglądania.</string>
<string name="clear_search_history_title">Wyczyść historię wyszukiwania</string>
<string name="clear_search_history_summary">Usuwa historię wyszukiwania słów kluczowych</string>
<string name="delete_search_history_alert">Usunąć całą historię wyszukiwania\?</string>
@ -479,6 +479,5 @@
</plurals>
<string name="no_comments">Brak komentarzy</string>
<string name="error_unable_to_load_comments">Nie można załadować komentarzy</string>
<string name="direct_on_background">Odtwarzaj bezpośrednio w tle</string>
<string name="close">Zamknij</string>
</resources>

View File

@ -371,7 +371,7 @@ abrir em modo popup</string>
<string name="clear_views_history_title">"Limpar histórico de já assistidos "</string>
<string name="clear_views_history_summary">Deleta o histórico de videos já reproduzidos</string>
<string name="delete_view_history_alert">Deletar todo o histórico de já reproduzidos\?</string>
<string name="view_history_deleted">Histórico de já assistidos deletado.</string>
<string name="watch_history_deleted">Histórico de já assistidos deletado.</string>
<string name="clear_search_history_title">Limpar histórico de pesquisa</string>
<string name="clear_search_history_summary">Deleta histórico de palavras chave pesquisadas</string>
<string name="delete_search_history_alert">Deletar todo o histórico de pesquisa\?</string>
@ -476,6 +476,5 @@ abrir em modo popup</string>
</plurals>
<string name="no_comments">Não há comentários</string>
<string name="error_unable_to_load_comments">Não foi possível carregar comentários</string>
<string name="direct_on_background">Reproduzir diretamente em segundo plano</string>
<string name="close">Fechar</string>
</resources>

View File

@ -353,7 +353,7 @@
<string name="users">Utilizadores</string>
<string name="clear_views_history_summary">Apaga o histórico dos vídeos reproduzidos</string>
<string name="delete_view_history_alert">Apagar todo o histórico de visualizações\?</string>
<string name="view_history_deleted">Histórico de vídeos apagado.</string>
<string name="watch_history_deleted">Histórico de vídeos apagado.</string>
<string name="clear_search_history_title">Apagar histórico de pesquisas</string>
<string name="clear_search_history_summary">Apaga o histórico de palavras-chave pesquisadas</string>
<string name="delete_search_history_alert">Apagar todo o histórico de pesquisa\?</string>
@ -475,6 +475,5 @@
</plurals>
<string name="no_comments">Sem comentários</string>
<string name="error_unable_to_load_comments">Não foi possível carregar comentários</string>
<string name="direct_on_background">Reproduzir diretamente no fundo</string>
<string name="close">Fechar</string>
</resources>

View File

@ -358,7 +358,7 @@ pentru a deschide în mod pop-up</string>
<string name="file_deleted">Fișier șters</string>
<string name="app_update_notification_channel_name">Notificare actualizare aplicație</string>
<string name="app_update_notification_channel_description">Notificări pentru noi versiuni NewPipe</string>
<string name="view_history_deleted">Afișare istoric șters.</string>
<string name="watch_history_deleted">Afișare istoric șters.</string>
<string name="clear_search_history_title">Șterge istoric căutare</string>
<string name="clear_search_history_summary">Ștergere istoric căutare cuvinte cheie</string>
<string name="delete_search_history_alert">Șterge întregul istoric căutare\?</string>

View File

@ -15,7 +15,7 @@
<string name="choose_browser">Выбор браузера</string>
<string name="screen_rotation">поворот</string>
<string name="download_path_title">Путь для скачанного видео</string>
<string name="download_path_summary">Путь для сохранения скачанного видео</string>
<string name="download_path_summary">Папка для хранения загруженных видео</string>
<string name="download_path_dialog_title">Введите путь к папке для скачивания видео</string>
<string name="default_resolution_title">Разрешение по умолчанию</string>
<string name="play_with_kodi_title">Воспроизвести в Kodi</string>
@ -27,7 +27,7 @@
<string name="download_dialog_title">Скачать</string>
<string name="next_video_title">Следующее</string>
<string name="url_not_supported_toast">URL не поддерживается</string>
<string name="show_next_and_similar_title">Показывать \"Следующее\" и \"Похожие\" видео</string>
<string name="show_next_and_similar_title">\"Следующее\" и \"Похожие\" видео</string>
<string name="content_language_title">Язык контента по умолчанию</string>
<string name="settings_category_video_audio_title">Видео и аудио</string>
<string name="settings_category_appearance_title">Внешний вид</string>
@ -239,8 +239,8 @@
<string name="play_queue_remove">Удалить</string>
<string name="subscribed_button_title">Вы подписаны</string>
<string name="channel_unsubscribed">Подписка отменена</string>
<string name="show_hold_to_append_title">Показывать \"Зажмите, чтобы добавить\"</string>
<string name="show_hold_to_append_summary">Показывать подсказку при нажатии кнопок всплывающего окна или фонового воспроизведения на странице сведений о видео</string>
<string name="show_hold_to_append_title">\"Зажмите, чтобы добавить\"</string>
<string name="show_hold_to_append_summary">Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео</string>
<string name="unknown_content">[Неизвестно]</string>
<string name="player_recoverable_failure">Восстановление после ошибки плеера</string>
<string name="title_activity_background_player">В фоне</string>
@ -331,7 +331,6 @@
<string name="resize_fill">Заполнить</string>
<string name="resize_zoom">Приблизить</string>
<string name="caption_auto_generated">Созданы автоматически</string>
<string name="live_sync">Синхронизировать</string>
<string name="enable_leak_canary_title">Включить LeakCanary</string>
<string name="enable_leak_canary_summary">Мониторинг утечки памяти может привести к зависанию приложения</string>
<string name="enable_disposed_exceptions_title">Сообщать об ошибках жизненного цикла</string>
@ -378,7 +377,7 @@
<string name="caption_setting_description">Изменить размер текста и стиль титров. Нужен перезапуск</string>
<string name="clear_views_history_title">Очистить историю просмотров</string>
<string name="delete_view_history_alert">Удалить всю историю просмотров\?</string>
<string name="view_history_deleted">История просмотров удалена</string>
<string name="watch_history_deleted">История просмотров удалена</string>
<string name="clear_search_history_title">Очистить историю поиска</string>
<string name="clear_search_history_summary">Удалить историю запросов поиска</string>
<string name="clear_views_history_summary">Удалить историю воспроизведённых потоков</string>
@ -487,5 +486,4 @@
</plurals>
<string name="no_comments">Нет комментариев</string>
<string name="error_unable_to_load_comments">Не удалось загрузить комментарии</string>
<string name="direct_on_background">Играть сейчас в фоне</string>
</resources>

View File

@ -314,10 +314,6 @@
<string name="resize_fit">Prispôsobiť</string>
<string name="resize_fill">Vyplniť</string>
<string name="resize_zoom">Zväčšiť</string>
<string name="caption_font_size_settings_title">Veľkosť písma titulkov</string>
<string name="smaller_caption_font_size">Menšie Písmo</string>
<string name="normal_caption_font_size">Normálne Písmo</string>
<string name="larger_caption_font_size">Väčšie Písmo</string>
<string name="use_inexact_seek_title">Používať rýchly posun</string>
<string name="use_inexact_seek_summary">Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou</string>
<string name="download_thumbnail_title">Načítanie miniatúr</string>
@ -380,12 +376,11 @@
<string name="playback_tempo">Rýchlosť</string>
<string name="playback_pitch">Výška</string>
<string name="unhook_checkbox">"Spomalenie (môže spôsobovať skreslenie)"</string>
<string name="playback_nightcore">Nightcore režim</string>
<string name="playback_default">Predvolené</string>
<string name="clear_views_history_title">Vymazať históriu pozretí</string>
<string name="clear_views_history_summary">Odstráni históriu prehrávaných streamov</string>
<string name="delete_view_history_alert">Vymazať celú históriu pozretí.</string>
<string name="view_history_deleted">História pozretí bola vymazaná.</string>
<string name="watch_history_deleted">História pozretí bola vymazaná.</string>
<string name="clear_search_history_title">Vymazať históriu vyhľadávania</string>
<string name="clear_search_history_summary">Vymaže históriu vyhľadávania kľúčových slov</string>
<string name="delete_search_history_alert">Vymazať celú históriu vyhľadávania.</string>

View File

@ -47,9 +47,9 @@
<string name="light_theme_title">Светла</string>
<string name="settings_category_appearance_title">Изглед</string>
<string name="network_error">Грешка мреже</string>
<string name="download_path_audio_title">Одредиште преузимања за аудио</string>
<string name="download_path_audio_title">Фолдер преузимања за аудио</string>
<string name="download_path_audio_dialog_title">Унесите путању за преузимање аудио фајлова</string>
<string name="download_path_audio_summary">Путања за упис преузетих аудио фајлова</string>
<string name="download_path_audio_summary">Овде се чувају преузети аудио-снимци</string>
<string name="info_dir_created">Направљен директоријум за преузимање „%1$s“</string>
<string name="err_dir_create">Не могу да направим директоријум за преузимање„ %1$s“</string>
<string name="general_error">Грешка</string>
@ -133,7 +133,7 @@
<string name="clear">Очисти</string>
<string name="controls_background_title">Позадина</string>
<string name="controls_popup_title">Прозорче</string>
<string name="use_external_video_player_summary">Неке резолуције биће БЕЗ звука када је ова опција укључена</string>
<string name="use_external_video_player_summary">Уклања звук на неким резолуцијама</string>
<string name="popup_remember_size_pos_title">Упамти величину и позицију искачућег прозора</string>
<string name="popup_remember_size_pos_summary">Памти последњу величину и позицију искачућег прозорчета</string>
<string name="player_gesture_controls_title">Контроле прејера потезом</string>
@ -243,7 +243,7 @@
<string name="no_player_found_toast">Нема плејера тока (можете инсталирати ВЛЦ).</string>
<string name="controls_download_desc">Преузимање фајла тока</string>
<string name="show_info">Прикажи податке</string>
<string name="tab_bookmarks">Обележивачи</string>
<string name="tab_bookmarks">Сачуване плејлисте</string>
<string name="controls_add_to_playlist_title">Додај у</string>
<string name="default_content_country_title">Подразумевана држава за садржај</string>
<string name="service_title">Услуга</string>
@ -259,4 +259,16 @@
<string name="website_encouragement">Да бисте добили више информација и најновије вести о ЊуПајпу посетите наш вебсајт.</string>
<string name="hold_to_append">Задржи за стављање у ред</string>
<string name="start_here_on_main">Пусти одавде</string>
<string name="use_inexact_seek_title">Користи брзо, али непрецизно премотавање</string>
<string name="use_inexact_seek_summary">Омогућава плејеру да брже долази до позиције уз смањену прецизност</string>
<string name="download_thumbnail_title">Учитавање слика</string>
<string name="download_thumbnail_summary">Искључите како се не би преузимале слике, чиме ћете смањити количину пренетог саобраћаја и потрошњу меморије. Промена ове опције ће уклонити слике из радне и трајне меморије.</string>
<string name="thumbnail_cache_wipe_complete_notice">Очишћен кеш са сликама</string>
<string name="metadata_cache_wipe_title">Уклони кеширане метаподатке</string>
<string name="metadata_cache_wipe_summary">Уклони све податке о кешираним веб-странама</string>
<string name="unsubscribe">Откажи претплату</string>
<string name="tab_new">Нова картица</string>
<string name="tab_choose">Одабери картицу</string>
<string name="show_comments_title">Приказивање коментара</string>
<string name="show_comments_summary">Искључите како се не би приказивали коментари</string>
</resources>

View File

@ -320,7 +320,7 @@
<string name="clear_views_history_title">Rensa visningshistorik</string>
<string name="clear_views_history_summary">Tar bort historiken för spelade videoklipp</string>
<string name="delete_view_history_alert">Ta bort hela visningshistoriken\?</string>
<string name="view_history_deleted">Visningshistorik borttagen.</string>
<string name="watch_history_deleted">Visningshistorik borttagen.</string>
<string name="clear_search_history_title">Rensa sökhistorik</string>
<string name="clear_search_history_summary">Tar bort historiken för sökta nyckelord</string>
<string name="delete_search_history_alert">Ta bort hela sökhistoriken\?</string>

View File

@ -93,7 +93,7 @@
<string name="just_once">ஒரு முறை</string>
<string name="file">கோப்பு</string>
<string name="clear_views_history_title">பார்த்த வரலாற்றை நீக்கு</string>
<string name="view_history_deleted">பார்த்த வரலாறு அழிக்கப்பட்டது.</string>
<string name="watch_history_deleted">பார்த்த வரலாறு அழிக்கப்பட்டது.</string>
<string name="clear_search_history_title">பார்த்த வரலாற்றை நீக்கு</string>
<string name="search_history_deleted">தேடல் வரலாறு அழிக்கப்பட்டது.</string>
<string name="file_name_empty_error">கோப்பு பெயர் காலியாக இருக்க முடியாது</string>
@ -121,7 +121,6 @@
<string name="enable_search_history_summary">தேடப்பட்ட வாக்கியத்தை அமைவிடத்தில் சேமிக்கவும்</string>
<string name="url_not_supported_toast">ஆதரிக்கப்படாத URL</string>
<string name="default_content_country_title">இயல்புநிலை தகவல்களின் நாடு</string>
<string name="search_language_title">தகவல்களின் இயல்பு மொழி</string>
<string name="settings_category_debug_title">பிழைதிருத்து</string>
<string name="content">உள்ளடக்கம்</string>
<string name="show_age_restricted_content_title">வயது வரம்புக்கு உட்பட்டது</string>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@ -310,10 +310,6 @@
<string name="resize_fit">Sığdır</string>
<string name="resize_fill">Doldur</string>
<string name="resize_zoom">Yakınlaştır</string>
<string name="caption_font_size_settings_title">Alt yazı boyutu</string>
<string name="smaller_caption_font_size">Daha küçük yazı tipi</string>
<string name="normal_caption_font_size">Normal yazı tipi</string>
<string name="larger_caption_font_size">Daha büyük yazı tipi</string>
<string name="settings_category_debug_title">Hata ayıklama</string>
<string name="drawer_header_action_paceholder_text">Yakında bir şeyler burada görünecek ;D</string>
<string name="caption_auto_generated">Kendiliğinden Oluşturulan</string>
@ -325,7 +321,6 @@
<string name="use_inexact_seek_summary">İsabetsiz konumlama, oynatıcının daha düşük hassasiyetle daha hızlı pozisyon aramasını sağlar</string>
<string name="auto_queue_title">Sonraki akışı otomatik kuyruğa ekle</string>
<string name="auto_queue_summary">Yinelenmeyen bir kuyruktaki son akışı oynatırken, ilgili bir akışı kendiliğinden ekle</string>
<string name="live_sync">EŞZAMANLA</string>
<string name="file">Dosya</string>
<string name="invalid_directory">Böyle bir dizin yok</string>
<string name="invalid_source">Dosya/içerik kaynağı değil</string>
@ -368,7 +363,6 @@
<string name="playback_default">Öntanımlı</string>
<string name="playback_pitch">Ses titreşimi</string>
<string name="unhook_checkbox">Bağlantısız (bozulmaya neden olabilir)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="no_streams_available_download">İndirilebilecek akış yok</string>
<string name="preferred_open_action_settings_title">Tercih edilen \'aç\' eylemi</string>
<string name="preferred_open_action_settings_summary">İçerik açılırken öntanımlı eylem — %s</string>
@ -378,7 +372,7 @@
<string name="clear_views_history_title">İzleme geçmişini temizle</string>
<string name="clear_views_history_summary">Oynatılan akışların geçmişini siler</string>
<string name="delete_view_history_alert">İzleme geçmişinin tamamı silinsin mi\?</string>
<string name="view_history_deleted">İzleme geçmişi silindi.</string>
<string name="watch_history_deleted">İzleme geçmişi silindi.</string>
<string name="clear_search_history_title">Arama geçmişini temizle</string>
<string name="clear_search_history_summary">Aramada kullanılan anahtar kelimelerin geçmişini siler</string>
<string name="delete_search_history_alert">Tüm arama geçmişi silinsin mi\?</string>
@ -481,6 +475,5 @@
</plurals>
<string name="no_comments">Yorum yok</string>
<string name="error_unable_to_load_comments">Yorumlar yüklenemedi</string>
<string name="direct_on_background">Arka planda direkt başlat</string>
<string name="close">Kapat</string>
</resources>

View File

@ -379,7 +379,7 @@
<string name="clear_views_history_title">Очистити історію переглядів</string>
<string name="clear_views_history_summary">Видаляє історію відтворень</string>
<string name="delete_view_history_alert">Видалити всю історію переглядів\?</string>
<string name="view_history_deleted">Історію переглядів видалено.</string>
<string name="watch_history_deleted">Історію переглядів видалено.</string>
<string name="clear_search_history_title">Очистити історію пошуку</string>
<string name="clear_search_history_summary">Видаляє історію пошукових ключових слів</string>
<string name="delete_search_history_alert">Видалити всю історію пошуку\?</string>
@ -484,6 +484,5 @@
</plurals>
<string name="no_comments">Коментарі відсутні</string>
<string name="error_unable_to_load_comments">Не вдалося підвантажити коментарів</string>
<string name="direct_on_background">Програвати у фоні</string>
<string name="close">Закрити</string>
</resources>

View File

@ -222,7 +222,7 @@
<string name="clear_views_history_title">Xóa lịch sử xem</string>
<string name="clear_views_history_summary">Xóa lịch sử của các luồng đã phát</string>
<string name="delete_view_history_alert">Xóa toàn bộ lịch sử xem\?</string>
<string name="view_history_deleted">Đã xóa lịch sử xem.</string>
<string name="watch_history_deleted">Đã xóa lịch sử xem.</string>
<string name="clear_search_history_title">Xóa lịch sử tìm kiếm</string>
<string name="clear_search_history_summary">Xóa lịch sử của từ khóa tìm kiếm</string>
<string name="delete_search_history_alert">Xóa toàn bộ lịch sử tìm kiếm\?</string>

View File

@ -383,10 +383,6 @@
<string name="resize_zoom">放大填充</string>
<string name="caption_auto_generated">自动生成</string>
<string name="caption_font_size_settings_title">字幕字体大小</string>
<string name="smaller_caption_font_size">小字体</string>
<string name="normal_caption_font_size">中等字体</string>
<string name="larger_caption_font_size">大字体</string>
<string name="enable_leak_canary_title">启用 LeakCanary</string>
<string name="enable_leak_canary_summary">内存泄露监测可能会在heap dumping时导致应用失去响应</string>
@ -426,7 +422,6 @@
<string name="playback_tempo">速度</string>
<string name="playback_pitch">音调</string>
<string name="unhook_checkbox">Unhook可能导致失真</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">默认</string>
<string name="toast_no_player">未安装能播放此文件的应用</string>
@ -436,7 +431,7 @@
<string name="clear_views_history_title">清除观看记录</string>
<string name="clear_views_history_summary">删除视频观看记录</string>
<string name="delete_view_history_alert">删除全部观看记录。</string>
<string name="view_history_deleted">观看记录已删除。</string>
<string name="watch_history_deleted">观看记录已删除。</string>
<string name="clear_search_history_title">清除搜索记录</string>
<string name="clear_search_history_summary">删除搜索关键词记录</string>
<string name="delete_search_history_alert">删除全部搜索记录。</string>

View File

@ -306,10 +306,6 @@
<string name="resize_fit">合適的</string>
<string name="resize_fill">填滿</string>
<string name="resize_zoom">縮放</string>
<string name="caption_font_size_settings_title">標題字體大小</string>
<string name="smaller_caption_font_size">縮小字體</string>
<string name="normal_caption_font_size">正常字體</string>
<string name="larger_caption_font_size">加大字體</string>
<string name="drawer_header_action_paceholder_text">某些東西即將在此出現 ;D</string>
<string name="settings_category_debug_title">除錯</string>
<string name="caption_auto_generated">自動產生</string>
@ -321,7 +317,6 @@
<string name="use_inexact_seek_summary">粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置</string>
<string name="auto_queue_title">自動將下一部影片新增至佇列</string>
<string name="auto_queue_summary">在非重複播放佇列中最後一個串流開始播放時,自動新增相關串流</string>
<string name="live_sync">同步</string>
<string name="file">檔案</string>
<string name="invalid_directory">無效的資料夾</string>
<string name="invalid_source">無效的檔案/內容來源</string>
@ -363,7 +358,6 @@
<string name="playback_tempo">節奏</string>
<string name="playback_pitch">音高</string>
<string name="unhook_checkbox">解除連結(可能導致失真)</string>
<string name="playback_nightcore">Nightcore</string>
<string name="playback_default">預設</string>
<string name="preferred_open_action_settings_title">偏好的「開啟」動作</string>
<string name="preferred_open_action_settings_summary">開啟內容時的預設動作 — %s</string>
@ -374,7 +368,7 @@
<string name="clear_views_history_title">清除觀看歷史</string>
<string name="clear_views_history_summary">刪除播放過的串流歷史</string>
<string name="delete_view_history_alert">刪除所有觀看歷史記錄?</string>
<string name="view_history_deleted">觀看歷史已刪除。</string>
<string name="watch_history_deleted">觀看歷史已刪除。</string>
<string name="clear_search_history_title">清除搜尋歷史</string>
<string name="clear_search_history_summary">刪除搜尋關鍵字的歷史</string>
<string name="delete_search_history_alert">刪除所有搜尋歷史記錄?</string>
@ -477,6 +471,5 @@
</plurals>
<string name="no_comments">沒有留言</string>
<string name="error_unable_to_load_comments">無法載入留言</string>
<string name="direct_on_background">直接在背景播放</string>
<string name="close">關閉</string>
</resources>

View File

@ -173,7 +173,8 @@
<string name="clear_views_history_title">Clear watch history</string>
<string name="clear_views_history_summary">Deletes the history of played streams</string>
<string name="delete_view_history_alert">Delete entire watch history?</string>
<string name="view_history_deleted">Watch history deleted.</string>
<string name="watch_history_deleted">Watch history deleted.</string>
<string name="watch_history_states_deleted">Playback positions deleted.</string>
<string name="clear_search_history_title">Clear search history</string>
<string name="clear_search_history_summary">Deletes history of search keywords</string>
<string name="delete_search_history_alert">Delete entire search history?</string>

View File

@ -0,0 +1,23 @@
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