From 1b0a958436f2ec9f103ecc3e7da0c8463239ad9a Mon Sep 17 00:00:00 2001 From: Roger Date: Tue, 13 Aug 2019 22:10:04 -0400 Subject: [PATCH 01/46] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..2c79d62cd --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +liberapay: TeamNewPipe From 652184506b238704f0841d873e25ded9e98552d8 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Wed, 14 Aug 2019 15:30:34 -0300 Subject: [PATCH 02/46] check for Storage Access Framework features * creating files though saf * picking folder though saf --- .../newpipe/download/DownloadDialog.java | 4 +- .../settings/DownloadSettingsFragment.java | 27 ++++++------ .../newpipe/settings/NewPipeSettings.java | 42 ++++++++++++++++++- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index ea212e1e8..175aaca92 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -569,7 +569,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck // This part is called if with SAF preferred: // * older android version running // * save path not defined (via download settings) - // * the user as checked the "ask where to download" option + // * the user checked the "ask where to download" option if (!askForSavePath) Toast.makeText(context, getString(R.string.no_available_dir), Toast.LENGTH_LONG).show(); @@ -728,7 +728,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck try { if (storage.length() > 0) storage.truncate(); } catch (IOException e) { - Log.e(TAG, "failed to overwrite the file: " + storage.getUri().toString(), e); + Log.e(TAG, "failed to truncate the file: " + storage.getUri().toString(), e); showFailedDialog(R.string.overwrite_failed); return; } diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index 4212f4cb8..db7754caf 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -35,8 +35,6 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { private String DOWNLOAD_PATH_VIDEO_PREFERENCE; private String DOWNLOAD_PATH_AUDIO_PREFERENCE; - private String DOWNLOAD_STORAGE_ASK; - private Preference prefPathVideo; private Preference prefPathAudio; private Preference prefStorageAsk; @@ -49,14 +47,14 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { DOWNLOAD_PATH_VIDEO_PREFERENCE = getString(R.string.download_path_video_key); DOWNLOAD_PATH_AUDIO_PREFERENCE = getString(R.string.download_path_audio_key); - DOWNLOAD_STORAGE_ASK = getString(R.string.downloads_storage_ask); + final String downloadStorageAsk = getString(R.string.downloads_storage_ask); prefPathVideo = findPreference(DOWNLOAD_PATH_VIDEO_PREFERENCE); prefPathAudio = findPreference(DOWNLOAD_PATH_AUDIO_PREFERENCE); - prefStorageAsk = findPreference(DOWNLOAD_STORAGE_ASK); + prefStorageAsk = findPreference(downloadStorageAsk); updatePreferencesSummary(); - updatePathPickers(!defaultPreferences.getBoolean(DOWNLOAD_STORAGE_ASK, false)); + updatePathPickers(!defaultPreferences.getBoolean(downloadStorageAsk, false)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { prefStorageAsk.setSummary(R.string.downloads_storage_ask_summary); @@ -180,7 +178,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { } Intent i; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.hasOpenDocumentTreeSupport) { i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) .putExtra("android.content.extra.SHOW_ADVANCED", true) .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | StoredDirectoryHelper.PERMISSION_FLAGS); @@ -221,16 +219,17 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { return; } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - // steps: - // 1. revoke permissions on the old save path - // 2. acquire permissions on the new save path - // 3. save the new path, if step(2) was successful - final Context ctx = getContext(); - if (ctx == null) throw new NullPointerException("getContext()"); - forgetSAFTree(ctx, defaultPreferences.getString(key, "")); + // revoke permissions on the old save path (required for SAF only) + final Context ctx = getContext(); + if (ctx == null) throw new NullPointerException("getContext()"); + forgetSAFTree(ctx, defaultPreferences.getString(key, "")); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.hasOpenDocumentTreeSupport) { + // steps to acquire the selected path: + // 1. acquire permissions on the new save path + // 2. save the new path, if step(2) was successful try { ctx.grantUriPermission(ctx.getPackageName(), uri, StoredDirectoryHelper.PERMISSION_FLAGS); diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index a0f3b6063..64f0db489 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -21,7 +21,10 @@ package org.schabi.newpipe.settings; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Build; import android.os.Environment; import android.preference.PreferenceManager; @@ -30,6 +33,7 @@ import android.support.annotation.NonNull; import org.schabi.newpipe.R; import java.io.File; +import java.util.List; /** * Helper for global settings @@ -58,6 +62,20 @@ public class NewPipeSettings { private NewPipeSettings() { } + /** + * Indicates if is possible pick a directory though the Storage Access Framework. + * {@code true} if at least one provider can handle {@link Intent#ACTION_OPEN_DOCUMENT_TREE} + * otherwise {@code false} + */ + public static boolean hasOpenDocumentTreeSupport = false; + + /** + * Indicates if is possible create a file though the Storage Access Framework. + * {@code true} if at least one provider can handle {@link Intent#ACTION_CREATE_DOCUMENT} + * otherwise {@code false} + */ + public static boolean hasCreateDocumentSupport = false; + public static void initSettings(Context context) { PreferenceManager.setDefaultValues(context, R.xml.appearance_settings, true); PreferenceManager.setDefaultValues(context, R.xml.content_settings, true); @@ -67,7 +85,14 @@ public class NewPipeSettings { PreferenceManager.setDefaultValues(context, R.xml.video_audio_settings, true); PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true); - if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + hasOpenDocumentTreeSupport = testFor(context, Intent.ACTION_OPEN_DOCUMENT_TREE); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + hasCreateDocumentSupport = testFor(context, Intent.ACTION_CREATE_DOCUMENT); + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !hasOpenDocumentTreeSupport) { getVideoDownloadFolder(context); getAudioDownloadFolder(context); } @@ -100,4 +125,19 @@ public class NewPipeSettings { private static String getNewPipeChildFolderPathForDir(File dir) { return new File(dir, "NewPipe").toURI().toString(); } + + private static boolean testFor(@NonNull Context ctx, @NonNull String intentAction) { + Intent queryIntent = new Intent(intentAction); + queryIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + + List infoList = ctx.getPackageManager() + .queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY); + + int availableProviders = 0; + for (ResolveInfo info : infoList) { + if (info.activityInfo.exported) availableProviders++; + } + + return availableProviders > 0; + } } From 950cf714d9e71f286f153027e3cb5b0b1c964d59 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Wed, 14 Aug 2019 22:15:42 -0300 Subject: [PATCH 03/46] use legacy file picker in those cases where saf is not available --- .../newpipe/download/DownloadDialog.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 175aaca92..6814a018c 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.download; import android.app.Activity; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; @@ -45,6 +46,8 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.extractor.utils.Localization; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.settings.NewPipeSettings; +import org.schabi.newpipe.util.FilePickerActivityHelper; import org.schabi.newpipe.util.FilenameUtils; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.SecondaryStreamHelper; @@ -52,7 +55,9 @@ import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; import org.schabi.newpipe.util.ThemeHelper; +import java.io.File; import java.io.IOException; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -72,7 +77,7 @@ import us.shandian.giga.service.MissionState; public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheckedChangeListener, AdapterView.OnItemSelectedListener { private static final String TAG = "DialogFragment"; private static final boolean DEBUG = MainActivity.DEBUG; - private static final int REQUEST_DOWNLOAD_PATH_SAF = 0x1230; + private static final int REQUEST_DOWNLOAD_SAVE_AS = 0x1230; @State protected StreamInfo currentInfo; @@ -311,12 +316,18 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_DOWNLOAD_PATH_SAF && resultCode == Activity.RESULT_OK) { + if (requestCode == REQUEST_DOWNLOAD_SAVE_AS && resultCode == Activity.RESULT_OK) { if (data.getData() == null) { showFailedDialog(R.string.general_error); return; } + if (ContentResolver.SCHEME_FILE.equals(data.getData().getScheme())) { + File file = new File(URI.create(data.getData().toString())); + checkSelectedDownload(null, data.getData(), file.getName(), StoredFileHelper.DEFAULT_MIME); + return; + } + DocumentFile docFile = DocumentFile.fromSingleUri(context, data.getData()); if (docFile == null) { showFailedDialog(R.string.general_error); @@ -574,7 +585,11 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck if (!askForSavePath) Toast.makeText(context, getString(R.string.no_available_dir), Toast.LENGTH_LONG).show(); - StoredFileHelper.requestSafWithFileCreation(this, REQUEST_DOWNLOAD_PATH_SAF, filename, mime); + if (NewPipeSettings.hasCreateDocumentSupport) + StoredFileHelper.requestSafWithFileCreation(this, REQUEST_DOWNLOAD_SAVE_AS, filename, mime); + else + startActivityForResult(FilePickerActivityHelper.chooseFileToSave(context, filename), REQUEST_DOWNLOAD_SAVE_AS); + return; } From dee3a18ea804384f48724e4388d8d9820a56dcee Mon Sep 17 00:00:00 2001 From: kapodamy Date: Wed, 14 Aug 2019 23:00:11 -0300 Subject: [PATCH 04/46] misc changes * restore permission request popup previously removed in #2486 * use legacy file picker in cases where saf file picker is not available * fix missing file check logic in prepareSelectedDownload method (DownloadDialog.java) --- .../java/org/schabi/newpipe/MainActivity.java | 12 ++++++ .../org/schabi/newpipe/RouterActivity.java | 36 ++++++++++------- .../newpipe/download/DownloadDialog.java | 39 +++++++++++++++---- .../fragments/detail/VideoDetailFragment.java | 5 ++- .../newpipe/settings/NewPipeSettings.java | 17 +++++--- .../schabi/newpipe/util/NavigationHelper.java | 3 ++ .../schabi/newpipe/util/PermissionHelper.java | 6 ++- 7 files changed, 88 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index bf538cc65..a9f2e9622 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -60,6 +60,7 @@ import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; import org.schabi.newpipe.util.ThemeHelper; @@ -421,6 +422,17 @@ public class MainActivity extends AppCompatActivity { return; } } + switch (requestCode) { + case PermissionHelper.DOWNLOADS_REQUEST_CODE: + NavigationHelper.openDownloads(this); + break; + case PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE: + Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_holder); + if (fragment instanceof VideoDetailFragment) { + ((VideoDetailFragment) fragment).openDownloadDialog(); + } + break; + } } /** diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 88f6bdb2b..89de0d0ef 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -74,10 +74,13 @@ import static org.schabi.newpipe.util.ThemeHelper.resolveResourceIdFromAttr; */ public class RouterActivity extends AppCompatActivity { - @State protected int currentServiceId = -1; + @State + protected int currentServiceId = -1; private StreamingService currentService; - @State protected LinkType currentLinkType; - @State protected int selectedRadioPosition = -1; + @State + protected LinkType currentLinkType; + @State + protected int selectedRadioPosition = -1; protected int selectedPreviously = -1; protected String currentUrl; @@ -257,7 +260,7 @@ public class RouterActivity extends AppCompatActivity { .setNegativeButton(R.string.just_once, dialogButtonsClickListener) .setPositiveButton(R.string.always, dialogButtonsClickListener) .setOnDismissListener((dialog) -> { - if(!selectionIsDownload) finish(); + if (!selectionIsDownload) finish(); }) .create(); @@ -358,13 +361,13 @@ public class RouterActivity extends AppCompatActivity { positiveButton.setEnabled(state); } - private void handleText(){ + private void handleText() { String searchString = getIntent().getStringExtra(Intent.EXTRA_TEXT); int serviceId = getIntent().getIntExtra(Constants.KEY_SERVICE_ID, 0); Intent intent = new Intent(getThemeWrapperContext(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); - NavigationHelper.openSearch(getThemeWrapperContext(),serviceId,searchString); + NavigationHelper.openSearch(getThemeWrapperContext(), serviceId, searchString); } private void handleChoice(final String selectedChoiceKey) { @@ -382,8 +385,10 @@ public class RouterActivity extends AppCompatActivity { } if (selectedChoiceKey.equals(getString(R.string.download_key))) { - selectionIsDownload = true; - openDownloadDialog(); + if (PermissionHelper.checkStoragePermissions(this, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { + selectionIsDownload = true; + openDownloadDialog(); + } return; } @@ -395,7 +400,7 @@ public class RouterActivity extends AppCompatActivity { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(intent -> { - if(!internalRoute){ + if (!internalRoute) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); } @@ -445,17 +450,21 @@ public class RouterActivity extends AppCompatActivity { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - for (int i: grantResults){ - if (i == PackageManager.PERMISSION_DENIED){ + for (int i : grantResults) { + if (i == PackageManager.PERMISSION_DENIED) { finish(); return; } } + if (requestCode == PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE) { + openDownloadDialog(); + } } private static class AdapterChoiceItem { final String description, key; - @DrawableRes final int icon; + @DrawableRes + final int icon; AdapterChoiceItem(String key, String description, int icon) { this.description = description; @@ -553,7 +562,8 @@ public class RouterActivity extends AppCompatActivity { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); boolean isExtVideoEnabled = preferences.getBoolean(getString(R.string.use_external_video_player_key), false); - boolean isExtAudioEnabled = preferences.getBoolean(getString(R.string.use_external_audio_player_key), false);; + boolean isExtAudioEnabled = preferences.getBoolean(getString(R.string.use_external_audio_player_key), false); + ; PlayQueue playQueue; String playerChoice = choice.playerChoice; diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 6814a018c..a9afc93d5 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -2,13 +2,13 @@ package org.schabi.newpipe.download; import android.app.Activity; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; +import android.os.Environment; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.IdRes; @@ -34,6 +34,8 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import com.nononsenseapps.filepicker.Utils; + import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; @@ -50,6 +52,7 @@ import org.schabi.newpipe.settings.NewPipeSettings; import org.schabi.newpipe.util.FilePickerActivityHelper; import org.schabi.newpipe.util.FilenameUtils; import org.schabi.newpipe.util.ListHelper; +import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.SecondaryStreamHelper; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; @@ -57,7 +60,6 @@ import org.schabi.newpipe.util.ThemeHelper; import java.io.File; import java.io.IOException; -import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -178,6 +180,11 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck if (DEBUG) Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]"); + if (!PermissionHelper.checkStoragePermissions(getActivity(), PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { + getDialog().dismiss(); + return; + } + context = getContext(); setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context)); @@ -322,9 +329,9 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck return; } - if (ContentResolver.SCHEME_FILE.equals(data.getData().getScheme())) { - File file = new File(URI.create(data.getData().toString())); - checkSelectedDownload(null, data.getData(), file.getName(), StoredFileHelper.DEFAULT_MIME); + if (data.getData().getAuthority() != null && data.getData().getAuthority().startsWith(context.getPackageName())) { + File file = Utils.getFileForUri(data.getData()); + checkSelectedDownload(null, Uri.fromFile(file), file.getName(), StoredFileHelper.DEFAULT_MIME); return; } @@ -585,10 +592,21 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck if (!askForSavePath) Toast.makeText(context, getString(R.string.no_available_dir), Toast.LENGTH_LONG).show(); - if (NewPipeSettings.hasCreateDocumentSupport) + if (NewPipeSettings.hasCreateDocumentSupport) { StoredFileHelper.requestSafWithFileCreation(this, REQUEST_DOWNLOAD_SAVE_AS, filename, mime); - else - startActivityForResult(FilePickerActivityHelper.chooseFileToSave(context, filename), REQUEST_DOWNLOAD_SAVE_AS); + } else { + File initialSavePath; + if (radioStreamsGroup.getCheckedRadioButtonId() == R.id.audio_button) + initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MUSIC); + else + initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MOVIES); + + initialSavePath = new File(initialSavePath, filename); + startActivityForResult( + FilePickerActivityHelper.chooseFileToSave(context, initialSavePath.getAbsolutePath()), + REQUEST_DOWNLOAD_SAVE_AS + ); + } return; } @@ -639,6 +657,11 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck // This part is called if: // * using SAF on older android version // * save path not defined + // * if the file exists overwrite it, is not necessary ask + if (!storage.existsAsFile() && !storage.create()) { + showFailedDialog(R.string.error_file_creation); + return; + } continueSelectedDownload(storage); return; } else if (targetFile == null) { 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 9d8481251..d0ed04279 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 @@ -384,7 +384,10 @@ public class VideoDetailFragment } break; case R.id.detail_controls_download: - this.openDownloadDialog(); + if (PermissionHelper.checkStoragePermissions(activity, + PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { + this.openDownloadDialog(); + } break; case R.id.detail_uploader_root_layout: if (TextUtils.isEmpty(currentInfo.getUploaderUrl())) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 64f0db489..cda3cad10 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -86,10 +86,10 @@ public class NewPipeSettings { PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - hasOpenDocumentTreeSupport = testFor(context, Intent.ACTION_OPEN_DOCUMENT_TREE); + hasOpenDocumentTreeSupport = testFor(context, Intent.ACTION_OPEN_DOCUMENT_TREE, false); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - hasCreateDocumentSupport = testFor(context, Intent.ACTION_CREATE_DOCUMENT); + hasCreateDocumentSupport = testFor(context, Intent.ACTION_CREATE_DOCUMENT, true); } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !hasOpenDocumentTreeSupport) { @@ -118,7 +118,7 @@ public class NewPipeSettings { } @NonNull - private static File getDir(String defaultDirectoryName) { + public static File getDir(String defaultDirectoryName) { return new File(Environment.getExternalStorageDirectory(), defaultDirectoryName); } @@ -126,9 +126,14 @@ public class NewPipeSettings { return new File(dir, "NewPipe").toURI().toString(); } - private static boolean testFor(@NonNull Context ctx, @NonNull String intentAction) { - Intent queryIntent = new Intent(intentAction); - queryIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + private static boolean testFor(@NonNull Context ctx, @NonNull String intentAction, boolean isFile) { + Intent queryIntent = new Intent(intentAction) + .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + + if (isFile) { + queryIntent.setType("*/*"); + queryIntent.addCategory(Intent.CATEGORY_OPENABLE); + } List infoList = ctx.getPackageManager() .queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY); diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index bb176166b..89c4b33fe 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -446,6 +446,9 @@ public class NavigationHelper { } public static boolean openDownloads(Activity activity) { + if (!PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOADS_REQUEST_CODE)) { + return false; + } Intent intent = new Intent(activity, DownloadActivity.class); activity.startActivity(intent); return true; diff --git a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java index 1367b895c..2fe5f95e4 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java @@ -18,10 +18,12 @@ import android.widget.Toast; import org.schabi.newpipe.R; public class PermissionHelper { + public static final int DOWNLOAD_DIALOG_REQUEST_CODE = 778; + public static final int DOWNLOADS_REQUEST_CODE = 777; public static boolean checkStoragePermissions(Activity activity, int requestCode) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - if(!checkReadStoragePermissions(activity, requestCode)) return false; + if (!checkReadStoragePermissions(activity, requestCode)) return false; } return checkWriteStoragePermissions(activity, requestCode); } @@ -89,7 +91,7 @@ public class PermissionHelper { i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); return false; - }else return true; + } else return true; } public static boolean isPopupEnabled(Context context) { From 45ad8621cf8f7703dfc00c2bc6c4d962ed22566a Mon Sep 17 00:00:00 2001 From: Kowith Singkornkeeree Date: Mon, 12 Aug 2019 13:13:55 +0000 Subject: [PATCH 05/46] Translated using Weblate (Thai) Currently translated at 59.4% (268 of 451 strings) --- app/src/main/res/values-th/strings.xml | 447 ++++++++++++++++++++++++- 1 file changed, 446 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index a6b3daec9..d0778709b 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -1,2 +1,447 @@ - \ No newline at end of file + + แตะที่ปุ่มค้นหาเพื่อเริ่มต้น + %1$s วิว + เผยแพร่เมื่อ %1$s + ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ คุณต้องการติดตั้ง VLC หรือไม่\? + ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ (คุณสามารถติดตั้ง VLC เพื่อดูวีดีโอ) + ติดตั้ง + ยกเลิก + เปิดด้วยเว็บบราวเซอร์ + เปิดในโหมดป๊อปอัพ + แชร์ + ดาวน์โหลด + ดาวน์โหลดไฟล์สตรีม + ค้นหา + ตั้งค่า + หรือคุณหมายถึง: %1$s\? + แชร์ด้วย + เลือกบราวเซอร์ + หมุน + ใช้แอปเล่นวีดีโอภายนอก + ใช้แอปเล่นเสียงภายนอก + NewPipe โหมดป๊อปอัพ + บอกรับ + บอกรับแล้ว + ยกเลิกการบอกรับ + ยกเลิกการบอกรับช่องแล้ว + ไม่สามารถเปลี่ยนสถานะการบอกรับได้ + ไม่สามารถอัปเดตการบอกรับข้อมูล + แสดงข้อมูล + หน้าหลัก + การสมัครรับข้อมูล + เพลย์ลิสต์ที่เก็บไว้ + แท็บใหม่ + เลือกแท็บ + มีอะไรใหม่ + พื้นหลัง + ป๊อปอัพ + เพิ่มไปยัง + เส้นทางการดาวน์โหลดวิดีโอ + เส้นทางในการจัดเก็บวิดีโอที่ดาวน์โหลดมา + ป้อนเส้นทางการดาวน์โหลดสำหรับวิดีโอ + โฟลเดอร์ที่ดาวน์โหลดเสียง + เสียงที่ดาวน์โหลดถูกเก็บไว้ที่นี่ + ป้อนเส้นทางการดาวน์โหลดสำหรับไฟล์เสียง + เล่นอัตโนมัติ + เล่นวิดีโอเมื่อ NewPipe ถูกเรียกจากแอปอื่น + ความละเอียดเริ่มต้น + ความละเอียดเริ่มต้นในโหมดป๊อปอัพ + แสดงความละเอียดที่สูงขึ้น + เฉพาะบางอุปกรณ์ที่รองรับการเล่นวิดีโอ 2K/4K + เปิดด้วย Kodi + ไม่พบแอป Kore จะติดตั้งหรือไม่\? + แสดงตัวเลือก \"เปิดด้วย Kodi\" + แสดงตัวเลือกในการเล่นวิดีโอผ่าน Kodi media center + เสียง + ฟอร์แมตเสียงเริ่มต้น + ฟอร์แมตวีดีโอเริ่มต้น + ธีม + สว่าง + มืด + สีดำ + จำขนาดและตำแหน่งของป๊อปอัพ + จำขนาดและตำแหน่งสุดท้ายของป๊อปอัพ + ใช้การข้ามที่ไม่แม่นยำ + การข้ามช่วงที่ไม่แม่นยำจะทำให้เลื่อนไปยังตำแหน่งเวลาที่ต้องการได้เร็วขึ้น แต่จะลดความแม่นยำในการลากตำแหน่งลง + โหลดภาพขนาดย่อ + แสดงความคิดเห็น + ปิดใช้งานเพื่อซ่อนความคิดเห็น + ปิดเพื่อป้องกันการโหลดรูปขนาดย่อ ลดการใช้ข้อมูลและหน่วยความจำ การเปลี่ยนแปลงล้างแคชภาพในหน่วยความจำและบนดิสก์ + ล้างแคชของรูปภาพแล้ว + ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด + คิววีดีโอถัดไปโดยอัตโนมัติ + ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ + การควบคุมระดับเสียงด้วยท่าทาง + ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น + การควบคุมความสว่างด้วยท่าทาง + ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น + ตัวควบคุมท่าทางของโปรแกรมเล่น + ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างและระดับเสียงของเครื่องเล่น + คำแนะนำการค้นหา + แสดงคำแนะนำเมื่อทำการค้นหา + ประวัติการค้นหา + จัดเก็บคำที่เคยค้นหาไว้ในเครื่อง + ประวัติและแคช + ติดตามวิดีโอที่ดคยดู + เล่นต่อหลังการขัดจังหวะ (เช่น การรับโทรศัพท์) + ดาวน์โหลด + วีดีโอถัดไป + เล่นอัตโนมัติ + แสดงวิดีโอ \'ถัดไป\' และ \'ที่คล้ายกัน\' + แสดงเคล็ดลับ \"แตะค้างเพื่อเพิ่ม\" + แสดงเคล็ดลับเมื่อกดปุ่มพื้นหลังหรือป๊อปอัพในหน้ารายละเอียดวิดีโอ + URL ที่ไม่สนับสนุน + ประเทศเริ่มต้นของเนื้อหา + บริการ + ภาษาของเนื้อหาเริ่มต้น + เครื่องเล่น + พฤติกรรม + วิดีโอและเสียง + ประวัติและแคช + ป๊อปอัพ + ลักษณะ + อื่นๆ + แก้จุดบกพร่อง + อัพเดท + กำลังเล่นในโหมดพื้นหลัง + กำลังเล่นในโหมดป๊อปอัพ + จัดคิวลงในการเล่นโหมดพื้นหลังแล้ว + จัดคิวลงในการเล่นโหมดป๊อปอัพแล้ว + เล่น + เนื้อหา + เนื้อหาที่จำกัดอายุ + แสดงวิดีโอที่จำกัดอายุ การอนุญาตดังกล่าวเป็นไปได้จากการตั้งค่า + สด + ดาวน์โหลด + ดาวน์โหลด + รายงานข้อผิดพลาด + ทั้ง หมด + ช่อง + ช่อง + เพลย์ลิสต์ + เพลย์ลิสต์ + + วิดีโอ + + + ความคิดเห็น + + แทร็ค + ผู้ใช้ + เหตุการณ์ + ใช่ + ในภายหลัง + ปิดการใช้งาน + ตัวกรอง + เรียกใหม่ + ล้าง + กำลังปรับขนาด + ความละเอียดที่ดีที่สุด + เลิกทำ + ลบไฟล์แล้ว + เล่นทั้งหมด + เสมอ + เพียงครั้งเดียว + ไฟล์ + การแจ้งเตือน NewPipe + การแจ้งเตือนของแอป NewPipe เมื่อเล่นสื่อในโหมดพื้นหลังและป๊อปอัพ + การแจ้งเตือนการอัปเดตแอป + การแจ้งเตือนสำหรับ NewPipe เวอร์ชั่นใหม่ + [ไม่ทราบ] + เปลี่ยนการวางแนว + สลับไปยังโหมดพื้นหลัง + สลับไปยังโหมดป๊อปอัพ + สลับไปยังโหมดหลัก + นำเข้าฐานข้อมูล + ส่งออกฐานข้อมูล + แทนที่ประวัติการดูและการสมัครรับข้อมูลของคุณ + ส่งออกประวัติการดู ช่องที่ได้บอกรับและเพลย์ลิสต์ + ล้างประวัติการดู + ลบประวัติของวีดีโอที่เคยเล่น + ลบประวัติการดูทั้งหมดหรือไม่\? + ลบประวัติการดูแล้ว + ล้างประวัติการค้นหา + ลบประวัติของคำที่เคยค้นหา + ลบประวัติการค้นหาทั้งหมดหรือไม่\? + ลบประวัติการค้นหาแล้ว + เกิดข้อผิดพลาด + พื้นที่เก็บข้อมูลภายนอกไม่พร้อมใช้งาน + การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่\? + ข้อผิดพลาดของเครือข่าย + ไม่สามารถโหลดรูปขนาดย่อทั้งหมด + ไม่สามารถถอดรหัสลายเซ็น URL ของวิดีโอ + ไม่สามารถแยกวิเคราะห์เว็บไซต์ + ไม่สามารถแยกวิเคราะห์เว็บไซต์ได้อย่างสมบูรณ์ + เนื้อหาไม่พร้อมใช้งาน + ถูกบล็อกโดย GEMA + ไม่สามารถตั้งค่าเมนูดาวน์โหลด + ยังไม่รองรับสตรีมแบบสดในขณะนี้ + ไม่สามารถรับสตรีมใด ๆ + ไม่สามารถโหลดรูปภาพ + แอป / UI ขัดข้อง + ไม่สามารถเล่นสตรีมนี้ + เกิดข้อผิดพลาดของตัวเล่นที่ไม่สามารถกู้คืนได้ + กำลังกู้คืนจากข้อผิดพลาดของตัวเล่น + ตัวเล่นภายนอกไม่สนับสนุนลิงก์ประเภทนี้ + URL ไม่ถูกต้อง + ไม่พบสตรีมวิดีโอ + ไม่พบสตรีมเสียง + ไม่มีโฟลเดอร์ตามที่ระบุ + ไม่มีแหล่งแฟ้ม/เนื้อหาดังกล่าว + ไฟล์นี้ไม่มีอยู่หรือไม่ได้รับอนุญาตให้อ่านหรือเขียนไฟล์ + ชื่อไฟล์ต้องไม่ว่างเปล่า + เกิดข้อผิดพลาด: %1$s + ไม่มีสตรีมให้ดาวน์โหลด + เรียกคืนการวางตำแหน่งแท็บเป็นค่าเดิม เนื่องจากพบข้อผิดพลาดในการอ่านการวางตำแหน่งแท็บที่บันทึกไว้ + คืนค่าเริ่มต้น + คุณต้องการคืนค่าเริ่มต้นหรือไม่\? + รายงานข้อผิดพลาดผ่านทาง e-mail + ข้อมูล: + เกิดอะไรขึ้น: + ความคิดเห็นของคุณ (เป็นภาษาอังกฤษ): + รายละเอียด: + ภาพขนาดย่อของตัวอย่างวิดีโอ + ภาพของตัวอย่างวิดีโอขนาดย่อ + รูปขนาดย่อของผู้อัปโหลด + ชอบ + ไม่ชอบ + ใช้ Tor + (ทดลอง) บังคับให้ใช้การเชื่อมต่อผ่าน Tor เพื่อเพิ่มความเป็นส่วนตัว (ยังไม่รองรับวิดีโอสตรีมมิ่ง) + รายงานข้อผิดพลาด + ไม่มีผลลัพธ์ + ไม่มีอะไรที่นี่นอกจากจิ้งหรีด + ลากเพื่อจัดลำดับใหม่ + ไม่สามารถสร้างไดเรกทอรีดาวน์โหลด \'%1$s\' + สร้างไดเรกทอรีดาวน์โหลด \'%1$s\' + วิดีโอ + เสียง + ลองอีกครั้ง + สิทธิ์การเข้าถึงการจัดเก็บข้อมูลถูกปฏิเสธ + พัน + ล้าน + พันล้าน + ไม่มีสมาชิกที่สมัครรับ + + %s บอกรับ + + ไม่สามารถนับจำนวนสมาชิกได้ + ไม่มียอดวิว + + %s วิว + + ไม่มีวิดีโอ + ไม่มีความคิดเห็น + เริ่ม + หยุดพัก + เล่น + สร้าง + ลบ + ลบหนึ่ง + ลบทั้งหมด + ไม่สนใจ + เปลี่ยนชื่อ + ภารกิจใหม่ + ชื่อไฟล์ + เซิร์ฟเวอร์ที่ไม่รองรับ + ไฟล์มีอยู่แล้ว + NewPipe กำลังดาวน์โหลด + แตะเพื่อดูรายละเอียด + โปรดรอ… + คัดลอกไปที่คลิปบอร์ดแล้ว + โปรดเลือกโฟลเดอร์ดาวน์โหลดที่พร้อมใช้งาน + การอนุญาตนี้เป็นสิ่งจำเป็นเพื่อ +\nเปิดในโหมดป๊อปอัป + ลบ 1 รายการแล้ว + ดาวน์โหลด + อักขระที่อนุญาตในชื่อไฟล์ + อักขระที่ไม่ถูกต้องจะถูกแทนที่ด้วยค่านี้ + อักขระทดแทน + ตัวอักษรและตัวเลข + อักขระพิเศษส่วนใหญ่ + ไม่มีแอพที่ติดตั้งเพื่อให้เล่นไฟล์นี้ได้ + เกี่ยวกับ NewPipe + การตั้งค่า + เกี่ยวกับ + สัญญาอนุญาตของบุคคลที่สาม + © %1$s โดย %2$s ภายใต้ %3$s + ไม่สามารถโหลดสัญญาอนุญาต + เปิดเว็บไซต์ + เกี่ยวกับ + ผู้มีส่วนร่วม + สัญญาอนุญาต + แอปสตรีมมิ่งที่เล็กและเสรีบน Android + สนับสนุน + ไม่ว่าคุณจะมีความคิดที่จะช่วยแปลภาษา เปลี่ยนดีไซน์ แก้ไขโค้ดของโปรแกรมให้ดีขึ้นทั้งในระดับเล็กน้อยหรือจะเปลี่ยนแปลงกันแบบขนานใหญ่ เรายินดีให้คุณได้ร่วมช่วยเหลือเสมอ… ยิ่งทำมาก ยิ่งช่วยให้ดีขึ้นมาก! + ดูบน GitHub + บริจาค + คืนให้ + เว็บไซต์ + เยี่ยมชมเว็บไซต์ NewPipe สำหรับข้อมูลเพิ่มเติมและข่าวสาร + นโยบายความเป็นส่วนตัวของ NewPipe + โครงการ NewPipe คำนึงถึงความเป็นส่วนตัวของคุณอย่างจริงจัง ดังนั้นแอปจะไม่เก็บรวบรวมข้อมูลใดๆ โดยไม่ได้รับความยินยอมจากคุณ +\nนโยบายความเป็นส่วนตัวของ NewPipe มีการอธิบายในรายละเอียดเกี่ยวกับข้อมูลที่จะถูกส่งออกไปและเก็บไว้เมื่อคุณรายงานความผิดพลาดของแอป + อ่านนโยบายความเป็นส่วนตัว + สัญญาอนุญาตของ NewPipe + อ่านสัญญาอนุญาต + ประวัติ + สืบค้นแล้ว + ดูแล้ว + ประวัติการดูได้ปิดใช้งานอยู่ + ประวัติ + ประวัติว่างเปล่า + ล้างประวัติแล้ว + ลบรายการแล้ว + คุณต้องการลบรายการนี้ออกจากประวัติการค้นหาหรือไม่\? + คุณต้องการลบรายการนี้ออกจากประวัติการดูหรือไม่\? + คุณแน่ใจหรือไม่ว่าต้องการลบรายการประวัติทั้งหมด\? + เล่นครั้งล่าสุด + เล่นมากที่สุด + เนื้อหาของหน้าหลัก + แท็บใดบ้างที่ต้องการให้แสดงบนหน้าหลัก + การเลือก + หน้าว่าง + หน้า Kiosk + หน้าการสมัครสมาชิก + หน้าฟีด + หน้าของช่อง + เลือกช่อง + ยังไม่มีการสมัครรับข้อมูลช่องในตอนนี้ + เลือกหน้า Kiosk + ส่งออกแล้ว + นำเข้าแล้ว + ไม่มีไฟล์ ZIP ที่ถูกต้อง + คำเตือน: ไม่สามารถนำเข้าไฟล์ทั้งหมดได้ + สิ่งนี้จะแทนที่การตั้งค่าปัจจุบันของคุณ + คุณยังต้องการนำเข้าการตั้งค่าด้วยหรือไม่\? + ไม่สามารถโหลดความคิดเห็นได้ + ได้รับความนิยม + 50 อันดับแรก + ใหม่และมาแรง + การประชุม + เครื่องเล่นพื้นหลัง + เครื่องเล่นป๊อปอัพ + เอาออก + รายละเอียด + การตั้งค่าเสียง + กดค้างไว้เพื่อเพิ่มลงในคิว + เล่นโดยตรงในโหมดพื้นหลัง + เพิ่มคิวในโหมดพื้นหลัง + เพิ่มคิวในโหมดป๊อปอัพ + เริ่มเล่นจากตรงนี้ + เล่นจากจุดนี้ในโหมดพื้นหลัง + เล่นจากจุดนี้ในโหมดป๊อปอัพ + บางสิ่งบางอย่างจะปรากฏที่นี่เร็วๆ นี้ ;D + การดำเนินการ \'เปิด\' ที่ต้องการ + การดำเนินการเริ่มต้นเมื่อเปิดเนื้อหา — %s + เครื่องเล่นวิดีโอ + เครื่องเล่นพื้นหลัง + เครื่องเล่นป๊อปอัพ + ถามเสมอ + กำลังรับข้อมูล… + กำลังโหลดเนื้อหาที่ร้องขอ + เพลย์ลิสต์ใหม่ + ลบ + เปลี่ยนชื่อ + ชื่อ + เพิ่มในเพลย์ลิสต์ + ตั้งเป็นรูปขนาดย่อของเพลย์ลิสต์ + เก็บเพลย์ลิสต์ + เอาที่คั่นหน้าออก + ลบเพลย์ลิสต์นี้หรือไม่\? + สร้างเพลย์ลิสต์แล้ว + เพิ่มลงในเพลย์ลิสต์แล้ว + เปลี่ยนภาพย่อของเพลย์ลิสต์แล้ว + ไม่สามารถลบเพลย์ลิสต์ได้ + ไม่มีคำอธิบายภาพ + พอดี + เติม + ขยาย + สร้างขึ้นโดยอัตโนมัติ + คำบรรยายภาพ + ปรับเปลี่ยนขนาดตัวอักษร สีของข้อความหรือพื้นหลังของคำอธิบายภาพ (จำเป็นตองปิดและเปิดแอปใหม่เพื่อให้การเปลี่ยนแปลงมีผล) + เปิดใช้งาน LeakCanary + การตรวจสอบการรั่วไหลของหน่วยความจำอาจทำให้แอปจะไม่ตอบสนองเมื่อมีการดึงข้อมูลจากหน่วยความจำ + นำเข้า/ส่งออก + นำเข้า + นำเข้าจาก + ส่งออกไปยัง + กำลังนำเข้า… + กำลังส่งออก… + นำเข้าไฟล์ + การส่งออกก่อนหน้านี้ + ไม่สามารถนำเข้าการสมัครรับข้อมูล + ไม่สามารถส่งออกการสมัครรับข้อมูล + นำเข้ารายการช่องที่บอกรับใน YouTube โดยการดาวน์โหลดไฟล์การส่งออก: +\n +\n1ไปที่ URL นี้: %1$s +\n2. เข้าสู่ระบบเมื่อระบบถาม +\n3. การดาวน์โหลดควรเริ่มต้น (นั่นคือไฟล์ที่ส่งออก) + นำเข้าโปรไฟล์ SoundCloud โดยการพิมพ์ URL หรือรหัสไอดีผู้ใช้ของคุณ: +\n +\n1. เปิดใช้งาน \"โหมดเดสก์ท็อป\" ในเว็บเบราว์เซอร์ (เว็บไซต์ไม่สามารถใช้ได้สำหรับอุปกรณ์มือถือ) +\n2ไปที่ URL นี้:%1$s +\n3. เข้าสู่ระบบเมื่อระบบถาม +\n4. คัดลอก URL ของโปรไฟล์ที่คุณถูกเปลี่ยนเส้นทางไป + โปรดทราบว่าการดำเนินการนี้อาจใช้งานข้อมูลมือถือที่มีค่าใช้จ่าย +\n +\nคุณต้องการที่จะทำต่อไปหรือไม่\? + การควบคุมความเร็วในการเล่น + จังหวะ + เสียงสูงต่ำ + ยกเลิกการเชื่อมโยง (อาจทำให้เสียงมีการบิดเบือน) + กรอไปข้างหน้าระหว่างความเงียบ + ทีละ + รี เซ็ต + เพื่อให้สอดคล้องกับระเบียบข้อบังคับว่าด้วยการป้องกันข้อมูลทั่วไปของยุโรป (GDPR) เราขอแนะนำให้คุณอ่านนโยบายความเป็นส่วนตัวของ NewPipe อย่างระมัดระวังและถี่ถ้วน +\nคุณต้องยอมรับข้อตกลงเพื่ออนุญาตให้ส่งรายงานข้อผิดพลาดถึงเรา + ยอมรับ + ปฏิเสธ + ไม่จำกัด + จำกัด ความละเอียดเมื่อใช้ข้อมูลมือถือ + อัพเดท + แสดงการแจ้งเตือนการปรับปรุงให้ทราบก่อนอัพเดทแอพ เมื่อมีเวอร์ชั่นใหม่ให้พร้อมใช้งาน + ย่อเล็กสุดเมื่อสลับแอป + การดำเนินการเมื่อสลับไปยังแอปอื่นๆ จากโปรแกรมเล่นวิดีโอหลัก — %s + ไม่มี + ย่อเล็กสุดไปยังการเล่นพื้นหลัง + ย่อเล็กสุดไปยังการเล่นป๊อปอัพ + โหมดมุมมองรายการ + รายการ + ตาราง + อัตโนมัติ + สลับมุมมอง + NewPipe พร้อมให้อัพเดทแล้ว! + แตะเพื่อดาวน์โหลด + เสร็จแล้ว + อยู่ในคิว + หยุดชั่วคราว + อยู่ในคิวแล้ว + คิว + การดำเนินการถูกปฏิเสธโดยระบบ + การดาวน์โหลดล้มเหลว + การดาวน์โหลดเสร็จสิ้น + %s การดาวน์โหลดเสร็จสิ้น + สร้างชื่อเฉพาะ + เขียนทับ + ไฟล์ที่ดาวน์โหลดด้วยชื่อนี้มีอยู่แล้ว + มีการดาวน์โหลดอยู่ในความคืบหน้าด้วยไฟล์ชื่อนี้อยู่แล้ว + แสดงข้อผิดพลาด + โค้ด + ไม่สามารถสร้างไฟล์ได้ + ไม่สามารถสร้างโฟลเดอร์ปลายทางได้ + การอนุญาตถูกปฏิเสธโดยระบบ + การเชื่อมต่อที่ปลอดภัยล้มเหลว + ไม่พบเซิร์ฟเวอร์ + ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ + เซิร์ฟเวอร์ไม่ส่งข้อมูล + เซิร์ฟเวอร์ไม่รองรับการดาวน์โหลดแบบมัลติเธรด โปรดลองอีกครั้งด้วย @string/msg_threads = 1 + ไม่พบ + ล้างการดาวน์โหลดที่เสร็จสิ้นแล้ว + หยุด + จำนวนครั้งสูงสุดที่จะลองใหม่ + จำนวนครั้งสูงสุดที่จะลองใหม่ก่อนจะยกเลิกการดาวน์โหลด + หยุดชั่วคราวเมื่อเปลี่ยนเป็นข้อมูลมือถือ + การดาวน์โหลดที่ไม่สามารถหยุดพักได้จะเริ่มต้นใหม่ + ปิด + \ No newline at end of file From 14db8b128325702b20387ee082f5d286358b0d00 Mon Sep 17 00:00:00 2001 From: thami simo Date: Wed, 14 Aug 2019 03:56:49 +0000 Subject: [PATCH 06/46] Translated using Weblate (Arabic) Currently translated at 100.0% (451 of 451 strings) --- app/src/main/res/values-ar/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index e80416a46..84c62fe04 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -71,7 +71,7 @@ التاريخ و ذاكرة التخزين المؤقت محتوى التنزيلات - التحميل + عنوان التنزيلات الكل القناة الفيديو @@ -114,11 +114,11 @@ محتوى مقيد بحسب العمر "إظهار الفيديو المقيد بحسب العمر. يمكن السماح باستخدام هذه المواد من \"الإعدادات\"." بث مباشر - تقرير الخطأ + عنوان تقرير الخطأ قائمة التشغيل نعم لاحقاً - مُعطل + تعطيل فلتر تحديث تنظيف From fffeadd8eac96c7baf22e11d913cc0ba626b898b Mon Sep 17 00:00:00 2001 From: nautilusx Date: Thu, 15 Aug 2019 07:00:45 +0000 Subject: [PATCH 07/46] Translated using Weblate (German) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-de/strings.xml | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ff75b74c6..1f695715e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -58,7 +58,6 @@ Konnte Video-URL-Signatur nicht entschlüsseln Konnte Webseite nicht analysieren Inhalt nicht verfügbar - Inhalt Altersbeschränkte Inhalte Altersbeschränktes Video anzeigen. Das Zulassen dieses Materials ist von den Einstellungen aus möglich. @@ -98,7 +97,7 @@ Datei existiert bereits Bitte warten… In Zwischenablage kopiert - Bitte wähle ein verfügbares Downloadverzeichnis + Bitte gib später in den Einstellungen einen Downloadverzeichnis an Starten Pause Abspielen @@ -166,12 +165,12 @@ Buchstaben und Zahlen Abonnieren Abonniert - Abonnement beendet + Kanal abbestellt Abos Neuigkeiten Suchverlauf Suchanfragen lokal speichern - Verlauf & Cache + Verlauf ansehen Speichere den Wiedergabeverlauf Verlauf Gesucht @@ -403,7 +402,7 @@ Wiedergabelisten Titel Benutzer - Deabonnieren + Abmelden Neuer Tab Tab wählen Gestensteuerung für Lautstärke @@ -415,7 +414,7 @@ Aktualisierungsbenachrichtigung Benachrichtigung bei neuer NewPipe-Version Kein externer Speicher verfügbar - Herunterladen auf externe SD-Karte ist noch nicht möglich. Zielverzeichnis zurücksetzen\? + Herunterladen auf externe SD-Karte ist nicht möglich. Downloadverzeichnis zurücksetzen\? Fehler beim Lesen der gespeicherten Tabs – es werden die Voreinstellungen benutzt Voreinstellungen wiederherstellen Möchtest du die Voreinstellungen wiederherstellen\? @@ -448,7 +447,7 @@ Fehler anzeigen Code Die Datei kann nicht erstellt werden - Der Zielordner kann nicht erstellt werden + Das Zielverzeichnis kann nicht erstellt werden System verweigert den Zugriff Sichere Verbindung fehlgeschlagen Der Server konnte nicht gefunden werden @@ -463,8 +462,8 @@ Anhalten Maximale Wiederholungen Maximalanzahl der Versuche, bevor der Download abgebrochen wird - Beim Umschalten auf mobile Daten pausieren - Downloads, die nicht pausiert werden können, werden wiederholt + Unterbrechen bei kostenpflichtigen Netzwerken + Nützlich beim Wechsel zu mobilen Daten, obwohl einige Downloads nicht unterbrochen werden können Konferenzen Ereignisse Verbindungszeitüberschreitung @@ -473,9 +472,31 @@ Autoplay Kommentare - + Keine Kommentare Kommentare konnten nicht geladen werden Schließen + Wiedergabe fortsetzen + Wiederherstellen der letzten Wiedergabeposition + Positionen in Listen + Wiedergabepositionsanzeigen in Listen anzeigen + Daten löschen + Wiedergabeposition gelöscht. + Datei verschoben oder gelöscht + Eine heruntergeladene Datei mit diesem Namen existiert bereits + kann die Datei nicht überschreiben + Es gibt einen ausstehenden Download mit diesem Namen + NewPipe wurde während der Verarbeitung der Datei geschlossen + Kein Speicherplatz mehr auf dem Gerät + Vorgang abgebrochen, da die Datei gelöscht wurde + Bist du sicher\? + Downloadwarteschlange begrenzen + Ein Download wird zur gleichen Zeit ausgeführt + Downloads starten + Downloads anhalten + Frage, wohin heruntergeladen werden soll + Du wirst gefragt, wohin du jeden Download speichern willst + Du wirst gefragt, wohin du jeden Download speichern willst. +\nAktiviere diese Option, wenn du auf die externe SD-Karte herunterladen möchtest \ No newline at end of file From 8f13a7ec973c7f5180b03ef7867dc608f726cc8a Mon Sep 17 00:00:00 2001 From: kapodamy Date: Thu, 15 Aug 2019 21:48:07 -0300 Subject: [PATCH 08/46] check if the if the content provider is disabled (the app itself) --- .../java/org/schabi/newpipe/settings/NewPipeSettings.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index cda3cad10..6f26534fb 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -140,7 +140,9 @@ public class NewPipeSettings { int availableProviders = 0; for (ResolveInfo info : infoList) { - if (info.activityInfo.exported) availableProviders++; + if (info.activityInfo != null && info.activityInfo.enabled && info.activityInfo.exported) { + availableProviders++; + } } return availableProviders > 0; From 63def07a0e48287c7e5338f98d822cf38acde38f Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 17 Aug 2019 09:25:49 +0200 Subject: [PATCH 09/46] Add url to recaptcha exceptions, after update in extractor --- app/build.gradle | 2 +- app/src/main/java/org/schabi/newpipe/Downloader.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2ddfecabe..804c09c00 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:5f65788a2f89e' + implementation 'com.github.Stypox:NewPipeExtractor:06689a2f27edfe83bd4605a1cceed86c06a5ebf8' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' diff --git a/app/src/main/java/org/schabi/newpipe/Downloader.java b/app/src/main/java/org/schabi/newpipe/Downloader.java index ff274a91a..11209a01e 100644 --- a/app/src/main/java/org/schabi/newpipe/Downloader.java +++ b/app/src/main/java/org/schabi/newpipe/Downloader.java @@ -164,7 +164,7 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { final ResponseBody body = response.body(); if (response.code() == 429) { - throw new ReCaptchaException("reCaptcha Challenge requested"); + throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); } if (body == null) { @@ -214,7 +214,7 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { final ResponseBody body = response.body(); if (response.code() == 429) { - throw new ReCaptchaException("reCaptcha Challenge requested"); + throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); } if (body == null) { @@ -268,7 +268,7 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { final ResponseBody body = response.body(); if (response.code() == 429) { - throw new ReCaptchaException("reCaptcha Challenge requested"); + throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl); } if (body == null) { From e66f2ab36b3b826b1ccb5e1b54812af2e417ff66 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 17 Aug 2019 09:27:18 +0200 Subject: [PATCH 10/46] Fix ReCaptchaActivity layout crash due to hidden EditText Closes #2484 --- .../main/res/layout/activity_recaptcha.xml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_recaptcha.xml b/app/src/main/res/layout/activity_recaptcha.xml index 7a4971cd9..1016210ec 100644 --- a/app/src/main/res/layout/activity_recaptcha.xml +++ b/app/src/main/res/layout/activity_recaptcha.xml @@ -1,16 +1,27 @@ - + + + + - - \ No newline at end of file From 43446d56c5a4bd13af9a6b19b80d7f827d35f0e7 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 17 Aug 2019 09:30:42 +0200 Subject: [PATCH 11/46] Load the url from the exception in the ReCaptchaActivity Sometimes YouTube introduces recaptchas only on some pages. By loading the url inside the ReCaptchaException into ReCaptchaActivity's webview, the page that originally caused the problem is shown. The user can then solve the page-specific recaptcha. --- .../org/schabi/newpipe/ReCaptchaActivity.java | 16 +++++++++++----- .../newpipe/fragments/BaseStateFragment.java | 8 +++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index 74c818bf9..55deeec5f 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -37,15 +37,24 @@ import android.webkit.WebViewClient; */ public class ReCaptchaActivity extends AppCompatActivity { public static final int RECAPTCHA_REQUEST = 10; + public static final String RECAPTCHA_URL_EXTRA = "recaptcha_url_extra"; public static final String TAG = ReCaptchaActivity.class.toString(); public static final String YT_URL = "https://www.youtube.com"; + private String url; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recaptcha); + url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA); + if (url == null || url.isEmpty()) { + url = YT_URL; + } + + // Set return to Cancel by default setResult(RESULT_CANCELED); @@ -73,15 +82,12 @@ public class ReCaptchaActivity extends AppCompatActivity { myWebView.clearHistory(); android.webkit.CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - cookieManager.removeAllCookies(new ValueCallback() { - @Override - public void onReceiveValue(Boolean aBoolean) {} - }); + cookieManager.removeAllCookies(aBoolean -> {}); } else { cookieManager.removeAllCookie(); } - myWebView.loadUrl(YT_URL); + myWebView.loadUrl(url); } private class ReCaptchaWebViewClient extends WebViewClient { 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 4546483d2..e2bf9fb73 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java @@ -180,7 +180,7 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC } if (exception instanceof ReCaptchaException) { - onReCaptchaException(); + onReCaptchaException((ReCaptchaException) exception); return true; } else if (exception instanceof IOException) { showError(getString(R.string.network_error), true); @@ -190,11 +190,13 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC return false; } - public void onReCaptchaException() { + public void onReCaptchaException(ReCaptchaException exception) { if (DEBUG) Log.d(TAG, "onReCaptchaException() called"); Toast.makeText(activity, R.string.recaptcha_request_toast, Toast.LENGTH_LONG).show(); // Starting ReCaptcha Challenge Activity - startActivityForResult(new Intent(activity, ReCaptchaActivity.class), ReCaptchaActivity.RECAPTCHA_REQUEST); + Intent intent = new Intent(activity, ReCaptchaActivity.class); + intent.putExtra(ReCaptchaActivity.RECAPTCHA_URL_EXTRA, exception.getUrl()); + startActivityForResult(intent, ReCaptchaActivity.RECAPTCHA_REQUEST); showError(getString(R.string.recaptcha_request_toast), false); } From 10dfcbf0b9063bc7572f44cedaac5e48784484d4 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sat, 17 Aug 2019 13:38:33 -0300 Subject: [PATCH 12/46] add manual switch in download setting fragment switch for: * Java I/O Api * Storage Access Framework --- .../newpipe/download/DownloadDialog.java | 4 +- .../settings/DownloadSettingsFragment.java | 6 +- .../newpipe/settings/NewPipeSettings.java | 56 +++---------------- .../util/FilePickerActivityHelper.java | 8 ++- .../giga/service/DownloadManager.java | 4 +- .../giga/ui/fragment/MissionsFragment.java | 48 ++++++++++++---- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/download_settings.xml | 7 +++ 10 files changed, 73 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index a9afc93d5..f77daa092 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -329,7 +329,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck return; } - if (data.getData().getAuthority() != null && data.getData().getAuthority().startsWith(context.getPackageName())) { + if (FilePickerActivityHelper.isOwnFileUri(context, data.getData())) { File file = Utils.getFileForUri(data.getData()); checkSelectedDownload(null, Uri.fromFile(file), file.getName(), StoredFileHelper.DEFAULT_MIME); return; @@ -592,7 +592,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck if (!askForSavePath) Toast.makeText(context, getString(R.string.no_available_dir), Toast.LENGTH_LONG).show(); - if (NewPipeSettings.hasCreateDocumentSupport) { + if (NewPipeSettings.useStorageAccessFramework(context)) { StoredFileHelper.requestSafWithFileCreation(this, REQUEST_DOWNLOAD_SAVE_AS, filename, mime); } else { File initialSavePath; diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index db7754caf..7c2cb46e9 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -178,7 +178,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { } Intent i; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.hasOpenDocumentTreeSupport) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.useStorageAccessFramework(ctx)) { i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) .putExtra("android.content.extra.SHOW_ADVANCED", true) .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | StoredDirectoryHelper.PERMISSION_FLAGS); @@ -226,7 +226,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { forgetSAFTree(ctx, defaultPreferences.getString(key, "")); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.hasOpenDocumentTreeSupport) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !FilePickerActivityHelper.isOwnFileUri(ctx, uri)) { // steps to acquire the selected path: // 1. acquire permissions on the new save path // 2. save the new path, if step(2) was successful @@ -244,7 +244,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { return; } } else { - File target = Utils.getFileForUri(data.getData()); + File target = Utils.getFileForUri(uri); if (!target.canWrite()) { showMessageDialog(R.string.download_to_sdcard_error_title, R.string.download_to_sdcard_error_message); return; diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 6f26534fb..44da38c35 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -21,11 +21,7 @@ package org.schabi.newpipe.settings; import android.content.Context; -import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Build; import android.os.Environment; import android.preference.PreferenceManager; import android.support.annotation.NonNull; @@ -33,7 +29,6 @@ import android.support.annotation.NonNull; import org.schabi.newpipe.R; import java.io.File; -import java.util.List; /** * Helper for global settings @@ -62,20 +57,6 @@ public class NewPipeSettings { private NewPipeSettings() { } - /** - * Indicates if is possible pick a directory though the Storage Access Framework. - * {@code true} if at least one provider can handle {@link Intent#ACTION_OPEN_DOCUMENT_TREE} - * otherwise {@code false} - */ - public static boolean hasOpenDocumentTreeSupport = false; - - /** - * Indicates if is possible create a file though the Storage Access Framework. - * {@code true} if at least one provider can handle {@link Intent#ACTION_CREATE_DOCUMENT} - * otherwise {@code false} - */ - public static boolean hasCreateDocumentSupport = false; - public static void initSettings(Context context) { PreferenceManager.setDefaultValues(context, R.xml.appearance_settings, true); PreferenceManager.setDefaultValues(context, R.xml.content_settings, true); @@ -85,17 +66,8 @@ public class NewPipeSettings { PreferenceManager.setDefaultValues(context, R.xml.video_audio_settings, true); PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - hasOpenDocumentTreeSupport = testFor(context, Intent.ACTION_OPEN_DOCUMENT_TREE, false); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - hasCreateDocumentSupport = testFor(context, Intent.ACTION_CREATE_DOCUMENT, true); - } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !hasOpenDocumentTreeSupport) { - getVideoDownloadFolder(context); - getAudioDownloadFolder(context); - } + getVideoDownloadFolder(context); + getAudioDownloadFolder(context); } private static void getVideoDownloadFolder(Context context) { @@ -126,25 +98,11 @@ public class NewPipeSettings { return new File(dir, "NewPipe").toURI().toString(); } - private static boolean testFor(@NonNull Context ctx, @NonNull String intentAction, boolean isFile) { - Intent queryIntent = new Intent(intentAction) - .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + public static boolean useStorageAccessFramework(Context context) { + final String key = context.getString(R.string.storage_use_saf); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - if (isFile) { - queryIntent.setType("*/*"); - queryIntent.addCategory(Intent.CATEGORY_OPENABLE); - } - - List infoList = ctx.getPackageManager() - .queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY); - - int availableProviders = 0; - for (ResolveInfo info : infoList) { - if (info.activityInfo != null && info.activityInfo.enabled && info.activityInfo.exported) { - availableProviders++; - } - } - - return availableProviders > 0; + return prefs.getBoolean(key, false); } + } diff --git a/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java b/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java index 20554ce59..8e70e4f8d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.util; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.support.annotation.NonNull; @@ -29,7 +30,7 @@ public class FilePickerActivityHelper extends com.nononsenseapps.filepicker.File @Override public void onCreate(Bundle savedInstanceState) { - if(ThemeHelper.isLightThemeSelected(this)) { + if (ThemeHelper.isLightThemeSelected(this)) { this.setTheme(R.style.FilePickerThemeLight); } else { this.setTheme(R.style.FilePickerThemeDark); @@ -73,6 +74,11 @@ public class FilePickerActivityHelper extends com.nononsenseapps.filepicker.File .putExtra(FilePickerActivityHelper.EXTRA_MODE, FilePickerActivityHelper.MODE_NEW_FILE); } + public static boolean isOwnFileUri(@NonNull Context context, @NonNull Uri uri) { + if (uri.getAuthority() == null) return false; + return uri.getAuthority().startsWith(context.getPackageName()); + } + /*////////////////////////////////////////////////////////////////////////// // Internal //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java index b168ef474..beb5e6dc9 100644 --- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java @@ -35,8 +35,8 @@ public class DownloadManager { public final static int SPECIAL_PENDING = 1; public final static int SPECIAL_FINISHED = 2; - static final String TAG_AUDIO = "audio"; - static final String TAG_VIDEO = "video"; + public static final String TAG_AUDIO = "audio"; + public static final String TAG_VIDEO = "video"; private final FinishedMissionStore mFinishedMissionStore; diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 69c8e8f50..2b2c09750 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -7,7 +7,9 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Bundle; +import android.os.Environment; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.NonNull; @@ -22,9 +24,14 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; +import com.nononsenseapps.filepicker.Utils; + import org.schabi.newpipe.R; +import org.schabi.newpipe.settings.NewPipeSettings; +import org.schabi.newpipe.util.FilePickerActivityHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.io.File; import java.io.IOException; import us.shandian.giga.get.DownloadMission; @@ -37,7 +44,7 @@ import us.shandian.giga.ui.adapter.MissionAdapter; public class MissionsFragment extends Fragment { private static final int SPAN_SIZE = 2; - private static final int REQUEST_DOWNLOAD_PATH_SAF = 0x1230; + private static final int REQUEST_DOWNLOAD_SAVE_AS = 0x1230; private SharedPreferences mPrefs; private boolean mLinear; @@ -242,12 +249,28 @@ public class MissionsFragment extends Fragment { private void recoverMission(@NonNull DownloadMission mission) { unsafeMissionTarget = mission; - StoredFileHelper.requestSafWithFileCreation( - MissionsFragment.this, - REQUEST_DOWNLOAD_PATH_SAF, - mission.storage.getName(), - mission.storage.getType() - ); + + if (NewPipeSettings.useStorageAccessFramework(mContext)) { + StoredFileHelper.requestSafWithFileCreation( + MissionsFragment.this, + REQUEST_DOWNLOAD_SAVE_AS, + mission.storage.getName(), + mission.storage.getType() + ); + + } else { + File initialSavePath; + if (DownloadManager.TAG_VIDEO.equals(mission.storage.getType())) + initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MOVIES); + else + initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MUSIC); + + initialSavePath = new File(initialSavePath, mission.storage.getName()); + startActivityForResult( + FilePickerActivityHelper.chooseFileToSave(mContext, initialSavePath.getAbsolutePath()), + REQUEST_DOWNLOAD_SAVE_AS + ); + } } @Override @@ -290,15 +313,20 @@ public class MissionsFragment extends Fragment { public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode != REQUEST_DOWNLOAD_PATH_SAF || resultCode != Activity.RESULT_OK) return; + if (requestCode != REQUEST_DOWNLOAD_SAVE_AS || resultCode != Activity.RESULT_OK) return; if (unsafeMissionTarget == null || data.getData() == null) { - return;// unsafeMissionTarget cannot be null + return; } try { + Uri fileUri = data.getData(); + if (fileUri.getAuthority() != null && FilePickerActivityHelper.isOwnFileUri(mContext, fileUri)) { + fileUri = Uri.fromFile(Utils.getFileForUri(fileUri)); + } + String tag = unsafeMissionTarget.storage.getTag(); - unsafeMissionTarget.storage = new StoredFileHelper(mContext, null, data.getData(), tag); + unsafeMissionTarget.storage = new StoredFileHelper(mContext, null, fileUri, tag); mAdapter.recoverMission(unsafeMissionTarget); } catch (IOException e) { Toast.makeText(mContext, R.string.general_error, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fcc5afda9..028f146fc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -458,7 +458,9 @@ abrir en modo popup Preguntar dónde descargar Se preguntará dónde guardar cada descarga - Se preguntará dónde guardar cada descarga.\nHabilita esta opción si quieres descargar en la tarjeta SD externa + Se preguntará dónde guardar cada descarga.\nHabilita esta opción junto con SAF si quieres descargar en la tarjeta SD externa + Usar SAF + El Framework de Acceso al Almacenamiento permite descargar en la tarjeta SD externa.\nNota: Algunos los dispositivos no son compatibles Desuscribirse Nueva pestaña diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 49f38b667..6c51fbb1c 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -163,6 +163,7 @@ clear_search_history downloads_storage_ask + storage_use_saf file_rename_charset diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91b0953cc..721fbcac4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -556,6 +556,8 @@ Ask where to download You will be asked where to save each download - You will be asked where to save each download.\nEnable this option if you want download to the external SD Card + You will be asked where to save each download.\nEnable this option with SAF if you want download to the external SD Card + Use SAF + The Storage Access Framework allow download to the external SD Card.\nNote: some devices are not compatible diff --git a/app/src/main/res/xml/download_settings.xml b/app/src/main/res/xml/download_settings.xml index 7a6fab841..0df021842 100644 --- a/app/src/main/res/xml/download_settings.xml +++ b/app/src/main/res/xml/download_settings.xml @@ -12,6 +12,13 @@ android:summary="@string/downloads_storage_ask_summary_kitkat" android:title="@string/downloads_storage_ask_title" /> + + Date: Sun, 18 Aug 2019 01:00:54 +0200 Subject: [PATCH 13/46] move on to version 0.17.1 --- app/build.gradle | 6 +++--- app/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 804c09c00..c70d583b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 750 - versionName "0.17.0" + versionCode 760 + versionName "0.17.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.Stypox:NewPipeExtractor:06689a2f27edfe83bd4605a1cceed86c06a5ebf8' + implementation 'com.github.teamnewpipe:NewPipeExtractor:430da57350c587828' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 721fbcac4..3a56a56c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -556,8 +556,8 @@ Ask where to download You will be asked where to save each download - You will be asked where to save each download.\nEnable this option with SAF if you want download to the external SD Card + You will be asked where to save each download.\nChoose SAF if you want to download to an external SD card Use SAF - The Storage Access Framework allow download to the external SD Card.\nNote: some devices are not compatible + The Storage Access Framework allows downloads to an external SD card.\nNote: some devices are not compatible From ac797196f57f3e9717c2f06c9a47cd1b204e30eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sat, 17 Aug 2019 02:47:28 +0000 Subject: [PATCH 14/46] Translated using Weblate (English) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values/strings.xml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91b0953cc..659871042 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -260,16 +260,14 @@ No videos - Video - Videos - - + Video + Videos + No comments %s comment %s comments - Start Pause @@ -310,7 +308,6 @@ Allowed characters in filenames Invalid characters are replaced with this value Replacement character - Letters and digits Most special characters No app installed to play this file @@ -377,7 +374,6 @@ This will override your current setup. Do you want to also import settings? Could not load comments - Kiosk Trending @@ -397,7 +393,6 @@ Start playing here Start playing in the background Start playing in a new popup - Open Drawer Close Drawer @@ -520,7 +515,6 @@ cannot overwrite the file There is a download in progress with this name There is a pending download with this name - Show error Code @@ -539,7 +533,6 @@ No space left on device Progress lost, because the file was deleted Connection timeout - Clear finished downloads Are you sure? Continue your %s pending transfers from Downloads @@ -553,9 +546,8 @@ One download will run at the same time Start downloads Pause downloads - Ask where to download You will be asked where to save each download - You will be asked where to save each download.\nEnable this option if you want download to the external SD Card - - + You will be asked where to save each download. +\nTurn this on if you want download to an external SD card. + \ No newline at end of file From ae0ee61e7dde4a89eb69f2bf9e124dd992908b65 Mon Sep 17 00:00:00 2001 From: Westminboy Date: Sun, 18 Aug 2019 04:41:59 +0000 Subject: [PATCH 15/46] Translated using Weblate (English) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 659871042..aa95025f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,7 +99,7 @@ Resume on focus gain Continue playing after interruptions (e.g. phone calls) Download - Up next + Next Autoplay Show \'Next\' and \'Similar\' videos Show \"Hold to append\" tip From 9074733aab27a70c9651019360eec58726ee005c Mon Sep 17 00:00:00 2001 From: Kowith Singkornkeeree Date: Thu, 15 Aug 2019 16:07:12 +0000 Subject: [PATCH 16/46] Translated using Weblate (Thai) Currently translated at 54.8% (258 of 471 strings) --- app/src/main/res/values-th/strings.xml | 38 +++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index d0778709b..494125237 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -41,7 +41,7 @@ เส้นทางในการจัดเก็บวิดีโอที่ดาวน์โหลดมา ป้อนเส้นทางการดาวน์โหลดสำหรับวิดีโอ โฟลเดอร์ที่ดาวน์โหลดเสียง - เสียงที่ดาวน์โหลดถูกเก็บไว้ที่นี่ + เสียงที่ดาวน์โหลดจะถูกเก็บไว้ที่นี่ ป้อนเส้นทางการดาวน์โหลดสำหรับไฟล์เสียง เล่นอัตโนมัติ เล่นวิดีโอเมื่อ NewPipe ถูกเรียกจากแอปอื่น @@ -116,7 +116,7 @@ ดาวน์โหลด ดาวน์โหลด รายงานข้อผิดพลาด - ทั้ง หมด + ทั้งหมด ช่อง ช่อง เพลย์ลิสต์ @@ -141,7 +141,7 @@ เลิกทำ ลบไฟล์แล้ว เล่นทั้งหมด - เสมอ + ตลอดเวลา เพียงครั้งเดียว ไฟล์ การแจ้งเตือน NewPipe @@ -177,7 +177,7 @@ ถูกบล็อกโดย GEMA ไม่สามารถตั้งค่าเมนูดาวน์โหลด ยังไม่รองรับสตรีมแบบสดในขณะนี้ - ไม่สามารถรับสตรีมใด ๆ + ไม่สามารถรับสตรีมใดๆ ไม่สามารถโหลดรูปภาพ แอป / UI ขัดข้อง ไม่สามารถเล่นสตรีมนี้ @@ -237,7 +237,7 @@ เล่น สร้าง ลบ - ลบหนึ่ง + ลบหนึ่งรายการ ลบทั้งหมด ไม่สนใจ เปลี่ยนชื่อ @@ -372,16 +372,16 @@ การส่งออกก่อนหน้านี้ ไม่สามารถนำเข้าการสมัครรับข้อมูล ไม่สามารถส่งออกการสมัครรับข้อมูล - นำเข้ารายการช่องที่บอกรับใน YouTube โดยการดาวน์โหลดไฟล์การส่งออก: -\n -\n1ไปที่ URL นี้: %1$s -\n2. เข้าสู่ระบบเมื่อระบบถาม + นำเข้ารายการช่องที่บอกรับใน YouTube โดยการดาวน์โหลดไฟล์การส่งออก: +\n +\n1. ไปที่ URL นี้: %1$s +\n2. เข้าสู่ระบบเมื่อระบบถาม \n3. การดาวน์โหลดควรเริ่มต้น (นั่นคือไฟล์ที่ส่งออก) - นำเข้าโปรไฟล์ SoundCloud โดยการพิมพ์ URL หรือรหัสไอดีผู้ใช้ของคุณ: -\n -\n1. เปิดใช้งาน \"โหมดเดสก์ท็อป\" ในเว็บเบราว์เซอร์ (เว็บไซต์ไม่สามารถใช้ได้สำหรับอุปกรณ์มือถือ) -\n2ไปที่ URL นี้:%1$s -\n3. เข้าสู่ระบบเมื่อระบบถาม + นำเข้าโปรไฟล์ SoundCloud โดยการพิมพ์ URL หรือรหัสไอดีผู้ใช้ของคุณ: +\n +\n1. เปิดใช้งาน \"โหมดเดสก์ท็อป\" ในเว็บเบราว์เซอร์ (เว็บไซต์ไม่สามารถใช้ได้สำหรับอุปกรณ์มือถือ) +\n2. ไปที่ URL นี้: %1$s +\n3. เข้าสู่ระบบเมื่อระบบถาม \n4. คัดลอก URL ของโปรไฟล์ที่คุณถูกเปลี่ยนเส้นทางไป โปรดทราบว่าการดำเนินการนี้อาจใช้งานข้อมูลมือถือที่มีค่าใช้จ่าย \n @@ -392,13 +392,13 @@ ยกเลิกการเชื่อมโยง (อาจทำให้เสียงมีการบิดเบือน) กรอไปข้างหน้าระหว่างความเงียบ ทีละ - รี เซ็ต + รีเซ็ต เพื่อให้สอดคล้องกับระเบียบข้อบังคับว่าด้วยการป้องกันข้อมูลทั่วไปของยุโรป (GDPR) เราขอแนะนำให้คุณอ่านนโยบายความเป็นส่วนตัวของ NewPipe อย่างระมัดระวังและถี่ถ้วน \nคุณต้องยอมรับข้อตกลงเพื่ออนุญาตให้ส่งรายงานข้อผิดพลาดถึงเรา ยอมรับ ปฏิเสธ ไม่จำกัด - จำกัด ความละเอียดเมื่อใช้ข้อมูลมือถือ + จำกัดความละเอียดเมื่อใช้ข้อมูลมือถือ อัพเดท แสดงการแจ้งเตือนการปรับปรุงให้ทราบก่อนอัพเดทแอพ เมื่อมีเวอร์ชั่นใหม่ให้พร้อมใช้งาน ย่อเล็กสุดเมื่อสลับแอป @@ -425,17 +425,17 @@ สร้างชื่อเฉพาะ เขียนทับ ไฟล์ที่ดาวน์โหลดด้วยชื่อนี้มีอยู่แล้ว - มีการดาวน์โหลดอยู่ในความคืบหน้าด้วยไฟล์ชื่อนี้อยู่แล้ว + มีการดาวน์โหลดที่กำลังดำเนินการอยู่ด้วยไฟล์ชื่อนี้อยู่แล้ว แสดงข้อผิดพลาด โค้ด ไม่สามารถสร้างไฟล์ได้ ไม่สามารถสร้างโฟลเดอร์ปลายทางได้ การอนุญาตถูกปฏิเสธโดยระบบ - การเชื่อมต่อที่ปลอดภัยล้มเหลว + ล้มเหลวในการสร้างการเชื่อมต่อที่ปลอดภัย ไม่พบเซิร์ฟเวอร์ ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ เซิร์ฟเวอร์ไม่ส่งข้อมูล - เซิร์ฟเวอร์ไม่รองรับการดาวน์โหลดแบบมัลติเธรด โปรดลองอีกครั้งด้วย @string/msg_threads = 1 + เซิร์ฟเวอร์ไม่รองรับการดาวน์โหลดแบบพร้อมกันหลายส่วน โปรดลองอีกครั้งด้วย @string/msg_threads = 1 ไม่พบ ล้างการดาวน์โหลดที่เสร็จสิ้นแล้ว หยุด From 20208be556a981885941f974def69ef6d2e5330e Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Thu, 15 Aug 2019 07:51:19 +0000 Subject: [PATCH 17/46] Translated using Weblate (German) Currently translated at 99.4% (468 of 471 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1f695715e..7cbfdca92 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -276,7 +276,7 @@ Keine gültige ZIP-Datei Warnung: Nicht alle Dateien konnten importiert werden. Dies wird deine aktuellen Einstellungen überschreiben. - Info anzeigen + Infos anzeigen Lesezeichen für Wiedergabelisten Hinzufügen zu Zum Neuordnen ziehen @@ -402,7 +402,7 @@ Wiedergabelisten Titel Benutzer - Abmelden + Abbestellen Neuer Tab Tab wählen Gestensteuerung für Lautstärke From e621dd3b2813811bcb8342cd053a8649092013af Mon Sep 17 00:00:00 2001 From: Westminboy Date: Sun, 18 Aug 2019 05:09:03 +0000 Subject: [PATCH 18/46] Translated using Weblate (English) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa95025f9..2ddfd1d20 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -260,7 +260,7 @@ No videos - Video + Videos Videos No comments From bc10717f61e83a9e276bbbc60819fcd6635a075c Mon Sep 17 00:00:00 2001 From: Osoitz Date: Fri, 16 Aug 2019 10:15:22 +0000 Subject: [PATCH 19/46] Translated using Weblate (Basque) Currently translated at 99.4% (468 of 471 strings) --- app/src/main/res/values-eu/strings.xml | 34 +++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5379b6104..1db244c22 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -136,7 +136,7 @@ Ukitu xehetasunetarako Itxaron mesedez… Arbelera kopiatuta - Aukeratu eskuragarri dagoen karpeta bat deskargetarako + Ezarri deskargetarako karpeta bat ezarpenetan geroago Baimen hau beharrezkoa da \nlaster-leiho moduan irekitzeko reCAPTCHA @@ -176,7 +176,7 @@ Karaktere berezi gehienak Bilaketa historiala Gorde bilaketak lokalki - Historiala eta katxea + Ikustaldien historiala Gorde ikusitako bideoen historiala NewPipe jakinarazpena Erreproduzigailua @@ -415,7 +415,7 @@ Aplikazioaren eguneraketaren jakinarazpena NewPipe aplikazioaren bertsio berrien jakinarazpena Kanpo biltegiratzea ez dago eskuragarri - Oraindik ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri\? + Ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri nahi duzu\? Lehenetsitako fitxak erabiltzen, errorea gordetako fitxak irakurtzean Berrezarri lehenetsitakoak Lehenetsitakoak berrezarri nahi dituzu\? @@ -464,17 +464,39 @@ Gelditu Gehienezko saiakerak Deskarga ezeztatu aurretik saiatu beharreko aldi kopurua - Pausatu datu mugikorretara aldatzean - Pausatu ezin daitezkeen deskargak berrekingo dira + Eten sare neurtuetan + Erabilgarria datu mugikorretara aldatzean, hala ere deskarga batzuk ezin dira pausatu Konexioaren denbora muga Erakutsi iruzkinak Desgaitu iruzkinak erakusteari erakusteko Erreprodukzio automatikoa Iruzkinak - + Iruzkinik ez Ezin izan dira iruzkinak kargatu Itxi + Berrekin erreprodukzioa + Berrezarri azken erreprodukzio-posizioa + Posizioak zerrendetan + Erakutsi erreprodukzio-posizioen adierazleak zerrendetan + Garbitu datuak + Erreprodukzio-posizioak ezabatuta. + Fitxategia lekuz aldatu edo ezabatu da + Badago izen bereko fitxategi bat + ezin da fitxategia gainidatzi + Badago izen bereko deskarga bat burutzeke + NewPipe itxi egin da fitxategian lanean zegoela + Ez dago lekurik gailuan + Progresioa galdu da, fitxategia ezabatu delako + Ziur al zaude\? + Mugatu deskargen ilara + Deskarga bakarra aldi berean + Hasi deskargak + Pausatu deskargak + Galdetu non deskargatu + Non gorde galdetuko zaizu deskarga bakoitzean + Non gorde galdetuko zaizu deskarga bakoitzean. +\nGaitu aukera hau kanpo SD txartelean gorde nahi baduzu \ No newline at end of file From c8e23fb6ceef2008f5d2c4072448bf128dc62ca4 Mon Sep 17 00:00:00 2001 From: uievawkejf Date: Fri, 16 Aug 2019 18:49:17 +0000 Subject: [PATCH 20/46] Translated using Weblate (Ukrainian) Currently translated at 99.4% (468 of 471 strings) --- app/src/main/res/values-uk/strings.xml | 35 +++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 75a60d264..7312003c6 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -107,7 +107,7 @@ Подробиці Зачекайте… Скопійовано до буферу обміну - Оберіть доступну теку для завантажень + Вкажіть теку для завантажень пізніше у налаштуваннях Програвач потокового відео не знайдений (ви можете встановити VLC для програвання). Відкрити у віконному режимі Прибирає звук при ПЕВНИХ роздільних здатностях @@ -436,7 +436,7 @@ Доступна нова версія NewPipe! Натисніть для завантаження Завершено - У черзі + Очікує призупинено додано в чергу пост-обробка @@ -452,8 +452,8 @@ Файл з такою назвою вже завантажується Показати помилку Код - Файл не може бути створений - Цільова тека не може бути створена + Цільова тека не може бути створена + Файл не може бути створений Доступ заборонено системою Захищене з\'єднання не встановлено Сервер не знайдено @@ -466,23 +466,40 @@ Зупинити Максимум спроб Максимальна кількість спроб перед скасуванням завантаження - Призупиняти завантаження при переході на стільникові дані - Завантаження до зовнішньої SD-карти поки що неможливе. Скинути розташування теки для завантажень\? + Переривати завантаження на небезлімітних з\'єднаннях + Завантаження до зовнішньої SD-карти неможливе. Скинути розташування теки для завантажень\? Помилка зчитування збережених вкладок. Використовую типові вкладки. Вкладки, що відображаються на головній сторінці Показувати сповіщення з пропозицією оновити застосунок за наявності нової версії Запитуваний діапазон неприпустимий Продовжити ваші %s відкладених переміщень із Завантажень - Завантаження, що не можуть бути призупинені, будуть перезапущені + Корисно під час переходу на мобільні дані, хоча деякі завантаження не можуть бути призупинені Показувати коментарі Вимнути відображення дописів Автопрогравання Коментарі - - + + Коментарі відсутні Не вдалося підвантажити коментарів Закрити + Позиції відтворення видалено. + Файл переміщено або видалено + не можу перезаписати файл + Завантаження з таким ім\'ям вже є в черзі + NewPipe був закритий під час роботи над файлом + На пристрої не залишилося вільного місця + Прогрес втрачено через видалення файлу + Час очікування з\'єднання вичерпано + Ви впевнені\? + Обмежити чергу завантажень + В кожен момент часу виконуватиметься одне завантаження + Почати завантаження + Призупинити завантаження + Запитувати, куди завантажувати + Вас питатимуть, куди зберігати кожне завантаження + Вас питатимуть, куди зберігати кожне завантаження. +\nУвімкніть цю опцію, якщо бажаєте завантажувати на зовнішню SD-картку \ No newline at end of file From 0b0f7919a250ee890f33405dc58202b1b4c03e0c Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Fri, 16 Aug 2019 07:16:46 +0000 Subject: [PATCH 21/46] Translated using Weblate (Catalan) Currently translated at 95.8% (451 of 471 strings) --- app/src/main/res/values-ca/strings.xml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 5ad960c75..223e604d6 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -305,7 +305,7 @@ Nova missió L\'URL té un format incorrecte o no hi ha connexió a internet Toqueu aquí per a més detalls - Trieu una carpeta de baixades disponible + Definiu una carpeta de baixades més endavant a la configuració Es necessita aquest permís per a obrir el mode emergent Camp reCAPTCHA S\'ha sol·licitat l\'emplenament d\'un camp reCAPTCHA @@ -451,7 +451,7 @@ Intents màxims Nombre màxim d\'intents abans de cancel·lar la baixada Pausa en canviar a dades mòbils - Les baixades que no es puguin pausar es tornaran a iniciar + Útil en canviar a les dades mòbils, tot i que algunes baixades no es poden aturar Elimina la subscripció Sobreescriu No s\'ha trobat @@ -467,6 +467,18 @@ El servidor no està enviant dades Comentaris - + + Notificació d\'actualització de l\'aplicació + Reprèn la reproducció + No es pot sobreescriure el fitxer + Hi ha una baixada pendent amb aquest nom + No hi ha espai disponible al dispositiu + S\'ha perdut el progrés perquè s\'ha eliminat el fitxer + S\'ha excedit el temps d\'espera de la connexió + Segur\? + Limita la cua de baixades + Inicia les baixades + Pausa les baixades + Se us demanarà la ubicació de cada baixada \ No newline at end of file From 118788436e9d3e9b0e76482ff77dd770c4286169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=9C=C5=9C=CE=B2?= Date: Sat, 17 Aug 2019 04:21:33 +0000 Subject: [PATCH 22/46] Translated using Weblate (Punjabi) Currently translated at 99.6% (469 of 471 strings) --- app/src/main/res/values-pa/strings.xml | 521 +++++++++++++++++++++++-- 1 file changed, 495 insertions(+), 26 deletions(-) diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index c307caead..ccaae00b3 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -1,31 +1,500 @@ - -ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਸਰਚ ਦਬਾਓ - %1$s ਦੇਖੇ - %1$s ਤੇ ਪਬਲਿਸ਼ ਕੀਤਾ - ਸਟਰੀਮ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ . ਤੁਸੀ VLC ਭਰਨਾ ਚਾਹੋਗੇ? - ਸਟਰੀਮ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ (ਤੁਸੀਂ vlc ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ) - ਭਰੋ - ਨਹੀਂ - Browser ਚ ਖੋਲੋ - Popup ਚ ਖੋਲੋ - ਭੇਜੋ + + + ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਸਰਚ ਦਬਾਓ + %1$s VIEWS + %1$s ਨੂੰ ਪਬਲਿਸ਼ ਕੀਤੀ ਗਈ + "ਸਟ੍ਰੀਮ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ। ਤੁਸੀਂ VLC ਭਰਨਾ ਚਾਹੋਗੇ \?" + ਸਟ੍ਰੀਮ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ ਤੁਸੀਂ VLC ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ. + ਇੰਸਟਾਲ + ਰੱਦ ਕਰੋ + ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲੋ + ਪੌਪ-ਅਪ ਵਿਚ ਖੋਲੋ + ਸਾਂਝਾ ਕਰੋ ਡਾਊਨਲੋਡ - ਡਾਊਨਲੋਡ ਸਟਰੀਮ ਫਾਈਲ. + ਡਾਊਨਲੋਡ ਸਟ੍ਰੀਮ ਫਾਈਲ ਖੋਜੋ - ਸੇਟਿੰਗਾਂ + ਸੈਟਿੰਗਾਂ ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ: %1$s\? - ਭੇਜੋ - Browser ਚੁਣੋ - ਉਲਟਾਨਾ - ਹੋਰ ਪਲੇਅਰ ਵਰਤਤੋ - ਕੁਝ ਵੀਡੀਓ ਰੈਸੋਲੂਸ਼ਨ ਚੁਣਨ ਨਾਲ ਆਡੀਓ ਮੌਜੂਦ ਨਹੀਂ ਹੋਵੇਗੀ + ਸਾਂਝਾ ਕਰੋ + ਬ੍ਰਾਊਜ਼ਰ ਚੁਣੋ + ਰੋਟੇਸ਼ਨ + ਹੋਰ ਵੀਡੀਓ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਕੁਝ ਰੇਸੋਲਿਯੁਸ਼ਨ ਤੇ ਆਵਾਜ਼ ਨੂੰ ਹਟਾਉਂਦਾ ਹੈ ਬਾਹਰੀ ਆਡੀਓ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰੋ - NewPipe ਪੋਪਉਪ ਮੋਡ - ਸਅਬਸਕਰਾਇਬ - ਮੈਂਬਰ ਬਣਏ - ਚੈਨਲ ਸਦੱਸਤਾ ਰੱਦ ਕੀਤੀ ਗਈ - ਸਦੱਸਤਾ ਨੂੰ ਬਦਲਣ ਵਿਚ ਅਸਮਰੱਥ ਹੈ - ਜਾਣਕਾਰੀ - + NewPipe ਪੌਪ-ਅਪ ਮੋਡ + ਸਬਸਕ੍ਰਾਈਬ + ਸਬਸਕ੍ਰਾਈਬ ਕੀਤਾ ਹੈ + ਚੈਨਲ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਬਦਲਣ ਵਿਚ ਅਸਮਰੱਥ + ਜਾਣਕਾਰੀ ਵੇਖੋ ਮੁੱਖ - + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅੱਪਡੇਟ ਕਰਨ ਵਿਚ ਅਸਮਰੱਥ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ + ਬੁੱਕਮਾਰਕ ਪਲੇਲਿਸਟਾਂ + ਨਵਾਂ ਕੀ ਹੈ + ਬੈਕਗਰਾਊਂਡ + ਪੋਪ-ਅਪ + ਸ਼ਾਮਿਲ ਕਰੋ + ਵੀਡੀਓ ਦਾ ਡਾਊਨਲੋਡ ਮਾਰਗ + ਡਾਉਨਲੋਡ ਕੀਤੇ ਵੀਡੀਓ ਨੂੰ ਸਟੋਰ ਕਰਨ ਦਾ ਮਾਰਗ + ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਮਾਰਗ ਭਰੋ + ਆਡੀਓ ਦਾ ਡਾਊਨਲੋਡ ਫੋਲਡਰ + ਡਾਊਨਲੋਡ ਕੀਤੇ ਆਡੀਓ ਇੱਥੇ ਸਟੋਰ ਹਨ + ਆਡੀਓ ਫਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਮਾਰਗ ਭਰੋ + ਆਟੋ ਪਲੇ + ਜਦੋਂ ਕਿਸੇ ਹੋਰ ਐਪ ਜਰੀਏ NewPipe ਨੂੰ ਖੋਲਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਇਹ ਵੀਡੀਓ ਚਲਾਉਂਦਾ ਹੈ + Default Resolution + Default ਪੌਪ-ਅਪ Resolution + ਉੱਚ ਰੇਸੋਲਿਯੁਸ਼ਨਾਂ ਵੀ ਦਿਖਾਓ + ਸਿਰਫ ਕੁੱਝ ਉਪਕਰਣ ਹੀ 2K/4K ਵੀਡੀਓ ਵਿਖਾਉਣ ਵਿਚ ਸਮਰਥਨ ਹੁੰਦੇ ਹਨ + Kodi ਨਾਲ ਚਲਾਓ + Kore ਐਪ ਮੌਜੂਦ ਨਹੀਂ ਹੈ। ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਇੰਸਟਾਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ \? + \"Kodi ਨਾਲ ਚਲਾਓ\" ਵਿਕਲਪ ਦਿਖਾਓ + Kodi ਮੀਡੀਆ ਸੈਂਟਰ ਰਾਹੀਂ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਇੱਕ ਵਿਕਲਪ ਵਿਖਾਓ + ਆਡੀਓ + Default ਆਡੀਓ ਫਾਰਮੈਟ + "Default ਵੀਡੀਓ ਫਾਰਮੈਟ" + ਥੀਮ + ਸਫੈਦ + ਗੂੜਾ + ਕਾਲਾ + ਪੌਪ-ਅਪ ਦਾ ਆਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ + ਪੌਪ-ਅਪ ਦਾ ਆਖਰੀ ਅਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ + ਤੇਜ਼ ਪਰ inexact seek ਵਰਤੋ + Inexact seek ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਪਰ ਅਣ-ਸਟੀਕ ਢੰਗ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ ਲਿਜਾਂਦਾ ਹੈ + ਥੰਬਨੇਲ ਲੋਡ ਕਰੋ + ਥੰਬਨੇਲ ਲੋਡ, ਡਾਟਾ ਦੀ ਬਚਤ ਅਤੇ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਨੂੰ ਰੋਕਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ। ਇਸ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਨਾਲ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ cache ਦੋਵੇਂ ਮਿਟ ਜਾਣਗੇ। + ਚਿੱਤਰ cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + Cached metadata ਮਿਟਾਓ + ਸਾਰੇ cached ਵੈੱਬ-ਪੇਜਾਂ ਦਾ ਡਾਟਾ ਮਿਟਾਓ + Metadata cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਅਗਲੀ ਸਟ੍ਰੀਮ ਨੂੰ ਆਟੋ-ਕਤਾਰਬੱਧ ਕਰੋ + "ਇੱਕ ਨਾ-ਦੁਹਰਾਉਣ ਵਾਲੀ ਕਤਾਰ ਵਿੱਚ ਆਖਰੀ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਉਣ ਵੇਲੇ ਆਪਣੇ-ਆਪ ਸ਼ਾਮਿਲ ਕਰੋ" + ਵੀਡੀਓ ਪਲੇਯਰ gesture ਕੰਟਰੋਲ + ਸਕ੍ਰੀਨ ਲਾਈਟ ਅਤੇ ਆਵਾਜ਼ ਨੂੰ ਕੰਟਰੋਲ ਕਰਨ ਲਈ gestures ਦੀ ਵਰਤੋਂ ਕਰੋ + ਖੋਜ ਸੁਝਾਅ + ਖੋਜ ਕਰਨ ਵੇਲੇ ਸੁਝਾਅ ਦਿਖਾਓ + ਖੋਜ ਸੂਚੀ + ਖੋਜ ਸੂਚੀ ਨੂੰ locally ਸਟੋਰ ਕਰੋ + ਪਹਿਲਾਂ ਤੋਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਚੀਜ਼ਾਂ ਦੀ ਸੂਚੀ + ਦੇਖੇ ਗਏ ਵਿਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਰੱਖੋ + Focus gain ਹੋਣ ਤੇ ਦੋਬਾਰਾ ਚਲਾਓ + ਰੁਕਾਵਟਾਂ (ਜਿਵੇਂ ਕਿ ਫੋਨ ਕਾਲਾਂ,ਮੈਸੇਜ) ਤੋਂ ਬਾਅਦ ਪਲੇਅ-ਬੈਕ ਜਾਰੀ ਰੱਖੋ + ਡਾਊਨਲੋਡ + ਅੱਗੇ + \'ਅੱਗੇ\' ਅਤੇ \'ਸਮਾਨਅੰਤਰ\' ਵੀਡੀਓ ਦਿਖਾਓ + \"Hold to append\" ਸੁਝਾਅ ਦਿਖਾਓ + ਵੀਡੀਓ ਵੇਰਵੇ ਪੰਨੇ ਤੇ ਬੈਕਗ੍ਰਾਉਂਡ ਜਾਂ ਪੌਪ-ਅਪ ਬਟਨ ਦਬਾਉਣ ਤੇ ਸੰਕੇਤ ਦਿਖਾਓ + ਅਣ-ਸਹਾਇਕ URL + ਮੂਲ ਦੇਸ਼ Content + ਸੇਵਾ + ਪਲੇਯਰ + ਵਿਵਹਾਰ + ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ + ਹਿਸਟਰੀ ਅਤੇ cache + ਪੌਪ-ਅਪ + ਦਿੱਖ + ਹੋਰ + ਡੀ-ਬੱਗ + ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ + ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ + ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਕਤਾਰਬੱਧ + ਪੌਪ-ਅਪ ਪਲੇਯਰ ਵਿੱਚ ਕਤਾਰਬੱਧ + ਪਲੇ + Content + ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ Content + ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਦਿਖਾਓ ਸੈਟਿੰਗਸ ਤੋਂ ਅਜਿਹੀ ਸਮੱਗਰੀ ਦੀ ਆਗਿਆ ਦੇਣੀ ਸੰਭਵ ਹੈ. + ਲਾਈਵ + ਡਾਊਨਲੋਡਸ + ਡਾਊਨਲੋਡਸ + Error ਰਿਪੋਰਟ + ਸਾਰੇ + ਚੈਨਲ + ਪਲੇ ਸੂਚੀ + ਹਾਂ + ਬਾਅਦ ਵਿੱਚ + ਬੰਦ ਕੀਤਾ + ਫਿਲਟਰ + ਤਾਜ਼ਾ ਕਰੋ + ਮਿਟਾਓ + ਮੁੜ ਆਕਾਰ + ਵਧੀਆ Resolution + ਵਾਪਿਸ + ਸਾਰੇ ਚਲਾਓ + ਹਮੇਸ਼ਾ + ਸਿਰਫ਼ ਇਸ ਬਾਰ + ਫਾਈਲ + NewPipe ਨੋਟੀਫਿਕੇਸ਼ਨ + NewPipe ਬੈਕਗ੍ਰਾਉਂਡ ਅਤੇ ਪੌਪ-ਅਪ ਪਲੇਅਰਾਂ ਲਈ ਸੂਚਨਾਵਾਂ + ਅਣਜਾਣ + Orientation ਬਦਲੋ + ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਬਦਲੋ + ਪੌਪ-ਅਪ ਵਿੱਚ ਬਦਲੋ + ਮੁੱਖ ਵਿੱਚ ਬਦਲੋ + Database ਆਯਾਤ ਕਰੋ + Database ਨਿਰਯਾਤ ਕਰੋ + ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਹਿਸਟਰੀ ਅਤੇ ਸਬਸਕ੍ਰਿਪਸ਼ਨਸ ਨੂੰ Override ਕਰਦਾ ਹੈ + ਹਿਸਟਰੀ, ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਸ ਅਤੇ ਪਲੇ-ਸੂਚੀ ਨਿਰਯਾਤ ਕਰੋ + Watch ਹਿਸਟਰੀ ਮਿਟਾਓ + ਚਲਾਈਆਂ ਗਈਆਂ ਸਟ੍ਰੀਮਾਂ ਦੀ ਸੂਚੀ ਮਿਟਾਉਂਦਾ ਹੈ + ਕੀ ਸਾਰੀ watch ਹਿਸਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇ \? + ਖੋਜ ਸੂਚੀ ਮਿਟਾਓ + ਖੋਜ ਸ਼ਬਦਾਂ ਦੀ ਸੂਚੀ ਮਿਟਾਉਂਦਾ ਹੈ + ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿਤੀ ਜਾਵੇ \? + ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿਤੀ ਗਈ ਹੈ. + ERROR + ਨੈੱਟਵਰਕ ERROR + ਸਾਰੇ ਥੰਬਨੇਲ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੇ + ਵੀਡੀਓ URL ਦਸਤਖਤ ਡੀਕ੍ਰਿਪਟ ਨਹੀਂ ਹੋ ਸਕਿਆ + ਵੈਬਸਾਈਟ parse ਨਹੀਂ ਹੋ ਸਕੀ + ਵੈਬਸਾਈਟ ਪੂਰੀ ਤਰਾਂ Parse ਨਹੀਂ ਹੋ ਸਕੀ + Content ਉਪਲਬਧ ਨਹੀਂ ਹੈ + ਡਾਊਨਲੋਡ ਮੀਨੂੰ ਸੈਟ-ਅਪ ਨਹੀਂ ਹੋ ਸਕਿਆ + ਲਾਈਵ ਸਟ੍ਰੀਮ ਅਜੇ supported ਨਹੀਂ ਹਨ + ਕੋਈ ਸਟ੍ਰੀਮ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੋ ਸਕੀ + ਚਿੱਤਰ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕਿਆ + ਐਪ/UI crashed + ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ + ਅਣਚਾਹਾ ਪਲੇਅਰ ERROR ਆਇਆ ਹੈ + ਪਲੇਅਰ ERROR ਤੋਂ Recover ਹੋ ਰਿਹਾ ਹੈ + External ਪਲੇਅਰ ਇਸ ਕਿਸਮ ਦੇ ਲਿੰਕਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ + ਅਵੈਧ URL + ਕੋਈ ਵੀ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਨਹੀਂ ਮਿਲੀ + ਕੋਈ ਵੀ ਆਡੀਓ ਸਟ੍ਰੀਮ ਨਹੀਂ ਮਿਲੀ + ਅਜਿਹਾ ਕੋਈ ਫੋਲਡਰ ਨਹੀਂ + ਅਜਿਹਾ ਕੋਈ ਫਾਈਲ/Content ਸਰੋਤ ਨਹੀਂ ਹੈ + ਫਾਈਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਜਾਂ ਇਸ ਨੂੰ ਪੜ੍ਹਨ ਜਾਂ ਲਿਖਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ + ਫਾਈਲ ਨਾਮ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ + ਇੱਕ ERROR ਆਇਆ ਹੈ: %1$s + ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਕੋਈ ਸਟ੍ਰੀਮ ਉਪਲਬਧ ਨਹੀਂ ਹੈ + ਮੁਆਫ ਕਰਨਾ, ਅਜਿਹਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ. + ਈ-ਮੇਲ ਦੁਆਰਾ ERROR ਦੀ ਰਿਪੋਰਟ ਕਰੋ + ਮੁਆਫ ਕਰਨਾ, ਕੁਝ ERROR ਹੋਏ ਹਨ. + ਰਿਪੋਰਟ + ਜਾਣਕਾਰੀ: + ਕੀ ਹੋਇਆ ਹੈ: + ਕਿਸ ਬਾਰੇ:\\nRequest:\\nContent ਭਾਸ਼ਾ:\\nService:\\nGMT ਸਮਾਂ:\\nPackage:\\nVersion:\\nOS version: + ਤੁਹਾਡੀ ਟਿੱਪਣੀ (ਅੰਗਰੇਜ਼ੀ ਵਿਚ): + ਵੇਰਵੇ: + ਵੀਡੀਓ preview thumbnail + ਵੀਡੀਓ preview thumbnail + ਅਪਲੋਡਰ ਦਾ ਅਵਤਾਰ thumbnail + ਪਸੰਦ + ਨਾਪਸੰਦ + TOR ਦੀ ਵਰਤੋਂ ਕਰੋ + (ਪ੍ਰਯੋਗ ਅਧੀਨ) ਗੋਪਨੀਯਤਾ ਲਈ TOR ਦੁਆਰਾ ਟਰੈਫਿਕ ਨੂੰ ਜਬਰੀ Download ਹੋਣ ਲਈ ਮਜਬੂਰ ਕਰੋ (ਸਟ੍ਰੀਮਿੰਗ ਵੀਡੀਓ ਅਜੇ supported ਨਹੀਂ ਹਨ). + ERROR ਰਿਪੋਰਟ ਕਰੋ + ਯੂਸਰ ਰਿਪੋਰਟ + ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ + ਇਥੇ ਦਾ ਸੁੰਨਾਪਨ ਦੂਰ ਕਰਨ ਲਈ ਕੋਈ ਚੈਨਲ ਸਬਸਕ੍ਰਾਇਬ ਕਰੋ + ਕਤਾਰਬੱਧ ਕਰਨ ਲਈ ਖਿੱਚੋ + ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ \'%1$s\' + ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਬਣਾਈ ਗਈ \'%1$s\' + ਵੀਡੀਓ + ਆਡੀਓ + ਦੋਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ + ਸਟੋਰੇਜ਼ Access ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਗਿਆ + ਹਜ਼ਾਰ + ਮਿਲੀਅਨ + ਬਿਲੀਅਨ + ਕੋਈ ਸਬਸਕ੍ਰਾਇਬਰ ਨਹੀਂ + + ਸਬਸਕ੍ਰਾਇਬਰ + ਸਬਸਕ੍ਰਾਇਬਰਸ + + ਕੋਈ views ਨਹੀਂ + + %s view + %s views + + ਕੋਈ ਵੀਡੀਓ ਨਹੀਂ + + ਵੀਡੀਓ + ਵੀਡੀਓਜ਼ + + ਸ਼ੁਰੂ ਕਰੋ + ਰੋਕੋ + ਪਲੇ + ਬਣਾਓ + ਮਿਟਾਓ + ਇੱਕ ਮਿਟਾਓ + ਸਾਰਾ ਮਿਟਾਓ + ਚੈੱਕ-ਸਮ + ਬਰਖਾਸਤ ਕਰੋ + ਨਾਮ ਬਦਲੋ + ਨਵਾਂ ਮਿਸ਼ਨ + ਠੀਕ ਹੈ + ਫਾਈਲ ਦਾ ਨਾਮ + threads + ERROR + Unsupported ਸਰਵਰ + ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ + ਖਰਾਬ URL ਜਾਂ ਇੰਟਰਨੈਟ ਉਪਲਬਧ ਨਹੀਂ ਹੈ + NewPipe ਡਾਊਨਲੋਡ ਹੋ ਰਿਹਾ ਹੈ + ਵੇਰਵਿਆਂ ਲਈ ਖੋਲੋ + ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ… + ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ + ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ + ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ ਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ + 1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ. + ReCaptcha + ReCaptcha ਚੁਣੌਤੀ + ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ + ਡਾਊਨਲੋਡ + ਫਾਈਲ ਨਾਮ ਵਿੱਚ ਪ੍ਰਵਾਨਿਤ ਅੱਖਰ + ਗਲਤ ਅੱਖਰ ਇਸ Value ਨਾਲ ਤਬਦੀਲ ਕੀਤੇ ਜਾਣਗੇ + Replacement ਅੱਖਰ + ਅੱਖਰ ਅਤੇ ਅੰਕ + ਬਹੁਤੇ ਖ਼ਾਸ ਅੱਖਰ + ਇਸ ਫਾਈਲ ਨੂੰ ਚਲਾਉਣ ਲਈ ਕੋਈ ਐਪ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ + NewPipe ਬਾਰੇ + ਸੈਟਿੰਗਾਂ + ਐਪ ਬਾਰੇ + ਥਰਡ-ਪਾਰਟੀ ਲਾਇਸੈਂਸ + © %1$s ਵਲੋਂ %2$s, %3$s ਅਧੀਨ + ਲਾਇਸੈਂਸ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕਿਆ + ਵੈਬਸਾਈਟ ਖੋਲ੍ਹੋ + ਐਪ ਬਾਰੇ + ਯੋਗਦਾਨ ਪਾਉਣ ਵਾਲੇ + ਲਾਇਸੈਂਸ + ਐਂਡਰਾਇਡ ਤੇ ਮੁਫਤ ਲਾਈਟਵੇਟ ਸਟ੍ਰੀਮਿੰਗ. + ਯੋਗਦਾਨ ਪਾਓ + ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ ਹਨ; ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਬਦਲਾਵ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਅਸਲ ਭਾਰੀ ਕੋਡ ਬਦਲਾਵ — ਹਰ ਮਦਦ ਦਾ ਸਦਾ ਸਵਾਗਤ ਹੈ. ਜਿੰਨਾ ਇਸ ਨੂੰ ਜ਼ਿਆਦਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਉੱਨਾ ਹੀ ਇਹ ਬਿਹਤਰ ਹੁੰਦਾ ਹੈ! + GitHub ਤੇ ਵੇਖੋ + ਦਾਨ ਕਰੋ + NewPipe ਵਲੰਟੀਅਰਾਂ ਦੁਆਰਾ ਵਿਕਸਤ ਕੀਤੀ ਗਈ ਹੈ ਜੋ ਤੁਹਾਡੇ ਲਈ ਬਿਹਤਰ ਅਨੁਭਵ ਲਿਆਉਣ ਲਈ ਸਮਾਂ ਬਿਤਾਉਂਦੇ ਹਨ. ਇੱਕ ਕੱਪ ਕਾਫੀ ਦਾ ਆਨੰਦ ਲੈਂਦੇ ਹੋਏ ਡਿਵੈਲਪਰਾਂ ਨੂੰ NewPipe ਨੂੰ ਹੋਰ ਵਧੀਆ ਬਣਾਉਣ ਵਿੱਚ ਸਹਾਇਤਾ ਲਈ ਵਾਪਸ ਦਿਓ. + ਵਾਪਸ ਦਿਓ + ਵੈਬਸਾਈਟ + ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਅਤੇ ਖ਼ਬਰਾਂ ਲਈ NewPipe ਵੈਬਸਾਈਟ ਵੇਖੋ. + NewPipe\'s ਲਾਇਸੈਂਸ + NewPipe ਇੱਕ ਕਾੱਪੀਲਿਫਟ ਮੁਫ਼ਤ ਸਾੱਫਟਵੇਅਰ ਹੈ: ਤੁਸੀਂ ਇਸ ਦੀ ਵਰਤੋਂ, ਅਧਿਐਨ ਅਤੇ ਇਸ ਨੂੰ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸ ਵਿੱਚ ਆਪਣੀ ਮਰਜ਼ੀ ਅਨੁਸਾਰ ਸੁਧਾਰ ਸਕਦੇ ਹੋ. ਖਾਸ ਤੌਰ \'ਤੇ ਤੁਸੀਂ ਇਸ ਨੂੰ GNU ਜਨਰਲ ਪਬਲਿਕ ਲਾਇਸੈਂਸ ਦੀਆਂ ਸ਼ਰਤਾਂ ਦੇ ਅਧੀਨ ਵੰਡ ਸਕਦੇ ਹੋ / ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰ ਸਕਦੇ ਹੋ ਜਿਵੇਂ ਕਿ ਮੁਫਤ ਸਾੱਫਟਵੇਅਰ ਫਾਊਂਡੇਸ਼ਨ ਦੁਆਰਾ ਪ੍ਰਕਾਸ਼ਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਜਾਂ ਤਾਂ ਲਾਇਸੈਂਸ ਦਾ ਵਰਜ਼ਨ 3, ਜਾਂ (ਤੁਹਾਡੇ ਵਿਕਲਪ\' ਤੇ) ਬਾਅਦ ਦਾ ਕੋਈ ਸੰਸਕਰਣ. + ਲਾਇਸੈਂਸ ਪੜ੍ਹੋ + ਹਿਸਟਰੀ + ਖੋਜਿਆ ਗਿਆ + ਵੇਖਿਆ ਗਿਆ + ਹਿਸਟਰੀ ਬੰਦ ਕੀਤੀ ਹੋਈ ਹੈ + ਹਿਸਟਰੀ + ਹਿਸਟਰੀ ਖ਼ਾਲੀ ਹੈ + ਹਿਸਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਆਈਟਮ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਕੀ ਤੁਸੀਂ ਇਸ ਚੀਜ਼ ਨੂੰ ਖੋਜ ਸੂਚੀ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਵੇਖੀ ਗਈ ਸੂਚੀ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ \? + ਕੀ ਤੁਸੀਂ ਸੱਚਮੁੱਚ ਹਿਸਟਰੀ ਤੋਂ ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਆਖਰੀ ਚਲਾਈ ਗਈ + ਸਭ ਤੋਂ ਜਿਆਦਾ ਚਲਾਈ ਗਈ + ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ + ਖਾਲੀ ਪੇਜ + Kiosk ਪੇਜ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਪੇਜ + ਫੀਡ ਪੇਜ + ਚੈਨਲ ਪੇਜ + ਚੈਨਲ ਚੁਣੋ + ਅਜੇ ਤੱਕ ਕੋਈ ਚੈਨਲ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨਹੀਂ + ਇੱਕ Kiosk ਚੁਣੋ + ਐਕਸਪੋਰਟ ਕੀਤਾ ਗਿਆ + ਇੰਪੋਰਟ ਕੀਤਾ ਗਿਆ + ਕੋਈ ਵੈਧ ZIP ਫਾਈਲ ਨਹੀਂ ਹੈ + ਚੇਤਾਵਨੀ: ਸਾਰੀਆਂ ਫਾਈਲਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ. + ਇਹ ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਸੈਟ-ਅਪ ਨੂੰ Override ਕਰ ਦੇਵੇਗਾ. + kiosk + ਰੁਝਾਨ ਵਿੱਚ + ਟੌਪ 50 + ਨਵਾਂ ਅਤੇ ਗਰਮਾ-ਗਰਮ + ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ + ਪੌਪ-ਅਪ ਪਲੇਅਰ + ਹਟਾਓ + ਵੇਰਵੇ + ਆਡੀਓ ਸੈਟਿੰਗਾਂ + ਕਤਾਰਬੱਧ ਕਰਨ ਵਾਸਤੇ ਦਬਾ ਕੇ ਰੱਖੋ + ਬੈਕਗ੍ਰਆਊਂਡ ਵਿੱਚ ਕਤਾਰਬੱਧ ਕਰੋ + ਨਵੇਂ ਪੌਪ-ਅਪ ਵਿੱਚ ਕਤਾਰਬੱਧ ਕਰੋ + ਇਥੇ ਚਲਾਉ + "ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾਉ" + ਨਵੇਂ ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਓ + Drawer ਖੋਲੋ + Drawer ਬੰਦ ਕਰੋ + ਜਲਦੀ ਹੀ ਇੱਥੇ ਕੁੱਝ ਦਿਖਾਈ ਦੇਵੇਗਾ ;D + ਤਰਜੀਹੀ \'OPEN\' ਐਕਸ਼ਨ + Content ਖੋਲ੍ਹਣ ਵੇਲੇ Default ਕਾਰਵਾਈ — %s + ਵੀਡੀਓ ਪਲੇਅਰ + ਬੈਕਗ੍ਰਾਊਂਡ ਪਲੇਅਰ + ਪੌਪ-ਅਪ ਪਲੇਅਰ + ਹਮੇਸ਼ਾ ਪੁੱਛੋ + ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰ ਰਹੇ ਹਾਂ… + ਬੇਨਤੀ ਕੀਤਾ Content ਲੋਡ ਕੀਤੀ ਜਾ ਰਿਹਾ ਹੈ + ਨਵੀਂ ਪਲੇ-ਲਿਸਟ + ਮਿਟਾਓ + ਨਾਮ ਬਦਲੋ + ਨਾਮ + ਪਲੇ-ਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ + ਪਲੇ-ਲਿਸਟ thumbnail ਦੇ ਤੌਰ ਤੇ ਸੈੱਟ ਕਰੋ + ਬੁੱਕਮਾਰਕ ਪਲੇ-ਲਿਸਟ + ਬੁੱਕਮਾਰਕ ਹਟਾਓ + ਇਸ ਪਲੇ-ਲਿਸਟ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ \? + ਪਲੇ-ਲਿਸਟ ਬਣਾਈ ਗਈ + ਪਲੇ-ਲਿਸਟ ਕੀਤਾ ਗਿਆ + ਪਲੇ-ਲਿਸਟ thumbnail ਬਦਲਿਆ ਗਿਆ. + ਪਲੇ-ਲਿਸਟ ਨੂੰ ਮਿਟਾ ਨਹੀਂ ਸਕੇ. + No captions + ਫਿੱਟ + ਭਰੋ + ਜ਼ੂਮ + Auto-Generated + captions + ਪਲੇਅਰ caption, text ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਉਂਡ ਸਟਾਈਲ ਨੂੰ ਸੋਧੋ. ਪ੍ਰਭਾਵ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ. + LeakCanary ਚਲਾਓ + ਮੈਮੋਰੀ ਲੀਕ monitoring, ਐਪ ਨੂੰ Unresponsive ਬਣਾ ਸਕਦੀ ਹੈ ਜਦੋਂ ਹੀਪ dumping ਹੁੰਦੀ ਹੈ + Out-of-lifecycle ERROR ਰਿਪੋਰਟ ਕਰੋ + ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਟੁਕੜੇ ਜਾਂ ਗਤੀਵਿਧੀਆਂ ਦੇ lifecycle ਤੋਂ ਬਾਹਰ undeliverable Rx ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰਨਾ + ਇੰਪੋਰਟ/ਐਕਸਪੋਰਟ + ਇੰਪੋਰਟ + ਇੰਪੋਰਟ ਕਰੋ + ਐਕਸਪੋਰਟ ਕਰੋ + ਇੰਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ… + ਐਕਸਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ… + ਇੰਪੋਰਟ ਫਾਈਲ + ਪਿੱਛਲਾ ਐਕਸਪੋਰਟ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਐਕਸਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ + ਯੂ ਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ: +\n +\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s +\n2. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ +\n3. ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ) + URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: +\n +\n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) +\n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s +\n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ +\n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ. + yourID, Soundcloud.com/yourid + ਯਾਦ ਰੱਖੋ ਕਿ ਇਹ ਕਾਰਜ ਡਾਟਾ consuming ਹੋ ਸਕਦਾ ਹੈ. +\n +\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਪਲੇਅਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ + tempo + pitch + ਅਨਲਿੰਕ (distortion ਪੈਦਾ ਹੋ ਸਕਦੀ ਹੈ) + ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? + NewPipe\'s ਗੋਪਨੀਯਤਾ ਨੀਤੀ + NewPipe ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ. ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ. +\nNewPipe ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡੇਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ. + ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ + ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ NewPipe ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ. ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ. +\nਸਾਨੂੰ BUG ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਪਵੇਗਾ. + ਸਵੀਕਾਰ ਕਰੋ + ਅਸਵੀਕਾਰ + ਕੋਈ ਸੀਮਾ ਨਹੀਂ + ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ Resolution ਨੂੰ ਸੀਮਿਤ ਕਰੋ + ਐਪ switch ਕਰਨ ਤੇ minimize ਕਰੋ + ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਐਪ \'ਤੇ ਜਾਣ ਵੇਲੇ ਐਕਸ਼ਨ + ਕੋਈ ਨਹੀਂ + ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ Minimize ਕਰੋ + ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ minimize ਕਰੋ + ਚੁੱਪ ਦੌਰਾਨ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ ਕਰੋ + ਸਟੇਪ + ਰੀਸੈੱਟ + ਚੈਨਲਾਂ + ਪਲੇ ਸੂਚੀਆਂ + ਟਰੈਕਸ + ਯੂਜ਼ਰਸ + ਅਨ-ਸਬਸਕ੍ਰਾਈਬ + ਨਵਾਂ ਟੈਬ + ਟੈਬ ਚੁਣੋ + ਆਵਾਜ਼ gesture ਕੰਟਰੋਲ + ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ gestures ਦੀ ਵਰਤੋਂ ਕਰੋ + ਸਕ੍ਰੀਨ ਲਾਈਟ gesture ਕੰਟਰੋਲ + ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਲਾਈਟ ਕੰਟਰੋਲ ਕਰਨ ਲਈ gestures ਦੀ ਵਰਤੋਂ ਕਰੋ + ਮੂਲ ਭਾਸ਼ਾ Content + ਅਪਡੇਟਾਂ + ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਐਪ ਅੱਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ + ਨਵੇਂ NewPipe ਸੰਸਕਰਣ ਲਈ ਸੂਚਨਾਵਾਂ + ਬਾਹਰੀ ਸਟੋਰੇਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ + ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ. ਕੀ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \? + Default ਟੈਬ ਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ, save ਕੀਤੇ ਟੈਬਾਂ ਨੂੰ ਪੜ੍ਹਨ ਵੇਲੇ ERROR + Default ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰੋ + ਕੀ ਤੁਸੀਂ Default ਲਾਗੂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ \? + ਸਬਸਕ੍ਰਾਇਬਰਾਂ ਦੀ ਗਿਣਤੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ + ਮੁੱਖ ਪੰਨੇ ਤੇ ਕਿਹੜੇ ਟੈਬ ਦਿਖਾਏ ਜਾਣਗੇ + ਚੋਣ + ਅਪਡੇਟਾਂ + ਜਦੋਂ ਨਵਾਂ ਸੰਸਕਰਣ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ ਤਾਂ ਐਪ ਅਪਡੇਟ ਨੂੰ ਪੁੱਛਣ ਲਈ ਇੱਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦਿਖਾਓ + ਲਿਸਟ view ਮੋਡ + ਲਿਸਟ + ਗਰਿੱਡ + ਆਟੋ + ਸਵਿੱਚ view + NewPipe ਅੱਪਡੇਟ ਉਪਲਬੱਧ! + ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਦਬਾਓ + ਮੁਕੰਮਲ ਹੋਇਆ + ਬਕਾਇਆ + ਰੁਕਿਆ + ਕਤਾਰਬੱਧ + Post-processing + ਕਤਾਰ + ਸਿਸਟਮ ਦੁਆਰਾ ਕਾਰਵਾਈ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਗਿਆ + ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ + ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ + %s ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ + ਵਿਲੱਖਣ ਨਾਮ Generate ਕਰੋ + overwrite + ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਕ ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਤੋਂ ਜਾਰੀ ਹੈ + ERROR ਵਿਖਾਓ + ਕੋਡ + Destination ਫੋਲਡਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ + ਫਾਈਲ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ + ਸਿਸਟਮ ਦੁਆਰਾ permission Deny ਕੀਤੀ ਗਈ + ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਫੇਲ੍ਹ + ਸਰਵਰ ਨਹੀਂ ਲੱਭ ਸਕਿਆ + ਸਰਵਰ ਨਾਲ ਜੁੜ ਨਹੀਂ ਸਕਦਾ + ਸਰਵਰ ਨੇ ਡਾਟਾ ਨਹੀਂ ਭੇਜਿਆ + ਸਰਵਰ ਮਲਟੀ-Threaded ਡਾਊਨਲੋਡਸ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ, ਇਸ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ @string/msg_threads = 1 + ਬੇਨਤੀ ਕੀਤੀ ਸੀਮਾ ਤਸੱਲੀਬਖਸ਼ ਨਹੀਂ ਹੈ + ਨਹੀਂ ਲਭਿਆ + Post-processing ਫੇਲ੍ਹ + ਮੁਕੰਮਲ ਹੋਈਆਂ ਡਾਊਨਲੋਡ ਸਾਫ਼ ਕਰੋ + ਡਾਉਨਲੋਡਸ ਤੋਂ ਆਪਣੀਆਂ %s ਬਕਾਇਆ ਟ੍ਰਾਂਸਫਰ ਜਾਰੀ ਰੱਖੋ + ਰੁੱਕੋ + ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ + ਡਾਉਨਲੋਡ ਰੱਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ + Metered ਨੈਟਵਰਕਸ ਤੇ ਰੁਕਾਵਟ + ਮੋਬਾਈਲ ਡਾਟਾ ਤੇ switch ਕਰਨ ਵੇਲੇ ਲਾਭਦਾਇਕ ਹੈ, ਹਾਲਾਂਕਿ ਕੁਝ ਡਾਉਨਲੋਡਾਂ ਨੂੰ suspend ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ + ਇਵੇੰਟਸ + ਕਾਨਫਰੰਸਾਂ + ਟਿੱਪਣੀਆਂ ਦਿਖਾਓ + ਟਿੱਪਣੀਆਂ ਵਿਖਾਉਣਾ ਬੰਦ ਕਰਨ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ + ਆਟੋ-ਪਲੇ + + ਟਿਪਣੀਆਂ + + + ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਕੀਤੀ ਗਈ + ਟਿੱਪਣੀਆਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ + ਬੰਦ ਕਰੋ + ਪਲੇਅਬੈਕ ਦੋਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ + ਪਿਛਲੀ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਤੋਂ ਮੁੜ ਚਲਾਓ + ਸੂਚੀਆਂ ਦੀ ਸਥਿਤੀ + ਸੂਚੀਆਂ ਵਿੱਚ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸੂਚਕ ਦਿਖਾਓ + ਡਾਟਾ ਮਿਟਾਓ + Watch ਹਿਸਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ. + ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ. + ਫਾਈਲ ਮੂਵ ਕੀਤੀ ਜਾਂ ਮਿਟਾਈ ਗਈ ਹੈ + ਇਸ ਨਾਮ ਵਾਲੀ ਇੱਕ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ + ਇਸ ਨਾਮ ਨਾਲ ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ + ਫਾਈਲ Overwrite ਨਹੀਂ ਹੋ ਸਕਦੀ + ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਥੇ ਇੱਕ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਹੈ + ਫਾਈਲ ਤੇ ਕੰਮ ਕਰਦੇ ਸਮੇਂ NewPipe ਬੰਦ ਕੀਤੀ ਗਈ ਸੀ + ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ + Progress lost, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟ ਗਈ ਸੀ + ਕੁਨੈਕਸ਼ਨ timeout + are you sure\? + ਡਾਊਨਲੋਡ ਸੀਮਾ ਕਤਾਰ ਵਿੱਚ + one download will run at the same time + ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰੋ + ਡਾਊਨਲੋਡਸ ਰੋਕੋ + ਪੁੱਛੋ ਕਿੱਥੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ + ਤੁਹਾਨੂੰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਹਰ ਡਾਉਨਲੋਡ ਨੂੰ ਕਿੱਥੇ save ਕਰਨਾ ਹੈ + ਤੁਹਾਨੂੰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਹਰ ਡਾਉਨਲੋਡ ਨੂੰ ਕਿੱਥੇ save ਕਰਨਾ ਹੈ. +\nਜੇ ਤੁਸੀਂ ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਇਸ ਨੂੰ ਚਾਲੂ ਕਰੋ. + \ No newline at end of file From 1bb58a10e26dac0692f75b239a582d1728d034ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=E1=BA=A7n=20L=C3=AA=20Nh=E1=BA=ADt=20Huy?= Date: Sat, 17 Aug 2019 15:21:08 +0000 Subject: [PATCH 23/46] Translated using Weblate (Vietnamese) Currently translated at 99.6% (469 of 471 strings) --- app/src/main/res/values-vi/strings.xml | 68 +++++++++++++++++++------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 16171429e..6888f7b8d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -12,11 +12,11 @@ Tải về Tìm kiếm Cài đặt - Ý của bạn là %1$s\? + Ý của bạn là: %1$s\? Chia sẻ với Chọn trình duyệt Sử dụng trình phát video bên ngoài - Âm thanh có thể không có ở *một vài* độ phân giải video + Loại bỏ âm thanh trên *MỘT SỐ* độ phân giải video Sử dụng trình phát audio bên ngoài Chế độ popup của NewPipe Trình phát nổi @@ -45,13 +45,13 @@ Tối Đen Nhớ kích thước và vị trí của popup - Nhớ kích thước và vị trí cuối của popup + Nhớ kích thước và vị trí lần trước của popup Điều khiển cử chỉ trình phát Sử dụng cử chỉ để kiểm soát độ sáng và âm lượng của trình phát Đề xuất tìm kiếm Hiển thị các đề xuất khi tìm kiếm Tải về - Tiếp + Tiếp theo Hiển thị video \"Tiếp theo\" và \"Tương tự\" URL không được hỗ trợ Hiển thị @@ -78,7 +78,7 @@ Độ phân giải tốt nhất Lỗi Lỗi kết nối mạng - Không thể tải tất cả các thumbnails + Không thể tải tất cả hình thu nhỏ Không thể giải mã chữ ký URL video Không thể phân tích cú pháp trang web Không thể phân tích cú pháp hoàn toàn trang web @@ -132,7 +132,7 @@ Chạm để biết chi tiết Vui lòng đợi … Sao chép vào clipboard - Chọn một thư mục tải về có sẵn + Chọn một thư mục tải về có sẵn trong cài đặt Cần quyền này để \nmở trong chế độ popup ReCAPTCHA @@ -158,7 +158,7 @@ Ngôn ngữ nội dung ưu tiên Video & âm thanh Trình phát nổi - Lịch sử & bộ nhớ cache + Lịch sử xem Lịch sử & bộ nhớ cache Playlist Không tìm thấy @@ -170,13 +170,13 @@ Không tìm thấy trình phát luồng nào (bạn có thể cài đặt VLC để phát). Tải về tệp luồng Hiển thị thông tin - main + Trang chủ Đăng ký - Playlist đã đánh dấu + Danh sách phát được đánh dấu Có gì mới Thêm vào Sử dụng tìm kiếm nhanh không chính xác - Tìm kiếm không chính xác cho phép trình phát tua đến vị trí nhanh hơn với độ chính xác bị hạn chế + Tìm kiếm không chính xác cho phép trình phát tìm đến vị trí nhanh hơn với độ chính xác bị hạn chế Tải hình thu nhỏ Tắt để không tải về các hình thu nhỏ, tiết kiệm lưu lượng mạng và bộ nhớ. Thay đổi điều này sẽ xóa bộ nhớ đệm hình ảnh cả trong RAM và trong bộ nhớ. Đã xóa bộ nhớ cache hình ảnh @@ -184,7 +184,7 @@ Xóa tất cả dữ liệu trang web được lưu trong bộ nhớ cache Đã xóa bộ nhớ cache siêu dữ liệu Tự động phát tiếp theo theo hàng - Tự động thêm một luồng có liên quan khi phát luồng cuối cùng trong hàng đợi không lặp lại. + Tự động thêm một luồng có liên quan khi phát luồng cuối cùng trong hàng đợi không lặp lại Lịch sử tìm kiếm Lưu trữ truy vấn tìm kiếm cục bộ Theo dõi các video đã xem @@ -252,7 +252,7 @@ Không có video nào - Video + Videos Tạo nên Xóa một @@ -315,10 +315,10 @@ Cài đặt âm thanh Giữ để nối tiếp Thêm vào trình phát nền - Thêm vào trình phát popup + Thêm vào trình phát popup mới Bắt đầu phát ở đây - Bắt đầu từ đây trong nền - Bắt đầu từ đây trên trình phát popup + Bắt đầu phát từ đây trong nền + Bắt đầu phát từ đây trên trình phát popup mới Mở ngăn kéo Đóng ngăn Một cái gì đó sẽ xuất hiện ở đây sớm ;D @@ -409,7 +409,7 @@ Thông báo cập nhật ứng dụng Thông báo phiên bản NewPipe mới Bộ nhớ ngoài không khả dụng - Hiện tại chưa thể tải vào thẻ SD ngoài. Đặt lại vị trí tải về\? + Không thể tải vào thẻ SD ngoài. Đặt lại vị trí tải về\? Khôi phục lại các tab mặc định do danh sách các tab đã lưu không hợp lệ Khôi phục về mặc định Bạn có muốn khôi phục về mặc định\? @@ -457,9 +457,41 @@ 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ề - Tạm dừng tải khi chuyển qua dữ liệu di động - Các tải về không thể tạm dừng được sẽ bắt đầu lại từ đầu + Tạm dừng tải khi trên dữ liệu di động + Hữu ích khi chuyển sang dữ liệu di động, nhưng một số tải xuống không thể bị đình chỉ Đang chờ xử lý Hội thảo + Hiện nhận xét + Vô hiệu hoá để dừng nhận xét xuất hiện + Tự động phát + + Nhận xét + + Không có nhận xét + Không thể tải nhận xét + Đóng + Tiếp tục phát + Phục hồi vị trí phát lại + Vị trí phát trong danh sách + Hiện vị trí phát lại trong danh sách + Xoá dữ liệu + Đã xoá vị trí phát lại. + Tệp đã di chuyển hoặc đã xoá + Tên file này đã tồn tại + Không thể ghi đè lên tệp + Có một bản tải xuống đang chờ xử lí với tên này + Newpipe đã bị đóng khi đang xử lí tệp + Không đủ dung lượng trên máy + Quá trình mất, vì tập tin đã bị xoá + Kết nối hết thời gian + Bạn có chắc không\? + Giới hạn hàng chờ tải xuống + Chỉ một tải xuống sẽ chạy + Bắt đầu tải xuống + Tạm dừng tải xuống + Hỏi vị trí tải xuống + Bạn sẽ được hỏi vị trí lưu mỗi lần tải xuống + Bạn sẽ được hỏi vị trí lưu mỗi lần tải xuống. +\nBật tính năng này nếu bạn muốn tải xuống sang thẻ SD ngoài. \ No newline at end of file From 645e16fd90945ce516cc57f4c05f2536530f2848 Mon Sep 17 00:00:00 2001 From: thami simo Date: Fri, 16 Aug 2019 19:40:32 +0000 Subject: [PATCH 24/46] Translated using Weblate (Arabic) Currently translated at 99.6% (469 of 471 strings) --- app/src/main/res/values-ar/strings.xml | 65 +++++++++++++++++--------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index a509462f1..340da2520 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -20,7 +20,7 @@ مسار حفظ تنزيلات الفيديو في مسار ملفات الفيديو المحفوظة "لا يمكن إنشاء مجلد للتنزيلات في '%1$s'" - "تم إنشاء مجلد تنزيلات في '%1$s'" + إنشاء دليل التنزيل \'%1$s\' تثبيت تطبيق Kore غير موجود. هل تريد تثبيته ؟ مضيء @@ -42,7 +42,7 @@ مشاركة مشاركة بواسطة عرض مقاطع الفيديو \"التالية\" و \"المشابهة\" - عرض خيار لتشغيل الفيديو بواسطة مشغل كودي + عرض خيار تشغيل الفيديو عبر مركز وسائط Kodi عرض خيار التشغيل بواسطة كودي السمة تم النشر يوم %1$s @@ -66,11 +66,11 @@ في الخلفية تشغيل تلقائي اسود - التاريخ وذاكرة التخزين المؤقت + مراقبة السجل التاريخ و ذاكرة التخزين المؤقت محتوى - التنزيلات - عنوان التنزيلات + التحميلات + التحميلات الكل القناة الفيديو @@ -80,7 +80,7 @@ التاريخ التاريخ فتح في وضع منبثق - يزيل الصوت في بعض الخيارات + "يزيل الصوت في بعض قرارات الدقة" وضع النوافذ المنبثقة NewPipe تم إلغاء الاشتراك في القناة تعذر تغيير حالة الاشتراك @@ -113,11 +113,11 @@ محتوى مقيد بحسب العمر "إظهار الفيديو المقيد بحسب العمر. يمكن السماح باستخدام هذه المواد من \"الإعدادات\"." بث مباشر - عنوان تقرير الخطأ + أبلغ عن خطأ قائمة التشغيل نعم لاحقاً - تعطيل + معطل فلتر تحديث تنظيف @@ -158,11 +158,11 @@ بليون ليس هناك مشترِكون - %s لا يوجد مشترك + %s لا يوجد مشارك %s مشترك - %s اثنتين مشتركين + "%s مشتركتين" %s اشتراكات - %s مشتركين + %s مشاركين %s مشتركون دون مشاهدات @@ -184,7 +184,7 @@ انقر للحصول على التفاصيل يُرجى الإنتظار… تم نسخه إلى الحافظة - الرجاء تحديد مجلد لحفظ التنزيلات + يرجى تحديد مجلد التنزيل لاحقًا في الإعدادات هذا الإذن مطلوب \nللفتح في وضع النافذة المنبثقة اختبار reCAPTCHA @@ -200,7 +200,7 @@ فتح الموقع المساهمون التراخيص - تطبيق حُر و خفيف لتشغيل اليوتيوب على نظام الأندرويد. + تطبيق مجاني خفيف الوزن وبث حي على نظام أندرويد. ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية ، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل ! عرض على GitHub @@ -234,7 +234,7 @@ التفاصيل الإعدادات الصوتية تشغيل هنا - تشغيل في وضع النافذة المنبثقة + تشغيل في وضع نافذة منبثقة تحدي الكابتشا اضغط للإدراج في قائمة الانتظار @@ -425,11 +425,11 @@ تتبيه تحديث التطبيق إيماءة التحكم بالصوت الأحداث - التنبيه بإصدارات newpipe الجديدة - ذاكرة التخزين الخارجي غير متوفرة - التحميل إلى بطاقة الذاكرة الخارجية ليس متاحا حتى الآن. إعادة تعيين موقع مجلد التحميل؟ - باستخدام علامات الجدولة الافتراضية، حدث خطأ أثناء قراءة علامات التبويب المحفوظة - استعادة الافتراضيات + الإخطارات عند تواجد إصدار newpipe جديد + وحدة التخزين الخارجية غير متوفرة + "التنزيل على بطاقة SD الخارجية غير ممكن. إعادة تعيين موقع مجلد التحميل؟" + عند إستخدام علامات التبويب الافتراضية ، وقع خطأ أثناء قراءة علامات التبويب المحفوظة + استعادة الضبط الافتراضي هل تريد استعادة الإعدادات الافتراضية؟ عدد المشتركين غير متاح ما هي التبويبات التي تظهر على الصفحة الرئيسية @@ -476,8 +476,8 @@ توقف أقصى عدد للمحاولات الحد الأقصى لعدد محاولات قبل إلغاء التحميل - "ايقاف عند التحويل إلى البيانات المتنقلة" - سيتم إعادة تحميل التنزيلات التي لا يمكن إيقافها + "إنقطع الإتصال بالشبكة عند التحويل إلى البيانات المتنقلة" + مفيد عند التبديل إلى بيانات الجوال ، على الرغم من أنه لا يمكن تعليق بعض التنزيلات إظهار التعليقات تعطيل لإيقاف عرض التعليقات تشغيل تلقائي @@ -492,4 +492,27 @@ لا توجد تعليقات تعذر تحميل التعليقات إغلاق + استئناف التشغيل + استعادة آخر موقف التشغيل + واضع القوائم + إظهار مؤشرات وضع التشغيل في القوائم + امسح البيانات + تم حذف وضع التشغيل. + نقل الملف أو حذفه + يوجد ملف بهذا الاسم مسبقاً + لا يمكن الكتابة فوق الملف + هناك تنزيل معلق بهذا الاسم + تم إغلاق NewPipe أثناء العمل على الملف + لم يتبقى مساحة في الجهاز + تم فقد التقدم بسبب حذف الملف + انتهى وقت الاتصال + هل أنت واثق؟ + حد قائمة انتظار التنزيل + سيتم تشغيل تنزيل واحد في نفس الوقت + بدء التنزيلات + إيقاف التحميل مؤقتا + اسأل عن مكان التنزيل + سيُطلب منك مكان حفظ كل تنزيل + سوف يطلب منك مكان حفظ كل تحميل. +\nقم بتشغيل هذا إذا كنت تريد التنزيل إلى بطاقة SD خارجية. \ No newline at end of file From 7ff48a6d84d67e4ac7572d4075451c0d929e85de Mon Sep 17 00:00:00 2001 From: zmni Date: Thu, 15 Aug 2019 04:48:15 +0000 Subject: [PATCH 25/46] Translated using Weblate (Indonesian) Currently translated at 99.2% (467 of 471 strings) --- app/src/main/res/values-id/strings.xml | 32 ++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 2131974b3..e00cbd2e3 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -97,7 +97,7 @@ Sentuh untuk detail Mohon tunggu… Disalin ke papan klip - Silakan pilih direktori unduhan yang tersedia + Silakan pilih folder unduhan di pengaturan Pemutar stream tidak ditemukan. Apakah anda ingin memasang VLC\? Tidak bisa dekripsi tanda tangan URL video App/UI rusak @@ -171,7 +171,7 @@ Utama Riwayat pencarian Simpan pencarian secara lokal - Riwayat & Cache + Riwayat tontonan Notifikasi NewPipe Riwayat Riwayat dinonaktifkan @@ -412,7 +412,7 @@ Notifikasi Pembaruan Apl Notifikasi untuk versi NewPipe baru Penyimpanan eksternal tidak tersedia - Belum bisa mengunduh ke kartu SD eksternal. Setel ulang lokasi folder unduhan\? + Tidak bisa mengunduh ke kartu SD eksternal. Atur ulang lokasi folder unduhan\? Menggunakan tab baku, ralat saat membaca tab yang disimpan Kembali ke awal Apakah anda ingin kembali ke awal\? @@ -461,8 +461,8 @@ Berhenti Percobaan maksimum Jumlah upaya maksimum sebelum membatalkan unduhan - Berhenti ketika beralih ke data seluler - Unduhan yang tidak dapat dijeda akan diulang dari awal + Berhenti pada jaringan terbatas + Berguna saat beralih ke data seluler, walaupun beberapa unduhan tidak bisa ditangguhkan Tampilkan komentar Nonaktifkan untuk berhenti menampilkan komentar Otomatis putar @@ -472,4 +472,26 @@ Tidak ada komentar Tidak bisa memuat komentar Tutup + Lanjutkan pemutaran + Pulihkan posisi pemutaran terakhir + Posisi dalam daftar + Tampilkan indikator posisi pemutaran di dalam daftar + Hapus data + Posisi pemutaran dihapus. + Berkas dipindah atau dihapus + Berkas dengan nama yang sama sudah ada + tidak bisa menimpa ulang berkas + Ada unduhan yang dijeda dengan nama ini + NewPipe telah ditutup saat sedang memproses berkas + Tidak ada ruang kosong tersisa pada perangkat + Kehilangan laju, karena berkas telah dihapus + Apakah anda yakin\? + Batasi antrean unduhan + Satu unduhan akan berjalan pada waktu yang bersamaan + Mulai unduh + Jeda unduh + Tanyakan lokasi unduhan + Anda akan ditanya lokasi penyimpanan berkas unduhan + Anda akan ditanya lokasi penyimpanan berkas unduhan. +\nAktifkan opsi ini jika anda ingin mengunduh ke kartu SD eksternal \ No newline at end of file From 9c9dd6c7bf90f3bd630f6839b7a95c006d7a417d Mon Sep 17 00:00:00 2001 From: Florian Date: Thu, 15 Aug 2019 10:10:50 +0000 Subject: [PATCH 26/46] Translated using Weblate (French) Currently translated at 98.3% (463 of 471 strings) --- app/src/main/res/values-fr/strings.xml | 32 +++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 64914be6a..15b3a5a9b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -55,7 +55,6 @@ Erreur Impossible d\'analyser le site web Contenu non disponible - Désolé, des erreurs se sont produites. Contenu Contenu avec limite d\'âge @@ -103,7 +102,7 @@ Appuyer pour plus de détails Veuillez patienter… Copié dans le presse-papiers - Sélectionner un dossier de téléchargement disponible + Veuillez définir un dossier de téléchargement plus tard dans les paramètres Impossible de charger l\'image L’application a crashé reCAPTCHA @@ -175,7 +174,7 @@ Caractère de remplacement Historique de recherche Conserver les recherches sur l\'appareil - Historique et cache + Voir l \'historique Historique Recherché Regardé @@ -421,7 +420,7 @@ Sélection Arrêter Événements - Télécharger vers la carte SD n\'est pas encore possible. Voulez-vous réinitialiser l\'emplacement du dossier \? + Télécharger vers la carte SD n\'est pas possible. Voulez-vous réinitialiser l\'emplacement du dossier \? Quels onglets seront visibles sur la page principale Mises à jour Afficher une notification pour proposer une mise à jour de l\'application lorsqu\'une nouvelle version est disponible @@ -432,7 +431,7 @@ Une mise à jour de NewPipe disponible ! Appuyez pour télécharger Terminé - Dans la file d\'attente + En attente En pause Téléchargement échoué Délai de connection dépassé @@ -447,8 +446,8 @@ Il y a un téléchargement en cours avec ce nom Afficher l\'erreur Code - Le fichier ne peut pas être créé - Le dossier de destination ne peut pas être créé + Le dossier de destination ne peut pas être créé + Le fichier ne peut pas être créé Autorisation refusée par le système Échoué de la connexion sécurisée Le serveur est introuvable @@ -457,7 +456,7 @@ Introuvable Effacer les téléchargements terminés Mettre en pause lors du passage en données mobiles - Les téléchargements qui ne peuvent pas être mis en pause seront redémarrés + Utile lors du passage aux données mobiles, bien que certains téléchargements ne peuvent pas être suspendus Mode liste post-traitement File d’attente @@ -479,4 +478,21 @@ Pas de commentaires Impossible de charger les commentaires Fermer + Reprendre la lecture + Effacer les données + Fichier déplacé ou supprimé + ne peut pas remplacer le fichier + Il y a déjà un téléchargement en attente avec ce nom + NewPipe a été fermé alors qu\'il travaillait sur le fichier + Aucun espace disponible sur le périphérique + Progression perdue, car le fichier a été effacé + Êtes-vous certain \? + Limiter la file d\'attente de téléchargement + Un téléchargement s\'exécutera en même temps + Démarrer les téléchargements + Mettre en pause les téléchargements + Demander où télécharger + On vous demandera où enregistrer chaque téléchargement + On vous demandera où enregistrer chaque téléchargement. +\nActivez cette option si vous voulez télécharger sur la carte SD externe \ No newline at end of file From 1d6c722c28d73162906a09a05e3cdc9a4f35300c Mon Sep 17 00:00:00 2001 From: Westminboy Date: Sun, 18 Aug 2019 04:02:55 +0000 Subject: [PATCH 27/46] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.8% (470 of 471 strings) --- app/src/main/res/values-cmn/strings.xml | 69 ++++++++++++++++++------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index a98969a1e..dafa9e22c 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -92,7 +92,7 @@ 第三方执照 打开网页 删除书签 - 确定要删除该播放列表吗? + 确定删除该播放列表吗? 已创建播放列表 播放列表 步骤 @@ -115,14 +115,14 @@ 已清除缓存的元数据 不加载缩略图时,可以节省数据和存储空间。更改后将清除存储空间和扩展空间的缓存。 自动排列下一个媒体 - 在非重复排列中播放最后一个媒体时,自动推荐相关媒体。 + 在非重复排列中播放最后一个媒体时自动推荐相关媒体 玩家手势控制 使用手势控制播放器的亮度和音量 搜索建议 搜索时显示建议 搜索历史记录 在本地存储搜索 - 历史记录和缓存数据 + 观看历史 记录观看过的视频 取得视窗焦点时继续播放 在被打断后继续播放(例如有来电) @@ -254,8 +254,8 @@ 没有视频 - 部视频 - + 视频 + 删除 校验 @@ -266,7 +266,7 @@ 错误的网址或网络不可用 点按以查看详细信息 复制到剪贴板 - 请选择下载文件夹 + 请稍后在设置中定义下载文件夹 在悬浮窗模式打开 \n需要此权限 已删除一个项目。 @@ -336,19 +336,19 @@ 详细 音频设置 长按以新增至队列 - 转到后台时排列 - 排列新的悬浮窗 + 加入后台播放列表 + 加入悬浮窗播放列表 从这里开始播放 - 转到后台时从这里开始 - 从新的悬浮窗开始 + 开始在后台播放 + 开始在新悬浮窗播放 打开抽屉 关闭抽屉 - 某些东西即将在此出现;D + 很快就会出现在这里 ;D 偏好的「开启」动作 开启内容时的默认动作 - %s 视频播放器 - 转到后台播放 - 悬浮窗播放 + 后台播放器 + 悬浮窗播放器 总是询问 正在获取信息… 正在载入请求的内容 @@ -362,12 +362,12 @@ 播放列表缩略图已更改。 无法删除播放列表。 没有字幕 - 合适的 + 合适 填满 缩放 自动生成 字幕 - 修改播放器标题文本比例和背景样式。需要重启才能生效。 + 修改播放器字幕文本比列和背景样式。需要重启才能生效。 启用 LeakCanary 内存泄漏监视可能导致应用程序在存储时无响应 报告活动周期外错误 @@ -415,7 +415,7 @@ 应用升级通知 新 NewPipe 版本通知 外储存不可行 - 下载至外置SD卡还未可行。重置下载文件夹位置? + 无法下载到外部SD卡。重置下载文件夹位置? 恢复默认 您真的要恢复至默认吗? 选择 @@ -451,7 +451,7 @@ 重试上限 取消下载前可以尝试的最多次数 - 换成手机数据时暂停 + 换成手机数据时中断 事件 使用默认选项卡, 读取保存的选项卡时出错 订阅者计数不可用 @@ -466,5 +466,38 @@ 服务器不接受多线程下载, 请重试使用 @string/msg_threads = 1 请求范围无法满足 继续进行%s个待下载转移 - 无法暂停的下载将重新开始 + 无法暂停的下载将重新开始。 + 显示评论 + 禁用停止显示评论 + 自动播放 + + 评论 + + + 没有评论 + 无法加载评论 + 关闭 + 继续播放 + 恢复上次播放位置 + 列表中的位置 + 在列表中显示播放位置指示符 + 清除数据 + 播放位置已删除。 + 文件被移动或删除 + 已存在具有此名称的文件 + 无法覆盖该文件 + 同名文件正在等待下载 + 处理此文件时 NewPipe 已关闭 + 设备上没有剩余空间 + 进度丢失,因为文件已被删除 + 连接超时 + 你确定吗? + 限制下载队列 + 同时只有一个下载进行 + 开始全部下载 + 暂停全部下载 + 询问下载位置 + 每次下载将询问保存的位置 + 每次下载将询问保存的位置。 +\n如果要下载到外部SD卡,请选中。 \ No newline at end of file From 223ddaa9bfc1cd6fb548c5a4e1f86178055a91e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sat, 17 Aug 2019 02:39:43 +0000 Subject: [PATCH 28/46] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.8% (456 of 471 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 34 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index dfb221ee8..ee7dd9e95 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -105,7 +105,7 @@ Start Nytt mål Feilaktig nettadresse eller manglende internettilknytning - Velg ei tilgjengelig nedlastingsmappe + Velg nedlastingsmappe senere i innstillingene reCAPTCHA reCAPTCHA-oppgave Åpne i oppsprettsmodus @@ -143,7 +143,7 @@ Vis søkeforslag ved søk Søkehistorikk Lagre søkemønster lokalt - Historikk og mellomlagring + Visningshistorikk Lagre visningshistorikk Oppsprett Filter @@ -414,7 +414,7 @@ Programoppgraderingsmerknad Merknader for nye NewPipe-versjoner Ekstern lagring utilgjengelig - Nedlasting til eksternt SD-kort er ikke mulig enda. Tilbakestill plassering av nedlastingsmappe\? + Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\? Bruker forvalgte faner, feil under lagring av lagrede faner. Gjenopprett forvalg Ønsker du å gjenopprette alt til forvalgene\? @@ -462,8 +462,8 @@ Stopp Maksimalt antall forsøk Maksimalt antall tilkoblingsforsøk før nedlastingen avblåses - Pause ved veksling til mobildata - Nedlastinger som ikke kan pauses vil bli startet på nytt + Pause ved veksling til kvotebasert nett + Nyttig ved veksling til mobildata, selv om noen nedlastinger ikke kan settes på pause Vis kommentarer Skru av for å stoppe visning i kommentarer Spill av automatisk @@ -474,4 +474,28 @@ Ingen kommenterer Kunne ikke laste inn kommentarer Lukk + Venter + Gjenoppta avspilling + Fortsett der du slapp + Posisjon i lister + Vis avspillingsposisjonsindikator i lister + Tøm data + Avspillingsposisjon slettet + Fil flyttet eller slettet + En fil ved dette navnet finnes allerede + Kan ikke overskrive filen + Det finnes en ventende nedlasting ved dette navnet + NewPipe ble lukket under arbeid med filen + Ingen ledig plass på enheten + Framdrift gikk tapt, fordi filen ble slettet + Tilkoblingsavbrudd + Er du sikker\? + Begrens nedlastingskø + Én nedlasting av gangen + Start nedlastinger + Sett nedlastinger på pause + Spør om hvor ting skal lastes ned til + Du vil bli spurt om hvor hver nedlasting skal plasseres + Du vil bli spurt om hvor hver nedlasting skal plasseres. +\nSkru på dette valget hvis du vil laste ned til eksternt SD-kort. \ No newline at end of file From 942e042933bd5620ba47f58dafca51536da4900a Mon Sep 17 00:00:00 2001 From: jimbo1qaz Date: Sat, 17 Aug 2019 21:53:42 -0700 Subject: [PATCH 29/46] remove dead code --- .../org/schabi/newpipe/fragments/detail/VideoDetailFragment.java | 1 - 1 file changed, 1 deletion(-) 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 d0ed04279..d9d4e43bc 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 @@ -484,7 +484,6 @@ public class VideoDetailFragment videoDescriptionView.setMovementMethod(LinkMovementMethod.getInstance()); videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS); - //thumbsRootLayout = rootView.findViewById(R.id.detail_thumbs_root_layout); thumbsUpTextView = rootView.findViewById(R.id.detail_thumbs_up_count_view); thumbsUpImageView = rootView.findViewById(R.id.detail_thumbs_up_img_view); thumbsDownTextView = rootView.findViewById(R.id.detail_thumbs_down_count_view); From e4d0635ae1c7dd9120686cc9ff14625df825de3f Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Sun, 18 Aug 2019 17:31:39 +0000 Subject: [PATCH 30/46] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 31 +++++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 83eca913a..5ae8392a1 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -96,7 +96,7 @@ Arquivo já existe Threads URL inválida ou internet indisponível - Selecione uma pasta para download + Selecione uma pasta para download posteriormente nas configurações Nenhum player de stream encontrado. Deseja instalar o VLC? Não foi possível interpretar o site Áudio @@ -177,7 +177,7 @@ abrir em modo popup Continuar reproduzindo depois de interrupções (exemplo: ligações) Histórico de pesquisas Armazenar histórico de pesquisa localmente - Histórico & Cache + Histórico de visualização Armazenar histórico de vídeos assistidos Histórico Pesquisado @@ -416,7 +416,7 @@ abrir em modo popup Notificação de Atualização do Aplicativo Notificações para a versão do NewPipe Armazenamento externo indisponível - Baixar para o cartão SD externo ainda não é possivel. Resetar o local da pasta de download\? + Não é possivel baixar para o cartão SD externo . Resetar o local da pasta de download\? Usando abas padrão, erro ao ler abas salvas Restaurar padrões Deseja restaurar os padrões\? @@ -465,7 +465,7 @@ abrir em modo popup Tentativas máximas Número máximo de tentativas antes de cancelar o download Pausar quando trocar para dados móveis - Downloads que não puderem ser pausados serão reiniciados + Útil quando trocar para dados móveis, porém alguns downloads não podem ser suspensos Pendente Exibir comentários Desabilitar para parar de exibir comentários @@ -477,4 +477,27 @@ abrir em modo popup Não há comentários Não foi possível carregar comentários Fechar + Retomar a reprodução + Restaurar para a última posição da reprodução + Posições em listas + Mostrar indicadoers de posição da reprodução nas listas + Limpar dados + Posições da reprodução apagadas. + Arquivo movido ou apagado + Já existe um arquivo com este nome + não é possível sobrescrever o arquivo + Existe um download pendente com este nome + NewPipe foi fechado enquanto manipulava o arquivo + Não há espaço disponível no dispositivo + Progresso perdido devido ao arquivo ter sido apagado + Tempo limite de conexão + Tem certeza\? + Limitar tamanho da fila de download + Um download será executado ao mesmo tempo + Iniciar downloads + Pausar downloads + Perguntar onde salvar o arquivo do download + Você será questionado onde salvar o arquivo a cada download + Você será questionado onde salvar o arquivo a cada download +\nAtive esta opção caso queira fazer o download para um cartão de memória SD externo. \ No newline at end of file From dd276aabc1ad22e57e4db56ebe60f86cd8059b47 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sun, 18 Aug 2019 05:27:18 +0000 Subject: [PATCH 31/46] Translated using Weblate (English) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ddfd1d20..66044c69d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -293,7 +293,7 @@ Tap for details Please wait… Copied to clipboard - Please define an download folder later in settings + Please define a download folder later in settings This permission is needed to\nopen in popup mode 1 item deleted. From 9d573e1b1ddb70e247d183ff95edb98c12aa6ed0 Mon Sep 17 00:00:00 2001 From: naofum Date: Sun, 18 Aug 2019 13:34:13 +0000 Subject: [PATCH 32/46] Translated using Weblate (Japanese) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-ja/strings.xml | 38 ++++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f4e33d454..296e6e217 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -57,7 +57,6 @@ 動画のURLを復号できませんでした Webサイトを解析できませんでした コンテンツが利用できません - 保存メニューを設定できませんでした 生放送にはまだ対応していません コンテンツ @@ -100,7 +99,7 @@ タップして詳細を表示 お待ちください… クリップボードにコピーしました - ダウンロードフォルダを選択して下さい + 後ほど設定でダウンロードフォルダを定義してください ダウンロード ダウンロード 不具合報告 @@ -169,7 +168,7 @@ 新着 検索履歴 検索した履歴を記憶します - 再生履歴とキャッシュ + 視聴履歴 再生した履歴を記憶します オーディオフォーカス復帰で再開する 電話などによる中断の後、再生を再開します @@ -436,8 +435,8 @@ 同じ名前を持つダウンロードが既に進行中です エラーを表示する コード - ファイルを作成できません - 宛先フォルダを作成できません + 宛先のフォルダーを作成できません + ファイルを作成できません 権限がシステムによって拒否されました 安全な接続に失敗しました サーバが見つかりませんでした @@ -457,13 +456,13 @@ ジェスチャーを使用して、プレーヤーの明るさを制御します ファイルを削除しました アプリの更新通知 - まだ外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? + 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? デフォルトのタブを使用します。保存されたタブの読み込みエラーが発生しました メインページに表示されるタブ 新しいバージョンが利用可能なときにアプリの更新を確認する通知を表示します ダウンロードから %s の保留中の転送を続行します - モバイルデータ通信に切替時に、一時停止する - 一時停止できない場合は再開して継続されます + 従量制課金ネットワークの割り込み + モバイルデータ通信に切り替える場合に便利ですが、一部のダウンロードは一時停止できません コメントを表示 無効にするとコメントの表示を停止します 自動再生 @@ -474,4 +473,25 @@ コメントを読み込めませんでした 閉じる 接続タイムアウト - + 再生を再開 + 最後に再生した位置を復元します + リスト内の位置 + リストに再生位置インジケーターを表示します + データをクリア + 再生位置を削除しました。 + ファイルが移動または削除されました + ファイルを上書きできません + この名前の保留中のダウンロードがあります + ファイルの作業中に NewPipe が閉じられました + デバイスに空き容量がありません + ファイルが削除されたため、進行状況が失われました + よろしいですか\? + ダウンロード キューの制限 + 同時に1つのダウンロードが実行されます + ダウンロードの開始 + ダウンロードの一時停止 + ダウンロード先を尋ねる + ダウンロードのたびに保存する場所を尋ねます + ダウンロードのたびに保存する場所を尋ねます。 +\n外部 SD カードにダウンロードする場合は、このオプションをオンにしてください。 + \ No newline at end of file From e5207f8b42328c771a8cea5c87d0e2df843d989f Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 18 Aug 2019 15:32:36 +0000 Subject: [PATCH 33/46] Translated using Weblate (Portuguese) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-pt/strings.xml | 42 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 821b9d086..01ae04d5a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -27,7 +27,7 @@ Áudio Formato áudio padrão Descarregar - A seguir + Seguinte Mostrar vídeos \'Seguintes\' e \'Semelhantes\' URL não suportado Idioma padrão do conteúdo @@ -57,7 +57,6 @@ Incapaz de descodificar a assinatura do vídeo Incapaz de processar o site Conteúdo não disponível - Conteúdo Restringir conteúdo por idade Mostrar vídeo com restrição de idade. É possível permitir tal material nas Configurações. @@ -100,7 +99,7 @@ Toque para detalhes Por favor aguarde… Copiado para a área de transferência - Por favor selecione a pasta para as descargas + Por favor selecione nas configurações a pasta para as descargas OK Processos Descarga do NewPipe @@ -169,7 +168,7 @@ Novidades Histórico de pesquisa Guardar termos de pesquisa localmente - Histórico e cache + Ver história Guardar histórico de vídeos assistidos Retomar ao ganhar foco Continuar reprodução após interrupções (ex. chamadas) @@ -194,8 +193,8 @@ Sem vídeos - vídeo - vídeos + Vídeo + Vídeos Descarregar Caracteres permitidos em nomes de ficheiros @@ -414,7 +413,7 @@ Notificação de atualização Notificações para uma nova versão do NewPipe Armazenamento externo indisponível - Ainda não é possível descarrgar ao cartão SD. Repor localização da pasta de descargas\? + Não é possível descarregar ao cartão SD. Repor a localização da pasta de descargas\? Erro ao ler os separadores guardados e serão usados os separadores padrão Restaurar predefinições Deseja restaurar as predefinições\? @@ -461,8 +460,8 @@ Parar Tentativas máximas Número máximo de tentativas antes de cancelar a descarga - Pausa na comutação para dados móveis - Descarregamentos que não podem ser pausados serão reiniciados + Interromper em redes limitadas + Útil ao mudar para dados móveis, embora alguns descarregamentos não possam ser suspensos Eventos Conferências Pendente @@ -471,9 +470,32 @@ Reprodução automática Comentários - + Sem comentários Não foi possível carregar comentários Fechar + Continuar a reprodução + Restaurar a última posição de reprodução + Posições nas listas + Mostrar indicadores de posição de reprodução em listas + Limpar dados + Posições de reprodução apagadas. + Ficheiro movido ou apagado + Um ficheiro com este nome já existe + não é possível sobrescrever o ficheiro + Há um descarregamento pendente com este nome + NewPipe foi fechado enquanto trabalhava no ficheiro + Não há espaço disponível no aparelho + Progresso perdido, porque o fiheiro foi apagado + Tempo limite de conexão + Tem certeza\? + Limitar a fila de descarregamentos + Descarregar um só ao mesmo tempo + Iniciar descarregamentos + Pausa descarregamentos + Perguntar para onde descarregar + Você será perguntado para onde gravar cada descarregamento + Você será perguntado para onde gravar cada descarregamento. +\nAtive-o se pretender descarregar para um cartão SD externo. \ No newline at end of file From 96802c7b5c4f1742e5faa3f580364a7d0d6b6a9b Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sun, 18 Aug 2019 05:23:53 +0000 Subject: [PATCH 34/46] Translated using Weblate (Hebrew) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-he/strings.xml | 48 +++++++++++++++++++------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 07fc6ab6f..aed3fda64 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -52,7 +52,7 @@ הצעות חיפוש הצגת הצעות בעת החיפוש הורדה - הבא בתור + הבא להציג סרטונים דומים ובאים בתור כתובת לא נתמכת שפת התוכן המועדפת @@ -108,7 +108,7 @@ מה חדש היסטוריית חיפוש שמירת שאילתות החיפוש מקומית - היסטוריה ומטמון + היסטוריית צפייה תיעוד הסרטונים שנצפו להמשיך את הניגון עם החזרת המיקוד להמשיך לנגן לאחר הפרעות (למשל: שיחות טלפון) @@ -168,9 +168,9 @@ אין סרטונים סרטון - שני סרטונים - %s סרטונים - %s סרטונים + סרטונים + סרטונים + סרטונים התחלה השהיה @@ -189,7 +189,7 @@ יש לגעת לפרטים נוספים נא להמתין… הועתק ללוח - נא לבחור תיקיית הורדה זמינה + נא לציין תיקיית הורדה בהגדרות בהמשך הרשאה זו נדרשת לטובת \nפתיחה בחלון צף reCAPTCHA @@ -407,7 +407,7 @@ התראת עדכון יישומון התראות על גרסה חדשה של NewPipe האחסון החיצוני אינו זמין - אין עדיין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה\? + אין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה\? נעשה שימוש בלשוניות בררת המחדל, אירעה שגיאה בעת קריאת הלשוניות שנשמרו שחזור בררות מחדל לשחזר את בררות המחדל\? @@ -469,18 +469,42 @@ עצירה מספר הניסיונות החוזרים המרבי מספר הניסיונות החוזרים המרבי בטרם ביטול ההורדה - להשהות בעת מעבר לתקשורת נתונים סלולרית - הורדות שלא ניתן להשהות יופעלו מחדש + לייצר הפרעה ברשתות מדודות + שימושי בעת מעבר לחיבור רשת סלולרית, למרות שישנן הורדות שלא ניתן להשהות הצגת תגובות יש להשבית כדי להפסיק הצגת תגובות ניגון אוטומטי תגובות - - - + + + אין תגובות לא ניתן לטעון תגובות סגירה + בהמתנה + להמשיך בנגינה + לשחזר את מיקום הנגינה האחרון + מיקומים ברשימות + להציג מחווני מיקומי נגינה ברשימות + לנקות את הנתונים + מיקומי הנגינה נמחקו. + הקובץ הועבר או נמחק + כבר קיים קובץ בשם הזה + לא ניתן לשכתב על הקובץ + כבר יש הורדה ממתינה בשם הזה + NewPipe נסגר בזמן העבודה על הקובץ + לא נשאר מקום במכשיר + התהליך אבד כיוון שהקובץ נמחק + החיבור המתין זמן רב מדי + בוודאות\? + הגבלת תור ההורדה + רק הורדה אחת תרוץ בו־זמנית + התחלת הורדות + השהיית הורדות + לשאול לאן להוריד + תופיע שאלה לאן לשמור כל הורדה + תוצג שאלה היכן לשמור כל הורדה. +\nיש להפעיל זאת אם ברצונך להוריד לכרטיס SD חיצוני. \ No newline at end of file From 85632b24fc5f0b4f024e633f663dee1360b0494d Mon Sep 17 00:00:00 2001 From: Westminboy Date: Sun, 18 Aug 2019 05:10:35 +0000 Subject: [PATCH 35/46] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-cmn/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index dafa9e22c..64410a591 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -254,7 +254,7 @@ 没有视频 - 视频 + 部视频 删除 @@ -472,7 +472,7 @@ 自动播放 评论 - + 没有评论 无法加载评论 From 8885b45259c68e348f0e815e912e38714c515625 Mon Sep 17 00:00:00 2001 From: Xiang Xu Date: Sun, 18 Aug 2019 05:43:14 +0000 Subject: [PATCH 36/46] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (471 of 471 strings) --- app/src/main/res/values-cmn/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index 64410a591..d402bbd84 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -266,7 +266,7 @@ 错误的网址或网络不可用 点按以查看详细信息 复制到剪贴板 - 请稍后在设置中定义下载文件夹 + 请稍后在设置中定义一个下载文件夹 在悬浮窗模式打开 \n需要此权限 已删除一个项目。 @@ -463,10 +463,10 @@ 切换视图 NewPipe 更新可用! 无法创建目标文件夹 - 服务器不接受多线程下载, 请重试使用 @string/msg_threads = 1 + 服务器不接受多线程下载, 请使用 @string/msg_threads = 1重试 请求范围无法满足 继续进行%s个待下载转移 - 无法暂停的下载将重新开始。 + 切换至移动数据时有用,尽管一些下载无法被暂停 显示评论 禁用停止显示评论 自动播放 From c4f08d541d00bf2229ddfc08a6fa63136a5de1fc Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 18 Aug 2019 11:33:49 +0200 Subject: [PATCH 37/46] Add changelog for 0.17.1 (760) --- .../metadata/android/en-US/changelogs/760.txt | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/760.txt diff --git a/fastlane/metadata/android/en-US/changelogs/760.txt b/fastlane/metadata/android/en-US/changelogs/760.txt new file mode 100644 index 000000000..66858f3ad --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/760.txt @@ -0,0 +1,44 @@ +Changes in 0.17.1 + +New +• Thai localization + + +Improved +• Add start playing here action in long-press menus for playlists again #2518 +• Add switch for SAF / legacy file picker #2521 + +Fixed +• Fix disappearing buttons in downloads view when switching apps #2487 +• Fix playback position is stored although watch history is disabled +• Fix reduced performance caused by playback position in list views #2517 +• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 + + + +Changes in 0.17.0 + +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 + From e6bcb4628a476a8b180ae8fc7e72b44cee0b5634 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 18 Aug 2019 15:53:56 +0200 Subject: [PATCH 38/46] Fix Portuguese minimize_on_exit_summary Fix #2522 --- app/src/main/res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 01ae04d5a..c0da2af66 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -397,7 +397,7 @@ Ilimitado Limitar resolução se estiver a usar dados móveis Minimizar ao trocar de aplicação - Ação a executar ao trocar para outra aplicação a partir do menu principal - % s + Ação a executar ao trocar para outra aplicação a partir do menu principal - %s Nenhuma Ativar o reprodutor em segundo plano Ativar o reprodutor \'popup\' From acea26717cd5ca4b9e6319d551f09e91f2d2cabc Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Sun, 18 Aug 2019 17:03:49 +0200 Subject: [PATCH 39/46] Fix another %s in translation --- app/src/main/res/values-cs/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7d9a03c08..19e662ee7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -449,7 +449,7 @@ otevření ve vyskakovacím okně Akce odmítnuta systémem Stahování se nezdařilo Stahování dokončeno - % s stahování dokončeno + %s stahování dokončeno Vytvořit jedinečný název Přepsat Stažený soubor s tímto názvem již existuje @@ -487,4 +487,4 @@ otevření ve vyskakovacím okně Nelze načíst komentáře Zavřít Stahování na externí SD kartu ještě není možné. Resetovat umístění složky pro stahování\? - \ No newline at end of file + From 7ba71e3b3717923124af9132225dc90a0e49c3d1 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 22 Aug 2019 11:39:32 +0200 Subject: [PATCH 40/46] use newerextractor --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c70d583b2..00970ecf1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.teamnewpipe:NewPipeExtractor:430da57350c587828' + implementation 'com.github.teamnewpipe:NewPipeExtractor:cfc72d8dc9d' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From 7cd5af5e72f4ab2faf72f41deaa94694aa319357 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 22 Aug 2019 21:49:33 +0200 Subject: [PATCH 41/46] Add option in history settings to delete playback positions --- .../settings/HistorySettingsFragment.java | 31 ++++++++++++++++++- app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 5 ++- app/src/main/res/xml/history_settings.xml | 6 ++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java index cf5425a50..8ff86af05 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java @@ -19,6 +19,7 @@ import io.reactivex.disposables.Disposable; public class HistorySettingsFragment extends BasePreferenceFragment { private String cacheWipeKey; private String viewsHistoryClearKey; + private String playbackStatesClearKey; private String searchHistoryClearKey; private HistoryRecordManager recordManager; private CompositeDisposable disposables; @@ -28,6 +29,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment { super.onCreate(savedInstanceState); cacheWipeKey = getString(R.string.metadata_cache_wipe_key); viewsHistoryClearKey = getString(R.string.clear_views_history_key); + playbackStatesClearKey = getString(R.string.clear_playback_states_key); searchHistoryClearKey = getString(R.string.clear_search_history_key); recordManager = new HistoryRecordManager(getActivity()); disposables = new CompositeDisposable(); @@ -63,7 +65,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment { ErrorActivity.ErrorInfo.make( UserAction.DELETE_FROM_HISTORY, "none", - "Delete view history", + "Delete playback states", R.string.general_error))); final Disposable onDelete = recordManager.deleteWholeStreamHistory() @@ -101,6 +103,33 @@ public class HistorySettingsFragment extends BasePreferenceFragment { .show(); } + if (preference.getKey().equals(playbackStatesClearKey)) { + new AlertDialog.Builder(getActivity()) + .setTitle(R.string.delete_playback_states_alert) + .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss())) + .setPositiveButton(R.string.delete, ((dialog, which) -> { + + final Disposable onDeletePlaybackStates = recordManager.deleteCompelteStreamStateHistory() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + howManyDeleted -> Toast.makeText(getActivity(), + R.string.watch_history_states_deleted, + Toast.LENGTH_SHORT).show(), + throwable -> ErrorActivity.reportError(getContext(), + throwable, + SettingsActivity.class, null, + ErrorActivity.ErrorInfo.make( + UserAction.DELETE_FROM_HISTORY, + "none", + "Delete playback states", + R.string.general_error))); + + disposables.add(onDeletePlaybackStates); + })) + .create() + .show(); + } + if (preference.getKey().equals(searchHistoryClearKey)) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.delete_search_history_alert) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 6c51fbb1c..e3a96f3f5 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -160,6 +160,7 @@ cache_wipe_key clear_play_history + clear_playback_states clear_search_history downloads_storage_ask diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd7a440bb..1025b504b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -171,9 +171,12 @@ Overrides your current history and subscriptions Export history, subscriptions and playlists Clear watch history - Deletes the history of played streams + Deletes the history of played streams and the playback positions Delete entire watch history? Watch history deleted. + Delete playback positions + Deletes all playback positions + Delete all playback positions? Playback positions deleted. Clear search history Deletes history of search keywords diff --git a/app/src/main/res/xml/history_settings.xml b/app/src/main/res/xml/history_settings.xml index cae2d56c0..81dc195f3 100644 --- a/app/src/main/res/xml/history_settings.xml +++ b/app/src/main/res/xml/history_settings.xml @@ -51,6 +51,12 @@ android:title="@string/clear_views_history_title" app:iconSpaceReserved="false" /> + + Date: Thu, 22 Aug 2019 21:51:50 +0200 Subject: [PATCH 42/46] Make export_data and import_data settings keys untranslatable --- app/src/main/res/values/settings_keys.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index e3a96f3f5..fc7abf678 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -153,8 +153,8 @@ enable_playback_resume enable_playback_state_lists - import_data - export_data + import_data + export_data download_thumbnail_key From 7f127ba52a192d383a28f6576517c54e8146740a Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sun, 1 Sep 2019 17:35:42 -0300 Subject: [PATCH 43/46] show hidden directories in the file picker --- .../org/schabi/newpipe/util/FilePickerActivityHelper.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java b/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java index 8e70e4f8d..82e74adec 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java @@ -115,6 +115,12 @@ public class FilePickerActivityHelper extends com.nononsenseapps.filepicker.File super.onClickOk(view); } + @Override + protected boolean isItemVisible(File file) { + if (file.isDirectory() && file.isHidden()) return true; + return super.isItemVisible(file); + } + public File getBackTop() { if (getArguments() == null) return Environment.getExternalStorageDirectory(); From 6fa72e4a52acfec04e6cd643c4f5390e6cfb0f31 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sun, 1 Sep 2019 18:07:14 -0300 Subject: [PATCH 44/46] add @NotNull --- .../java/org/schabi/newpipe/util/FilePickerActivityHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java b/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java index 82e74adec..d56913648 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java @@ -116,7 +116,7 @@ public class FilePickerActivityHelper extends com.nononsenseapps.filepicker.File } @Override - protected boolean isItemVisible(File file) { + protected boolean isItemVisible(@NonNull File file) { if (file.isDirectory() && file.isHidden()) return true; return super.isItemVisible(file); } From 1a643126de5f07bc71a0a0dd4d9be36b9f64524f Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sun, 1 Sep 2019 18:17:54 -0300 Subject: [PATCH 45/46] Changes for Android 9 (Pie) * validate the stored file before start the mission * add warning on StoredFileHelper.java * simplify the communication between MissionAdapter and DownloadManagerService.java since shares the same looper * simplify setVisible() "start/pause all downloads" buttons logic --- .../us/shandian/giga/get/DownloadMission.java | 20 +++--- .../us/shandian/giga/io/StoredFileHelper.java | 1 + .../giga/service/DownloadManager.java | 4 +- .../giga/service/DownloadManagerService.java | 31 ++++----- .../giga/ui/adapter/MissionAdapter.java | 69 +++++++++---------- .../giga/ui/fragment/MissionsFragment.java | 10 ++- 6 files changed, 66 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/get/DownloadMission.java b/app/src/main/java/us/shandian/giga/get/DownloadMission.java index eb96d53f4..57cd15e8c 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMission.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMission.java @@ -1,7 +1,6 @@ package us.shandian.giga.get; import android.os.Handler; -import android.os.Message; import android.util.Log; import org.schabi.newpipe.Downloader; @@ -264,11 +263,7 @@ public class DownloadMission extends Mission { private void notify(int what) { - Message m = new Message(); - m.what = what; - m.obj = this; - - mHandler.sendMessage(m); + mHandler.obtainMessage(what, this).sendToTarget(); } synchronized void notifyProgress(long deltaLen) { @@ -408,6 +403,7 @@ public class DownloadMission extends Mission { } } + /** * Start downloading with multiple threads. */ @@ -416,14 +412,20 @@ public class DownloadMission extends Mission { // ensure that the previous state is completely paused. joinForThread(init); - if (threads != null) + if (threads != null) { for (Thread thread : threads) joinForThread(thread); + threads = null; + } running = true; errCode = ERROR_NOTHING; + if (hasInvalidStorage()) { + notifyError(ERROR_FILE_CREATION, null); + return; + } + if (current >= urls.length) { - threads = null; runAsync(1, this::notifyFinished); return; } @@ -664,7 +666,7 @@ public class DownloadMission extends Mission { * @return {@code true} is this mission its "healthy", otherwise, {@code false} */ public boolean isCorrupt() { - return (isPsFailed() || errCode == ERROR_POSTPROCESSING_HOLD) || isFinished() || hasInvalidStorage(); + return (isPsFailed() || errCode == ERROR_POSTPROCESSING_HOLD) || isFinished(); } private boolean doPostprocessing() { diff --git a/app/src/main/java/us/shandian/giga/io/StoredFileHelper.java b/app/src/main/java/us/shandian/giga/io/StoredFileHelper.java index f90a756a9..93394fb60 100644 --- a/app/src/main/java/us/shandian/giga/io/StoredFileHelper.java +++ b/app/src/main/java/us/shandian/giga/io/StoredFileHelper.java @@ -251,6 +251,7 @@ public class StoredFileHelper implements Serializable { public boolean existsAsFile() { if (source == null) return false; + // WARNING: DocumentFile.exists() and DocumentFile.isFile() methods are slow boolean exists = docFile == null ? ioFile.exists() : docFile.exists(); boolean isFile = docFile == null ? ioFile.isFile() : docFile.isFile();// ¿docFile.isVirtual() means is no-physical? diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java index beb5e6dc9..d4f60abcd 100644 --- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java @@ -424,10 +424,12 @@ public class DownloadManager { boolean flag = false; for (DownloadMission mission : mMissionsPending) { - if (mission.running || !mission.enqueued || mission.isFinished() || mission.hasInvalidStorage()) + if (mission.running || !mission.enqueued || mission.isFinished()) continue; resumeMission(mission); + if (mission.errCode != DownloadMission.ERROR_NOTHING) continue; + if (mPrefQueueLimit) return true; flag = true; } diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index 065e21b9d..4463c6825 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.ConnectivityManager; @@ -19,6 +20,7 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Handler; +import android.os.Handler.Callback; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -88,14 +90,14 @@ public class DownloadManagerService extends Service { private Builder downloadDoneNotification = null; private StringBuilder downloadDoneList = null; - private final ArrayList mEchoObservers = new ArrayList<>(1); + private final ArrayList mEchoObservers = new ArrayList<>(1); private ConnectivityManager mConnectivityManager; private BroadcastReceiver mNetworkStateListener = null; private ConnectivityManager.NetworkCallback mNetworkStateListenerL = null; private SharedPreferences mPrefs = null; - private final SharedPreferences.OnSharedPreferenceChangeListener mPrefChangeListener = this::handlePreferenceChange; + private final OnSharedPreferenceChangeListener mPrefChangeListener = this::handlePreferenceChange; private boolean mLockAcquired = false; private LockManager mLock = null; @@ -128,12 +130,7 @@ public class DownloadManagerService extends Service { } mBinder = new DownloadManagerBinder(); - mHandler = new Handler(Looper.myLooper()) { - @Override - public void handleMessage(Message msg) { - DownloadManagerService.this.handleMessage(msg); - } - }; + mHandler = new Handler(this::handleMessage); mPrefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -272,7 +269,7 @@ public class DownloadManagerService extends Service { return mBinder; } - public void handleMessage(Message msg) { + private boolean handleMessage(@NonNull Message msg) { DownloadMission mission = (DownloadMission) msg.obj; switch (msg.what) { @@ -300,14 +297,12 @@ public class DownloadManagerService extends Service { mFailedDownloads.delete(mFailedDownloads.indexOfValue(mission)); synchronized (mEchoObservers) { - for (Handler handler : mEchoObservers) { - Message echo = new Message(); - echo.what = msg.what; - echo.obj = msg.obj; - - handler.sendMessage(echo); + for (Callback observer : mEchoObservers) { + observer.handleMessage(msg); } } + + return true; } private void handleConnectivityState(boolean updateOnly) { @@ -515,7 +510,7 @@ public class DownloadManagerService extends Service { return PendingIntent.getService(this, intent.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT); } - private void manageObservers(Handler handler, boolean add) { + private void manageObservers(Callback handler, boolean add) { synchronized (mEchoObservers) { if (add) { mEchoObservers.add(handler); @@ -596,11 +591,11 @@ public class DownloadManagerService extends Service { ); } - public void addMissionEventListener(Handler handler) { + public void addMissionEventListener(Callback handler) { manageObservers(handler, true); } - public void removeMissionEventListener(Handler handler) { + public void removeMissionEventListener(Callback handler) { manageObservers(handler, false); } diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index e53ab4f1f..62d209ee1 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -9,7 +9,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; -import android.os.Looper; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -77,7 +76,7 @@ import static us.shandian.giga.get.DownloadMission.ERROR_TIMEOUT; import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION; import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST; -public class MissionAdapter extends Adapter { +public class MissionAdapter extends Adapter implements Handler.Callback { private static final SparseArray ALGORITHMS = new SparseArray<>(); private static final String TAG = "MissionAdapter"; private static final String UNDEFINED_PROGRESS = "--.-%"; @@ -111,21 +110,7 @@ public class MissionAdapter extends Adapter { mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mLayout = R.layout.mission_item; - mHandler = new Handler(Looper.myLooper()) { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case DownloadManagerService.MESSAGE_PROGRESS: - case DownloadManagerService.MESSAGE_ERROR: - case DownloadManagerService.MESSAGE_FINISHED: - onServiceMessage(msg); - break; - } - - if (mStartButton != null && mPauseButton != null) - checkMasterButtonsVisibility(); - } - }; + mHandler = new Handler(context.getMainLooper()); mEmptyMessage = emptyMessage; @@ -403,29 +388,40 @@ public class MissionAdapter extends Adapter { return true; } - public Handler getMessenger() { - return mHandler; - } - - private void onServiceMessage(@NonNull Message msg) { - if (msg.what == DownloadManagerService.MESSAGE_PROGRESS) { - setAutoRefresh(true); - return; + @Override + public boolean handleMessage(@NonNull Message msg) { + if (mStartButton != null && mPauseButton != null) { + checkMasterButtonsVisibility(); } - for (int i = 0; i < mPendingDownloadsItems.size(); i++) { - ViewHolderItem h = mPendingDownloadsItems.get(i); + switch (msg.what) { + case DownloadManagerService.MESSAGE_PROGRESS: + case DownloadManagerService.MESSAGE_ERROR: + case DownloadManagerService.MESSAGE_FINISHED: + break; + default: + return false; + } + + if (msg.what == DownloadManagerService.MESSAGE_PROGRESS) { + setAutoRefresh(true); + return true; + } + + for (ViewHolderItem h : mPendingDownloadsItems) { if (h.item.mission != msg.obj) continue; if (msg.what == DownloadManagerService.MESSAGE_FINISHED) { // DownloadManager should mark the download as finished applyChanges(); - return; + return true; } updateProgress(h); - return; + return true; } + + return false; } private void showError(@NonNull DownloadMission mission) { @@ -563,16 +559,15 @@ public class MissionAdapter extends Adapter { updateProgress(h); return true; case R.id.retry: - if (mission.hasInvalidStorage()) { + if (mission.isPsRunning()) { + mission.psContinue(true); + } else { mDownloadManager.tryRecover(mission); if (mission.storage.isInvalid()) mRecover.tryRecover(mission); else recoverMission(mission); - - return true; } - mission.psContinue(true); return true; case R.id.cancel: mission.psContinue(false); @@ -659,9 +654,13 @@ public class MissionAdapter extends Adapter { public void checkMasterButtonsVisibility() { boolean[] state = mIterator.hasValidPendingMissions(); + setButtonVisible(mPauseButton, state[0]); + setButtonVisible(mStartButton, state[1]); + } - mPauseButton.setVisible(state[0]); - mStartButton.setVisible(state[1]); + private static void setButtonVisible(MenuItem button, boolean visible) { + if (button.isVisible() != visible) + button.setVisible(visible); } public void ensurePausedMissions() { diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 2b2c09750..0ce245828 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -79,7 +79,7 @@ public class MissionsFragment extends Fragment { setAdapterButtons(); - mBinder.addMissionEventListener(mAdapter.getMessenger()); + mBinder.addMissionEventListener(mAdapter); mBinder.enableNotifications(false); updateList(); @@ -159,7 +159,7 @@ public class MissionsFragment extends Fragment { super.onDestroy(); if (mBinder == null || mAdapter == null) return; - mBinder.removeMissionEventListener(mAdapter.getMessenger()); + mBinder.removeMissionEventListener(mAdapter); mBinder.enableNotifications(true); mContext.unbindService(mConnection); mAdapter.deleterDispose(true); @@ -197,12 +197,10 @@ public class MissionsFragment extends Fragment { return true; case R.id.start_downloads: item.setVisible(false); - mPause.setVisible(true); mBinder.getDownloadManager().startAllMissions(); return true; case R.id.pause_downloads: item.setVisible(false); - mStart.setVisible(true); mBinder.getDownloadManager().pauseAllMissions(false); mAdapter.ensurePausedMissions();// update items view default: @@ -280,7 +278,7 @@ public class MissionsFragment extends Fragment { if (mAdapter != null) { mAdapter.deleterDispose(false); mForceUpdate = true; - mBinder.removeMissionEventListener(mAdapter.getMessenger()); + mBinder.removeMissionEventListener(mAdapter); } } @@ -296,7 +294,7 @@ public class MissionsFragment extends Fragment { mAdapter.forceUpdate(); } - mBinder.addMissionEventListener(mAdapter.getMessenger()); + mBinder.addMissionEventListener(mAdapter); mAdapter.checkMasterButtonsVisibility(); } if (mBinder != null) mBinder.enableNotifications(false); From a446313119b177bc7a6ba488f5186f58695fe444 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sun, 1 Sep 2019 18:49:45 -0300 Subject: [PATCH 46/46] add warning after toggle the SAF option --- .../schabi/newpipe/settings/DownloadSettingsFragment.java | 8 +++++++- app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index 7c2cb46e9..e161c8aa5 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -12,6 +12,7 @@ import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.v7.preference.Preference; import android.util.Log; +import android.widget.Toast; import com.nononsenseapps.filepicker.Utils; @@ -34,6 +35,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { private String DOWNLOAD_PATH_VIDEO_PREFERENCE; private String DOWNLOAD_PATH_AUDIO_PREFERENCE; + private String STORAGE_USE_SAF_PREFERENCE; private Preference prefPathVideo; private Preference prefPathAudio; @@ -47,6 +49,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { DOWNLOAD_PATH_VIDEO_PREFERENCE = getString(R.string.download_path_video_key); DOWNLOAD_PATH_AUDIO_PREFERENCE = getString(R.string.download_path_audio_key); + STORAGE_USE_SAF_PREFERENCE = getString(R.string.storage_use_saf); final String downloadStorageAsk = getString(R.string.downloads_storage_ask); prefPathVideo = findPreference(DOWNLOAD_PATH_VIDEO_PREFERENCE); @@ -169,7 +172,10 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { String key = preference.getKey(); int request; - if (key.equals(DOWNLOAD_PATH_VIDEO_PREFERENCE)) { + if (key.equals(STORAGE_USE_SAF_PREFERENCE)) { + Toast.makeText(getContext(), R.string.download_choose_new_path, Toast.LENGTH_LONG).show(); + return true; + } else if (key.equals(DOWNLOAD_PATH_VIDEO_PREFERENCE)) { request = REQUEST_DOWNLOAD_VIDEO_PATH; } else if (key.equals(DOWNLOAD_PATH_AUDIO_PREFERENCE)) { request = REQUEST_DOWNLOAD_AUDIO_PATH; diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 028f146fc..e2e002d73 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,6 +17,7 @@ Carpeta de descarga de vídeo Ruta para almacenar los vídeos descargados Introducir directorio de descargas para vídeos + Cambie las carpetas de descarga para que tenga efecto Resolución por defecto de vídeo Reproducir con Kodi Aplicación Kore no encontrada. ¿Instalarla? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1025b504b..d9ad3f5c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,6 +47,7 @@ Audio download folder Downloaded audio is stored here Enter download path for audio files + Change the download folders to take effect Autoplay Plays a video when NewPipe is called from another app Default resolution