diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 8073503ad..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,3 +0,0 @@ -- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them. -- [ ] I checked if the issue/feature exists in the latest version. -- [ ] I did use the [incredible bugreport to markdown converter](https://teamnewpipe.github.io/CrashReportToMarkdown/) to paste bug reports. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..202e8a71a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,44 @@ +--- +name: Bug report +about: Create a bug report to help us improve +labels: bug +assignees: '' + +--- + + +### Version + +- + + +### Steps to reproduce the bug + +Steps to reproduce the behavior: +1. Go to '...' +2. Press on '....' +3. Swipe down to '....' + +### Expected behavior +Tell us what you expected to happen. + +### Actual behaviour +Tell us what happens instead. + +### Screenshots/Screen records +If applicable, add screenshots or a screen recording to help explain your problem. GitHub should support uploading them directly in the issue field. If your file is too big, feel free to paste a link from an image/video hoster here instead. + +### Logs +If your bug includes a crash, please head over to the [incredible bugreport to markdown converter](https://teamnewpipe.github.io/CrashReportToMarkdown/). Copy the result. Paste it here: + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..89fe58658 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,28 @@ +--- +name: Feature request +about: Suggest an idea for this project +labels: enhancement +assignees: '' + +--- + +#### Is your feature request related to a problem? Please describe it +A clear and concise description of what the problem is. +Example: *I want to do X, but there is no way to do it.* + +#### Describe the solution you'd like +A clear and concise description of what you want to happen. +Example: *I think it would be nice if you add feature Y which makes X possible.* + +#### (Optional) Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've considered. +Example: *I considered Z, but that didn't turn out to be a good idea because...* + +#### Additional context +Add any other context or screenshots about the feature request here. +Example: *Here's a photo of my cat!* + +#### How will you/everyone benefit from this feature? +Convince us! How does it change your NewPipe experience and/or your life? +The better this paragraph is, the more likely a developer will think about working on it. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d0e58680a..9a1193767 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1 +1,26 @@ + + +#### What is it? +- [ ] Bug fix +- [ ] Feature + +#### Long description of the changes in your PR + +- record videos +- create clones +- take over the world + +#### Fixes the following issue(s) + +- + +#### Relies on the following changes + +- + +#### Testing apk + +debug.zip + +#### Agreement - [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them. diff --git a/app/build.gradle b/app/build.gradle index fc8809317..37b03e4ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { resValue "string", "app_name", "NewPipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 860 - versionName "0.18.6" + versionCode 900 + versionName "0.19.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -92,7 +92,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:6446abc6d' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:69e0624e3' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..5cc2fa66a --- /dev/null +++ b/app/src/debug/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 317f345b7..28215e013 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -250,14 +250,7 @@ - - - - - - - - + @@ -283,8 +276,26 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java new file mode 100644 index 000000000..9fd32b735 --- /dev/null +++ b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java @@ -0,0 +1,318 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.fragment.app; + +import android.os.Bundle; +import android.os.Parcelable; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Lifecycle; +import androidx.viewpager.widget.PagerAdapter; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; + +// TODO: Replace this deprecated class with its ViewPager2 counterpart + +/** + * This is a copy from {@link androidx.fragment.app.FragmentStatePagerAdapter}. + *

+ * It includes a workaround to fix the menu visibility when the adapter is restored. + *

+ * When restoring the state of this adapter, all the fragments' menu visibility were set to false, + * effectively disabling the menu from the user until he switched pages or another event that triggered the + * menu to be visible again happened. + *

+ *
Check out the changes in: + *

    + *
  • {@link #saveState()}
  • + *
  • {@link #restoreState(Parcelable, ClassLoader)}
  • + *
+ */ +@SuppressWarnings("deprecation") +public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter { + private static final String TAG = "FragmentStatePagerAdapt"; + private static final boolean DEBUG = false; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({BEHAVIOR_SET_USER_VISIBLE_HINT, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT}) + private @interface Behavior { } + + /** + * Indicates that {@link Fragment#setUserVisibleHint(boolean)} will be called when the current + * fragment changes. + * + * @deprecated This behavior relies on the deprecated + * {@link Fragment#setUserVisibleHint(boolean)} API. Use + * {@link #BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT} to switch to its replacement, + * {@link FragmentTransaction#setMaxLifecycle}. + * @see #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int) + */ + @Deprecated + public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; + + /** + * Indicates that only the current fragment will be in the {@link Lifecycle.State#RESUMED} + * state. All other Fragments are capped at {@link Lifecycle.State#STARTED}. + * + * @see #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int) + */ + public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; + + private final FragmentManager mFragmentManager; + private final int mBehavior; + private FragmentTransaction mCurTransaction = null; + + private ArrayList mSavedState = new ArrayList(); + private ArrayList mFragments = new ArrayList(); + private Fragment mCurrentPrimaryItem = null; + + /** + * Constructor for {@link FragmentStatePagerAdapterMenuWorkaround} that sets the fragment manager for the + * adapter. This is the equivalent of calling + * {@link #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int)} and passing in + * {@link #BEHAVIOR_SET_USER_VISIBLE_HINT}. + * + *

Fragments will have {@link Fragment#setUserVisibleHint(boolean)} called whenever the + * current Fragment changes.

+ * + * @param fm fragment manager that will interact with this adapter + * @deprecated use {@link #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int)} with + * {@link #BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT} + */ + @Deprecated + public FragmentStatePagerAdapterMenuWorkaround(@NonNull FragmentManager fm) { + this(fm, BEHAVIOR_SET_USER_VISIBLE_HINT); + } + + /** + * Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}. + * + * If {@link #BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT} is passed in, then only the current + * Fragment is in the {@link Lifecycle.State#RESUMED} state, while all other fragments are + * capped at {@link Lifecycle.State#STARTED}. If {@link #BEHAVIOR_SET_USER_VISIBLE_HINT} is + * passed, all fragments are in the {@link Lifecycle.State#RESUMED} state and there will be + * callbacks to {@link Fragment#setUserVisibleHint(boolean)}. + * + * @param fm fragment manager that will interact with this adapter + * @param behavior determines if only current fragments are in a resumed state + */ + public FragmentStatePagerAdapterMenuWorkaround(@NonNull FragmentManager fm, + @Behavior int behavior) { + mFragmentManager = fm; + mBehavior = behavior; + } + + /** + * Return the Fragment associated with a specified position. + */ + @NonNull + public abstract Fragment getItem(int position); + + @Override + public void startUpdate(@NonNull ViewGroup container) { + if (container.getId() == View.NO_ID) { + throw new IllegalStateException("ViewPager with adapter " + this + + " requires a view id"); + } + } + + @SuppressWarnings("deprecation") + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + // If we already have this item instantiated, there is nothing + // to do. This can happen when we are restoring the entire pager + // from its saved state, where the fragment manager has already + // taken care of restoring the fragments we previously had instantiated. + if (mFragments.size() > position) { + Fragment f = mFragments.get(position); + if (f != null) { + return f; + } + } + + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + + Fragment fragment = getItem(position); + if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment); + if (mSavedState.size() > position) { + Fragment.SavedState fss = mSavedState.get(position); + if (fss != null) { + fragment.setInitialSavedState(fss); + } + } + while (mFragments.size() <= position) { + mFragments.add(null); + } + fragment.setMenuVisibility(false); + if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) { + fragment.setUserVisibleHint(false); + } + + mFragments.set(position, fragment); + mCurTransaction.add(container.getId(), fragment); + + if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED); + } + + return fragment; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + Fragment fragment = (Fragment) object; + + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object + + " v=" + ((Fragment)object).getView()); + while (mSavedState.size() <= position) { + mSavedState.add(null); + } + mSavedState.set(position, fragment.isAdded() + ? mFragmentManager.saveFragmentInstanceState(fragment) : null); + mFragments.set(position, null); + + mCurTransaction.remove(fragment); + if (fragment == mCurrentPrimaryItem) { + mCurrentPrimaryItem = null; + } + } + + @Override + @SuppressWarnings({"ReferenceEquality", "deprecation"}) + public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + Fragment fragment = (Fragment)object; + if (fragment != mCurrentPrimaryItem) { + if (mCurrentPrimaryItem != null) { + mCurrentPrimaryItem.setMenuVisibility(false); + if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + mCurTransaction.setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED); + } else { + mCurrentPrimaryItem.setUserVisibleHint(false); + } + } + fragment.setMenuVisibility(true); + if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED); + } else { + fragment.setUserVisibleHint(true); + } + + mCurrentPrimaryItem = fragment; + } + } + + @Override + public void finishUpdate(@NonNull ViewGroup container) { + if (mCurTransaction != null) { + mCurTransaction.commitNowAllowingStateLoss(); + mCurTransaction = null; + } + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return ((Fragment)object).getView() == view; + } + + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + private final String SELECTED_FRAGMENT = "selected_fragment"; + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + @Override + @Nullable + public Parcelable saveState() { + Bundle state = null; + if (mSavedState.size() > 0) { + state = new Bundle(); + Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()]; + mSavedState.toArray(fss); + state.putParcelableArray("states", fss); + } + for (int i=0; i keys = bundle.keySet(); + for (String key: keys) { + if (key.startsWith("f")) { + int index = Integer.parseInt(key.substring(1)); + Fragment f = mFragmentManager.getFragment(bundle, key); + if (f != null) { + while (mFragments.size() <= index) { + mFragments.add(null); + } + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + final boolean wasSelected = bundle.getString(SELECTED_FRAGMENT, "").equals(key); + f.setMenuVisibility(wasSelected); + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + mFragments.set(index, f); + } else { + Log.w(TAG, "Bad fragment at key " + key); + } + } + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 412bea0e1..aa572afcb 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -9,12 +9,6 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.PreferenceManager; -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.app.NotificationCompat; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; import android.text.TextUtils; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; @@ -26,6 +20,12 @@ import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.NotificationCompat; import androidx.fragment.app.FragmentManager; import org.schabi.newpipe.download.DownloadDialog; @@ -51,12 +51,11 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.views.FocusOverlayView; +import org.schabi.newpipe.util.urlfinder.UrlFinder; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import icepick.Icepick; @@ -631,78 +630,18 @@ public class RouterActivity extends AppCompatActivity { // Utils //////////////////////////////////////////////////////////////////////////*/ - /** - * Removes invisible separators (\p{Z}) and punctuation characters including - * brackets (\p{P}). See http://www.regular-expressions.info/unicode.html for - * more details. - */ - private final static String REGEX_REMOVE_FROM_URL = "[\\p{Z}\\p{P}]"; - + @Nullable private String getUrl(Intent intent) { - // first gather data and find service - String videoUrl = null; + String foundUrl = null; if (intent.getData() != null) { - // this means the video was called though another app - videoUrl = intent.getData().toString(); + // Called from another app + foundUrl = intent.getData().toString(); } else if (intent.getStringExtra(Intent.EXTRA_TEXT) != null) { - //this means that vidoe was called through share menu - String extraText = intent.getStringExtra(Intent.EXTRA_TEXT); - final String[] uris = getUris(extraText); - videoUrl = uris.length > 0 ? uris[0] : null; + // Called from the share menu + final String extraText = intent.getStringExtra(Intent.EXTRA_TEXT); + foundUrl = UrlFinder.firstUrlFromInput(extraText); } - return videoUrl; - } - - private String removeHeadingGibberish(final String input) { - int start = 0; - for (int i = input.indexOf("://") - 1; i >= 0; i--) { - if (!input.substring(i, i + 1).matches("\\p{L}")) { - start = i + 1; - break; - } - } - return input.substring(start, input.length()); - } - - private String trim(final String input) { - if (input == null || input.length() < 1) { - return input; - } else { - String output = input; - while (output.length() > 0 && output.substring(0, 1).matches(REGEX_REMOVE_FROM_URL)) { - output = output.substring(1); - } - while (output.length() > 0 - && output.substring(output.length() - 1, output.length()).matches(REGEX_REMOVE_FROM_URL)) { - output = output.substring(0, output.length() - 1); - } - return output; - } - } - - /** - * Retrieves all Strings which look remotely like URLs from a text. - * Used if NewPipe was called through share menu. - * - * @param sharedText text to scan for URLs. - * @return potential URLs - */ - protected String[] getUris(final String sharedText) { - final Collection result = new HashSet<>(); - if (sharedText != null) { - final String[] array = sharedText.split("\\p{Space}"); - for (String s : array) { - s = trim(s); - if (s.length() != 0) { - if (s.matches(".+://.+")) { - result.add(removeHeadingGibberish(s)); - } else if (s.matches(".+\\..+")) { - result.add("http://" + s); - } - } - } - } - return result.toArray(new String[result.size()]); + return foundUrl; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java index 8e328266e..f9852b7b0 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java @@ -17,6 +17,7 @@ import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; +import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; @@ -181,6 +182,9 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC if (exception instanceof ReCaptchaException) { onReCaptchaException((ReCaptchaException) exception); return true; + } else if (exception instanceof ContentNotAvailableException) { + showError(getString(R.string.content_not_available), false); + return true; } else if (exception instanceof IOException) { showError(getString(R.string.network_error), true); return true; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index e3dfb8982..a157f34bf 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -16,7 +16,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; @@ -185,7 +185,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte updateTitleForTab(tab.getPosition()); } - private static class SelectedTabsPagerAdapter extends FragmentStatePagerAdapter { + private static class SelectedTabsPagerAdapter extends FragmentStatePagerAdapterMenuWorkaround { private final Context context; private final List internalTabsList; 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 71d26a925..f9469e505 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 @@ -51,7 +51,6 @@ import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; @@ -1223,20 +1222,12 @@ public class VideoDetailFragment protected boolean onError(Throwable exception) { if (super.onError(exception)) return true; - 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 ExtractionException ? R.string.parsing_error + : R.string.general_error; + + onUnrecoverableError(exception, UserAction.REQUESTED_STREAM, + NewPipe.getNameOfService(serviceId), url, errorId); return true; } 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 3615b0922..40df990f9 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 @@ -440,16 +440,12 @@ public class ChannelFragment extends BaseListInfoFragment { protected boolean onError(Throwable exception) { if (super.onError(exception)) return true; - if (exception instanceof ContentNotAvailableException) { - showError(getString(R.string.content_not_available), false); - } else { - int errorId = exception instanceof ExtractionException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, - UserAction.REQUESTED_CHANNEL, - NewPipe.getNameOfService(serviceId), - url, - errorId); - } + int errorId = exception instanceof ExtractionException + ? R.string.parsing_error : R.string.general_error; + + onUnrecoverableError(exception, UserAction.REQUESTED_CHANNEL, + NewPipe.getNameOfService(serviceId), url, errorId); + return true; } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java index a2e585857..78bdfeaac 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java @@ -5,7 +5,7 @@ import android.view.ViewGroup; import org.schabi.newpipe.R; import org.schabi.newpipe.info_list.InfoItemBuilder; -public class StreamGridInfoItemHolder extends StreamMiniInfoItemHolder { +public class StreamGridInfoItemHolder extends StreamInfoItemHolder { public StreamGridInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) { super(infoItemBuilder, R.layout.list_stream_grid_item, parent); 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 1dfbbca3f..8f715c6c0 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 @@ -40,7 +40,11 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder { public final TextView itemAdditionalDetails; public StreamInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) { - super(infoItemBuilder, R.layout.list_stream_item, parent); + this(infoItemBuilder, R.layout.list_stream_item, parent); + } + + public StreamInfoItemHolder(InfoItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) { + super(infoItemBuilder, layoutId, parent); itemAdditionalDetails = itemView.findViewById(R.id.itemAdditionalDetails); } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 64020d14c..d41a2e37b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -128,7 +128,7 @@ class FeedFragment : BaseListFragment() { .putBoolean(getString(R.string.feed_use_dedicated_fetch_method_key), !usingDedicatedMethod) .apply() } - .setPositiveButton(android.R.string.ok, null) + .setPositiveButton(resources.getString(R.string.finish), null) .create() .show() return true diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 27ff38a3f..b1fef5671 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -189,7 +189,8 @@ class FeedGroupDialog : DialogFragment() { val groupAdapter = GroupAdapter() groupAdapter.spanCount = if (useGridLayout) 4 else 1 - val selectedCountText = getString(R.string.feed_group_dialog_selection_count, this.selectedSubscriptions.size) + val subscriptionsCount = this.selectedSubscriptions.size + val selectedCountText = resources.getQuantityString(R.plurals.feed_group_dialog_selection_count, subscriptionsCount, subscriptionsCount) selected_subscription_count_view.text = selectedCountText subscriptions_selector_header_info.text = selectedCountText @@ -234,7 +235,8 @@ class FeedGroupDialog : DialogFragment() { item.isSelected = isSelected item.notifyChanged(PickerSubscriptionItem.UPDATE_SELECTED) - val updateSelectedCountText = getString(R.string.feed_group_dialog_selection_count, this.selectedSubscriptions.size) + val subscriptionsCount = this.selectedSubscriptions.size + val updateSelectedCountText = resources.getQuantityString(R.plurals.feed_group_dialog_selection_count, subscriptionsCount, subscriptionsCount) selected_subscription_count_view.text = updateSelectedCountText subscriptions_selector_header_info.text = updateSelectedCountText } diff --git a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java index 1fab28234..22168f4fa 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainVideoPlayer.java @@ -448,7 +448,8 @@ public final class MainVideoPlayer extends AppCompatActivity } protected void setMuteButton(final ImageButton muteButton, final boolean isMuted) { - muteButton.setColorFilter(ContextCompat.getColor(getApplicationContext(), isMuted ? R.color.white : R.color.gray)); + muteButton.setImageDrawable(AppCompatResources.getDrawable(getApplicationContext(), + isMuted ? R.drawable.ic_volume_off_white_72dp : R.drawable.ic_volume_up_white_72dp)); } 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 e7700351e..113592b47 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -3,14 +3,12 @@ package org.schabi.newpipe.player; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; -import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.appcompat.widget.Toolbar; @@ -700,11 +698,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity item.setTitle(player.isMuted() ? R.string.unmute : R.string.mute); //2) Icon change accordingly to current App Theme - TypedArray a = getTheme().obtainStyledAttributes(R.style.Theme_AppCompat, new int[]{R.attr.volume_off}); - int attributeResourceId = a.getResourceId(0, 0); - Drawable drawableMuted = getResources().getDrawable(attributeResourceId); - Drawable drawableUnmuted = getResources().getDrawable(R.drawable.ic_volume_off_gray_24dp); - item.setIcon(player.isMuted() ? drawableMuted : drawableUnmuted); + item.setIcon(player.isMuted() ? getThemedDrawable(R.attr.volume_off) : getThemedDrawable(R.attr.volume_on)); } } + + private Drawable getThemedDrawable(int attribute) { + return getResources().getDrawable( + getTheme().obtainStyledAttributes(R.style.Theme_AppCompat, new int[]{attribute}) + .getResourceId(0, 0)); + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index d4897ecaa..383cf7f74 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -76,7 +76,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { displayedDurationValues.add(durationsValue); try { displayedDescriptionValues.add(String.format( - res.getQuantityString(R.plurals.dynamic_seek_duration_description, + res.getQuantityString(R.plurals.seconds, currentDurationValue), currentDurationValue)); } catch (Resources.NotFoundException ignored) { @@ -88,7 +88,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { durations.setEntryValues(displayedDurationValues.toArray(new CharSequence[0])); durations.setEntries(displayedDescriptionValues.toArray(new CharSequence[0])); final int selectedDuration = Integer.parseInt(durations.getValue()); - if (selectedDuration / (int) DateUtils.SECOND_IN_MILLIS % 10 == 5) { + if (inexactSeek && selectedDuration / (int) DateUtils.SECOND_IN_MILLIS % 10 == 5) { final int newDuration = selectedDuration / (int) DateUtils.SECOND_IN_MILLIS + 5; durations.setValue(Integer.toString(newDuration * (int) DateUtils.SECOND_IN_MILLIS)); diff --git a/app/src/main/java/org/schabi/newpipe/streams/WebMReader.java b/app/src/main/java/org/schabi/newpipe/streams/WebMReader.java index 42875c364..b1628d954 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/WebMReader.java +++ b/app/src/main/java/org/schabi/newpipe/streams/WebMReader.java @@ -37,6 +37,7 @@ public class WebMReader { private final static int ID_DefaultDuration = 0x3E383; private final static int ID_FlagLacing = 0x1C; private final static int ID_CodecDelay = 0x16AA; + private final static int ID_SeekPreRoll = 0x16BB; private final static int ID_Cluster = 0x0F43B675; private final static int ID_Timecode = 0x67; @@ -332,6 +333,10 @@ public class WebMReader { break; case ID_CodecDelay: entry.codecDelay = readNumber(elem); + break; + case ID_SeekPreRoll: + entry.seekPreRoll = readNumber(elem); + break; default: break; } @@ -414,8 +419,9 @@ public class WebMReader { public byte[] codecPrivate; public byte[] bMetadata; public TrackKind kind; - public long defaultDuration; - public long codecDelay; + public long defaultDuration = -1; + public long codecDelay = -1; + public long seekPreRoll = -1; } public class Segment { diff --git a/app/src/main/java/org/schabi/newpipe/streams/WebMWriter.java b/app/src/main/java/org/schabi/newpipe/streams/WebMWriter.java index 8525fabd2..39db33ad0 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/WebMWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/WebMWriter.java @@ -23,7 +23,10 @@ public class WebMWriter implements Closeable { private final static int BUFFER_SIZE = 8 * 1024; private final static int DEFAULT_TIMECODE_SCALE = 1000000; private final static int INTERV = 100;// 100ms on 1000000us timecode scale - private final static int DEFAULT_CUES_EACH_MS = 5000;// 100ms on 1000000us timecode scale + private final static int DEFAULT_CUES_EACH_MS = 5000;// 5000ms on 1000000us timecode scale + private final static byte CLUSTER_HEADER_SIZE = 8; + private final static int CUE_RESERVE_SIZE = 65535; + private final static byte MINIMUM_EBML_VOID_SIZE = 4; private WebMReader.WebMTrack[] infoTracks; private SharpStream[] sourceTracks; @@ -38,15 +41,18 @@ public class WebMWriter implements Closeable { private Segment[] readersSegment; private Cluster[] readersCluster; - private int[] predefinedDurations; + private ArrayList clustersOffsetsSizes; private byte[] outBuffer; + private ByteBuffer outByteBuffer; public WebMWriter(SharpStream... source) { sourceTracks = source; readers = new WebMReader[sourceTracks.length]; infoTracks = new WebMTrack[sourceTracks.length]; outBuffer = new byte[BUFFER_SIZE]; + outByteBuffer = ByteBuffer.wrap(outBuffer); + clustersOffsetsSizes = new ArrayList<>(256); } public WebMTrack[] getTracksFromSource(int sourceIndex) throws IllegalStateException { @@ -83,11 +89,9 @@ public class WebMWriter implements Closeable { try { readersSegment = new Segment[readers.length]; readersCluster = new Cluster[readers.length]; - predefinedDurations = new int[readers.length]; for (int i = 0; i < readers.length; i++) { infoTracks[i] = readers[i].selectTrack(trackIndex[i]); - predefinedDurations[i] = -1; readersSegment[i] = readers[i].getNextSegment(); } } finally { @@ -118,6 +122,8 @@ public class WebMWriter implements Closeable { readersSegment = null; readersCluster = null; outBuffer = null; + outByteBuffer = null; + clustersOffsetsSizes = null; } public void build(SharpStream out) throws IOException, RuntimeException { @@ -140,7 +146,7 @@ public class WebMWriter implements Closeable { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00// segment content size }); - long baseSegmentOffset = written + listBuffer.get(0).length; + long segmentOffset = written + listBuffer.get(0).length; /* seek head */ listBuffer.add(new byte[]{ @@ -177,20 +183,22 @@ public class WebMWriter implements Closeable { /* tracks */ listBuffer.addAll(makeTracks()); - for (byte[] buff : listBuffer) { - dump(buff, out); - } + dump(listBuffer, out); - // reserve space for Cues element, but is a waste of space (actually is 64 KiB) - // TODO: better Cue maker - long cueReservedOffset = written; - dump(new byte[]{(byte) 0xec, 0x20, (byte) 0xff, (byte) 0xfb}, out); - int reserved = (1024 * 63) - 4; - while (reserved > 0) { - int write = Math.min(reserved, outBuffer.length); - out.write(outBuffer, 0, write); - reserved -= write; - written += write; + // reserve space for Cues element + long cueOffset = written; + make_EBML_void(out, CUE_RESERVE_SIZE, true); + + int[] defaultSampleDuration = new int[infoTracks.length]; + long[] duration = new long[infoTracks.length]; + + for (int i = 0; i < infoTracks.length; i++) { + if (infoTracks[i].defaultDuration < 0) { + defaultSampleDuration[i] = -1;// not available + } else { + defaultSampleDuration[i] = (int) Math.ceil(infoTracks[i].defaultDuration / (float) DEFAULT_TIMECODE_SCALE); + } + duration[i] = -1; } // Select a track for the cue @@ -198,16 +206,8 @@ public class WebMWriter implements Closeable { long nextCueTime = infoTracks[cuesForTrackId].trackType == 1 ? -1 : 0; ArrayList keyFrames = new ArrayList<>(32); - ArrayList clusterOffsets = new ArrayList<>(32); - ArrayList clusterSizes = new ArrayList<>(32); - - long duration = 0; - int durationFromTrackId = 0; - - byte[] bTimecode = makeTimecode(0); - int firstClusterOffset = (int) written; - long currentClusterOffset = makeCluster(out, bTimecode, 0, clusterOffsets, clusterSizes); + long currentClusterOffset = makeCluster(out, 0, 0, true); long baseTimecode = 0; long limitTimecode = -1; @@ -239,8 +239,7 @@ public class WebMWriter implements Closeable { newClusterByTrackId = -1; baseTimecode = bloq.absoluteTimecode; limitTimecode = baseTimecode + INTERV; - bTimecode = makeTimecode(baseTimecode); - currentClusterOffset = makeCluster(out, bTimecode, currentClusterOffset, clusterOffsets, clusterSizes); + currentClusterOffset = makeCluster(out, baseTimecode, currentClusterOffset, true); } if (cuesForTrackId == i) { @@ -248,19 +247,18 @@ public class WebMWriter implements Closeable { if (nextCueTime > -1) { nextCueTime += DEFAULT_CUES_EACH_MS; } - keyFrames.add( - new KeyFrame(baseSegmentOffset, currentClusterOffset - 8, written, bTimecode.length, bloq.absoluteTimecode) - ); + keyFrames.add(new KeyFrame(segmentOffset, currentClusterOffset, written, bloq.absoluteTimecode)); } } writeBlock(out, bloq, baseTimecode); blockWritten++; - if (bloq.absoluteTimecode > duration) { - duration = bloq.absoluteTimecode; - durationFromTrackId = bloq.trackNumber; + if (defaultSampleDuration[i] < 0 && duration[i] >= 0) { + // if the sample duration in unknown, calculate using current_duration - previous_duration + defaultSampleDuration[i] = (int) (bloq.absoluteTimecode - duration[i]); } + duration[i] = bloq.absoluteTimecode; if (limitTimecode < 0) { limitTimecode = bloq.absoluteTimecode + INTERV; @@ -276,55 +274,61 @@ public class WebMWriter implements Closeable { } } - makeCluster(out, null, currentClusterOffset, null, clusterSizes); + makeCluster(out, -1, currentClusterOffset, false); long segmentSize = written - offsetSegmentSizeSet - 7; - /* ---- final step write offsets and sizes ---- */ + /* Segment size */ seekTo(out, offsetSegmentSizeSet); - writeLong(out, segmentSize); + outByteBuffer.putLong(0, segmentSize); + out.write(outBuffer, 1, DataReader.LONG_SIZE - 1); - if (predefinedDurations[durationFromTrackId] > -1) { - duration += predefinedDurations[durationFromTrackId];// this value is full-filled in makeTrackEntry() method - } - seekTo(out, offsetInfoDurationSet); - writeFloat(out, duration); - - firstClusterOffset -= baseSegmentOffset; - seekTo(out, offsetClusterSet); - writeInt(out, firstClusterOffset); - - seekTo(out, cueReservedOffset); - - /* Cue */ - dump(new byte[]{0x1c, 0x53, (byte) 0xbb, 0x6b, 0x20, 0x00, 0x00}, out); - - for (KeyFrame keyFrame : keyFrames) { - for (byte[] buffer : makeCuePoint(cuesForTrackId, keyFrame)) { - dump(buffer, out); - if (written >= (cueReservedOffset + 65535 - 16)) { - throw new IOException("Too many Cues"); - } + /* Segment duration */ + long longestDuration = 0; + for (int i = 0; i < duration.length; i++) { + if (defaultSampleDuration[i] > 0) { + duration[i] += defaultSampleDuration[i]; + } + if (duration[i] > longestDuration) { + longestDuration = duration[i]; } } - short cueSize = (short) (written - cueReservedOffset - 7); + seekTo(out, offsetInfoDurationSet); + outByteBuffer.putFloat(0, longestDuration); + dump(outBuffer, DataReader.FLOAT_SIZE, out); - /* EBML Void */ - ByteBuffer voidBuffer = ByteBuffer.allocate(4); - voidBuffer.putShort((short) 0xec20); - voidBuffer.putShort((short) (firstClusterOffset - written - 4)); - dump(voidBuffer.array(), out); + /* first Cluster offset */ + firstClusterOffset -= segmentOffset; + writeInt(out, offsetClusterSet, firstClusterOffset); - seekTo(out, offsetCuesSet); - writeInt(out, (int) (cueReservedOffset - baseSegmentOffset)); + seekTo(out, cueOffset); - seekTo(out, cueReservedOffset + 5); - writeShort(out, cueSize); + /* Cue */ + short cueSize = 0; + dump(new byte[]{0x1c, 0x53, (byte) 0xbb, 0x6b, 0x20, 0x00, 0x00}, out);// header size is 7 - for (int i = 0; i < clusterSizes.size(); i++) { - seekTo(out, clusterOffsets.get(i)); - byte[] buffer = ByteBuffer.allocate(4).putInt(clusterSizes.get(i) | 0x10000000).array(); - dump(buffer, out); + for (KeyFrame keyFrame : keyFrames) { + int size = makeCuePoint(cuesForTrackId, keyFrame, outBuffer); + + if ((cueSize + size + 7 + MINIMUM_EBML_VOID_SIZE) > CUE_RESERVE_SIZE) { + break;// no space left + } + + cueSize += size; + dump(outBuffer, size, out); + } + + make_EBML_void(out, CUE_RESERVE_SIZE - cueSize - 7, false); + + seekTo(out, cueOffset + 5); + outByteBuffer.putShort(0, cueSize); + dump(outBuffer, DataReader.SHORT_SIZE, out); + + /* seek head, seek for cues element */ + writeInt(out, offsetCuesSet, (int) (cueOffset - segmentOffset)); + + for (ClusterInfo cluster : clustersOffsetsSizes) { + writeInt(out, cluster.offset, cluster.size | 0x10000000); } } @@ -375,25 +379,10 @@ public class WebMWriter implements Closeable { written = offset; } - private void writeLong(SharpStream stream, long number) throws IOException { - byte[] buffer = ByteBuffer.allocate(DataReader.LONG_SIZE).putLong(number).array(); - stream.write(buffer, 1, buffer.length - 1); - written += buffer.length - 1; - } - - private void writeFloat(SharpStream stream, float number) throws IOException { - byte[] buffer = ByteBuffer.allocate(DataReader.FLOAT_SIZE).putFloat(number).array(); - dump(buffer, stream); - } - - private void writeShort(SharpStream stream, short number) throws IOException { - byte[] buffer = ByteBuffer.allocate(DataReader.SHORT_SIZE).putShort(number).array(); - dump(buffer, stream); - } - - private void writeInt(SharpStream stream, int number) throws IOException { - byte[] buffer = ByteBuffer.allocate(DataReader.INTEGER_SIZE).putInt(number).array(); - dump(buffer, stream); + private void writeInt(SharpStream stream, long offset, int number) throws IOException { + seekTo(stream, offset); + outByteBuffer.putInt(0, number); + dump(outBuffer, DataReader.INTEGER_SIZE, stream); } private void writeBlock(SharpStream stream, Block bloq, long clusterTimecode) throws IOException { @@ -416,47 +405,43 @@ public class WebMWriter implements Closeable { } listBuffer.set(1, encode(blockSize, false)); - for (byte[] buff : listBuffer) { - dump(buff, stream); - } + dump(listBuffer, stream); int read; while ((read = bloq.data.read(outBuffer)) > 0) { - stream.write(outBuffer, 0, read); - written += read; + dump(outBuffer, read, stream); } } - private byte[] makeTimecode(long timecode) { - ByteBuffer buffer = ByteBuffer.allocate(9); - buffer.put((byte) 0xe7); - buffer.put(encode(timecode, true)); + private long makeCluster(SharpStream stream, long timecode, long offset, boolean create) throws IOException { + ClusterInfo cluster; - byte[] res = new byte[buffer.position()]; - System.arraycopy(buffer.array(), 0, res, 0, res.length); - - return res; - } - - private long makeCluster(SharpStream stream, byte[] bTimecode, long startOffset, ArrayList clusterOffsets, ArrayList clusterSizes) throws IOException { - if (startOffset > 0) { - clusterSizes.add((int) (written - startOffset));// size for last offset + if (offset > 0) { + // save the size of the previous cluster (maximum 256 MiB) + cluster = clustersOffsetsSizes.get(clustersOffsetsSizes.size() - 1); + cluster.size = (int) (written - offset - CLUSTER_HEADER_SIZE); } - if (clusterOffsets != null) { + offset = written; + + if (create) { /* cluster */ dump(new byte[]{0x1f, 0x43, (byte) 0xb6, 0x75}, stream); - clusterOffsets.add(written);// warning: max cluster size is 256 MiB - dump(new byte[]{0x10, 0x00, 0x00, 0x00}, stream); - startOffset = written;// size for the this cluster + cluster = new ClusterInfo(); + cluster.offset = written; + clustersOffsetsSizes.add(cluster); - dump(bTimecode, stream); + dump(new byte[]{ + 0x10, 0x00, 0x00, 0x00, + /* timestamp */ + (byte) 0xe7 + }, stream); - return startOffset; + dump(encode(timecode, true), stream); } - return -1; + return offset; } private void makeEBML(SharpStream stream) throws IOException { @@ -509,13 +494,24 @@ public class WebMWriter implements Closeable { buffer.add(new byte[]{(byte) 0x86}); buffer.addAll(encode(track.codecId)); + /* codec delay*/ + if (track.codecDelay >= 0) { + buffer.add(new byte[]{0x56, (byte) 0xAA}); + buffer.add(encode(track.codecDelay, true)); + } + + /* codec seek pre-roll*/ + if (track.seekPreRoll >= 0) { + buffer.add(new byte[]{0x56, (byte) 0xBB}); + buffer.add(encode(track.seekPreRoll, true)); + } + /* type */ buffer.add(new byte[]{(byte) 0x83}); buffer.add(encode(track.trackType, true)); /* default duration */ - if (track.defaultDuration != 0) { - predefinedDurations[internalTrackId] = (int) Math.ceil(track.defaultDuration / (float) DEFAULT_TIMECODE_SCALE); + if (track.defaultDuration >= 0) { buffer.add(new byte[]{0x23, (byte) 0xe3, (byte) 0x83}); buffer.add(encode(track.defaultDuration, true)); } @@ -538,21 +534,29 @@ public class WebMWriter implements Closeable { } - private ArrayList makeCuePoint(int internalTrackId, KeyFrame keyFrame) { - ArrayList buffer = new ArrayList<>(5); + private int makeCuePoint(int internalTrackId, KeyFrame keyFrame, byte[] buffer) { + ArrayList cue = new ArrayList<>(5); /* CuePoint */ - buffer.add(new byte[]{(byte) 0xbb}); - buffer.add(null); + cue.add(new byte[]{(byte) 0xbb}); + cue.add(null); /* CueTime */ - buffer.add(new byte[]{(byte) 0xb3}); - buffer.add(encode(keyFrame.atTimecode, true)); + cue.add(new byte[]{(byte) 0xb3}); + cue.add(encode(keyFrame.duration, true)); /* CueTrackPosition */ - buffer.addAll(makeCueTrackPosition(internalTrackId, keyFrame)); + cue.addAll(makeCueTrackPosition(internalTrackId, keyFrame)); - return lengthFor(buffer); + int size = 0; + lengthFor(cue); + + for (byte[] buff : cue) { + System.arraycopy(buff, 0, buffer, size, buff.length); + size += buff.length; + } + + return size; } private ArrayList makeCueTrackPosition(int internalTrackId, KeyFrame keyFrame) { @@ -568,20 +572,48 @@ public class WebMWriter implements Closeable { /* CueClusterPosition */ buffer.add(new byte[]{(byte) 0xf1}); - buffer.add(encode(keyFrame.atCluster, true)); + buffer.add(encode(keyFrame.clusterPosition, true)); /* CueRelativePosition */ - if (keyFrame.atBlock > 0) { + if (keyFrame.relativePosition > 0) { buffer.add(new byte[]{(byte) 0xf0}); - buffer.add(encode(keyFrame.atBlock, true)); + buffer.add(encode(keyFrame.relativePosition, true)); } return lengthFor(buffer); } + private void make_EBML_void(SharpStream out, int size, boolean wipe) throws IOException { + /* ebml void */ + outByteBuffer.putShort(0, (short) 0xec20); + outByteBuffer.putShort(2, (short) (size - 4)); + + dump(outBuffer, 4, out); + + if (wipe) { + size -= 4; + while (size > 0) { + int write = Math.min(size, outBuffer.length); + dump(outBuffer, write, out); + size -= write; + } + } + } + private void dump(byte[] buffer, SharpStream stream) throws IOException { - stream.write(buffer); - written += buffer.length; + dump(buffer, buffer.length, stream); + } + + private void dump(byte[] buffer, int count, SharpStream stream) throws IOException { + stream.write(buffer, 0, count); + written += count; + } + + private void dump(ArrayList buffers, SharpStream stream) throws IOException { + for (byte[] buffer : buffers) { + stream.write(buffer); + written += buffer.length; + } } private ArrayList lengthFor(ArrayList buffer) { @@ -614,11 +646,11 @@ public class WebMWriter implements Closeable { byte[] buffer = new byte[offset + length]; long marker = (long) Math.floor((length - 1f) / 8f); - float mul = 1; - for (int i = length - 1; i >= 0; i--, mul *= 0x100) { - long b = (long) Math.floor(number / mul); + int shift = 0; + for (int i = length - 1; i >= 0; i--, shift += 8) { + long b = number >>> shift; if (!withLength && i == marker) { - b = b | (0x80 >> (length - 1)); + b = b | (0x80 >>> (length - 1)); } buffer[offset + i] = (byte) b; } @@ -686,17 +718,15 @@ public class WebMWriter implements Closeable { class KeyFrame { - KeyFrame(long segment, long cluster, long block, int bTimecodeLength, long timecode) { - atCluster = cluster - segment; - if ((block - bTimecodeLength) > cluster) { - atBlock = (int) (block - cluster); - } - atTimecode = timecode; + KeyFrame(long segment, long cluster, long block, long timecode) { + clusterPosition = cluster - segment; + relativePosition = (int) (block - cluster - CLUSTER_HEADER_SIZE); + duration = timecode; } - long atCluster; - int atBlock; - long atTimecode; + final long clusterPosition; + final int relativePosition; + final long duration; } class Block { @@ -717,4 +747,11 @@ public class WebMWriter implements Closeable { return String.format("trackNumber=%s isKeyFrame=%S absoluteTimecode=%s", trackNumber, isKeyframe(), absoluteTimecode); } } + + class ClusterInfo { + + long offset; + int size; + } + } diff --git a/app/src/main/java/org/schabi/newpipe/util/urlfinder/PatternsCompat.java b/app/src/main/java/org/schabi/newpipe/util/urlfinder/PatternsCompat.java new file mode 100644 index 000000000..bbad56c37 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/urlfinder/PatternsCompat.java @@ -0,0 +1,360 @@ +/* THIS FILE WAS MODIFIED, CHANGES ARE DOCUMENTED. */ + +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.schabi.newpipe.util.urlfinder; + +import androidx.annotation.RestrictTo; + +import java.util.regex.Pattern; + +import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX; + +/** + * Commonly used regular expression patterns. + */ +public final class PatternsCompat { + /** + * Regular expression to match all IANA top-level domains. + * + * List accurate as of 2015/11/24. List taken from: + * http://data.iana.org/TLD/tlds-alpha-by-domain.txt + * This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py + */ + static final String IANA_TOP_LEVEL_DOMAINS = + "(?:" + + "(?:aaa|aarp|abb|abbott|abogado|academy|accenture|accountant|accountants|aco|active" + + "|actor|ads|adult|aeg|aero|afl|agency|aig|airforce|airtel|allfinanz|alsace|amica|amsterdam" + + "|android|apartments|app|apple|aquarelle|aramco|archi|army|arpa|arte|asia|associates" + + "|attorney|auction|audio|auto|autos|axa|azure|a[cdefgilmoqrstuwxz])" + + "|(?:band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bbc|bbva" + + "|bcn|beats|beer|bentley|berlin|best|bet|bharti|bible|bid|bike|bing|bingo|bio|biz|black" + + "|blackfriday|bloomberg|blue|bms|bmw|bnl|bnpparibas|boats|bom|bond|boo|boots|boutique" + + "|bradesco|bridgestone|broadway|broker|brother|brussels|budapest|build|builders|business" + + "|buzz|bzh|b[abdefghijmnorstvwyz])" + + "|(?:cab|cafe|cal|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards" + + "|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|ceb|center|ceo" + + "|cern|cfa|cfd|chanel|channel|chat|cheap|chloe|christmas|chrome|church|cipriani|cisco" + + "|citic|city|cityeats|claims|cleaning|click|clinic|clothing|cloud|club|clubmed|coach" + + "|codes|coffee|college|cologne|com|commbank|community|company|computer|comsec|condos" + + "|construction|consulting|contractors|cooking|cool|coop|corsica|country|coupons|courses" + + "|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cuisinella|cymru|cyou|c[acdfghiklmnoruvwxyz])" + + "|(?:dabur|dad|dance|date|dating|datsun|day|dclk|deals|degree|delivery|dell|delta" + + "|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount" + + "|dnp|docs|dog|doha|domains|doosan|download|drive|durban|dvag|d[ejkmoz])" + + "|(?:earth|eat|edu|education|email|emerck|energy|engineer|engineering|enterprises" + + "|epson|equipment|erni|esq|estate|eurovision|eus|events|everbank|exchange|expert|exposed" + + "|express|e[cegrstu])" + + "|(?:fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|feedback|ferrero|film" + + "|final|finance|financial|firmdale|fish|fishing|fit|fitness|flights|florist|flowers|flsmidth" + + "|fly|foo|football|forex|forsale|forum|foundation|frl|frogans|fund|furniture|futbol|fyi" + + "|f[ijkmor])" + + "|(?:gal|gallery|game|garden|gbiz|gdn|gea|gent|genting|ggee|gift|gifts|gives|giving" + + "|glass|gle|global|globo|gmail|gmo|gmx|gold|goldpoint|golf|goo|goog|google|gop|gov|grainger" + + "|graphics|gratis|green|gripe|group|gucci|guge|guide|guitars|guru|g[abdefghilmnpqrstuwy])" + + "|(?:hamburg|hangout|haus|healthcare|help|here|hermes|hiphop|hitachi|hiv|hockey|holdings" + + "|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hsbc|hyundai" + + "|h[kmnrtu])" + + "|(?:ibm|icbc|ice|icu|ifm|iinet|immo|immobilien|industries|infiniti|info|ing|ink|institute" + + "|insure|int|international|investments|ipiranga|irish|ist|istanbul|itau|iwc|i[delmnoqrst])" + + "|(?:jaguar|java|jcb|jetzt|jewelry|jlc|jll|jobs|joburg|jprs|juegos|j[emop])" + + "|(?:kaufen|kddi|kia|kim|kinder|kitchen|kiwi|koeln|komatsu|krd|kred|kyoto|k[eghimnprwyz])" + + "|(?:lacaixa|lancaster|land|landrover|lasalle|lat|latrobe|law|lawyer|lds|lease|leclerc" + + "|legal|lexus|lgbt|liaison|lidl|life|lifestyle|lighting|limited|limo|linde|link|live" + + "|lixil|loan|loans|lol|london|lotte|lotto|love|ltd|ltda|lupin|luxe|luxury|l[abcikrstuvy])" + + "|(?:madrid|maif|maison|man|management|mango|market|marketing|markets|marriott|mba" + + "|media|meet|melbourne|meme|memorial|men|menu|meo|miami|microsoft|mil|mini|mma|mobi|moda" + + "|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar" + + "|mtn|mtpc|mtr|museum|mutuelle|m[acdeghklmnopqrstuvwxyz])" + + "|(?:nadex|nagoya|name|navy|nec|net|netbank|network|neustar|new|news|nexus|ngo|nhk" + + "|nico|ninja|nissan|nokia|nra|nrw|ntt|nyc|n[acefgilopruz])" + + "|(?:obi|office|okinawa|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|osaka" + + "|otsuka|ovh|om)" + + "|(?:page|panerai|paris|partners|parts|party|pet|pharmacy|philips|photo|photography" + + "|photos|physio|piaget|pics|pictet|pictures|ping|pink|pizza|place|play|playstation|plumbing" + + "|plus|pohl|poker|porn|post|praxi|press|pro|prod|productions|prof|properties|property" + + "|protection|pub|p[aefghklmnrstwy])" + + "|(?:qpon|quebec|qa)" + + "|(?:racing|realtor|realty|recipes|red|redstone|rehab|reise|reisen|reit|ren|rent|rentals" + + "|repair|report|republican|rest|restaurant|review|reviews|rich|ricoh|rio|rip|rocher|rocks" + + "|rodeo|rsvp|ruhr|run|rwe|ryukyu|r[eosuw])" + + "|(?:saarland|sakura|sale|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|saxo" + + "|sbs|sca|scb|schmidt|scholarships|school|schule|schwarz|science|scor|scot|seat|security" + + "|seek|sener|services|seven|sew|sex|sexy|shiksha|shoes|show|shriram|singles|site|ski" + + "|sky|skype|sncf|soccer|social|software|sohu|solar|solutions|sony|soy|space|spiegel|spreadbetting" + + "|srl|stada|starhub|statoil|stc|stcgroup|stockholm|studio|study|style|sucks|supplies" + + "|supply|support|surf|surgery|suzuki|swatch|swiss|sydney|systems|s[abcdeghijklmnortuvxyz])" + + "|(?:tab|taipei|tatamotors|tatar|tattoo|tax|taxi|team|tech|technology|tel|telefonica" + + "|temasek|tennis|thd|theater|theatre|tickets|tienda|tips|tires|tirol|today|tokyo|tools" + + "|top|toray|toshiba|tours|town|toyota|toys|trade|trading|training|travel|trust|tui|t[cdfghjklmnortvwz])" + + "|(?:ubs|university|uno|uol|u[agksyz])" + + "|(?:vacations|vana|vegas|ventures|versicherung|vet|viajes|video|villas|vin|virgin" + + "|vision|vista|vistaprint|viva|vlaanderen|vodka|vote|voting|voto|voyage|v[aceginu])" + + "|(?:wales|walter|wang|watch|webcam|website|wed|wedding|weir|whoswho|wien|wiki|williamhill" + + "|win|windows|wine|wme|work|works|world|wtc|wtf|w[fs])" + + "|(?:\u03b5\u03bb|\u0431\u0435\u043b|\u0434\u0435\u0442\u0438|\u043a\u043e\u043c|\u043c\u043a\u0434" + + "|\u043c\u043e\u043d|\u043c\u043e\u0441\u043a\u0432\u0430|\u043e\u043d\u043b\u0430\u0439\u043d" + + "|\u043e\u0440\u0433|\u0440\u0443\u0441|\u0440\u0444|\u0441\u0430\u0439\u0442|\u0441\u0440\u0431" + + "|\u0443\u043a\u0440|\u049b\u0430\u0437|\u0570\u0561\u0575|\u05e7\u05d5\u05dd|\u0627\u0631\u0627\u0645\u0643\u0648" + + "|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629" + + "|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0627\u06cc\u0631\u0627\u0646" + + "|\u0628\u0627\u0632\u0627\u0631|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633" + + "|\u0633\u0648\u062f\u0627\u0646|\u0633\u0648\u0631\u064a\u0629|\u0634\u0628\u0643\u0629" + + "|\u0639\u0631\u0627\u0642|\u0639\u0645\u0627\u0646|\u0641\u0644\u0633\u0637\u064a\u0646" + + "|\u0642\u0637\u0631|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0645\u0644\u064a\u0633\u064a\u0627" + + "|\u0645\u0648\u0642\u0639|\u0915\u0949\u092e|\u0928\u0947\u091f|\u092d\u093e\u0930\u0924" + + "|\u0938\u0902\u0917\u0920\u0928|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4" + + "|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd" + + "|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22" + + "|\u10d2\u10d4|\u307f\u3093\u306a|\u30b0\u30fc\u30b0\u30eb|\u30b3\u30e0|\u4e16\u754c" + + "|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4e2d\u6587\u7f51|\u4f01\u4e1a|\u4f5b\u5c71" + + "|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063" + + "|\u5546\u57ce|\u5546\u5e97|\u5546\u6807|\u5728\u7ebf|\u5927\u62ff|\u5a31\u4e50|\u5de5\u884c" + + "|\u5e7f\u4e1c|\u6148\u5584|\u6211\u7231\u4f60|\u624b\u673a|\u653f\u52a1|\u653f\u5e9c" + + "|\u65b0\u52a0\u5761|\u65b0\u95fb|\u65f6\u5c1a|\u673a\u6784|\u6de1\u9a6c\u9521|\u6e38\u620f" + + "|\u70b9\u770b|\u79fb\u52a8|\u7ec4\u7ec7\u673a\u6784|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7edc" + + "|\u8c37\u6b4c|\u96c6\u56e2|\u98de\u5229\u6d66|\u9910\u5385|\u9999\u6e2f|\ub2f7\ub137" + + "|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d|xbox" + + "|xerox|xin|xn\\-\\-11b4c3d|xn\\-\\-1qqw23a|xn\\-\\-30rr7y|xn\\-\\-3bst00m|xn\\-\\-3ds443g" + + "|xn\\-\\-3e0b707e|xn\\-\\-3pxu8k|xn\\-\\-42c2d9a|xn\\-\\-45brj9c|xn\\-\\-45q11c|xn\\-\\-4gbrim" + + "|xn\\-\\-55qw42g|xn\\-\\-55qx5d|xn\\-\\-6frz82g|xn\\-\\-6qq986b3xl|xn\\-\\-80adxhks" + + "|xn\\-\\-80ao21a|xn\\-\\-80asehdb|xn\\-\\-80aswg|xn\\-\\-90a3ac|xn\\-\\-90ais|xn\\-\\-9dbq2a" + + "|xn\\-\\-9et52u|xn\\-\\-b4w605ferd|xn\\-\\-c1avg|xn\\-\\-c2br7g|xn\\-\\-cg4bki|xn\\-\\-clchc0ea0b2g2a9gcd" + + "|xn\\-\\-czr694b|xn\\-\\-czrs0t|xn\\-\\-czru2d|xn\\-\\-d1acj3b|xn\\-\\-d1alf|xn\\-\\-efvy88h" + + "|xn\\-\\-estv75g|xn\\-\\-fhbei|xn\\-\\-fiq228c5hs|xn\\-\\-fiq64b|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s" + + "|xn\\-\\-fjq720a|xn\\-\\-flw351e|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-gecrj9c" + + "|xn\\-\\-h2brj9c|xn\\-\\-hxt814e|xn\\-\\-i1b6b1a6a2e|xn\\-\\-imr513n|xn\\-\\-io0a7i" + + "|xn\\-\\-j1aef|xn\\-\\-j1amh|xn\\-\\-j6w193g|xn\\-\\-kcrx77d1x4a|xn\\-\\-kprw13d|xn\\-\\-kpry57d" + + "|xn\\-\\-kput3i|xn\\-\\-l1acc|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgb9awbf|xn\\-\\-mgba3a3ejt" + + "|xn\\-\\-mgba3a4f16a|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbab2bd|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e" + + "|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-mgbpl2fh|xn\\-\\-mgbtx2b|xn\\-\\-mgbx4cd0ab" + + "|xn\\-\\-mk1bu44c|xn\\-\\-mxtq1m|xn\\-\\-ngbc5azd|xn\\-\\-node|xn\\-\\-nqv7f|xn\\-\\-nqv7fs00ema" + + "|xn\\-\\-nyqy26a|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1acf|xn\\-\\-p1ai|xn\\-\\-pgbs0dh" + + "|xn\\-\\-pssy2u|xn\\-\\-q9jyb4c|xn\\-\\-qcka1pmc|xn\\-\\-qxam|xn\\-\\-rhqv96g|xn\\-\\-s9brj9c" + + "|xn\\-\\-ses554g|xn\\-\\-t60b56a|xn\\-\\-tckwe|xn\\-\\-unup4y|xn\\-\\-vermgensberater\\-ctb" + + "|xn\\-\\-vermgensberatung\\-pwb|xn\\-\\-vhquv|xn\\-\\-vuq861b|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a" + + "|xn\\-\\-xhq521b|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-y9a3aq|xn\\-\\-yfro4i67o" + + "|xn\\-\\-ygbi2ammx|xn\\-\\-zfr164b|xperia|xxx|xyz)" + + "|(?:yachts|yamaxun|yandex|yodobashi|yoga|yokohama|youtube|y[et])" + + "|(?:zara|zip|zone|zuerich|z[amw]))"; + + public static final Pattern IP_ADDRESS + = Pattern.compile( + "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]" + + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]" + + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" + + "|[1-9][0-9]|[0-9]))"); + + /** + * Valid UCS characters defined in RFC 3987. Excludes space characters. + */ + private static final String UCS_CHAR = "[" + + "\u00A0-\uD7FF" + + "\uF900-\uFDCF" + + "\uFDF0-\uFFEF" + + "\uD800\uDC00-\uD83F\uDFFD" + + "\uD840\uDC00-\uD87F\uDFFD" + + "\uD880\uDC00-\uD8BF\uDFFD" + + "\uD8C0\uDC00-\uD8FF\uDFFD" + + "\uD900\uDC00-\uD93F\uDFFD" + + "\uD940\uDC00-\uD97F\uDFFD" + + "\uD980\uDC00-\uD9BF\uDFFD" + + "\uD9C0\uDC00-\uD9FF\uDFFD" + + "\uDA00\uDC00-\uDA3F\uDFFD" + + "\uDA40\uDC00-\uDA7F\uDFFD" + + "\uDA80\uDC00-\uDABF\uDFFD" + + "\uDAC0\uDC00-\uDAFF\uDFFD" + + "\uDB00\uDC00-\uDB3F\uDFFD" + + "\uDB44\uDC00-\uDB7F\uDFFD" + + "&&[^\u00A0[\u2000-\u200A]\u2028\u2029\u202F\u3000]]"; + + /** + * Valid characters for IRI label defined in RFC 3987. + */ + private static final String LABEL_CHAR = "a-zA-Z0-9" + UCS_CHAR; + + /** + * Valid characters for IRI TLD defined in RFC 3987. + */ + private static final String TLD_CHAR = "a-zA-Z" + UCS_CHAR; + + /** + * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets. + */ + private static final String IRI_LABEL = + "[" + LABEL_CHAR + "](?:[" + LABEL_CHAR + "_\\-]{0,61}[" + LABEL_CHAR + "]){0,1}"; + + /** + * RFC 3492 references RFC 1034 and limits Punycode algorithm output to 63 characters. + */ + private static final String PUNYCODE_TLD = "xn\\-\\-[\\w\\-]{0,58}\\w"; + + private static final String TLD = "(" + PUNYCODE_TLD + "|" + "[" + TLD_CHAR + "]{2,63}" +")"; + + private static final String HOST_NAME = "(" + IRI_LABEL + "\\.)+" + TLD; + + public static final Pattern DOMAIN_NAME + = Pattern.compile("(" + HOST_NAME + "|" + IP_ADDRESS + ")"); + + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // CHANGED: Removed rtsp from supported protocols // + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + private static final String PROTOCOL = "(?i:http|https)://"; + + /* A word boundary or end of input. This is to stop foo.sure from matching as foo.su */ + private static final String WORD_BOUNDARY = "(?:\\b|$|^)"; + + private static final String USER_INFO = "(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)" + + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_" + + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@"; + + private static final String PORT_NUMBER = "\\:\\d{1,5}"; + + private static final String PATH_AND_QUERY = "[/\\?](?:(?:[" + LABEL_CHAR + + ";/\\?:@&=#~" // plus optional query params + + "\\-\\.\\+!\\*'\\(\\),_\\$])|(?:%[a-fA-F0-9]{2}))*"; + + /** + * Regular expression pattern to match most part of RFC 3987 + * Internationalized URLs, aka IRIs. + */ + public static final Pattern WEB_URL = Pattern.compile("(" + + "(" + + "(?:" + PROTOCOL + "(?:" + USER_INFO + ")?" + ")?" + + "(?:" + DOMAIN_NAME + ")" + + "(?:" + PORT_NUMBER + ")?" + + ")" + + "(" + PATH_AND_QUERY + ")?" + + WORD_BOUNDARY + + ")"); + + /** + * Regular expression that matches known TLDs and punycode TLDs + */ + private static final String STRICT_TLD = "(?:" + + IANA_TOP_LEVEL_DOMAINS + "|" + PUNYCODE_TLD + ")"; + + /** + * Regular expression that matches host names using {@link #STRICT_TLD} + */ + private static final String STRICT_HOST_NAME = "(?:(?:" + IRI_LABEL + "\\.)+" + + STRICT_TLD + ")"; + + /** + * Regular expression that matches domain names using either {@link #STRICT_HOST_NAME} or + * {@link #IP_ADDRESS} + */ + private static final Pattern STRICT_DOMAIN_NAME + = Pattern.compile("(?:" + STRICT_HOST_NAME + "|" + IP_ADDRESS + ")"); + + /** + * Regular expression that matches domain names without a TLD + */ + private static final String RELAXED_DOMAIN_NAME = + "(?:" + "(?:" + IRI_LABEL + "(?:\\.(?=\\S))" +"?)+" + "|" + IP_ADDRESS + ")"; + + /** + * Regular expression to match strings that do not start with a supported protocol. The TLDs + * are expected to be one of the known TLDs. + */ + private static final String WEB_URL_WITHOUT_PROTOCOL = "(" + + WORD_BOUNDARY + + "(? + + diff --git a/app/src/main/res/drawable/ic_volume_up_white_24dp.xml b/app/src/main/res/drawable/ic_volume_up_white_24dp.xml new file mode 100644 index 000000000..271540946 --- /dev/null +++ b/app/src/main/res/drawable/ic_volume_up_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout-large-land/activity_main_player.xml b/app/src/main/res/layout-large-land/activity_main_player.xml index f081b61a9..8dab200e8 100644 --- a/app/src/main/res/layout-large-land/activity_main_player.xml +++ b/app/src/main/res/layout-large-land/activity_main_player.xml @@ -411,8 +411,7 @@ android:src="@drawable/ic_volume_off_white_24dp" android:background="?attr/selectableItemBackground" android:contentDescription="@string/switch_to_background" - tools:ignore="RtlHardcoded" - android:tint="@color/gray"/> + tools:ignore="RtlHardcoded" /> + tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_stream_grid_item.xml b/app/src/main/res/layout/list_stream_grid_item.xml index fc9235e8d..2850c6125 100644 --- a/app/src/main/res/layout/list_stream_grid_item.xml +++ b/app/src/main/res/layout/list_stream_grid_item.xml @@ -67,6 +67,19 @@ android:textSize="@dimen/video_item_search_uploader_text_size" tools:text="Uploader"/> + + - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/toolbar_search_layout.xml b/app/src/main/res/layout/toolbar_search_layout.xml index bd5b2d5c7..85d915421 100644 --- a/app/src/main/res/layout/toolbar_search_layout.xml +++ b/app/src/main/res/layout/toolbar_search_layout.xml @@ -15,8 +15,6 @@ android:layout_marginRight="48dp" android:layout_marginTop="4dp" android:background="?attr/colorPrimary" - android:drawableLeft="?attr/search" - android:drawablePadding="8dp" android:focusable="true" android:focusableInTouchMode="true" android:nextFocusDown="@+id/suggestions_list" diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1e48f1800..8afcff438 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -329,7 +329,6 @@ عملية التصدير جارية … إستيراد ملف "معرفك , soundcloud.com/ الخاص بك " - إفتراضي عند إيقاف تحميل أي صور مصغرة ، وتوفير البيانات واستخدام الذاكرة. تعمل التغييرات على محو ذاكرة التخزين المؤقت للصورة الموجودة على الذاكرة أو على القرص. امسح البيانات الوصفية المخزنة مؤقتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا @@ -470,7 +469,6 @@ الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1 غير موجود فشلت المعالجة الاولية - حذف التنزيلات المنتهية توقف أقصى عدد للمحاولات الحد الأقصى لعدد محاولات قبل إلغاء التحميل @@ -567,12 +565,12 @@ اضغط على \"تم\" عند حلها منجز الفيديوهات - - %s ثوانٍ - %s ثوانٍ - %s ثوانٍ - %s ثوانٍ - %s ثوانٍ - %s ثوانٍ + + %d ثوانٍ + %d ثوانٍ + %d ثوانٍ + %d ثوانٍ + %d ثوانٍ + %d ثوانٍ \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 347afa2cf..ff6f204ba 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -189,7 +189,6 @@ Nun pue crease la carpeta de destín Nun pudo afitase una conexón segura Nun pue coneutase col sirvidor - Llimpiar les descargues finaes Reintentos máximos Eventos Conferencies @@ -212,12 +211,11 @@ Llimpieza de datos Amosar comentarios - Pa cumplir cola GDPR (Regulación Xeneral de Proteición de Datos) europea, pidímoste que revises la política de privacidá de NewPipe. Lléila con procuru. -\nHas aceutala unviándonos un informe de fallos.¿Desaniciar tol historial de gueta\? -\nHas aceutala unviándonos un informe de fallos. + Pa cumplir cola GDPR (Regulación Xeneral de Proteición de Datos) europea, pidímoste que revises la política de privacidá de NewPipe. Lléila con procuru. +\nHas aceutala unviándonos un informe de fallos. + Aición al cambiar a otra aplicación dende\'l reproductor de vídeos principal — %s El númberu máximu d\'intentos enantes d\'encaboxar la descarga - Posiciones nes llistes ¿Quies llimpiar l\'historial de descargues o desaniciar tolos ficheros baxaos\? Esportación anterior Importar el ficheru @@ -231,8 +229,8 @@ \n \n3.- Anicia sesión cuando se te pida \n2.- Vete a esta URL: %1$s - LaToID, soundcloud.com/latoid \n4.- Copia la URL del perfil al que se te redirixa. + LaToID, soundcloud.com/latoid Cargar miniatures Desactiva esta opción pa evitar la carga de miniatures, aforrar datos y usu de la memoria. Los cambeos van llimpiar la memoria y la caché d\'imáxenes. Minimizar al cambiar a otra aplicación @@ -276,11 +274,35 @@ Llingua de l\'aplicación La predeterminada del sistema Vídeos - - %s segundos - %s segundos + + %d segundu + %d segundos Tempu Tonu Refugar + La URL nun se sofita + Reproduciendo en segundu planu + Reproduciendo nel mou ventanu + Atroxa llocalmente les consultes de gueta + Los reproductores esternos nun so + Esportóse + Importóse + Alvertencia: Nun pudieron importase tolos ficheros. + Anovamientos + Finó la descarga + Nun pudo validase la instancia + + %d minutu + %d minutos + + + %d hora + %d hores + + + %d día + %d díes + + ¿Quies desaniciar esti grupu\? \ No newline at end of file diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index fe866fd04..1fb28f4de 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -349,7 +349,7 @@ 报告『提前结束Android生命周期』错误 强制报告处理后的未送达的Activity或Fragment生命周期之外的Rx异常 使用快速不精确搜索 - 粗略定位播放:允许播放器以略低的精确度为代价换取更快的定位速度。此功能不适用于每隔5、15或25秒定位 + 粗略定位播放:允许播放器以略低的精确度为代价换取更快的定位速度。此功能不适用于每隔5、15或25秒定位. 自动播放下一个 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表 没有此文件夹 @@ -454,7 +454,6 @@ 服务器未发送数据 找不到 NOT FOUND 后期处理失败 - 清除已完成的下载 停止 最大重试次数 取消下载前的最多重试着次数 @@ -536,10 +535,53 @@ 完成后请按\"完成(Done)\" 完成 视频 - - %s秒 + + %d秒 由于ExoPlayer的限制,搜寻间隔设置为%d秒 静音 取消静音 + 帮助 + + %d分钟 + + + %d小时 + + + %d天 + + Feed组 + 最早订阅更新:%s + 未加载: %d + 正在加载feed… + 正在处理feed… + 选择订阅 + 未选中订阅 + + 已选中%d + + 组名为空 + 名称 + 您要删除该组吗? + 新建 + Feed + Feed更新阈值 + 上次更新后,订阅被视为过时的时间-%s + 始终更新 + 可用时从专用feed获取 + 在某些服务中可用,通常速度要快得多,但可能返回的条目数量有限,而且信息通常不完整(例如,没有持续时间,条目类型,没有实时状态)。 + 启用快速模式 + 禁用快速模式 + 您是否认为Feed加载太慢?如果是这样,请尝试启用快速加载(您可以在设置中更改它,也可以按下面的按钮更改它)。 +\n +\nNewPipe提供两种feed加载策略: +\n•获取整个订阅频道,这很慢但是很是完整。 +\n•使用专用的服务端点,这样会比较快但通常不完整。 +\n +\n两者之间的区别在于,后者通常缺少一些信息,例如条目的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的条目。 +\n +\nYouTube是一个通过其RSS feed提供这种快速方法的服务示例。 +\n +\n因此,选择哪种方式取决于您更看重什么:是速度还是精确的信息。 \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 58ea028df..4b1531def 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -457,7 +457,6 @@ Сервер не падтрымлівае шматструменную загрузку, паспрабуйце з @string/msg_threads = 1 Не знойдзена Пасляапрацоўка не ўдалася - Ачысціць завершаныя Спыніць Максімум спробаў Колькасць спробаў перад адменай загрузкі diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 8bc945992..dc8c7f9e1 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -114,7 +114,6 @@ S\'està important… S\'està exportant… Importa un fitxer - Per defecte %1$s reproduccions Publicat el %1$s No s\'ha trobat cap reproductor de fluxos. Voleu instal·lar el VLC\? @@ -447,7 +446,6 @@ No s\'ha pogut trobar el servidor No s\'ha pogut connectar amb el servidor Ha fallat el post-processament - Neteja les baixades finalitzades Intents màxims Nombre màxim d\'intents abans de cancel·lar la baixada Interromp en connexions limitades diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 9fd68d180..154296626 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -368,7 +368,6 @@ otevření ve vyskakovacím okně Tempo Výška tónu Odpojit (může způsobit zkreslení) - Výchozí nastavení Ke stažení nejsou dostupné žádné streamy Preferovaná \'otevřít\' akce Výchozí chování při otevírání obsahu — %s @@ -464,7 +463,6 @@ otevření ve vyskakovacím okně Server neakceptuje vícevláknové stahování, opakujte akci s @string/msg_threads = 1 Nenalezeno Post-processing selhal - Vyčistit dokončená stahování Zastavit Maximální počet pokusů o opakování Maximální počet pokusů před zrušením stahování @@ -553,12 +551,63 @@ otevření ve vyskakovacím okně Po vyřešení stiskni \"Hotovo\" Hotovo Videa - - %s sekund - %s sekund - %s sekund + + %d vteřina + %d vteřiny + %d vteřin Kvůli omezením ExoPlayer bylo prohledávání nastaveno na %d vteřin Umlčet Odumlčet + Nápověda + + %d minuta + %d minuty + %d minut + + + %d hodina + %d hodiny + %d hodin + + + %d den + %d dny + %d dnů + + Přísunové skupiny + Aktualizace nejstarších objednávek: %s + Nenačteno: %d + Načítám přísun… + Zpracovávám přísun… + Vybrat objednávky + Objednávky nebyly vybrány + + %d vybrána + %d vybrány + %d vybráno + + Prázdné jméno skupiny + Jméno + Přejete si smazat tuto skupinu\? + Nová + Přísun + Limit aktualizace přísunu + Doba po poslední aktualizaci, po níž je objednávka považována za zastaralou — %s + Vždy aktualizovat + Dodat z vyhrazeného přísunu, je-li dostupný + K dispozici na některých zařízeních, je obvykle mnohem rychlejší, ale může vrátit omezený počet položek a často neúplné informace (např. bez trvání, typu položky, skutečného stavu). + Zapnout rychlý režim + Vypnout rychlý režim + Myslíte si, že náčet přísunu je příliš pomalé\? Pokud ano, zkuste zapnout rychlý náčet (lze změnit v nastavení nebo stiskem tlačítka níže). +\n +\nNewPipe nabízí dvě strategie náčtu přísunu: +\n• Dodání úplného kanálu objednávek, což je pomalé, ale úplné. +\n• Použití vyhrazeného servisního zakončení, což je rychlé, ale obvykle neúplné. +\n +\nRozdíl mezi těmi dvěma je, že tomu rychlému obvykle chybí nějaká informace, např. trvání položky nebo typ (nemůže rozlišit mezi živým a normálním videem) a patrně vrátí méně položek. +\n +\nYouTube je příklad služby, která nabízí tuto rychlou metodu pomocí RSS přísunu. +\n +\nVýběr je vposledku určen tím, čemu dáte přednost: rychlosti nebo přesné informaci. \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 25abe3d1a..ef8dc032d 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -446,7 +446,6 @@ NewPipe-opdatering tilgængelig! sat på pause sat i kø - Ryd færdige downloads Maksimalt antal genforsøg Maksimalt antal forsøg før downloaden opgives Sæt på pause ved skift til mobildata diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1d69e7a82..5d0daa4e0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -340,7 +340,6 @@ Geschwindigkeit Tonhöhe Entkoppeln (kann zu Verzerrungen führen) - Standard Abschalten, um das Laden von Miniaturansichten zu verhindern, was Daten- und Speicherverbrauch spart. Änderungen löschen den Bildzwischenspeicher sowohl im Arbeitsspeicher als auch auf dem internen Speicher. Nächsten Stream automatisch einreihen Wiedergabe durch Anhängen eines verwandten Streams an die Warteschlange (ohne Wiederholungsschleife) fortsetzen @@ -457,7 +456,6 @@ Der Server erlaubt kein mehrfädiges Herunterladen – wiederhole mit @string/msg_threads = 1 Nicht gefunden Nachbearbeitung fehlgeschlagen - Um fertige Downloads bereinigen Anhalten Maximale Wiederholungen Maximalanzahl der Versuche, bevor der Download abgebrochen wird @@ -545,10 +543,58 @@ \"Fertig\" drücken, wenn es gelöst wurde Fertig Videos - - %s Sekunde - %s Sekunden + + %d Sekunde + %d Sekunden Aufgrund von ExoPlayer-Einschränkungen wurde die Suchdauer auf %d Sekunden gesetzt - Stumm + Stummschaltung + Stummschaltung aufheben + Hilfe + + %d Minute + %d Minuten + + + %d Stunde + %d Stunden + + + %d Tag + %d Tage + + + %d ausgewählt + %d ausgewählte + + Leerer Gruppenname + Name + Möchtest du diese Gruppe löschen\? + Neu + Immer aktualisieren + Feed-Gruppen + Nicht geladen: %d + Feed laden… + Feed verarbeiten… + Feed + Abonnements auswählen + Kein Abonnement ausgewählt + Zeit nach der letzten Aktualisierung, bevor ein Abonnement als veraltet angesehen wird — %s + Schnellmodus aktivieren + Schnellmodus deaktivieren + Älteste Aboaktualisierung: %s + Grenzwert für Feed-Aktualisierung + Aus fest zugeordnetem Feed abholen wenn verfügbar + Steht in manchen Diensten zur Verfügung, ist meist viel schneller, liefert aber eventuell eine eingeschränkte Anzahl an Elementen und oft inkomplette Informationen (z. B. keine Videolänge, keinen Elementtyp, keinen Live-Status). + Glaubst du, dass das Laden von Feeds zu langsam ist\? Wenn ja, versuche den Schnelllademodus einzuschalten (du kannst ihn in den Einstellungen oder über die Schaltfläche unten ändern). +\n +\nNewPipe bietet zwei Feed-Ladestrategien: +\n• die Abholung des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. +\n• die Verwendung eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich inkomplett ist. +\n +\nDer Unterschied zwischen den beiden ist, dass der schnellen normalerweise einige Informationen fehlen, wie die Dauer oder der Typ des Elements (keine Unterscheidung zwischen Live-Videos und normalen) und sie eventuell weniger Elemente liefert. +\n +\nYouTube ist ein Beispiel für einen Service, der mit seinem RSS-Feed diese schnelle Methode anbietet. +\n +\nDie Entscheidung läuft also darauf hinaus, was dir lieber ist: Tempo oder genaue Informationen. \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e67bea60d..66f2e7aed 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -458,7 +458,6 @@ Ο εξυπηρετητής δέν υποστηρίζει πολυνηματικές λήψεις, ξαναπροσπαθήστε με @string/msg_threads = 1 Δεν βρέθηκε Μετεπεξεργασία απέτυχε - Εκκαθάριση ολοκληρωμένων λήψεων Διακοπή Μέγιστες επαναπροσπάθειες Μέγιστος αριθμός προσπαθειών προτού γίνει ακύρωση της λήψης diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 6af9723f5..797ee4bf4 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -94,8 +94,8 @@ Nigra Memoru ŝprucfenestran grandecon kaj pozicion Memoru lastan grandecon kaj pozicion de ŝprucfenestro - Uzu rapide, ne preciza serĉon - Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco + Uzi rapide, ne precizan serĉon + Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco. Serĉi por 5, 15 kaj 25 sekundoj ne funckios kun tio opcio. Ŝarĝi bildetojn Ne povis konstrui la dosierujon de elŝuto Nunaj filmetoj ne estas ankoraŭ subtenataj @@ -292,7 +292,7 @@ \nElektu AFM se vi volas elŝuti al ekstera SD-karto Uzu AFM La \"Atinga Framo al la Memoro\" ebligas elŝuti al ekstera SD-karto. -\nKomento: kelkaj aparatoj malkongruas +\nKelkaj aparatoj malkongruas Forviŝi ludajn poziciojn Forviŝi la totalon de ludaj pozicioj Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \? @@ -493,7 +493,6 @@ La servilo ne akceptas plurfadenajn elŝutojn, reprovu kun @string/msg_threads = 1 Ne trovita Postprocesado malsukcesis - Forviŝi la finitajn elŝutojn Utila dum la ŝanĝo al poŝdatumoj, kvankam kelkaj elŝutoj ne povas esti interrompitaj Neniu komento Dosiero kun ĉi tiu nomo jam ekzistas @@ -516,7 +515,7 @@ %s aŭskultantoj La lingvo ŝanĝos kiam la apo restartos. - Rapida antaŭen / posten daŭron + Rapida antaŭen / posten serĉan daŭron Instancoj de PeerTube Elekti viajn preferitajn instancojn de PeerTube Trovu la instancojn ke vi ŝatas ĉe %s @@ -543,8 +542,48 @@ Sistemnormo Premu « Finita » kiam solvita Finita - - %s sekundo - %s sekundoj + + %d sekundo + %d sekundoj + + %d minuto + %d minutoj + + + %d horo + %d horoj + + + %d tago + %d tagoj + + + Abonfluoj grupoj + Lasta ĝisdatigo: %s + Ne ŝarĝitaj: %d + Ŝarĝante abonfluon… + Procesante abonfluon… + Seletkti abonojn + + %d selektita + %d selektitaj + + No subscription selected + Malplena grupa nomo + Nomo + Ĉu vi volas forviŝi tion grupon? + Nova + Abonfluo + Abonflua ĝisdatiga sojlo + Tempo post lasta ĝisdatigo antaŭ abono estas konsiderita malĝisdatigita — %s + Ĉiam ĝisdatigi + Ŝarĝi el dediĉita abonfluo kiam ĝi haveblas + Havebla en kelkaj servoj, ĝi estas ĝenerale multe pli rapida, sed povas doni limigita kvanto da aĵoj kaj ofte malpreciza informoj (ekzemple: neniu duracio, ajâ tipo, neniu « nuna » statuso). + Ŝalti rapidan modon + Malŝati rapidan modon + Pro ExoPlayer limoj, la serĉa daŭro estas metita %d sekundojn + Mutigi + Malmutigi + Helpo \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b6e0386a3..34449b03b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -424,7 +424,6 @@ Hay una descarga pendiente con este nombre Mostrar como grilla Mostrar como lista - Limpiar descargas finalizadas ¿Quiere limpiar su historial de descargas o eliminar todos los ficheros descargados\? Detener Intentos máximos @@ -544,11 +543,58 @@ Pulse en «Hecho» cuando esté resuelto Hecho Vídeos - - %s segundo - %s segundos + + %d segundo + %d segundos Debido a limitaciones de ExoPlayer la duración de la búsqueda fue fijada en %d segundos Silenciar Desactivar silencio + Ayuda + + %d minuto + %d minutos + + + %d hora + %d horas + + + %d día + %d días + + Grupos del feed + Actualización más antigua de suscripciones: %s + No cargado: %d + Cargando contenidos… + Procesando contenidos… + Elegir suscripciones + No hay suscripciones seleccionadas + + %d elegida + %d elegidas + + Nombre de grupo vacío + Nombre + ¿Borrar este grupo\? + Nuevo + Contenido + Velocidad de actualización del feed + Tiempo para que una suscripción se considere desactualizada — %s + Actualizar siempre + Extraer desde feed dedicado cuando esté disponible + Disponible para algunos servicios, suele ser más rápido pero puede mostrar una cantidad limitada de ítems y a menudo información incompleta (por ejemplo falta de duración, tipo de ítem o estado). + Activar modo rápido + Desactivar modo rápido + ¿Piensas que la carga de contenidos es muy lenta\? Entonces intenta habilitar la carga rápida (puedes cambiarlo en los ajustes o presionando el botón debajo). +\n +\nNewpipe ofrece dos formas de cargar los contenidos: +\n• Obtener todos los canales con suscripciones, lento pero completo. +\n• Usar un punto dedicado de servicio, más rápido pero usualmente incompleto. +\n +\nLa diferencia es que en la forma rápida usualmente falta algo de información, como la duración o tipo de ítem (no se puede diferenciar entre videos normales y en vivo) y puede que aparezcan menos ítems. +\n +\nYouTube es un ejemplo de un servicio que ofrece este método rápido con su listado de contenidos por RSS. +\n +\nEntonces la elección se limita a qué prefieres: velocidad o información exacta. \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 6521c1d45..43003d5e5 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -359,7 +359,6 @@ \nKas jätkata? Taasesituse kiiruse juhtimine "Tempo " - Vaikimisi Nõustu Keeldu Piiranguta @@ -459,7 +458,6 @@ Server ei toeta mitmelõimelisi allalaadimisi. Proovi uuesti kasutades @string/msg_threads = 1 Ei leitud Järeltöötlemine nurjus - Eemalda lõpetatud allalaadimised Stopp Korduskatseid Suurim katsete arv enne allalaadimise tühistamist diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index e8bd8a9a7..3f6d22cb7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -374,7 +374,6 @@ Tempoa Tonua Desaktibatu (distortsioa sor lezake) - Lehenetsia Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du. 5, 15 edo 25 segundo bilatzea ez du honekin funtzionatzen. Desgaitu koadro txikiak ez kargatzeko, datuak eta memoria aurreztuz. Aldaketak memoria eta diskoko irudien cacheak garbituko ditu. @@ -458,7 +457,6 @@ Zerbitzariak ez ditu hainbat hariko deskargak onartzen, saiatu @string/msg_threads = 1 erabilita Ez aurkitua Post-prozesuak huts egin du - Garbitu amaitutako deskargak Gelditu Gehienezko saiakerak Deskarga ezeztatu aurretik saiatu beharreko aldi kopurua @@ -544,9 +542,9 @@ Sakatu \"Egina\" konponduta dagoenean Egina Bideoak - - %s segundu - %s segundu + + %d segundu + %d segundu ExoPlayer-en mugak direla eta bilaketaren iraupena %d segundotan ezarri da \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 36e3524c7..fa121dce2 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -460,7 +460,6 @@ ناتوانی در اتصال به کارساز کارساز داده‌ای نمی‌فرستد کارساز، بارگیری‌های چندرشته‌ای را قبول نمی‌کند، تلاش مجدد با ‎@string/msg_threads = 1 - پاک کردن بارگیری‌های تمام شده توقف بیشینه تلاش مجدد این ویژگی زمانی که ارتباط را به داده همراه تغییر می‌دهید مفید است هرچند برخی بارگیری‌ها نمی‌توانند تعلیق شوند diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c41d5c54f..14556f1c3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -147,7 +147,6 @@ Désabonné de la chaîne Principal Abonnements - Nouveautés Téléchargement Paramètres À propos @@ -361,7 +360,6 @@ Contrôles de vitesse de lecture Cadence Détacher (peut causer des déformations) - Défaut Ouvrir de préférence avec Action par défaut lors de l’ouverture de contenu — %s Aucun flux disponible au téléchargement @@ -454,7 +452,6 @@ Impossible de se connecter au serveur Le serveur n’envoie pas de données Introuvable - Effacer les téléchargements terminés Interrompre sur les connexions limitées Utile lors du basculement aux données mobiles, bien que certains téléchargements ne peuvent pas être suspendus Mode de vue en liste @@ -544,11 +541,61 @@ Appuyez sur « Terminé » une fois résolu Terminé Vidéos - - %s seconde - %s secondes - En raison des contraintes d’ExoPlayer, le pas de déplacement a été réglée à %d secondes Couper le son Remettre le son + + %d seconde + %d secondes + + + + %d minute + %d minutes + + + %d heure + %d heures + + + %d jour + %d jours + + + Nouveautés + Groupes d\'abonnements + Dernière mise à jour : %s + Pas chargés : %d + Chargement du flux… + Préparation du flux… + Choisir les abonnements + Aucun abonnement sélectionné + + %d sélectionné + %d sélectionnés + + Nom de groupe vide + Nom + Voulez-vous supprimer ce groupe ? + Nouveau + Flux + Seuil de mise à jour du flux + Temps depuis la dernière mise à jour pour que le flux ne soit plus considéré comme à jour — %s + Toujours mettre à jour + Charger depuis un service dédié quand c\'est possible + Disponible pour quelques services, c\'est généralement bien plus rapide mais peut retourner un nombre d\'élements limité et des informations souvent incomplètes (ex : pas de durée, pas de statut « En direct ». + Activer le mode rapide + Désactiver le mode rapide + Pensez-vous que la chargement du flux est trop lent \? Si c\'est le cas, essayez le mode rapide (vous pouvez changer le mode dans les paramètres ou en pressant le bouton en dessous). +\n +\n NewPipe propose deux manières de charger le flux : +\n • Charger toutes les chaines auquelles vous êtes abonnés, cette manière est lente mais complète. +\n • Charger depuis un service dédié, cette manière est plus rapide mais souvent incomplète. +\n +\n La différence entre les deux est que la méthode rapide manque souvent de quelques informations, comme la durée d\'un élément ou le type (nous ne pouvons pas différencier les vidéos en direct des vidéos normales) et pourrait retourner moins d\'éléments. +\n +\n YouTube est un exemple qui offre cette méthode rapide avec le flux RSS. +\n +\n Donc le choix vous revient : Préferez-vous la vitesse ou des informations précises \? + Aide \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index a3f4583cb..3c665b7f6 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -331,7 +331,6 @@ \n2. להיכנס אם נתבקשת \n3. ההורדה אמורה להתחיל (זה קובץ הייצוא) קצב - ברירת מחדל שימוש בחיפוש מהיר ולא מדויק חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת. טעינת תמונות ממוזערות @@ -463,7 +462,6 @@ "השרת לא מקבל הורדות רב ערוציות, מוטב לנסות שוב עם ‎@string/msg_threads = 1 " לא נמצא העיבוד המאוחר נכשל - פינוי ההורדות שהסתיימו עצירה מספר הניסיונות החוזרים המרבי מספר הניסיונות החוזרים המרבי בטרם ביטול ההורדה @@ -556,13 +554,68 @@ יש ללחוץ על „סיום” לאחר הפתירה סיום סרטונים - - %s שניות - %s שניות - %s שניות - %s שניות + + שנייה אחת + %d שניות + %d שניות + %d שניות עקב מגבלות של ExoPlayer מגבלות טווחי החיפוש הוגדרו לכדי %d שניות השתקה ביטול השתקה + עזרה + + דקה + %d דקות + %d דקות + %d דקות + + + שעה + שעתיים + %d שעות + %d שעות + + + יום + יומיים + %d ימים + %d ימים + + קבוצות הזנות + העדכון הישן ביותר למינוי: %s + לא נטען: %s + ההזנה נטענת… + ההזנה בהליכי עיבוד… + בחירת מינויים + לא נבחר מינוי + שם הקבוצה ריק + שם + למחוק את הקבוצה הזאת\? + חדשה + הזנה + סף עדכון ההזנה + לעדכן תמיד + הפעלת מצב מהיר + השבתת מצב מהיר + + נבחר אחד + %d נבחרו + %d נבחרו + %d נבחרו + + הזמן לאחר העדכון האחרון בטרם מינוי נחשב לבלתי עדכני — %s + לקבל מהזנה ייעודית כשניתן + זמין בחלק מהשירותים, האפשרות הזאת בדרך כלל מהירה יותר אך עשויה להחזיר כמות מוגבלת של פריטים ולעתים פרטים חלקיים (למשל: חסר משך הפרק, סוג הפריט, אין מצב חי). + לדעתך הטעינה אטית מדי\? אם זה המצב אצלך, כדאי לנסות להפעיל טעינה מהירה (ניתן לשנות בהגדרות או על ידי לחיצה על הכפתור שלהלן). +\n +\nהיישומון NewPipe מציע שתי אסטרטגיות לטעינת הזנה: +\n• הורדת כל ערוץ המינוי, אטי אבל שלם. +\n• באמצעות נקודת קצה ייעודית, מהיר אבל חלקי. +\n +\nההבדל בין השתיים הוא שבמהירה חסרים פרטים, כמו משך הפריט או סוגו (אין אפשרות להבדיל בין סרטונים חיים לרגילים) והיא עשויה להחזיר פחות פריטים. +\n +\nYouTube זאת דוגמה לשירות שמציע את השיטה המהירה הזאת עם הזנת ה־RSS שלו. +\n +\nלכן עומדת בפניך הבחירה: מהירות או דיוק בפרטים. \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index f08274263..b1a54570f 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -437,7 +437,6 @@ सर्वर डेटा नहीं भेजता है नहीं मिला प्रक्रिया के बाद का कार्य विफल रहा - समाप्त डाउनलोड साफ़ करें रुको अधिकतम पुनर्प्रयास डाउनलोड रद्द करने से पहले प्रयासों की अधिकतम संख्या diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index e3da3e711..4a5dece13 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -17,9 +17,9 @@ Izaberi pretraživač rotacija Koristi vanjski reproduktor videozapisa - Uklanja zvuk na NEKIM rezolucijama + Uklanja zvuk na nekim rezolucijama Koristi vanjski reproduktor za zvuk - NewPipe skočni prozor + Skočni prozor Pretplati se Pretplaćeno Pretplata na kanalu otkazana @@ -63,7 +63,7 @@ Svaku pretragu spremi lokalno Prati povijest Pratite pogledane videozapise - Nastavi nakon dobivanja fokusa + Nastavi reprodukciju Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi) Preuzmi Sljedeće @@ -80,7 +80,7 @@ Sadržaj Prikaži eksplicitni sadržaj Videozapis je dobno ograničen. Dopuštanje takvog sadržaja moguće je u postavkama. - UŽIVO + Uživo Preuzimanja Preuzimanja Prijavi grešku @@ -109,7 +109,7 @@ Oprostite, ovo se nije trebalo dogoditi. Prijavi pogrešku putem e-maila Oprostite, neke greške su se dogodile. - PRIJAVI + Prijavi Informacije: Što se dogodilo: Što:\\nRequest:\\nContent Jezik:\\nService:\\nGMT Vrijeme:\\nPackage:\\nVersion:\\nOS version: @@ -129,7 +129,7 @@ Videozapis Zvuk Ponovno pokušaj - Dozvola za pisanje po pohrani je odbijena + Omogućite pristup pohrani prvo tis. mil mlrd. @@ -276,7 +276,7 @@ Ispuniti Povećaj Auto generirano - Omogući \"LeakCanary\" + LeakCanary Monitoring curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile Izvijestite o pogreškama izvan životnog ciklusa Prikaži informacije @@ -301,7 +301,7 @@ Poništava vašu trenutnu povijest i pretplate Izvoz povijesti, pretplata i playlisti Očisti povijest gledanja - Briše povijest reproduciranih streamova + Briše povijest reproduciranih streamova i pozicije reprodukcije Obriši cijelu povijest gledanja\? Povijest gledanja izbrisana. Obriši povijest pretraživanja @@ -449,14 +449,13 @@ Odredišnu mapu nije moguće stvoriti Datoteku nije moguće stvoriti Sustav je odbio dozvolu - Sigurna veza nije uspjela + Nije moguće uspostaviti sigurnu vezu Nije moguće pronaći server Nije moguće povezati se s serverom Server ne šalje podatke Poslužitelj ne prihvaća preuzimanja s više niti, pokušaj ponovo s @string/msg_threads = 1 Nije pronađeno Naknadna obrada nije uspjela - Obriši završena preuzimanja Stop Maksimalnih ponovnih pokušaja Maksimalni broj pokušaja prije poništavanja preuzimanja @@ -477,4 +476,46 @@ "Projekt NewPipe ozbiljno shvaća vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka. \nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i pohranjuju kada šaljete izvješće o padu aplikacije." Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), upozoravamo vas na politiku privatnosti tvrtke NewPipe. Pažljivo ga pročitajte. Morate ga prihvatiti da nam pošaljete izvješća o pogreškama. + Nastavi reprodukciju + Vrati zadnji položaj reprodukcije + Pozicije na popisima + Prikaži poziciju reprodukcije na listi + Obriši podatke + Pozicije reprodukcije su izbrisane. + Datoteka je premještena ili izbrisana + U tijeku je preuzimanje s ovim nazivom + Vrijeme povezanosti je isteklo + Želite li očistiti povijest preuzimanja ili izbrisati sve preuzete datoteke\? + Započni preuzimanja + Zaustavi preuzimanja + Pitaj gdje preuzeti + Obriši poziciju reprodukcije + Obriši sve pozicije reprodukcije + Obriši sve pozicije reprodukcije\? + Nitko ne gleda + NItko ne sluša + Jezik će se promjeniti nakon ponovnog pokretanja aplikacije. + Zadani Kiosk + Podržani su samo HTTP URL-ovi + Lokalno + Nedavno dodano + Automatski generirano (nije pronađen nijedan autor) + Očisti povijest preuzimanja + Izbriši preuzete datoteke + Obrisano %1$s preuzimanja + Dajte dopuštenje za prikazivanje na vrhu + Jezik aplikacije + Zadani sustav + Videozapisi + Isključi + Uključi + Pomoć + Učitavanje feeda… + Ime + Želite li izbrisati ovu grupu\? + Novi + Uvijek ažuriraj + Omogući brz način + Onemogući brz način + Memorija uređaja je popunjena \ No newline at end of file diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 822d714f6..e6334f400 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -120,4 +120,57 @@ Cambia a Principal Vacuar le chronologia de reproductiones Videos + Dele le chronologia del contenido reguardate e positiones de reproduction + Positiones de reproduction delite. + Vacuar le chronologia de cerca + Error de rete + Contento non disponibile + Fluxos in directe ancora non supportate + Non poteva reproducer iste video + URL invalide + Necun fluxo de video trovate + Necun fluxo de audio trovate + Le dossier non existe + Le nomine del file non pote esser vacue + Information: + Tu commento (in anglese): + Detalios: + Usar Tor + Retentar + Nulle reproductiones + Nulle videos + Nulle commentos + Initiar + Deler + Deler un + Deler omne + Renominar + Nomine de file + Servitor non supportate + Le file jam existe + NewPipe discargante + A proposito de NewPipe + Configurationes + A proposito de + © %1$s per %2$s sub %3$s + Aperir sito web + A proposito de + Licentias + Contribuer + Vider in GitHub + Sito web + Visita le sito web de NewPipe pro plus de informationes e novitates. + Licentia de NewPipe + Leger le licentia + Recercas + Reproductiones + Le chronologia es disactivate + Chronologia + Le chronologia es vacue + Chronologia vacue + Ultime reproductiones + Le plus reproducite + Contento del pagina principal + Selige un canal + Preste \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index b4db9141d..924c587ce 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -310,7 +310,6 @@ Perbesar Otomatis dibuat LeakCanary - Bawaan Pemutar stream tidak ditemukan (anda bisa memasang VLC untuk memutarnya). Unduh berkas stream Tidak bisa merubah subscription @@ -452,7 +451,6 @@ Server tidak menerima unduhan multi-utas, coba lagi dengan @string/msg_threads = 1 Tidak ditemukan Pengolahan-pasca gagal - Hapus unduhan yang sudah selesai Berhenti Percobaan maksimum Jumlah upaya maksimum sebelum membatalkan unduhan @@ -538,8 +536,39 @@ Durasi maju/mundur cepat Tekan \"Selesai\" saat selesai Video - - %s detik + + %d detik Karena kendala ExoPlayer, durasi pencarian ditetapkan ke %d detik + Bantuan + + %d menit + + + %d jam + + + %d hari + + Grup feed + Pembaruan subscription terlama: %s + Tidak dimuat: %d + Memuat feed… + Memproses feed… + Pilih subscription + Tidak ada subscription yang dipilih + + %d dipilih + + Nama grup kosong + Nama + Apakah anda ingin menghapus grup ini\? + Baru + Feed + Threshold pembaruan feed + Waktu setelah pembaruan terakhir sebelum subscription dianggap kedaluwarsa — %s + Selalu diperbarui + Tersedia pada beberapa layanan, biasanya lebih cepat tetapi memperbarui lebih sedikit item dan sering kali dengan informasi yang tidak lengkap (mis. tanpa durasi, tanpa tipe item, tanpa status live). + Aktifkan mode cepat + Nonaktifkan mode cepat \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1ad3bc218..f760e7b72 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -362,7 +362,6 @@ Tempo Tono Scollega (può causare distorsione) - Valore predefinito Nessun flusso disponibile per il download \'Apri\' preferibilmente con Azione predefinita all\'apertura del contenuto — %s @@ -456,7 +455,6 @@ Il server non accetta download multipli, riprovare con @string/msg_threads = 1 Non trovato Post-processing fallito - Pulisci i download completati Ferma Numero Massimo Tentativi Quante volte provare prima di annullare il download @@ -544,11 +542,57 @@ Premere \"Fatto\" quando risolto Fatto Video - - %s secondi - %s secondi + + %d secondo + %d secondi A causa dei vincoli di ExoPlayer la durata dello spostamento rapido è stata impostata a %d secondi Silenzia Riattiva audio + Aiuto + + %d minuto + %d minuti + + + %d ora + %d ore + + + %d giorno + %d giorni + + Gruppi Feed + Aggiornamento iscrizioni più vecchie: %s + Non caricate: %d + Caricamento feed… + Elaborazione feed… + Seleziona Iscrizioni + Nessuna iscrizione selezionata + + %d selezionato + %d selezionati + + Nome + Eliminare questo gruppo\? + Nuovo + Feed + Limite Aggiornamento Feed + Tempo che deve trascorrere dopo l\'ultimo aggiornamento, prima che un\'iscrizione venga considerata obsoleta — %s + Aggiorna Sempre + Recupero da Feed Dedicato quando Disponibile + Disponibile per alcuni servizi. Solitamente è molto più veloce, ma può restituire una quantità limitata di elementi e informazioni spesso incomplete (es. durata, tipo di elemento, indicatore per video in diretta). + Attiva Recupero Veloce + Disattiva Recupero Veloce + Il caricamento dei feed è troppo lento\? Prova ad abilitare il caricamento veloce (nelle impostazioni o premendo il pulsante qui sotto). +\n +\nNewPipe dispone di due metodi per il caricamento dei feed: +\n• Recuperando l\'intero canale, lento ma completo. +\n• Utilizzando un endpoint dedicato, veloce ma solitamente incompleto. +\n +\nLa differenza è che quello veloce solitamente offre meno informazioni, come la durata o il tipo di elemento (non distingue i video normali da quelli in diretta), e può restituire meno elementi. +\n +\nYouTube è un esempio di servizio che offre questo metodo veloce tramite i suoi feed RSS. +\n +\nLa scelta va fatta in base alle proprie preferenze: velocità o informazioni precise. \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 16ee3ed03..409e04ef2 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -305,7 +305,6 @@ 登録リストがエクスポートできませんでした 速度 音程 - デフォルト バックグラウンド再生の順番待ちに追加 ポップアップ再生の順番待ちに追加 再生履歴を消去 @@ -442,7 +441,6 @@ サーバが同時接続ダウンロードを受け付けません。再試行してください @string/msg_threads = 1 見つかりません 保存処理に失敗しました - 完了済みを一覧から削除します 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 @@ -537,10 +535,53 @@ 解けたら \"完了\" を押してください 完了 動画 - - %s 秒 + + %d 秒 ExoPlayer の制約のためシーク間隔は %d 秒に設定されました ミュート ミュート解除 + ヘルプ + + %d 分 + + + %d 時間 + + + %d 日 + + フィード グループ + 最も古い登録チャンネルの更新: %s + 読み込み失敗: %d + フィードを読み込み中… + フィードを処理中… + チャンネルを選択 + チャンネルが選択されていません + + %d 選択中 + + グループ名が空です + グループ名 + このグループを削除しますか? + 新規 + フィード + フィードの更新間隔 + 最後の更新後、登録チャンネルを更新すべきとするまでの時間 ― %s + 常に更新する + 利用可能な場合は専用フィードから取得 + いくつかのサービスで利用可能、通常よりも高速ですが制限された情報が取得され、たいていの場合不完全です (例: 再生時間、種類、ライブ ステータスなどがない)。 + 高速モードを有効化 + 高速モードを無効化 + フィードの読み込みが遅すぎると思いますか? その場合、高速読み込みを有効化してみてください (設定、もしくは下のボタンを押して変更することができます)。 +\n +\nNewPipe は2つの読み込み方法を提供します: +\n・登録チャンネル全体を取得します。これは低速ですが完全です。 +\n・専用のサービス エンドポイントを使用します。これは高速ですが、たいていの場合不完全です。 +\n +\n2つの違いとして、高速なものは通常、再生時間や種類 (ライブと通常の動画を区別できない) などの情報が不足して、正しい量の情報より少なく取得することがあります。 +\n +\nYouTubeは、この高速な読み込み方法をRSSフィードで提供するサービスのひとつです。 +\n +\nつまり、読み込み方法の選択は速度または正確さのどちらを優先するか、あなたの好みによります。 \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4935c4bdb..59434eb00 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -358,7 +358,6 @@ 템포 피치 영상과 소리 분리 (소리가 깨질 수 있음) - 기본 다운로드 가능한 스트림이 없습니다 이 파일을 재생할 수 있는 플레이어 앱이 없습니다 선호하는 열기 동작 @@ -453,7 +452,6 @@ 서버가 다중 스레드 다운로드를 받아들이지 않습니다, @string/msg_threads = 1 를 사용해 다시 시도해보세요 HTTP 찾을 수 없습니다 후처리 작업이 실패하였습니다 - 완료된 다운로드 비우기 멈추기 최대 재시도 횟수 다운로드를 취소하기 전까지 다시 시도할 최대 횟수 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 43b32a29d..0172ac502 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -22,7 +22,7 @@ به‌كارهێنانی كارپێكه‌ری ڤیدیۆی ده‌ره‌كی هه‌نێ له‌ قه‌باره‌كان ده‌نگیان تێدا نابێت به‌كارهێنانی كارپێكه‌ری ده‌نگی ده‌ره‌كی - په‌نجه‌ره‌ی بچووکی NewPipe + دۆخی په‌نجه‌ره‌ی بچووک به‌شداربوون به‌شداربوویت به‌شداریت نەما له‌ كه‌ناڵ @@ -37,15 +37,15 @@ په‌نجه‌ره‌ی بچووک زیادکردن بۆ فۆڵدەری داگرتنی ڤیدیۆ - ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن - پەڕگەی داگرتن بۆ ڤیدیۆکان هەڵبژێرە + پەڕگەی ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن + فۆڵدەری داگرتن بۆ پەڕگەی ڤیدیۆکان هەڵبژێرە فۆڵدەری داگرتنی ده‌نگ - دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن - پەڕگەی داگرتنی دەنگەکان هەڵبژێرە + پەڕگەی دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن + فۆڵدەری داگرتنی پەڕگە دەنگییەکان هەڵبژێرە كاركردنی خۆكارانه‌ - قه‌باره‌ی بنەڕەتی + وردی بنەڕەتی قه‌باره‌ی بنەڕەتی په‌نجه‌ره‌ی بچووک - پیشاندانی قه‌باره‌ی به‌رزتر + پیشاندانی وردی به‌رزتر تەنها چەند مۆبایلێک پشتگیری کارپێکردنی ڤیدیۆی 2K/4K دەکەن كارپێكردن به‌ Kodi ئەپەکە نه‌دۆزرایه‌وه‌. دابمه‌زرێت؟ @@ -64,14 +64,14 @@ ناچالاكی بكه‌ بۆ ڕاگرتنی وێنۆچكه‌كان له‌ باركردن و پاشه‌كه‌وتبوون له‌سه‌ر بیرگه‌ی ئامێره‌كه‌ت. \nگۆڕینی ئه‌مه‌ ده‌بێته‌ هۆی سڕینه‌وه‌یان له‌سه‌ر بیرگه‌ی مۆبایله‌كه‌ت. پاشماوه‌ی وێنۆچكه‌كان سڕایه‌وه‌ - ڤیدیۆ کارپێبکرێ کاتێ NewPipe لە ئەپێکیتر کرایەوە - بەکارهێنانی بەدواگەڕانی ناتەواوی خێرا + ڤیدیۆ کارپێبکرێ کاتێ ئەپەکە لە ئەپێکیتر کرایەوە + بەکارهێنانی بردنەپێشی ناتەواوی خێرا خاوێنکردنەوەی پاشماوەی داتا سڕینەوەی پاشماوەی هەموو داتاکان پاشماوەی داتاکان سڕانەوە ڕیزکردنی خۆکاری کارپێکردنی دواتر کۆنتڕۆڵی کارپێکەر بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ و ڕووناکی + جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ و ڕووناکی گەڕانی پێشنیارکراوەکان پیشاندانی پێشنیارەکان لەکاتی گەڕان مێژووی گەڕان @@ -84,7 +84,7 @@ بەستەرەکە پشتگیری نەکراوە وڵاتی بنەڕەتی خزمەتگوزاری - کارپێکەری ڤیدیۆ + کارپێکەر ڤیدیۆ & دەنگ مێژوو & پاشماوە پەنجەرەی بچووک @@ -98,11 +98,11 @@ کارپێکردن ناوەڕۆک سنوردانانی تەمەن - زیندو + زیندوو داگرتنەکان داگرتنەکان ناتوانرێ سکاڵابکرێ - هەمووی + گشتی کەناڵ لیستی کارپێکردن بەڵێ @@ -114,12 +114,12 @@ قەبارە دانانەوە باشترین قەبارە گەڕانەوە - کارپێکردنی هەمووی + کارپێکردنی گشتی هەمیشە تەنها ئێستا - فایل - ئاگانامەکانی NewPipe - ئاگانامەکانی NewPipe بۆ پاشبنەما و کارپێکردنەکانی پەنجەرەی بچووک + پەڕگە + ئاگانامەکانی ئەپ + ئاگانامەکانی ئەپ بۆ پاشبنەما و کارپێکردنەکانی پەنجەرەی بچووک (نەزانراو) چەسپاندنی لاربوونەوە گۆڕین بۆ پاشبنەما @@ -140,13 +140,13 @@ هیچ پەخشێ نەدۆزرایەوە ناتوانرێ وێنە باربکرێ ئەپ/ڕووکار ڕاوەستا - ناتوانرێ ئەم پەخشە لێبدرێ + ناتوانرێ ئەم پەخشە کارپێبکرێ کارپێکەرە ڤیدیۆییە دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن بەستەر هەڵەیە هیچ پەخشێکی ڤیدیۆیی نەدۆزرایەوە پەخشی هیچ دەنگێک نەدۆزرایەوە - ئەو فایلە بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە - ناوی فایل ناکرێ بەتاڵ بێت + ئەو پەڕگەیە بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە + ناوی پەڕگە ناکرێ بەتاڵ بێت هەڵەیەک ڕوویدا : %1$s ببوورە، ناتوانرێ ئەوە ڕووبدات. سکاڵا لەسەر کێشە لەڕێگای ئیمێڵ @@ -188,8 +188,8 @@ هیچ ڤیدیۆیەک نییە - ڤیدیۆ - ڤیدیۆکان + %s ڤیدیۆ + %s ڤیدیۆکان دەستپێکردن ڕاگرتن @@ -197,18 +197,18 @@ دروستکردن سڕینەوە سڕینەوەی یەک دانە - سڕینەوەی هەمووی + سڕینەوەی گشتی تاقیکردنەوەی هێڵێک ڕێپێنەدان دانانەوەی ناو ئەرکی نوێ باشە - ناوی فایل + ناوی پەڕگە دابەشکراوەکان کێشە ڕوویدا سێرڤەر پشتگیرینەکراوە - فایل بوونی هەیە - داگرتنەکانی NewPipe + پەڕگە بوونی هەیە + داگرتنەکانی ئەپ گرتەبکە بۆ وردەکاری تکایە چاوەڕێبکە… لەبەرگیرایەوە @@ -220,7 +220,7 @@ داگرتن پیت و ژمارەکان هێما تایبەتییەکان - دەربارەی NewPipe + دەربارەی ئەپ ڕێکخستنەکان دەربارە © %1$s لەلایەن %2$s لەژێر %3$s @@ -236,7 +236,7 @@ ئەم ئەپە لەلایەن چەند خۆبەخشێکەوە دروستکراوە کەکاتی خۆیان پێ بەخشیووە تاکو باشترین خزمەتگوزاریت پێشکەش بکەن. هیچ نەبێت بە کڕینی کوپێک قاوە یارمەتی گەشەپێدەرەکانمان بدە بۆ ئەوەی کاتی زیاتر تەرخان بکەین بۆ بەرەوپێشبردنی NewPipe. پێدانەوە ماڵپەڕ - سەردانی ماڵپەڕی NewPipe بکە بۆ زانیاری و هەواڵی نوێ. + سەردانی ماڵپەڕی ئەپەکەمان بکە بۆ زانیاری و هەواڵی نوێ. خوێندنەوەی مۆڵەتنامە مێژوو گەڕا @@ -266,19 +266,19 @@ هەمیشە بپرسە دەستکەوتنی زانیاری… بارکردنی ناوەڕۆکی داواکراو - لیستی نوێ + خشتەی کارپێکردنی نوێ سڕینەوە ناوںْوسینەوە ناو - زیادکردن بۆ لیست - دانان لەسەر وێنۆچکەی لیست - لیستی نیشانەکراو + زیادکردن بۆ خشتەی کارپێکردن + دانان لەسەر وێنۆچکەی خشتەی کارپێکردن + خشتەی کارپێکردنی نیشانەکراو لادانی نیشانەکراو - ئەم لیستە بسڕدرێتەوە؟ - لیست دروستکرا - لیست دانرا - وێنۆچکەی لیست گۆڕدرا. - ناتوانی ئەم لیستە بسڕیتەوە. + ئەم خشتەی کارپێکردنە بسڕدرێتەوە؟ + خشتەی کارپێکردن دروستکرا + خشتەی کارپێکردن دانرا + وێنۆچکەی خشتەی کارپێکردن گۆڕدرا. + ناتوانی ئەم خشتەی کارپێکردنە بسڕیتەوە. هیچ ژێرنووسێک نییە گونجاو بە ڕونما پڕ بە ڕونما @@ -293,15 +293,15 @@ خەزنکردن بۆ دەهێنرێتەوە… خەزندەکرێ… - هێنانەوەی فایل + هێنانەوەی پەڕگە خەزنی پێشووتر ناتوانرێ بەشدارییەکان بهێنرێتەوە ناتوانرێ بەشدارییەکان خەزن بکرێن - بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە فایلی خەزن بوو بگەڕێنیتەوە: -\n -\n1. ئەم بەستەرە بکەوە: %1$ -\n2. بچۆرەژوورەوە گەر داوای‌ کرد -\n3. داگرتنێک دەست پێدەکات (ئەمە فایلی خەزنکراوە) + بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە پەڕگەی خەزن بوو بگەڕێنیتەوە: +\n +\n1. ئەم بەستەرە بکەوە: %1$ +\n2. بچۆرەژوورەوە گەر داوای‌ کرد +\n3. داگرتنێک دەست پێدەکات (ئەمە پەڕگەی خەزنکراوە) هێنانەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی: \n \n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە) @@ -312,14 +312,14 @@ ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە. \n \nدەتەوێ بەردەوامبیت؟ - کۆنترۆڵی خێرایی + کۆنترۆڵی خێرایی کارپێکەر خێراییەکان شەپۆلی دەنگ سڕینەوەی بەستەر (ڕەنگە ببێتە هۆی تێکدان) هیچ پەخشێک نییە بۆ داگرتن - ژێرنووس + ژێرنووسەکان بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە ئەپەکە دابخەیت و دیسانەوە بیکەیتەوە. - هیچ ئەپێک دانەمەزراوە بۆ کارپێکردنی ئەم فایلە + هیچ ئەپێک دانەمەزراوە بۆ کارپێکردنی ئەم پەڕگەیە سڕینەوەی مێژووی تەماشاکردن مێژوو دەسڕێتەوە لەگەڵ ڤیدیۆ کارپێکراوەکان و شوێنی لیستە ڤیدیۆییەکان سڕینەوەی تەواوی مێژووی تەماشاکردن؟ @@ -330,9 +330,9 @@ 1 بابەت سڕایەوە. ئەم ئەپە سەرچاوە کراوەیە : دەتوانی بەکاریبهێنی، بیخوێنیتەوە و هاوبەشی پێبکەیت و بەرەوپێشی ببەیت. \nبەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک ئەپێکی بڵاوی خۆڕایی! - سیاسەتی تایبەتی NewPipe - پڕۆژەی NewPipe زانیارییە تایبەتییەکانت بەوردی دەپارێزێ. هەروەها ئەپەکە هیچ داتایەک بەبێ ئاگاداری تۆ بەکارنابات. -\nسیاسەتی تایبەتی NewPipe بەوردەکاری ڕوونکردنەوەت دەداتێ لەسەر ئەو داتایانەی وەریاندەگرێ و بەکاریاندەبات. + سیاسەتی تایبەتی ئەپ + پڕۆژەی ئەپەکە زانیارییە تایبەتییەکانت بەوردی دەپارێزێ. هەروەها ئەپەکە هیچ داتایەک بەبێ ئاگاداری تۆ بەکارنابات. +\nسیاسەتی تایبەتی ئەپ بەوردەکاری ڕوونکردنەوەت دەداتێ لەسەر ئەو داتایانەی وەریاندەگرێ و بەکاریاندەبات. خوێندنەوەی سیاسەتی تایبەتی کەناڵەکان لیستی کارپێکردنەکان @@ -342,14 +342,14 @@ پەڕەیەکی نوێ هەڵبژاردنی پەڕە کۆنترۆڵی دەنگ بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ + جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕونما + جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان - فایل سڕایەوە + پەڕگە سڕایەوە ئاگانامەی نوێکاری ئەپ - ئاگانامەکانی وەشانی نوێی NewPipe + ئاگانامەکانی وەشانی نوێی ئەپ بیرگەی دەرەکی بەردەست نییە داگرتن لە بیرگەی دەرەکی ناکرێت. \nشوێنی فۆڵدەری داگرتنەکان دابنرێتەوە؟ @@ -358,9 +358,9 @@ ژمارەی بەشداربووان نادیارە داگرتنێکیترت هەیە بەهەمان ناو پیشاندانی کێشە - کۆد + هێما فۆڵدەری مەبەست ناتوانرێ دروست بکرێ - فایل ناتوانرێ دروستبکرێ + پەڕگە ناتوانرێ دروستبکرێ ڕێگەپێدان ڕەتکرایەوە لەلایەن سیستەمەوە پەیوەستبوونی پارێزراو شکستی هێنا ناتوانرێ ڕاژە بدۆزرێتەوە @@ -372,8 +372,8 @@ ناچالاککردن بۆ پیشان نەدانی لێدوانەکان کارپێکردنی خۆکاری - لێدوان - لێدوانەکان + %s لێدوان + %s لێدوانەکان هیچ لێدوانێک نییە کارپێکردنەوەی لیست @@ -382,7 +382,7 @@ سڕینەوەی داتا مێژووی تەماشاکردن سڕایەوە. شوێنی کارپێکراوەکان سڕانەوە. - شوێنی فایل گۆڕدراوە یان سڕاوەتەوە + شوێنی پەڕگە گۆڕدراوە یان سڕاوەتەوە داگرتنێکیتر هەیە بەهەمان ناو سڕینەوەی شوێنی کارپێکراوەکان شوێنی هەموو کارپێکراوەکان دەسڕێتەوە @@ -399,7 +399,7 @@ %s گوێی لێدەگرێ %s گوێی لێدەگرن - داواکردنی ناتەواو وا لە کارپێکەرەکە دەکات زۆر بەخێرایی شوێنەکان بگۆڕێت لەگەڵ وردییەکی داشکێنراو + بردنەپێشی ناتەواوی خێرا وا لە کارپێکەرەکە داکات کە بەخێرایی شوێنەکە بگۆڕێت. بردنەپێشی ٥ یان ١٥ یان ٢٥ چرکەیی لەگەڵ ئەمەدا کارناکات. پاشکۆی خۆکاری پەخشێکی بەستراوە لەکاتی کارپێکردنی کۆتا پەخشدا کۆگای گەڕانی نێوخۆیی گێڕانەوە لەدۆخی سەرنج @@ -411,16 +411,16 @@ نەگێڕانەوەی کارپێکەر بۆ پێش کێشە ڕوویدا گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە هەمان فۆڵدەر بوونی نییە - هەمان فایل/بابەت بوونی نییە + هەمان پەڕگە/بابەت بوونی نییە چی:\\nداواکراو:\\nناوەڕۆک:\\nلانگ:\\nخزمەتگوزاری:\\nGMT:\\nکات:\\nپاکێج:\\nوەشان:\\nوەشانی سیستەم: |(تاقیکاری) داگرتنی خێرا بەبەکارهێنانی Tor بۆ زیادکردنی تایبەتێتی (پشتگیری پەخشە ڕاستەوخۆکان ناکات) . بەستەر هەڵەیە یاخوود بەئینتەرنێتەوە پەیوەست نەبوویت - هێما ڕێگەپێدراوەکان لە فایلێکی ناویدا + هێما ڕێگەپێدراوەکان لە پەڕگەیەکی ناویدا هێما نادروستەکان بەم بەهایە جێگۆڕکێ دەکرێن هێمای جێگۆڕین مۆڵەتنامەی ئەپ ئەپێکی خۆڕایی و کێشی کەم بۆ پەخشی ڕاستەوخۆ لەسەر ئەندرۆید. - مۆڵەتنامەی NewPipe + مۆڵەتنامەی ئەپ پەڕەی بەتاڵ پەڕەی کیۆسک پەڕەی بەشدارییەکان @@ -431,8 +431,8 @@ هەڵبژاردنی کیۆسک خەزنکرا هێنرایەوە - فایلی ZIP دروست نییە - ئاگاداربە: ناتوانرێ هەمان فایلەکان بهێنرێنەوە. + پەڕگەی ZIP دروست نییە + ئاگاداربە: ناتوانرێ هەموو پەڕگەکان بهێنرێنەوە. ئەمە لەسەر ڕێکخستنەکانی ئێستات جێگیردەبێت. کیۆسک پڕبینەرەکان @@ -467,11 +467,11 @@ هەڵبژاردن نوێکارییەکان پیشاندانی ئاگانامەیەک بۆ ئامادەبوونی ئەپ لەکاتی بەردەست بوونی وەشانی نوێ - لیستی شێوازی بینین - لیست - چوار خانە - خۆکار - گۆڕینی شێواز + شێوازی پیشاندانی خشتە + خشتەیی + چوار خانەیی + خۆکاری + گۆڕینی پیشاندان وەشانی نوێی ئەپ بەردەستە! گرتەبکە بۆ داگرتن تەواوبوو @@ -489,14 +489,14 @@ کۆنفرانسەکان ناتوانرێ لێدوانەکان باربکرێ پیشاندانی نیشانەکەری شوێنی کارپێکراو لە لیستەکان - فایلێک بەهەمان ناو هەیە - فایلێکی داگیراو بەم ناوەوە هەیە - ناتوانرێ لەسەر ئەو فایلە جێگیربکرێ + پەڕگەیەک بەهەمان ناو هەیە + پەڕگەیەکی داگیراو بەم ناوەوە هەیە + ناتوانرێ لەسەر ئەو پەڕگەیە جێگیربکرێ زمان دەگۆڕدرێ لەدوای داخستن و پاشان کردنەوەی ئەپ. کیۆسکی بنەڕەتی - خێرا بردنە پێشەوە\\ گێڕانەوە بۆکاتی سەرەتا - دۆخی PeerTube - ئارەزوومەندییەکانی دۆخی پێرتوبی ڕێکبخە + ماوەی خێرا بردنە پێشەوە\\ گێڕانەوە بۆ دواوە + دۆخی پێرتووبی + ئارەزوومەندییەکانی دۆخی پێرتووبی ڕێکبخە ئەو دۆخانە بدۆزەرەوە کە لەگەڵ خۆتدا دەگونجێن لە %s زیادکردنی دۆخ بەستەری دۆخ دابنێ @@ -505,16 +505,15 @@ هەمان دۆخ کاراکراوە نەدۆزرایەوە چارەسەرکردن شکستی هێنا - سڕینەوەی داگرتنە تەواوبووەکان - ڕاوەستان + ڕاگرتن زیاترین هەوڵدانەکان زۆرترین ژمارەی هەوڵدان پێش پاشگەزبوونەوە لە داگرتنەکە ڕاوەستا لەسەر کێشەی هێڵ بەسوودە بۆ کاتی گۆڕینی هێڵ بۆ داتای مۆبایل, لەگەڵ ئەوەشدا زۆربەی داگرتنەکان ڕاناگرێت داخستن - NewPipe داخرا لەکاتی کارکردن لەسەر ئەو فایلە + ئەپ داخرا لەکاتی کارکردن لەسەر ئەو پەڕگەیە بیرگەی ناوەکیت پڕبووە - کردارەکە شکستی هێنا, چونکە ئەو فایلە سڕاوەتەوە + کردارەکە شکستی هێنا, چونکە ئەو پەڕگەیە سڕاوەتەوە هێڵی ئینتەرنێت نەما ئایا دەتەوێ مێژووی داگرتنەکانت بسڕدرێنەوە یان هەموو فایلە داگیراوەکان بسڕدرێنەوە؟ سنوری ڕیزبوونی داگرتنەکان @@ -522,11 +521,11 @@ دەستپێکردنەوەی داگرتنەکان ڕاگرتنی داگرتنەکان پرسیاربکرێ لەکوێ دابگیرێ - پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر فایلێک - پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر فایلێک -\nدەتوانیت SAF بەکاربهێنیت گەر دەتەوێ لە بیرگەی دەرەکیدا فایلەکان دابگریت + پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر پەڕگەیەک + پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر پەڕگەیەک +\nدەتوانیت SAF بەکاربهێنیت گەر دەتەوێ لە بیرگەی دەرەکیدا پەڕگەکان دابگریت بەکارهێنانی SAF - چوارچێوەی گەیشتن بە بیرگە ڕێگەدەدات بە داگرتنی فایلەکان لە بیرگەی دەرەکیدا. + چوارچێوەی گەیشتن بە بیرگە ڕێگەدەدات بە داگرتنی پەڕگەکان لە بیرگەی دەرەکیدا. \nتێبینی: هەندێ لە مۆبایلەکان پشتگیری ناکرێن ناوخۆ لەم ماوەیەدا بڵاوکرابێتەوە @@ -546,8 +545,47 @@ گرتە بکە لەسەر ”تەواو” کاتێ کە چارەسەرکرا تەواو ڤیدیۆکان - - %s چرکە - %s چرکە + + %d چرکە + %d چرکە + بەهۆی ExoPlayer ەوە ماوەی بردنەپێش و بردنەپاش لە %d چرکەدا دیاریکرا + بێدەنگکردن + بێدەنگ نەکردن + یارمەتی + + %d خولەک + %d خولەك + + + %d کاتژمێر + %d کات ژمێر + + + %d ڕۆژ + "%d ڕۆژەکان" + + کۆمەڵە دیارەکان + کۆنترین نوێکردنەوەی بەشداری: %s + بارنەکراو : %d + بارکردن… + ئامادەکردن… + دیاریکردنی بەشدارییەکان + هیچ بەشدارییەک دیاری نەکراوە + + %d دیاریکراو + %d هەڵبژێردراو + + ناوی کۆمەڵە بەتاڵە + ناو + ئایا دەتەوێ ئەم کۆمەڵەیە بسڕیتەوە؟ + نوێ + دیار + نوێکاری دیار + کاتی پاش دواین نوێکردنەوە دوای بەشداربوون ڕەچاوکراوە — %s + هەمیشە نوێکردنەوە + تێکەڵکردن لە دیاری تەرخانکراوەوە کاتێ بەردەست بوو + لەهەندێ خزمەتگوزاریدا بەردەستە، هەمیشە خێرایە بەڵام ڕەنگە هەندێ لە بابەتەکان زانیارییەکانیان ناتەواو بێت (وەک نەبوونی ماوە، جۆری بابەت ، نەبوونی پەخش). + چالاککردنی دۆخی خێرا + چالاک نەکردنی دۆخی خێرا \ No newline at end of file diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 8bf86c102..1e85b1084 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -1,9 +1,9 @@ - Стисни на пребарување за да почнеш + Притиснете „Барај“ за да започнете. %1$s прегледи Објавено на %1$s - Не е најден плеер за стримови. Инсталирај VLC? + Не е пронајден плеер за стримови. Сакате да инсталирате VLC\? Не е пронајден плеер за стримови (можеш да инсталираш VLC) Инсталирај Откажи @@ -19,14 +19,14 @@ Одбери пребарувач ротација Користи надворешен видео плеер - Отстранува звук на НЕКОИ резолуции + Се губи звукот на НЕКОИ резолуции Користи надворешен аудио плеер NewPipe мало прозорче Зачлени се Зачленет Откажано е членството на каналот - Не може да се промени членството - Не може да се освежи членството + Не може да се промени претплатата + Не може да се ажурира претплатата Покажи информации Почетна Членства @@ -36,21 +36,21 @@ Подпрозорче Додај на Локација за зачувување на видеата - Локација за зачувување на видеата - Внеси локација за зачувување на видеата - Локација за зачувување аудио - Локација за зачувување аудио - Внеси локација за зачувување аудио + Преземените видеа се сместени овде + Одберете каде да ги зачувате видеата + Фолдер за преземање на аудио + Преземените аудио фајлови се сместени овде + Одберете фолдер за зачувување на аудио Автоматско пуштање - Пушта видео кога NewPipe е повикана од друга апликација + Пушта видео кога NewPipe е уклучена од друга апликација Стандардна резолуција - Стандардна резолуција на подпрозорчето - Покажи повисоки резолуции - Само некои уреди поддржуваат 2К/4К видеа + Стандардна резолуција на малиот прозор + Прикажи повисоки резолуции + Само одредени уреди поддржуваат 2К/4К видеа Пушти на Kodi - Аплик. Kore не е најдена. Инсталирај? - Покажи опција „Пушти со Kodi“ - Покажи опција да се пушти видео со Kodi media center + Апликацијата Kore не е најдена. Сакате да ја инсталирате\? + Прикажи ја „Пушти со Kodi“ опцијата + Прикажи опција да се пушти видео со Kodi media center Звук Стандарден аудио формат Стандарден видео формат @@ -58,37 +58,37 @@ Светла Темна Црна - Запамти го местото и големината на прозорчето + Запамти го местото и големината на малиот прозорец Запамти ја последната големина и место на прозорчето Брзо, непрецизно премотување - Со непрецизното премотување може да се пребарува побрзо, но понепрецизно - Прочитај сликички - Оневозможи, за да не се читаат сликичките од видеото, за штедење меморија и интернет. Промена на опцијата ќе ја избрише кеш-меморијата - Сликичките се избришани - Избриши ги собраните мета-податоци - Избриши ги сите собрани податоци од веб-страни - Избришани се мета-податоците - Автоматски постави го на листа следното видео + Со непрецизното премотување се пребарува побрзо, но со намалена презицност. + Прочитај мали видео-сликички + Оневозможете, за да не се читаат малите видео-сликички за штедење на меморија и интернет. Промената на оваа опцијата ќе ја избрише кеш-меморијата. + Кешираните слики се избришани + Избришете ги кешираните мета-податоци + Избришете ги сите кеш-податоци од веб-страни + Мета-податоците се избришани + Автоматски постави го на листа на следно видео Автоматски прикачи поврзано видео кога ќе почне последното пуштено видео во неповторлива листа Управување на плеерот со гестови - Користи гестови за управување на светлоста и тонот - Предлози за пребарување - Покажи предлози при пребарување - Историја на пребарувањата - Зачувај ги пребарувањата локално + Користете гестови за управување на светлоста и гласноста + Пребарајте предлози + Прикажи предлози при пребарување + Претходни пребарувања + Зачувајте ги пребарувањата локално Историја и зачувано - Зачувај ја листата на гледани видеа - Продолжи видео при враќање на фокусот - Продолжи го видеото по прекини (пр. телефонски повик) - Превземи + Зачувајте ја листата на гледани видеа + Продолжете со репродукција + Продолжете со репродукција на видеото по прекини (пр. телефонски повик) + Преземи Следно видео - Покажи „следни“ и „слични“ видеа - Покажи совет „задржи за прикачување“ - Прикажи совет кога позадината или копче од подпрозорчето се притиснати, на страната за видео детаљи + Прикажи „следни“ и „слични“ видеа + Прикажи „задржи за прикачување“ + Покажи совет при притискање на позадината или кога скок копчето е притиснато на видео \"Детали:\" Неподдржана URL врска Земја на прикажани видеа Услуга - Претпочитан јазик на видеата + Стандарден јазик на содржина Плеер Однесување Видео и Звук @@ -362,7 +362,6 @@ Темпо Тон Откачи (може да создаде мутации) - Стандардно Избриши историја на гледаност Ја брише историјата на пуштени видеа Избриши ја целата историја на гледаност. @@ -402,13 +401,13 @@ Никое Смали го во позадина Смали го во прозорче - Откажи членство + Откажете претплата Ново јазиче Одбери јазиче - Гест за контрола на јачина на звук - Користи гест за контрола на јачината на звукот - Гест за контрола на осветленост - Користи гест за контрола на осветленот + Гест за контрола на гласност + Користете гестови за подесување на гласноста + Гестови за контрола на осветленост + Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана Известување за ажурирање на апликација @@ -449,7 +448,6 @@ Серверот не испраќа податоци Серверот не прифаќа преземања со повеќе навои, обидете се со @string/msg_threads = 1 Не е најдено - Избриши завршени преземања Стоп Максимални обиди Максимален број обиди пред откажување на преземањето @@ -457,16 +455,16 @@ Настани Конференции Прикажи коментари - Автоматски старт + Автоматско пуштање Коментари - + Нема коментари Не може да се вчитаат коментарите Затвори Продолжи со репродукција - Врати ја последната позиција за репродукција + Враќање на последната позиција на репродукција Избриши податоци Дадотеката е преместена или избришана Ддотека со ова име веќе постои @@ -485,4 +483,15 @@ Користи SAF Рамката за пристап до складирање овозможува преземања во надворешна SD-картичка. \nЗабелешка: некои уреди не се поддржани. + Исклучете за да ги скриете коментарите + Позиции во листите + Покажете ги индикаторите за позиција за репродукција во листите + Променете го фолдерот за преземање за да има ефект + Брзо премотување напред + Примери на PeerTube + Одберете ги вашите омилени PeerTube пример + Пронајдете ги примерите кои ви се допаѓаат на %s + Додадете пример + мала видео-сликичка на заклучен екран + Мала видео-сликичка е прикажана на заклучниот екран при користење на плеерот во позадина \ No newline at end of file diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index eb8826d45..d83c7d2f0 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -452,7 +452,6 @@ Server tidak menerima muat turun berbilang thread, cuba lagi dengan @string/msg_threads = 1 Tidak ditemui Pemprosesan-pasca gagal - Hapuskan senarai muat turun yang selesai Berhenti Percubaan maksimum Jumlah percubaan maksimum sebelum membatalkan muat turun diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 95a19c903..b77002775 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -345,7 +345,6 @@ Fartskontroller for avspilling Tempo Tonehøyde - Forvalg Tøm avspillingshistorikk Slett historikken og posisjon for avspilte strømmer Slett hele visningshistorikken\? @@ -456,7 +455,6 @@ "Tjeneren godtar ikke flertrådede nedlastinger, prøv igjen med @string/msg_threads = 1 " Ikke funnet Etterbehandling mislyktes - Tøm fullførte nedlastinger Stopp Maksimalt antall forsøk Maksimalt antall tilkoblingsforsøk før nedlastingen avblåses @@ -543,8 +541,28 @@ Trykk \"Ferdig\" når den er løst Ferdig Videoer - - %s sekunder - %s sekunder + + %d sekunder + %d sekunder + Forstum + Opphev forstumming + Hjelp + + %d minutt + %d minutter + + + %d time + %d timer + + + %d dag + %d dager + + Ikke innlastet: %d + Tomt gruppenavn + Navn + Ønsker du å slette denne gruppen\? + Ny \ No newline at end of file diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 2f574dd43..8cb7e7eb4 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -1,15 +1,15 @@ - सुरू गर्न खोज चिन्ह दाब्नुहोस् + सुरू गर्न \"खोज\" चिन्ह दबाउनु होस %1$s हेराइहरू %1$s मा प्रकाशित - कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ\? + कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ \? कुनै स्ट्रीम प्लेयर फेला परेन (तपाइँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)। इन्स्टल गर्नुहोस् रद्द गर्नुहोस् ब्राउजरमा खाेल्नुहाेस् पपअप मोडमा खोल्नुहोस् - बांडनुहोस् + सेयर डाउनलोड स्ट्रीम डाउनलोड गर्नुहोस् खोजी @@ -23,8 +23,530 @@ अन्य अडियो प्लेयर प्रयोग गर्नुहोस् नयाँ पाइप पपअप मोड सदस्यता लिनुहोस् - सदस्यता लगिसकेको + सदस्यता लिईएको सदस्यता रद्द गर्नुहोस् च्यानल सदस्यता रद्द गरियो सदस्यता परिवर्तन गर्न सकिएन + सदस्यता अपडेट गर्न सकिएन + जानकारी देखाउनुहोस् + मुख्य + सदस्यता + बुकमार्क गरिएको प्लेलिस्टहरू + नयाँ ट्याब + ट्याब छनौट गर्नुहोस् + नयाँ के छ + पृष्ठभूमि + पपअप + थप्नुहोस + भिडियो डाउनलोड फोल्डर + डाउनलोड भिडियो फाइलहरू यहाँ भण्डारण छन् + भिडियो फाइलहरू लागि डाउनलोड फोल्डर चयन गर्नुहोस् + अडियो डाउनलोड फोल्डर + डाउनलोड अडियो फाइलहरू यहाँ भण्डारण छन् + अडियो फाइलहरू लागि डाउनलोड फोल्डर चयन गर्नुहोस् + अटोप्ले + NewPipe अर्को अनुप्रयोगबाट भनिन्छ जब एउटा भिडियो खेल्छ + पूर्वनिर्धारित संकल्प + पूर्वनिर्धारित पपअप संकल्प + उच्च रिजोल्युसन देखाउन + मात्र केही उपकरणहरू 2k/4K भिडियो प्ले गर्न सक्छन + Kodi संग खोल्नुहोस + \'Kore\' एप छैन | हाल्न चाहनुहुन्छ\? + \"Kodi संग प्ले\" विकल्प देखाउ + Kodi मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प प्रदर्शन + अडियो + पूर्वनिर्धारित अडियो ढाँचा + पूर्वनिर्धारित भिडियो प्रारूप + विषय + प्रकाश + गाढा + कालो + पपअप आकार र स्थिति सम्झना + पछिल्लो आकार र पपअप को स्थिति सम्झना + तेज \'inexact\' खोज्न प्रयोग गर्नुहोस + \'Inexact\' प्लेयर कम सटीक छिटो स्थितिहरू गर्न खोज्न अनुमति दिन्छ खोज्छन्। 5, 15 वा 25 सेकेन्ड को लागि खोजी यो काम गर्दैन। + थम्बनेल लोड + टिप्पणीहरू देखाऊ + टिप्पणीहरू लुकाउन, बन्द गर्नुहोस + डाटा र स्मृति उपयोग सुरक्षित गर्न, थम्बनेलहरू लोड रोक्न, बन्द गर्नुहोस। परिवर्तनहरू दुवै मा-स्मृति र-डिस्क छवि क्यास खाली गर्छ। + छवि क्यास सखाप + क्यास मेटाडाटा हटाउ + सबै क्यास वेबपेज डाटा हटाउ + मेटाडाटा क्यास सखाप + स्वतः लाम अर्को स्ट्रिम + अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न + आवाज मात्रा नियन्त्रण गर्न इशाराको प्रयोग + प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग + चमक इशारा नियन्त्रण + प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग + प्लेयर इशारा नियन्त्रण + प्लेयरको चमक र मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग + खोज सुझावहरू + खोजी गर्दा सुझावहरू देखाउन + खोज इतिहास + खोज प्रश्नहरु स्थानीय भण्डारण + हेरेको इतिहास + हेरिएको भिडियो ट्रयाक राख्न + प्लेयर पुनर्स्थापना गर्नुहोस् + रुकावट (जस्तै फोन कल) पछि प्लेयर जारी + डाउनलोड + अर्को + अटोप्ले + \'अर्को\' र \'समान\' भिडियो देखाउन + \"होल्ड संलग्न गर्न\" टिप देखाउन + पृष्ठभूमि वा भिडियो मा पपअप बटन थिच्दा टिप देखाउन \"विवरण:\" + असमर्थित URL + पूर्वनिर्धारित सामग्री देश + सेवा + पूर्वनिर्धारित सामग्री भाषा + प्लेयर + व्यवहार + भिडियो र अडियोभिडियो र अडियोभिडियो र अडियो + इतिहास र क्यास + पपअप + रूप + अन्य + डिबग + अपडेट + पृष्ठभूमिमा प्ले + पपअप मोडमा प्ले + पृष्ठभूमि खेलाडी मा लामबद्ध + पपअप खेलाडी मा लामबद्ध + खेल्नु + सामग्री + उमेर प्रतिबन्धित सामग्री + उमेर शो प्रतिबन्धित भिडियो। भविष्यमा परिवर्तन सेटिङ देखि सम्भव छ। + प्रत्यक्ष + डाउनलोड + डाउनलोड + त्रुटि रिपोर्ट + सबै + च्यानल + च्यानलहरू + प्लेसूची + प्लेसूचीहरूप्लेसूचीहरू + + %s भिडियो + %s भिडियोहरू + + + %s टिप्पणी + %s टिप्पणीहरू + + ट्रयाक + प्रयोगकर्ता + घटनाहरू + हो + पछि + अक्षम + फिल्टर + ताजा + स्पष्ट + रिसाइज + सर्वश्रेष्ठ संकल्प + पूर्ववत + फाइल मेटिएको + सबै प्ले + सधैं + केवल एकपटक + फाइल + NewPipe सूचना + NewPipe पृष्ठभूमि र पपअप खेलाडीहरू लागि सूचनाहरू + सूचना अनुप्रयोग अद्यावधिक + नयाँ NewPipe संस्करण लागि सूचनाहरू + [अज्ञात] + अभिमुखीकरण टगल गर्नुहोस् + पृष्ठभूमि स्विच गर्नुहोस् + पपअप स्विच गर्नुहोस् + मुख्य स्विच गर्नुहोस् + आयात डेटाबेस + निर्यात डेटाबेस + आफ्नो वर्तमान इतिहास र सदस्यता ओवरराइडहरु + निर्यात इतिहास, सदस्यता र प्लेसूचीहरू + हेरेको इतिहास स्पष्ट + प्ले प्रवाहको इतिहास र प्लेब्याक स्थान मेटाउँछ + मेटाउने सम्पूर्ण हेरेको इतिहास\? + खोज इतिहास स्पष्ट + खोज किवर्ड को मेटाउँछ इतिहास + मेटाउने सम्पूर्ण खोज इतिहास\? + खोज इतिहास मेटियो। + त्रुटि तार + बाह्य भण्डारण उपलब्ध + बाह्य SD कार्ड सम्भव छैन डाउनलोड। रिसेट डाउनलोड फोल्डर स्थान\? + नेटवर्क त्रुटि + सबै थम्बनेल लोड गर्न सकेन + सकेन डिक्रिप्ट भिडियो URL हस्ताक्षर + वेबसाइट पदवर्णनगर्नसकिँदैन + पूर्ण वेबसाइट पदवर्णनगर्नसकिँदैन + सामग्री उपलब्ध + डाउनलोड मेनु स्थापित गर्न सकिएन + लाइभ स्ट्रिमहरू अझै समर्थित छैन + कुनै पनि धारा पाउन सकेन + छवि लोड गर्न सकिएन + अनुप्रयोग / यूआई दुर्घटनाग्रस्त + यो धारा बजाउन सकिएन + Unrecoverable खेलाडी त्रुटि + खेलाडी त्रुटि रिकभर + बाह्य खेलाडीहरू लिंक यी प्रकार समर्थन छैन + अवैध URL + कुनै भिडियो प्रवाह फेला + कुनै अडियो स्ट्रिम फेला + यस्तो कुनै फोल्डर + यस्तो कुनै फाइल / सामग्री स्रोत + फाइल अवस्थित छैन वा पढ्न वा यो लेख्न अभाव छ अनुमति + फाइलनाम खाली हुन सक्दैन + एउटा त्रुटि देखापर्यो:% 1 $ को + कुनै डाउनलोड गर्न उपलब्ध धाराहरु + सुरक्षित ट्याबहरू पढ्न सकिएन, पूर्वनिर्धारित व्यक्तिहरूलाई प्रयोग त + फेरी पहिलाकै अवस्था मा लैजाऊ + तपाईं पूर्वनिर्धारित पुनर्स्थापना गर्न चाहनुहुन्छ\? + माफ गर्नुहोस्, त्यो हुनु हुँदैनथ्यो। + ई-मेल मार्फत यो त्रुटि रिपोर्ट + माफ गर्नुहोस्, केही त्रुटिहरू भयो। + रिपोर्ट + जानकारी: + के भयो: + के:\\nअनुरोध:\\nसामग्री भाषा: \\nसेवा:\\nGMT समय:\\nप्याकेज:\\nसंस्करण: \\nOS संस्करण: + तपाईंको टिप्पणी (अंग्रेजी मा): + विवरण: + सामग्री वर्णन (राम्रो पहुँच लागि) + प्ले भिडियो, अवधि: + अपलोडरको अवतार थम्बनेल + मनपर्दो + मन नपर्ने + Tor प्रयोग + (प्रयोगात्मक) बल डाउनलोड वृद्धि गोपनीयता लागि Tor मार्फत यातायात (स्ट्रिम भिडियो अझै समर्थित)। + रिपोर्ट त्रुटि + प्रयोगकर्ता रिपोर्ट + कुनै परिणाम + यहाँ केही तर crickets + पुन: क्रमबद्ध गर्न तान्नुहोस् + डाउनलोड निर्देशिका सिर्जना गर्न सकिँदैन \'% 1 $ को\' + डाउनलोड फोल्डर सिर्जना गरियो \'%1$s\' + भिडियो + अडियो + पुन: प्रयास + पहिलो भण्डारण पहुँच प्रदान + K + एम + अर्ब + शून्य चयन छैन प्राप्त (केही भाषामा) यो एन्ड्रोइड लागि \"विशेष मामला\" छैन रूपमा + + %s सदस्य + %s सदस्यहरु + + उपलब्ध गणना सदस्य + कुनै दृश्य + + % हेरियो + %s पटक हेरियो + + कुनै भिडियो + प्रत्रिक्रिया छैन + मिशन + पज + खेल्नु + सिर्जना + मेटाउन + मेटाउने एक + मेटाउने सबै + चेकसम + खारेज + पुनः नामकरण + खण्ड + ठिक छ + msg + सूत्रहरू + त्रुटि + असमर्थित सर्भर + फाइल पहिले नै अवस्थित + विकृत URL वा इन्टरनेट उपलब्ध छैन + NewPipe डाउनलोड + विवरण लागि ट्याप गर्नुहोस् + कृपया पर्खनुहोस्… + क्लिपबोर्डमा प्रतिलिपि + कृपया डाउनलोड फोल्डर सेटिङहरू पछि परिभाषित + पपअप मोडमा खोल्न +\nयो अनुमति आवश्यक छ + 1 वस्तु हटाइयो। + reCAPTCHA चुनौती अनुरोध + डाउनलोड + FILENAMES अनुमति वर्ण + अवैध वर्ण यो मूल्य प्रतिस्थापन गर्दै + प्रतिस्थापन वर्ण + अक्षर र अंक + सबैभन्दा विशेष वर्ण + कुनै अनुप्रयोग यो फाइल खेल्न स्थापित + बारेमा + सेटिङहरू + बारेमा + तेस्रो-पक्ष इजाजत पत्र + ©% 1 $ को% 2 $ s द्वारा% 3 $ को अन्तर्गत + लाइसेन्स लोड गर्न सकेन + वेबसाइट खुला + बारेमा + योगदानकर्ता + लाइसेन्स + (Android)एन्ड्रोइडमा निःशुल्क लाइटवेट स्ट्रिमिंग। + योगदान + तपाईं को विचार छ कि छैन; अनुवाद, डिजाइन परिवर्तन, कोड सफाई, वा वास्तविक भारी कोड परिवर्तन-मद्दत सधैं छ स्वागत गर्दछौं। अधिक राम्रो यो हुन्छ गरिन्छ! + GitHub हेर्नुहोस् + दान + NewPipe तपाईं ल्याउन सबै भन्दा राम्रो प्रयोगकर्ता अनुभव आफ्नो स्वतन्त्र समय खर्च स्वयंसेवकहरु विकास गरिएको छ। NewPipe अझ राम्रो तिनीहरू एक कप कफी आनन्द गर्दा बनाउन मद्दत विकासकर्ताहरूले फिर्ता दिनुहोस्। + फिर्ता दिनुहोस + वेबसाइट + थप जानकारी र समाचार लागि NewPipe वेबसाइट मा जानुहोस्। + NewPipe गोपनीयता नीति + न्यू पाइप परियोजना आफ्नो गोपनीयता धेरै गम्भीरतापूर्वक लिन्छ। तसर्थ, तपाईँको सहमति बिना कुनै पनि डाटा संकलन गर्दैन। +\nन्यू पाइपको गोपनीयता नीतिले क्र्यास रिपोर्ट पठाउने बित्तिकै कुन डाटा पठाइएको र भण्डारण गरिएको छ भनेर विस्तृत वर्णन गर्दछ। + गोपनीयता नीति पढ्नुहोस् + NewPipe इजाजत पत्र + NewPipe copyleft छ मुफ्त सफ्टवेयर: तपाईं प्रयोग गर्न सक्नुहुन्छ, अध्ययन शेयर र इच्छामा सुधार। विशेष तपाईं redistribute गर्न सक्नुहुन्छ र / वा रूपमा फ्री सफ्टवेयर फाउंडेशन द्वारा प्रकाशित GNU जनरल सार्वजनिक लाइसेन्स सर्तहरू अन्तर्गत यो परिमार्जन, कि त लाइसेन्स को संस्करण 3, वा (तपाईँको विकल्प मा) कुनै पनि पछि संस्करण। + लाइसेन्स पढ्नुहोस् + इतिहास + खोजी + हेरिएका + इतिहास बन्द गरिएको छ + इतिहास + इतिहास खाली छ + इतिहास खाली + वस्तु हटाइयो + तपाईं खोज इतिहासबाट यो वस्तु मेटाउन चाहनुहुन्छ\? + तपाईं हेरेको इतिहास देखि यो वस्तु मेटाउन चाहनुहुन्छ\? + तपाईं इतिहास सबै वस्तुहरू मेट्न चाहनुहुन्छ निश्चित हुनुहुन्छ\? + लेबुल + सबैभन्दा निभाए + सामग्री + मुख्य पृष्ठ मा के ट्याबहरू देखाइएको छ + चयन + खाली पृष्ठ + किओस्क पृष्ठ + सदस्यता पृष्ठ + फिड पृष्ठ + च्यानल पृष्ठ + एक च्यानल चयन गर्नुहोस् + अहिलेसम्म कुनै पनि च्यानल सदस्यता + एक किओस्क चयन + निर्यात + आयात + कुनै मान्य जिप फाइल + चेतावनी: सबै फाइलहरू आयात गर्न सकिएन। + यो आफ्नो हालको सेटअप अधिलेखन हुनेछ। + तपाईं पनि सेटिङहरू आयात गर्न चाहनुहुन्छ\? + टिप्पणीहरू लोड गर्न सकेन + किओस्क नामहरू + चलिरहेका + शीर्ष 50 + नयाँ र तातो + सम्मेलन + प्ले लाममा + पपअप खेलाडी + हटान + विवरण + अडियो सेटिङहरू + लामबद्ध गर्न पकड + पृष्ठभूमिमा लामबद्ध + नयाँ पपअपमा लामबद्ध + सुरु यहाँ प्ले + पृष्ठभूमिमा सुरु निभाउनु + नयाँ पपअपमा सुरु निभाउनु + दराज + दराज बन्द + केही चाँडै यहाँ प्रकट हुनेछ; डी + प्राथमिक \'खुला\' कार्य + पूर्वनिर्धारित कार्य गर्दा खोल्ने सामग्री -% को + भिडियो प्लेयर + पृष्ठभूमि खेलाडी + पपअप खेलाडी + सधैं सोध्न + जानकारी प्राप्त गर्दै … + अनुरोध सामग्री लोड + स्थानीय प्लेलिस्टस्थानीय प्लेलिस्ट + मेटाउन + पुनः नामकरण + नाम + प्लेसूचीमा थप्न + प्लेलिस्ट थम्बनेल रूपमा सेट + बुकमार्क प्लेलिस्ट + बुकमार्क हटाउन + यो प्लेसूची मेटाउन\? + प्लेलिस्ट सिर्जना + PlaylistedPlaylisted + प्लेसूची थम्बनेल परिवर्तन भयो। + प्लेसूची मेटाउन सकेन। + खेलाडीहरू + फिट + भर्न + जुम + स्वतः उत्पन्न + क्याप्सन सेटिङ + सुधारे खेलाडी क्याप्सन पाठ मात्रा र पृष्ठभूमि शैलीहरू। ले प्रभाव अनुप्रयोग पुन: सुरु गर्न आवश्यक छ। + डिबसेटिङहरू + मेमोरी लिक अनुगमन हिप dumping जब अनुप्रयोग अनुत्तरदायी बन्न सक्छ + रिपोर्ट बाहिर-को-जीवनचक्र त्रुटिहरू + शक्ति निपटान पछि खण्ड वा गतिविधि जीवनचक्र को undeliverable Rx अपवाद बाहिर को रिपोर्ट + सदस्यता आयात / निर्यात + आयात + आयात + निर्यात + आयात गर्दै … + निर्यात … + फाइल आयात + अघिल्लो निर्यात + सदस्यता आयात गर्न सकिएन + सदस्यता निर्यात गर्न सकेन + निर्यात फाइल डाउनलोड गरेर यूट्यूब सदस्यताहरू आयात गर्नुहोस्: +\n +\n1. जानुहोस् यो URL:% 1$s +\n2. सोधिएको बेलामा लग इन गर्नुहोस् +\n3. एउटा डाउनलोड सुरु हुनुपर्दछ (त्यो निर्यात फाईल हो) + या त URL वा तपाईंको ID टाइप गरेर साउन्डक्लाउड(soundcloud) प्रोफाइल आयात गर्नुहोस्: +\n +\n1. वेब ब्राउजरमा \"डेस्कटप मोड\" सक्षम गर्नुहोस् (साइट मोबाइल उपकरणहरूको लागि उपलब्ध छैन) +\n2. यस URL:%$s मा जानुहोस् +\n3. सोधिएको बेलामा लग इन गर्नुहोस् +\n4. तपाईंलाई URL मा निर्देशित गरिएको प्रोफाइल URL प्रतिलिपि गर्नुहोस्। + yourID, soundcloud.com/youridyourID, soundcloud.com/yourid + दिमागमा राख्नुहोस् यो अपरेशन नेटवर्क महँगो हुन सक्छ। +\n +\nतपाईँ जारी राख्न चाहनुहुन्छ\? + प्लेब्याक परिमिति + टेम्पो + पिच + Unhook (विकृति उत्पन्न हुन सक्छ) + मौन समयमा छिटो-फर्वार्ड + चरण + रिसेट + यूरोपीय सामान्य डाटा संरक्षण नियमन (GDPR) अनुपालन गर्न, हामी हर्बी न्यूपिपको गोपनीयता नीतिमा तपाईंको ध्यान आकर्षित गर्दछौं। कृपया यसलाई ध्यानपूर्वक पढ्नुहोस्। +\nतपाईंले हामीलाई बग रिपोर्ट पठाउन यसलाई स्वीकार्नुपर्दछ। + स्वीकार + अस्वीकार + मोबाइल डाटा प्रयोग सीमित + सीमा संकल्प मोबाइल डाटा प्रयोग गर्दा + अद्यावधिक सेटिङहरू + एक नयाँ संस्करण उपलब्ध छ जब शीघ्र अनुप्रयोग अद्यावधिक गर्न एक सूचना देखाउन + बाहिर निस्कन कार्य गर्न कम गर्न + मुख्य भिडियो प्लेयर अन्य अनुप्रयोगमा स्विच कार्य गर्दा -% को + कुनै पनि + पृष्ठभूमि खेलाडी मिनिमाइज + पपअप खेलाडी मिनिमाइज + सूची दृश्य मोड + सूची + ग्रिड + स्वतः + हेर्नुहोस् स्विच + नयाँ पाइप अपडेट उपलब्ध छ! + डाउनलोड गर्न ट्याप गर्नुहोस् + समाप्त + रोकिएको + पज + लामबद्ध + पोस्ट-प्रक्रिया + लाम + कार्य प्रणाली द्वारा अस्वीकार + डाउनलोड सूचनाहरू + डाउनलोड समाप्त + % को डाउनलोड समाप्त + अवस्थित डाउनलोड बारेमा संवाद + अधिलेखन + यो नाम संग प्रगतिमा एक डाउनलोड छ + डाउनलोड त्रुटि बारेमा सन्देश संवाद + कोड + गन्तव्य फोल्डर सिर्जना गर्न सकिँदैन + फाइल सिर्जना गर्न सकिँदैन + अनुमति प्रणाली द्वारा अस्वीकार + सुरक्षित जडान स्थापना गर्न सकिएन + सर्भर फेला पार्न सकिएन + सर्भर जडान गर्न सक्दैन + सर्भर डाटा पठाउन छैन + सर्भर बहु-पिरोया डाउनलोड @ स्ट्रिङ संग पुन: प्रयास / msg_threads = 1 स्वीकार गर्दैन + फेला परेन + पोस्ट-प्रक्रिया असफल भयो + रोक + अधिकतम पुनःप्रयासकोसङ्ख्या + डाउनलोड रद्द अघि प्रयासहरूको अधिकतम संख्या + पथलैया औद्योगिक सञ्जाल मा रोकावट + उपयोगी, मोबाइल डेटा स्विच गर्दा केही डाउनलोड निलम्बित सक्दैन हुनत हुन + बन्द + प्लेब्याक पुनःसुरु गर्नुहोस् + पछिल्लो प्लेब्याक स्थिति पुनर्स्थापना गर्नुहोस् + सूचीमा स्थान + सूची मा प्लेब्याक स्थिति संकेतक देखाउन + डाटा सखाप पार्नुहोस + इतिहास हेर्ने हटाइयो। + प्लेब्याक स्थान हटाइयो। + फाइल सारियो वा मेटिएको + यो नामको फाइल पहिल्यै अवस्थित छ + यो नाम पहिले नै अवस्थित संग फाइल डाउनलोडś + फाइल अधिलेखन गर्न सक्दैन + यो नाम संग बाँकी डाउनलोड छ + फाइल मा काम गर्दा NewPipe बन्द भएको थियो + उपकरणमा बायाँ कुनै ठाउँ + फाइल मेटिएको थियो किनभने प्रगति, हराएको + जडान समय सकियो + तपाईं आफ्नो डाउनलोड इतिहास सबै डाउनलोड फाइल खाली वा मेटाउन चाहनुहुन्छ\? + सीमा डाउनलोड लाम + एक डाउनलोड एकै समयमा चलाउन हुनेछ + डाउनलोड सुरु + पज डाउनलोड + डाउनलोड गर्न कहाँ सोध्न + प्रत्येक डाउनलोड कहाँ बचत गर्न आग्रह गरिनेछ + प्रत्येक डाउनलोड कहाँ बचत गर्न आग्रह गरिने छ। +\nतपाईं बाहिरको एसडी कार्डमा डाउनलोड गर्न चाहनुहुन्छ भने SAF चयन गर्नुहोस् + SAF प्रयोग + \'भण्डारण पहुँच फ्रेमवर्क\' बाह्य एसडी कार्डमा डाउनलोड गर्न अनुमति दिन्छ। +\nकेहि उपकरणहरू असंगत छन् + मेटाउने प्लेब्याक स्थान + सबै प्लेब्याक स्थान मेटाउँछ + सबै प्लेब्याक स्थान मेटाउने\? + प्रभाव लिन डाउनलोड फोल्डरहरू परिवर्तन + सेवा टगल गर्नुहोस्, हाल चयन गरिएको: + कुनै एक हेरिरहनुभएको छ + + %s हेर्दै + %s जना हेर्दै छन् + + कुनै एक सुनिरहेको छ + + %s श्रोता + %s श्रोताहरु + + एक चोटि अनुप्रयोग पुनः सुरु गरिन्छ भाषा परिवर्तन हुनेछ। + पूर्वनिर्धारित पसल + "छिटो-अगाडि /-पछाडी खोज्न अवधि" + PeerTube उदाहरणहरू + आफ्नो मनपर्ने PeerTube उदाहरणहरू चयन + %s मा तपाईंलाई मनपर्ने ईन्स्टान्सहरू फेला पार्नुहोस् + add उदाहरणका + उदाहरणका URL प्रविष्ट गर्नुहोस् + उदाहरणका मान्य सकेन + HTTPS URL हरू मात्र समर्थित + उदाहरणका पहिले नै अवस्थित + स्थानिय + हालसालै थपिएको + सबैभन्दा धेरै मनपराइएको + स्वतः उत्पन्न (कुनै अपलोडरको मिली) + पुन + यो डाउनलोड ठीक गर्न सकिँदैनयो डाउनलोड ठीक गर्न सकिँदैन + एउटा उदाहरण छनौट गर्नुहोस् + स्क्रिन भिडियो थम्बनेल लक + "पृष्ठभूमिमा प्लेयर प्रयोग गर्दा एउटा भिडियो थम्बनेल लक स्क्रिनमा देखाइएको छ" + डाउनलोड इतिहास स्पष्ट + डाउनलोड फाइल मेट्न + मेटिएको% 1 $ को डाउनलोड + अन्य अनुप्रयोगहरूमा प्रदर्शन गर्न अनुमति दिने + एप्सको भाषा + सिस्टम पूर्वनिर्धारित + reCAPTCHA चुनौती + प्रेस हल गर्दा \"डन\" + सकियो + भिडियो + + %d सेकेन्ड + %d सेकेन्ड + + ExoPlayer अवरोधका कारण खोजी अवधि %d सेकेन्डमा सेट गरियो + म्युट + ध्वनि सुचारु + मद्दत \ No newline at end of file diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 4c3b9628d..d1f67a9ee 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -367,7 +367,6 @@ Tempo Toon Ontkoppelen (kan ruis veroorzaken) - Standaard Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams De ganse kijkgeschiedenis verwijderen\? @@ -456,7 +455,6 @@ De server aanvaardt geen meerdradige downloads, probeert het opnieuw met @string/msg_threads = 1 Niet gevonden Nabewerking mislukt - Voltooide downloads wissen Stoppen Maximaal aantal pogingen Maximaal aantal pogingen vooraleer dat de download wordt geannuleerd diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 35faa9dde..2793bafe7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -19,7 +19,7 @@ Kies de downloadlocatie voor video\'s Standaardresolutie Afspelen met Kodi - Kore-app niet gevonden. Installeren? + Installeer ontbrekende Kore-app\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio @@ -65,9 +65,9 @@ Kan website niet volledig verwerken Kan geen streams vinden Sorry, dit had niet mogen gebeuren. - Fout melden via e-mail + Deze fout melden via e-mail Sorry, er traden enkele fouten op. - MELDEN + Melden Informatie: Wat er is gebeurd: Je opmerking (in het Engels): @@ -78,16 +78,16 @@ Druk op \"zoeken\" om te beginnen Automatisch afspelen Speelt video’s af als NewPipe vanuit een andere app wordt geopend - LIVE + Live Downloads Downloads Foutrapport Kan afbeelding niet laden App/UI gecrasht Wat:\\nVerzoek:\\nTaal van inhoud:\\nDienst:\\nTijd in GMT:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: - Meld een probleem + Probleem melden Gebruikersrapport - Toegang tot opslag geweigerd + Geef eerst toegang tot de opslag Begin Pauzeren Afspelen @@ -115,7 +115,7 @@ Kanaal Ja Later - K + k M B Deze machtiging is vereist om te @@ -174,9 +174,9 @@ Nieuw Zoekgeschiedenis Sla zoekopdrachten lokaal op - Geschiedenis en cache + Kijkgeschiedenis Kijkgeschiedenis bijhouden - Hervat bij focus + Hervat afspelen Ga verder met afspelen na onderbrekingen (zoals telefoongesprekken) NewPipe-melding Meldingen voor NewPipe-achtergrond- en pop-upspelers @@ -237,7 +237,7 @@ Verwijderen Details Audio-instellingen - Houd ingedrukt om toe te voegen aan wachtrij + Ingedrukt houden om toe te voegen aan wachtrij [Onbekend] Toevoegen aan wachtrij in de achtergrond Toevoegen aan wachtrij in nieuwe pop-up @@ -313,12 +313,12 @@ Hier zal binnenkort iets verschijnen ;D Foutopsporing Automatisch gegenereerd - LeakCanary inschakelen + LeakCanary Het monitoren van geheugenlekken kan ervoor zorgen dat de app niet goed meer reageert Out-of-lifecycle-fouten melden Forceer het melden van niet-bezorgbare Rx-uitzonderingen buiten fragment of activiteitscyclus Snelle, minder exact spoelen gebruiken - Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie + Onnauwkeurig zoeken laat de speler sneller posities zoeken met verminderde precisie. 5, 15 of 25 zoeken werkt dan niet. Volgende stream automatisch in wachtrij plaatsen Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst Bestand @@ -362,7 +362,6 @@ Tempo Toon Ontlinken (kan ruis veroorzaken) - Standaard Voorkeursactie voor openen Standaardactie bij openen van inhoud — %s Geen streams beschikbaar voor downloaden @@ -414,10 +413,10 @@ Appupdatemelding Meldingen voor nieuwe versies van NewPipe Externe opslag niet beschikbaar - Downloaden naar externe SD-kaart is nog niet mogelijk. Downloadmap opnieuw instellen\? - Standaard tabbladen worden gebruikt, fout bij het lezen van de opgeslagen tabbladen + Downloaden naar externe SD-kaart is niet mogelijk. Downloadmap opnieuw instellen\? + Fout bij het lezen van de opgeslagen tabbladen, waardoor standaardtabbladen worden gebruikt Standaardinstellingen herstellen - Wilt u de standaardinstellingen herstellen\? + Wil je de standaardinstellingen herstellen\? Aantal abonnees niet beschikbaar Welke tabbladen worden weergegeven op de hoofdpagina Selectie @@ -449,35 +448,149 @@ Het bestand kan niet worden gemaakt De doelmap kan niet worden gemaakt Toestemming door het systeem geweigerd - Beveiligde connectie is mislukt + Kon geen beveiligde verbinding opzetten Kon de server niet vinden Kan niet met de server verbinden De server verzendt geen gegevens De server accepteert geen multi-threaded downloads, probeer het opnieuw met @string/msg_threads = 1 Niet gevonden Nabewerking mislukt - Voltooide downloads wissen Stop Maximum aantal keer proberen Maximum aantal pogingen voordat de download wordt geannuleerd - Pauzeren bij overschakelen naar mobiele data - Downloads die niet kunnen worden gepauzeerd zullen worden herstart + Onderbreken op netwerken met datalimiet + Handig bij het overschakelen naar mobiele gegevens, hoewel sommige downloads niet onderbroken kunnen worden Gebeurtenissen Conferenties Time-out van verbinding Reacties tonen - Schakel dit uit om reacties niet meer te tonen + Schakel uit om reacties niet te tonen Automatisch afspelen - Reacties - + %s reactie + %s reacties Geen reacties Kan reacties niet laden Sluiten - Het Storage Acces Framework laat downloads naar een externe SD kaart toe. -\n -\nNota: niet alle toestellen zijn compatibel + Het \'Storage Access Framework\' laat downloads naar een externe SD kaart toe. +\n Niet alle toestellen zijn compatibel Wis data Verander de downloadmappen om effect te bekomen + Afspelen hervatten + Laatste afspeelpositie herstellen + Posities in lijsten + Afspeelpositie-indicatoren in lijsten tonen + Afspeelposities verwijderd. + Bestand verplaatst of verwijderd + Een bestand met deze naam bestaat al + kan het bestand niet overschrijven + Er is een download in behandeling met deze naam + Geen ruimte meer op het apparaat + Voortgang verloren, omdat het bestand is verwijderd + Wil je je downloadgeschiedenis wissen of alle gedownloade bestanden verwijderen\? + Downloadwachtrij beperken + Een download zal tegelijkertijd worden uitgevoerd + Downloads starten + Downloads pauzeren + Vraag waar te downloaden + Je zal gevraagd worden waar elke download op te slaan + Je zal gevraagd worden waar elke download op te slaan. +\nKies SAF als je wilt downloaden naar een externe SD-kaart + SAF gebruiken + Afspeelposities verwijderen + Alle afspeelposities verwijderen + Alle afspeelposities verwijderen\? + Niemand kijkt + + %s kijkt + %s kijken + + Niemand luistert + + %s luisteraar + %s luisteraars + + De taal zal veranderen zodra de app opnieuw is opgestart. + Standaardkiosk + Duur van snel voor-/achteruit zoeken + PeerTube-instanties + Selecteer je favoriete PeerTube-instanties + Zoek de instanties die je leuk vindt op %s + Instantie toevoegen + Instantie-URL invoeren + Kon instantie niet valideren + Alleen HTTPS-URL\'s worden ondersteund + Instantie bestaat al + Lokaal + Onlangs toegevoegd + Automatisch gegenereerd (geen uploader gevonden) + herstellen + Kan deze download niet herstellen + Kies een instantie + Videominiatuur op vergrendelscherm + Een videominiatuur wordt getoond op het vergrendelscherm wanneer de achtergrondspeler wordt gebruikt + Downloadgeschiedenis wissen + Gedownloade bestanden verwijderen + %1$s downloads verwijderd + Geef toestemming voor weergave over andere apps + App-taal + Systeemstandaard + Druk op \"Klaar\" zodra opgelost + Klaar + Video\'s + Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden + Dempen + Dempen opheffen + Hulp + + %d seconde + %d secondes + + + %d minuut + %d minuten + + + %d uur + %d uren + + + %d dag + %d dagen + + Feedgroepen + Oudste abonnementsupdate: %s + Niet geladen: %d + Feed aan het laden… + Feed aan het verwerken… + Abonnementen selecteren + Geen abonnement geselecteerd + + %d geselecteerd + %d geselecteerd + + Lege groepsnaam + Naam + Wil je deze groep verwijderen\? + Nieuw + Feed + Drempel voor feedupdate + Tijd na de laatste update voordat een abonnement als verouderd wordt beschouwd — %s + Altijd updaten + Uit speciale feed ophalen indien beschikbaar + Beschikbaar in sommige services, het is meestal veel sneller, maar kan een beperkte hoeveelheid items en vaak onvolledige informatie (bijv. geen duur, itemtype, of livestatus) bevatten. + Snelle modus inschakelen + Snelle modus uitschakelen + Denk je dat het laden van de feed te sloom is\? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken). +\n +\nNewPipe biedt twee strategieën aan voor het laden van de feed: +\n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is. +\n• Een speciale feed ophalen, wat snel maar meestal incompleet is. +\n +\nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn. +\n +\nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed. +\n +\nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie. \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 29d030e1e..c50dbf75a 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -452,7 +452,6 @@ ਸਰਵਰ ਮਲਟੀ-Threaded ਡਾਊਨਲੋਡਸ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ, ਇਸ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ @string/msg_threads = 1 ਨਹੀਂ ਲਭਿਆ Post-processing ਫੇਲ੍ਹ - ਮੁਕੰਮਲ ਹੋਈਆਂ ਡਾਊਨਲੋਡ ਸਾਫ਼ ਕਰੋ ਰੁੱਕੋ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ ਡਾਉਨਲੋਡ ਰੱਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 694c29554..1d77d7461 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -16,7 +16,7 @@ Użyj zewnętrznego odtwarzacza audio %1$s wyświetleń Opublikowano %1$s - Nie znaleziono odtwarzacza strumieni. Zainstalować VLC\? + Nie znaleziono odtwarzacza strumienia. Zainstalować VLC\? Folder pobierania wideo Pobrane pliki wideo są przechowywane tutaj Wybierz folder pobierania plików wideo @@ -458,7 +458,6 @@ Serwer nie akceptuje pobierania wielowątkowego, spróbuj ponownie za pomocą @string/msg_threads = 1 Nie znaleziono Przetwarzanie końcowe nie powiodło się - Wyczyść ukończone pobieranie Zatrzymaj Maksymalna liczba powtórzeń Maksymalna liczba prób przed anulowaniem pobierania @@ -550,10 +549,10 @@ Po rozwiązaniu naciśnij „Gotowe” Gotowe Filmy - - %s sekund - %s sekund - %s sekund + + %d sekund + %d sekund + %d sekund Ze względu na ograniczenia ExoPlayer, czas trwania wyszukiwania został ustawiony na %d sekund Wycisz diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c96435799..bab963916 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -465,7 +465,6 @@ abrir em modo popup O servidor não aceita downloads em multi-thread, tente com @string/msg_threads = 1 Não encontrado Falha no pós processamento - Limpar downloads finalizados Parar Tentativas Máximas Número máximo de tentativas antes de cancelar o download @@ -552,11 +551,11 @@ abrir em modo popup Toque em \"Feito\" ao resolver Feito Vídeos - - %s segundo - %s segundos + + %d segundo + %d segundos - Devido as configurações do ExoPlayer, a duração de busca foi alterada para %d segundos + Devido a restrições do ExoPlayer a duração da pesquisa foi definida como %d segundos Desativar som Ativar som \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 504b98642..818cf719e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -454,7 +454,6 @@ O servidor não aceita transferências de vários processos, tente novamente com @string/msg_threads = 1 Não encontrado Pós-processamento falhado - Limpar transferências concluídas Parar Tentativas máximas Número máximo de tentativas antes de cancelar a transferência diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a0d292c80..55fd393a9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -455,7 +455,6 @@ Сервер не найден Сервер не принимает многопоточные загрузки, повторная попытка с @string/msg_threads = 1 Не найдено - Очистить завершённые Остановить События Конференции @@ -549,10 +548,10 @@ По завершении нажмите Готово Готово Видео - - %s секунда - %s секунды - %s секунд + + %d секунда + %d секунды + %d секунд Из-за ограничений ExoPlayer точность перемотки составляет %d секунд Отключить звук diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index bdda945bc..1e07837c0 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -374,7 +374,6 @@ Rýchlosť Výška "Spomalenie (môže spôsobovať skreslenie)" - Predvolené Vymazať históriu pozretí Odstráni históriu a pozície prehrávaných streamov Vymazať celú históriu pozretí\? @@ -464,7 +463,6 @@ Server neakceptuje preberanie viacerých vlákien, zopakujte s @string/msg_threads = 1 Nenájdené Post-spracovanie zlyhalo - Vyčistiť dokončené sťahovania Stop Maximum opakovaní Maximálny počet pokusov pred zrušením stiahnutia @@ -549,4 +547,66 @@ Súhlas pre zobrazenie cez ďalšie aplikácie Jazyk aplikácie Predvolený + Vyrieš a stlač \"Hotovo\" + Hotovo + Videá + Pre obmedzenie ExoPlayera bolo prehľadávania nastavené na % d sekúnd + Stlmiť + Povoliť + Pomoc + + %d sekunda + %d sekundy + %d sekúnd + + + %d minuta + %d minuty + %d minút + + + %d hodina + %d hodiny + %d hodín + + + %d deň + %d dni + %d dní + + Skupiny zdrojov + Najstaršia aktualizácia odberu: %s + Nenačítané: %d + Načítavanie zdroja… + Spracovávanie zdroja… + Vyberte odbery + Žiadne vybrané odbery + + %d vybraný + %d vybrané + %d vybraných + + Bez názvu skupiny + Názov + Chcete zmazať vybranú skupinu\? + Nová + Zdroj + Interval obnovy zdroja + Čas po ktorom sa kontrola odberu považuje za zastaralú — %s + Vždy aktualizovať + Načítať z vyhradeného zdroja, ak je k dispozícii + Služba je dostupná len pre určité zdroje, zvyčajne je rýchlejšia ale môže vrátiť obmedzený počet položiek alebo neúplné informácie (napr. dĺžka, typ, status). + Povoliť rýchly režim + Zakázať rýchly režim + Myslíte si, že načítavanie informačného kanála je príliš pomalé\? Ak áno, skúste povoliť rýchle načítanie (môžete ho zmeniť v nastaveniach alebo stlačením tlačidla nižšie). +\n +\nNewPipe ponúka dve stratégie načítania informačného kanála: +\n• Načítava sa celý kanál prihlásenia na odber, ktorý je pomalý, ale úplný. +\n• Používanie vyhradeného koncového bodu služby, ktorý je rýchly, ale zvyčajne nie je kompletný. +\n +\nRozdiel medzi nimi je ten, že v prípade rýchleho videa zvyčajne chýbajú nejaké informácie, napríklad trvanie alebo typ položky (nedá sa rozlíšiť medzi živými videami a normálnymi videami) a môže sa vrátiť menej položiek. +\n +\nYouTube je príkladom služby, ktorá ponúka túto rýchlu metódu s informačným kanálom RSS. +\n +\nTakže výber sa zredukuje na to, čo uprednostňujete: rýchlosť alebo presné informácie. \ No newline at end of file diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 1ef4bb6f5..49b1cfba1 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -47,6 +47,5 @@ Lista e videove Po Më vonë - Standard në pritje të diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f95944aee..d2efc6b4f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -447,7 +447,6 @@ Servern accepterar inte flertrådade nedladdningar, försök igen med @string/msg_threads = 1 Hittades inte Efterbehandling misslyckades - Töm färdiga nedladdningar Stanna Max försök Max antal försök tills nedladdning avbryts diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index b4f506158..e1d7a8f9f 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -427,7 +427,6 @@ เซิร์ฟเวอร์ไม่ส่งข้อมูล เซิร์ฟเวอร์ไม่รองรับการดาวน์โหลดแบบพร้อมกันหลายส่วน โปรดลองอีกครั้งด้วย @string/msg_threads = 1 ไม่พบ - ล้างการดาวน์โหลดที่เสร็จสิ้นแล้ว หยุด จำนวนครั้งสูงสุดที่จะลองใหม่ จำนวนครั้งสูงสุดที่จะลองใหม่ก่อนจะยกเลิกการดาวน์โหลด diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 05bc3cbe7..0e98d7971 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -356,7 +356,6 @@ Üstveri önbelleği temizlendi Oynatım Hızı Denetimleri Hız - Öntanımlı Ses yüksekliği Ayır (bozulmaya neden olabilir) İndirilebilecek akış yok @@ -451,7 +450,6 @@ Sunucu, çok iş parçacıklı indirmeleri kabul etmez, @string/msg_threads = 1 ile yeniden deneyin Bulunamadı İşlem sonrası başarısız - Tamamlanan indirmeleri temizle Durdur Azami deneme sayısı İndirmeyi iptal etmeden önce azami deneme sayısı @@ -544,9 +542,58 @@ Çözüldüğünde \"Bitti\" butonuna basın Bitti Videolar - - %s saniye - %s saniye + + %d saniye + %d saniye ExoPlayer kısıtlamaları gereği konumlama süresi %d saniyeye belirlenmiştir + Sessiz + Sesli + Yardım + + %d dakika + %d dakika + + + %d saat + %d saat + + + %d gün + %d gün + + Besleme kümeleri + En eski abonelik güncellemesi: %s + Yüklenmedi: %d + Besleme yükleniyor… + Besleme işleniyor… + Abonelikleri seç + Abonelik seçilmedi + + %d seçildi + %d seçildi + + Boş küme adı + Ad + Bu kümeyi silmek istiyor musunuz\? + Yeni + Besleme + Besleme güncelleme eşiği + Bir aboneliğin eski sayılmadan önce son güncellemeden sonra geçen zaman — %s + Her zaman güncelle + Uygunken adanmış beslemeden edin + Bazı servislerde kullanılabilir, genellikle daha hızlıdır ancak kısıtlı sayıda öge ve eksik bilgi (örn. süre, öge türü, canlı durumu olmaksızın) getirilebilir. + Hızlı kipi etkinleştir + Hızlı kipi devre dışı bırak + Beslemenin çok yavaş yüklendiğini mi düşünüyorsunuz\? Öyleyse, hızlı yüklemeyi etkinleştirin (ayarlardan değiştirebilir veya aşağıdaki düğmeye dokunabilirsiniz). +\n +\nNewPipe iki besleme yükleme yordamı sunar: +\n• Tüm abonelik kanalını edinme, bu yavaş ancak tamdır. +\n• Adanmış hizmet son noktası kullanır, bu hızlıdır ancak genellikle tam değildir. +\n +\nİkisinin arasındaki fark, hızlı olanın genellikle ögenin süresi veya türü (canlı ve sıradan videoları ayrımsayamaz) gibi bazı bilgilerden yoksunluğu ve daha az öge getirmesidir. +\n +\nYouTube, RSS beslemesiyle bu hızlı yöntemi sunan servislerden biridir. +\n +\nSeçim, sizin neyi yeğlediğinize kalmış: hız veya kusursuz bilgi. \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0d0c6082c..9c9a78816 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -462,7 +462,6 @@ Сервер не підтримує завантаження у декілька потоків, спробуйте з параметром @string/msg_threads = 1 Не знайдено Невдала пост-обробка - Очистити завершені завантаження Зупинити Максимум спроб Максимальна кількість спроб перед скасуванням завантаження diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 2c712d878..f46cad0a7 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -451,7 +451,6 @@ سرور ملٹی تھریڈڈ ڈاؤن لوڈز کو قبول نہیں کرتا ہے، @string/msg_threads = 1 کے ساتھ دوبارہ کوشش کریں نہیں ملا بعد کا عمل نا کام - ختم شدہ ڈاؤن لوڈ صاف کریں روکیں زیادہ سے زیادہ کوششیں ڈاؤن لوڈ منسوخ کرنے سے پہلے کوششوں کی زیادہ سے زیادہ تعداد diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 0f6cfe96f..994fbabb4 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -451,7 +451,6 @@ Máy chủ không chấp nhận tải đa luồng, thử lại với số luồng = 1 Không tìm thấy Xử lý thất bại - Dọn các tải về đã hoàn thành Dừng Số lượt thử lại tối đa Số lượt thử lại trước khi hủy tải về diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8d210c067..78d240ae8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -458,7 +458,6 @@ 服务器未发送数据 找不到 NOT FOUND 后期处理失败 - 清除已完成的下载 停止 最大重试次数 取消下载前的最多尝试次数 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2837990ac..d5071dded 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -355,7 +355,6 @@ 節奏 音高 解除掛鉤(可能導致失真) - 預設 偏好的「開啟」動作 開啟內容時的預設動作 — %s 沒有可供下載的串流 @@ -449,7 +448,6 @@ 伺服器不接受多執行緒下載,請以 @string/msg_threads = 1 重試 找不到 後處理失敗 - 清除已結束的下載 停止 最大重試次數 在取消下載前的最大嘗試數 @@ -537,10 +535,53 @@ 解決後請按「完成」 完成 影片 - - %s秒 + + %d秒 因為 ExoPlayer 的限制,搜尋持續時間設定為 %d 秒 靜音 取消靜音 + 說明 + + %d 分鐘 + + + %d 小時 + + + %d 天 + + Feed 群組 + 最舊訂閱更新:%s + 未載入:%d + 正在載入 feed…… + 正在處理 feed…… + 選取訂閱 + 未選取訂閱 + + 已選取 %d + + 清空群組名稱 + 名稱 + 您想要刪除此群組嗎? + + Feed + Feed 更新閾值 + 上次更新後,訂閱被視為過時的時間 — %s + 總是更新 + 在可用時從專用 feed 擷取 + 其在某些服務中可用,且通常較快速,但可能只會回傳有限的項目,而且資訊通常不完整(例如:沒有持續時間、項目類型、沒有即時狀態)。 + 啟用快速模式 + 停用快速模式 + 您覺得 feed 載入太慢了嗎?如果是的話,試著啟用快速載入(您可以在設定中變更或按下下方的按鈕)。 +\n +\nNewPipe 提供兩個 feed 載入策略: +\n• 擷取整個訂閱頻道,慢但是完整。 +\n• 使用專用的伺服器端點,較快速但是通常不完整。 +\n +\n兩者之間的差別是,較快速的通常缺少部份資訊,如項目的持續時間或類型(無法區分直播影片或一般影片),而且其可能會回傳較少項目。 +\n +\nYouTube 是一種透過其 RSS feed 提供這種快速方式的例子。 +\n +\n因此,請選取您較偏好的:速度或準確的資訊。 \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 4cda52a99..39a51f234 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -16,6 +16,7 @@ + diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index e97bf11ca..980af0943 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -33,7 +33,7 @@ 10000 + (seconds) exist. Otherwise this array is picked--> 5 seconds 10 seconds 15 seconds diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a1e9d28d1..ea1cb31c8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -594,11 +594,6 @@ App language System default Due to ExoPlayer constraints the seek duration was set to %d seconds - - %s second - %s seconds - - %d second @@ -628,8 +623,11 @@ Loading feed… Processing feed… Select subscriptions - Selected: %d No subscription selected + + %d selected + %d selected + Empty group name Name Do you want to delete this group? diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f7d09ef9c..9a41752b1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -33,6 +33,7 @@ @drawable/ic_expand_more_black_24dp @drawable/ic_expand_less_black_24dp @drawable/ic_volume_off_black_24dp + @drawable/ic_volume_up_black_24dp @drawable/ic_palette_black_24dp @drawable/ic_language_black_24dp @drawable/ic_history_black_24dp @@ -139,6 +140,7 @@ @drawable/ic_expand_more_white_24dp @drawable/ic_expand_less_white_24dp @drawable/ic_volume_off_white_24dp + @drawable/ic_volume_up_white_24dp @drawable/ic_palette_white_24dp @drawable/ic_language_white_24dp @drawable/ic_history_white_24dp diff --git a/app/src/test/java/org/schabi/newpipe/util/urlfinder/UrlFinderTest.kt b/app/src/test/java/org/schabi/newpipe/util/urlfinder/UrlFinderTest.kt new file mode 100644 index 000000000..7bd0f50a6 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/util/urlfinder/UrlFinderTest.kt @@ -0,0 +1,99 @@ +package org.schabi.newpipe.util.urlfinder + +import org.junit.Assert.assertEquals +import org.junit.Test + +/** + * Keep in mind that patterns from PatternsCompat are used, and they are already being extensively tested. + */ +class UrlFinderTest { + @Test fun `first url from long text`() { + val expected = "https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_" + val result = UrlFinder.firstUrlFromInput(""" + |Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + |Eu tincidunt tortor aliquam nulla. URL: https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_ Sed dictum consequat dui. + |Pharetra diam sit amet nisl suscipit adipiscing bibendum est. + |Volutpat sed cras ornare arcu dui vivamus. Nulla posuere sollicitudin aliquam ultrices sagittis. + |Amet nisl purus in mollis nunc sed id. Ut aliquam purus sit amet luctus. Sit amet nisl suscipit adipiscing. + |Dapibus ultrices in iaculis nunc sed augue lacus viverra. Nisl purus in mollis nunc. + |Viverra nibh cras pulvinar mattis. ####!@!@!@!#### Not this one: https://www.youtube.com/playlist?list=SHOULD_NOT Nunc sed blandit libero volutpat. + |Nisl tincidunt eget nullam non nisi est sit amet. Purus in massa tempor nec feugiat nisl pretium fusce id. + |Vulputate eu scelerisque felis imperdiet proin fermentum leo vel.""".trimMargin()) + + assertEquals(expected, result) + } + + @Test fun `no url from long text`() { + val result = UrlFinder.firstUrlFromInput(""" + |Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + |Eu tincidunt tortor aliquam nulla. Sed dictum consequat dui. Pharetra diam sit amet nisl suscipit adipiscing bibendum est. + |Volutpat sed cras ornare arcu dui vivamus. Nulla posuere sollicitudin aliquam ultrices sagittis. + |Amet nisl purus in mollis nunc sed id. Ut aliquam purus sit amet luctus. Sit amet nisl suscipit adipiscing. + |Dapibus ultrices in iaculis nunc sed augue lacus viverra. Nisl purus in mollis nunc. + |Viverra nibh cras pulvinar mattis. Not this one: sed blandit libero volutpat. + |Nisl tincidunt eget nullam non nisi est sit amet. Purus in massa tempor nec feugiat nisl pretium fusce id. + |Vulputate eu scelerisque felis imperdiet proin fermentum leo vel.""".trimMargin()) + + assertEquals(null, result) + } + + @Test fun `null and empty input`() { + assertEquals(null, UrlFinder.firstUrlFromInput(null)) + assertEquals(null, UrlFinder.firstUrlFromInput("")) + assertEquals(null, UrlFinder.firstUrlFromInput(" ")) + } + + @Test fun `normal urls`() { + assertEquals("https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_", + UrlFinder.firstUrlFromInput("https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_")) + + assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", + UrlFinder.firstUrlFromInput("https://www.youtube.com/watch?v=dQw4w9WgXcQ")) + + assertEquals("http://www.youtube.com/watch?v=dQw4w9WgXcQ", + UrlFinder.firstUrlFromInput("http://www.youtube.com/watch?v=dQw4w9WgXcQ")) + + assertEquals("https://www.google.com", UrlFinder.firstUrlFromInput("https://www.google.com")) + assertEquals("http://www.google.com/test/", UrlFinder.firstUrlFromInput("http://www.google.com/test/")) + assertEquals("https://www.google.com/test?x=yz#123", UrlFinder.firstUrlFromInput("https://www.google.com/test?x=yz#123")) + assertEquals("https://208.67.222.222", UrlFinder.firstUrlFromInput("https://208.67.222.222")) + assertEquals("https://208.67.222.222/", UrlFinder.firstUrlFromInput("https://208.67.222.222/")) + assertEquals("http://208.67.222.222/", UrlFinder.firstUrlFromInput("http://208.67.222.222/")) + } + + @Test fun `unknown protocols`() { + assertEquals(null, UrlFinder.firstUrlFromInput("httpsS://www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("rtsp://www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("ftp://www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("ASDF://www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("https→://www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("file:///etc/fstab")) + assertEquals(null, UrlFinder.firstUrlFromInput("://www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("www.youtube.com/watch?v=dQw4w9WgXcQ")) + assertEquals(null, UrlFinder.firstUrlFromInput("youtube.com/watch?v=dQw4w9WgXcQ")) + } + + @Test fun `no ipv6 urls`() { + assertEquals(null, UrlFinder.firstUrlFromInput("http://[2620:119:35::35]/test")) + assertEquals(null, UrlFinder.firstUrlFromInput("https://[2620:119:35::35]")) + } + + @Test fun `random prefixes and suffixes`() { + assertEquals("https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_", + UrlFinder.firstUrlFromInput("$#!@#@!#https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_ @@@@@@@@@@@")) + + assertEquals("https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_", + UrlFinder.firstUrlFromInput("(___\"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\")))_")) + + assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", + UrlFinder.firstUrlFromInput(" https://www.youtube.com/watch?v=dQw4w9WgXcQ ")) + + assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", + UrlFinder.firstUrlFromInput(" ------_---__-https://www.youtube.com/watch?v=dQw4w9WgXcQ !!!!!!")) + + assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", + UrlFinder.firstUrlFromInput("****https://www.youtube.com/watch?v=dQw4w9WgXcQ _")) + assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", + UrlFinder.firstUrlFromInput("https://www.youtube.com/watch?v=dQw4w9WgXcQ\"Not PartOfTheUrl")) + } +} \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/870.txt b/fastlane/metadata/android/en-US/changelogs/870.txt new file mode 100644 index 000000000..859a1f8b9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/870.txt @@ -0,0 +1,2 @@ +This is a hotfix release updating NewPipe to allow using SoundCloud without major hassles again. +SoundCloud's v2 API is used in the extractor now and the detection of invalid client IDs has been improved. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/900.txt b/fastlane/metadata/android/en-US/changelogs/900.txt new file mode 100644 index 000000000..b3086b13a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/900.txt @@ -0,0 +1,14 @@ +New +• Subscription groups and sorted feeds +• Mute button in players + +Improved +• Allow opening music.youtube.com and media.ccc.de links in NewPipe +• Relocate two settings from Appearance to Content +• Hide 5, 15, 25 second seek options if inexact seek is enabled + +Fixed +• some WebM videos are not seekable +• database backup on Android P +• crash when sharing a downloaded file +• tons of YouTube extraction issue and more ... \ No newline at end of file