From 42a2bc8a9a8aa5e6368d31e123271c53c234535e Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 16 Feb 2018 11:31:25 +0100 Subject: [PATCH 001/176] clean DetailFragment code --- .../fragments/detail/VideoDetailFragment.java | 220 ++++++++++++------ 1 file changed, 151 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 206f6edd849..a4c1bacbfdd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -95,7 +95,12 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; -public class VideoDetailFragment extends BaseStateFragment implements BackPressable, SharedPreferences.OnSharedPreferenceChangeListener, View.OnClickListener, View.OnLongClickListener { +public class VideoDetailFragment + extends BaseStateFragment + implements BackPressable, + SharedPreferences.OnSharedPreferenceChangeListener, + View.OnClickListener, + View.OnLongClickListener { public static final String AUTO_PLAY = "auto_play"; // Amount of videos to show on start @@ -186,8 +191,10 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - showRelatedStreams = PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(getString(R.string.show_next_video_key), true); - PreferenceManager.getDefaultSharedPreferences(activity).registerOnSharedPreferenceChangeListener(this); + showRelatedStreams = PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(getString(R.string.show_next_video_key), true); + PreferenceManager.getDefaultSharedPreferences(activity) + .registerOnSharedPreferenceChangeListener(this); } @Override @@ -211,7 +218,10 @@ public void onResume() { if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBarHandler(currentInfo); } - if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 && actionBarHandler != null) actionBarHandler.updateItemsVisibility(); + if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 + && actionBarHandler != null) { + actionBarHandler.updateItemsVisibility(); + } updateFlags = 0; } @@ -224,7 +234,8 @@ public void onResume() { @Override public void onDestroy() { super.onDestroy(); - PreferenceManager.getDefaultSharedPreferences(activity).unregisterOnSharedPreferenceChangeListener(this); + PreferenceManager.getDefaultSharedPreferences(activity) + .unregisterOnSharedPreferenceChangeListener(this); if (currentWorker != null) currentWorker.dispose(); if (disposables != null) disposables.clear(); @@ -285,7 +296,8 @@ public void onSaveInstanceState(Bundle outState) { // Check if the next video label and video is visible, // if it is, include the two elements in the next check int nextCount = currentInfo != null && currentInfo.getNextVideo() != null ? 2 : 0; - if (relatedStreamsView != null && relatedStreamsView.getChildCount() > INITIAL_RELATED_VIDEOS + nextCount) { + if (relatedStreamsView != null + && relatedStreamsView.getChildCount() > INITIAL_RELATED_VIDEOS + nextCount) { outState.putSerializable(WAS_RELATED_EXPANDED_KEY, true); } @@ -417,8 +429,10 @@ private void toggleExpandRelatedVideos(StreamInfo info) { int initialCount = INITIAL_RELATED_VIDEOS + nextCount; if (relatedStreamsView.getChildCount() > initialCount) { - relatedStreamsView.removeViews(initialCount, relatedStreamsView.getChildCount() - (initialCount)); - relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable(activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); + relatedStreamsView.removeViews(initialCount, + relatedStreamsView.getChildCount() - (initialCount)); + relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable( + activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); return; } @@ -428,7 +442,9 @@ private void toggleExpandRelatedVideos(StreamInfo info) { //Log.d(TAG, "i = " + i); relatedStreamsView.addView(infoItemBuilder.buildView(relatedStreamsView, item)); } - relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable(activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); + relatedStreamExpandButton.setImageDrawable( + ContextCompat.getDrawable(activity, + ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); } /*////////////////////////////////////////////////////////////////////////// @@ -547,7 +563,10 @@ private void showStreamDialog(final StreamInfoItem item) { private View.OnTouchListener getOnControlsTouchListener() { return (View view, MotionEvent motionEvent) -> { - if (!PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(getString(R.string.show_hold_to_append_key), true)) return false; + if (!PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(getString(R.string.show_hold_to_append_key), true)) { + return false; + } if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { animateView(appendControlsDetail, true, 250, 0, () -> @@ -560,14 +579,25 @@ private View.OnTouchListener getOnControlsTouchListener() { private void initThumbnailViews(StreamInfo info) { thumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark); if (!TextUtils.isEmpty(info.getThumbnailUrl())) { - imageLoader.displayImage(info.getThumbnailUrl(), thumbnailImageView, DISPLAY_THUMBNAIL_OPTIONS, new SimpleImageLoadingListener() { + imageLoader.displayImage( + info.getThumbnailUrl(), + thumbnailImageView, + DISPLAY_THUMBNAIL_OPTIONS, new SimpleImageLoadingListener() { @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { - ErrorActivity.reportError(activity, failReason.getCause(), null, activity.findViewById(android.R.id.content), ErrorActivity.ErrorInfo.make(UserAction.LOAD_IMAGE, NewPipe.getNameOfService(currentInfo.getServiceId()), imageUri, R.string.could_not_load_thumbnails)); + ErrorActivity.reportError( + activity, + failReason.getCause(), + null, + activity.findViewById(android.R.id.content), + ErrorActivity.ErrorInfo.make(UserAction.LOAD_IMAGE, + NewPipe.getNameOfService(currentInfo.getServiceId()), + imageUri, + R.string.could_not_load_thumbnails)); } }); } - + if (!TextUtils.isEmpty(info.getUploaderAvatarUrl())) { imageLoader.displayImage(info.getUploaderAvatarUrl(), uploaderThumb, DISPLAY_AVATAR_OPTIONS); } @@ -578,14 +608,17 @@ private void initRelatedVideos(StreamInfo info) { if (info.getNextVideo() != null && showRelatedStreams) { nextStreamTitle.setVisibility(View.VISIBLE); - relatedStreamsView.addView(infoItemBuilder.buildView(relatedStreamsView, info.getNextVideo())); + relatedStreamsView.addView( + infoItemBuilder.buildView(relatedStreamsView, info.getNextVideo())); relatedStreamsView.addView(getSeparatorView()); relatedStreamRootLayout.setVisibility(View.VISIBLE); } else nextStreamTitle.setVisibility(View.GONE); if (info.related_streams != null && !info.related_streams.isEmpty() && showRelatedStreams) { //long first = System.nanoTime(), each; - int to = info.getRelatedStreams().size() >= INITIAL_RELATED_VIDEOS ? INITIAL_RELATED_VIDEOS : info.getRelatedStreams().size(); + int to = info.getRelatedStreams().size() >= INITIAL_RELATED_VIDEOS + ? INITIAL_RELATED_VIDEOS + : info.getRelatedStreams().size(); for (int i = 0; i < to; i++) { InfoItem item = info.getRelatedStreams().get(i); //each = System.nanoTime(); @@ -597,7 +630,8 @@ private void initRelatedVideos(StreamInfo info) { relatedStreamRootLayout.setVisibility(View.VISIBLE); relatedStreamExpandButton.setVisibility(View.VISIBLE); - relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable(activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); + relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable( + activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); } else { if (info.getNextVideo() == null) relatedStreamRootLayout.setVisibility(View.GONE); relatedStreamExpandButton.setVisibility(View.GONE); @@ -620,7 +654,8 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { @Override public boolean onOptionsItemSelected(MenuItem item) { - return (!isLoading.get() && actionBarHandler.onItemSelected(item)) || super.onOptionsItemSelected(item); + return (!isLoading.get() && actionBarHandler.onItemSelected(item)) + || super.onOptionsItemSelected(item); } private static void showInstallKoreDialog(final Context context) { @@ -634,7 +669,8 @@ private static void showInstallKoreDialog(final Context context) { private void setupActionBarHandler(final StreamInfo info) { if (DEBUG) Log.d(TAG, "setupActionBarHandler() called with: info = [" + info + "]"); - sortedStreamVideosList = new ArrayList<>(ListHelper.getSortedStreamVideosList(activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false)); + sortedStreamVideosList = new ArrayList<>(ListHelper.getSortedStreamVideosList( + activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false)); actionBarHandler.setupStreamList(sortedStreamVideosList, spinnerToolbar); actionBarHandler.setOnShareListener(selectedStreamId -> shareUrl(info.name, info.url)); @@ -685,7 +721,10 @@ public void pushToStack(int serviceId, String videoUrl, String name) { public void setTitleToUrl(int serviceId, String videoUrl, String name) { if (name != null && !name.isEmpty()) { for (StackItem stackItem : stack) { - if (stack.peek().getServiceId() == serviceId && stackItem.getUrl().equals(videoUrl)) stackItem.setTitle(name); + if (stack.peek().getServiceId() == serviceId + && stackItem.getUrl().equals(videoUrl)) { + stackItem.setTitle(name); + } } } } @@ -727,18 +766,18 @@ public void prepareAndHandleInfo(final StreamInfo info, boolean scrollToTop) { pushToStack(serviceId, url, name); showLoading(); - Log.d(TAG, "prepareAndHandleInfo() called parallaxScrollRootView.getScrollY(): " + parallaxScrollRootView.getScrollY()); + Log.d(TAG, "prepareAndHandleInfo() called parallaxScrollRootView.getScrollY(): " + + parallaxScrollRootView.getScrollY()); final boolean greaterThanThreshold = parallaxScrollRootView.getScrollY() > (int) (getResources().getDisplayMetrics().heightPixels * .1f); if (scrollToTop) parallaxScrollRootView.smoothScrollTo(0, 0); - animateView(contentRootLayoutHiding, false, greaterThanThreshold ? 250 : 0, 0, new Runnable() { - @Override - public void run() { - handleResult(info); - showContentWithAnimation(120, 0, .01f); - } - }); + animateView(contentRootLayoutHiding, + false, + greaterThanThreshold ? 250 : 0, 0, () -> { + handleResult(info); + showContentWithAnimation(120, 0, .01f); + }); } protected void prepareAndLoadInfo() { @@ -773,7 +812,8 @@ public void startLoading(boolean forceLoad) { //////////////////////////////////////////////////////////////////////////*/ private void openBackgroundPlayer(final boolean append) { - AudioStream audioStream = currentInfo.getAudioStreams().get(ListHelper.getDefaultAudioFormat(activity, currentInfo.getAudioStreams())); + AudioStream audioStream = currentInfo.getAudioStreams() + .get(ListHelper.getDefaultAudioFormat(activity, currentInfo.getAudioStreams())); boolean useExternalAudioPlayer = PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(activity.getString(R.string.use_external_audio_player_key), false); @@ -781,7 +821,10 @@ private void openBackgroundPlayer(final boolean append) { if (!useExternalAudioPlayer && android.os.Build.VERSION.SDK_INT >= 16) { openNormalBackgroundPlayer(append); } else { - NavigationHelper.playOnExternalPlayer(activity, currentInfo.getName(), currentInfo.getUploaderName(), audioStream); + NavigationHelper.playOnExternalPlayer(activity, + currentInfo.getName(), + currentInfo.getUploaderName(), + audioStream); } } @@ -806,8 +849,12 @@ activity, PopupVideoPlayer.class, itemQueue, getSelectedVideoStream().resolution private void openVideoPlayer() { VideoStream selectedVideoStream = getSelectedVideoStream(); - if (PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(this.getString(R.string.use_external_video_player_key), false)) { - NavigationHelper.playOnExternalPlayer(activity, currentInfo.getName(), currentInfo.getUploaderName(), selectedVideoStream); + if (PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(this.getString(R.string.use_external_video_player_key), false)) { + NavigationHelper.playOnExternalPlayer(activity, + currentInfo.getName(), + currentInfo.getUploaderName(), + selectedVideoStream); } else { openNormalPlayer(selectedVideoStream); } @@ -828,7 +875,10 @@ private void openNormalPlayer(VideoStream selectedVideoStream) { if (!useOldPlayer) { // ExoPlayer final PlayQueue playQueue = new SinglePlayQueue(currentInfo); - mIntent = NavigationHelper.getPlayerIntent(activity, MainVideoPlayer.class, playQueue, getSelectedVideoStream().getResolution()); + mIntent = NavigationHelper.getPlayerIntent(activity, + MainVideoPlayer.class, + playQueue, + getSelectedVideoStream().getResolution()); } else { // Internal Player mIntent = new Intent(activity, PlayVideoActivity.class) @@ -859,28 +909,31 @@ private void prepareDescription(final String descriptionHtml) { disposables.add(Single.just(descriptionHtml) .map((@io.reactivex.annotations.NonNull String description) -> { - Spanned parsedDescription; - if (Build.VERSION.SDK_INT >= 24) { - parsedDescription = Html.fromHtml(description, 0); - } else { - //noinspection deprecation - parsedDescription = Html.fromHtml(description); - } - return parsedDescription; + Spanned parsedDescription; + if (Build.VERSION.SDK_INT >= 24) { + parsedDescription = Html.fromHtml(description, 0); + } else { + //noinspection deprecation + parsedDescription = Html.fromHtml(description); + } + return parsedDescription; }) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> { - videoDescriptionView.setText(spanned); - videoDescriptionView.setVisibility(View.VISIBLE); + videoDescriptionView.setText(spanned); + videoDescriptionView.setVisibility(View.VISIBLE); })); } private View getSeparatorView() { View separator = new View(activity); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1); - int m8 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); - int m5 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1); + int m8 = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); + int m5 = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()); params.setMargins(m8, m5, m8, m5); separator.setLayoutParams(params); @@ -894,13 +947,20 @@ private View getSeparatorView() { private void setHeightThumbnail() { final DisplayMetrics metrics = getResources().getDisplayMetrics(); boolean isPortrait = metrics.heightPixels > metrics.widthPixels; - int height = isPortrait ? (int) (metrics.widthPixels / (16.0f / 9.0f)) : (int) (metrics.heightPixels / 2f); - thumbnailImageView.setScaleType(isPortrait ? ImageView.ScaleType.CENTER_CROP : ImageView.ScaleType.FIT_CENTER); - thumbnailImageView.setLayoutParams(new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height)); + int height = isPortrait + ? (int) (metrics.widthPixels / (16.0f / 9.0f)) + : (int) (metrics.heightPixels / 2f); + thumbnailImageView.setScaleType(isPortrait + ? ImageView.ScaleType.CENTER_CROP + : ImageView.ScaleType.FIT_CENTER); + thumbnailImageView.setLayoutParams( + new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height)); thumbnailImageView.setMinimumHeight(height); } - private void showContentWithAnimation(long duration, long delay, @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) { + private void showContentWithAnimation(long duration, + long delay, + @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) { int translationY = (int) (getResources().getDisplayMetrics().heightPixels * (translationPercent > 0.0f ? translationPercent : .06f)); @@ -908,23 +968,38 @@ private void showContentWithAnimation(long duration, long delay, @FloatRange(fro contentRootLayoutHiding.setAlpha(0f); contentRootLayoutHiding.setTranslationY(translationY); contentRootLayoutHiding.setVisibility(View.VISIBLE); - contentRootLayoutHiding.animate().alpha(1f).translationY(0) - .setStartDelay(delay).setDuration(duration).setInterpolator(new FastOutSlowInInterpolator()).start(); + contentRootLayoutHiding.animate() + .alpha(1f) + .translationY(0) + .setStartDelay(delay) + .setDuration(duration) + .setInterpolator(new FastOutSlowInInterpolator()) + .start(); uploaderRootLayout.animate().setListener(null).cancel(); uploaderRootLayout.setAlpha(0f); uploaderRootLayout.setTranslationY(translationY); uploaderRootLayout.setVisibility(View.VISIBLE); - uploaderRootLayout.animate().alpha(1f).translationY(0) - .setStartDelay((long) (duration * .5f) + delay).setDuration(duration).setInterpolator(new FastOutSlowInInterpolator()).start(); + uploaderRootLayout.animate() + .alpha(1f) + .translationY(0) + .setStartDelay((long) (duration * .5f) + delay) + .setDuration(duration) + .setInterpolator(new FastOutSlowInInterpolator()) + .start(); if (showRelatedStreams) { relatedStreamRootLayout.animate().setListener(null).cancel(); relatedStreamRootLayout.setAlpha(0f); relatedStreamRootLayout.setTranslationY(translationY); relatedStreamRootLayout.setVisibility(View.VISIBLE); - relatedStreamRootLayout.animate().alpha(1f).translationY(0) - .setStartDelay((long) (duration * .8f) + delay).setDuration(duration).setInterpolator(new FastOutSlowInInterpolator()).start(); + relatedStreamRootLayout.animate() + .alpha(1f) + .translationY(0) + .setStartDelay((long) (duration * .8f) + delay) + .setDuration(duration) + .setInterpolator(new FastOutSlowInInterpolator()) + .start(); } } @@ -938,12 +1013,8 @@ private void setErrorImage(final int imageResource) { if (thumbnailImageView == null || activity == null) return; thumbnailImageView.setImageDrawable(ContextCompat.getDrawable(activity, imageResource)); - animateView(thumbnailImageView, false, 0, 0, new Runnable() { - @Override - public void run() { - animateView(thumbnailImageView, true, 500); - } - }); + animateView(thumbnailImageView, false, 0, 0, + () -> animateView(thumbnailImageView, true, 500)); } @Override @@ -1058,7 +1129,11 @@ public void handleResult(@NonNull StreamInfo info) { setTitleToUrl(info.getServiceId(), info.getUrl(), info.getName()); if (!info.getErrors().isEmpty()) { - showSnackBarError(info.getErrors(), UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(info.getServiceId()), info.getUrl(), 0); + showSnackBarError(info.getErrors(), + UserAction.REQUESTED_STREAM, + NewPipe.getNameOfService(info.getServiceId()), + info.getUrl(), + 0); } if (info.video_streams.isEmpty() && info.video_only_streams.isEmpty()) { @@ -1090,9 +1165,16 @@ protected boolean onError(Throwable exception) { } else if (exception instanceof ContentNotAvailableException) { showError(getString(R.string.content_not_available), false); } else { - int errorId = exception instanceof YoutubeStreamExtractor.DecryptException ? R.string.youtube_signature_decryption_error : - exception instanceof ParsingException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(serviceId), url, errorId); + int errorId = exception instanceof YoutubeStreamExtractor.DecryptException + ? R.string.youtube_signature_decryption_error + : exception instanceof ParsingException + ? R.string.parsing_error + : R.string.general_error; + onUnrecoverableError(exception, + UserAction.REQUESTED_STREAM, + NewPipe.getNameOfService(serviceId), + url, + errorId); } return true; @@ -1100,10 +1182,10 @@ protected boolean onError(Throwable exception) { public void onBlockedByGemaError() { thumbnailBackgroundButton.setOnClickListener((View v) -> { - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); - intent.setData(Uri.parse(getString(R.string.c3s_url))); - startActivity(intent); + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(getString(R.string.c3s_url))); + startActivity(intent); }); showError(getString(R.string.blocked_by_gema), false, R.drawable.gruese_die_gema); From b12f0490f38c692f3872c8f5f88334e40046de90 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 16 Feb 2018 12:18:15 +0100 Subject: [PATCH 002/176] remove ActionBarHandler --- .../fragments/detail/ActionBarHandler.java | 150 ------------------ .../fragments/detail/VideoDetailFragment.java | 106 ++++++++++--- 2 files changed, 81 insertions(+), 175 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java deleted file mode 100644 index d928166aba0..00000000000 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.schabi.newpipe.fragments.detail; - -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; -import android.widget.Spinner; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.stream.VideoStream; -import org.schabi.newpipe.util.ListHelper; - -import java.util.List; - -/* - * Created by Christian Schabesberger on 18.08.15. - *

- * Copyright (C) Christian Schabesberger 2015 - * DetailsMenuHandler.java is part of NewPipe. - *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - - -@SuppressWarnings("WeakerAccess") -class ActionBarHandler { - private static final String TAG = "ActionBarHandler"; - - private AppCompatActivity activity; - private int selectedVideoStream = -1; - - private SharedPreferences defaultPreferences; - - private Menu menu; - - // Only callbacks are listed here, there are more actions which don't need a callback. - // those are edited directly. Typically VideoDetailFragment will implement those callbacks. - private OnActionListener onShareListener; - private OnActionListener onOpenInBrowserListener; - private OnActionListener onPlayWithKodiListener; - - // Triggered when a stream related action is triggered. - public interface OnActionListener { - void onActionSelected(int selectedStreamId); - } - - public ActionBarHandler(AppCompatActivity activity) { - this.activity = activity; - } - - public void setupStreamList(final List videoStreams, Spinner toolbarSpinner) { - if (activity == null) return; - - selectedVideoStream = ListHelper.getDefaultResolutionIndex(activity, videoStreams); - - boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(activity.getString(R.string.use_external_video_player_key), false); - toolbarSpinner.setAdapter(new SpinnerToolbarAdapter(activity, videoStreams, isExternalPlayerEnabled)); - toolbarSpinner.setSelection(selectedVideoStream); - toolbarSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - selectedVideoStream = position; - } - - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - - } - - public void setupMenu(Menu menu, MenuInflater inflater) { - this.menu = menu; - - // CAUTION set item properties programmatically otherwise it would not be accepted by - // appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu); - - defaultPreferences = PreferenceManager.getDefaultSharedPreferences(activity); - inflater.inflate(R.menu.video_detail_menu, menu); - - updateItemsVisibility(); - } - - public void updateItemsVisibility(){ - showPlayWithKodiAction(defaultPreferences.getBoolean(activity.getString(R.string.show_play_with_kodi_key), false)); - } - - public boolean onItemSelected(MenuItem item) { - int id = item.getItemId(); - switch (id) { - case R.id.menu_item_share: { - if (onShareListener != null) { - onShareListener.onActionSelected(selectedVideoStream); - } - return true; - } - case R.id.menu_item_openInBrowser: { - if (onOpenInBrowserListener != null) { - onOpenInBrowserListener.onActionSelected(selectedVideoStream); - } - return true; - } - case R.id.action_play_with_kodi: - if (onPlayWithKodiListener != null) { - onPlayWithKodiListener.onActionSelected(selectedVideoStream); - } - return true; - default: - Log.e(TAG, "Menu Item not known"); - } - return false; - } - - public int getSelectedVideoStream() { - return selectedVideoStream; - } - - public void setOnShareListener(OnActionListener listener) { - onShareListener = listener; - } - - public void setOnOpenInBrowserListener(OnActionListener listener) { - onOpenInBrowserListener = listener; - } - - public void setOnPlayWithKodiListener(OnActionListener listener) { - onPlayWithKodiListener = listener; - } - - public void showPlayWithKodiAction(boolean visible) { - menu.findItem(R.id.action_play_with_kodi).setVisible(visible); - } - -} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index a4c1bacbfdd..94a2f8ec072 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -31,6 +31,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; @@ -106,7 +107,6 @@ public class VideoDetailFragment // Amount of videos to show on start private static final int INITIAL_RELATED_VIDEOS = 8; - private ActionBarHandler actionBarHandler; private ArrayList sortedStreamVideosList; private InfoItemBuilder infoItemBuilder = null; @@ -131,9 +131,12 @@ public class VideoDetailFragment private Disposable currentWorker; private CompositeDisposable disposables = new CompositeDisposable(); + private int selectedVideoStream = -1; + /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ + private Menu menu; private Spinner spinnerToolbar; @@ -174,6 +177,7 @@ public class VideoDetailFragment private LinearLayout relatedStreamsView; private ImageButton relatedStreamExpandButton; + /*////////////////////////////////////////////////////////////////////////*/ public static VideoDetailFragment getInstance(int serviceId, String videoUrl, String name) { @@ -215,12 +219,12 @@ public void onResume() { if (updateFlags != 0) { if (!isLoading.get() && currentInfo != null) { if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) initRelatedVideos(currentInfo); - if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBarHandler(currentInfo); + if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBar(currentInfo); } if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 - && actionBarHandler != null) { - actionBarHandler.updateItemsVisibility(); + && menu != null) { + updateMenuItemVisibility(); } updateFlags = 0; } @@ -357,7 +361,7 @@ public void onClick(View v) { DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo, sortedStreamVideosList, - actionBarHandler.getSelectedVideoStream()); + selectedVideoStream); downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog"); } catch (Exception e) { Toast.makeText(activity, @@ -499,7 +503,6 @@ protected void initViews(View rootView, Bundle savedInstanceState) { relatedStreamExpandButton = rootView.findViewById(R.id.detail_related_streams_expand); - actionBarHandler = new ActionBarHandler(activity); infoItemBuilder = new InfoItemBuilder(activity); setHeightThumbnail(); } @@ -644,7 +647,15 @@ private void initRelatedVideos(StreamInfo info) { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - actionBarHandler.setupMenu(menu, inflater); + this.menu = menu; + + // CAUTION set item properties programmatically otherwise it would not be accepted by + // appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu); + + inflater.inflate(R.menu.video_detail_menu, menu); + + updateMenuItemVisibility(); + ActionBar supportActionBar = activity.getSupportActionBar(); if (supportActionBar != null) { supportActionBar.setDisplayHomeAsUpEnabled(true); @@ -652,10 +663,47 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { } } + private void updateMenuItemVisibility() { + + // show kodi if set in settings + menu.findItem(R.id.action_play_with_kodi).setVisible( + PreferenceManager.getDefaultSharedPreferences(activity).getBoolean( + activity.getString(R.string.show_play_with_kodi_key), false)); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { - return (!isLoading.get() && actionBarHandler.onItemSelected(item)) - || super.onOptionsItemSelected(item); + if(isLoading.get()) { + // if is still loading block menu + return true; + } + + int id = item.getItemId(); + switch (id) { + case R.id.menu_item_share: { + if(currentInfo != null) { + shareUrl(currentInfo.name, url); + } else { + shareUrl(url, url); + } + return true; + } + case R.id.menu_item_openInBrowser: { + openUrlInBrowser(url); + return true; + } + case R.id.action_play_with_kodi: + try { + NavigationHelper.playWithKore(activity, Uri.parse( + url.replace("https", "http"))); + } catch (Exception e) { + if(DEBUG) Log.i(TAG, "Failed to start kore", e); + showInstallKoreDialog(activity); + } + return true; + default: + return super.onOptionsItemSelected(item); + } } private static void showInstallKoreDialog(final Context context) { @@ -667,23 +715,31 @@ private static void showInstallKoreDialog(final Context context) { builder.create().show(); } - private void setupActionBarHandler(final StreamInfo info) { + private void setupActionBarOnError(final String url) { + if (DEBUG) Log.d(TAG, "setupActionBarHandlerOnError() called with: url = [" + url + "]"); + Log.e("-----", "missing code"); + } + + private void setupActionBar(final StreamInfo info) { if (DEBUG) Log.d(TAG, "setupActionBarHandler() called with: info = [" + info + "]"); sortedStreamVideosList = new ArrayList<>(ListHelper.getSortedStreamVideosList( activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false)); - actionBarHandler.setupStreamList(sortedStreamVideosList, spinnerToolbar); - actionBarHandler.setOnShareListener(selectedStreamId -> shareUrl(info.name, info.url)); - - actionBarHandler.setOnOpenInBrowserListener((int selectedStreamId)-> - openUrlInBrowser(info.getUrl())); - - actionBarHandler.setOnPlayWithKodiListener((int selectedStreamId) -> { - try { - NavigationHelper.playWithKore(activity, Uri.parse( - info.getUrl().replace("https", "http"))); - } catch (Exception e) { - if(DEBUG) Log.i(TAG, "Failed to start kore", e); - showInstallKoreDialog(activity); + + selectedVideoStream = ListHelper.getDefaultResolutionIndex(activity, sortedStreamVideosList); + + boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(activity.getString(R.string.use_external_video_player_key), false); + spinnerToolbar.setAdapter(new SpinnerToolbarAdapter(activity, sortedStreamVideosList, + isExternalPlayerEnabled)); + spinnerToolbar.setSelection(selectedVideoStream); + spinnerToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + selectedVideoStream = position; + } + + @Override + public void onNothingSelected(AdapterView parent) { } }); @@ -899,7 +955,7 @@ public void setAutoplay(boolean autoplay) { } private VideoStream getSelectedVideoStream() { - return sortedStreamVideosList.get(actionBarHandler.getSelectedVideoStream()); + return sortedStreamVideosList.get(selectedVideoStream); } private void prepareDescription(final String descriptionHtml) { @@ -1119,7 +1175,7 @@ public void handleResult(@NonNull StreamInfo info) { prepareDescription(info.getDescription()); animateView(spinnerToolbar, true, 500); - setupActionBarHandler(info); + setupActionBar(info); initThumbnailViews(info); initRelatedVideos(info); if (wasRelatedStreamsExpanded) { From 00e65153f4ef067c70f42e6f8b5ddbd7a3ab213b Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 16 Feb 2018 13:13:40 +0100 Subject: [PATCH 003/176] Enable SoundCloud kiosks as main page fragment for debug and beta --- .../org/schabi/newpipe/settings/SelectKioskFragment.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index 5ab1ed1f244..00b6188892f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -13,6 +13,7 @@ import android.widget.ImageView; import android.widget.TextView; +import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.ServiceList; @@ -45,6 +46,8 @@ public class SelectKioskFragment extends DialogFragment { + private static final boolean DEBUG = MainActivity.DEBUG; + RecyclerView recyclerView = null; SelectKioskAdapter selectKioskAdapter = null; @@ -122,7 +125,7 @@ public SelectKioskAdapter() for(StreamingService service : NewPipe.getServices()) { //TODO: Multi-service support - if (service.getServiceId() != ServiceList.YouTube.getServiceId()) continue; + if (service.getServiceId() != ServiceList.YouTube.getServiceId() && !DEBUG) continue; for(String kioskId : service.getKioskList().getAvailableKiosks()) { String name = String.format(getString(R.string.service_kiosk_string), From 86f041b803792b23be664ae50aa5c97675acaa44 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 16 Feb 2018 14:45:52 +0100 Subject: [PATCH 004/176] add header/footer to drawer --- .../java/org/schabi/newpipe/MainActivity.java | 13 ++++ .../settings/MainSettingsFragment.java | 1 + .../drawable-hdpi/ic_settings_black_24dp.png | Bin 0 -> 453 bytes .../drawable-hdpi/ic_settings_white_24dp.png | Bin 0 -> 460 bytes .../drawable-mdpi/ic_settings_black_24dp.png | Bin 0 -> 322 bytes .../drawable-mdpi/ic_settings_white_24dp.png | Bin 0 -> 326 bytes .../drawable-xhdpi/ic_settings_black_24dp.png | Bin 0 -> 557 bytes .../drawable-xhdpi/ic_settings_white_24dp.png | Bin 0 -> 562 bytes .../ic_settings_black_24dp.png | Bin 0 -> 827 bytes .../ic_settings_white_24dp.png | Bin 0 -> 843 bytes .../ic_settings_black_24dp.png | Bin 0 -> 1073 bytes .../ic_settings_white_24dp.png | Bin 0 -> 1074 bytes app/src/main/res/layout/activity_main.xml | 9 +-- app/src/main/res/layout/drawer_laoyut.xml | 65 ++++++++++++++++++ .../main/res/layout/fragment_video_detail.xml | 8 +-- app/src/main/res/values/attrs.xml | 3 + app/src/main/res/values/styles.xml | 5 ++ 17 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/layout/drawer_laoyut.xml diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index ea6715f1632..cbd2bacaa1d 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -41,6 +41,8 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.widget.Button; +import android.widget.ImageButton; import android.widget.Toast; import org.schabi.newpipe.extractor.StreamingService; @@ -79,6 +81,7 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(findViewById(R.id.toolbar)); setupDrawer(); + setupDrawerFooter(); } private void setupDrawer() { @@ -123,6 +126,16 @@ public void onDrawerClosed(View drawerView) { } } + private void setupDrawerFooter() { + ImageButton settings = findViewById(R.id.drawer_settings); + ImageButton downloads = findViewById(R.id.drawer_downloads); + ImageButton history = findViewById(R.id.drawer_history); + + settings.setOnClickListener(view -> NavigationHelper.openSettings(this) ); + downloads.setOnClickListener(view -> NavigationHelper.openDownloads(this)); + history.setOnClickListener(view -> NavigationHelper.openHistory(this)); + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java index 230f3b5ee5b..728da0ae599 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.settings; import android.os.Bundle; +import android.support.v7.preference.Preference; import org.schabi.newpipe.R; diff --git a/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..acf1ddf85b3388b4fb02a683664d7599d96ebfe3 GIT binary patch literal 453 zcmV;$0XqJPP)bdAc8oEppaIOE(LXPbaD_uiXgfuI0y=Ui?$Rg z3N9|rijvq&CiQlchlhJevpDqnjrr%mb8?c{t6qzumxlIL6n!zIh8Gl(U}e3LlM0Ef;V2BeJSjZb=;SQ|z+u z4yaibL-bf>PG6*TZCbM}(t2i;JWOXDi<+RJrJZgbD4Fy&xy-!MTym*5Ce+-mj<=}R zs*bfH=Sq2RG}Riq#p042E*7&*ne}3EUJe(E*_zBou{bA(tHo?vL#bs|A+IvyeHm7t#M^wEtHOK?m*3tk?OFDx*kh6Lst!v$eu1NdssLB&DM32-Q z^h4~jZ>A+~7n2>4r=NU@Dq}tg9ji`Suql$(%vHn+eg}v!7dsOm%)+nCb00000NkvXXu0mjfkE75f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..97ded33b5558a0efbd7812296a52325b4170076e GIT binary patch literal 460 zcmV;-0W=4>kIV21T<&3Kg>clSSXlU}7 zNsTbZb7CDT8exhj%*e(#KY#)6xy}u?uzckjH(4PAzEPEh1-w0q?BPAtVVvU+$MuUd zim^-?Z*&k19JY)eT?W{4>I$)hC8bSG`$%Zf$FisplYAzY(o}#3ePW-OP>dHiLTyE8 z5z6Vv#(lhunj$1*cz0EVJ9s@A*ucB3BFy1+WndHUmWuEIZ$P35H8Q+=vQXg_LqaV@ zm?z|TsTk9IA=am%09Qzftuv(%OIZ4}NVJa{^Q2f76=H@QTgC>PWY~7OsDpS*8Lt)N zEWbIfpG@m8p5YBC;_%wCP~|(2vdmRx>0#;8WR`dQ1-2NIjXDoGtr048h%M+pCV0dp z9SxU>omUy0Vn}G0s>)%9(6-8A4Tr6%Lb0000J%}fHzV<>iUk{yCv=|P(yFM9CIKrv6;vdj!^e)OQ=oM~3L z3Hov zYMc*TMS6^4Y*s#v8YK}AT(ig&XB4{J=afm7xZ$2C{CQWp)PoCx)G7YcXPY7T1DnU) UWG_v5V*mgE07*qoM6N<$f<$+V!T>O6 zS70QgNAU8v+(?*#6#o9*V@~mgC;x#Rf^DRK!rxsIH1Y+{1W$v50*~CV#54`Q2vW|N zVwqbWh7Wvdgwql&RGT?0V4Y7)9ZgCcW4f$baDbN(6Vt-m zvtW!jvUC`+K-kE98fAa!hNkla9V}f0{{|82kXi@9MRd@?$weK4A^ju7 zLRBcZi6~YV4Y?x0YCBk^ee93}@A5qN9`;=V`Fy9md5-r894+Q7Vwa zKGHbsTJ3CbB>k$}G!3du63TIxO+;yvI}8$@RV#hZwGsJa1 zG(UeLOQIW*%YP$A_S8JsifkZzY=a`Er-+B1U^vMR;-MW*pvdqV@zg66vq)lJDKSEJ zw`0sxb4<_B;v8FuS(#q`)kg&}+hPL6xOrb?GQ?%fExvFHL!Kq|$LU4WPhFXQ&M?@z zxR1mtVOeOIy~lo>;tz)rETgf>fK;}TNLegBvB^KiQ=u3Ot|-Y( z2Uu+mzU3;1m}L#YE?|a1uJMlWb*&qR^Q=+kG@*msHr|$gaEk##XL&}z6#u1a9Hidf vu2=2VHre2#z3N8+Q5wRd6(rV6I@-ivWBUX&LwAlh00000NkvXXu0mjfs0IG% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5caedc8e57497ba9d32c3a1798f7394bd8ca7cff GIT binary patch literal 562 zcmV-20?qx2P)lpy;7r2s24Mgk2IZK^^iBh`hXFsLp$Hi^-XdC|o$nN|w}JYolv9aiaA3)AHJ#jL^+Vnw!iASI;~WiKXmD0RMEHO!?-j&6;kHOKLX;?@ zWGE7DPJUcs54$WqYC|tM?Dm*a5EB$J%My_f5ptOQ;JnO8utv}pJu;w=5<;?v>&>8 zhF?Y&EaUf-F4>V}ouDGUG9XTwpfwUQW0DePIU@2QLIJZP6AEI68g@DQ)P^_(>}pKO zkE?_$vBVfLVvMs)nQ&JW#5%6Ll?i8P;6j~onehS_p38;=e>tq*49Si(?RM$JF6|Z- zhLe1y=@Yj&%{<$LDKkeuxA{!dCfy3hWwyzZQVXYeKoyfe+#{|QF7lc(Gdc+Jm}KP& zE12AuD=c7gL#~j*pF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3023ff8daa925ac79e863caf679d03c56c3afc93 GIT binary patch literal 827 zcmV-B1H}A^P)>`06 zl!7Kix5q+Fq6=w?Bq2zRX%{Q=l9q~JFAfaD-fMk(ql{OMJp*hZ8Le@FKzb36b`fRvPbJZ#ihbmi`-huQ`v`H+dnnz5 zIO;AGB7BE9YM!%LJ&ic*2`mcPKpgfvmoR!03D^-c43Z$hAhR4H0ecmL8#qMtu}v3c zWQvny2hqm?F??uNd0r4z>Rub{-SwiV_KcJlc$@G(Y7OnY{oYXaZ@4M{dXjJ$v z`$eh=sKvO?Cei3I?)A;6Md`CXq2t(8SWgZw6G7n$pCQ&JiDGgU(}=YRim_lq5{{Tt>$z%L(Sw8>(002ovPDHLk FV1g%Ge~AD9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..eabb0a2ba41bbe0e109263ee9b0d6ada40a6e792 GIT binary patch literal 843 zcmV-R1GM~!P)RPWZAHfP!)RVB2S(!`lt|Um(uYf2_cGfFjG~?QJ_SKM>Hu7Qz_%` zC^KY0j^p?%F-hrI#t?oEkx>e=^x$WZC9-20$8bAJMiyi_f!j|s$&C!#uq!e{4&*3d z*U4D<;$4cQ>yQUJNq3uf6oz@6$E?Ckd0-Y5%+4`a;aG`TuRL)UvsTrDjhJ=G6Wy3? zP%Zcjv%EY}z-*IhK|5x7d7^;XCe?zCn03h$-I#4qEm(P<#_c#+Sul>1xE*7f>{!k} z_~{|56pZ6*{0y;7>1g5}{!WmS0WF-w-(4mv4bw>oQKFMsszM7}DHGx$QauHt_cw57G zmNrf?VwFPCz(EGt%|eYrmJb-fVG|Z VF?y~eTbBR;002ovPDHLkV1i=jh>-vQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..476d5c9780b6904004c7da0d86c1f02e4c37f892 GIT binary patch literal 1073 zcmV-11kU@3P)?ENDOXxEq##k{R3pG`V_=<^3NWfR4)j)KkE?kf% zU}CHb1trze6>4h;sTD;rtpyq(711_6TOXmFPeL**CLQm0&Kbrt$^HG8P44Zq_ne-d zIYT6GB9TZWvWW>Kq@TD8Z%rbKCJFFT3Q=|)UTQ^@t;I_ZBg!7bOS=$dFXN?m5M}%E z(wB&`ukq3!h_Yz{ypu!>x)$#=AqKVLoh^t#k5E8sIL>$MVhOq3&gY0hM`8YgceIr|YY&iqQ@`QK~6 zQos?!gFYj`%4WoqwqT*0?-5V>feMW6L_F#x3@zbr#H0S91|$0r&w3vNHzOXl4y8E9 z5Dz;}9F@lr$I={PD~(h#??P2Hv5k*OBaS_R%D0F^Gwfz5bE%<=S;V1HRE7}izM+=? zvXWuMx}&JnaTc-a1LhN^j9$d5v#dlZNx#*%UxG%$>Lq+a5(6c?YW(obN2{C>#Hd#& z!B{)f219oRCRP~?=PB;R(sE89s&->)k9y|05eEzCQO)~HF|~}eY5{Q-jsl(y{dFJ0 zLg+*>%Tom8#bC&-wqj#@$W=cjZ_b3=su3H_Ay*wEUqWZ2%FD7H{2O^AAiF$gQgUe1!CaxCt9AAy+*GP?%|S8#ZFe%*GOO> z#bLy_Ugb>^^dZI#kVL7TbBI;FloO_cKI?z#>rnXuv2KJ_AwQf^#JVG>3?mNBvWI0k zCeFQ%8(UwY@+jh1ntry^Op?+IC23&?1EdS}PEAbz5c&FESu5gU4Th($JgXZci}?%j zAcuGCUqC#n17l^3BOc^%YUO^!lkUMvz+uFL`muJC2Zudosl~w?NY31kB51DEg_A{d zo(4V7yWC2^CMFTbCfGp0ZS3d#oLeiEIC_%o8Q~cgkx|9lh(m9&kc<=^oYC)hXq9s6 z($m<(9mL4iY&qBmXe3*lJNfX^nst-}xU1(FC+XyRa$C!w;mW?1+!pg9Cm5oZ0(uZJ z=)Phh(s literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..507c5edd44bfb5efe41327d5cef511a108d35f13 GIT binary patch literal 1074 zcmV-21kL-2P)+t)}?IPi4`?n-BcG{I5ur- z(S>O`4876<#~6}k=`>Up4hWM~CUltm-)|Ri1Ni>m=Xw7B>2vXZK2lazR#sM4OxVB` zGWm@sMM^ z-;l({UGfbz*r=0l*o=*rbn~#1)BM5?7AY+r;d^YHV6D>PUbfT6IjR&Lx6#YE6o*+) zuBKoO-MHxHK}|s}>p4WgxIShmD&AzWe%_@-6DZ+pqS#BZCQ!mV^fOt5qM?`(rW@k` zYsq0Fe-hOnJV_2~IlvgxjZ&g0_?+}E6PL@R*DQCeAjPd$B{wAK#0SSo$OW75#b()K zHUs$LSLVnT+wsWmw*M;;$z=L|Dth}oRO&PU|Q78@DG)EG-;f#n348sTZV zVF~9kvs0GXg_$1ilRM_pLS`uz%MxXz$ZS8iD;g5KO+dIKazGp50^T5@IM7A7EpotC z!W~mwxJ0;WIiQwsy^0H?ge#H*l7zdexR6PK98gHOKye|H0y&_NaDn2&2;t_-0ZGDL zRb044xEeWN72z%_E_4yDUJlqsxMPX~IW&?Y+)+88op1pSBoqyIaEQ!Ol*$riq{ys= zxpK!+dNI=^OYFwX1(wJSoA?`3V^qijl?0d?Wut77&!^Zq%PbjU4n5fUgnXH!m=5f< zk}m_~a~ON=BxQz5hH%r$Y-PY44&!E!3Yp*}?#{7XA*iGWcbzi9S)vHoMVW4ZGIkRX z#g8(<%S4r;jjhy@q>w_AtYRDOq=;&>OpwD#d~}?I%ut7qs$`Bm_@-GlSja#4WRw!w z;XQoPAY06$A7At_L-u$UUpyrjB^DU#RVFRX2UE@R5j!x|C?D|xrk<0JScR#T@)5nxBvhE literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7eafc6c698c..b894c23aa42 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,7 +1,6 @@ - + + \ No newline at end of file diff --git a/app/src/main/res/layout/drawer_laoyut.xml b/app/src/main/res/layout/drawer_laoyut.xml new file mode 100644 index 00000000000..dcf29c42f81 --- /dev/null +++ b/app/src/main/res/layout/drawer_laoyut.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 330fb34da2a..fb9ee2890a5 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -310,7 +310,7 @@ android:layout_height="55dp" android:layout_gravity="center_vertical" android:layout_weight="1" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:contentDescription="@string/append_playlist" @@ -327,7 +327,7 @@ android:layout_height="55dp" android:layout_gravity="center_vertical" android:layout_weight="1" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:contentDescription="@string/play_audio" @@ -344,7 +344,7 @@ android:layout_height="55dp" android:layout_gravity="center_vertical" android:layout_weight="1" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:contentDescription="@string/open_in_popup_mode" @@ -361,7 +361,7 @@ android:layout_height="55dp" android:layout_gravity="center_vertical" android:layout_weight="1" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:contentDescription="@string/controls_download_desc" diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 31eda4fbca7..c8e0907be4e 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -25,6 +25,7 @@ + @@ -39,4 +40,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index dcf8f926801..ad767835b28 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -15,6 +15,7 @@ @color/light_youtube_dark_color @color/light_youtube_accent_color @color/light_background_color + @color/light_background_color @drawable/ic_thumb_up_black_24dp @drawable/ic_thumb_down_black_24dp @@ -40,6 +41,7 @@ @drawable/ic_arrow_top_left_black_24dp @drawable/ic_more_vert_black_24dp @drawable/ic_play_arrow_black_24dp + @drawable/ic_settings_black_24dp @drawable/ic_whatshot_black_24dp @drawable/ic_channel_black_24dp @drawable/ic_bookmark_black_24dp @@ -66,6 +68,7 @@ @color/dark_youtube_dark_color @color/dark_youtube_accent_color @color/dark_background_color + @color/dark_background_color @drawable/ic_thumb_up_white_24dp @drawable/ic_thumb_down_white_24dp @@ -91,6 +94,7 @@ @drawable/ic_arrow_top_left_white_24dp @drawable/ic_more_vert_white_24dp @drawable/ic_play_arrow_white_24dp + @drawable/ic_settings_white_24dp @drawable/ic_whatshot_white_24dp @drawable/ic_channel_white_24dp @drawable/ic_bookmark_white_24dp @@ -114,6 +118,7 @@ + + + + + - - - - - \ No newline at end of file From e8c5ae194df0b405acfc3b741e9290e8dc4f2aac Mon Sep 17 00:00:00 2001 From: Kotoba Murasaki Date: Thu, 8 Mar 2018 19:24:14 +0000 Subject: [PATCH 120/176] Translated using Weblate (Ukrainian) Currently translated at 100.0% (318 of 318 strings) --- app/src/main/res/values-uk/strings.xml | 265 +++++++++++++++++-------- 1 file changed, 184 insertions(+), 81 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6e377f7f161..7774f7a193c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -2,17 +2,17 @@ %1$s переглядів Опубліковано %1$s - Потоковий програвач не знайдено. Бажаєте встановити VLC? - Встановити + Потоковий програвач не знайдено. Чи ви хочете встановити VLC? + Установити Скасувати - Відкрити в браузері - Поділитись + Відкрити у переглядачі + Поширити Завантажити - Пошук + Шукати Налаштування - Ви мали на увазі: %1$s ? + Чи ви мали на увазі: %1$s ? Поділитись з - Виберіть браузер + Оберіть переглядач обертання Використовувати зовнішній відео програвач Використовувати зовнішній аудіо програвач @@ -29,13 +29,13 @@ Автоматично відтворювати відео коли NewPipe викликано з іншого додатку. Типова роздільна здатність Відтворювати за допомогою Kodi - Додаток Kore не знайдено. Встановити? + Застосунок Kore не знайдено. Встановити? Показувати опцію \"Програвати за допомогою Kodi\" - Показувати опцію відтворення відео за допомогою Kodi media center. + Показувати опцію відтворення відео за допомогою Kodi media center Аудіо - Аудіо формат за замовчуванням + Типовий аудіо формат WebM — вільний формат - m4a — краща якість + M4A — ліпша якість Тема Темна Світла @@ -50,49 +50,49 @@ Інше Відтворення у фоновому режимі Відтворити - В доступі відмовлено + У доступі відмовлено Контент - Показувати контент з віковим обмеженням - Відео має вікові обмеження. Спершу активуйте опцію для відображення таких відео в налаштуваннях. + Показувати контент з віковими обмеженнями + Це відео має вікові обмеження. Спершу активуйте опцію для відображення таких відео у налаштуваннях. наживо Помилка Помилка мережі Не вдалося завантажити всі ескізи - Не вдалося розшифрувати підпис url відео. - Не вдалося проаналізувати веб-сайт. - Не вдалося повністю проаналізувати веб-сайт. - Контент не доступний. + Не вдалося розшифрувати підпис URL відео. + Не вдалося проаналізувати веб-сайт + Не вдалося повністю проаналізувати веб-сайт + Контент не доступний Заблоковано GEMA - Не вдалося налаштувати меню завантаження. - Це пряма трансляція. Це ще не підтримується. - Не вдалося отримати ніякий потік. - Шкода, цього не повинно було статися. - Звіт про помилку за допомогою пошти - На жаль сталася помилка. + Не вдалося налаштувати меню завантаження + Трансляції наживо ще не мають підтримування. + Не вдалося отримати жодний потік + Шкода, цього не мало статися. + Зазвітувати помилку за допомогою пошти + На жаль, сталася помилка. ЗВІТУВАТИ Інформація: Що сталося: - Натисніть Пошук для початку + Аби почати натисніть на \"шукати\" Чорна Завантаження Завантаження Звіт про помилку - Все + Усе Канал Так Пізніше Вимкнено Не вдалося завантажити зображення - Додаток/інтерфейс зазнав краху - Ваші коментарі (Англійською): + Застосунок/інтерфейс зазнав краху + Ваш коментар (англійською): Деталі: - Мініатюра попереднього перегляду відео - Мініатюра попереднього перегляду відео + Ескіз попереднього перегляду відео + Ескіз попереднього перегляду відео Використовувати Tor (Експериментально) Перенаправляти трафік через Tor для підвищення конфіденційності (трансляція відео ще не підтримується). Звітувати про помилку @@ -102,7 +102,7 @@ Відео Аудіо Повторити - Використовувати старий плеер + Використовувати старий програвач К М Б @@ -118,57 +118,57 @@ Потоки Помилка Сервер не підтримується - Файл вже існує + Файл уже існує NewPipe завантажує Натисніть для подробиць Будь ласка, зачекайте… - Скопійовано до буферу обміну + Скопійовано до сховку Будь ласка, оберіть теку для завантаження Потоковий програвач не знайдено (ви можете встановити VLC для відтворення) - Відкрити у спливаючому вікні + Відкрити у виринальному режимі Певні роздільності НЕ МАТИМУТЬ звуку якщо цей параметр увімкнено - NewPipe у спливаючому вікні + NewPipe у виринальному вікні Підписатися Ви підписалися Ви відписалися від каналу - Неможливо змінити підписку - Неможливо оновити підписку + Неможливо змінити підписання + Неможливо оновити підписання Головна - Підписки + Підписання Новинки - Фон - Спливаюче вікно + Тло + Виринальне вікно - Типова роздільна здатність спливаючого вікна + Типова роздільна здатність виринального вікна Не всі пристрої підтримують програвання 2K/4K відео Показувати більші роздільні здатності - Відео формат за замовчуванням - Пам\'ятати розмір спливаючого вікна та положення - Пам\'ятати останній розмір та позицію спливаючого вікна + Типовий відео формат + Пам\'ятати розмір виринального вікна та положення + Пам\'ятати останній розмір та позицію виринального вікна Керування жестами Використовувати жести для контролю яскравості та гучності програвача Шукати схожі Показувати схожі під час пошуку - Історія пошуку + Історія пошуків Зберігати пошукові запити локально Історія Вести облік перегляду відео Відновити фокус Продовжувати відтворення опісля переривання (наприклад телефонний дзвінок) Відображати вказівку Утримуйте для додачі - Країна контенту за замовчуванням + Усталена країна контенту Сервіс Програвач Поведінка Історія - Спливаюче вікно - Відворення у спливаючому вікні - Додано в чергу у фоні - Додано в чергу в спливаючому вікні + Виринальне вікно + Відворення у виринальному вікні + Додано до фонового програвання + Додано до чергу у виринальному вікні Плейлист Фільтрувати Оновити @@ -181,53 +181,53 @@ Тільки тепер NewPipe сповіщення - Сповіщення для фонового та спливаючого плеєра NewPipe + Сповіщення для фонового та виринального програвача NewPipe [Невідомо] - Перемкнутися у Фон - Перемкнутися у Спливаюче вікно - Перемкнутися у Головне + Перемкнутися до Тла + Перемкнутися до Виринального вікна + Перемкнутися до Головної Імпортувати базу Експортувати базу - Це перезапише наявну історію та підписки - Експортувати історію, підписки та плейлісти. + Це перепише наявну історію та підписання + Експортувати історію, підписання та плейлисти. Помилка при відворенні потоку Відновлююсь після помилки програвача - Помилкова лінка URL + Помилкова ланка URL Не знайдено відео потоків Не знайдено аудіо потоків Звіт користувача Без підписників Без відео - Помилкова лінка URL або Інтернет не доступний + Помилкова ланка URL або інтернет не є доступним Цей дозвіл має бути відкритим -\nу спливаючому вікні +\nу виринальному вікні «reCAPTCHA» Завантажити - Допустимі символи у іменах файлів - "Невірні символи будуть скоректовані цим " + Допустимі символи у назвах файлів + "Неправильні символи будуть скоректовані цим " Символ заміни Літери та цифри - Більше спеціальних символів + Більш специфічні символи - Про NewPipe + Щодо NewPipe Налаштування Про Неможливо завантажити ліцензію Ліцензії - Внесок - Переглянути на GitHub - Підтримати - Вебсайт + Допомогти + Переглянути на Ґітгаб + Донат + Веб-сайт Історія Історію стерто - Експорт завершено - Іморт завершено + Експортування доконано + Імпортування доконано Топ 50 Новинки Деталі @@ -241,23 +241,23 @@ Отримую інформацію… Контент завантажується -Завантажити файл стріму. +Завантажити стримінґовий файл. Показати інфо Закладки Додати до - Показувати підказку коли фонова чи спливаюча кнопка натиснути на сторінці відео деталей + Показувати підказку коли фонова чи виринальна кнопка натиснута на сторінці відео деталей Перемкнути орієнтацію Фатальна помилка програвача - Зовнішні програвачі не підтримують такі види посилань + Зовнішні програвачі не підтримують такі види ланок Що:\\nЗапит:\\nМова змісту:\\nСервіс:\\nЧас GMT:\\nПакунок:\\nВерсія:\\nВерсія ОС:\\nГлоб. діапазон IP : - Мініатюра аватару користувача + Ескіз аватару користувача Сподобалося Не сподобалося - Без результатно - Перетягніть для зміни порядку + Нічого не знайдено + Перетягніть для зміни шикування %s підписник @@ -267,20 +267,123 @@ %s відео - - + %s відео + %s відео Створити - Видалити один + Видалення одного Видалити всі Відхилити - Перейменувати + Змінити назву Сторонні ліцензії Перейти до сайту Про - Легкий YouTube фронтенд застосунок для Android. - Які б не були Ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторінг - будь яка допомога вітається. Чим більше зроблено тим краще він стає! + Легкий YouTube фронт-енд застосунок для Android. + Які б не були Ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинґ - будь яка допомога вітається. Що більше зроблено, то ліпшим NewPipe стає! Моніторинг витоку памяті вимкнено +Усунення вад + Нічого нема + Старий убудований медіа-фреймворк програвач + + Перегляди відсутні + + %s перегляд + %s перегляди + %s переглядів + + + Нове завдання + reCAPTCHA челендж + запит на челендж reCAPTCHA + + © %1$s by %2$s under %3$s + Учасники + NewPipe розробляється добровольцями, які витрачають власний час заради вашого задоволення. Настала черга допомогти й вам, аби розробники мали можливість зробити NewPipe ще ліпшим, насолоджуючись філіжанкою джави! + Ваша допомога + Аби одержати більше інформації та прочитати останні новини стосовно NewPipe, завітайте до нашого веб-сайту. + Ліцензія NewPipe + Прочитати ліцензію + + + Історія пошуку + Переглянуто + Історію вимкнено + Історія + Історія відсутня + Елемент видалено + Чи ви хочете видалити цей елемент з історії пошуку? + Чи ви хочете видалити цей елемент з історії переглядів? + Чи ви певні що хочете видали всі елементи з історії? + Програвалося останнім + Програвалося найбільше + + Контент на головній сторінці + Порожня сторінка + Сторінка ятки + Сторінка підписання + Сторінка фіду + Сторінка каналу + Обрати канал + Ви не підписані до жодного з каналів + Обрати ятку + Недійсний ZIP-файл + Увага: не можливо здійснити імпортування всіх файлів. + Це перепише ваш чинний сетап. + + Ятка + Набуває популярності + Фоновий програвач + Виринальний програвач + Усунути + Затиснути, аби зняти з черги + Зняти з черги у фоновому програвачеві + Зняти з черги у виринальному програвачеві + Розпочати програвання звідси + Розпочати програвання звідси у фоновому програвачеві + Розпочати програвання звідси у виринальному програвачеві + + Відчинити шухляду + Зачинити шухляду + Ми тут матимемо щось незабаром ;D + + + Відкрити в улюбленому програвачеві + Завжди питати + + Створити новий плейлист + Видалити плейлиста + Змінити назву плейлиста + Назва + Додати до плейлиста + Установити як ескіз плейлиста + + Додати плейлист до закладок + Усунути закладку + + Чи бажаєте видалити цього плейлиста? + Плейлист було створено + Додано до плейлиста + Ескіз плейлиста було змінено + Плейлист не видалено + + Опис відсутній + + ЗАМОСТИТИ + ЗАПОВНИТИ + ЗРОБИТИ БЛИЖЧИМ + + Створено автоматичним шляхом + Розмір шрифту опису + Малий шрифт + Звичайний шрифт + Великий шрифт + + Увімкнути LeakCanary + Під час роботи LeakCanary застосунок може стати несприйнятливим під час гіп-дампінґу + + Зазвітувати Out-of-Lifecycle хиби + Примусове звітування про неможливість доставлення Rx винятків, яку відбуваються за межами фраґменту, або діяльності життєвого циклу після усунення + From 736ccbe37609d0910187b5a76fe2cf2240bd11ce Mon Sep 17 00:00:00 2001 From: Kotoba Murasaki Date: Thu, 8 Mar 2018 19:38:44 +0000 Subject: [PATCH 121/176] Translated using Weblate (Ukrainian) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-uk/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 7774f7a193c..1669a075ff4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -386,4 +386,11 @@ Зазвітувати Out-of-Lifecycle хиби Примусове звітування про неможливість доставлення Rx винятків, яку відбуваються за межами фраґменту, або діяльності життєвого циклу після усунення - +Використовувати неточне шукання + Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю + Автоматично додати до черги наступний стрим + Автоматично додавати пов\'язаний стрим, під час початку програвання останнього стриму. + НАЖИВО + СИНХРОНІЗАЦІЯ + + From 728a61756ac1290ff48e267b2c30c230254c567f Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Thu, 8 Mar 2018 20:25:10 +0000 Subject: [PATCH 122/176] Translated using Weblate (Dutch) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-nl/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ca0c81160e5..f09914384fe 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -400,4 +400,11 @@ te openen in pop-upmodus Ouf-of-Lifecycle-fouten melden Forceer het melden van niet-bezorgbare Rx-uitzonderingen die gebeuren buten fragment of activiteitscyclus - +Snelle, minder exact spoelen gebruiken + Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie + Volgende stream automatisch in wachtrij plaatsen + Automatisch een gerealteerde stream toekennen als het afspelen van de laatste stream strat in een niet-herhalende afspeelwachtlijst. + LIVE + SYNCHRONISEREN + + From fa5f5ce2512e557913974640c2655bd871c6bc0d Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Fri, 9 Mar 2018 01:58:01 +0000 Subject: [PATCH 123/176] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7defff3489b..f9f8eaf1f3c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -381,4 +381,11 @@ 報告週期不足錯誤 強制報告在處理完片段或活動週期外發生的無法傳遞的 Rx 異常 - +使用快速不精確的尋找 + 不精確的尋找,允許玩家以更低的精確更快找到位置 + 自動佇列下一個串流 + 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流。 + 直播 + 同步 + + From 2567f8eefb2ff6282e4a037dae39488d44c69c43 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 9 Mar 2018 08:21:03 +0000 Subject: [PATCH 124/176] Translated using Weblate (Hebrew) Currently translated at 75.3% (244 of 324 strings) --- app/src/main/res/values-he/strings.xml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 25aed9cd8f1..5e199e2b1b1 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -176,20 +176,26 @@ אין עוקבים - %s עוקב - %s עוקבים + מנוי אחד + שני מנויים + %s מנויים + %s מנויים אין תצוגות - תצוגה %s - %s תצוגות + צפייה אחת + שתי צפיות + %s צפיות + %s צפיות אין סרטונים - סרטון %s - %s סרטונים + סרטון אחד + שני סרטונים + %s סרטונים + %s סרטונים התחל From 24a06ea6f6166915272faa27dcbcc17497bf0dc2 Mon Sep 17 00:00:00 2001 From: anonymous <> Date: Fri, 9 Mar 2018 08:21:58 +0000 Subject: [PATCH 125/176] Translated using Weblate (Hebrew) Currently translated at 75.6% (245 of 324 strings) --- app/src/main/res/values-he/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 5e199e2b1b1..660f51b4ada 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -291,4 +291,5 @@ התחל לנגן כאן התחל כאן בנגן הרקע התחל כאן בנגן הצץ - +הורד קובץ. + From 9476bd65275c1bcee68cc29e8bbc05b9ba322a88 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 9 Mar 2018 08:22:13 +0000 Subject: [PATCH 126/176] Translated using Weblate (Hebrew) Currently translated at 75.6% (245 of 324 strings) --- app/src/main/res/values-he/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 660f51b4ada..fcb1f363f37 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -291,5 +291,5 @@ התחל לנגן כאן התחל כאן בנגן הרקע התחל כאן בנגן הצץ -הורד קובץ. +הורדת קובץ הזרמה. From d2e2622279de9cff49c23233395e438f6f07555c Mon Sep 17 00:00:00 2001 From: anonymous <> Date: Fri, 9 Mar 2018 08:22:36 +0000 Subject: [PATCH 127/176] Translated using Weblate (Hebrew) Currently translated at 75.9% (246 of 324 strings) --- app/src/main/res/values-he/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index fcb1f363f37..e2547e75572 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -292,4 +292,6 @@ התחל כאן בנגן הרקע התחל כאן בנגן הצץ הורדת קובץ הזרמה. + הצג מידע + From 41fdafac459ba04139ff152f4b5c4f7a4056073b Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 9 Mar 2018 08:23:14 +0000 Subject: [PATCH 128/176] Translated using Weblate (Hebrew) Currently translated at 76.8% (249 of 324 strings) --- app/src/main/res/values-he/strings.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index e2547e75572..8fc73903ea2 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -292,6 +292,11 @@ התחל כאן בנגן הרקע התחל כאן בנגן הצץ הורדת קובץ הזרמה. - הצג מידע + הצגת מידע + סימניות + + הוספה אל + + מדינת תוכן כבררת מחדל From ec8d488249f9acb785470bc630da5cb1fde219fa Mon Sep 17 00:00:00 2001 From: anonymous <> Date: Fri, 9 Mar 2018 08:23:39 +0000 Subject: [PATCH 129/176] Translated using Weblate (Hebrew) Currently translated at 78.0% (253 of 324 strings) --- app/src/main/res/values-he/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 8fc73903ea2..4d3d440c978 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -299,4 +299,9 @@ הוספה אל מדינת תוכן כבררת מחדל + שירות + ניפוי שגיאות + תמיד + חד פעמי + From 04e90cc279331c00cc2b3844f9e28897c42284fd Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 9 Mar 2018 08:24:26 +0000 Subject: [PATCH 130/176] Translated using Weblate (Hebrew) Currently translated at 78.7% (255 of 324 strings) --- app/src/main/res/values-he/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 4d3d440c978..0a9e5cd2077 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -304,4 +304,6 @@ תמיד חד פעמי + יבוא מסד נתונים + יצוא מסד נתונים From 7be5ec05213733470cba02d0cfd02f8d329b8c3d Mon Sep 17 00:00:00 2001 From: anonymous <> Date: Fri, 9 Mar 2018 08:24:59 +0000 Subject: [PATCH 131/176] Translated using Weblate (Hebrew) Currently translated at 79.3% (257 of 324 strings) --- app/src/main/res/values-he/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 0a9e5cd2077..1a6886f35e9 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -306,4 +306,6 @@ יבוא מסד נתונים יצוא מסד נתונים + נגנים חיצוניים לא תומכים בסוגי קישורים אלה + כתובת לא תקינה From ee3248ea5d3db633a368faed738f142e983bf6c2 Mon Sep 17 00:00:00 2001 From: E T Date: Fri, 9 Mar 2018 11:28:47 +0000 Subject: [PATCH 132/176] Translated using Weblate (Turkish) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-tr/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 1f1208326f1..9cecac69249 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -395,4 +395,11 @@ Out-of-Lifecycle Hatalarını Bildir Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsünde meydana gelen ve teslim edilemeyen Rx beklentilerinin bildirimini zorla - +Hızlı isabetsiz konumlama kullan + İsabetsiz konumlama, oynatıcının konumları düşürülmüş duyarlıkla saptamasını sağlar + Sonraki akışı kendiliğinden kuyrukla + Yinelemeyen oynatma kuyruğundaki son akış başladığında ilişkili akışı kuyruğun sonuna kendiliğinden ekle. + CANLI + EŞZAMANLA + + From 3dab4c07cf7525392d7295725152130adc3f21c3 Mon Sep 17 00:00:00 2001 From: Kotoba Murasaki Date: Thu, 8 Mar 2018 19:41:49 +0000 Subject: [PATCH 133/176] Translated using Weblate (Ukrainian) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-uk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 1669a075ff4..5deac5622e8 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -26,7 +26,7 @@ Шлях для завантаження аудіо Шлях де будуть зберігатись завантажені аудіо файли Автоматично відтворювати - Автоматично відтворювати відео коли NewPipe викликано з іншого додатку. + Автоматично відтворювати відео коли NewPipe викликано з іншого застосунку Типова роздільна здатність Відтворювати за допомогою Kodi Застосунок Kore не знайдено. Встановити? @@ -59,7 +59,7 @@ Помилка Помилка мережі Не вдалося завантажити всі ескізи - Не вдалося розшифрувати підпис URL відео. + Не вдалося розшифрувати підпис URL відео Не вдалося проаналізувати веб-сайт Не вдалося повністю проаналізувати веб-сайт Контент не доступний From a4fe43a9645544cb22ddde922722524cb3b2da50 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Fri, 9 Mar 2018 15:44:17 +0000 Subject: [PATCH 134/176] Translated using Weblate (Italian) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-it/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f65281c27a5..5436b988371 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -405,4 +405,11 @@ Riporta gli errori \"fuori dal ciclo di vita\" Forza il riporto delle eccezioni Rx non consegnabili verificate fuori dal frammento o dall\'attività del \"ciclo di vita\" - +Usa una ricerca veloce ma poco precisa + La ricerca imprecisa permette al riproduttore di spostarti nelle posizioni più velocemente con una precisione ridotta + Metti in coda automaticamente il prossimo flusso + Aggiungi automaticamente un flusso correlato mentre il playback parte dall\'ultimo flusso in una cosa non ripetitiva. + IN DIRETTA + SINCRONIZZAZIONE + + From dcc510ff6c645dd0d4ef4f811bf0e0d618bb5a88 Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Thu, 8 Mar 2018 22:51:28 +0000 Subject: [PATCH 135/176] Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.7% (320 of 324 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 75e6399f059..909df308069 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -379,4 +379,11 @@ abrir em modo popup Reportar Erros fora do ciclo de vida Forçar o report de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após o dispose - +Usar índice de indexação rápido porém não preciso + Usar índice de indexação inexato + Adicionar a próxima stream à fila automaticamente + Anexar automaticamente uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva + Ao Vivo + Sincronizar + + From 65674f7fd47f604e1b06562786b8bec91d7c12e7 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 9 Mar 2018 08:25:47 +0000 Subject: [PATCH 136/176] Translated using Weblate (Hebrew) Currently translated at 79.6% (258 of 324 strings) --- app/src/main/res/values-he/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 1a6886f35e9..a2b1c6abc39 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -307,5 +307,6 @@ יבוא מסד נתונים יצוא מסד נתונים נגנים חיצוניים לא תומכים בסוגי קישורים אלה - כתובת לא תקינה + כתובת שגויה + חי From ca47f566dc8723f58b265ee6f0fd5485fe5386c3 Mon Sep 17 00:00:00 2001 From: AB Date: Fri, 9 Mar 2018 12:52:22 +0000 Subject: [PATCH 137/176] Translated using Weblate (Ukrainian) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5deac5622e8..7399bad2b48 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -222,7 +222,7 @@ Ліцензії Допомогти Переглянути на Ґітгаб - Донат + Задонатуй Веб-сайт Історія Історію стерто From b811aec7737e5e5fcc41dafd20279e68e5d95cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Freddy=20Mor=C3=A1n=20Jr?= Date: Fri, 9 Mar 2018 17:19:51 +0000 Subject: [PATCH 138/176] Translated using Weblate (Spanish) Currently translated at 98.7% (320 of 324 strings) --- app/src/main/res/values-es/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3acabfe57c7..f65f4a6a843 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -404,4 +404,6 @@ abrir en modo popup Reportar errores fuera del ciclo de duración Forzar la notificación de excepciones no entregables de RX que ocurren fuera del fragmento o del ciclo de actividad después de disponer - +Usar búsqueda rápida inexacta + La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión + From 0abf97e999f770d0a353466d2f56211b008cfd4e Mon Sep 17 00:00:00 2001 From: Pablo Hinojosa Date: Sat, 10 Mar 2018 15:07:49 +0000 Subject: [PATCH 139/176] Translated using Weblate (Spanish) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-es/strings.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f65f4a6a843..d381c30fcb2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -311,7 +311,7 @@ abrir en modo popup Servicio Abrir cajón Cerrar cajón - No se ha encontrado ningún reproductor de streaming (puede instalar VLC para reproducirlo) + No se ha encontrado ningún reproductor de vídeo (puede instalar VLC para reproducirlo) Siempre Sólo una vez @@ -406,4 +406,9 @@ abrir en modo popup Usar búsqueda rápida inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión + Auto-encolar la siguiente transmisión + "Automáticamente añadir un vídeo relacionado cuando el reproductor llegue al último vídeo en una lista de reproducción no repetible. " + DIRECTO + SINCRONIZAR + From 562f7e7e414ad5164df738eea6043cb8f37fad4d Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Sat, 10 Mar 2018 13:16:51 -0300 Subject: [PATCH 140/176] Add duration view to video detail fragment - Add "textAllCaps" to the mini stream layout - Closes #609 --- .../fragments/detail/VideoDetailFragment.java | 25 +++++++++++++------ .../main/res/layout/fragment_video_detail.xml | 25 +++++++++++++++++++ .../main/res/layout/list_stream_mini_item.xml | 1 + app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - 12 files changed, 43 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 8e8179b9a30..fc9a427eb32 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -16,7 +16,6 @@ import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; -import android.support.v7.widget.Toolbar; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; @@ -92,8 +91,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; -import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; import static org.schabi.newpipe.util.AnimationUtils.animateView; @@ -138,9 +135,9 @@ public class VideoDetailFragment /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ + private Menu menu; - private Toolbar toolbar; private Spinner spinnerToolbar; private ParallaxScrollView parallaxScrollRootView; @@ -160,6 +157,7 @@ public class VideoDetailFragment private TextView detailControlsAddToPlaylist; private TextView detailControlsDownload; private TextView appendControlsDetail; + private TextView detailDurationView; private LinearLayout videoDescriptionRootLayout; private TextView videoUploadDateView; @@ -461,9 +459,7 @@ private void toggleExpandRelatedVideos(StreamInfo info) { @Override protected void initViews(View rootView, Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); - - toolbar = activity.findViewById(R.id.toolbar); - spinnerToolbar = toolbar.findViewById(R.id.toolbar_spinner); + spinnerToolbar = activity.findViewById(R.id.toolbar).findViewById(R.id.toolbar_spinner); parallaxScrollRootView = rootView.findViewById(R.id.detail_main_content); @@ -483,6 +479,7 @@ protected void initViews(View rootView, Bundle savedInstanceState) { detailControlsAddToPlaylist = rootView.findViewById(R.id.detail_controls_playlist_append); detailControlsDownload = rootView.findViewById(R.id.detail_controls_download); appendControlsDetail = rootView.findViewById(R.id.touch_append_detail); + detailDurationView = rootView.findViewById(R.id.detail_duration_view); videoDescriptionRootLayout = rootView.findViewById(R.id.detail_description_root_layout); videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view); @@ -1098,6 +1095,7 @@ public void showLoading() { animateView(contentRootLayoutHiding, false, 200); animateView(spinnerToolbar, false, 200); animateView(thumbnailPlayButton, false, 50); + animateView(detailDurationView, false, 100); videoTitleTextView.setText(name != null ? name : ""); videoTitleTextView.setMaxLines(1); @@ -1168,6 +1166,18 @@ public void handleResult(@NonNull StreamInfo info) { thumbsDisabledTextView.setVisibility(View.GONE); } + if (info.getDuration() > 0) { + detailDurationView.setText(Localization.getDurationString(info.getDuration())); + detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.duration_background_color)); + animateView(detailDurationView, true, 100); + } else if (info.getStreamType() == StreamType.LIVE_STREAM) { + detailDurationView.setText(R.string.duration_live); + detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.live_duration_background_color)); + animateView(detailDurationView, true, 100); + } else { + detailDurationView.setVisibility(View.GONE); + } + videoTitleRoot.setClickable(true); videoTitleToggleArrow.setVisibility(View.VISIBLE); videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); @@ -1201,7 +1211,6 @@ public void handleResult(@NonNull StreamInfo info) { case AUDIO_LIVE_STREAM: detailControlsDownload.setVisibility(View.GONE); spinnerToolbar.setVisibility(View.GONE); - toolbar.setTitle(R.string.live); break; default: if (!info.video_streams.isEmpty() || !info.video_only_streams.isEmpty()) break; diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index fb9ee2890a5..cc14e132204 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -70,6 +70,31 @@ android:visibility="gone" tools:ignore="RtlHardcoded" tools:visibility="visible"/> + + diff --git a/app/src/main/res/layout/list_stream_mini_item.xml b/app/src/main/res/layout/list_stream_mini_item.xml index 22cd3887e01..bffd13a6f76 100644 --- a/app/src/main/res/layout/list_stream_mini_item.xml +++ b/app/src/main/res/layout/list_stream_mini_item.xml @@ -36,6 +36,7 @@ android:paddingLeft="@dimen/video_item_search_duration_horizontal_padding" android:paddingRight="@dimen/video_item_search_duration_horizontal_padding" android:paddingTop="@dimen/video_item_search_duration_vertical_padding" + android:textAllCaps="true" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="@color/duration_text_color" android:textSize="@dimen/video_item_search_duration_text_size" diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d381c30fcb2..e9d686d109a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -408,7 +408,6 @@ abrir en modo popup La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión Auto-encolar la siguiente transmisión "Automáticamente añadir un vídeo relacionado cuando el reproductor llegue al último vídeo en una lista de reproducción no repetible. " - DIRECTO SINCRONIZAR diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index a2b1c6abc39..cb69d663966 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -308,5 +308,4 @@ יצוא מסד נתונים נגנים חיצוניים לא תומכים בסוגי קישורים אלה כתובת שגויה - חי diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5436b988371..f7206893d5a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -409,7 +409,6 @@ La ricerca imprecisa permette al riproduttore di spostarti nelle posizioni più velocemente con una precisione ridotta Metti in coda automaticamente il prossimo flusso Aggiungi automaticamente un flusso correlato mentre il playback parte dall\'ultimo flusso in una cosa non ripetitiva. - IN DIRETTA SINCRONIZZAZIONE diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f09914384fe..4f8e5b0e547 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -404,7 +404,6 @@ te openen in pop-upmodus Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Volgende stream automatisch in wachtrij plaatsen Automatisch een gerealteerde stream toekennen als het afspelen van de laatste stream strat in een niet-herhalende afspeelwachtlijst. - LIVE SYNCHRONISEREN diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 909df308069..96e6ccb700b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -383,7 +383,6 @@ abrir em modo popup Usar índice de indexação inexato Adicionar a próxima stream à fila automaticamente Anexar automaticamente uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva - Ao Vivo Sincronizar diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9cecac69249..9fbb42e0be0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -399,7 +399,6 @@ İsabetsiz konumlama, oynatıcının konumları düşürülmüş duyarlıkla saptamasını sağlar Sonraki akışı kendiliğinden kuyrukla Yinelemeyen oynatma kuyruğundaki son akış başladığında ilişkili akışı kuyruğun sonuna kendiliğinden ekle. - CANLI EŞZAMANLA diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 7399bad2b48..0608d81506f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -390,7 +390,6 @@ Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю Автоматично додати до черги наступний стрим Автоматично додавати пов\'язаний стрим, під час початку програвання останнього стриму. - НАЖИВО СИНХРОНІЗАЦІЯ diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f9f8eaf1f3c..a112b4830ba 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -385,7 +385,6 @@ 不精確的尋找,允許玩家以更低的精確更快找到位置 自動佇列下一個串流 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流。 - 直播 同步 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e168165e685..c97f12809e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,7 +113,6 @@ Show age restricted content Age Restricted Video. Allowing such material is possible from Settings. live - LIVE Downloads Downloads Error report From 9c9b6bc0d6f291d33a04334fd6b871684a50a2cb Mon Sep 17 00:00:00 2001 From: Mauricio Colli Date: Sat, 10 Mar 2018 13:36:50 -0300 Subject: [PATCH 141/176] Change thumbnail's scale strategy - Closes #1054 --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 3 --- app/src/main/res/layout/fragment_video_detail.xml | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index fc9a427eb32..4d935dbceb6 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -1007,9 +1007,6 @@ private void setHeightThumbnail() { int height = isPortrait ? (int) (metrics.widthPixels / (16.0f / 9.0f)) : (int) (metrics.heightPixels / 2f); - thumbnailImageView.setScaleType(isPortrait - ? ImageView.ScaleType.CENTER_CROP - : ImageView.ScaleType.FIT_CENTER); thumbnailImageView.setLayoutParams( new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height)); thumbnailImageView.setMinimumHeight(height); diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index cc14e132204..7c6568b6732 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:background="@android:color/transparent" android:contentDescription="@string/detail_thumbnail_view_description" - android:scaleType="centerCrop" + android:scaleType="fitCenter" tools:ignore="RtlHardcoded" tools:layout_height="200dp" tools:src="@drawable/dummy_thumbnail"/> From 0a5bffe8262f4b13194ead25eb338831a4661f98 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Fri, 9 Mar 2018 15:51:26 +0000 Subject: [PATCH 142/176] Translated using Weblate (Italian) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-it/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5436b988371..4e59659e7fc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -15,7 +15,7 @@ Scegli il browser rotazione Percorso dei video scaricati - Percorso in cui memorizzare i video scaricati + Cartella in cui memorizzare i video scaricati Inserisci il percorso per i download Risoluzione predefinita Riproduci con Kodi @@ -45,7 +45,7 @@ Percorso degli audio scaricati Percorso dove salvare gli audio scaricati - Inserisci il percorso per i file audio + Inserisci la cartella per i file audio Tema Scuro @@ -76,7 +76,7 @@ Mostra contenuti vincolati all\'età Questo video è riservato ad un pubblico maggiorenne. Per accedervi, abilita \"Mostra video vincolati all\'età\" nelle impostazioni. - Tocca \"cerca\" per iniziare + Tocca cerca per iniziare Riproduzione automatica Riproduci i video automaticamente quando NewPipe viene aperto da un\'altra app in diretta @@ -161,7 +161,7 @@ Risoluzione predefinita per la modalità popup Mostra risoluzioni più alte - Solo alcuni dispositivi supportano la riproduzione di video in 2K e 4K + Solo alcuni dispositivi supportano la riproduzione video in 2K e 4K Formato video predefinito Ricorda grandezza e posizione del popup Ricorda l\'ultima grandezza e posizione del popup @@ -191,7 +191,7 @@ Informazioni Contributori Licenze - Un\'interfaccia leggera e gratuita per accedere a YouTube su Android. + Un\'interfaccia leggera e libera per accedere a YouTube su Android. Mostra su GitHub Licenza di NewPipe Un aiuto è sempre il benvenuto: nuove idee, design o traduzioni, piccoli cambi o modifiche radicali del codice rendono l\'applicazione sempre migliore! @@ -405,7 +405,7 @@ Riporta gli errori \"fuori dal ciclo di vita\" Forza il riporto delle eccezioni Rx non consegnabili verificate fuori dal frammento o dall\'attività del \"ciclo di vita\" -Usa una ricerca veloce ma poco precisa +Usa una ricerca rapida ma imprecisa La ricerca imprecisa permette al riproduttore di spostarti nelle posizioni più velocemente con una precisione ridotta Metti in coda automaticamente il prossimo flusso Aggiungi automaticamente un flusso correlato mentre il playback parte dall\'ultimo flusso in una cosa non ripetitiva. From a8c9edbc3f123b27c797a8dac94f8f193d274c0a Mon Sep 17 00:00:00 2001 From: Pablo Hinojosa Date: Sat, 10 Mar 2018 15:08:19 +0000 Subject: [PATCH 143/176] Translated using Weblate (Spanish) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d381c30fcb2..8df829600a1 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -407,7 +407,7 @@ abrir en modo popup Usar búsqueda rápida inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión Auto-encolar la siguiente transmisión - "Automáticamente añadir un vídeo relacionado cuando el reproductor llegue al último vídeo en una lista de reproducción no repetible. " + Automáticamente añadir un vídeo relacionado cuando el reproductor llegue al último vídeo en una lista de reproducción no repetible. DIRECTO SINCRONIZAR From 5f764ab8f5e28ac2744f8cbff648087bcf70b767 Mon Sep 17 00:00:00 2001 From: alexandre patelli Date: Sat, 10 Mar 2018 18:25:20 +0100 Subject: [PATCH 144/176] Media Button Play/Pause, Previous and Next in Background Player --- app/src/main/AndroidManifest.xml | 6 +++ .../newpipe/player/BackgroundPlayer.java | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1be8c1f2ce1..18b3222a068 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,6 +43,12 @@ android:launchMode="singleTask" android:label="@string/title_activity_background_player"/> + + + + + + Date: Sun, 11 Mar 2018 15:09:11 +0100 Subject: [PATCH 145/176] Direct use of AudioManager from AudioReactor --- .../java/org/schabi/newpipe/player/BackgroundPlayer.java | 7 ++----- .../org/schabi/newpipe/player/helper/AudioReactor.java | 9 +++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 48249d87670..bc28116cda1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -28,7 +28,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; -import android.media.AudioManager; import android.os.Build; import android.os.IBinder; import android.support.annotation.IntRange; @@ -82,7 +81,6 @@ public final class BackgroundPlayer extends Service { private BasePlayerImpl basePlayerImpl; private LockManager lockManager; - private AudioManager mAudioManager; private ComponentName mReceiverComponent; /*////////////////////////////////////////////////////////////////////////// @@ -122,9 +120,8 @@ public void onCreate() { mBinder = new PlayerServiceBinder(basePlayerImpl); shouldUpdateOnProgress = true; - mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mReceiverComponent = new ComponentName(this, MediaButtonReceiver.class); - mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); + basePlayerImpl.audioReactor.registerMediaButtonEventReceiver(mReceiverComponent); } @Override @@ -163,7 +160,7 @@ private void onClose() { basePlayerImpl = null; lockManager = null; - mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent); + basePlayerImpl.audioReactor.unregisterMediaButtonEventReceiver(mReceiverComponent); stopForeground(true); stopSelf(); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index 2c85cfc3481..0e6642eed9d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -3,6 +3,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.media.AudioFocusRequest; @@ -86,6 +87,14 @@ private boolean shouldBuildFocusRequest() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; } + public void registerMediaButtonEventReceiver(ComponentName componentName) { + audioManager.registerMediaButtonEventReceiver(componentName); + } + + public void unregisterMediaButtonEventReceiver(ComponentName componentName) { + audioManager.unregisterMediaButtonEventReceiver(componentName); + } + /*////////////////////////////////////////////////////////////////////////// // AudioFocus //////////////////////////////////////////////////////////////////////////*/ From 36457400e708dc284e2bbb219b472f8baf795aee Mon Sep 17 00:00:00 2001 From: alexandre patelli Date: Sun, 11 Mar 2018 19:23:00 +0100 Subject: [PATCH 146/176] Review Fixes --- .../java/org/schabi/newpipe/player/BackgroundPlayer.java | 7 +++++-- .../org/schabi/newpipe/player/helper/AudioReactor.java | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index bc28116cda1..3e9a6388677 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -152,6 +152,7 @@ private void onClose() { lockManager.releaseWifiAndCpu(); } if (basePlayerImpl != null) { + basePlayerImpl.audioReactor.unregisterMediaButtonEventReceiver(mReceiverComponent); basePlayerImpl.stopActivityBinding(); basePlayerImpl.destroy(); } @@ -160,8 +161,6 @@ private void onClose() { basePlayerImpl = null; lockManager = null; - basePlayerImpl.audioReactor.unregisterMediaButtonEventReceiver(mReceiverComponent); - stopForeground(true); stopSelf(); } @@ -594,6 +593,10 @@ public void onReceive(Context context, Intent intent) { pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_PLAY_PREVIOUS), PendingIntent.FLAG_UPDATE_CURRENT); } else if (keycode == KeyEvent.KEYCODE_HEADSETHOOK) { pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT); + } else if (keycode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { + pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_FAST_FORWARD), PendingIntent.FLAG_UPDATE_CURRENT); + } else if (keycode == KeyEvent.KEYCODE_MEDIA_REWIND) { + pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_FAST_REWIND), PendingIntent.FLAG_UPDATE_CURRENT); } if (pendingIntent != null) { try { diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index 0e6642eed9d..df30c3e79d9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -88,10 +88,18 @@ private boolean shouldBuildFocusRequest() { } public void registerMediaButtonEventReceiver(ComponentName componentName) { + if (android.os.Build.VERSION.SDK_INT > 27) { + Log.e(TAG, "registerMediaButtonEventReceiver has been deprecated and maybe not supported anymore."); + return; + } audioManager.registerMediaButtonEventReceiver(componentName); } public void unregisterMediaButtonEventReceiver(ComponentName componentName) { + if (android.os.Build.VERSION.SDK_INT > 27) { + Log.e(TAG, "unregisterMediaButtonEventReceiver has been deprecated and maybe not supported anymore."); + return; + } audioManager.unregisterMediaButtonEventReceiver(componentName); } From 2a778383b1338445a4008e39118ca1da079f8764 Mon Sep 17 00:00:00 2001 From: Andreas Kleinert Date: Sat, 10 Mar 2018 18:59:44 +0000 Subject: [PATCH 147/176] Translated using Weblate (German) Currently translated at 93.2% (302 of 324 strings) --- app/src/main/res/values-de/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 871e31750e5..df414b78137 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -375,4 +375,5 @@ Schriftgröße der Untertitel Abbrechen Normale Schriftgröße + Stream-Datei herunterladen From a67ff564d0d1ed3bdee6b174ec1fd99d215f91ce Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Sun, 11 Mar 2018 12:24:36 +0000 Subject: [PATCH 148/176] Translated using Weblate (Arabic) Currently translated at 91.6% (297 of 324 strings) --- app/src/main/res/values-ar/strings.xml | 93 ++++++++++++++++++++------ 1 file changed, 72 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ba26d6ed650..f437d7cbb7e 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -10,15 +10,15 @@ الإعجابات صور معاينة الفيديو الصورة المصغرة الشخصية - هل تقصد : %1$s ? + هل تقصد : %1$s ؟ تنزيل تنزيل أدخل مسار لتنزيل الملفات الصوتية. مسار حفظ التنزيلات الصوتية - مسار الصوتيات المحفوظة + مسار الصوتيات المُنزَّلة أدخل مسار التنزيل لملفات الفيديو مسار حفظ تنزيلات الفيديو في - مسار تحميل الفيديو + مسار الفيديوهات المُنزّلَة "لا يمكن إنشاء مجلد للتنزيلات في '%1$s'" "تم إنشاء مجلد تنزيلات في '%1$s'" تثبيت @@ -60,7 +60,7 @@ خطأ تعذرت عملية تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو -انقر على البحث للبدء +أنقر على البحث للبدء إشتراك مشترك الرئيسية @@ -70,7 +70,7 @@ الخلفية التشغيل التلقائي - أسود + أسوَد التاريخ التاريخ المحتوى @@ -86,7 +86,7 @@ التأريخ إفتح في نافذة منبثقه عند تمكين هذا الخيار لن يكون هنالك صوت في بعض خيارات الجودة - وضع النافذة NewPipe المنبثقة + وضع نافذة NewPipe المنبثقة تم إلغاء اشتراك القناة تعذر تغيير في الاشتراك تعذر تحديث الاشتراك @@ -94,9 +94,9 @@ نافذة تشغيل الفيديو تلقائيا عند استدعاء NewPipe من تطبيق آخر - الجودة الافتراضية للنوافذ المنبثقة + الجودة الإفتراضية للنوافذ المنبثقة إظهار جودة أعلى - فقط بعض الأجهزة تدعم تشغيل فيديوهات 2K / 4K + بعض الأجهزة فقط تدعم تشغيل فيديوهات 2K / 4K تنسيق الفيديو الافتراضي تذكر حجم النافذة و وضعها تذكر آخر حجم ومكان النافذة @@ -117,14 +117,14 @@ التشغيل في الوضع المنبثق تم وضعه على قائمة الانتظار في مشغل الخلفية تم وضعه على قائمة الانتظار في مشغل النافذة المنبثقة - عرض المحتوى المقيد بحسب العمر - فيديو مقيد بحسب العمر. السماح بهذه المحتوى ممكن من الإعدادات. + عرض المحتوى المقيّد بحسب العُمر + فيديو مقيد بحسب العمر. السماح بهذا المحتوى ممكن عن طريق الإعدادات. مباشر تقرير الخطأ قائمة التشغيل نعم - فيما بعد - معطل + لاحقًا + مُعطل فلتر تحديث تنظيف @@ -241,7 +241,7 @@ شاهد تم تعطيل السجل التاريخ فارغ - تم تنظيف التاريخ + تم تنظيف التأريخ تم حذف العنصر هل تريد حذف هذا العنصر من سجل البحث؟ @@ -265,20 +265,20 @@ تحدي ريكابتشا اضغط للإدراج بقائمة الانتظار - صفر + لم تُشاهَد %s مشاهدة - اثنان - قليل - كثير + مشاهدتَين + %s مشاهدات + %s مشاهدات %s مشاهدات - صفر + لا فيديو %s فيديو - اثنان - قليل - كثير + فيديوهتان + %s فيديوهات + %s فيديوهات %s فيديوهات @@ -311,4 +311,55 @@ تصدير قاعدة البيانات "سيتجاوز سجل التاريخ والاشتراكات الحالية " تصدير سجل, الاشتراكات وقوائم التشغيل. + عرض المعلومات + + إضافة إلى + + تحليل + مٌباشِر + لم يتم العثور على أي بث + لم يتم العثور على أي بث صوتي + + إسحب للقيام بالترتيب + + إنشاء + إحذف واحدة + حذف الكل + إلغاء + إعادة التسمية + + تمت عملية التصدير + إكتَملَت عملية الإستيراد + تنبيه : تعذرت عملية استيراد كافة الملفات. + سوف نقوم بإدماج شيء جديد هنا قريبا ;D + + + قارئ الوسائط المُفضّل + + قارئ الفيديوهات + أُطلُب دائمًا + + عملية تحميل المعلومات جارية … + جارٍ تحميل المحتوى المطلوب + + إنشاء قائمة تشغيل جديدة + حذف قائمة التشغيل + "إعادة تسمية قائمة التشغيل " + التسمية + إضافة إلى قائمة تشغيل + هل تريد حذف قائمة التشغيل هذه ؟ + تم إنشاء قائمة التشغيل بنجاح + تمت إضافتها إلى قائمة التشغيل + فشِلت عملية حذف قائمة التشغيل + + ملئ + تقريب + + حجم خط التسمية + أصغر خط + خط عادي + خط ذو حجم كبير + + مُزامَنة + From e7a0b850df2332e83dcd0551bc66fa19e4390134 Mon Sep 17 00:00:00 2001 From: cozyplanes Date: Mon, 12 Mar 2018 14:50:29 +0000 Subject: [PATCH 149/176] Translated using Weblate (Korean) Currently translated at 100.0% (324 of 324 strings) --- app/src/main/res/values-ko/strings.xml | 105 +++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4a0caee97eb..cd273af38d0 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -284,4 +284,109 @@ 여기서부터 재생 여기서부터 백그라운드에서 재생 여기서부터 팝업에 재생 +스트리밍 플레이어를 찾을 수 없습니다. VLC를 설치하면 플레이하실 수 있습니다 + 스트리밍 파일 다운로드하기. + 정보 보기 + + 북마크 + + 이곳에 추가 + + 정확하지는 않지만 빠른 탐색 + 정확하지 않은 탐색은 빠르게 위치로 탐색할 수 있지만 정확도는 떨어집니다 + 다음 스트림을 자동으로 재생열에 추가하기 + 전 스트림이 무한 반복 재생 큐가 아닐 때 관련된 스트림 자동 재생하기. + 기본 콘텐츠 국가 + 서비스 + 디버그 + 라이브 (LIVE) + 항상 + 한번만 + + 디바이스 방향 토글 + 백그라운드로 전환 + 팝업으로 전환 + 기본으로 전환 + + 데이터베이스 가져오기 + 데이터베이스 내보내기 + 현재 시청 기록 및 구독 목록을 덮어쓰기 됩니다 + 시청 기록, 구독 목록, 재생목록 내보내기. + 외부 플레이어는 이러한 종류의 링크를 지원하지 않습니다 + 잘못된 URL + 발견된 비디오 스트림 없음 + 발견된 오디오 스트림 없음 + + 드래그하여 재배열 + + 만들기 + 1개 삭제하기 + 모두 삭제하기 + 취소 + 이름 바꾸기 + + 로봇인지 확인합니다 + 이 항목을 시청 기록에서 삭제하시겠습니까? + 모든 항목을 시청 기록에서 삭제하시겠습니까? + 마지막으로 재생 + 가장 많이 재생 + + 내보내기 완료 + 가져오기 완료 + 유효한 ZIP 파일 없음 + 경고: 모든 파일 가져오기를 실패했습니다. + 이것은 현재 설정을 덮어쓸 것입니다. + + 드로어 열기 + 드로어 닫기 + 여기에 무언가가 추가될 거에요~ :D + + + 선호하는 플레이어로 열기 + 선호하는 플레이어 + + 비디오 플레이어 + 백그라운드 플레이어 + 팝업 플레이어 + 항상 묻기 + + 정보 가져오는 중… + 요청한 콘텐츠를 로딩 중입니다 + + 새로운 재생목록 만들기 + 재생목록 삭제 + 재생목록 이름 바꾸기 + 이름 + 재생목록에 추가 + 재생목록 썸네일로 설정 + + 재생목록 북마크하기 + 북마크 제거하기 + + 이 재생목록을 삭제하시겠습니까? + 재생목록 생성 성공 + 재생목록에 추가됨 + 재생목록 썸내일이 바뀜 + 재생목록 삭제 실패 + + 자막 없음 + + 꼭 맞게 하기 + 채우기 + 확대 + + 자동 생성됨 + 자막 폰트 크기 + 작은 폰트 + 보통 폰트 + 큰 폰트 + + 동기화 + + LeakCanary 할성화 + 메모리 누수 모니터링은 힙 덤핑시 앱이 불안정할 수 있습니다 + + Out-of-Lifecycle 에러 보고 + 프래그먼트 또는 버려진 액티비티 주기 밖에서 일어나는 전달할 수 없는 Rx 예외를 강제적으로 보고하기 + From a9fea9f6065550890268692d845fed5e62cc7443 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 12 Mar 2018 15:57:35 +0100 Subject: [PATCH 150/176] fix release crash because of setting sidebar header --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 573479ea708..1c62690c22d 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -176,9 +176,11 @@ protected void onResume() { // when the user returns to MainActivity drawer.closeDrawer(Gravity.START, false); try { - String selectedServiceName = NewPipe.getService( - ServiceHelper.getSelectedServiceId(this)).getServiceInfo().getName(); - headerServiceView.setText(selectedServiceName); + if(BuildConfig.BUILD_TYPE != "release" ) { + String selectedServiceName = NewPipe.getService( + ServiceHelper.getSelectedServiceId(this)).getServiceInfo().getName(); + headerServiceView.setText(selectedServiceName); + } } catch (Exception e) { ErrorActivity.reportUiError(this, e); } From 6049a1f2f59ee623628e6eb3a8e0bcc2b49045eb Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 12 Mar 2018 16:18:03 +0100 Subject: [PATCH 151/176] fix playlist banner foo --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 81400605109..88fe38183bc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:b1130629bb' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:fce324d1bc74bc' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:1.10.19' From bdf044d264043539d55dab8647b4e161a8e934bf Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Mon, 12 Mar 2018 16:00:07 +0000 Subject: [PATCH 152/176] Translated using Weblate (Dutch) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-nl/strings.xml | 42 +++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4f8e5b0e547..07fa4d7203c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -406,4 +406,44 @@ te openen in pop-upmodus Automatisch een gerealteerde stream toekennen als het afspelen van de laatste stream strat in een niet-herhalende afspeelwachtlijst. SYNCHRONISEREN - + Bestand + + Ongeldige map + Ongeldig bestand/Ongeldige inhoudsbron + Het bestand bestaat niet of u beschikt niet over voldoende machtiging om het te lezen/er naar te schrijven + De bestandsnaam mag niet leeg zijn + Er is een fout opgetreden: %1$s + + Importeren/Exporteren + Importeren + Importeren uit + Exporteren naar + + Bezig met importeren… + Bezig met exporteren… + + Bestand importeren + Vorige exportering + + Importeren van abonnementen is mislukt + Exporteren van abonnementen is mislukt + + Als u uw YouTube-abonnementen wilt importeren, dan heeft u het exportbestand nodig. Dit kan worden gedownload door het volgen van onderstaande stappen: +\n +\n1. Ga naar dit adres: %1$s +\n2. Log, indien nodig, in op uw account +\n3. De download met het exportbestand zou nu moeten starten + Als u uw SoundCloud-abonnementen wilt importeren, dan moet u uw profiel-URL of ID kennen. Als u hem kent, typ hem dan hieronder in. +\n +\nAls u hem niet kent, volg dan onderstaande stappen: +\n +\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten) +\n2. Volg deze link: %1$s +\n3. Log, indien nodig, in op uw account +\n4. Kopieer de link van de pagina waar u op terechtkomt (dat is uw profiel-URL) + uwid, soundcloud.com/uwid + + Let op: deze actie kan veel MB\'s van uw netwerk gebruiken. +\n +\nWilt u doorgaan? + From 4aa2c1c2c21c088c644c1706e72385cb066d6cf2 Mon Sep 17 00:00:00 2001 From: cozyplanes Date: Mon, 12 Mar 2018 15:20:18 +0000 Subject: [PATCH 153/176] Translated using Weblate (Korean) Currently translated at 95.0% (326 of 343 strings) --- app/src/main/res/values-ko/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index cd273af38d0..33b730e3e90 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -78,7 +78,7 @@ 다운로드 메뉴를 설정할 수 없습니다 실시간 스트리밍 비디오는 아직 지원되지 않습니다. 어떠한 스트림도 가져올 수 없습니다 - 죄송합니다 + 죄송합니다. 오류가 발생했습니다. 이메일을 통해 오류 보고 죄송합니다. 오류가 발생했습니다. 보고 @@ -389,4 +389,8 @@ Out-of-Lifecycle 에러 보고 프래그먼트 또는 버려진 액티비티 주기 밖에서 일어나는 전달할 수 없는 Rx 예외를 강제적으로 보고하기 - +파일 + + 잘못된 디렉토리 + 잘못된 파일/콘덴츠 소스 + From 158f0aa2d971463d705312da1ffc9d75610d9081 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Mon, 12 Mar 2018 16:53:28 +0000 Subject: [PATCH 154/176] Translated using Weblate (Italian) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-it/strings.xml | 42 +++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9b294a9a725..8ad96dd3f01 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -411,4 +411,44 @@ Aggiungi automaticamente un flusso correlato mentre il playback parte dall\'ultimo flusso in una cosa non ripetitiva. SINCRONIZZAZIONE - + File + + Cartella invalida + Fonte del contenuto o file invalido + Il file non esiste o non si hanno i permessi sufficenti per leggerlo o scriverci + Il nome del file non può essere vuoto + Si è verificato un errore: %1$s + + Importa/Esporta + Importa + Importa da + Esporta a + + Importando… + Esportando… + + Importa file + Esportazione precedente + + L\'importazione delle iscrizioni è fallita + L\'esportazione delle iscrizioni è fallita + + Per importare le tue iscrizioni YouTube devi procurarti il file d\'esportazione, il quale può essere scaricato seguendo le seguenti istruzioni: +\n +\n1. Vai a questo URL: %2$s +\n2. Accedi al tuo account quando è richiedto +\n3. Un download dovrebbe essere partito (è il file d\'esportazione) + Per importare i tuoi seguiti di SoundCloud devi conoscere l\'URL del tuo profilo od il tuo ID. Se lo sai, ti basta scrivere uno dei due nell\'immisione in basso ed hai fatto. +\n +\nSe non lo sai, puoi seguire le seguenti istruzioni: +\n +\n1. Abilita la \"modalità desktop\" nel browser che usi (il sito non funziona nella modalità mobile) +\n2. Vai a questo URL: %2$s +\n3. Accedi al tuo account quando richiesto +\n4. Copia l\'URL a cui vieni indirizzato (è l\'URL del tuo profilo) + iltuoid, soundcloud.com/iltuoid + + Tieni in mente che questa operazione può richiedere un costo di connessione dati. +\n +\nVuoi continuare? + From 21e300b9f36efd37d13d9ae3ab850a77902c13ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Freddy=20Mor=C3=A1n=20Jr?= Date: Mon, 12 Mar 2018 20:18:00 +0000 Subject: [PATCH 155/176] Translated using Weblate (Spanish) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-es/strings.xml | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5499188a3e9..d00a6be8508 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -410,4 +410,44 @@ abrir en modo popup Automáticamente añadir un vídeo relacionado cuando el reproductor llegue al último vídeo en una lista de reproducción no repetible. DIRECTO SINCRONIZAR +Archivo + + Directorio invalido + Fuente del archivo/contenido inválida + El archivo no existe o el permiso es insuficiente para leerlo o escribir en él + El nombre del archivo no puede estar vacío + Ocurrió un error: %1$s + + Importar/Exportar + Importar + Importar desde + Exportar a + + Importando… + Exportando… + + Importar archivo + Exportación anterior + + Importación de suscripciones fallida + Exportación de suscripciones fallida + + Para importar sus suscripciones de YouTube, necesitará el archivo de exportación, el cual puede ser descargado siguiendo estas instrucciones: +\n +\n1. Vaya a esta URL: %1$s +\n2. Ingrese a su cuenta cuando se le pida +\n3. Una descarga debería comenzar (ese es el archivo de exportación) + Para importar sus seguimientos de SoundCloud, debe conocer la URL o el ID de su perfil. Si es así, simplemente escriba cualquiera de ellos en la entrada de abajo y ya está listo para comenzar. +\n +\nSi no es así, puede seguir estos pasos: +\n +\n1. Active el \"modo escritorio\" en algún navegador (el sitio no está disponible para dispositivos móviles) +\n2. Vaya a esta URL: %1$s +\n3. Ingrese a su cuenta cuando se le pida +\n4. Copie la URL a la que fue redireccionado (esa es la URL de su perfil) + suID, soundcloud.com/suID + + Tenga en cuenta que esta operación puede ser costosa para la red. +\n +\n¿Desea continuar? From 00dee43a1e90ae0bd8246f187fa9a37697f0fb09 Mon Sep 17 00:00:00 2001 From: cozyplanes Date: Tue, 13 Mar 2018 11:23:54 +0000 Subject: [PATCH 156/176] Translated using Weblate (Korean) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-ko/strings.xml | 39 ++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 33b730e3e90..60ee4e52342 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -241,7 +241,7 @@ 번역, 디자인, 코딩 등 다양한 기여를 언제나 환영합니다. 향상에 참여해주세요! GitHub에서 보기 기부 - 뉴파이프는 자원봉사자들이 자발적으로 여가 시간을 활용해 개발하고 있습니다. 이제 이러한 노력에 보답할 시간입니다. + 뉴파이프는 자원봉사자들이 자발적으로 여가 시간을 활용해 개발하고 있습니다. 이제 이러한 노력에 보답할 시간입니다! 보답하기 웹사이트 뉴파이프에 관한 최신 및 상세 정보를 얻으려면 웹사이트를 방문하세요. @@ -393,4 +393,39 @@ 잘못된 디렉토리 잘못된 파일/콘덴츠 소스 - + 파일이 존재하지 않거나 읽기/쓰기 권환이 없습니다 + 파일 이름이 비어 있으면 안됩니다 + 오류 발생: %1$s + + 가져오기/내보내기 + 가져오기 + 이곳으로부터 가져오기 + 이곳으로 내보내기 + + 가져오는 중.… + 내보내는 중… + + 파일 가져오기 + 이전 내보내기 + + 구독 목록 가져오기 실패 + 구독 목록 내보내기 실패 + + YouTube 구독 목록을 가져오려면 내보내기 파일이 필요합니다. 다운로드 하려면 +\n1. 이곳으로 가세요: $1$s +\n2. 로그인이 필요하면 하세요 +\n3. 다운로드가 곧 시작 됩니다 (이 파일이 내보내기 파일 입니다) + SoundCloud 팔로잉 목록을 가져오려면 당신의 프로필 URL 및 ID를 알아야 합니다. 알고 있다면 아래에 있는 빈칸에 입력해 주세요. +\n +\n만약 모르신다면, 다음을 참고하세요: +\n +\n1. 모바일 환경이시면 브라우저 설정에서 데스크탑 모드를 활성화해주세요. Chrome 모바일에서는 오른쪽 ... 클릭시 아래쪽에 있습니다. +\n2. 이 주소로 가세요: %1$s +\n3. 로그인이 필요하면 하세요. +\n4. 리디렉트된 곳의 URL을 복사하세요. (이 URL이 당신의 프로필 URL 입니다) + 프로필ID, soundcloud.com/프로필ID + + 경고: 데이터 소모량이 늘어날 수 있습니다. +\n +\n진행하시겠습니까? + From b08728b64511ed3b3d7baa46389cbead3dd3a87a Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Mon, 12 Mar 2018 17:30:41 +0000 Subject: [PATCH 157/176] Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.8% (339 of 343 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 42 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 96e6ccb700b..ea22efa9505 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -385,4 +385,44 @@ abrir em modo popup Anexar automaticamente uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva Sincronizar - + Arquivo + + Diretório inválido + Origem do arquivo/conteúdo inválido + Arquivo não existe ou não há permissão para ler ou escrever nele + Nome do arquivo não pode ser vazio + Um erro ocorreu: %1$s + + Importar/Exportar + Importar + Importar de + Exportar para + + Importando… + Exportando… + + Importar arquivo + Exportação anteriore + + Importação de inscrições falhou + Exportação de inscrições falhou + + "Para importar inscrições do YouTube você vai precisar exportar o arquivo, o que pode ser baixado seguindo estas informações: +\n +\n1. Vá para este link: %1$s +\n2. Faça login na sua conta quando solicitado +\n3. O download deverá começar (isto é exportar arquivo)" + Para importar as contas que você segue no SoundCloud, você terá que saber o link ou id do seu perfil. Se você souber, basta escrever um deles no campo abaixo e estará tudo pronto. +\n +\nSe você não souber, você pode seguir estas etapas: +\n +\n1. Habilite \"modo desktop\" em algum navegador da internet ( o site não está disponível para dispositivos móveis) +\n2. Vá para esta url: %1$s +\n3. Faça login na sua conta quando solicitado +\n4. Copie o link no qual que você foi redirecionado (este é o link do seu perfil) + seuid, soundcloud.com/seuid + + Tenha em mente que esta operação poderá usar bastante a conexão com a internet. +\n +\nVocê deseja continuar? + From 24f2999669a8db7a92a69f1325836d160502ed90 Mon Sep 17 00:00:00 2001 From: alexandre patelli Date: Tue, 13 Mar 2018 22:57:59 +0100 Subject: [PATCH 158/176] Handling play/pause button from different headsets --- .../main/java/org/schabi/newpipe/player/BackgroundPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 3e9a6388677..06b62f46f82 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -591,7 +591,7 @@ public void onReceive(Context context, Intent intent) { pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_PLAY_NEXT), PendingIntent.FLAG_UPDATE_CURRENT); } else if (keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_PLAY_PREVIOUS), PendingIntent.FLAG_UPDATE_CURRENT); - } else if (keycode == KeyEvent.KEYCODE_HEADSETHOOK) { + } else if (keycode == KeyEvent.KEYCODE_HEADSETHOOK || keycode == KeyEvent.KEYCODE_MEDIA_PAUSE || keycode == KeyEvent.KEYCODE_MEDIA_PLAY) { pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT); } else if (keycode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { pendingIntent = PendingIntent.getBroadcast(context, NOTIFICATION_ID, new Intent(ACTION_FAST_FORWARD), PendingIntent.FLAG_UPDATE_CURRENT); From 7d047e612e2ff43bbead9c073ce1d9e4ae76b512 Mon Sep 17 00:00:00 2001 From: cozyplanes Date: Tue, 13 Mar 2018 11:24:50 +0000 Subject: [PATCH 159/176] Translated using Weblate (Korean) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-ko/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 60ee4e52342..eaa97a2a5c2 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -215,7 +215,7 @@ 이 권한은 팝업 모드에서 \n열기 위해 필요합니다 - reCAPTCHA + 로봇인지 확인 (reCAPTCHA) reCAPTCHA Challenge 요청됨 다운로드 From 1ac7b2b8cbd44c0ffa5546a2522fee9f368e3d72 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Tue, 13 Mar 2018 12:30:13 +0000 Subject: [PATCH 160/176] Translated using Weblate (Chinese (Traditional)) Currently translated at 98.2% (337 of 343 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a112b4830ba..f506d4949be 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -387,4 +387,23 @@ 在非重複播放佇列中的最後一個串流上開始播放時,自動附上相關串流。 同步 + 檔案 + + 無效的目錄 + 無效的檔案/內容來源 + 檔案名稱不能留空 + 發生錯誤:%1$s + + 匯入/匯出 + 匯入 + 匯入來自 + 匯出到 + + 正在匯入… + 正在匯出… + + 匯入檔案 + 訂閱匯入失敗 + 訂閱匯出失敗 + From 2dbfc28d696a8f82d284fa5f7685c30c8b19a6ca Mon Sep 17 00:00:00 2001 From: Edwar Tikhonov Date: Wed, 14 Mar 2018 15:34:30 +0000 Subject: [PATCH 161/176] Translated using Weblate (Russian) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-ru/strings.xml | 154 ++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 58fb004c7f0..44ab1f984b1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -58,7 +58,7 @@ Нажмите поиск, чтобы начать Подождите… Файл уже существует - Потоки + Темы OK Начать Пауза @@ -69,7 +69,7 @@ Ошибка Сервер не поддерживается NewPipe скачивает - Неправильный URL или Интернет не доступен + Неправильный URL или нет доступа к интернету Нажмите для деталей Скопировано в буфер обмена Выберите доступную папку для загрузки @@ -137,19 +137,19 @@ Обновить Очистить Использовать старый плеер - Жесты + Контроль жестов Всё Фильтр - Новая миссия + Новая цель Что:\\nЗапрос:\\nЯзык контента:\\nСервис:\\nВремя по Гринвичу:\\nПакет:\\nВерсия:\\nВерсия ОС:\\nГлобальный диапазон IP: Это разрешение нужно для -\nвоспроизведения видео в отдельном окне +\nвоспроизведения в окне reCAPTCHA Открыть в отдельном окне - Показывать подсказки во время поиска + Показывать подсказки в поиске Позже Отключено @@ -162,7 +162,7 @@  тыс. Разрешение в режиме всплывающего окна Запоминать последний размер и положение всплывающего окна - Живой поиск + Поисковые подсказки Лучшее разрешение Старый встроенный плеер на Mediaframework @@ -265,7 +265,7 @@ Выберите киоск Киоск - В тренде + Тренды Топ 50 Новое и горячее Добавлено в очередь в фоне @@ -275,22 +275,22 @@ Не удалось воспроизвести этот поток Подробности Настройки аудио - Пока нет подписок + Пока нет подписок на каналы Удалить Отписаться Подписка отменена - Подсказка о длинном нажатии - Отображать подсказку о длинном нажатии на кнопки \"В фоне\" и \"В окне\" для добавления в очередь + Показывать напоминание о длинном нажатии + Показывать подсказку при нажатии на иконку «В окне» или «В фоне» на странице сведений о видео [Неизвестно] Восстановление после ошибки проигрывателя - Воспроизведение в фоне - Воспроизведение в окне - Зажмите чтобы добавить в очередь - Добавить в очередь в фоне - Добавить в очередь в окне - Воспроизвести + В фоне + В окне + Зажмите, чтобы добавить в очередь + Добавить в очередь «В фоне» + Добавить в очередь «В окне» + Воспроизвести тут Воспроизвести в фоне Воспроизвести в окне Ни одного потокового проигрывателя не было найдено (вы можете установить VLC) @@ -326,5 +326,123 @@ Всегда спрашивать Получение информации… - Загрузка запрашиваемого контента + Загрузка запрошенного контента +Загрузка файла прямой трансляции. + Показать информацию + + Закладки + + Добавить к + + Использовать быстрый, но неточный поиск + Неточный поиск позволяет плееру искать позицию быстрее, но с пониженной точностью + Автоматическая очередь следующего стрима + Автоматически добавлять связанные потоки, когда воспроизведение начинается с последнего потока в неповторяющейся очереди воспроизведения. + Отладка + Файл + + Импорт данных + Экспорт данных + Ваша текущая история и подписки будут перезаписаны + Экспорт истории, подписок и плейлистов. + Неправильная директория + Неправильный файл/контент источника + Файл не существует или нет разрешения на его прочтение или запись + Имя файла не может быть пустым + Произошла ошибка: %1$s + + Перетащите, чтобы изменить порядок + + Создать + Удалить одно + Удалить всё + Отклонить + Переименовать + + Вы хотите удалить этот элемент из истории поиска? + Вы уверены, что хотите удалить все элементы из истории? + Последнее проигрывание + Наиболее проигрываемые + + Экспорт завершён + Импорт завершён + Нет верного Zip файла + Предупреждение: нет возможности импорта всех файлов. + Это перезапишет вашу текущую установку. + + Что-то будет тут, скоро ;D + + + Всегда спрашивать + + Создать новый плейлист + Удалить плейлист + Переименовать плейлист + Имя + Добавить в плейлист + Установить как иконку плейлиста + + Пометить плейлист + Удалить пометку + + Вы хотите удалить этот плейлист? + Плейлист успешно создан + Добавлено в плейлист + Иконка плейлиста изменена + Ошибка при удалении плейлиста + + Без подписи + + Уместить + Заполнить + Приближение + + Автоматически созданный + Размер шрифта подписи + Маленький шрифт + Обычный шрифт + Большой шрифт + + Синхронизировать + + Включить LeakCanary + Мониторинг утечки памяти может привести к зависанию приложения + + Ошибки отчёта вне очереди + Форсировать отчетность о недопустимых исключениях Rx, возникающих за пределами фрагмента или цикла деятельности, после размещения + + Импорт/Экспорт + Импорт + Импорт из + Экспорт в + + Импорт… + Экспорт… + + Импорт файла + Предыдущий экспорт + + Импорт подписок провален + Экспорт подписок провален + + Для импорта подписок из YouTube вам необходимо файл экспорта, которые можно загрузить в соответствии с этими инструкциями: +\n +\n1. Перейдите на: %1$s +\n2. Войдите в ваш аккаунт, если необходимо +\n3. Загрузка должна начаться (это файл экспорта) + "Для импорта ваших подписок из SoundCloud вы должны знать ссылку на ваш профиль или id. Если вы знаете, просто напишите это в поле ниже и будьте готовы начинать. +\n +\nЕсли вы не знаете, то проследуйте следующей инструкции: +\n +\n1. Включите \"режим рабочего стола\" в браузере (сайт недоступен на телефоне) +\n2. Пройдите на: %1$s +\n3. Войдите в аккаунт, если надо +\n4. Скопируйте адрес из адресной строки (это адрес вашего профиля) +\n +\n" + вашid, soundcloud.com/вашid + + Помните, что за выход в интернет может взиматься плата. +\n +\nВы хотите продолжить? From e49c4162e562703a4c4f670050bab0daea98d88e Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Wed, 14 Mar 2018 13:37:29 +0000 Subject: [PATCH 162/176] Translated using Weblate (Chinese (Traditional)) Currently translated at 98.5% (338 of 343 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f506d4949be..6f7ffcd2684 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -406,4 +406,6 @@ 訂閱匯入失敗 訂閱匯出失敗 + 之前的匯出 + From d63c0a32ebffda5adf858a2a6fe4eba348d370c3 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Thu, 15 Mar 2018 14:19:45 +0000 Subject: [PATCH 163/176] Translated using Weblate (Hebrew) Currently translated at 75.8% (260 of 343 strings) --- app/src/main/res/values-he/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index cb69d663966..8cb0e45715b 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -308,4 +308,8 @@ יצוא מסד נתונים נגנים חיצוניים לא תומכים בסוגי קישורים אלה כתובת שגויה + קובץ + + העברה לרקע + העברה לחלון צץ From 65726d75ccd4849ffd9dec9d81a6cb729d978177 Mon Sep 17 00:00:00 2001 From: Edwar Tikhonov Date: Wed, 14 Mar 2018 15:35:45 +0000 Subject: [PATCH 164/176] Translated using Weblate (Russian) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 44ab1f984b1..cd27377238d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -169,7 +169,7 @@ Запрос reCAPTCHA Запрошен ввод reCAPTCHA - Показывать более высокие разрешения + Показывать более высокое разрешение NewPipe в окне О NewPipe Настройки From 2d1bc6436a74433bcdf8305637dd2d00767e0b5c Mon Sep 17 00:00:00 2001 From: Olexandr Nesterenko Date: Wed, 14 Mar 2018 17:19:04 +0000 Subject: [PATCH 165/176] Translated using Weblate (Ukrainian) Currently translated at 98.8% (339 of 343 strings) --- app/src/main/res/values-uk/strings.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0608d81506f..fa06ebd87b3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -392,4 +392,26 @@ Автоматично додавати пов\'язаний стрим, під час початку програвання останнього стриму. СИНХРОНІЗАЦІЯ + Файл + + Неправильна тека + Неправильний файл/контент джерела + Файл не існує, або немає дозволу на його запис чи читання + Ім\'я файлу не повинно бути порожнім + Трапилась помилка: %1$s + + Імпорт/Експорт + Імпорт + Імпорт з + Експорт до + + Імпортування… + Експортування… + + Імпорт файлу + Попередній експорт + + Не вдалось імпортувати підписки + Не вдалося експортувати підписки + From 37ff4e9aeb1e115af708fea3a0aea3cd4dff885c Mon Sep 17 00:00:00 2001 From: E T Date: Fri, 16 Mar 2018 11:20:59 +0000 Subject: [PATCH 166/176] Translated using Weblate (Turkish) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-tr/strings.xml | 42 +++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9fbb42e0be0..a6e3c7a1bc4 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -401,4 +401,44 @@ Yinelemeyen oynatma kuyruğundaki son akış başladığında ilişkili akışı kuyruğun sonuna kendiliğinden ekle. EŞZAMANLA - + Dosya + + Geçersiz dizin + Geçersiz dosya/içerik kaynağı + Dosya yok ya da okuma veya yazma izni yetersiz + Dosya adı boş olamaz + Hata oluştu: %1$s + + İçe/Dışa Aktar + İçe Aktar + Şuradan içe aktar + Şuna dışa aktar + + İçe aktarılıyor… + Dışa aktarılıyor… + + Dosyayı içe aktar + Önceki dışa aktarım + + Aboneliklerin içe aktarımı başarısız + Aboneliklerin dışa aktarımı başarısız + + YouTube aboneliklerinizi içe aktarmak için dışa aktarılmış dosya gerekiyor, dosya şu yönergeler izlenerek indirilebilir: +\n +\n1. Şu adrese gidin: %1$s +\n2. Sorulduğunda hesabınıza giriş yapın +\n3. İndirme başlamalı (bu dışa aktarılmış dosyadır) + SoundCloud takiplerinizi içe aktarmak için profil adresinizi veya kimliğinizi bilmelisiniz. Eğer biliyorsanız, ikisinden birini aşağıdaki giriye yazın ve işte hazırsınız. +\n +\nEğer bilmiyorsanız şu adımları izleyebilirsiniz: +\n +\n1. Herhangi bir tarayıcıda \"masaüstü kipi\"ni açın (site, mobil aygıtlar için uygun değildir) +\n2. Şu adrese gidin: %1$s +\n3. Sorulduğunda hesabınıza giriş yapın +\n4. Yönlendirildiğiniz adresi kopyalayın (bu sizin profil adresinizdir) + kimliginiz, soundcloud.com/kimliginiz + + Bu sürecin ağ masrafına nedenn olabileceğini unutmayın. +\n +\nDevam etmek istiyor musunuz? + From 579efa15c74652c490686707cd5e1f709f889d99 Mon Sep 17 00:00:00 2001 From: E T Date: Fri, 16 Mar 2018 11:21:22 +0000 Subject: [PATCH 167/176] Translated using Weblate (Turkish) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-tr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a6e3c7a1bc4..736bb12ae4a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -438,7 +438,7 @@ \n4. Yönlendirildiğiniz adresi kopyalayın (bu sizin profil adresinizdir) kimliginiz, soundcloud.com/kimliginiz - Bu sürecin ağ masrafına nedenn olabileceğini unutmayın. + Bu sürecin ağ masrafına neden olabileceğini unutmayın. \n \nDevam etmek istiyor musunuz? From c092fc8e18f00997889f08d596c4ceeabf6ae31b Mon Sep 17 00:00:00 2001 From: AB Date: Sat, 17 Mar 2018 12:40:26 +0000 Subject: [PATCH 168/176] Translated using Weblate (Ukrainian) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-uk/strings.xml | 35 ++++++++++++++++++++------ 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fa06ebd87b3..ce1b835e558 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -384,7 +384,7 @@ Під час роботи LeakCanary застосунок може стати несприйнятливим під час гіп-дампінґу Зазвітувати Out-of-Lifecycle хиби - Примусове звітування про неможливість доставлення Rx винятків, яку відбуваються за межами фраґменту, або діяльності життєвого циклу після усунення + Примусове звітування про неможливість доставлення Rx винятків, які відбуваються за межами фраґменту або діяльності життєвого циклу після усунення Використовувати неточне шукання Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю @@ -400,18 +400,37 @@ Ім\'я файлу не повинно бути порожнім Трапилась помилка: %1$s - Імпорт/Експорт - Імпорт - Імпорт з - Експорт до + Імпортування/Експортування + Імпортування + Імпортувати з + Експортувати до Імпортування… Експортування… - Імпорт файлу - Попередній експорт + Імпортування файлу + Попереднє експортування Не вдалось імпортувати підписки Не вдалося експортувати підписки - + Аби імпортувати ваші підписання Ютюб, вам буде потрібно експортувати файл, який можна буде завантажити наступним чином: +\n +\n1. Перейдіть за цією ланкою: %1$s +\n2. За запитом увійдіть до вашої обліківки +\n3. Завантаження має початися (експортований файл) + Для імпортування ваших підписок з SoundCloud, ви маєте знати url вашого профайлу або ID. Якщо ви знаєте їх, упишіть їх нижче та можна працювати. +\n +\nЯкщо ви не маєте їх, зробіть наступним чином: +\n +\n1. Увімкніть режимі \"desktop\" у будь-якому з переглядачів (сайт не має підтримки мобільних ґаджетів) +\n +\n2. Перейдіть за цією ланкою: %1$s +\n3. За запитом увійдіть до вашої обліківки +\n4. Скопіюйте url, до якого вас відішле (це й є url вашого профайлу) + yourid, soundcloud.com/yourid + + Майте на увазі: ця операція може потребувати багато трафіку. +\n +\nПродовжуватимете? + From 80593e774c059605478d4617de894f09cc3d5dc6 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Sat, 17 Mar 2018 12:19:31 +0000 Subject: [PATCH 169/176] Translated using Weblate (Chinese (Traditional)) Currently translated at 99.7% (342 of 343 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6f7ffcd2684..c32a6f27220 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -408,4 +408,15 @@ 之前的匯出 - + 檔案不存在或沒有足夠的權限讀取或寫入 + 要匯入您的 YouTube 訂閱,您必須匯出檔案,可以按照以下說明進行下載: +\n +\n1. 轉到此網址:%1$s +\n2. 當被詢問時登入您的帳戶 +\n3. 下載應該開始 ( 這就是匯出的檔案 ) + yourid, soundcloud.com/yourid + + 請記住,此操作可能會造成網路昂貴花費。 +\n +\n您想繼續嗎? + From 1910e81ad945e29b3225b7d9869d008fb9dca668 Mon Sep 17 00:00:00 2001 From: AB Date: Sat, 17 Mar 2018 12:47:36 +0000 Subject: [PATCH 170/176] Translated using Weblate (Ukrainian) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-uk/strings.xml | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ce1b835e558..a032ec33951 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -126,9 +126,9 @@ Будь ласка, оберіть теку для завантаження Потоковий програвач не знайдено (ви можете встановити VLC для відтворення) - Відкрити у виринальному режимі + Відкрити у віконному режимі Певні роздільності НЕ МАТИМУТЬ звуку якщо цей параметр увімкнено - NewPipe у виринальному вікні + NewPipe у віконному режимі Підписатися Ви підписалися Ви відписалися від каналу @@ -141,14 +141,14 @@ Новинки Тло - Виринальне вікно + У вікні - Типова роздільна здатність виринального вікна + Типова роздільна здатність вікна Не всі пристрої підтримують програвання 2K/4K відео Показувати більші роздільні здатності Типовий відео формат - Пам\'ятати розмір виринального вікна та положення - Пам\'ятати останній розмір та позицію виринального вікна + Пам\'ятати розмір та положення вікна + Пам\'ятати останній розмір та позицію вікна Керування жестами Використовувати жести для контролю яскравості та гучності програвача Шукати схожі @@ -165,10 +165,10 @@ Програвач Поведінка Історія - Виринальне вікно - Відворення у виринальному вікні + Вікно + Відворення у вікні Додано до фонового програвання - Додано до чергу у виринальному вікні + Додано до чергу у вікно Плейлист Фільтрувати Оновити @@ -181,12 +181,12 @@ Тільки тепер NewPipe сповіщення - Сповіщення для фонового та виринального програвача NewPipe + Сповіщення для фонового та віконного програвачів NewPipe [Невідомо] Перемкнутися до Тла - Перемкнутися до Виринального вікна + Перемкнутися до вікна Перемкнутися до Головної Імпортувати базу @@ -204,7 +204,7 @@ Без відео Помилкова ланка URL або інтернет не є доступним Цей дозвіл має бути відкритим -\nу виринальному вікні +\nу вікні «reCAPTCHA» Завантажити @@ -248,7 +248,7 @@ Додати до - Показувати підказку коли фонова чи виринальна кнопка натиснута на сторінці відео деталей + Показувати підказку коли натиснута кнопка фону або вікна, на сторінці інформації відео Перемкнути орієнтацію Фатальна помилка програвача Зовнішні програвачі не підтримують такі види ланок @@ -335,14 +335,14 @@ Ятка Набуває популярності Фоновий програвач - Виринальний програвач + Віконний програвач Усунути Затиснути, аби зняти з черги Зняти з черги у фоновому програвачеві - Зняти з черги у виринальному програвачеві + Зняти з черги у віконному програвачеві Розпочати програвання звідси Розпочати програвання звідси у фоновому програвачеві - Розпочати програвання звідси у виринальному програвачеві + Розпочати програвання у вікні звідси Відчинити шухляду Зачинити шухляду From 96a327af178d5bef5928caae63580a6e9029af64 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 18 Mar 2018 16:37:49 +0100 Subject: [PATCH 171/176] made frontend combatible to latest extractor refactorings --- app/build.gradle | 2 +- .../database/stream/model/StreamEntity.java | 8 ++-- .../newpipe/download/DownloadDialog.java | 2 +- .../fragments/detail/VideoDetailFragment.java | 11 +++-- .../fragments/list/BaseListInfoFragment.java | 20 ++++---- .../list/channel/ChannelFragment.java | 48 +++++++++---------- .../fragments/list/feed/FeedFragment.java | 6 +-- .../fragments/list/kiosk/KioskFragment.java | 4 +- .../list/playlist/PlaylistFragment.java | 18 +++++-- .../fragments/list/search/SearchFragment.java | 15 +++--- .../subscription/SubscriptionFragment.java | 8 +--- .../newpipe/info_list/InfoItemBuilder.java | 2 +- .../newpipe/info_list/InfoListAdapter.java | 2 +- .../holder/ChannelInfoItemHolder.java | 7 +-- .../holder/ChannelMiniInfoItemHolder.java | 18 +++---- .../holder/PlaylistMiniInfoItemHolder.java | 2 +- .../holder/StreamInfoItemHolder.java | 10 ++-- .../holder/StreamMiniInfoItemHolder.java | 20 ++++---- .../newpipe/player/BackgroundPlayer.java | 6 +-- .../org/schabi/newpipe/player/BasePlayer.java | 4 +- .../newpipe/player/ServicePlayerActivity.java | 2 +- .../schabi/newpipe/player/VideoPlayer.java | 6 +-- .../player/playback/MediaSourceManager.java | 6 +-- .../playlist/AbstractInfoPlayQueue.java | 22 ++++----- .../newpipe/playlist/ChannelPlayQueue.java | 5 +- .../newpipe/playlist/PlaylistPlayQueue.java | 5 +- .../schabi/newpipe/util/ExtractorHelper.java | 12 ++--- 27 files changed, 141 insertions(+), 130 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 88fe38183bc..9fa911e54cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:fce324d1bc74bc' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:f787b375e5fb6d' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:1.10.19' diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.java b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.java index 2fddaa1bbb2..0a9a0bb66e2 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.java @@ -71,14 +71,14 @@ public StreamEntity(final int serviceId, final String title, final String url, @Ignore public StreamEntity(final StreamInfoItem item) { - this(item.service_id, item.name, item.url, item.stream_type, item.thumbnail_url, - item.uploader_name, item.duration); + this(item.getServiceId(), item.getName(), item.getUrl(), item.getStreamType(), item.getThumbnailUrl(), + item.getUploaderName(), item.getDuration()); } @Ignore public StreamEntity(final StreamInfo info) { - this(info.service_id, info.name, info.url, info.stream_type, info.thumbnail_url, - info.uploader_name, info.duration); + this(info.getServiceId(), info.getName(), info.getUrl(), info.getStreamType(), info.getThumbnailUrl(), + info.getUploaderName(), info.getDuration()); } @Ignore diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index b217b91b316..9bcd0bcb797 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -205,7 +205,7 @@ public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { if (DEBUG) Log.d(TAG, "onCheckedChanged() called with: group = [" + group + "], checkedId = [" + checkedId + "]"); switch (checkedId) { case R.id.audio_button: - setupAudioSpinner(currentInfo.audio_streams, streamsSpinner); + setupAudioSpinner(currentInfo.getAudioStreams(), streamsSpinner); break; case R.id.video_button: setupVideoSpinner(sortedStreamVideosList, streamsSpinner); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 4d935dbceb6..b3ca5f47f3c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -383,7 +383,8 @@ public void onClick(View v) { } break; case R.id.detail_thumbnail_root_layout: - if (currentInfo.video_streams.isEmpty() && currentInfo.video_only_streams.isEmpty()) { + if (currentInfo.getVideoStreams().isEmpty() + && currentInfo.getVideoOnlyStreams().isEmpty()) { openBackgroundPlayer(false); } else { openVideoPlayer(); @@ -618,7 +619,8 @@ private void initRelatedVideos(StreamInfo info) { relatedStreamRootLayout.setVisibility(View.VISIBLE); } else nextStreamTitle.setVisibility(View.GONE); - if (info.related_streams != null && !info.related_streams.isEmpty() && showRelatedStreams) { + if (info.getRelatedStreams() != null + && !info.getRelatedStreams().isEmpty() && showRelatedStreams) { //long first = System.nanoTime(), each; int to = info.getRelatedStreams().size() >= INITIAL_RELATED_VIDEOS ? INITIAL_RELATED_VIDEOS @@ -683,7 +685,7 @@ public boolean onOptionsItemSelected(MenuItem item) { switch (id) { case R.id.menu_item_share: { if(currentInfo != null) { - shareUrl(currentInfo.name, url); + shareUrl(currentInfo.getName(), url); } else { shareUrl(url, url); } @@ -1210,7 +1212,8 @@ public void handleResult(@NonNull StreamInfo info) { spinnerToolbar.setVisibility(View.GONE); break; default: - if (!info.video_streams.isEmpty() || !info.video_only_streams.isEmpty()) break; + if (!info.getVideoStreams().isEmpty() + || !info.getVideoOnlyStreams().isEmpty()) break; detailControlsBackground.setVisibility(View.GONE); detailControlsPopup.setVisibility(View.GONE); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index 34f19003254..a132213bf56 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -20,7 +20,7 @@ import io.reactivex.schedulers.Schedulers; public abstract class BaseListInfoFragment - extends BaseListFragment { + extends BaseListFragment { @State protected int serviceId = Constants.NO_SERVICE_ID; @@ -117,7 +117,7 @@ public void startLoading(boolean forceLoad) { .subscribe((@NonNull I result) -> { isLoading.set(false); currentInfo = result; - currentNextPageUrl = result.next_streams_url; + currentNextPageUrl = result.getNextPageUrl(); handleResult(result); }, (@NonNull Throwable throwable) -> onError(throwable)); } @@ -126,7 +126,7 @@ public void startLoading(boolean forceLoad) { * Implement the logic to load more items
* You can use the default implementations from {@link org.schabi.newpipe.util.ExtractorHelper} */ - protected abstract Single loadMoreItemsLogic(); + protected abstract Single loadMoreItemsLogic(); protected void loadMoreItems() { isLoading.set(true); @@ -135,9 +135,9 @@ protected void loadMoreItems() { currentWorker = loadMoreItemsLogic() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe((@io.reactivex.annotations.NonNull ListExtractor.InfoItemPage InfoItemPage) -> { + .subscribe((@io.reactivex.annotations.NonNull ListExtractor.InfoItemsPage InfoItemsPage) -> { isLoading.set(false); - handleNextItems(InfoItemPage); + handleNextItems(InfoItemsPage); }, (@io.reactivex.annotations.NonNull Throwable throwable) -> { isLoading.set(false); onError(throwable); @@ -145,10 +145,10 @@ protected void loadMoreItems() { } @Override - public void handleNextItems(ListExtractor.InfoItemPage result) { + public void handleNextItems(ListExtractor.InfoItemsPage result) { super.handleNextItems(result); - currentNextPageUrl = result.nextPageUrl; - infoListAdapter.addInfoItemList(result.infoItemList); + currentNextPageUrl = result.getNextPageUrl(); + infoListAdapter.addInfoItemList(result.getItems()); showListFooter(hasMoreItems()); } @@ -171,8 +171,8 @@ public void handleResult(@NonNull I result) { setTitle(name); if (infoListAdapter.getItemsList().size() == 0) { - if (result.related_streams.size() > 0) { - infoListAdapter.addInfoItemList(result.related_streams); + if (result.getRelatedItems().size() > 0) { + infoListAdapter.addInfoItemList(result.getRelatedItems()); showListFooter(hasMoreItems()); } else { infoListAdapter.clearStreamItemList(); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 3261e6dad3a..7783d8a98dd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -27,10 +27,13 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.database.subscription.SubscriptionEntity; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.stream.Stream; +import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemDialog; @@ -44,6 +47,7 @@ import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -388,7 +392,7 @@ private void updateSubscribeButton(boolean isSubscribed) { //////////////////////////////////////////////////////////////////////////*/ @Override - protected Single loadMoreItemsLogic() { + protected Single loadMoreItemsLogic() { return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPageUrl); } @@ -415,8 +419,8 @@ public void handleResult(@NonNull ChannelInfo result) { super.handleResult(result); headerRootLayout.setVisibility(View.VISIBLE); - imageLoader.displayImage(result.banner_url, headerChannelBanner, DISPLAY_BANNER_OPTIONS); - imageLoader.displayImage(result.avatar_url, headerAvatarView, DISPLAY_AVATAR_OPTIONS); + imageLoader.displayImage(result.getBannerUrl(), headerChannelBanner, DISPLAY_BANNER_OPTIONS); + imageLoader.displayImage(result.getAvatarUrl(), headerAvatarView, DISPLAY_AVATAR_OPTIONS); if (result.getSubscriberCount() != -1) { headerSubscribersTextView.setText(Localization.localizeSubscribersCount(activity, result.getSubscriberCount())); @@ -427,8 +431,8 @@ public void handleResult(@NonNull ChannelInfo result) { playlistCtrl.setVisibility(View.VISIBLE); - if (!result.errors.isEmpty()) { - showSnackBarError(result.errors, UserAction.REQUESTED_CHANNEL, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); + if (!result.getErrors().isEmpty()) { + showSnackBarError(result.getErrors(), UserAction.REQUESTED_CHANNEL, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); } if (disposables != null) disposables.clear(); @@ -436,24 +440,12 @@ public void handleResult(@NonNull ChannelInfo result) { updateSubscription(result); monitorSubscription(result); - headerPlayAllButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - NavigationHelper.playOnMainPlayer(activity, getPlayQueue()); - } - }); - headerPopupButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - NavigationHelper.playOnPopupPlayer(activity, getPlayQueue()); - } - }); - headerBackgroundButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue()); - } - }); + headerPlayAllButton.setOnClickListener( + view -> NavigationHelper.playOnMainPlayer(activity, getPlayQueue())); + headerPopupButton.setOnClickListener( + view -> NavigationHelper.playOnPopupPlayer(activity, getPlayQueue())); + headerBackgroundButton.setOnClickListener( + view -> NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue())); } private PlayQueue getPlayQueue() { @@ -461,17 +453,23 @@ private PlayQueue getPlayQueue() { } private PlayQueue getPlayQueue(final int index) { + final List streamItems = new ArrayList<>(); + for(InfoItem i : infoListAdapter.getItemsList()) { + if(i instanceof StreamInfoItem) { + streamItems.add((StreamInfoItem) i); + } + } return new ChannelPlayQueue( currentInfo.getServiceId(), currentInfo.getUrl(), currentInfo.getNextPageUrl(), - infoListAdapter.getItemsList(), + streamItems, index ); } @Override - public void handleNextItems(ListExtractor.InfoItemPage result) { + public void handleNextItems(ListExtractor.InfoItemsPage result) { super.handleNextItems(result); if (!result.getErrors().isEmpty()) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java index 57841cb8718..dabfd9e1b27 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java @@ -297,12 +297,12 @@ public void onSubscribe(Disposable d) { // Called only when response is non-empty @Override public void onSuccess(final ChannelInfo channelInfo) { - if (infoListAdapter == null || channelInfo.getRelatedStreams().isEmpty()) { + if (infoListAdapter == null || channelInfo.getRelatedItems().isEmpty()) { onDone(); return; } - final InfoItem item = channelInfo.getRelatedStreams().get(0); + final InfoItem item = channelInfo.getRelatedItems().get(0); // Keep requesting new items if the current one already exists boolean itemExists = doesItemExist(infoListAdapter.getItemsList(), item); if (!itemExists) { @@ -411,7 +411,7 @@ private void disposeEverything() { private boolean doesItemExist(final List items, final InfoItem item) { for (final InfoItem existingItem : items) { - if (existingItem.info_type == item.info_type && + if (existingItem.getInfoType() == item.getInfoType() && existingItem.getServiceId() == item.getServiceId() && existingItem.getName().equals(item.getName()) && existingItem.getUrl().equals(item.getUrl())) return true; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 976bcced255..482f71cb426 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -141,7 +141,7 @@ public Single loadResult(boolean forceReload) { } @Override - public Single loadMoreItemsLogic() { + public Single loadMoreItemsLogic() { String contentCountry = PreferenceManager .getDefaultSharedPreferences(activity) .getString(getString(R.string.content_country_key), @@ -174,7 +174,7 @@ public void handleResult(@NonNull final KioskInfo result) { } @Override - public void handleNextItems(ListExtractor.InfoItemPage result) { + public void handleNextItems(ListExtractor.InfoItemsPage result) { super.handleNextItems(result); if (!result.getErrors().isEmpty()) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 324d3d7efb1..9033560bdb8 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -22,10 +22,12 @@ import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; 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.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.fragments.local.RemotePlaylistManager; @@ -38,6 +40,7 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -206,7 +209,7 @@ public void onDestroy() { //////////////////////////////////////////////////////////////////////////*/ @Override - protected Single loadMoreItemsLogic() { + protected Single loadMoreItemsLogic() { return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPageUrl); } @@ -269,7 +272,8 @@ public void handleResult(@NonNull final PlaylistInfo result) { playlistCtrl.setVisibility(View.VISIBLE); imageLoader.displayImage(result.getUploaderAvatarUrl(), headerUploaderAvatar, DISPLAY_AVATAR_OPTIONS); - headerStreamCount.setText(getResources().getQuantityString(R.plurals.videos, (int) result.stream_count, (int) result.stream_count)); + headerStreamCount.setText(getResources().getQuantityString(R.plurals.videos, + (int) result.getStreamCount(), (int) result.getStreamCount())); if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); @@ -297,17 +301,23 @@ private PlayQueue getPlayQueue() { } private PlayQueue getPlayQueue(final int index) { + final List infoItems = new ArrayList<>(); + for(InfoItem i : infoListAdapter.getItemsList()) { + if(i instanceof StreamInfoItem) { + infoItems.add((StreamInfoItem) i); + } + } return new PlaylistPlayQueue( currentInfo.getServiceId(), currentInfo.getUrl(), currentInfo.getNextPageUrl(), - infoListAdapter.getItemsList(), + infoItems, index ); } @Override - public void handleNextItems(ListExtractor.InfoItemPage result) { + public void handleNextItems(ListExtractor.InfoItemsPage result) { super.handleNextItems(result); if (!result.getErrors().isEmpty()) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 1ad31d06c5f..f7831e02d30 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -71,7 +71,9 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; -public class SearchFragment extends BaseListFragment implements BackPressable { +public class SearchFragment + extends BaseListFragment + implements BackPressable { /*////////////////////////////////////////////////////////////////////////// // Search @@ -759,12 +761,7 @@ private void setQuery(int serviceId, String searchQuery) { public void handleSuggestions(@NonNull final List suggestions) { if (DEBUG) Log.d(TAG, "handleSuggestions() called with: suggestions = [" + suggestions + "]"); suggestionsRecyclerView.smoothScrollToPosition(0); - suggestionsRecyclerView.post(new Runnable() { - @Override - public void run() { - suggestionListAdapter.setItems(suggestions); - } - }); + suggestionsRecyclerView.post(() -> suggestionListAdapter.setItems(suggestions)); if (errorPanelRoot.getVisibility() == View.VISIBLE) { hideLoading(); @@ -822,10 +819,10 @@ public void handleResult(@NonNull SearchResult result) { } @Override - public void handleNextItems(ListExtractor.InfoItemPage result) { + public void handleNextItems(ListExtractor.InfoItemsPage result) { showListFooter(false); currentPage = Integer.parseInt(result.getNextPageUrl()); - infoListAdapter.addInfoItemList(result.getNextItemsList()); + infoListAdapter.addInfoItemList(result.getItems()); if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.SEARCHED, NewPipe.getNameOfService(serviceId) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java index 1e69732b720..a0124f5700d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java @@ -401,12 +401,8 @@ private List getSubscriptionItems(List subscriptio List items = new ArrayList<>(); for (final SubscriptionEntity subscription : subscriptions) items.add(subscription.toChannelInfoItem()); - Collections.sort(items, new Comparator() { - @Override - public int compare(InfoItem o1, InfoItem o2) { - return o1.name.compareToIgnoreCase(o2.name); - } - }); + Collections.sort(items, + (InfoItem o1, InfoItem o2) -> o1.getName().compareToIgnoreCase(o2.getName())); return items; } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index 2188959832b..78867c81f06 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -60,7 +60,7 @@ public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoIte } public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem, boolean useMiniVariant) { - InfoItemHolder holder = holderFromInfoType(parent, infoItem.info_type, useMiniVariant); + InfoItemHolder holder = holderFromInfoType(parent, infoItem.getInfoType(), useMiniVariant); holder.updateFromItem(infoItem); return holder.itemView; } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index 4b9914397df..9b340548467 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -203,7 +203,7 @@ public int getItemViewType(int position) { return FOOTER_TYPE; } final InfoItem item = infoItemList.get(position); - switch (item.info_type) { + switch (item.getInfoType()) { case STREAM: return useMiniVariant ? MINI_STREAM_HOLDER_TYPE : STREAM_HOLDER_TYPE; case CHANNEL: diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java index 15c9c46e079..1e5c726a4a5 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java @@ -44,15 +44,16 @@ public void updateFromItem(final InfoItem infoItem) { if (!(infoItem instanceof ChannelInfoItem)) return; final ChannelInfoItem item = (ChannelInfoItem) infoItem; - itemChannelDescriptionView.setText(item.description); + itemChannelDescriptionView.setText(item.getDescription()); } @Override protected String getDetailLine(final ChannelInfoItem item) { String details = super.getDetailLine(item); - if (item.stream_count >= 0) { - String formattedVideoAmount = Localization.localizeStreamCount(itemBuilder.getContext(), item.stream_count); + if (item.getStreamCount() >= 0) { + String formattedVideoAmount = Localization.localizeStreamCount(itemBuilder.getContext(), + item.getStreamCount()); if (!details.isEmpty()) { details += " • " + formattedVideoAmount; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java index 48fb185179c..211fa60cd48 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java @@ -40,22 +40,22 @@ public void updateFromItem(final InfoItem infoItem) { itemAdditionalDetailView.setText(getDetailLine(item)); itemBuilder.getImageLoader() - .displayImage(item.thumbnail_url, itemThumbnailView, ChannelInfoItemHolder.DISPLAY_THUMBNAIL_OPTIONS); + .displayImage(item.getThumbnailUrl(), + itemThumbnailView, + ChannelInfoItemHolder.DISPLAY_THUMBNAIL_OPTIONS); - itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (itemBuilder.getOnChannelSelectedListener() != null) { - itemBuilder.getOnChannelSelectedListener().selected(item); - } + itemView.setOnClickListener(view -> { + if (itemBuilder.getOnChannelSelectedListener() != null) { + itemBuilder.getOnChannelSelectedListener().selected(item); } }); } protected String getDetailLine(final ChannelInfoItem item) { String details = ""; - if (item.subscriber_count >= 0) { - details += Localization.shortSubscriberCount(itemBuilder.getContext(), item.subscriber_count); + if (item.getSubscriberCount() >= 0) { + details += Localization.shortSubscriberCount(itemBuilder.getContext(), + item.getSubscriberCount()); } return details; } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java index 50b551c6135..30d84e1bd17 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java @@ -40,7 +40,7 @@ public void updateFromItem(final InfoItem infoItem) { itemUploaderView.setText(item.getUploaderName()); itemBuilder.getImageLoader() - .displayImage(item.thumbnail_url, itemThumbnailView, DISPLAY_THUMBNAIL_OPTIONS); + .displayImage(item.getThumbnailUrl(), itemThumbnailView, DISPLAY_THUMBNAIL_OPTIONS); itemView.setOnClickListener(view -> { if (itemBuilder.getOnPlaylistSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java index 78954a2ee68..0a77054276a 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java @@ -51,14 +51,14 @@ public void updateFromItem(final InfoItem infoItem) { private String getStreamInfoDetailLine(final StreamInfoItem infoItem) { String viewsAndDate = ""; - if (infoItem.view_count >= 0) { - viewsAndDate = Localization.shortViewCount(itemBuilder.getContext(), infoItem.view_count); + if (infoItem.getViewCount() >= 0) { + viewsAndDate = Localization.shortViewCount(itemBuilder.getContext(), infoItem.getViewCount()); } - if (!TextUtils.isEmpty(infoItem.upload_date)) { + if (!TextUtils.isEmpty(infoItem.getUploadDate())) { if (viewsAndDate.isEmpty()) { - viewsAndDate = infoItem.upload_date; + viewsAndDate = infoItem.getUploadDate(); } else { - viewsAndDate += " • " + infoItem.upload_date; + viewsAndDate += " • " + infoItem.getUploadDate(); } } return viewsAndDate; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index 594a8558230..72c2830e14b 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -41,15 +41,17 @@ public void updateFromItem(final InfoItem infoItem) { final StreamInfoItem item = (StreamInfoItem) infoItem; itemVideoTitleView.setText(item.getName()); - itemUploaderView.setText(item.uploader_name); + itemUploaderView.setText(item.getUploaderName()); - if (item.duration > 0) { - itemDurationView.setText(Localization.getDurationString(item.duration)); - itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), R.color.duration_background_color)); + if (item.getDuration() > 0) { + itemDurationView.setText(Localization.getDurationString(item.getDuration())); + itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), + R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - } else if (item.stream_type == StreamType.LIVE_STREAM) { + } else if (item.getStreamType() == StreamType.LIVE_STREAM) { itemDurationView.setText(R.string.duration_live); - itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), R.color.live_duration_background_color)); + itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), + R.color.live_duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); } else { itemDurationView.setVisibility(View.GONE); @@ -57,7 +59,9 @@ public void updateFromItem(final InfoItem infoItem) { // Default thumbnail is shown on error, while loading and if the url is empty itemBuilder.getImageLoader() - .displayImage(item.thumbnail_url, itemThumbnailView, StreamInfoItemHolder.DISPLAY_THUMBNAIL_OPTIONS); + .displayImage(item.getThumbnailUrl(), + itemThumbnailView, + StreamInfoItemHolder.DISPLAY_THUMBNAIL_OPTIONS); itemView.setOnClickListener(view -> { if (itemBuilder.getOnStreamSelectedListener() != null) { @@ -65,7 +69,7 @@ public void updateFromItem(final InfoItem infoItem) { } }); - switch (item.stream_type) { + switch (item.getStreamType()) { case AUDIO_STREAM: case VIDEO_STREAM: case LIVE_STREAM: diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java index 06b62f46f82..61720c6b409 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java @@ -407,10 +407,10 @@ public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { final MediaSource liveSource = super.sourceOf(item, info); if (liveSource != null) return liveSource; - final int index = ListHelper.getDefaultAudioFormat(context, info.audio_streams); - if (index < 0 || index >= info.audio_streams.size()) return null; + final int index = ListHelper.getDefaultAudioFormat(context, info.getAudioStreams()); + if (index < 0 || index >= info.getAudioStreams().size()) return null; - final AudioStream audio = info.audio_streams.get(index); + final AudioStream audio = info.getAudioStreams().get(index); return buildMediaSource(audio.getUrl(), PlayerHelper.cacheKeyOf(info, audio), MediaFormat.getSuffixById(audio.getFormatId())); } diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index d5ba7bb8638..cee885e22f6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -833,7 +833,7 @@ public void onPlaybackSynchronize(@NonNull final PlayQueueItem item, // on metadata changed } else if (currentPlaylistIndex != currentPlayQueueIndex || !isPlaying()) { - final long startPos = info != null ? info.start_position : C.TIME_UNSET; + final long startPos = info != null ? info.getStartPosition() : C.TIME_UNSET; if (DEBUG) Log.d(TAG, "Rewinding to correct" + " window=[" + currentPlayQueueIndex + "]," + " at=[" + getTimeString((int)startPos) + "]," + @@ -950,7 +950,7 @@ public void onPlayPrevious() { /* If current playback has run for PLAY_PREV_ACTIVATION_LIMIT milliseconds, restart current track. * Also restart the track if the current track is the first in a queue.*/ if (simpleExoPlayer.getCurrentPosition() > PLAY_PREV_ACTIVATION_LIMIT || playQueue.getIndex() == 0) { - final long startPos = currentInfo == null ? 0 : currentInfo.start_position; + final long startPos = currentInfo == null ? 0 : currentInfo.getStartPosition(); simpleExoPlayer.seekTo(startPos); } else { playQueue.offsetIndex(-1); diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index d9c04b796ee..c68133094a2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -579,7 +579,7 @@ public void onProgressUpdate(int currentProgress, int duration, int bufferPercen public void onMetadataUpdate(StreamInfo info) { if (info != null) { metadataTitle.setText(info.getName()); - metadataArtist.setText(info.uploader_name); + metadataArtist.setText(info.getUploaderName()); progressEndTime.setVisibility(View.GONE); progressLiveSync.setVisibility(View.GONE); diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index aa90b7b8888..48b13654cab 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -354,10 +354,10 @@ protected void onMetadataChanged(@NonNull final PlayQueueItem item, break; case VIDEO_STREAM: - if (info.video_streams.size() + info.video_only_streams.size() == 0) break; + if (info.getVideoStreams().size() + info.getVideoOnlyStreams().size() == 0) break; final List videos = ListHelper.getSortedStreamVideosList(context, - info.video_streams, info.video_only_streams, false); + info.getVideoStreams(), info.getVideoOnlyStreams(), false); availableStreams = new ArrayList<>(videos); if (playbackQuality == null) { selectedStreamIndex = getDefaultResolutionIndex(videos); @@ -388,7 +388,7 @@ public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) { // Create video stream source final List videos = ListHelper.getSortedStreamVideosList(context, - info.video_streams, info.video_only_streams, false); + info.getVideoStreams(), info.getVideoOnlyStreams(), false); final int index; if (videos.isEmpty()) { index = -1; diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java index cb803dcd144..ea13a28e75e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java @@ -417,9 +417,9 @@ private Single getLoadedMediaSource(@NonNull final PlayQueue final Exception exception = new IllegalStateException( "Unable to resolve source from stream info." + " URL: " + stream.getUrl() + - ", audio count: " + streamInfo.audio_streams.size() + - ", video count: " + streamInfo.video_only_streams.size() + - streamInfo.video_streams.size()); + ", audio count: " + streamInfo.getAudioStreams().size() + + ", video count: " + streamInfo.getVideoOnlyStreams().size() + + streamInfo.getVideoStreams().size()); return new FailedMediaSource(stream, exception); } diff --git a/app/src/main/java/org/schabi/newpipe/playlist/AbstractInfoPlayQueue.java b/app/src/main/java/org/schabi/newpipe/playlist/AbstractInfoPlayQueue.java index 6e63a3aaab5..2b31cd3400a 100644 --- a/app/src/main/java/org/schabi/newpipe/playlist/AbstractInfoPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/playlist/AbstractInfoPlayQueue.java @@ -26,13 +26,13 @@ abstract class AbstractInfoPlayQueue ext transient Disposable fetchReactor; AbstractInfoPlayQueue(final U item) { - this(item.getServiceId(), item.getUrl(), null, Collections.emptyList(), 0); + this(item.getServiceId(), item.getUrl(), null, Collections.emptyList(), 0); } AbstractInfoPlayQueue(final int serviceId, final String url, final String nextPageUrl, - final List streams, + final List streams, final int index) { super(index, extractListItems(streams)); @@ -65,10 +65,10 @@ public void onSubscribe(@NonNull Disposable d) { @Override public void onSuccess(@NonNull T result) { isInitial = false; - if (!result.has_more_streams) isComplete = true; - nextUrl = result.next_streams_url; + if (!result.hasNextPage()) isComplete = true; + nextUrl = result.getNextPageUrl(); - append(extractListItems(result.related_streams)); + append(extractListItems(result.getRelatedItems())); fetchReactor.dispose(); fetchReactor = null; @@ -83,8 +83,8 @@ public void onError(@NonNull Throwable e) { }; } - SingleObserver getNextPageObserver() { - return new SingleObserver() { + SingleObserver getNextPageObserver() { + return new SingleObserver() { @Override public void onSubscribe(@NonNull Disposable d) { if (isComplete || isInitial || (fetchReactor != null && !fetchReactor.isDisposed())) { @@ -95,11 +95,11 @@ public void onSubscribe(@NonNull Disposable d) { } @Override - public void onSuccess(@NonNull ListExtractor.InfoItemPage result) { + public void onSuccess(@NonNull ListExtractor.InfoItemsPage result) { if (!result.hasNextPage()) isComplete = true; - nextUrl = result.nextPageUrl; + nextUrl = result.getNextPageUrl(); - append(extractListItems(result.infoItemList)); + append(extractListItems(result.getItems())); fetchReactor.dispose(); fetchReactor = null; @@ -121,7 +121,7 @@ public void dispose() { fetchReactor = null; } - private static List extractListItems(final List infos) { + private static List extractListItems(final List infos) { List result = new ArrayList<>(); for (final InfoItem stream : infos) { if (stream instanceof StreamInfoItem) { diff --git a/app/src/main/java/org/schabi/newpipe/playlist/ChannelPlayQueue.java b/app/src/main/java/org/schabi/newpipe/playlist/ChannelPlayQueue.java index a5ecad0275e..d37b840722c 100644 --- a/app/src/main/java/org/schabi/newpipe/playlist/ChannelPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/playlist/ChannelPlayQueue.java @@ -3,6 +3,7 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.util.ExtractorHelper; import java.util.List; @@ -16,13 +17,13 @@ public ChannelPlayQueue(final ChannelInfoItem item) { } public ChannelPlayQueue(final ChannelInfo info) { - this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedStreams(), 0); + this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedItems(), 0); } public ChannelPlayQueue(final int serviceId, final String url, final String nextPageUrl, - final List streams, + final List streams, final int index) { super(serviceId, url, nextPageUrl, streams, index); } diff --git a/app/src/main/java/org/schabi/newpipe/playlist/PlaylistPlayQueue.java b/app/src/main/java/org/schabi/newpipe/playlist/PlaylistPlayQueue.java index c9340afadd2..d9e1d2d2b45 100644 --- a/app/src/main/java/org/schabi/newpipe/playlist/PlaylistPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/playlist/PlaylistPlayQueue.java @@ -3,6 +3,7 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.util.ExtractorHelper; import java.util.List; @@ -16,13 +17,13 @@ public PlaylistPlayQueue(final PlaylistInfoItem item) { } public PlaylistPlayQueue(final PlaylistInfo info) { - this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedStreams(), 0); + this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedItems(), 0); } public PlaylistPlayQueue(final int serviceId, final String url, final String nextPageUrl, - final List streams, + final List streams, final int index) { super(serviceId, url, nextPageUrl, streams, index); } diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 12c3dc44cc8..1897589c62e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -29,7 +29,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.extractor.Info; -import org.schabi.newpipe.extractor.ListExtractor.InfoItemPage; +import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; @@ -78,7 +78,7 @@ public static Single searchFor(final int serviceId, ); } - public static Single getMoreSearchItems(final int serviceId, + public static Single getMoreSearchItems(final int serviceId, final String query, final int nextPageNumber, final String searchLanguage, @@ -86,7 +86,7 @@ public static Single getMoreSearchItems(final int serviceId, checkServiceId(serviceId); return searchFor(serviceId, query, nextPageNumber, searchLanguage, filter) .map((@NonNull SearchResult searchResult) -> - new InfoItemPage(searchResult.resultList, + new InfoItemsPage(searchResult.resultList, nextPageNumber + "", searchResult.errors)); } @@ -117,7 +117,7 @@ public static Single getChannelInfo(final int serviceId, ChannelInfo.getInfo(NewPipe.getService(serviceId), url))); } - public static Single getMoreChannelItems(final int serviceId, + public static Single getMoreChannelItems(final int serviceId, final String url, final String nextStreamsUrl) { checkServiceId(serviceId); @@ -133,7 +133,7 @@ public static Single getPlaylistInfo(final int serviceId, PlaylistInfo.getInfo(NewPipe.getService(serviceId), url))); } - public static Single getMorePlaylistItems(final int serviceId, + public static Single getMorePlaylistItems(final int serviceId, final String url, final String nextStreamsUrl) { checkServiceId(serviceId); @@ -149,7 +149,7 @@ public static Single getKioskInfo(final int serviceId, KioskInfo.getInfo(NewPipe.getService(serviceId), url, contentCountry))); } - public static Single getMoreKioskItems(final int serviceId, + public static Single getMoreKioskItems(final int serviceId, final String url, final String nextStreamsUrl, final String contentCountry) { From a32273af914bfd82d5ba0e1f48aa8b6a6754ecb2 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Mon, 19 Mar 2018 11:40:49 +0000 Subject: [PATCH 172/176] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (343 of 343 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c32a6f27220..4517da74b4a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -419,4 +419,11 @@ 請記住,此操作可能會造成網路昂貴花費。 \n \n您想繼續嗎? - +要匯入您的 SoundCloud,您必須知道您的個人資料網址或 ID。 如果您這樣做,只需在下方的輸入中鍵入其中的任意一個,然後就可以開始了。 +\n +\n如果您不這樣做,您可以按照以下步驟操作: +\n1. 在一些瀏覽器中啟用「桌面模式」(該網站不適用於行動裝置) +\n2. 移至此網址:%1$s +\n3. 詢問時登入到您的帳號 +\n4. 複製網址您會被重新導向(這是您的個人資料網址) + From 12ce915e8ef3741759106edc57d6d20d07b0d7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 18 Mar 2018 13:50:16 +0000 Subject: [PATCH 173/176] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.2% (320 of 343 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index c214f5bd10e..df5221bc48b 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -382,4 +382,26 @@ Mindre skrift Normal skrift Større skrift - +Bruk raskt unøyaktig søk + Feilretting + Fil + + Ugyldig mappe + Ugyldig fil/innholdskilde + Filen finnes ikke eller så har du ikke tilgang til å lese eller skrive til den + Filnavn kan ikke være tomt + En feil inntraff: %1$s + + Auto-generert + Skru på LeakCanary + Importer + Importer fra + Eksporter til + + Importerer… + Eksporterer… + + Importer fil + Forrige eksport + + From 7dc176edcb9ae75c8f3ee78386d21851de4dc27a Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Mon, 19 Mar 2018 15:01:13 +0000 Subject: [PATCH 174/176] Translated using Weblate (German) Currently translated at 93.2% (320 of 343 strings) --- app/src/main/res/values-de/strings.xml | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index df414b78137..acb75efd176 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -376,4 +376,30 @@ Abbrechen Normale Schriftgröße Stream-Datei herunterladen - + Benutze schnelle ungenaue Suche + Ungenaues Suchen erlaubt dem Player die Positionen schneller mit geringerer Genauigkeit zu suchen + Datei + + Ungültiges Verzeichnis + Datei existiert nicht oder nicht ausreichende Rechte um sie zu lesen oder zu beschreiben + Dateiname darf nicht leer sein + Ein Fehler ist aufgetreten: %1$s + + Automatisch erzeugt + Kleinere Schriftgröße + Größere Schriftgröße + + LeakCanary aktivieren + Import von + Export nach + + Importiere… + Exportiere… + + Datei importieren + Vorheriger Export + + Beachte, dass diese Aktion sehr Netzwerk intensiv sein kann. +\n +\nMöchtest du fortfahren? + From 8556e992414d074c1d59fea78bebcd8f2624ed61 Mon Sep 17 00:00:00 2001 From: wb9688 Date: Wed, 21 Mar 2018 10:55:22 +0100 Subject: [PATCH 175/176] Remove IP range This would close #1148. I haven't tested it myself yet. @TheAssassin: Could you update the Sentry part? --- .../schabi/newpipe/report/ErrorActivity.java | 45 +------------------ 1 file changed, 1 insertion(+), 44 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java index 8e350903248..017c094aae2 100644 --- a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java @@ -77,12 +77,10 @@ public class ErrorActivity extends AppCompatActivity { public static final String ERROR_EMAIL_ADDRESS = "crashreport@newpipe.schabi.org"; public static final String ERROR_EMAIL_SUBJECT = "Exception in NewPipe " + BuildConfig.VERSION_NAME; - Thread globIpRangeThread; private String[] errorList; private ErrorInfo errorInfo; private Class returnActivity; private String currentTimeStamp; - private String globIpRange; // views private TextView errorView; private EditText userCommentBox; @@ -224,9 +222,6 @@ protected void onCreate(Bundle savedInstanceState) { }); reportButton.setEnabled(false); - globIpRangeThread = new Thread(new IpRangeRequester()); - globIpRangeThread.start(); - // normal bugreport buildInfo(errorInfo); if (errorInfo.message != 0) { @@ -342,8 +337,7 @@ private String buildJson() { .put("package", getPackageName()) .put("version", BuildConfig.VERSION_NAME) .put("os", getOsString()) - .put("time", currentTimeStamp) - .put("ip_range", globIpRange); + .put("time", currentTimeStamp); JSONArray exceptionArray = new JSONArray(); if (errorList != null) { @@ -454,41 +448,4 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.message); } } - - private class IpRangeRequester implements Runnable { - Handler h = new Handler(); - - public void run() { - String ipRange = "none"; - try { - Downloader dl = Downloader.getInstance(); - String ip = dl.download("https://ipv4.icanhazip.com"); - - ipRange = Parser.matchGroup1("([0-9]*\\.[0-9]*\\.)[0-9]*\\.[0-9]*", ip) - + "0.0"; - } catch (Throwable e) { - Log.w(TAG, "Error while error: could not get iprange", e); - } finally { - h.post(new IpRangeReturnRunnable(ipRange)); - } - } - } - - private class IpRangeReturnRunnable implements Runnable { - String ipRange; - - public IpRangeReturnRunnable(String ipRange) { - this.ipRange = ipRange; - } - - public void run() { - globIpRange = ipRange; - if (infoView != null) { - String text = infoView.getText().toString(); - text += "\n" + globIpRange; - infoView.setText(text); - reportButton.setEnabled(true); - } - } - } } From ae9aa2662a7a9d42310110b8bbf9e7cd6103fb4b Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Tue, 20 Mar 2018 22:14:33 +0000 Subject: [PATCH 176/176] Translated using Weblate (German) Currently translated at 93.2% (320 of 343 strings) --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index acb75efd176..fe9de8cab75 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -309,7 +309,7 @@ Ausrichtung umschalten In den Hintergrund wechseln Zu Popup wechseln - Zur Hauptseite wechseln + Zum normalen Player wechseln Externe Player unterstützen diese Art von Links nicht Ungültige URL