From 0b11afaf2fddff26de7927605994dea1c4be5b87 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Mon, 8 Aug 2022 19:32:21 -0400 Subject: [PATCH 01/31] Update Gradle to 7.5.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 6 ++++++ gradlew.bat | 14 ++++++++------ 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a4d4fb3f96a785543079b8df6723c946b..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 10197 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4ed3bdea443..5116c5b1869 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip -distributionSha256Sum=e6d864e3b5bc05cc62041842b306383fc1fefcec359e70cebb1d470a6094ca82 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787337f..a69d9cb6c20 100755 --- a/gradlew +++ b/gradlew @@ -205,6 +205,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f9382..53a6b238d41 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 7f21f6e80e7b452d0a37797538da14bd80d3fcc6 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Tue, 9 Aug 2022 19:19:03 -0400 Subject: [PATCH 02/31] Update AGP and clojars Maven URL --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 322a47a6f8e..739f2e61810 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.2.1' + classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -20,6 +20,6 @@ allprojects { google() mavenCentral() maven { url "https://jitpack.io" } - maven { url "https://clojars.org/repo" } + maven { url "https://repo.clojars.org" } } } From 2de33d8d075d17eb9885dd2c1302c80aa42a14c9 Mon Sep 17 00:00:00 2001 From: mhmdanas Date: Thu, 11 Aug 2022 19:24:14 +0300 Subject: [PATCH 03/31] Clarify that span shouldn't be in translated READMEs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3a34816d59..52e6eef1a96 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ Also, since they are free and open source software, neither the app nor the Extr * Open in Kodi * Watch/Block age-restricted material - + ## Installation and updates From 737a331c85ba8387535c14e5882f46c336cf8061 Mon Sep 17 00:00:00 2001 From: mhmdanas Date: Thu, 11 Aug 2022 19:34:23 +0300 Subject: [PATCH 04/31] Remove extra whitespace from issue and PR templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 6 +++--- .github/ISSUE_TEMPLATE/feature_request.yml | 3 +-- .github/ISSUE_TEMPLATE/question.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3abb1fbb1f8..37ce61376d7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -40,7 +40,7 @@ body: label: Steps to reproduce the bug description: | What did you do for the bug to show up? - + If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug. placeholder: | 1. Go to '...' @@ -69,11 +69,11 @@ body: label: Screenshots/Screen recordings description: | A picture or video is worth a thousand words. - + If applicable, add screenshots or a screen recording to help explain your problem. GitHub supports uploading them directly in the text box. If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead. - + :heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE. Instead, follow the instructions in the "Logs" section below. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 9fc3c1632ea..7290d8c5be6 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -8,7 +8,6 @@ body: Thank you for helping to make NewPipe better by suggesting a feature. :hugs: Your ideas are highly welcome! The app is made for you, the users, after all. - - type: checkboxes id: checklist attributes: @@ -43,7 +42,7 @@ body: Describe any problem or limitation you come across while using the app which would be solved by this feature. validations: required: true - + - type: textarea id: additional-information attributes: diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml index 8cf22d8af3b..f78e2afc671 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -27,7 +27,7 @@ body: label: What is/are your question(s)? validations: required: true - + - type: textarea id: additional-information attributes: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 10e40af2acb..abc1665eb8c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,7 +25,7 @@ - -#### APK testing +#### APK testing The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR. From 4f6b5b3b89879a53039a868c2007bcbdbb3972f8 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 31 Jul 2022 15:27:29 +0530 Subject: [PATCH 05/31] Use ListAdapter in PeertubeInstanceListFragment. --- .../PeertubeInstanceListFragment.java | 194 ++++++++---------- 1 file changed, 88 insertions(+), 106 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java index 92b9a036267..1158b3d8307 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java @@ -12,28 +12,27 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.ProgressBar; import android.widget.RadioButton; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.AppCompatImageView; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.grack.nanojson.JsonStringWriter; import com.grack.nanojson.JsonWriter; import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.DialogEditTextBinding; +import org.schabi.newpipe.databinding.FragmentInstanceListBinding; +import org.schabi.newpipe.databinding.ItemInstanceBinding; import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.PeertubeHelper; @@ -41,7 +40,6 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.List; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; @@ -50,12 +48,11 @@ import io.reactivex.rxjava3.schedulers.Schedulers; public class PeertubeInstanceListFragment extends Fragment { - private final List instanceList = new ArrayList<>(); private PeertubeInstance selectedInstance; private String savedInstanceListKey; private InstanceListAdapter instanceListAdapter; - private ProgressBar progressBar; + private FragmentInstanceListBinding binding; private SharedPreferences sharedPreferences; private CompositeDisposable disposables = new CompositeDisposable(); @@ -71,7 +68,6 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()); savedInstanceListKey = getString(R.string.peertube_instance_list_key); selectedInstance = PeertubeHelper.getCurrentInstance(); - updateInstanceList(); setHasOptionsMenu(true); } @@ -79,7 +75,8 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { @Override public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_instance_list, container, false); + binding = FragmentInstanceListBinding.inflate(inflater, container, false); + return binding.getRoot(); } @Override @@ -87,26 +84,17 @@ public void onViewCreated(@NonNull final View rootView, @Nullable final Bundle savedInstanceState) { super.onViewCreated(rootView, savedInstanceState); - initViews(rootView); - } - - private void initViews(@NonNull final View rootView) { - final TextView instanceHelpTV = rootView.findViewById(R.id.instanceHelpTV); - instanceHelpTV.setText(getString(R.string.peertube_instance_url_help, + binding.instanceHelpTV.setText(getString(R.string.peertube_instance_url_help, getString(R.string.peertube_instance_list_url))); - - initButton(rootView); - - final RecyclerView listInstances = rootView.findViewById(R.id.instances); - listInstances.setLayoutManager(new LinearLayoutManager(requireContext())); + binding.addInstanceButton.setOnClickListener(v -> showAddItemDialog(requireContext())); + binding.instances.setLayoutManager(new LinearLayoutManager(requireContext())); final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(getItemTouchCallback()); - itemTouchHelper.attachToRecyclerView(listInstances); + itemTouchHelper.attachToRecyclerView(binding.instances); instanceListAdapter = new InstanceListAdapter(requireContext(), itemTouchHelper); - listInstances.setAdapter(instanceListAdapter); - - progressBar = rootView.findViewById(R.id.loading_progress_bar); + binding.instances.setAdapter(instanceListAdapter); + instanceListAdapter.submitList(PeertubeHelper.getInstanceList(requireContext())); } @Override @@ -131,6 +119,12 @@ public void onDestroy() { disposables = null; } + @Override + public void onDestroyView() { + binding = null; + super.onDestroyView(); + } + /*////////////////////////////////////////////////////////////////////////// // Menu //////////////////////////////////////////////////////////////////////////*/ @@ -156,11 +150,6 @@ public boolean onOptionsItemSelected(final MenuItem item) { // Utils //////////////////////////////////////////////////////////////////////////*/ - private void updateInstanceList() { - instanceList.clear(); - instanceList.addAll(PeertubeHelper.getInstanceList(requireContext())); - } - private void selectInstance(final PeertubeInstance instance) { selectedInstance = PeertubeHelper.selectInstance(instance, requireContext()); sharedPreferences.edit().putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, true).apply(); @@ -168,7 +157,7 @@ private void selectInstance(final PeertubeInstance instance) { private void saveChanges() { final JsonStringWriter jsonWriter = JsonWriter.string().object().array("instances"); - for (final PeertubeInstance instance : instanceList) { + for (final PeertubeInstance instance : instanceListAdapter.getCurrentList()) { jsonWriter.object(); jsonWriter.value("name", instance.getName()); jsonWriter.value("url", instance.getUrl()); @@ -179,28 +168,21 @@ private void saveChanges() { } private void restoreDefaults() { - new AlertDialog.Builder(requireContext()) + final Context context = requireContext(); + new AlertDialog.Builder(context) .setTitle(R.string.restore_defaults) .setMessage(R.string.restore_defaults_confirmation) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.ok, (dialog, which) -> { sharedPreferences.edit().remove(savedInstanceListKey).apply(); selectInstance(PeertubeInstance.DEFAULT_INSTANCE); - updateInstanceList(); - instanceListAdapter.notifyDataSetChanged(); + instanceListAdapter.submitList(PeertubeHelper.getInstanceList(context)); }) .show(); } - private void initButton(final View rootView) { - final FloatingActionButton fab = rootView.findViewById(R.id.addInstanceButton); - fab.setOnClickListener(v -> - showAddItemDialog(requireContext())); - } - private void showAddItemDialog(final Context c) { - final DialogEditTextBinding dialogBinding = - DialogEditTextBinding.inflate(getLayoutInflater()); + final var dialogBinding = DialogEditTextBinding.inflate(getLayoutInflater()); dialogBinding.dialogEditText.setInputType( InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI); dialogBinding.dialogEditText.setHint(R.string.peertube_instance_add_help); @@ -222,17 +204,17 @@ private void addInstance(final String url) { if (cleanUrl == null) { return; } - progressBar.setVisibility(View.VISIBLE); + binding.loadingProgressBar.setVisibility(View.VISIBLE); final Disposable disposable = Single.fromCallable(() -> { final PeertubeInstance instance = new PeertubeInstance(cleanUrl); instance.fetchInstanceMetaData(); return instance; }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe((instance) -> { - progressBar.setVisibility(View.GONE); + binding.loadingProgressBar.setVisibility(View.GONE); add(instance); }, e -> { - progressBar.setVisibility(View.GONE); + binding.loadingProgressBar.setVisibility(View.GONE); Toast.makeText(getActivity(), R.string.peertube_instance_add_fail, Toast.LENGTH_SHORT).show(); }); @@ -255,7 +237,7 @@ private String cleanUrl(final String url) { return null; } // only allow if not already exists - for (final PeertubeInstance instance : instanceList) { + for (final PeertubeInstance instance : instanceListAdapter.getCurrentList()) { if (instance.getUrl().equals(cleanUrl)) { Toast.makeText(getActivity(), R.string.peertube_instance_add_exists, Toast.LENGTH_SHORT).show(); @@ -266,8 +248,9 @@ private String cleanUrl(final String url) { } private void add(final PeertubeInstance instance) { - instanceList.add(instance); - instanceListAdapter.notifyDataSetChanged(); + final var list = new ArrayList<>(instanceListAdapter.getCurrentList()); + list.add(instance); + instanceListAdapter.submitList(list); } private ItemTouchHelper.SimpleCallback getItemTouchCallback() { @@ -281,8 +264,7 @@ public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView final long msSinceStartScroll) { final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView, viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll); - final int minimumAbsVelocity = Math.max(12, - Math.abs(standardSpeed)); + final int minimumAbsVelocity = Math.max(12, Math.abs(standardSpeed)); return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds); } @@ -316,17 +298,19 @@ public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, final int swipeDir) { final int position = viewHolder.getBindingAdapterPosition(); // do not allow swiping the selected instance - if (instanceList.get(position).getUrl().equals(selectedInstance.getUrl())) { + if (instanceListAdapter.getCurrentList().get(position).getUrl() + .equals(selectedInstance.getUrl())) { instanceListAdapter.notifyItemChanged(position); return; } - instanceList.remove(position); - instanceListAdapter.notifyItemRemoved(position); + final var list = new ArrayList<>(instanceListAdapter.getCurrentList()); + list.remove(position); - if (instanceList.isEmpty()) { - instanceList.add(selectedInstance); - instanceListAdapter.notifyItemInserted(0); + if (list.isEmpty()) { + list.add(selectedInstance); } + + instanceListAdapter.submitList(list); } }; } @@ -336,96 +320,94 @@ public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, //////////////////////////////////////////////////////////////////////////*/ private class InstanceListAdapter - extends RecyclerView.Adapter { + extends ListAdapter { private final LayoutInflater inflater; private final ItemTouchHelper itemTouchHelper; private RadioButton lastChecked; InstanceListAdapter(final Context context, final ItemTouchHelper itemTouchHelper) { + super(new PeertubeInstanceCallback()); this.itemTouchHelper = itemTouchHelper; this.inflater = LayoutInflater.from(context); } public void swapItems(final int fromPosition, final int toPosition) { - Collections.swap(instanceList, fromPosition, toPosition); - notifyItemMoved(fromPosition, toPosition); + final var list = new ArrayList<>(getCurrentList()); + Collections.swap(list, fromPosition, toPosition); + submitList(list); } @NonNull @Override public InstanceListAdapter.TabViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) { - final View view = inflater.inflate(R.layout.item_instance, parent, false); - return new InstanceListAdapter.TabViewHolder(view); + return new InstanceListAdapter.TabViewHolder(ItemInstanceBinding.inflate(inflater, + parent, false)); } @Override public void onBindViewHolder(@NonNull final InstanceListAdapter.TabViewHolder holder, final int position) { - holder.bind(position, holder); - } - - @Override - public int getItemCount() { - return instanceList.size(); + holder.bind(position); } class TabViewHolder extends RecyclerView.ViewHolder { - private final AppCompatImageView instanceIconView; - private final TextView instanceNameView; - private final TextView instanceUrlView; - private final RadioButton instanceRB; - private final ImageView handle; - - TabViewHolder(final View itemView) { - super(itemView); - - instanceIconView = itemView.findViewById(R.id.instanceIcon); - instanceNameView = itemView.findViewById(R.id.instanceName); - instanceUrlView = itemView.findViewById(R.id.instanceUrl); - instanceRB = itemView.findViewById(R.id.selectInstanceRB); - handle = itemView.findViewById(R.id.handle); + private final ItemInstanceBinding itemBinding; + + TabViewHolder(final ItemInstanceBinding binding) { + super(binding.getRoot()); + this.itemBinding = binding; } @SuppressLint("ClickableViewAccessibility") - void bind(final int position, final TabViewHolder holder) { - handle.setOnTouchListener(getOnTouchListener(holder)); + void bind(final int position) { + itemBinding.handle.setOnTouchListener((view, motionEvent) -> { + if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + if (itemTouchHelper != null && getItemCount() > 1) { + itemTouchHelper.startDrag(this); + return true; + } + } + return false; + }); - final PeertubeInstance instance = instanceList.get(position); - instanceNameView.setText(instance.getName()); - instanceUrlView.setText(instance.getUrl()); - instanceRB.setOnCheckedChangeListener(null); + final PeertubeInstance instance = getItem(position); + itemBinding.instanceName.setText(instance.getName()); + itemBinding.instanceUrl.setText(instance.getUrl()); + itemBinding.selectInstanceRB.setOnCheckedChangeListener(null); if (selectedInstance.getUrl().equals(instance.getUrl())) { - if (lastChecked != null && lastChecked != instanceRB) { + if (lastChecked != null && lastChecked != itemBinding.selectInstanceRB) { lastChecked.setChecked(false); } - instanceRB.setChecked(true); - lastChecked = instanceRB; + itemBinding.selectInstanceRB.setChecked(true); + lastChecked = itemBinding.selectInstanceRB; } - instanceRB.setOnCheckedChangeListener((buttonView, isChecked) -> { + itemBinding.selectInstanceRB.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { selectInstance(instance); - if (lastChecked != null && lastChecked != instanceRB) { + if (lastChecked != null && lastChecked != itemBinding.selectInstanceRB) { lastChecked.setChecked(false); } - lastChecked = instanceRB; + lastChecked = itemBinding.selectInstanceRB; } }); - instanceIconView.setImageResource(R.drawable.ic_placeholder_peertube); + itemBinding.instanceIcon.setImageResource(R.drawable.ic_placeholder_peertube); } + } + } - @SuppressLint("ClickableViewAccessibility") - private View.OnTouchListener getOnTouchListener(final RecyclerView.ViewHolder item) { - return (view, motionEvent) -> { - if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { - if (itemTouchHelper != null && getItemCount() > 1) { - itemTouchHelper.startDrag(item); - return true; - } - } - return false; - }; - } + private static class PeertubeInstanceCallback extends DiffUtil.ItemCallback { + @Override + public boolean areItemsTheSame(@NonNull final PeertubeInstance oldItem, + @NonNull final PeertubeInstance newItem) { + return oldItem.getUrl().equals(newItem.getUrl()); + } + + @Override + public boolean areContentsTheSame(@NonNull final PeertubeInstance oldItem, + @NonNull final PeertubeInstance newItem) { + return oldItem.getName().equals(newItem.getName()) + && oldItem.getUrl().equals(newItem.getUrl()); } } } From 67669c286b4bad85fef0854ceb3cb3a3f45e471d Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 31 Jul 2022 15:53:04 +0530 Subject: [PATCH 06/31] Use ListAdapter in SuggestionListAdapter. --- .../fragments/list/search/SearchFragment.java | 10 +-- .../list/search/SuggestionListAdapter.java | 86 +++++++------------ 2 files changed, 36 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 008163890aa..6827ddaaf47 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -200,7 +200,7 @@ public void onAttach(@NonNull final Context context) { showLocalSuggestions = NewPipeSettings.showLocalSearchSuggestions(activity, prefs); showRemoteSuggestions = NewPipeSettings.showRemoteSearchSuggestions(activity, prefs); - suggestionListAdapter = new SuggestionListAdapter(activity); + suggestionListAdapter = new SuggestionListAdapter(); historyRecordManager = new HistoryRecordManager(context); } @@ -530,7 +530,7 @@ private void initSearchListeners() { searchBinding.correctSuggestion.setVisibility(View.GONE); searchEditText.setText(""); - suggestionListAdapter.setItems(new ArrayList<>()); + suggestionListAdapter.submitList(null); showKeyboardSearch(); }); @@ -945,7 +945,7 @@ public void handleSuggestions(@NonNull final List suggestions) { Log.d(TAG, "handleSuggestions() called with: suggestions = [" + suggestions + "]"); } searchBinding.suggestionsList.smoothScrollToPosition(0); - searchBinding.suggestionsList.post(() -> suggestionListAdapter.setItems(suggestions)); + suggestionListAdapter.submitList(suggestions); if (suggestionsPanelVisible && isErrorPanelVisible()) { hideLoading(); @@ -1066,14 +1066,14 @@ public int getSuggestionMovementFlags(@NonNull final RecyclerView.ViewHolder vie return 0; } - final SuggestionItem item = suggestionListAdapter.getItem(position); + final SuggestionItem item = suggestionListAdapter.getCurrentList().get(position); return item.fromHistory ? makeMovementFlags(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) : 0; } public void onSuggestionItemSwiped(@NonNull final RecyclerView.ViewHolder viewHolder) { final int position = viewHolder.getBindingAdapterPosition(); - final String query = suggestionListAdapter.getItem(position).query; + final String query = suggestionListAdapter.getCurrentList().get(position).query; final Disposable onDelete = historyRecordManager.deleteSearchHistory(query) .observeOn(AndroidSchedulers.mainThread()) .subscribe( diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java index fb983b01e26..f859c9e54ca 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java @@ -1,34 +1,22 @@ package org.schabi.newpipe.fragments.list.search; -import android.content.Context; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; import org.schabi.newpipe.R; - -import java.util.ArrayList; -import java.util.List; +import org.schabi.newpipe.databinding.ItemSearchSuggestionBinding; public class SuggestionListAdapter - extends RecyclerView.Adapter { - private final ArrayList items = new ArrayList<>(); - private final Context context; + extends ListAdapter { private OnSuggestionItemSelected listener; - public SuggestionListAdapter(final Context context) { - this.context = context; - } - - public void setItems(final List items) { - this.items.clear(); - this.items.addAll(items); - notifyDataSetChanged(); + public SuggestionListAdapter() { + super(new SuggestionItemCallback()); } public void setListener(final OnSuggestionItemSelected listener) { @@ -39,45 +27,32 @@ public void setListener(final OnSuggestionItemSelected listener) { @Override public SuggestionItemHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) { - return new SuggestionItemHolder(LayoutInflater.from(context) - .inflate(R.layout.item_search_suggestion, parent, false)); + return new SuggestionItemHolder(ItemSearchSuggestionBinding + .inflate(LayoutInflater.from(parent.getContext()), parent, false)); } @Override public void onBindViewHolder(final SuggestionItemHolder holder, final int position) { final SuggestionItem currentItem = getItem(position); holder.updateFrom(currentItem); - holder.queryView.setOnClickListener(v -> { + holder.itemBinding.suggestionSearch.setOnClickListener(v -> { if (listener != null) { listener.onSuggestionItemSelected(currentItem); } }); - holder.queryView.setOnLongClickListener(v -> { + holder.itemBinding.suggestionSearch.setOnLongClickListener(v -> { if (listener != null) { listener.onSuggestionItemLongClick(currentItem); } return true; }); - holder.insertView.setOnClickListener(v -> { + holder.itemBinding.suggestionInsert.setOnClickListener(v -> { if (listener != null) { listener.onSuggestionItemInserted(currentItem); } }); } - SuggestionItem getItem(final int position) { - return items.get(position); - } - - @Override - public int getItemCount() { - return items.size(); - } - - public boolean isEmpty() { - return getItemCount() == 0; - } - public interface OnSuggestionItemSelected { void onSuggestionItemSelected(SuggestionItem item); @@ -87,30 +62,31 @@ public interface OnSuggestionItemSelected { } public static final class SuggestionItemHolder extends RecyclerView.ViewHolder { - private final TextView itemSuggestionQuery; - private final ImageView suggestionIcon; - private final View queryView; - private final View insertView; + private final ItemSearchSuggestionBinding itemBinding; - // Cache some ids, as they can potentially be constantly updated/recycled - private final int historyResId; - private final int searchResId; - - private SuggestionItemHolder(final View rootView) { - super(rootView); - suggestionIcon = rootView.findViewById(R.id.item_suggestion_icon); - itemSuggestionQuery = rootView.findViewById(R.id.item_suggestion_query); + private SuggestionItemHolder(final ItemSearchSuggestionBinding binding) { + super(binding.getRoot()); + this.itemBinding = binding; + } - queryView = rootView.findViewById(R.id.suggestion_search); - insertView = rootView.findViewById(R.id.suggestion_insert); + private void updateFrom(final SuggestionItem item) { + itemBinding.itemSuggestionIcon.setImageResource(item.fromHistory ? R.drawable.ic_history + : R.drawable.ic_search); + itemBinding.itemSuggestionQuery.setText(item.query); + } + } - historyResId = R.drawable.ic_history; - searchResId = R.drawable.ic_search; + private static class SuggestionItemCallback extends DiffUtil.ItemCallback { + @Override + public boolean areItemsTheSame(@NonNull final SuggestionItem oldItem, + @NonNull final SuggestionItem newItem) { + return oldItem.query.equals(newItem.query); } - private void updateFrom(final SuggestionItem item) { - suggestionIcon.setImageResource(item.fromHistory ? historyResId : searchResId); - itemSuggestionQuery.setText(item.query); + @Override + public boolean areContentsTheSame(@NonNull final SuggestionItem oldItem, + @NonNull final SuggestionItem newItem) { + return oldItem.equals(newItem); } } } From 5e0788b99c7b0a43936f179cb94273d5046081c3 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Mon, 1 Aug 2022 06:11:35 +0530 Subject: [PATCH 07/31] Use ListAdapter in PreferenceSearchAdapter. --- .../PreferenceSearchAdapter.java | 61 +++++++++---------- .../PreferenceSearchFragment.java | 11 +--- .../preferencesearch/PreferenceSearcher.java | 3 +- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java index 02fbf9577b0..d6e2021a15f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java @@ -1,54 +1,48 @@ package org.schabi.newpipe.settings.preferencesearch; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; import org.schabi.newpipe.databinding.SettingsPreferencesearchListItemResultBinding; -import java.util.ArrayList; -import java.util.List; import java.util.function.Consumer; class PreferenceSearchAdapter - extends RecyclerView.Adapter { - private List dataset = new ArrayList<>(); + extends ListAdapter { private Consumer onItemClickListener; + PreferenceSearchAdapter() { + super(new PreferenceCallback()); + } + @NonNull @Override - public PreferenceViewHolder onCreateViewHolder( - @NonNull final ViewGroup parent, - final int viewType - ) { - return new PreferenceViewHolder( - SettingsPreferencesearchListItemResultBinding.inflate( - LayoutInflater.from(parent.getContext()), - parent, - false)); + public PreferenceViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, + final int viewType) { + return new PreferenceViewHolder(SettingsPreferencesearchListItemResultBinding.inflate( + LayoutInflater.from(parent.getContext()), parent, false)); } @Override - public void onBindViewHolder( - @NonNull final PreferenceViewHolder holder, - final int position - ) { - final PreferenceSearchItem item = dataset.get(position); + public void onBindViewHolder(@NonNull final PreferenceViewHolder holder, final int position) { + final PreferenceSearchItem item = getItem(position); holder.binding.title.setText(item.getTitle()); - if (TextUtils.isEmpty(item.getSummary())) { + if (item.getSummary().isEmpty()) { holder.binding.summary.setVisibility(View.GONE); } else { holder.binding.summary.setVisibility(View.VISIBLE); holder.binding.summary.setText(item.getSummary()); } - if (TextUtils.isEmpty(item.getBreadcrumbs())) { + if (item.getBreadcrumbs().isEmpty()) { holder.binding.breadcrumbs.setVisibility(View.GONE); } else { holder.binding.breadcrumbs.setVisibility(View.VISIBLE); @@ -62,16 +56,6 @@ public void onBindViewHolder( }); } - void setContent(final List items) { - dataset = new ArrayList<>(items); - this.notifyDataSetChanged(); - } - - @Override - public int getItemCount() { - return dataset.size(); - } - void setOnItemClickListener(final Consumer onItemClickListener) { this.onItemClickListener = onItemClickListener; } @@ -84,4 +68,19 @@ static class PreferenceViewHolder extends RecyclerView.ViewHolder { this.binding = binding; } } + + private static class PreferenceCallback extends DiffUtil.ItemCallback { + @Override + public boolean areItemsTheSame(@NonNull final PreferenceSearchItem oldItem, + @NonNull final PreferenceSearchItem newItem) { + return oldItem.getKey().equals(newItem.getKey()); + } + + @Override + public boolean areContentsTheSame(@NonNull final PreferenceSearchItem oldItem, + @NonNull final PreferenceSearchItem newItem) { + return oldItem.getAllRelevantSearchFields().equals(newItem + .getAllRelevantSearchFields()); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java index 308abbc4e0b..9d169d660ad 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java @@ -1,7 +1,6 @@ package org.schabi.newpipe.settings.preferencesearch; import android.os.Bundle; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -13,7 +12,6 @@ import org.schabi.newpipe.databinding.SettingsPreferencesearchFragmentBinding; -import java.util.ArrayList; import java.util.List; /** @@ -54,13 +52,8 @@ public void updateSearchResults(final String keyword) { return; } - final List results = - !TextUtils.isEmpty(keyword) - ? searcher.searchFor(keyword) - : new ArrayList<>(); - - adapter.setContent(new ArrayList<>(results)); - + final List results = searcher.searchFor(keyword); + adapter.submitList(results); setEmptyViewShown(results.isEmpty()); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java index 176dc5d14ee..b3efc8dd162 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java @@ -3,6 +3,7 @@ import android.text.TextUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -21,7 +22,7 @@ public void add(final List items) { List searchFor(final String keyword) { if (TextUtils.isEmpty(keyword)) { - return new ArrayList<>(); + return Collections.emptyList(); } return configuration.getSearcher() From a50b9bd6ffde21b233a070b4887f1735572953e4 Mon Sep 17 00:00:00 2001 From: opusforlife2 <53176348+opusforlife2@users.noreply.github.com> Date: Sun, 21 Aug 2022 17:39:57 +0000 Subject: [PATCH 08/31] Add FAQ entry to the template checklists (#8822) Co-authored-by: Mohammed Anas --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 ++ .github/ISSUE_TEMPLATE/feature_request.yml | 2 ++ .github/ISSUE_TEMPLATE/question.yml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3abb1fbb1f8..d165daea360 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -18,6 +18,8 @@ body: required: true - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true + - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed." + required: true - label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise." required: true - label: "This issue contains only one bug." diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 9fc3c1632ea..fbc61b579fc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -16,6 +16,8 @@ body: options: - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true + - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed." + required: true - label: "I'm aware that this is a request for NewPipe itself and that requests for adding a new service need to be made at [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor/issues)." required: true - label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise." diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml index 8cf22d8af3b..458ed6f2ede 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -16,6 +16,8 @@ body: options: - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true + - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my question isn't listed." + required: true - label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise." required: true - label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)." From db45042a566180fd9673e7a08f948fb4ebe16039 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 25 Aug 2022 10:14:46 +0200 Subject: [PATCH 09/31] Update NewPipeExtractor This removes the usage of the SourceVersion class, which was not available on Android and caused issues such as #8876 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 14f63b7e02c..aff5cafa213 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -190,7 +190,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:76aad92fa54524f20c3338ab568c9cd6b50c9d33' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:6a858368c86bc9a55abee586eb6c733e86c26b97' /** Checkstyle **/ checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" From 1a432f2ee39b1e5aee2700f0c1050067bebbf622 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 25 Aug 2022 10:15:30 +0200 Subject: [PATCH 10/31] Update jsoup to 1.15.3 This fixes a vulnerability issue related to Cross Site Scripting --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aff5cafa213..610944236e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -231,7 +231,7 @@ dependencies { kapt "frankiesardo:icepick-processor:${icepickVersion}" // HTML parser - implementation "org.jsoup:jsoup:1.14.3" + implementation "org.jsoup:jsoup:1.15.3" // HTTP client //noinspection GradleDependency --> do not update okhttp to keep supporting Android 4.4 users From e1b8a3fbdfa754dc24b81d88932b3acaa4407a71 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 25 Aug 2022 10:16:56 +0200 Subject: [PATCH 11/31] Hotfix release v0.23.3 (989) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 610944236e7..b297d57541b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { resValue "string", "app_name", "NewPipe" minSdk 19 targetSdk 29 - versionCode 988 - versionName "0.23.2" + versionCode 989 + versionName "0.23.3" multiDexEnabled true From 5c0ed22b093b0cc4735150ed213bc02fd77b93e6 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 25 Aug 2022 10:23:09 +0200 Subject: [PATCH 12/31] Add changelog for v0.23.3 (989) --- fastlane/metadata/android/en-US/changelogs/989.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/989.txt diff --git a/fastlane/metadata/android/en-US/changelogs/989.txt b/fastlane/metadata/android/en-US/changelogs/989.txt new file mode 100644 index 00000000000..9ded366ea39 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/989.txt @@ -0,0 +1,2 @@ +• [YouTube] Fix videos loading indefinitely +• Upgrade the jsoup library to 1.15.3, which includes a security fix From 4227866fcfc852b57aabfe03bf458e69e5a050ca Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 25 Aug 2022 10:44:16 +0200 Subject: [PATCH 13/31] Improve changelog for v0.23.3 (989) --- fastlane/metadata/android/en-US/changelogs/989.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastlane/metadata/android/en-US/changelogs/989.txt b/fastlane/metadata/android/en-US/changelogs/989.txt index 9ded366ea39..d1330ff8f3a 100644 --- a/fastlane/metadata/android/en-US/changelogs/989.txt +++ b/fastlane/metadata/android/en-US/changelogs/989.txt @@ -1,2 +1,3 @@ -• [YouTube] Fix videos loading indefinitely +• [YouTube] Fix infinite loading when trying to play any video +• [YouTube] Fix throttling on some videos • Upgrade the jsoup library to 1.15.3, which includes a security fix From 52dbfdee00d4ca4879f8915c5eea4a363aebdc35 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 22 Jul 2022 15:06:19 +0200 Subject: [PATCH 14/31] Keep strong references to Picasso notification icon loading targets Before the Target would sometimes be garbage collected before being called with the loaded channel icon, since Picasso holds weak references to targets. This meant that sometimes a new streams notification would not be shown, because the lambda that should have shown it had already been garbage collected. --- .../feed/notifications/NotificationHelper.kt | 31 +++++++++++++++++-- .../schabi/newpipe/util/PicassoHelper.java | 28 +++-------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 3a08b3e4aa5..351975486fb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -4,6 +4,8 @@ import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent +import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.provider.Settings @@ -11,6 +13,8 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager +import com.squareup.picasso.Picasso +import com.squareup.picasso.Target import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedUpdateInfo @@ -27,6 +31,8 @@ class NotificationHelper(val context: Context) { Context.NOTIFICATION_SERVICE ) as NotificationManager + private val iconLoadingTargets = ArrayList() + /** * Show a notification about new streams from a single channel. * Opening the notification will open the corresponding channel page. @@ -77,10 +83,29 @@ class NotificationHelper(val context: Context) { ) ) - PicassoHelper.loadNotificationIcon(data.avatarUrl) { bitmap -> - bitmap?.let { builder.setLargeIcon(it) } // set only if != null - manager.notify(data.pseudoId, builder.build()) + // a Target is like a listener for image loading events + val target = object : Target { + override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) { + builder.setLargeIcon(bitmap) // set only if there is actually one + manager.notify(data.pseudoId, builder.build()) + iconLoadingTargets.remove(this) // allow it to be garbage-collected + } + + override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) { + manager.notify(data.pseudoId, builder.build()) + iconLoadingTargets.remove(this) // allow it to be garbage-collected + } + + override fun onPrepareLoad(placeHolderDrawable: Drawable) { + // Nothing to do + } } + + // add the target to the list to hold a strong reference and prevent it from being garbage + // collected, since Picasso only holds weak references to targets + iconLoadingTargets.add(target) + + PicassoHelper.loadNotificationIcon(data.avatarUrl).into(target) } companion object { diff --git a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java b/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java index 54140b0fba9..fc7600d4b74 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java @@ -5,7 +5,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; import androidx.annotation.Nullable; @@ -14,7 +13,6 @@ import com.squareup.picasso.OkHttp3Downloader; import com.squareup.picasso.Picasso; import com.squareup.picasso.RequestCreator; -import com.squareup.picasso.Target; import com.squareup.picasso.Transformation; import org.schabi.newpipe.R; @@ -22,7 +20,6 @@ import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; import okhttp3.OkHttpClient; @@ -120,6 +117,10 @@ public static RequestCreator loadSeekbarThumbnailPreview(final String url) { return picassoInstance.load(url); } + public static RequestCreator loadNotificationIcon(final String url) { + return loadImageDefault(url, R.drawable.ic_newpipe_triangle_white); + } + public static RequestCreator loadScaledDownThumbnail(final Context context, final String url) { // scale down the notification thumbnail for performance @@ -170,27 +171,6 @@ public static Bitmap getImageFromCacheIfPresent(final String imageUrl) { return picassoCache.get(imageUrl + "\n"); } - public static void loadNotificationIcon(final String url, - final Consumer bitmapConsumer) { - loadImageDefault(url, R.drawable.ic_newpipe_triangle_white) - .into(new Target() { - @Override - public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) { - bitmapConsumer.accept(bitmap); - } - - @Override - public void onBitmapFailed(final Exception e, final Drawable errorDrawable) { - bitmapConsumer.accept(null); - } - - @Override - public void onPrepareLoad(final Drawable placeHolderDrawable) { - // Nothing to do - } - }); - } - private static RequestCreator loadImageDefault(final String url, final int placeholderResId) { return loadImageDefault(url, placeholderResId, true); From c054ea07372ab33049047cbcfcf5ae5584c05dea Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 21 Jul 2022 18:00:43 +0200 Subject: [PATCH 15/31] Create MediaSessionPlayerUi --- .../org/schabi/newpipe/player/Player.java | 43 +++-------- .../schabi/newpipe/player/PlayerService.java | 6 +- .../MediaSessionManager.java | 4 +- .../mediasession/MediaSessionPlayerUi.java | 74 +++++++++++++++++++ .../player/notification/NotificationUtil.java | 10 ++- .../schabi/newpipe/player/ui/PlayerUi.java | 3 +- .../newpipe/player/ui/PlayerUiList.java | 17 ++++- 7 files changed, 113 insertions(+), 44 deletions(-) rename app/src/main/java/org/schabi/newpipe/player/{helper => mediasession}/MediaSessionManager.java (97%) create mode 100644 app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 159d361c144..e1bc2f061d1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -99,14 +99,13 @@ import org.schabi.newpipe.player.event.PlayerServiceEventListener; import org.schabi.newpipe.player.helper.AudioReactor; import org.schabi.newpipe.player.helper.LoadController; -import org.schabi.newpipe.player.helper.MediaSessionManager; import org.schabi.newpipe.player.helper.PlayerDataSource; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.mediaitem.MediaItemTag; +import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.player.notification.NotificationPlayerUi; import org.schabi.newpipe.player.playback.MediaSourceManager; import org.schabi.newpipe.player.playback.PlaybackListener; -import org.schabi.newpipe.player.playback.PlayerMediaSession; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.player.resolver.AudioPlaybackResolver; @@ -196,7 +195,6 @@ public final class Player implements PlaybackListener, Listener { private ExoPlayer simpleExoPlayer; private AudioReactor audioReactor; - private MediaSessionManager mediaSessionManager; @NonNull private final DefaultTrackSelector trackSelector; @NonNull private final LoadController loadController; @@ -225,7 +223,7 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ @SuppressWarnings("MemberName") // keep the unusual member name - private final PlayerUiList UIs = new PlayerUiList(); + private final PlayerUiList UIs; private BroadcastReceiver broadcastReceiver; private IntentFilter intentFilter; @@ -265,6 +263,15 @@ public Player(@NonNull final PlayerService service) { videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); + + // The UIs added here should always be present. They will be initialized when the player + // reaches the initialization step. Make sure the media session ui is before the + // notification ui in the UIs list, since the notification depends on the media session in + // PlayerUi#initPlayer(), and UIs.call() guarantees UI order is preserved. + UIs = new PlayerUiList( + new MediaSessionPlayerUi(this), + new NotificationPlayerUi(this) + ); } private VideoPlaybackResolver.QualityResolver getQualityResolver() { @@ -431,11 +438,6 @@ && isPlaybackResumeEnabled(this) } private void initUIsForCurrentPlayerType() { - //noinspection SimplifyOptionalCallChains - if (!UIs.get(NotificationPlayerUi.class).isPresent()) { - UIs.addAndPrepare(new NotificationPlayerUi(this)); - } - if ((UIs.get(MainPlayerUi.class).isPresent() && playerType == PlayerType.MAIN) || (UIs.get(PopupPlayerUi.class).isPresent() && playerType == PlayerType.POPUP)) { // correct UI already in place @@ -506,8 +508,6 @@ private void initPlayer(final boolean playOnReady) { simpleExoPlayer.setHandleAudioBecomingNoisy(true); audioReactor = new AudioReactor(context, simpleExoPlayer); - mediaSessionManager = new MediaSessionManager(context, simpleExoPlayer, - new PlayerMediaSession(this)); registerBroadcastReceiver(); @@ -558,9 +558,6 @@ private void destroyPlayer() { if (playQueueManager != null) { playQueueManager.dispose(); } - if (mediaSessionManager != null) { - mediaSessionManager.dispose(); - } } public void destroy() { @@ -723,11 +720,6 @@ private void onBroadcastReceived(final Intent intent) { Log.d(TAG, "ACTION_CONFIGURATION_CHANGED received"); } break; - case Intent.ACTION_HEADSET_PLUG: //FIXME - /*notificationManager.cancel(NOTIFICATION_ID); - mediaSessionManager.dispose(); - mediaSessionManager.enable(getBaseContext(), basePlayerImpl.simpleExoPlayer);*/ - break; } UIs.call(playerUi -> playerUi.onBroadcastReceived(intent)); @@ -1738,15 +1730,6 @@ private void updateMetadataWith(@NonNull final StreamInfo info) { initThumbnail(info.getThumbnailUrl()); registerStreamViewed(); - final boolean showThumbnail = prefs.getBoolean( - context.getString(R.string.show_thumbnail_key), true); - mediaSessionManager.setMetadata( - getVideoTitle(), - getUploaderName(), - showThumbnail ? Optional.ofNullable(getThumbnail()) : Optional.empty(), - StreamTypeUtil.isLiveStream(info.getStreamType()) ? -1 : info.getDuration() - ); - notifyMetadataUpdateToListeners(); UIs.call(playerUi -> playerUi.onMetadataChanged(info)); } @@ -2194,10 +2177,6 @@ public SharedPreferences getPrefs() { return prefs; } - public MediaSessionManager getMediaSessionManager() { - return mediaSessionManager; - } - public PlayerType getPlayerType() { return playerType; diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java index 8d982617a64..33b024e3dc5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java @@ -28,6 +28,7 @@ import android.os.IBinder; import android.util.Log; +import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.util.ThemeHelper; @@ -73,9 +74,8 @@ public int onStartCommand(final Intent intent, final int flags, final int startI } player.handleIntent(intent); - if (player.getMediaSessionManager() != null) { - player.getMediaSessionManager().handleMediaButtonIntent(intent); - } + player.UIs().get(MediaSessionPlayerUi.class) + .ifPresent(ui -> ui.handleMediaButtonIntent(intent)); return START_NOT_STICKY; } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java similarity index 97% rename from app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java rename to app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java index a8735dc08bc..61bc9e2e771 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.player.helper; +package org.schabi.newpipe.player.mediasession; import android.content.Context; import android.content.Intent; @@ -18,8 +18,6 @@ import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import org.schabi.newpipe.MainActivity; -import org.schabi.newpipe.player.mediasession.MediaSessionCallback; -import org.schabi.newpipe.player.mediasession.PlayQueueNavigator; import java.util.Optional; diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java new file mode 100644 index 00000000000..d2de11ccfb9 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -0,0 +1,74 @@ +package org.schabi.newpipe.player.mediasession; + +import android.content.Intent; +import android.support.v4.media.session.MediaSessionCompat; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.playback.PlayerMediaSession; +import org.schabi.newpipe.player.ui.PlayerUi; +import org.schabi.newpipe.util.StreamTypeUtil; + +import java.util.Optional; + +public class MediaSessionPlayerUi extends PlayerUi { + + private MediaSessionManager mediaSessionManager; + + public MediaSessionPlayerUi(@NonNull final Player player) { + super(player); + } + + @Override + public void initPlayer() { + super.initPlayer(); + if (mediaSessionManager != null) { + mediaSessionManager.dispose(); + } + mediaSessionManager = new MediaSessionManager(context, player.getExoPlayer(), + new PlayerMediaSession(player)); + } + + @Override + public void destroyPlayer() { + super.destroyPlayer(); + if (mediaSessionManager != null) { + mediaSessionManager.dispose(); + mediaSessionManager = null; + } + } + + @Override + public void onBroadcastReceived(final Intent intent) { + super.onBroadcastReceived(intent); + // TODO decide whether to handle ACTION_HEADSET_PLUG or not + } + + @Override + public void onMetadataChanged(@NonNull final StreamInfo info) { + super.onMetadataChanged(info); + + final boolean showThumbnail = player.getPrefs().getBoolean( + context.getString(R.string.show_thumbnail_key), true); + + mediaSessionManager.setMetadata( + player.getVideoTitle(), + player.getUploaderName(), + showThumbnail ? Optional.ofNullable(player.getThumbnail()) : Optional.empty(), + StreamTypeUtil.isLiveStream(info.getStreamType()) ? -1 : info.getDuration() + ); + } + + public void handleMediaButtonIntent(final Intent intent) { + if (mediaSessionManager != null) { + mediaSessionManager.handleMediaButtonIntent(intent); + } + } + + public Optional getSessionToken() { + return Optional.ofNullable(mediaSessionManager).map(MediaSessionManager::getSessionToken); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 1a91bc66d85..29ec7a9816e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -19,11 +19,13 @@ import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.util.NavigationHelper; import java.util.List; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import static androidx.media.app.NotificationCompat.MediaStyle; import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; @@ -101,9 +103,11 @@ private synchronized NotificationCompat.Builder createNotification() { player.getContext(), player.getPrefs(), nonNothingSlotCount); final int[] compactSlots = compactSlotList.stream().mapToInt(Integer::intValue).toArray(); - builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle() - .setMediaSession(player.getMediaSessionManager().getSessionToken()) - .setShowActionsInCompactView(compactSlots)) + final MediaStyle mediaStyle = new MediaStyle().setShowActionsInCompactView(compactSlots); + player.UIs().get(MediaSessionPlayerUi.class).flatMap(MediaSessionPlayerUi::getSessionToken) + .ifPresent(mediaStyle::setMediaSession); + + builder.setStyle(mediaStyle) .setPriority(NotificationCompat.PRIORITY_HIGH) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setCategory(NotificationCompat.CATEGORY_TRANSPORT) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUi.java index 9ce04bfd5c9..57e2ec2a2cf 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUi.java @@ -29,7 +29,8 @@ public abstract class PlayerUi { @NonNull protected final Player player; /** - * @param player the player instance that will be usable throughout the lifetime of this UI + * @param player the player instance that will be usable throughout the lifetime of this UI; its + * context should already have been initialized */ protected PlayerUi(@NonNull final Player player) { this.context = player.getContext(); diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.java b/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.java index 05c0ed5b3cc..24fec3b8afc 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.java @@ -8,6 +8,19 @@ public final class PlayerUiList { final List playerUis = new ArrayList<>(); + /** + * Creates a {@link PlayerUiList} starting with the provided player uis. The provided player uis + * will not be prepared like those passed to {@link #addAndPrepare(PlayerUi)}, because when + * the {@link PlayerUiList} constructor is called, the player is still not running and it + * wouldn't make sense to initialize uis then. Instead the player will initialize them by doing + * proper calls to {@link #call(Consumer)}. + * + * @param initialPlayerUis the player uis this list should start with; the order will be kept + */ + public PlayerUiList(final PlayerUi... initialPlayerUis) { + playerUis.addAll(List.of(initialPlayerUis)); + } + /** * Adds the provided player ui to the list and calls on it the initialization functions that * apply based on the current player state. The preparation step needs to be done since when UIs @@ -67,11 +80,11 @@ public Optional get(final Class playerUiType) { } /** - * Calls the provided consumer on all player UIs in the list. + * Calls the provided consumer on all player UIs in the list, in order of addition. * @param consumer the consumer to call with player UIs */ public void call(final Consumer consumer) { //noinspection SimplifyStreamApiCallChains - playerUis.stream().forEach(consumer); + playerUis.stream().forEachOrdered(consumer); } } From bc33322d4be00a0c34db81248e938074555874b7 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 21 Jul 2022 22:40:21 +0200 Subject: [PATCH 16/31] Remove useless MediaSessionCallback The player is now passed directly, it made no sense to wrap around it in a callback that was not really a callback but rather, actually, a wrapper. --- .../mediasession/MediaSessionCallback.java | 21 ---- .../mediasession/MediaSessionManager.java | 16 +-- .../mediasession/MediaSessionPlayerUi.java | 4 +- .../mediasession/PlayQueueNavigator.java | 100 +++++++++++++----- .../player/playback/PlayerMediaSession.java | 99 ----------------- 5 files changed, 83 insertions(+), 157 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionCallback.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playback/PlayerMediaSession.java diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionCallback.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionCallback.java deleted file mode 100644 index c4b02d9857f..00000000000 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionCallback.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.schabi.newpipe.player.mediasession; - -import android.support.v4.media.MediaDescriptionCompat; - -public interface MediaSessionCallback { - void playPrevious(); - - void playNext(); - - void playItemAtIndex(int index); - - int getCurrentPlayingIndex(); - - int getQueueSize(); - - MediaDescriptionCompat getQueueMetadata(int index); - - void play(); - - void pause(); -} diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java index 61bc9e2e771..69f7d38fe7f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java @@ -14,10 +14,11 @@ import androidx.media.session.MediaButtonReceiver; import com.google.android.exoplayer2.ForwardingPlayer; -import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import org.schabi.newpipe.MainActivity; +import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.ui.VideoPlayerUi; import java.util.Optional; @@ -36,8 +37,7 @@ public class MediaSessionManager { private int lastAlbumArtHashCode; public MediaSessionManager(@NonNull final Context context, - @NonNull final Player player, - @NonNull final MediaSessionCallback callback) { + @NonNull final Player player) { mediaSession = new MediaSessionCompat(context, TAG); mediaSession.setActive(true); @@ -53,16 +53,18 @@ public MediaSessionManager(@NonNull final Context context, .build()); sessionConnector = new MediaSessionConnector(mediaSession); - sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, callback)); - sessionConnector.setPlayer(new ForwardingPlayer(player) { + sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); + sessionConnector.setPlayer(new ForwardingPlayer(player.getExoPlayer()) { @Override public void play() { - callback.play(); + player.play(); + // hide the player controls even if the play command came from the media session + player.UIs().get(VideoPlayerUi.class).ifPresent(ui -> ui.hideControls(0, 0)); } @Override public void pause() { - callback.pause(); + player.pause(); } }); } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index d2de11ccfb9..a2eca575f4e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -8,7 +8,6 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.Player; -import org.schabi.newpipe.player.playback.PlayerMediaSession; import org.schabi.newpipe.player.ui.PlayerUi; import org.schabi.newpipe.util.StreamTypeUtil; @@ -28,8 +27,7 @@ public void initPlayer() { if (mediaSessionManager != null) { mediaSessionManager.dispose(); } - mediaSessionManager = new MediaSessionManager(context, player.getExoPlayer(), - new PlayerMediaSession(player)); + mediaSessionManager = new MediaSessionManager(context, player); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java index 92cd425c5fb..7bd27bfdce7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java @@ -1,106 +1,152 @@ package org.schabi.newpipe.player.mediasession; +import android.net.Uri; import android.os.Bundle; import android.os.ResultReceiver; +import android.support.v4.media.MediaDescriptionCompat; +import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_NEXT; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM; +import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.playqueue.PlayQueue; +import org.schabi.newpipe.player.playqueue.PlayQueueItem; + public class PlayQueueNavigator implements MediaSessionConnector.QueueNavigator { - public static final int DEFAULT_MAX_QUEUE_SIZE = 10; + private static final int MAX_QUEUE_SIZE = 10; private final MediaSessionCompat mediaSession; - private final MediaSessionCallback callback; - private final int maxQueueSize; + private final Player player; private long activeQueueItemId; public PlayQueueNavigator(@NonNull final MediaSessionCompat mediaSession, - @NonNull final MediaSessionCallback callback) { + @NonNull final Player player) { this.mediaSession = mediaSession; - this.callback = callback; - this.maxQueueSize = DEFAULT_MAX_QUEUE_SIZE; + this.player = player; this.activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID; } @Override - public long getSupportedQueueNavigatorActions(@Nullable final Player player) { + public long getSupportedQueueNavigatorActions( + @Nullable final com.google.android.exoplayer2.Player exoPlayer) { return ACTION_SKIP_TO_NEXT | ACTION_SKIP_TO_PREVIOUS | ACTION_SKIP_TO_QUEUE_ITEM; } @Override - public void onTimelineChanged(@NonNull final Player player) { + public void onTimelineChanged(@NonNull final com.google.android.exoplayer2.Player exoPlayer) { publishFloatingQueueWindow(); } @Override - public void onCurrentMediaItemIndexChanged(@NonNull final Player player) { + public void onCurrentMediaItemIndexChanged( + @NonNull final com.google.android.exoplayer2.Player exoPlayer) { if (activeQueueItemId == MediaSessionCompat.QueueItem.UNKNOWN_ID - || player.getCurrentTimeline().getWindowCount() > maxQueueSize) { + || exoPlayer.getCurrentTimeline().getWindowCount() > MAX_QUEUE_SIZE) { publishFloatingQueueWindow(); - } else if (!player.getCurrentTimeline().isEmpty()) { - activeQueueItemId = player.getCurrentMediaItemIndex(); + } else if (!exoPlayer.getCurrentTimeline().isEmpty()) { + activeQueueItemId = exoPlayer.getCurrentMediaItemIndex(); } } @Override - public long getActiveQueueItemId(@Nullable final Player player) { - return callback.getCurrentPlayingIndex(); + public long getActiveQueueItemId( + @Nullable final com.google.android.exoplayer2.Player exoPlayer) { + return Optional.ofNullable(player.getPlayQueue()).map(PlayQueue::getIndex).orElse(-1); } @Override - public void onSkipToPrevious(@NonNull final Player player) { - callback.playPrevious(); + public void onSkipToPrevious(@NonNull final com.google.android.exoplayer2.Player exoPlayer) { + player.playPrevious(); } @Override - public void onSkipToQueueItem(@NonNull final Player player, final long id) { - callback.playItemAtIndex((int) id); + public void onSkipToQueueItem(@NonNull final com.google.android.exoplayer2.Player exoPlayer, + final long id) { + if (player.getPlayQueue() != null) { + player.selectQueueItem(player.getPlayQueue().getItem((int) id)); + } } @Override - public void onSkipToNext(@NonNull final Player player) { - callback.playNext(); + public void onSkipToNext(@NonNull final com.google.android.exoplayer2.Player exoPlayer) { + player.playNext(); } private void publishFloatingQueueWindow() { - if (callback.getQueueSize() == 0) { + final int windowCount = Optional.ofNullable(player.getPlayQueue()) + .map(PlayQueue::size) + .orElse(0); + if (windowCount == 0) { mediaSession.setQueue(Collections.emptyList()); activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID; return; } // Yes this is almost a copypasta, got a problem with that? =\ - final int windowCount = callback.getQueueSize(); - final int currentWindowIndex = callback.getCurrentPlayingIndex(); - final int queueSize = Math.min(maxQueueSize, windowCount); + final int currentWindowIndex = player.getPlayQueue().getIndex(); + final int queueSize = Math.min(MAX_QUEUE_SIZE, windowCount); final int startIndex = Util.constrainValue(currentWindowIndex - ((queueSize - 1) / 2), 0, windowCount - queueSize); final List queue = new ArrayList<>(); for (int i = startIndex; i < startIndex + queueSize; i++) { - queue.add(new MediaSessionCompat.QueueItem(callback.getQueueMetadata(i), i)); + queue.add(new MediaSessionCompat.QueueItem(getQueueMetadata(i), i)); } mediaSession.setQueue(queue); activeQueueItemId = currentWindowIndex; } + public MediaDescriptionCompat getQueueMetadata(final int index) { + if (player.getPlayQueue() == null) { + return null; + } + final PlayQueueItem item = player.getPlayQueue().getItem(index); + if (item == null) { + return null; + } + + final MediaDescriptionCompat.Builder descBuilder = new MediaDescriptionCompat.Builder() + .setMediaId(String.valueOf(index)) + .setTitle(item.getTitle()) + .setSubtitle(item.getUploader()); + + // set additional metadata for A2DP/AVRCP + final Bundle additionalMetadata = new Bundle(); + additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, item.getTitle()); + additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader()); + additionalMetadata + .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, item.getDuration() * 1000); + additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, index + 1); + additionalMetadata + .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, player.getPlayQueue().size()); + descBuilder.setExtras(additionalMetadata); + + final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl()); + if (thumbnailUri != null) { + descBuilder.setIconUri(thumbnailUri); + } + + return descBuilder.build(); + } + @Override - public boolean onCommand(@NonNull final Player player, + public boolean onCommand(@NonNull final com.google.android.exoplayer2.Player exoPlayer, @NonNull final String command, @Nullable final Bundle extras, @Nullable final ResultReceiver cb) { diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/PlayerMediaSession.java b/app/src/main/java/org/schabi/newpipe/player/playback/PlayerMediaSession.java deleted file mode 100644 index 3c41acc7596..00000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playback/PlayerMediaSession.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.schabi.newpipe.player.playback; - -import android.net.Uri; -import android.os.Bundle; -import android.support.v4.media.MediaDescriptionCompat; -import android.support.v4.media.MediaMetadataCompat; - -import org.schabi.newpipe.player.Player; -import org.schabi.newpipe.player.mediasession.MediaSessionCallback; -import org.schabi.newpipe.player.playqueue.PlayQueueItem; -import org.schabi.newpipe.player.ui.VideoPlayerUi; - -public class PlayerMediaSession implements MediaSessionCallback { - private final Player player; - - public PlayerMediaSession(final Player player) { - this.player = player; - } - - @Override - public void playPrevious() { - player.playPrevious(); - } - - @Override - public void playNext() { - player.playNext(); - } - - @Override - public void playItemAtIndex(final int index) { - if (player.getPlayQueue() == null) { - return; - } - player.selectQueueItem(player.getPlayQueue().getItem(index)); - } - - @Override - public int getCurrentPlayingIndex() { - if (player.getPlayQueue() == null) { - return -1; - } - return player.getPlayQueue().getIndex(); - } - - @Override - public int getQueueSize() { - if (player.getPlayQueue() == null) { - return -1; - } - return player.getPlayQueue().size(); - } - - @Override - public MediaDescriptionCompat getQueueMetadata(final int index) { - if (player.getPlayQueue() == null) { - return null; - } - final PlayQueueItem item = player.getPlayQueue().getItem(index); - if (item == null) { - return null; - } - - final MediaDescriptionCompat.Builder descBuilder = new MediaDescriptionCompat.Builder() - .setMediaId(String.valueOf(index)) - .setTitle(item.getTitle()) - .setSubtitle(item.getUploader()); - - // set additional metadata for A2DP/AVRCP - final Bundle additionalMetadata = new Bundle(); - additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, item.getTitle()); - additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader()); - additionalMetadata - .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, item.getDuration() * 1000); - additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, index + 1); - additionalMetadata - .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, player.getPlayQueue().size()); - descBuilder.setExtras(additionalMetadata); - - final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl()); - if (thumbnailUri != null) { - descBuilder.setIconUri(thumbnailUri); - } - - return descBuilder.build(); - } - - @Override - public void play() { - player.play(); - // hide the player controls even if the play command came from the media session - player.UIs().get(VideoPlayerUi.class).ifPresent(playerUi -> playerUi.hideControls(0, 0)); - } - - @Override - public void pause() { - player.pause(); - } -} From 3cc43e9fb9eb32063deebcfaf29531aa4588fc3d Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 21 Jul 2022 22:44:59 +0200 Subject: [PATCH 17/31] Fix thumbnail sometimes not set to media session metadata The thumbnail was not being updated in the media session metadata after it was loaded, since there was no metadata update in that case, only a notification update. --- .../newpipe/player/mediasession/MediaSessionPlayerUi.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index a2eca575f4e..e0343820ea8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -1,9 +1,11 @@ package org.schabi.newpipe.player.mediasession; import android.content.Intent; +import android.graphics.Bitmap; import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfo; @@ -60,6 +62,12 @@ public void onMetadataChanged(@NonNull final StreamInfo info) { ); } + @Override + public void onThumbnailLoaded(@Nullable final Bitmap bitmap) { + super.onThumbnailLoaded(bitmap); + player.getCurrentStreamInfo().ifPresent(this::onMetadataChanged); + } + public void handleMediaButtonIntent(final Intent intent) { if (mediaSessionManager != null) { mediaSessionManager.handleMediaButtonIntent(intent); From f3a9b81b670c0e999a9d2fcc8b657d3e85e182f0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 21 Jul 2022 23:03:42 +0200 Subject: [PATCH 18/31] Fix sometimes seeing outdated thumbnail in notification Before the thumbnail finishes loading for the new video the player is now playing, the old thumbnail was being used, leading to wrong thumbnails set in the media session and the notification. --- .../java/org/schabi/newpipe/player/Player.java | 14 +++++++++----- .../org/schabi/newpipe/util/PicassoHelper.java | 7 +++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index e1bc2f061d1..13dd1d93897 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -748,11 +748,15 @@ private void unregisterBroadcastReceiver() { //////////////////////////////////////////////////////////////////////////*/ //region Thumbnail loading - private void initThumbnail(final String url) { + private void loadCurrentThumbnail(final String url) { if (DEBUG) { - Log.d(TAG, "Thumbnail - initThumbnail() called with url = [" + Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with url = [" + (url == null ? "null" : url) + "]"); } + + // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media + // session metadata while the new thumbnail is being loaded by Picasso. + currentThumbnail = null; if (isNullOrEmpty(url)) { return; } @@ -762,8 +766,8 @@ private void initThumbnail(final String url) { @Override public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) { if (DEBUG) { - Log.d(TAG, "Thumbnail - onLoadingComplete() called with: url = [" + url - + "], " + "loadedImage = [" + bitmap + " -> " + bitmap.getWidth() + "x" + Log.d(TAG, "Thumbnail - onBitmapLoaded() called with: url = [" + url + + "], " + "bitmap = [" + bitmap + " -> " + bitmap.getWidth() + "x" + bitmap.getHeight() + "], from = [" + from + "]"); } @@ -1727,7 +1731,7 @@ private void updateMetadataWith(@NonNull final StreamInfo info) { maybeAutoQueueNextStream(info); - initThumbnail(info.getThumbnailUrl()); + loadCurrentThumbnail(info.getThumbnailUrl()); registerStreamViewed(); notifyMetadataUpdateToListeners(); diff --git a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java b/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java index fc7600d4b74..5739b930b64 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java @@ -1,10 +1,12 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.MainActivity.DEBUG; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; +import android.util.Log; import androidx.annotation.Nullable; @@ -24,6 +26,7 @@ import okhttp3.OkHttpClient; public final class PicassoHelper { + private static final String TAG = PicassoHelper.class.getSimpleName(); public static final String PLAYER_THUMBNAIL_TAG = "PICASSO_PLAYER_THUMBNAIL_TAG"; private static final String PLAYER_THUMBNAIL_TRANSFORMATION_KEY = "PICASSO_PLAYER_THUMBNAIL_TRANSFORMATION_KEY"; @@ -129,6 +132,10 @@ public static RequestCreator loadScaledDownThumbnail(final Context context, fina .transform(new Transformation() { @Override public Bitmap transform(final Bitmap source) { + if (DEBUG) { + Log.d(TAG, "Thumbnail - transform() called"); + } + final float notificationThumbnailWidth = Math.min( context.getResources() .getDimension(R.dimen.player_notification_thumbnail_width), From d73ca41cfe6dd3e39bf3f7d751d5870f307a336b Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 21 Jul 2022 23:44:17 +0200 Subject: [PATCH 19/31] Even when thumbnails should not be shown, set it to null in notification This makes sure the thumbnail is removed from the notification if the user disables thumbnails --- .../player/notification/NotificationUtil.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 29ec7a9816e..84e9cc3bc4f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -9,6 +9,7 @@ import android.util.Log; import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; @@ -137,12 +138,9 @@ private synchronized void updateNotification() { notificationBuilder.setContentTitle(player.getVideoTitle()); notificationBuilder.setContentText(player.getUploaderName()); notificationBuilder.setTicker(player.getVideoTitle()); + updateActions(notificationBuilder); - final boolean showThumbnail = player.getPrefs().getBoolean( - player.getContext().getString(R.string.show_thumbnail_key), true); - if (showThumbnail) { - setLargeIcon(notificationBuilder); - } + setLargeIcon(notificationBuilder); } @@ -344,17 +342,26 @@ private Intent getIntentForNotification() { ///////////////////////////////////////////////////// private void setLargeIcon(final NotificationCompat.Builder builder) { + final boolean showThumbnail = player.getPrefs().getBoolean( + player.getContext().getString(R.string.show_thumbnail_key), true); + final Bitmap thumbnail = player.getThumbnail(); + if (thumbnail == null || !showThumbnail) { + // since the builder is reused, make sure the thumbnail is unset if there is not one + builder.setLargeIcon(null); + return; + } + final boolean scaleImageToSquareAspectRatio = player.getPrefs().getBoolean( player.getContext().getString(R.string.scale_to_square_image_in_notifications_key), false); if (scaleImageToSquareAspectRatio) { - builder.setLargeIcon(getBitmapWithSquareAspectRatio(player.getThumbnail())); + builder.setLargeIcon(getBitmapWithSquareAspectRatio(thumbnail)); } else { - builder.setLargeIcon(player.getThumbnail()); + builder.setLargeIcon(thumbnail); } } - private Bitmap getBitmapWithSquareAspectRatio(final Bitmap bitmap) { + private Bitmap getBitmapWithSquareAspectRatio(@NonNull final Bitmap bitmap) { // Find the smaller dimension and then take a center portion of the image that // has that size. final int w = bitmap.getWidth(); From 8bff445ec3d314a35d3243d4fff2711184265533 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 22 Jul 2022 10:17:22 +0200 Subject: [PATCH 20/31] Remove useless checks before updating metadata A while ago NewPipe called the metadata update function very often, so checks were needed to ensure not wasting time updating metadata if it were already up to date. Now, instead, the metadata update function is called exactly when needed, i.e. when metadata changes, so such checks are not needed anymore (and were probably also a little resource-heavy). --- .../org/schabi/newpipe/player/Player.java | 5 - .../mediasession/MediaSessionManager.java | 123 ++---------------- .../mediasession/MediaSessionPlayerUi.java | 2 +- 3 files changed, 11 insertions(+), 119 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 13dd1d93897..22d46bcbe89 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -54,7 +54,6 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.util.Log; @@ -1773,10 +1772,6 @@ public String getUploaderName() { @Nullable public Bitmap getThumbnail() { - if (currentThumbnail == null) { - currentThumbnail = BitmapFactory.decodeResource( - context.getResources(), R.drawable.placeholder_thumbnail_video); - } return currentThumbnail; } //endregion diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java index 69f7d38fe7f..98b6d1b3236 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java @@ -20,8 +20,6 @@ import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.ui.VideoPlayerUi; -import java.util.Optional; - public class MediaSessionManager { private static final String TAG = MediaSessionManager.class.getSimpleName(); public static final boolean DEBUG = MainActivity.DEBUG; @@ -31,11 +29,6 @@ public class MediaSessionManager { @NonNull private final MediaSessionConnector sessionConnector; - private int lastTitleHashCode; - private int lastArtistHashCode; - private long lastDuration; - private int lastAlbumArtHashCode; - public MediaSessionManager(@NonNull final Context context, @NonNull final Player player) { mediaSession = new MediaSessionCompat(context, TAG); @@ -84,134 +77,38 @@ public MediaSessionCompat.Token getSessionToken() { * * @param title {@link MediaMetadataCompat#METADATA_KEY_TITLE} * @param artist {@link MediaMetadataCompat#METADATA_KEY_ARTIST} - * @param optAlbumArt {@link MediaMetadataCompat#METADATA_KEY_ALBUM_ART} + * @param albumArt {@link MediaMetadataCompat#METADATA_KEY_ALBUM_ART}, if not null * @param duration {@link MediaMetadataCompat#METADATA_KEY_DURATION} * - should be a negative value for unknown durations, e.g. for livestreams */ public void setMetadata(@NonNull final String title, @NonNull final String artist, - @NonNull final Optional optAlbumArt, - final long duration - ) { + @Nullable final Bitmap albumArt, + final long duration) { if (DEBUG) { - Log.d(TAG, "setMetadata called:" - + " t: " + title - + " a: " + artist - + " thumb: " + ( - optAlbumArt.isPresent() - ? optAlbumArt.get().hashCode() - : "") - + " d: " + duration); + Log.d(TAG, "setMetadata called with: title = [" + title + "], artist = [" + artist + + "], albumArt = [" + (albumArt == null ? "null" : albumArt.hashCode()) + + "], duration = [" + duration + "]"); } if (!mediaSession.isActive()) { if (DEBUG) { - Log.d(TAG, "setMetadata: mediaSession not active - exiting"); + Log.d(TAG, "setMetadata: media session not active, exiting"); } return; } - if (!checkIfMetadataShouldBeSet(title, artist, optAlbumArt, duration)) { - if (DEBUG) { - Log.d(TAG, "setMetadata: No update required - exiting"); - } - return; - } - - if (DEBUG) { - Log.d(TAG, "setMetadata: N_Metadata update:" - + " t: " + title - + " a: " + artist - + " thumb: " + ( - optAlbumArt.isPresent() - ? optAlbumArt.get().hashCode() - : "") - + " d: " + duration); - } - final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder() .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title) .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist) .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration); - if (optAlbumArt.isPresent()) { - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, optAlbumArt.get()); - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, optAlbumArt.get()); + if (albumArt != null) { + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt); + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, albumArt); } mediaSession.setMetadata(builder.build()); - - lastTitleHashCode = title.hashCode(); - lastArtistHashCode = artist.hashCode(); - lastDuration = duration; - optAlbumArt.ifPresent(bitmap -> lastAlbumArtHashCode = bitmap.hashCode()); - } - - private boolean checkIfMetadataShouldBeSet( - @NonNull final String title, - @NonNull final String artist, - @NonNull final Optional optAlbumArt, - final long duration - ) { - // Check if the values have changed since the last time - if (title.hashCode() != lastTitleHashCode - || artist.hashCode() != lastArtistHashCode - || duration != lastDuration - || (optAlbumArt.isPresent() && optAlbumArt.get().hashCode() != lastAlbumArtHashCode) - ) { - if (DEBUG) { - Log.d(TAG, - "checkIfMetadataShouldBeSet: true - reason: changed values since last"); - } - return true; - } - - // Check if the currently set metadata is valid - if (getMetadataTitle() == null - || getMetadataArtist() == null - // Note that the duration can be <= 0 for live streams - ) { - if (DEBUG) { - if (getMetadataTitle() == null) { - Log.d(TAG, - "N_getMetadataTitle: title == null"); - } else if (getMetadataArtist() == null) { - Log.d(TAG, - "N_getMetadataArtist: artist == null"); - } - } - return true; - } - - // If we got an album art check if the current set AlbumArt is null - if (optAlbumArt.isPresent() && getMetadataAlbumArt() == null) { - if (DEBUG) { - Log.d(TAG, "N_getMetadataAlbumArt: thumb == null"); - } - return true; - } - - // Default - no update required - return false; - } - - - @Nullable - private Bitmap getMetadataAlbumArt() { - return mediaSession.getController().getMetadata() - .getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART); - } - - @Nullable - private String getMetadataTitle() { - return mediaSession.getController().getMetadata() - .getString(MediaMetadataCompat.METADATA_KEY_TITLE); - } - - @Nullable - private String getMetadataArtist() { - return mediaSession.getController().getMetadata() - .getString(MediaMetadataCompat.METADATA_KEY_ARTIST); } /** diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index e0343820ea8..2140be26d19 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -57,7 +57,7 @@ public void onMetadataChanged(@NonNull final StreamInfo info) { mediaSessionManager.setMetadata( player.getVideoTitle(), player.getUploaderName(), - showThumbnail ? Optional.ofNullable(player.getThumbnail()) : Optional.empty(), + showThumbnail ? player.getThumbnail() : null, StreamTypeUtil.isLiveStream(info.getStreamType()) ? -1 : info.getDuration() ); } From f80d1dc48dcc0539ac7faa20b085b0adc2c5fe64 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 22 Jul 2022 11:31:49 +0200 Subject: [PATCH 21/31] Let exoplayer decide when to update metadata Though still make sure metadata is updated after the thumbnail is loaded. This fixes the wrong seekbar properties (duration and current position) being shown in the notification sometimes. --- .../mediasession/MediaSessionManager.java | 87 ++++++++----------- .../mediasession/MediaSessionPlayerUi.java | 22 +---- 2 files changed, 40 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java index 98b6d1b3236..c6766fbcb90 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java @@ -2,10 +2,8 @@ import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; -import android.support.v4.media.session.PlaybackStateCompat; import android.util.Log; import android.view.KeyEvent; @@ -17,8 +15,12 @@ import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import org.schabi.newpipe.MainActivity; +import org.schabi.newpipe.R; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.ui.VideoPlayerUi; +import org.schabi.newpipe.util.StreamTypeUtil; + +import java.util.Optional; public class MediaSessionManager { private static final String TAG = MediaSessionManager.class.getSimpleName(); @@ -34,17 +36,6 @@ public MediaSessionManager(@NonNull final Context context, mediaSession = new MediaSessionCompat(context, TAG); mediaSession.setActive(true); - mediaSession.setPlaybackState(new PlaybackStateCompat.Builder() - .setState(PlaybackStateCompat.STATE_NONE, -1, 1) - .setActions(PlaybackStateCompat.ACTION_SEEK_TO - | PlaybackStateCompat.ACTION_PLAY - | PlaybackStateCompat.ACTION_PAUSE // was play and pause now play/pause - | PlaybackStateCompat.ACTION_SKIP_TO_NEXT - | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS - | PlaybackStateCompat.ACTION_SET_REPEAT_MODE - | PlaybackStateCompat.ACTION_STOP) - .build()); - sessionConnector = new MediaSessionConnector(mediaSession); sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); sessionConnector.setPlayer(new ForwardingPlayer(player.getExoPlayer()) { @@ -60,6 +51,37 @@ public void pause() { player.pause(); } }); + + sessionConnector.setMetadataDeduplicationEnabled(true); + sessionConnector.setMediaMetadataProvider(exoPlayer -> { + if (DEBUG) { + Log.d(TAG, "MediaMetadataProvider#getMetadata called"); + } + + // set title and artist + final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder() + .putString(MediaMetadataCompat.METADATA_KEY_TITLE, player.getVideoTitle()) + .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, player.getUploaderName()); + + // set duration (-1 for livestreams, since they don't have a duration) + final long duration = player.getCurrentStreamInfo() + .filter(info -> !StreamTypeUtil.isLiveStream(info.getStreamType())) + .map(info -> info.getDuration() * 1000L) + .orElse(-1L); + builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration); + + // set album art, unless the user asked not to, or there is no thumbnail available + final boolean showThumbnail = player.getPrefs().getBoolean( + context.getString(R.string.show_thumbnail_key), true); + Optional.ofNullable(player.getThumbnail()) + .filter(bitmap -> showThumbnail) + .ifPresent(bitmap -> { + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap); + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, bitmap); + }); + + return builder.build(); + }); } @Nullable @@ -72,43 +94,8 @@ public MediaSessionCompat.Token getSessionToken() { return mediaSession.getSessionToken(); } - /** - * sets the Metadata - if required. - * - * @param title {@link MediaMetadataCompat#METADATA_KEY_TITLE} - * @param artist {@link MediaMetadataCompat#METADATA_KEY_ARTIST} - * @param albumArt {@link MediaMetadataCompat#METADATA_KEY_ALBUM_ART}, if not null - * @param duration {@link MediaMetadataCompat#METADATA_KEY_DURATION} - * - should be a negative value for unknown durations, e.g. for livestreams - */ - public void setMetadata(@NonNull final String title, - @NonNull final String artist, - @Nullable final Bitmap albumArt, - final long duration) { - if (DEBUG) { - Log.d(TAG, "setMetadata called with: title = [" + title + "], artist = [" + artist - + "], albumArt = [" + (albumArt == null ? "null" : albumArt.hashCode()) - + "], duration = [" + duration + "]"); - } - - if (!mediaSession.isActive()) { - if (DEBUG) { - Log.d(TAG, "setMetadata: media session not active, exiting"); - } - return; - } - - final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder() - .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title) - .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist) - .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration); - - if (albumArt != null) { - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt); - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, albumArt); - } - - mediaSession.setMetadata(builder.build()); + void triggerMetadataUpdate() { + sessionConnector.invalidateMediaSessionMetadata(); } /** diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index 2140be26d19..c78a3a6b1fe 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -7,11 +7,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.ui.PlayerUi; -import org.schabi.newpipe.util.StreamTypeUtil; import java.util.Optional; @@ -47,25 +44,12 @@ public void onBroadcastReceived(final Intent intent) { // TODO decide whether to handle ACTION_HEADSET_PLUG or not } - @Override - public void onMetadataChanged(@NonNull final StreamInfo info) { - super.onMetadataChanged(info); - - final boolean showThumbnail = player.getPrefs().getBoolean( - context.getString(R.string.show_thumbnail_key), true); - - mediaSessionManager.setMetadata( - player.getVideoTitle(), - player.getUploaderName(), - showThumbnail ? player.getThumbnail() : null, - StreamTypeUtil.isLiveStream(info.getStreamType()) ? -1 : info.getDuration() - ); - } - @Override public void onThumbnailLoaded(@Nullable final Bitmap bitmap) { super.onThumbnailLoaded(bitmap); - player.getCurrentStreamInfo().ifPresent(this::onMetadataChanged); + if (mediaSessionManager != null) { + mediaSessionManager.triggerMetadataUpdate(); + } } public void handleMediaButtonIntent(final Intent intent) { From 11bd2369e5e8c0e5352fe76dada02089664f36c0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 22 Jul 2022 12:00:32 +0200 Subject: [PATCH 22/31] Merge MediaSessionManager into MediaSessionPlayerUi --- .../mediasession/MediaSessionManager.java | 110 ------------------ .../mediasession/MediaSessionPlayerUi.java | 104 ++++++++++++++--- 2 files changed, 90 insertions(+), 124 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java deleted file mode 100644 index c6766fbcb90..00000000000 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionManager.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.schabi.newpipe.player.mediasession; - -import android.content.Context; -import android.content.Intent; -import android.support.v4.media.MediaMetadataCompat; -import android.support.v4.media.session.MediaSessionCompat; -import android.util.Log; -import android.view.KeyEvent; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.media.session.MediaButtonReceiver; - -import com.google.android.exoplayer2.ForwardingPlayer; -import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; - -import org.schabi.newpipe.MainActivity; -import org.schabi.newpipe.R; -import org.schabi.newpipe.player.Player; -import org.schabi.newpipe.player.ui.VideoPlayerUi; -import org.schabi.newpipe.util.StreamTypeUtil; - -import java.util.Optional; - -public class MediaSessionManager { - private static final String TAG = MediaSessionManager.class.getSimpleName(); - public static final boolean DEBUG = MainActivity.DEBUG; - - @NonNull - private final MediaSessionCompat mediaSession; - @NonNull - private final MediaSessionConnector sessionConnector; - - public MediaSessionManager(@NonNull final Context context, - @NonNull final Player player) { - mediaSession = new MediaSessionCompat(context, TAG); - mediaSession.setActive(true); - - sessionConnector = new MediaSessionConnector(mediaSession); - sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); - sessionConnector.setPlayer(new ForwardingPlayer(player.getExoPlayer()) { - @Override - public void play() { - player.play(); - // hide the player controls even if the play command came from the media session - player.UIs().get(VideoPlayerUi.class).ifPresent(ui -> ui.hideControls(0, 0)); - } - - @Override - public void pause() { - player.pause(); - } - }); - - sessionConnector.setMetadataDeduplicationEnabled(true); - sessionConnector.setMediaMetadataProvider(exoPlayer -> { - if (DEBUG) { - Log.d(TAG, "MediaMetadataProvider#getMetadata called"); - } - - // set title and artist - final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder() - .putString(MediaMetadataCompat.METADATA_KEY_TITLE, player.getVideoTitle()) - .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, player.getUploaderName()); - - // set duration (-1 for livestreams, since they don't have a duration) - final long duration = player.getCurrentStreamInfo() - .filter(info -> !StreamTypeUtil.isLiveStream(info.getStreamType())) - .map(info -> info.getDuration() * 1000L) - .orElse(-1L); - builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration); - - // set album art, unless the user asked not to, or there is no thumbnail available - final boolean showThumbnail = player.getPrefs().getBoolean( - context.getString(R.string.show_thumbnail_key), true); - Optional.ofNullable(player.getThumbnail()) - .filter(bitmap -> showThumbnail) - .ifPresent(bitmap -> { - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap); - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, bitmap); - }); - - return builder.build(); - }); - } - - @Nullable - @SuppressWarnings("UnusedReturnValue") - public KeyEvent handleMediaButtonIntent(final Intent intent) { - return MediaButtonReceiver.handleIntent(mediaSession, intent); - } - - public MediaSessionCompat.Token getSessionToken() { - return mediaSession.getSessionToken(); - } - - void triggerMetadataUpdate() { - sessionConnector.invalidateMediaSessionMetadata(); - } - - /** - * Should be called on player destruction to prevent leakage. - */ - public void dispose() { - sessionConnector.setPlayer(null); - sessionConnector.setQueueNavigator(null); - mediaSession.setActive(false); - mediaSession.release(); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index c78a3a6b1fe..92a137900fc 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -1,20 +1,33 @@ package org.schabi.newpipe.player.mediasession; +import static org.schabi.newpipe.MainActivity.DEBUG; + import android.content.Intent; import android.graphics.Bitmap; +import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.media.session.MediaButtonReceiver; + +import com.google.android.exoplayer2.ForwardingPlayer; +import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; +import org.schabi.newpipe.R; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.ui.PlayerUi; +import org.schabi.newpipe.player.ui.VideoPlayerUi; +import org.schabi.newpipe.util.StreamTypeUtil; import java.util.Optional; public class MediaSessionPlayerUi extends PlayerUi { + private static final String TAG = "MediaSessUi"; - private MediaSessionManager mediaSessionManager; + private MediaSessionCompat mediaSession; + private MediaSessionConnector sessionConnector; public MediaSessionPlayerUi(@NonNull final Player player) { super(player); @@ -23,18 +36,31 @@ public MediaSessionPlayerUi(@NonNull final Player player) { @Override public void initPlayer() { super.initPlayer(); - if (mediaSessionManager != null) { - mediaSessionManager.dispose(); - } - mediaSessionManager = new MediaSessionManager(context, player); + destroyPlayer(); // release previously used resources + + mediaSession = new MediaSessionCompat(context, TAG); + mediaSession.setActive(true); + + sessionConnector = new MediaSessionConnector(mediaSession); + sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); + sessionConnector.setPlayer(getForwardingPlayer()); + + sessionConnector.setMetadataDeduplicationEnabled(true); + sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata()); } @Override public void destroyPlayer() { super.destroyPlayer(); - if (mediaSessionManager != null) { - mediaSessionManager.dispose(); - mediaSessionManager = null; + if (sessionConnector != null) { + sessionConnector.setPlayer(null); + sessionConnector.setQueueNavigator(null); + sessionConnector = null; + } + if (mediaSession != null) { + mediaSession.setActive(false); + mediaSession.release(); + mediaSession = null; } } @@ -47,18 +73,68 @@ public void onBroadcastReceived(final Intent intent) { @Override public void onThumbnailLoaded(@Nullable final Bitmap bitmap) { super.onThumbnailLoaded(bitmap); - if (mediaSessionManager != null) { - mediaSessionManager.triggerMetadataUpdate(); + if (sessionConnector != null) { + // the thumbnail is now loaded: invalidate the metadata to trigger a metadata update + sessionConnector.invalidateMediaSessionMetadata(); } } + public void handleMediaButtonIntent(final Intent intent) { - if (mediaSessionManager != null) { - mediaSessionManager.handleMediaButtonIntent(intent); - } + MediaButtonReceiver.handleIntent(mediaSession, intent); } public Optional getSessionToken() { - return Optional.ofNullable(mediaSessionManager).map(MediaSessionManager::getSessionToken); + return Optional.ofNullable(mediaSession).map(MediaSessionCompat::getSessionToken); + } + + + private ForwardingPlayer getForwardingPlayer() { + // ForwardingPlayer means that all media session actions called on this player are + // forwarded directly to the connected exoplayer, except for the overridden methods. So + // override play and pause since our player adds more functionality to them over exoplayer. + return new ForwardingPlayer(player.getExoPlayer()) { + @Override + public void play() { + player.play(); + // hide the player controls even if the play command came from the media session + player.UIs().get(VideoPlayerUi.class).ifPresent(ui -> ui.hideControls(0, 0)); + } + + @Override + public void pause() { + player.pause(); + } + }; + } + + private MediaMetadataCompat buildMediaMetadata() { + if (DEBUG) { + Log.d(TAG, "buildMediaMetadata called"); + } + + // set title and artist + final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder() + .putString(MediaMetadataCompat.METADATA_KEY_TITLE, player.getVideoTitle()) + .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, player.getUploaderName()); + + // set duration (-1 for livestreams or if unknown, see the METADATA_KEY_DURATION docs) + final long duration = player.getCurrentStreamInfo() + .filter(info -> !StreamTypeUtil.isLiveStream(info.getStreamType())) + .map(info -> info.getDuration() * 1000L) + .orElse(-1L); + builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration); + + // set album art, unless the user asked not to, or there is no thumbnail available + final boolean showThumbnail = player.getPrefs().getBoolean( + context.getString(R.string.show_thumbnail_key), true); + Optional.ofNullable(player.getThumbnail()) + .filter(bitmap -> showThumbnail) + .ifPresent(bitmap -> { + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap); + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, bitmap); + }); + + return builder.build(); } } From 510efaae976c1fe15a85c3f81c4a49573760097f Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 22 Jul 2022 14:39:25 +0200 Subject: [PATCH 23/31] Keep strong reference to Picasso thumbnail loading target Before the Target would sometimes be garbage collected before being called with the loaded thumbnail, since Picasso holds weak references to targets --- .../org/schabi/newpipe/player/Player.java | 71 ++++++++++++------- .../schabi/newpipe/util/PicassoHelper.java | 2 - 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 22d46bcbe89..45b9b0fde29 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -174,6 +174,7 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ public static final int RENDERER_UNAVAILABLE = -1; + private static final String PICASSO_PLAYER_THUMBNAIL_TAG = "PICASSO_PLAYER_THUMBNAIL_TAG"; /*////////////////////////////////////////////////////////////////////////// // Playback @@ -232,6 +233,11 @@ public final class Player implements PlaybackListener, Listener { @NonNull private final SerialDisposable progressUpdateDisposable = new SerialDisposable(); @NonNull private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable(); + // This is the only listener we need for thumbnail loading, since there is always at most only + // one thumbnail being loaded at a time. This field is also here to maintain a strong reference, + // which would otherwise be garbage collected since Picasso holds weak references to targets. + @NonNull private final Target currentThumbnailTarget; + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -263,6 +269,8 @@ public Player(@NonNull final PlayerService service) { videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); + currentThumbnailTarget = getCurrentThumbnailTarget(); + // The UIs added here should always be present. They will be initialized when the player // reaches the initialization step. Make sure the media session ui is before the // notification ui in the UIs list, since the notification depends on the media session in @@ -573,7 +581,7 @@ public void destroy() { databaseUpdateDisposable.clear(); progressUpdateDisposable.set(null); - PicassoHelper.cancelTag(PicassoHelper.PLAYER_THUMBNAIL_TAG); // cancel thumbnail loading + cancelLoadingCurrentThumbnail(); UIs.destroyAll(Object.class); // destroy every UI: obviously every UI extends Object } @@ -747,48 +755,63 @@ private void unregisterBroadcastReceiver() { //////////////////////////////////////////////////////////////////////////*/ //region Thumbnail loading - private void loadCurrentThumbnail(final String url) { - if (DEBUG) { - Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with url = [" - + (url == null ? "null" : url) + "]"); - } - - // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media - // session metadata while the new thumbnail is being loaded by Picasso. - currentThumbnail = null; - if (isNullOrEmpty(url)) { - return; - } - - // scale down the notification thumbnail for performance - PicassoHelper.loadScaledDownThumbnail(context, url).into(new Target() { + private Target getCurrentThumbnailTarget() { + // a Picasso target is just a listener for thumbnail loading events + return new Target() { @Override public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) { if (DEBUG) { - Log.d(TAG, "Thumbnail - onBitmapLoaded() called with: url = [" + url - + "], " + "bitmap = [" + bitmap + " -> " + bitmap.getWidth() + "x" - + bitmap.getHeight() + "], from = [" + from + "]"); + Log.d(TAG, "Thumbnail - onBitmapLoaded() called with: bitmap = [" + bitmap + + " -> " + bitmap.getWidth() + "x" + bitmap.getHeight() + "], from = [" + + from + "]"); } - currentThumbnail = bitmap; - // there is a new thumbnail, so changed the end screen thumbnail, too. + // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too. UIs.call(playerUi -> playerUi.onThumbnailLoaded(bitmap)); } @Override public void onBitmapFailed(final Exception e, final Drawable errorDrawable) { - Log.e(TAG, "Thumbnail - onBitmapFailed() called: url = [" + url + "]", e); + Log.e(TAG, "Thumbnail - onBitmapFailed() called", e); currentThumbnail = null; + // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too. UIs.call(playerUi -> playerUi.onThumbnailLoaded(null)); } @Override public void onPrepareLoad(final Drawable placeHolderDrawable) { if (DEBUG) { - Log.d(TAG, "Thumbnail - onPrepareLoad() called: url = [" + url + "]"); + Log.d(TAG, "Thumbnail - onPrepareLoad() called"); } } - }); + }; + } + + private void loadCurrentThumbnail(final String url) { + if (DEBUG) { + Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with url = [" + + (url == null ? "null" : url) + "]"); + } + + // first cancel any previous loading + cancelLoadingCurrentThumbnail(); + + // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media + // session metadata while the new thumbnail is being loaded by Picasso. + currentThumbnail = null; + if (isNullOrEmpty(url)) { + return; + } + + // scale down the notification thumbnail for performance + PicassoHelper.loadScaledDownThumbnail(context, url) + .tag(PICASSO_PLAYER_THUMBNAIL_TAG) + .into(currentThumbnailTarget); + } + + private void cancelLoadingCurrentThumbnail() { + // cancel the Picasso job associated with the player thumbnail, if any + PicassoHelper.cancelTag(PICASSO_PLAYER_THUMBNAIL_TAG); } //endregion diff --git a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java b/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java index 5739b930b64..2e781631e1d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java @@ -27,7 +27,6 @@ public final class PicassoHelper { private static final String TAG = PicassoHelper.class.getSimpleName(); - public static final String PLAYER_THUMBNAIL_TAG = "PICASSO_PLAYER_THUMBNAIL_TAG"; private static final String PLAYER_THUMBNAIL_TRANSFORMATION_KEY = "PICASSO_PLAYER_THUMBNAIL_TRANSFORMATION_KEY"; @@ -128,7 +127,6 @@ public static RequestCreator loadNotificationIcon(final String url) { public static RequestCreator loadScaledDownThumbnail(final Context context, final String url) { // scale down the notification thumbnail for performance return PicassoHelper.loadThumbnail(url) - .tag(PLAYER_THUMBNAIL_TAG) .transform(new Transformation() { @Override public Bitmap transform(final Bitmap source) { From 973a9660115cc809a99ae571af45f0b67a9c7c03 Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 26 Jul 2022 16:35:57 +0200 Subject: [PATCH 24/31] Review suggestions --- .../newpipe/player/mediasession/PlayQueueNavigator.java | 2 +- .../newpipe/player/notification/NotificationUtil.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java index 7bd27bfdce7..e84c0837bee 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java @@ -126,7 +126,7 @@ public MediaDescriptionCompat getQueueMetadata(final int index) { .setTitle(item.getTitle()) .setSubtitle(item.getUploader()); - // set additional metadata for A2DP/AVRCP + // set additional metadata for A2DP/AVRCP (Audio/Video Bluetooth profiles) final Bundle additionalMetadata = new Bundle(); additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, item.getTitle()); additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader()); diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 84e9cc3bc4f..2c3199a284c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -105,8 +105,10 @@ private synchronized NotificationCompat.Builder createNotification() { final int[] compactSlots = compactSlotList.stream().mapToInt(Integer::intValue).toArray(); final MediaStyle mediaStyle = new MediaStyle().setShowActionsInCompactView(compactSlots); - player.UIs().get(MediaSessionPlayerUi.class).flatMap(MediaSessionPlayerUi::getSessionToken) - .ifPresent(mediaStyle::setMediaSession); + player.UIs() + .get(MediaSessionPlayerUi.class) + .flatMap(MediaSessionPlayerUi::getSessionToken) + .ifPresent(mediaStyle::setMediaSession); builder.setStyle(mediaStyle) .setPriority(NotificationCompat.PRIORITY_HIGH) From 59d1ded94e876bd040a7c23a7a2e3ae18987df07 Mon Sep 17 00:00:00 2001 From: litetex <40789489+litetex@users.noreply.github.com> Date: Thu, 25 Aug 2022 16:59:46 +0200 Subject: [PATCH 25/31] Fixed sonar detected problems + Automatically fixed code style (imports) --- .../java/org/schabi/newpipe/player/Player.java | 2 +- .../mediasession/MediaSessionPlayerUi.java | 6 ------ .../mediasession/PlayQueueNavigator.java | 18 +++++++++--------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 45b9b0fde29..319c163e850 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -222,7 +222,7 @@ public final class Player implements PlaybackListener, Listener { // UIs, listeners and disposables //////////////////////////////////////////////////////////////////////////*/ - @SuppressWarnings("MemberName") // keep the unusual member name + @SuppressWarnings({"MemberName", "java:S116"}) // keep the unusual member name private final PlayerUiList UIs; private BroadcastReceiver broadcastReceiver; diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index 92a137900fc..e9541ab06d8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -64,12 +64,6 @@ public void destroyPlayer() { } } - @Override - public void onBroadcastReceived(final Intent intent) { - super.onBroadcastReceived(intent); - // TODO decide whether to handle ACTION_HEADSET_PLUG or not - } - @Override public void onThumbnailLoaded(@Nullable final Bitmap bitmap) { super.onThumbnailLoaded(bitmap); diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java index e84c0837bee..2e54b1129d7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java @@ -1,5 +1,9 @@ package org.schabi.newpipe.player.mediasession; +import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_NEXT; +import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; +import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM; + import android.net.Uri; import android.os.Bundle; import android.os.ResultReceiver; @@ -13,19 +17,15 @@ import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import com.google.android.exoplayer2.util.Util; +import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.playqueue.PlayQueue; +import org.schabi.newpipe.player.playqueue.PlayQueueItem; + import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; -import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_NEXT; -import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; -import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM; - -import org.schabi.newpipe.player.Player; -import org.schabi.newpipe.player.playqueue.PlayQueue; -import org.schabi.newpipe.player.playqueue.PlayQueueItem; - public class PlayQueueNavigator implements MediaSessionConnector.QueueNavigator { private static final int MAX_QUEUE_SIZE = 10; @@ -132,7 +132,7 @@ public MediaDescriptionCompat getQueueMetadata(final int index) { additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader()); additionalMetadata .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, item.getDuration() * 1000); - additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, index + 1); + additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, index + 1L); additionalMetadata .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, player.getPlayQueue().size()); descBuilder.setExtras(additionalMetadata); From 6805c75c9cf90f9448e266eda34866136f0c71c8 Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 2 Aug 2022 14:46:11 +0200 Subject: [PATCH 26/31] Fix surface view not resizing video correctly Also fix yet another random null pointer exception that could happen when adding the video player view --- .../fragments/detail/VideoDetailFragment.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 3b1bdaedeb7..594006ab5f9 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 @@ -1220,7 +1220,7 @@ private void openMainPlayer() { } final PlayQueue queue = setupPlayQueueForIntent(false); - addVideoPlayerView(); + tryAddVideoPlayerView(); final Intent playerIntent = NavigationHelper.getPlayerIntent(requireContext(), PlayerService.class, queue, true, autoPlayEnabled); @@ -1301,21 +1301,27 @@ private boolean isAutoplayEnabled() { && PlayerHelper.isAutoplayAllowedByUser(requireContext()); } - private void addVideoPlayerView() { - if (!isPlayerAvailable() || getView() == null) { - return; - } - setHeightThumbnail(); + private void tryAddVideoPlayerView() { + // do all the null checks in the posted lambda, since the player, the binding and the view + // could be set or unset before the lambda gets executed on the next main thread cycle + new Handler(Looper.getMainLooper()).post(() -> { + if (!isPlayerAvailable() || getView() == null) { + return; + } - // Prevent from re-adding a view multiple times - new Handler(Looper.getMainLooper()).post(() -> - player.UIs().get(MainPlayerUi.class).ifPresent(playerUi -> { - if (binding != null) { - playerUi.removeViewFromParent(); - binding.playerPlaceholder.addView(playerUi.getBinding().getRoot()); - playerUi.setupVideoSurfaceIfNeeded(); - } - })); + // setup the surface view height, so that it fits the video correctly + setHeightThumbnail(); + + player.UIs().get(MainPlayerUi.class).ifPresent(playerUi -> { + // sometimes binding would be null here, even though getView() != null above u.u + if (binding != null) { + // prevent from re-adding a view multiple times + playerUi.removeViewFromParent(); + binding.playerPlaceholder.addView(playerUi.getBinding().getRoot()); + playerUi.setupVideoSurfaceIfNeeded(); + } + }); + }); } private void removeVideoPlayerView() { @@ -1784,7 +1790,7 @@ private void showPlaybackProgress(final long progress, final long duration) { @Override public void onViewCreated() { - addVideoPlayerView(); + tryAddVideoPlayerView(); } @Override @@ -1926,7 +1932,7 @@ public void onFullscreenStateChanged(final boolean fullscreen) { } scrollToTop(); - addVideoPlayerView(); + tryAddVideoPlayerView(); } @Override From 500acce178d1e9f21d811f7e9f3b3bfac6c4aeb0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 24 Aug 2022 15:08:24 +0200 Subject: [PATCH 27/31] Fix regression in screen rotation animation --- .../newpipe/fragments/detail/VideoDetailFragment.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 594006ab5f9..9800b2b0ab9 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 @@ -1302,8 +1302,14 @@ private boolean isAutoplayEnabled() { } private void tryAddVideoPlayerView() { - // do all the null checks in the posted lambda, since the player, the binding and the view - // could be set or unset before the lambda gets executed on the next main thread cycle + if (isPlayerAvailable() && getView() != null) { + // Setup the surface view height, so that it fits the video correctly; this is done also + // here, and not only in the Handler, to avoid a choppy fullscreen rotation animation. + setHeightThumbnail(); + } + + // do all the null checks in the posted lambda, too, since the player, the binding and the + // view could be set or unset before the lambda gets executed on the next main thread cycle new Handler(Looper.getMainLooper()).post(() -> { if (!isPlayerAvailable() || getView() == null) { return; From ca0f56eea815bd2112f2e36655c4f753dd975a70 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 24 Aug 2022 16:03:15 +0200 Subject: [PATCH 28/31] Avoid setting invalid states to bottom sheet callback --- .../fragments/detail/VideoDetailFragment.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 9800b2b0ab9..0ec1efe571f 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 @@ -180,6 +180,8 @@ public final class VideoDetailFragment @State int bottomSheetState = BottomSheetBehavior.STATE_EXPANDED; @State + int lastStableBottomSheetState = BottomSheetBehavior.STATE_EXPANDED; + @State protected boolean autoPlayEnabled = true; @Nullable @@ -269,7 +271,7 @@ public static VideoDetailFragment getInstance(final int serviceId, public static VideoDetailFragment getInstanceInCollapsedState() { final VideoDetailFragment instance = new VideoDetailFragment(); - instance.bottomSheetState = BottomSheetBehavior.STATE_COLLAPSED; + instance.updateBottomSheetState(BottomSheetBehavior.STATE_COLLAPSED); return instance; } @@ -1170,7 +1172,7 @@ public void openVideoPlayer(final boolean directlyFullscreenIfApplicable) { // doesn't tell which state it was settling to, and thus the bottom sheet settles to // STATE_COLLAPSED. This can be solved by manually setting the state that will be // restored (i.e. bottomSheetState) to STATE_EXPANDED. - bottomSheetState = BottomSheetBehavior.STATE_EXPANDED; + updateBottomSheetState(BottomSheetBehavior.STATE_EXPANDED); // toggle landscape in order to open directly in fullscreen onScreenRotationButtonClicked(); } @@ -2284,7 +2286,9 @@ private void setupBottomPlayer() { final FrameLayout bottomSheetLayout = activity.findViewById(R.id.fragment_player_holder); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout); - bottomSheetBehavior.setState(bottomSheetState); + bottomSheetBehavior.setState(lastStableBottomSheetState); + updateBottomSheetState(lastStableBottomSheetState); + final int peekHeight = getResources().getDimensionPixelSize(R.dimen.mini_player_height); if (bottomSheetState != BottomSheetBehavior.STATE_HIDDEN) { manageSpaceAtTheBottom(false); @@ -2300,7 +2304,7 @@ private void setupBottomPlayer() { bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull final View bottomSheet, final int newState) { - bottomSheetState = newState; + updateBottomSheetState(newState); switch (newState) { case BottomSheetBehavior.STATE_HIDDEN: @@ -2441,4 +2445,12 @@ public Optional getRoot() { return player.UIs().get(VideoPlayerUi.class) .map(playerUi -> playerUi.getBinding().getRoot()); } + + private void updateBottomSheetState(final int newState) { + bottomSheetState = newState; + if (newState != BottomSheetBehavior.STATE_DRAGGING + && newState != BottomSheetBehavior.STATE_SETTLING) { + lastStableBottomSheetState = newState; + } + } } From f9994abb94453f97080bdd48200c6009b965a43c Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 24 Aug 2022 17:48:02 +0200 Subject: [PATCH 29/31] Prevent tapping on thumbnail if video details are not loaded --- .../fragments/detail/VideoDetailFragment.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 0ec1efe571f..09e0857910b 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 @@ -505,12 +505,18 @@ public void onClick(final View v) { } break; case R.id.detail_thumbnail_root_layout: - autoPlayEnabled = true; // forcefully start playing - // FIXME Workaround #7427 - if (isPlayerAvailable()) { - player.setRecovery(); + // make sure not to open any player if there is nothing currently loaded! + // FIXME removing this `if` causes the player service to start correctly, then stop, + // then restart badly without calling `startForeground()`, causing a crash when + // later closing the detail fragment + if (currentInfo != null) { + autoPlayEnabled = true; // forcefully start playing + // FIXME Workaround #7427 + if (isPlayerAvailable()) { + player.setRecovery(); + } + openVideoPlayerAutoFullscreen(); } - openVideoPlayerAutoFullscreen(); break; case R.id.detail_title_root_layout: toggleTitleAndSecondaryControls(); From 67b5de38b1cdb88a160b34ec18a0ae2e4248ce41 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 27 Aug 2022 11:53:53 +0200 Subject: [PATCH 30/31] Translated using Weblate (Chinese (Simplified)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (70 of 70 strings) Translated using Weblate (Czech) Currently translated at 100.0% (70 of 70 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (70 of 70 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (69 of 69 strings) Translated using Weblate (Interlingua) Currently translated at 35.0% (224 of 640 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 62.3% (43 of 69 strings) Translated using Weblate (Korean) Currently translated at 10.1% (7 of 69 strings) Translated using Weblate (French) Currently translated at 89.8% (62 of 69 strings) Translated using Weblate (Hebrew) Currently translated at 55.0% (38 of 69 strings) Translated using Weblate (Czech) Currently translated at 100.0% (69 of 69 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (69 of 69 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 13.0% (9 of 69 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 5.8% (4 of 68 strings) Translated using Weblate (French) Currently translated at 89.7% (61 of 68 strings) Translated using Weblate (French) Currently translated at 89.7% (61 of 68 strings) Translated using Weblate (Bengali) Currently translated at 22.0% (15 of 68 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (French) Currently translated at 73.5% (50 of 68 strings) Translated using Weblate (Russian) Currently translated at 30.8% (21 of 68 strings) Translated using Weblate (German) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Hungarian) Currently translated at 7.3% (5 of 68 strings) Translated using Weblate (Croatian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Czech) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Polish) Currently translated at 58.8% (40 of 68 strings) Translated using Weblate (Bengali) Currently translated at 88.7% (568 of 640 strings) Translated using Weblate (Malayalam) Currently translated at 90.7% (581 of 640 strings) Translated using Weblate (Interlingua) Currently translated at 33.5% (215 of 640 strings) Translated using Weblate (Croatian) Currently translated at 98.1% (628 of 640 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Hungarian) Currently translated at 93.9% (601 of 640 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Somali) Currently translated at 89.0% (570 of 640 strings) Translated using Weblate (German) Currently translated at 66.1% (45 of 68 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Armenian) Currently translated at 29.2% (187 of 640 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Spanish) Currently translated at 99.5% (637 of 640 strings) Translated using Weblate (Urdu) Currently translated at 67.1% (430 of 640 strings) Translated using Weblate (Croatian) Currently translated at 97.5% (624 of 640 strings) Translated using Weblate (Portuguese) Currently translated at 61.7% (42 of 68 strings) Translated using Weblate (Russian) Currently translated at 22.0% (15 of 68 strings) Translated using Weblate (Russian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (French) Currently translated at 72.0% (49 of 68 strings) Translated using Weblate (Italian) Currently translated at 41.1% (28 of 68 strings) Translated using Weblate (Czech) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.6% (638 of 640 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Galician) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Bulgarian) Currently translated at 72.0% (461 of 640 strings) Translated using Weblate (Vietnamese) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 64.6% (414 of 640 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Persian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Polish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Czech) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Greek) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Basque) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Italian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (French) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (German) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Italian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Slovak) Currently translated at 8.8% (6 of 68 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (French) Currently translated at 70.5% (48 of 68 strings) Translated using Weblate (Filipino) Currently translated at 36.8% (236 of 640 strings) Translated using Weblate (Bulgarian) Currently translated at 70.6% (452 of 640 strings) Translated using Weblate (Russian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Turkish) Currently translated at 32.3% (22 of 68 strings) Translated using Weblate (Telugu) Currently translated at 65.6% (420 of 640 strings) Translated using Weblate (Vietnamese) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 97.1% (622 of 640 strings) Translated using Weblate (Italian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Japanese) Currently translated at 99.2% (635 of 640 strings) Co-authored-by: Agnieszka C Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Danial Behzadi Co-authored-by: Davit Mayilyan Co-authored-by: Edward Co-authored-by: Emin Tufan Çetin Co-authored-by: Eric Co-authored-by: Evghenii Botnari Co-authored-by: Fjuro Co-authored-by: Francisco Ruiz Co-authored-by: Giovanni Donisi Co-authored-by: GnuPGを使うべきだ Co-authored-by: Gontzal Manuel Pujana Onaindia Co-authored-by: Hin Weisner Co-authored-by: Hosted Weblate Co-authored-by: Igor Sorocean Co-authored-by: Ihor Hordiichuk Co-authored-by: JScocktail Co-authored-by: Jalaluddin Co-authored-by: Jeff Huang Co-authored-by: Josu Co-authored-by: Karl Tammik Co-authored-by: Laura Vasconcelos Pereira Felippe Co-authored-by: Lenn Art Co-authored-by: Linerly Co-authored-by: Louis V Co-authored-by: Marian Hanzel Co-authored-by: MatthieuPh Co-authored-by: Milo Ivir Co-authored-by: Mohammed Anas Co-authored-by: MΛX Co-authored-by: Nadir Nour Co-authored-by: Napstaguy04 Co-authored-by: Nizami Co-authored-by: Oymate Co-authored-by: Pieter van der Razemond Co-authored-by: Ray Co-authored-by: Rex_sa Co-authored-by: Ricardo Co-authored-by: S3aBreeze Co-authored-by: SC Co-authored-by: STV Co-authored-by: Samar Ali Co-authored-by: Santhosh J Co-authored-by: Software In Interlingua Co-authored-by: TXRdev Archive Co-authored-by: Tadeusz Dudek Co-authored-by: ThePlanetaryDroid Co-authored-by: Translator Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Viktor Co-authored-by: WB Co-authored-by: Xəyyam Qocayev Co-authored-by: Yaron Shahrabani Co-authored-by: Zoldtukor Co-authored-by: chr56 Co-authored-by: i-am-SangWoo-Lee Co-authored-by: nautilusx Co-authored-by: pjammo Co-authored-by: rakijagamer-2003 Co-authored-by: remon-drk Co-authored-by: ssantos Co-authored-by: subba raidu Co-authored-by: yunna Co-authored-by: Симеон Цветков Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn_BD/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 11 +- app/src/main/res/values-az/strings.xml | 7 +- app/src/main/res/values-bg/strings.xml | 15 +- app/src/main/res/values-bn-rBD/strings.xml | 1 + app/src/main/res/values-bn/strings.xml | 2 + app/src/main/res/values-cs/strings.xml | 49 +- app/src/main/res/values-de/strings.xml | 9 +- app/src/main/res/values-el/strings.xml | 7 +- app/src/main/res/values-es/strings.xml | 12 +- app/src/main/res/values-et/strings.xml | 6 +- app/src/main/res/values-eu/strings.xml | 13 +- app/src/main/res/values-fa/strings.xml | 6 +- app/src/main/res/values-fil/strings.xml | 7 +- app/src/main/res/values-fr/strings.xml | 15 +- app/src/main/res/values-gl/strings.xml | 13 +- app/src/main/res/values-he/strings.xml | 6 +- app/src/main/res/values-hr/strings.xml | 494 +++++++++--------- app/src/main/res/values-hu/strings.xml | 41 +- app/src/main/res/values-hy/strings.xml | 3 + app/src/main/res/values-ia/strings.xml | 12 + app/src/main/res/values-in/strings.xml | 5 +- app/src/main/res/values-it/strings.xml | 7 +- app/src/main/res/values-ja/strings.xml | 83 +-- app/src/main/res/values-ml/strings.xml | 4 +- app/src/main/res/values-nl/strings.xml | 8 + app/src/main/res/values-pl/strings.xml | 5 +- app/src/main/res/values-pt-rBR/strings.xml | 5 +- app/src/main/res/values-pt-rPT/strings.xml | 2 + app/src/main/res/values-pt/strings.xml | 6 +- app/src/main/res/values-ro/strings.xml | 13 +- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-sc/strings.xml | 6 +- app/src/main/res/values-sk/strings.xml | 8 + app/src/main/res/values-so/strings.xml | 4 +- app/src/main/res/values-sv/strings.xml | 9 +- app/src/main/res/values-te/strings.xml | 25 + app/src/main/res/values-tr/strings.xml | 37 +- app/src/main/res/values-uk/strings.xml | 5 +- app/src/main/res/values-ur/strings.xml | 6 +- app/src/main/res/values-vi/strings.xml | 95 ++-- app/src/main/res/values-zh-rCN/strings.xml | 6 +- app/src/main/res/values-zh-rHK/strings.xml | 61 ++- app/src/main/res/values-zh-rTW/strings.xml | 5 +- .../metadata/android/az/changelogs/988.txt | 2 + .../metadata/android/bn/changelogs/66.txt | 33 ++ .../metadata/android/bn/changelogs/730.txt | 4 +- .../metadata/android/bn/changelogs/770.txt | 2 +- .../metadata/android/bn/changelogs/956.txt | 2 +- .../metadata/android/bn/short_description.txt | 2 +- .../metadata/android/bn_BD/changelogs/63.txt | 8 + .../metadata/android/bn_BD/changelogs/64.txt | 8 + .../android/bn_BD/full_description.txt | 1 + .../android/bn_BD/short_description.txt | 1 + .../metadata/android/cs/changelogs/63.txt | 8 + .../metadata/android/cs/changelogs/64.txt | 8 + .../metadata/android/cs/changelogs/65.txt | 26 + .../metadata/android/cs/changelogs/66.txt | 16 + .../metadata/android/cs/changelogs/68.txt | 15 + .../metadata/android/cs/changelogs/69.txt | 9 + .../metadata/android/cs/changelogs/70.txt | 7 + .../metadata/android/cs/changelogs/71.txt | 7 + .../metadata/android/cs/changelogs/730.txt | 2 + .../metadata/android/cs/changelogs/740.txt | 23 + .../metadata/android/cs/changelogs/750.txt | 14 + .../metadata/android/cs/changelogs/760.txt | 14 + .../metadata/android/cs/changelogs/770.txt | 4 + .../metadata/android/cs/changelogs/780.txt | 11 + .../metadata/android/cs/changelogs/790.txt | 9 + .../metadata/android/cs/changelogs/800.txt | 10 + .../metadata/android/cs/changelogs/810.txt | 8 + .../metadata/android/cs/changelogs/820.txt | 1 + .../metadata/android/cs/changelogs/830.txt | 1 + .../metadata/android/cs/changelogs/840.txt | 8 + .../metadata/android/cs/changelogs/850.txt | 1 + .../metadata/android/cs/changelogs/860.txt | 7 + .../metadata/android/cs/changelogs/870.txt | 2 + .../metadata/android/cs/changelogs/900.txt | 13 + .../metadata/android/cs/changelogs/910.txt | 1 + .../metadata/android/cs/changelogs/920.txt | 9 + .../metadata/android/cs/changelogs/930.txt | 10 + .../metadata/android/cs/changelogs/940.txt | 9 + .../metadata/android/cs/changelogs/950.txt | 4 + .../metadata/android/cs/changelogs/951.txt | 6 + .../metadata/android/cs/changelogs/953.txt | 1 + .../metadata/android/cs/changelogs/954.txt | 6 + .../metadata/android/cs/changelogs/955.txt | 3 + .../metadata/android/cs/changelogs/956.txt | 1 + .../metadata/android/cs/changelogs/957.txt | 8 + .../metadata/android/cs/changelogs/958.txt | 15 + .../metadata/android/cs/changelogs/959.txt | 3 + .../metadata/android/cs/changelogs/960.txt | 4 + .../metadata/android/cs/changelogs/961.txt | 12 + .../metadata/android/cs/changelogs/963.txt | 1 + .../metadata/android/cs/changelogs/964.txt | 8 + .../metadata/android/cs/changelogs/965.txt | 6 + .../metadata/android/cs/changelogs/966.txt | 14 + .../metadata/android/cs/changelogs/967.txt | 1 + .../metadata/android/cs/changelogs/968.txt | 7 + .../metadata/android/cs/changelogs/969.txt | 8 + .../metadata/android/cs/changelogs/970.txt | 11 + .../metadata/android/cs/changelogs/971.txt | 3 + .../metadata/android/cs/changelogs/972.txt | 14 + .../metadata/android/cs/changelogs/973.txt | 4 + .../metadata/android/cs/changelogs/974.txt | 5 + .../metadata/android/cs/changelogs/975.txt | 17 + .../metadata/android/cs/changelogs/976.txt | 10 + .../metadata/android/cs/changelogs/977.txt | 10 + .../metadata/android/cs/changelogs/978.txt | 1 + .../metadata/android/cs/changelogs/979.txt | 2 + .../metadata/android/cs/changelogs/980.txt | 13 + .../metadata/android/cs/changelogs/981.txt | 2 + .../metadata/android/cs/changelogs/982.txt | 1 + .../metadata/android/cs/changelogs/983.txt | 9 + .../metadata/android/cs/changelogs/984.txt | 7 + .../metadata/android/cs/changelogs/985.txt | 1 + .../metadata/android/cs/changelogs/986.txt | 16 + .../metadata/android/cs/changelogs/987.txt | 12 + .../metadata/android/cs/changelogs/988.txt | 2 + .../metadata/android/cs/changelogs/989.txt | 3 + .../metadata/android/de/changelogs/987.txt | 2 +- .../metadata/android/fr/changelogs/63.txt | 4 +- .../metadata/android/fr/changelogs/65.txt | 26 + .../metadata/android/fr/changelogs/66.txt | 28 + .../metadata/android/fr/changelogs/68.txt | 31 ++ .../metadata/android/fr/changelogs/69.txt | 19 + .../metadata/android/fr/changelogs/70.txt | 25 + .../metadata/android/fr/changelogs/71.txt | 14 +- .../metadata/android/fr/changelogs/964.txt | 8 + .../metadata/android/fr/changelogs/966.txt | 14 + .../metadata/android/fr/changelogs/969.txt | 8 + .../metadata/android/fr/changelogs/970.txt | 11 + .../metadata/android/fr/changelogs/971.txt | 3 + .../metadata/android/fr/changelogs/973.txt | 4 + .../metadata/android/fr/changelogs/974.txt | 5 + .../metadata/android/fr/changelogs/977.txt | 8 + .../metadata/android/fr/changelogs/980.txt | 13 + .../metadata/android/fr/changelogs/987.txt | 6 +- .../metadata/android/fr/changelogs/988.txt | 2 + .../metadata/android/fr/short_description.txt | 2 +- .../metadata/android/he/changelogs/988.txt | 2 + .../metadata/android/hu/changelogs/65.txt | 26 + .../metadata/android/hu/short_description.txt | 2 +- .../metadata/android/it/changelogs/63.txt | 10 +- .../metadata/android/it/changelogs/730.txt | 2 + .../metadata/android/ko/changelogs/63.txt | 8 + .../metadata/android/ko/changelogs/64.txt | 8 + .../metadata/android/pl/changelogs/964.txt | 8 + .../metadata/android/pl/changelogs/965.txt | 5 + .../metadata/android/pt/changelogs/955.txt | 6 +- .../metadata/android/ru/changelogs/65.txt | 1 + .../metadata/android/ru/changelogs/66.txt | 1 + .../metadata/android/ru/changelogs/68.txt | 1 + .../metadata/android/ru/changelogs/69.txt | 1 + .../metadata/android/ru/changelogs/70.txt | 1 + .../metadata/android/ru/changelogs/780.txt | 12 + .../metadata/android/ru/changelogs/790.txt | 1 + .../metadata/android/ru/changelogs/985.txt | 1 + .../metadata/android/ru/changelogs/987.txt | 12 + .../metadata/android/sk/changelogs/987.txt | 12 + .../metadata/android/tr/changelogs/63.txt | 4 +- .../metadata/android/tr/full_description.txt | 3 +- .../metadata/android/uk/changelogs/988.txt | 2 + .../metadata/android/uk/changelogs/989.txt | 3 + .../android/zh-Hans/changelogs/988.txt | 2 + .../android/zh-Hans/changelogs/989.txt | 3 + .../android/zh-Hant/changelogs/988.txt | 2 + .../android/zh_Hant_HK/changelogs/988.txt | 2 + 167 files changed, 1613 insertions(+), 466 deletions(-) create mode 100644 fastlane/metadata/android/az/changelogs/988.txt create mode 100644 fastlane/metadata/android/bn/changelogs/66.txt create mode 100644 fastlane/metadata/android/bn_BD/changelogs/63.txt create mode 100644 fastlane/metadata/android/bn_BD/changelogs/64.txt create mode 100644 fastlane/metadata/android/bn_BD/full_description.txt create mode 100644 fastlane/metadata/android/bn_BD/short_description.txt create mode 100644 fastlane/metadata/android/cs/changelogs/63.txt create mode 100644 fastlane/metadata/android/cs/changelogs/64.txt create mode 100644 fastlane/metadata/android/cs/changelogs/65.txt create mode 100644 fastlane/metadata/android/cs/changelogs/66.txt create mode 100644 fastlane/metadata/android/cs/changelogs/68.txt create mode 100644 fastlane/metadata/android/cs/changelogs/69.txt create mode 100644 fastlane/metadata/android/cs/changelogs/70.txt create mode 100644 fastlane/metadata/android/cs/changelogs/71.txt create mode 100644 fastlane/metadata/android/cs/changelogs/730.txt create mode 100644 fastlane/metadata/android/cs/changelogs/740.txt create mode 100644 fastlane/metadata/android/cs/changelogs/750.txt create mode 100644 fastlane/metadata/android/cs/changelogs/760.txt create mode 100644 fastlane/metadata/android/cs/changelogs/770.txt create mode 100644 fastlane/metadata/android/cs/changelogs/780.txt create mode 100644 fastlane/metadata/android/cs/changelogs/790.txt create mode 100644 fastlane/metadata/android/cs/changelogs/800.txt create mode 100644 fastlane/metadata/android/cs/changelogs/810.txt create mode 100644 fastlane/metadata/android/cs/changelogs/820.txt create mode 100644 fastlane/metadata/android/cs/changelogs/830.txt create mode 100644 fastlane/metadata/android/cs/changelogs/840.txt create mode 100644 fastlane/metadata/android/cs/changelogs/850.txt create mode 100644 fastlane/metadata/android/cs/changelogs/860.txt create mode 100644 fastlane/metadata/android/cs/changelogs/870.txt create mode 100644 fastlane/metadata/android/cs/changelogs/900.txt create mode 100644 fastlane/metadata/android/cs/changelogs/910.txt create mode 100644 fastlane/metadata/android/cs/changelogs/920.txt create mode 100644 fastlane/metadata/android/cs/changelogs/930.txt create mode 100644 fastlane/metadata/android/cs/changelogs/940.txt create mode 100644 fastlane/metadata/android/cs/changelogs/950.txt create mode 100644 fastlane/metadata/android/cs/changelogs/951.txt create mode 100644 fastlane/metadata/android/cs/changelogs/953.txt create mode 100644 fastlane/metadata/android/cs/changelogs/954.txt create mode 100644 fastlane/metadata/android/cs/changelogs/955.txt create mode 100644 fastlane/metadata/android/cs/changelogs/956.txt create mode 100644 fastlane/metadata/android/cs/changelogs/957.txt create mode 100644 fastlane/metadata/android/cs/changelogs/958.txt create mode 100644 fastlane/metadata/android/cs/changelogs/959.txt create mode 100644 fastlane/metadata/android/cs/changelogs/960.txt create mode 100644 fastlane/metadata/android/cs/changelogs/961.txt create mode 100644 fastlane/metadata/android/cs/changelogs/963.txt create mode 100644 fastlane/metadata/android/cs/changelogs/964.txt create mode 100644 fastlane/metadata/android/cs/changelogs/965.txt create mode 100644 fastlane/metadata/android/cs/changelogs/966.txt create mode 100644 fastlane/metadata/android/cs/changelogs/967.txt create mode 100644 fastlane/metadata/android/cs/changelogs/968.txt create mode 100644 fastlane/metadata/android/cs/changelogs/969.txt create mode 100644 fastlane/metadata/android/cs/changelogs/970.txt create mode 100644 fastlane/metadata/android/cs/changelogs/971.txt create mode 100644 fastlane/metadata/android/cs/changelogs/972.txt create mode 100644 fastlane/metadata/android/cs/changelogs/973.txt create mode 100644 fastlane/metadata/android/cs/changelogs/974.txt create mode 100644 fastlane/metadata/android/cs/changelogs/975.txt create mode 100644 fastlane/metadata/android/cs/changelogs/976.txt create mode 100644 fastlane/metadata/android/cs/changelogs/977.txt create mode 100644 fastlane/metadata/android/cs/changelogs/978.txt create mode 100644 fastlane/metadata/android/cs/changelogs/979.txt create mode 100644 fastlane/metadata/android/cs/changelogs/980.txt create mode 100644 fastlane/metadata/android/cs/changelogs/981.txt create mode 100644 fastlane/metadata/android/cs/changelogs/982.txt create mode 100644 fastlane/metadata/android/cs/changelogs/983.txt create mode 100644 fastlane/metadata/android/cs/changelogs/984.txt create mode 100644 fastlane/metadata/android/cs/changelogs/985.txt create mode 100644 fastlane/metadata/android/cs/changelogs/986.txt create mode 100644 fastlane/metadata/android/cs/changelogs/987.txt create mode 100644 fastlane/metadata/android/cs/changelogs/988.txt create mode 100644 fastlane/metadata/android/cs/changelogs/989.txt create mode 100644 fastlane/metadata/android/fr/changelogs/65.txt create mode 100644 fastlane/metadata/android/fr/changelogs/66.txt create mode 100644 fastlane/metadata/android/fr/changelogs/68.txt create mode 100644 fastlane/metadata/android/fr/changelogs/69.txt create mode 100644 fastlane/metadata/android/fr/changelogs/70.txt create mode 100644 fastlane/metadata/android/fr/changelogs/964.txt create mode 100644 fastlane/metadata/android/fr/changelogs/966.txt create mode 100644 fastlane/metadata/android/fr/changelogs/969.txt create mode 100644 fastlane/metadata/android/fr/changelogs/970.txt create mode 100644 fastlane/metadata/android/fr/changelogs/971.txt create mode 100644 fastlane/metadata/android/fr/changelogs/973.txt create mode 100644 fastlane/metadata/android/fr/changelogs/974.txt create mode 100644 fastlane/metadata/android/fr/changelogs/977.txt create mode 100644 fastlane/metadata/android/fr/changelogs/980.txt create mode 100644 fastlane/metadata/android/fr/changelogs/988.txt create mode 100644 fastlane/metadata/android/he/changelogs/988.txt create mode 100644 fastlane/metadata/android/hu/changelogs/65.txt create mode 100644 fastlane/metadata/android/it/changelogs/730.txt create mode 100644 fastlane/metadata/android/ko/changelogs/63.txt create mode 100644 fastlane/metadata/android/ko/changelogs/64.txt create mode 100644 fastlane/metadata/android/pl/changelogs/964.txt create mode 100644 fastlane/metadata/android/pl/changelogs/965.txt create mode 100644 fastlane/metadata/android/ru/changelogs/65.txt create mode 100644 fastlane/metadata/android/ru/changelogs/66.txt create mode 100644 fastlane/metadata/android/ru/changelogs/68.txt create mode 100644 fastlane/metadata/android/ru/changelogs/69.txt create mode 100644 fastlane/metadata/android/ru/changelogs/70.txt create mode 100644 fastlane/metadata/android/ru/changelogs/780.txt create mode 100644 fastlane/metadata/android/ru/changelogs/790.txt create mode 100644 fastlane/metadata/android/ru/changelogs/985.txt create mode 100644 fastlane/metadata/android/ru/changelogs/987.txt create mode 100644 fastlane/metadata/android/sk/changelogs/987.txt create mode 100644 fastlane/metadata/android/uk/changelogs/988.txt create mode 100644 fastlane/metadata/android/uk/changelogs/989.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/988.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/989.txt create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/988.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/988.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 71d849a2f5b..700a612b8c6 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -200,7 +200,7 @@ © %1$sبواسطة%2$sتحت%3$s صفحة الكشك حدد كشك - ابدأ التشغيل في الخلفية + بدأ التشغيل في الخلفية المحتوى الإفتراضي حسب البلد الإنتقال إلى التشغيل في الخلفية الإنتقال إلى التشغيل في النافذة المنبثقة @@ -250,7 +250,7 @@ لا يمكن أن يكون اسم الملف فارغًا حدث خطأٌ ما: %1$s ملف مضغوط ZIP غير صالح - إزالة الفواصل المرجعية + إزالة الإشارة المرجعية تناسب مع الشاشة توليد تلقائي إستيراد @@ -600,8 +600,8 @@ زر الإجراء الثالث زر الإجراء الثاني زر الإجراء الأول - قياس الصورة المصغرة للفيديو المعروض في الإشعار من 16:9 إلى 1:1 نسبة العرض إلى الارتفاع (قد يؤدي إلى تشوهات) - مقياس الصورة المصغرة إلى نسبة عرض إلى ارتفاع 1:1 + قم بقص الصورة المصغرة للفيديو الموضحة في الإشعار من نسبة العرض إلى الارتفاع 16: 9 إلى 1: 1 + اقتصاص الصورة المصغرة إلى نسبة العرض إلى الارتفاع 1:1 امسح ملفات تعريف الارتباط التي يخزنها NewPipe عند حل reCAPTCHA تم مسح ملفات تعريف الارتباط reCAPTCHA امسح ملفات تعريف الارتباط reCAPTCHA @@ -684,7 +684,7 @@ جودة منخفضة (أصغر) جودة عالية (أكبر) معاينة مصغرة على شريط التمرير - علّمه كفيديو تمت مشاهدته + تعليم كفيديو تمت مشاهدته أُعجب بها منشئ المحتوى أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة إظهار مؤشرات الصور @@ -769,4 +769,5 @@ تنسيق غير معروف جودة غير معروفة حجم الفاصل الزمني لتحميل التشغيل + عرض مقاطع الفيديو المستقبلية \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 2d9257e3c11..bd5948622a2 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -405,7 +405,7 @@ Sükut zamanı sürətlə irəlilə Yeni yayım bildirişləri Abunəliklərdən yeni yayımlar haqqında bildiriş göndər - Tezliyin yoxlanılması + Yoxlama tezliyi Tələb olunan şəbəkə bağlantısı İstənilən şəbəkə Tətbiq keçidində kiçildin @@ -496,7 +496,7 @@ Video oynadıcı Video fayl xülasəsi prosesi üçün bildirişlər Açın - Kiçik şəkili 1:1 aspekt nisbətinə ölçün + Miniatürü 1:1 aspekt nisbətinə kəsin Yükləmə intervalının həcmini dəyişdirin (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcının yenidən başladılmasını tələb edir. Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndürün Əlaqədar yayımı əlavə etməklə (təkrar etməyən) sonlanacaq oynatma sırasını davam etdir @@ -706,7 +706,7 @@ \nZəhmət olmasa ,Yaddaş Giriş Çərçivəsinə uyğun fayl menecerini quraşdırın. Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil. İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə bilər və keçidlər kliklənməyə bilər. - Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 nisbətinə qədər ölçün (pozuntulara səbəb ola bilər) + Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 nisbətinə qədər kəsin Aşağıdakı bildiriş fəaliyyətini hər birinin üzərinə toxunaraq redaktə edin. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərilməsi üçün onlardan üçə qədərini seçin Belə fayl/məzmun mənbəyi yoxdur Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir @@ -717,4 +717,5 @@ Naməlum format Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi + Gələcək videoları göstərin \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index dc13a16c292..5ac2b1db8ef 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -446,7 +446,7 @@ Лиценз %s посочва следната причина: Маркери - Достъпност + Поверителност Език Вътрешен Включен @@ -553,4 +553,17 @@ Показвай цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) Автоматична (тази на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) + Покажи гледани + Избете плейлист + Известия + Изчистване на бисквитките от reCAPTCHA + Бисквитките от reCAPTCHA бяха почистени + Проверяване за актуализации… + , + Провери за актуализации + Процент + Неизвестно качество + Неизвестен формат + Наскоро добавено + Буфериране \ No newline at end of file diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 02d35d384f1..1de4d3a5030 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -459,4 +459,5 @@ দেখা হিসেবে মার্ক করো ট্যাগসমূহ অ্যান্ড্রয়েডকে থাম্বনেইলের প্রধান রং অনুযায়ী রঙিন করুন (উল্লেখ্য যে, এটি সব ডিভাইসে উপলব্ধ নয়) + অজানা ধরন \ No newline at end of file diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index a1acf9fd18b..6a634a3a4e8 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -622,4 +622,6 @@ বাহ্যিক প্লেয়ারের জন্য কোনো অডিও স্ট্রিম নেই বাহ্যিক প্লেয়ারের জন্য কোনো ভিডিও স্ট্রিম নেই অজ্ঞাত মান + নতুন ধারার বিজ্ঞপ্তি + নেটওয়ার্ক সংযোগ দরকার \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2e840629ddd..8ab1e2584b7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -366,7 +366,7 @@ Vyčkávání Pozastaveno ve frontě - post-processing + zpracování Zařadit do fronty Akce odmítnuta systémem Stahování se nezdařilo @@ -384,7 +384,7 @@ Server neposílá data Server neakceptuje vícevláknové stahování, opakujte akci s @string/msg_threads = 1 Nenalezeno - Post-processing selhal + Zpracování selhalo Zastavit Maximální počet pokusů o opakování Maximální počet pokusů před zrušením stahování @@ -570,8 +570,8 @@ Třetí akční tlačítko Druhé akční tlačítko První akční tlačítko - Zmenšit miniaturu videa zobrazenou v oznámení z poměru stran 16: 9 na 1: 1 (může způsobit zkreslení) - Změnit poměr stran miniatury na 1:1 + Oříznout miniaturu videa zobrazenou v oznámení z poměru stran 16:9 na 1:1 + Oříznout poměr stran miniatury na 1:1 Ukázat memory leaks Zařazeno do fronty Zařadit do fronty @@ -584,10 +584,10 @@ Přibarvit oznámení Použít miniaturu pro pozadí zamknuté obrazovky a oznámení Zobrazit miniaturu - Oznámení o hašování videa + Oznámení o hashování Nedávné - Počítám haš - Oznámení o postupu hašování videa + Počítám hash + Oznámení o postupu hashování videa Vypnout, abyste skryli rámečky s meta informací s údaji o autorovi streamu, obsahu streamu nebo požadavků hledání Zobrazit meta informaci Kapitoly @@ -596,7 +596,7 @@ Zobrazit popis Otevřít s Na Vašem zařízení není aplikace, která to umí otevřít - Podobné strýmy + Podobné položky Vypnout pro skrytí popisu videa a doplňkové informace Zbořit aplikaci Stahování bylo zahájeno @@ -683,7 +683,7 @@ Vytvořit oznámení o chybě Kontrola aktualizací… Ukázat „Shodit přehrávač“ - Nové položky feedů + Nové položky Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nProsím, nainstalujte správce souborů kompatibilní se Storage Access Framework. Oznámení o hlášení chyb @@ -697,29 +697,38 @@ Změnit interval načítání (aktuálně %s). Menší hodnota může zrychlit počáteční načítání videa. Změna vyžaduje restart přehrávače. LeakCanary není dostupné Výchozí ExoPlayer - Nastavit oznámení k právě přehrávanému strýmu - Oznámení o nových strýmech - Oznámit o nových strýmech k objednání + Nastavit oznámení o právě přehrávaném streamu + Oznámení o nových streamech + Oznámit o nových strýmech od vašich odběrů Frekvence kontroly Jakákoli síť Nutné síťové připojení Smazat všechny stažené soubory z disku\? Objednali jste si nyní tento kanál Všechny přepnout - Nové strýmy - Oznámení o nových strýmech k objednání - Spustit kontrolu nových strýmů - Oznámení přehrávače + Nové streamy + Oznámení o nových streamech od odběrů + Spustit kontrolu nových streamů + Upozornění přehrávače Oznámení - Načítám podrobnosti o strýmu… + Načítám podrobnosti o streamu… Oznámení jsou vypnuta Přijímat oznámení , - %s nový strým - %s nové strýmy - %s nových strýmů + %s nový stream + %s nové streamy + %s nových streamů Procento Půltón + Velikost intervalu načtení přehrávání + Vybraný stream není podporován externími přehrávači + U externích přehrávačů nejsou dostupné žádné zvukové streamy + Neznámý formát + Neznámá kvalita + Zobrazit nadcházející videa + Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny + Vyberte kvalitu pro externí přehrávače + U externích přehrávačů nejsou dostupné žádné video streamy \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4c8e9cfe1cf..5ff079f7a90 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ Veröffentlicht am %1$s - Kein Stream-Player gefunden. Möchtest du den VLC installieren\? + Kein Stream-Player gefunden. Möchtest du VLC installieren\? Installieren Abbrechen Im Browser öffnen @@ -161,7 +161,7 @@ Die meisten Sonderzeichen Wiedergabe fortsetzen Player - Nichts hier außer dem Zirpen der Grillen + Nichts hier, außer dem Zirpen der Grillen Möchtest du dieses Element aus dem Suchverlauf löschen\? Leere Seite Einen Kanal auswählen @@ -558,8 +558,8 @@ Dritte Aktionstaste Zweite Aktionstaste Erste Aktionstaste - Skaliert das in der Benachrichtigung angezeigte Vorschaubild von 16:9 auf ein 1:1 Seitenverhältnis (kann zu Verzerrungen führen) - Vorschaubild auf 1:1 Seitenverhältnis skalieren + Beschneidet das in der Benachrichtigung angezeigte Video-Vorschaubild von 16:9 auf ein 1:1 Seitenverhältnis + Vorschaubild auf 1:1 Seitenverhältnis zuschneiden Zufällig Puffern Wiederholen @@ -717,4 +717,5 @@ Streams, die noch nicht vom Downloader unterstützt werden, werden nicht angezeigt Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe + Zukünftige Videos anzeigen \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index d9239547ba4..b1b11e24d4e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -498,8 +498,8 @@ Κουμπί τρίτης ενέργειας Κουμπί δεύτερης ενέργειας Κουμπί πρώτης ενέργειας - Κλιμάκωση της μικρογραφίας βίντεο που εμφανίζεται στην ειδοποίηση από 16:9 σε αναλογία διαστάσεων 1:1 (μπορεί να προκαλέσει παραμορφώσεις) - Κλιμάκωση μικρογραφίας σε αναλογία διαστάσεων 1:1 + Περικοπή της μικρογραφίας βίντεο που εμφανίζεται στην ειδοποίηση από 16:9 σε αναλογία διαστάσεων 1:1 + Περικοπή μικρογραφίας σε αναλογία διαστάσεων 1:1 Φόρτωση Πιστεύετε ότι η ροή φορτώνει πολύ αργά; Δοκιμάστε να ενεργοποιήσετε τη γρήγορη φόρτωση (από τις ρυθμίσεις ή πατώντας το παρακάτω κουμπί). \n @@ -717,4 +717,5 @@ Άγνωστος τύπος αρχείου Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής - + Εμφάνιση μελλοντικών βίντεο + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 56d529b0484..edf4769e814 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -544,7 +544,7 @@ Copiar informe con formato Mostrando resultados para: %s Orden aleatorio - Escalar miniatura a relación de aspecto 1:1 + Recortar miniatura a relación de aspecto 1:1 Nunca Solo en Wi-Fi Comenzar reproducción automáticamente — %s @@ -558,13 +558,13 @@ Almacenar en memoria (búfer) Repetir ¡Puedes seleccionar como máximo tres acciones para mostrar en la notificación compacta! - Edita cada acción de notificación debajo pulsando sobre ella. Selecciona hasta tres de ellas para que aparezcan en la notificación compacta usando las casillas de verificación a la derecha + Edita cada una de las acciones en la notificación pulsando sobre ellas. Selecciona hasta tres de ellas para mostrarlas en la notificación compacta usando las casillas de verificación de la derecha. Botón de quinta acción Botón de cuarta acción Botón de tercera acción Botón de segunda acción Botón de primera acción - Escalar la relación de aspecto de la miniatura del vídeo mostrada en la notificación de 16:9 a 1:1 (puede ocasionar distorsiones) + Recortar la relación de aspecto de la miniatura del vídeo mostrada en la notificación de 16:9 a 1:1 Vaciar las cookies que NewPipe guarda al resolver un reCAPTCHA Mostrar contenido inapropiado para niños porque tiene un limite de edad (como 18+) Mostrar pérdidas de memoria @@ -574,7 +574,7 @@ Limpiar las cookies reCAPTCHA YouTube provee un «Modo restringido», el cual oculta contenido potencialmente solo apto para adultos Ajustar color de notificación - Permitir a Android personalizar el color de la notificación con el color principal de la imagen (ten en cuenta que esta opción no funciona en todos los dispositivos) + Permitir a Android personalizar el color de la notificación usando el color principal de la miniatura (ten en cuenta que esta opción no funciona en todos los dispositivos) Usar miniatura como fondo de pantalla de bloqueo y notificaciones Mostrar vista previa Desactivar para ocultar información adicional sobre el creador o contenido de la transmisión @@ -603,7 +603,7 @@ La descarga ha comenzado Resolver Puedes seleccionar tu tema nocturno favorito a continuación - Tema de Noche + Modo oscuro Selecciona tu tema nocturno favorito — %s Automático (tema del dispositivo) Mostrar detalles del canal @@ -719,4 +719,6 @@ Elija la calidad para reproductores externos Formato desconocido Calidad desconocida + Mostrar videos futuros + Tamaño del intervalo de carga de reproducción \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 11b5266b04c..2d776155c2d 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -426,8 +426,8 @@ Kolmas tegevusnupp Teine tegevusnupp Esimene tegevusnupp - Skaleeri teavituses kuvatav video pisipilt 16:9 külgede suhtest 1:1 suhtesse (võib põhjustada häireid) - Skaleeri pisipilt 1:1 küljesuhtesse + Kadreeri teavituses kuvatav video pisipilt 16:9 külgede suhtest 1:1 suhtesse + Kadreeri pisipilt 1:1 küljesuhtesse Arvutan räsi Hiljutised Kirjeldus @@ -716,4 +716,6 @@ Valitud meediavood ei ole toetatud välises pleieris Protsent Pooltoon + Taasesituseks vajalike andmete laadimise samm + Näita tulevasi videoid \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 8098db146dc..c2d92c517c3 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -562,8 +562,8 @@ Hirugarren ekintzaren botoia Bigarren ekintzaren botoia Lehenego ekintzaren botoia - Eskalatu jakinarazpenetan erakusten den bideo miniaturaren formatu-ratioa 16:9tik 1:1era (distortsioak sor ditzake) - Miniatura 1:1 formatu-ratiora eskalatu + Ebaki jakinarazpenetan erakusten den bideo miniaturaren formatu-ratioa 16:9tik 1:1era + Miniatura 1:1 formatu-ratiora ebaki %s bilaketaren erantzunak erakusten Ilaran jarri da Jarri ilaran @@ -709,4 +709,13 @@ Beharrezko sare konexioa Portzentaia Semitonoa + Erreprodukzioaren kargatze-tartearen tamaina + Deskargatzaileak onartzen ez dituen jarioak ez dira erakusten + Hautatutako jarioa ez dago kanpoko erreproduzigailu batengatik onartuta + Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen audio jariorik + Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik + Formatu ezezaguna + Kalitate ezezaguna + Erakutsi etorkizuneko bideoak + Hautatu kanpoko erreproduzigailuen kalitatea \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 97fd534f12e..6b607b6ae50 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -557,8 +557,8 @@ سومین دکمه کنشی دومین دکمه کنشی اولین دکمه کنشی - تصویر بندانگشتی ویدیو که در اعلان نمایش می‌یابد، از نسبت ۱۶:۹ به ۱:۱ تغییر اندازه پیدا کند (ممکن است منجر به اعوجاج شود) - تغییر مقیاس تصویر بندانگشتی به نسبت ۱:۱ + تصویر بندانگشتی ویدیو که در اعلان نمایش می‌یابد، از نسبت ۱۶:۹ به ۱:۱ بریده می‌شود + برش تصویر بندانگشتی به نسبت ۱:۱ کیفیت پایین (کوچک‌تر) کیفیت بالا (بزرگ‌تر) نظرها از کار افتاده‌اند @@ -716,4 +716,6 @@ گزینش کیفیت برای پخش‌کننده‌های خارجی قالب ناشناخته کیفیت ناشناخته + اندازهٔ دورهٔ بار کردن پخش + نمایش ویدیوهای آینده \ No newline at end of file diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index d8c6682d64e..758e522cd5a 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -12,7 +12,7 @@ I-download I-download ang stream file Maghanap - Ayos ng App + Pagsasaayos \"%1$s\" ba ang tinutukoy mo\? Ibahagi sa Gumamit ng ibang video player @@ -30,7 +30,7 @@ Pumili ng Tab Anong Bago Likuran - Popup + Naka-lutang Idagdag sa Download folder ng mga video Pumili ng download folder para sa mga video file @@ -257,4 +257,7 @@ Notipikasyon ng player Mga track Mga gumagamit + Hangganan ng Edad + Oo, pati na rin ang mga napanood nang video + Kusa (tema ng device) \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e09f292b02f..4a79fbea9a2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -6,7 +6,7 @@ Télécharger Dossier de téléchargement vidéo Choisissez le dossier de téléchargement des vidéos - Les fichiers vidéo téléchargés sont stockées ici + Les vidéos téléchargées sont stockées ici Installer Installer l’application Kore manquante \? Aucun lecteur de flux trouvé. Installer VLC \? @@ -99,7 +99,7 @@ Seuls certains appareils peuvent lire des vidéos 2K/4K Format vidéo par défaut Mémoriser les propriétés de la fenêtre flottante - Mémorise les dernières taille et position de la fenêtre flottante + Mémoriser les dernières taille et position de la fenêtre flottante Effacer G Le son peut être absent à certaines définitions @@ -551,7 +551,7 @@ Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \? Ajouter automatiquement à la liste de lecture La liste de lecture du lecteur actif sera remplacée - Confirmer avant de supprimer la liste de lecture + Confirmer avant de supprimer une liste de lecture Rien Chargement Lire aléatoirement @@ -563,8 +563,8 @@ Troisième bouton d’action Deuxième bouton d’action Premier bouton d’action - Mettre à l\'échelle la miniature de la vidéo affichée dans la notification du format 16:9 au format 1:1 (peut provoquer des déformations) - Redimensionner la miniature au format 1:1 + Recadrer la miniature de la vidéo affichée dans la notification du format 16:9 au format 1:1 + Recadrer la miniature au format 1:1 Afficher les fuites de mémoire Ajouté à la file d’attente Ajouter à la file d’attente @@ -663,8 +663,8 @@ Balayez un élément pour le supprimer Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran Lancer le lecteur principal en plein écran - Ajouter à la liste de lecture - Suivant dans la liste de lecture + Lire consécutivement + Video placée après la lecture Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… @@ -719,4 +719,5 @@ Le flux séléctionné n\'est pas supporté par les lecteurs externes Aucun flux vidéo n\'est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture + Afficher les futures vidéos \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 5cf8abcf0d4..701d1b8cc75 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -548,8 +548,8 @@ Terceiro botón de acción Cuarto botón de acción Quinto botón de acción - Escalar a miniatura do vídeo amosado na notificación da relación de aspecto 16:9 a 1:1 (pode intruducir distorsións) - Escala miniatura á relación de aspecto 1:1 + Cortar a miniatura do vídeo amosado na notificación da relación de aspecto 16:9 a 1:1 + Cortar miniatura á relación de aspecto 1:1 Apagado Modo tableta Abrir sitio Web @@ -709,4 +709,13 @@ As notificacións están desactivadas Recibir notificacións Agora está subscrito a esta canle + Emisións non soportadas polo descarregador non son mostradas + Seleccione a calidade para reprodutores externos + Formato descoñecido + Calidade descoñecida + Tamaño do intervalo de carregamento da reprodución + As emisións seleccionadas non son soportadas polos reprodutores externos + Non hai emisións de vídeo dispoñíbeis para reprodutores externos + Ver futuros vídeos + Non hai emisións de audio dispoñíbeis para reprodutores externos \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index de5128493a2..b9056922a5c 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -580,8 +580,8 @@ כפתור פעולה שלישי כפתור פעולה ראשון כפתור פעולה שני - לשנות את יחס התצוגה הממוזערת שמופיעה בהתראות מיחס תצוגה של 16:9 ל־1:1 (עשוי לעוות את התמונה) - שינוי גודל התצוגה הממוזערת ליחס תצוגה 1:1 + חיתוך התצוגה הממוזערת שמופיעה בהתראות מיחס תצוגה של 16:9 ל־1:1 + חיתוך התצוגה הממוזערת ליחס תצוגה 1:1 הצגת דליפות זיכרון נוסף לתור הוספה לתור @@ -742,4 +742,6 @@ אין תזרימי וידאו שזמינים לנגנים חיצוניים בחירת איכות לנגנים חיצוניים תצורה לא מוכרת + גודל משך טעינת נגינה + הצגת סרטונים עתידיים \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index cb7db9f44c6..439835e06bd 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -1,63 +1,63 @@ - Za početak dodirnite povećalo. + Počni dodirom na povećalo. Objavljeno %1$s - Reproduktor za stream nije pronađen. Instalirati VLC\? + Nije pronađen nijedan player streamova. Želiš li instalirati VLC\? Instaliraj Odustani Otvori u pregledniku Otvori skočni prozor - Podijeli + Dijeli Preuzimanje - Pretraživanje + Pretraga Postavke - Jeste li mislili „%1$s”\? - Podijeli pomoću - Koristi vanjski reproduktor videozapisa - Uklanja zvuk pri nekim rezolucijama - Koristi vanjski reproduktor za zvuk + Misliš li „%1$s”\? + Dijeli s + Koristi vanjski video player + Uklanja audiosnimku pri nekim rezolucijama + Koristi vanjski audio player Pretplati se Pretplaćeno - Pretplata na kanalu otkazana - Nije moguće promijeniti pretplatu - Nije moguće osvježiti pretplatu + Pretplata na kanal otkazana + Nije bilo moguće promijeniti pretplatu + Nije bilo moguće aktualizirati pretplatu Pretplate Što je novo Pozadina Skočni prozor Mapa za preuzimanje videozapisa - Preuzeti videozapisi spremaju se ovdje - Odaberi mapu za preuzimanje videozapisa - Mapa za preuzimanje zvuka - Preuzete audio-datoteke spremaju se ovdje - Odaberi mapu za preuzimanje audio-datoteka - Standardna rezolucija - Standardna rezolucija skočnog prozora - Prikaži više rezolucije - Samo neki uređaji podržavaju reprodukciju 2K/4K videozapisa + Preuzete video datoteke se spremaju ovdje + Odaberi mapu za preuzimanje video datoteka + Mapa za preuzimanje audiosnimaka + Preuzete datoteke audiosnimaka se spremaju ovdje + Odaberi mapu za preuzimanje datoteka audiosnimaka + Zadana rezolucija + Zadana rezolucija skočnog prozora + Prikaži veće rezolucije + Samo neki uređaji podržavaju reprodukciju 2K/4K videa Reproduciraj s Kodijem Instalirati nedostajući Kore program\? - Prikaži opciju \"Reproduciraj putem Kodija\" + Prikaži opciju „Reproduciraj pomoću Kodija” Prikaži opciju za reproduciranje videozapisa putem Kodija - Zvuk - Zadani format zvuka - Zadani format videozapisa + Audiosnimka + Zadani audio format + Zadani video format Tema Svijetla Tamna Crna Zapamti veličinu i poziciju skočnog prozora Zapamti posljednju veličinu i poziciju skočnog prozora - Prijedlozi pri traženju + Prijedlozi pretrage Odaberi prijedloge koji se prikazuju pri traženju Povijest pretraživanja - Svaku pretragu spremi lokalno - Pregledna Povijest - Spremaj povijest gledanja + Spremi pretrage lokalno + Povijest gledanja + Prati gledana videa Nastavi reprodukciju Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi) Preuzmi - Prikaži \'Sljedeće\' i \'Slične\' videozapise + Prikaži videa „Sljedeći” i „Slični” URL nije podržan Zadani jezik sadržaja Video i audio @@ -76,11 +76,11 @@ Najbolja rezolucija Greška Greška u mreži - Nije moguće učitati sve ikone - Nije moguće dešifrirati URL potpis videozapisa - Nije moguće dohvatiti stranicu + Nije bilo moguće učitati sve sličice + Nije bilo moguće dešifrirati URL potpis videozapisa + Nije bilo moguće obraditi stranicu Sadržaj nije dostupan - Nije moguće postaviti izbornik za preuzimanje + Nije bilo moguće postaviti izbornik za preuzimanje Program/korisničko sučelje su preknuli raditi Oprosti, ovo se nije trebalo dogoditi. Prijavi pogrešku putem e-maila @@ -89,14 +89,14 @@ Informacije: Što se dogodilo: Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik programa:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: - Vaš komentar (na engleskom): + Tvoj komentar (na engleskom): Detalji: Pokreni video, trajanje: - Profilna slika prenositelja - Goreglasovi - Doljeglasovi - Videozapis - Zvuk + Sličica avatara prenositelja + Sviđanja + Nesviđanja + Video + Audio Pokušaj ponovo tis. mil @@ -104,26 +104,26 @@ Počni Pauziraj Izbriši - Kontrolna suma + Kontrolni zbroj U redu Naziv datoteke - Niti + Komponente procesa Greška - NewPipe preuzima - Dodirni za detalje - Molimo pričekajte… + NewPipe preuzimanje + Dodirni za prikaz detalja + Pričekaj … Kopirano u međuspremnik - Molimo kasnije u postavkama odaberite mapu za preuzimanje + Odaberi mapu za preuzimanje kasnije u postavkama Ova dozvola je potrebna za \notvaranje skočnog prozora reCAPTCHA zadatak - Traži se reCAPTCHA zadatak + Zatražen je reCAPTCHA zadatak Preuzimanja Dozvoljeni znakovi u nazivima datoteka Nedozvoljeni znakovi su zamjenjeni ovima Znak za zamjenu Slova i brojevi - Posebni znakovi + Najviše posebnih znakova O NewPipeu Licence treće strane © %1$s od %2$s pod %3$s @@ -131,15 +131,15 @@ Licence Slobodan i mali YouTube program za Android. Pogledaj na GitHubu - Licenca za NewPipe + NewPipe licenca Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo! Pročitaj licencu Doprinos Povijest Povijest NewPipe obavijest - Obavijesti za NewPipe reproduktore - Reproduktor + Obavijesti za NewPipe playera + Player Ponašanje Povijest i predmemorija Poništi @@ -155,70 +155,70 @@ %s pregled %s pregleda - %s pregledi + %s pregleda - Nema videozapisa + Nema videa - %s videozapis - %s videozapisa - %s videozapisa + %s video + %s videa + %s videa Reproduciraj sve - Nije moguće reproducirati ovaj stream - Dogodila se neoporavljiva greška reproduktora - Oporavljanje od greške reproduktora + Nije bilo moguće reproducirati ovaj stream + Dogodila se neoporavljiva greška playera + Oporavljanje od greške playera Prikaži savjet za držanje - Prikaži savjet kad se pritisne gumb za pozadinsku ili skočni prozor u detaljima videa: - Želite li izbrisati ovu stavku iz povijesti pretraživanja? + Prikaži savjet kad se pritisne gumb za pozadinu ili skočni gumb u videu „Detalji:” + Želiš li izbrisati ovu stavku iz povijesti pretrage\? Sadržaj Prazna stranica - Kiosk stranica - Kanal - Odaberite kanal - Niste pretplaćeni na nijedan kanal - Odaberite kiosk + Stranica kioska + Stranica kanala + Odaberi kanal + Još nema pretplata na nijedan kanal + Odaberi jedan kiosk U trendu - Vrh 50 - Novo i popularno + 50 najboljih + Novi i popularni Ukloni Detalji - Postavke zvuka + Postavke za audiosnimke Drži pritisnuto za dodavanje u popis izvođenja [Nepoznato] Doniraj - Web stranica + Web-stranica Započni reprodukciju u pozadini Reproduciraj u skočnom prozoru Otvori ladicu Zatvori ladicu - Video reproduktor - Pozadinski reproduktor - Skočni reproduktor + Video player + Pozadinski player + Skočni player Uvjek pitaj Dohvaćanje podataka … - Učitava se odabrani sadržaj + Učitavanje traženog sadržaja Nova playlista Preimenuj Ime Dodaj u playlistu - Postavi kao minijaturu playliste + Postavi kao sličicu playliste Zabilježi playlistu Ukloni zabilješku Izbrisati ovu playlistu\? Playlista je stvorena - Dodano kao playlistu - Minijatura playliste se promijenila. + Dodano u playlistu + Sličica playliste je promijenjena. Bez titlova - Popuni - Ispuniti - Povećaj - Auto generirano + Prilagodi + Ispuni + Zumiraj + Automatski generirani Praćenje curenja memorije može uzrokovati greške u radu programa prilikom odlaganje gomile Izvijesti o krajevima životnog ciklusa Prikaži informacije - Zabilježeni popisi + Zabilježene playliste Dodaj u - Učitaj slike + Učitaj sličice Slikovna predmemorija obrisana Izbriši metapodatke iz predmemorije Kanali @@ -233,7 +233,7 @@ Prijeđi na glavni Uvezi bazu podataka Izvezi bazu podataka - Poništava vašu trenutačnu povijest, pretplate, playliste i (opcionalno) postavke + Poništava tvoju trenutačnu povijest, pretplate, playliste i (opcionalno) postavke Izvezi povijest, pretplate, playliste i postavke Izbriši povijest gledanja Briše povijest reproduciranih streamova i pozicije reprodukcije @@ -245,29 +245,29 @@ Nema takve mape Naziv datoteke ne može biti prazan Dogodila se greška: %1$s - Povucite za promjenu redoslijeda + Povuci za promjenu redoslijeda Stvori Odbaci Preimenuj 1 stavka izbrisana. Nijedan program nije instaliran za reprodukciju ove datoteke Vrati - Posjetite web stranicu NewPipe za više informacija i vijesti. - NewPipeova pravila o privatnosti - Pročitajte pravila o privatnosti + Posjeti NewPipe web-stranicu za više informacija i vijesti. + NewPipe pravila o privatnosti + Pročitaj pravila o privatnosti Zadnje svirano - Najviše svirano + Najviše reproducirano Izvezeno Uvezeno Nema važeće ZIP datoteke Upozorenje: Nije moguće uvesti sve datoteke. - Ovo će poništiti vaše trenutne postavke. - Želite li također uvesti postavke? + Ovo će prepisati tvoje trenutačne postavke. + Želiš li također uvesti postavke\? Uvoz Uvoz iz Izvoz u - Uvoz… - Izvoz… + Uvoz … + Izvoz … Uvoz datoteke Prethodni izvoz Nije bilo moguće uvesti pretplate @@ -277,14 +277,14 @@ \n1. Idi na ovaj URL: %1$s \n2. Prijavi se \n3. Pritisni „Uključeni svi podaci”, zatim „Poništi odabir svih”, a zatim odaberi samo „pretplate” i pritisni „U redu” -\n4. Pritisni na „Nastavi”, a zatim „Stvori izvoz” -\n5. Pritisni na „Preuzmi” -\n6. Dolje pritisni na UVEZI DATOEKU i odaberi .zip datoteku za peuzimanje -\n7. [Ako uvoz .zip datoteke ne uspije] Izdvoji .csv datoteku (pod \"YouTube and YouTube Music/subscriptions/subscriptions.json\"). Dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku - vašID, soundcloud.com/vašID - Uzmite u obzir da ova operacija može uzrokovat veliku potrošnju prometa. +\n4. Pritisni „Sljedeći korak”, a zatim „Stvori izvoz” +\n5. Pritisni gumb „Preuzmi” nakon što se pojavi +\n6. Dolje pritisni UVEZI DATOEKU i odaberi preuzetu .zip datoteku +\n7. [Ako uvoz .zip datoteke ne uspije] izdvoji .csv datoteku (pod „YouTube and YouTube Music/subscriptions/subscriptions.json”), dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku + tvojID, soundcloud.com/tvojid + Ova operacija može prouzročiti veliku potrošnju mrežnog prometa. \n -\nŽelite li nastaviti? +\nŽeliš li nastaviti\? Kontrole brzine reprodukcije Premotaj naprijed tijekom šutnje Korak @@ -294,19 +294,19 @@ Bez ograničenja Ograniči rezoluciju tijekom korištenja mobilnih podataka Nijedan - Reproduktor za stream nije pronađen (možeš instalirati VLC za reprodukciju). + Nije pronađen nijedan player streamova (možeš instalirati VLC za reprodukciju). Preuzmi datoteku streama Koristi brzo netočno premotavanje - Netočno premotavanje omogućava reproduktoru da premota brže uz manju točnost. Premotavanje od 5, 15 ili 25 sekundi s ovime nije moguće + Netočno premotavanje omogućuje playeru brže premotavanje uz manju točnost. Premotavanje od 5, 15 ili 25 sekundi s ovime ne radi Otkaži pretplatu Odaberi karticu - Ažuriranja + Aktualiziranja Događaji Datoteka obrisana Obavijest za nove NewPipe verzije Briše povijest ključnih riječi pretraživanja Vanjska pohrana nije dostupna - Ažuriranja + Aktualiziranja Prikaži obavijest i zatraži aktualiziranje programa kad je dostupna nova verzija Popis Popločeno @@ -314,51 +314,51 @@ Dodirni za preuzimanje Preuzimanje nije uspjelo Prikaži pogrešku - Isključi za sprječavanje učitavanja sličica, čime se štede podatci i memorija. Promjena postavke čisti predmemoriju u radnoj memoriji i u pohrani + Isključi za sprečavanje učitavanja sličica, čime se štedi korištenje podataka i memorije. Promjene čiste predmemoriju slika radne memorije i diska Izbriši sve podatke web-stranica iz predmemorije Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja - Nastavi završavati (ne ponavljajući) popis izvođenja dodavanjem povezanog streama + Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama Kontrola glasnoće pomoću gesti - Koristi geste za kontrolu glasnoće + Koristi geste za upravljanje glasnoćom playera Kontrola svjetline pomoću gesti - Koristi gesture za kontrolu svjetline + Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja Otkrivanje grešaka Obavijest o novoj verziji programa Preuzimanje na vanjsku SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje\? - Vanjski reproduktori ne podržavaju ove vrste veza + Vanjski playeri ne podržavaju ove vrste poveznica Nije pronađen nijedan videozapis - Nije pronađen nijedan audio zapis + Nije pronađena nijedna audiosnimka Nema takve datoteke/izvora sadržaja Datoteka ne postoji ili joj nedostaje dopuštenje za čitanje ili pisanje Nema dostupnih zapisa za preuzimanje - Neuspjelo čitanje spremljenih kartica, stoga se koriste zadane - Vratiti zadane - Želite li vratiti zadane postavke\? + Nije bilo moguće čitati spremljene kartice, stoga se koriste zadane + Obnovi standardne vrijednosti + Želiš li obnoviti standardne vrijednosti\? Broj pretplatnika nije dostupan - NewPipe razvijaju volonteri koji provode vrijeme donoseći vam najbolje iskustvo. Vratite im kako biste programerima učinili da NewPipe bude još bolji dok uživate u šalici kave. + NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. Koje su kartice prikazane na glavnoj stranici Konferencije - Željena radnja otvaranja streama + Željena radnja za otvaranje Zadana radnja pri otvaranju sadržaja — %s Titlovi - Promijeni veličinu podnaslova reproduktora i pozadinske stilove reproduktora. Za stupanje na snagu, program se mora ponovo pokrenuti - Prisilno izvješćivanje o greškama Rx-a koje se ne mogu isporučiti izvan \'fragmenta\' ili životnog ciklusa aktivnosti nakon odlaganja - Uvezite SoundCloud profil tako da upišete URL ili svoj ID: + Promijeni veličinu podnaslova i pozadinske stilove playera. Zahtijeva ponovno pokretanje programa + Prisilno izvijesti o neisporučivim Rx iznimaka izvan fragmenta ili životnog ciklusa aktivnosti nakon odlaganja + Uvezi SoundCloud profil upisom URL-a ili svog ID-a: \n -\n1. Omogućite \"način rada na radnoj površini\" u web-pregledniku (stranica nije dostupna na mobilnim uređajima) -\n2. Idite na ovaj URL: %1$s -\n3. Ulogirajte se -\n4. Kopirajte URL profila na koji ste preusmjereni. - brzina +\n1. Omogući „način rada na radnoj površini” u web-pregledniku (stranica nije dostupna na mobilnim uređajima) +\n2. Idi na ovaj URL: %1$s +\n3. Prijavi se +\n4. Kopiraj URL profila na koji te se preusmjerava. + Brzina Visina tona Odspoji (može prouzročiti izobličenje) - Sklopi prilikom mijenjanje programa - Radnja prilikom prebacivanja na drugi program iz glavnog video reproduktora – %s - Smanji na pozadinski reproduktor - Smanji na skočni reproduktor - Način prikaza popisa + Smanji prilikom mijenjanje programa + Radnja prilikom prebacivanja na drugi program iz glavnog video playera – %s + Smanji na pozadinski player + Smanji na skočni player + Način prikaza kao popis Automatski Gotovo Na čekanju @@ -367,18 +367,18 @@ naknadna obrada Popis izvođenja Sustav je odbio radnju - Generirajte jedinstveni naziv + Generiraj jedinstveni naziv Prepiši Datoteka s tim nazivom već postoji Preuzeta datoteka s tim nazivom već postoji Datoteka s ovim nazivom se već preuzima Odredišna mapa ne može biti stvorena Datoteka se ne može stvoriti - Nije moguće uspostaviti sigurnu vezu - Nije moguće pronaći server + Nije bilo moguće uspostaviti sigurnu vezu + Nije bilo moguće pronaći server Nije moguće povezati se s serverom Server ne šalje podatke - Poslužitelj ne prihvaća preuzimanja s više niti, pokušaj ponovo s @string/msg_threads = 1 + Poslužitelj ne prihvaća preuzimanja višestrukih procesa, pokušaj ponovo s @string/msg_threads = 1 Nije pronađeno Naknadna obrada nije uspjela Stop @@ -390,23 +390,23 @@ Isključi, kako bi se komentari sakrili Automatska reprodukcija Nema komentara - Komentare nije moguće učitati + Nije bilo moguće učitati komentare Zatvori - NewPipe je copyleft libre software: Može se koristiti, proučavati i poboljšavati po volji. Konkretno, može se redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila Free Software Foundation, bilo licence verzije 3, ili (po vlastitom izboru) bilo koje kasnije verzije. + NewPipe je copyleft libre softver: Može se koristiti, proučavati i poboljšavati po volji. Konkretno, može se redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila zaklada Free Software Foundation, pod verzijom 3 licence, ili (po vlastitom izboru) bilo koje kasnije verzije. Projekt NewPipe ozbiljno shvaća tvou privatnost. Stoga program ne prikuplja nikakve podatke bez tvog pristanka. \nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada programa. - Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), upozoravamo vas na politiku privatnosti tvrtke NewPipe. Pažljivo ga pročitajte. -\nZa slanje izvješća o pogreškama potrebno je prihvatiti politiku privatnosti. + Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), ovime upozoravamo na NewPipe politiku privatnosti. Pažljivo je pročitaj. +\nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti. Nastavi reprodukciju - Vrati zadnji položaj reprodukcije + Obnovi zadnji položaj reprodukcije Pozicije na popisima - Prikaži poziciju reprodukcije na listi + Prikaži poziciju reprodukcije u popisima Obriši podatke Pozicije reprodukcije su izbrisane Datoteka je premještena ili izbrisana Datoteka s ovim nazivom već čeka na preuzimanje Vrijeme povezanosti je isteklo - Želite li očistiti povijest preuzimanja ili izbrisati sve preuzete datoteke\? + Želiš li izbrisati povijest preuzimanja ili izbrisati sve preuzete datoteke\? Započni preuzimanja Zaustavi preuzimanja Pitaj gdje preuzeti @@ -416,50 +416,50 @@ Nitko ne gleda Nitko ne sluša Jezik će se promijeniti nakon ponovnog pokretanja programa - Zadani Kiosk + Standardni kiosk Podržani su samo HTTP URL-ovi - Lokalno - Nedavno dodano - Autogenerirano (prenositelj nedefiniran) + Lokalni + Nedavno dodani + Automatski generirano (prenositelj nedefiniran) Očisti povijest preuzimanja Izbriši preuzete datoteke Dopusti prikaz iznad drugih programa Jezik programa Zadani sustav - Videozapisi - Isključi + Videa + Isključi zvuk Uključi Pomoć - Učitavanje feeda… - Želite li izbrisati ovu grupu\? - Novi - Uvijek ažuriraj + Učitavanje feeda … + Želiš li izbrisati ovu grupu\? + Nova + Uvijek aktualiziraj Omogući brz način Onemogući brz način Memorija uređaja je popunjena - Najomiljenije - Pritisnite \"Gotovo\" kad riješeno + Najomiljeniji + Pritisni „Gotovo” kad je riješeno Gotovo - ∞ videozapisa - 100+ videozapisa - Prijavite grešku na GitHub + ∞ videa + Više od 100 videa + Prijavi grešku na GitHub-u Umjetnici Albumi Pjesme - Napravio %s + Stvoren od %s Nikada Ograniči popis preuzimanja Koristi birač mapa sustava (SAF) Ukloni pregledano - Ukloni pogledane videozapise\? + Ukloni pogledana videa\? %d sekunda - %d sekundi + %d sekunde %d sekundi - %d minutu - %d minuta + %d minuta + %d minute %d minuta @@ -469,7 +469,7 @@ %d sat - %d sati + %d sata %d sati Nije učitano: %d @@ -481,63 +481,63 @@ Gumb druge radnje Gumb prve radnje Prikazuju se rezultati za: %s - Nije moguće prepoznati URL. Želiš li otvoriti s drugim programom\? - Smanjiti omjer minijatura na 1:1 + Nije bilo moguće prepoznati URL. Želiš li otvoriti s drugim programom\? + Odreži sličicu na omjer 1:1 Učitavanje u predmemoriju Istovremeno se pokreće jedno preuzimanje Dodano u popis izvođenja Dodaj u popis izvođenja - Popis izvođenja + Reproduciraj popis izvođenja Automatski popis izvođenja - Popis izvođenja aktivnog reproduktora će se zamijeniti - Prebacivanje s jednog reproduktora na drugi može zamijeniti popisa izvođenja + Popis izvođenja aktivnog playera će se zamijeniti + Prebacivanje s jednog playera na drugi može zamijeniti tvoj popis izvođenja Pitaj prije pražnjenja popisa izvođenja %s slušatelj %s slušatelja %s slušatelja - datoteka ne može biti prepisana - Promijeni omjer prikazane minijature videa u obavijesti iz 16:9 na 1:1 (može prouzročiti izobličenja) + datoteka se ne može prepisato + Odreži prikazane sličice videa u obavijesti iz omjera 16:9 na 1:1 U kompaktnom prikazu obavijesti mogu se odabrati najviše 3 radnje! Od %s - Minijatura avatara kanala + Sličica avatara kanala Dohvati iz određenog feeda kad je dostupno Vrijeme nakon zadnjeg aktualiziranja prije nego što se pretplata smatra zastarjelom – %s - Prag aktualiziranja feedova + Prag za aktualiziranje feedova Feed Prikaži samo negrupirane pretplate Prazno ime grupe - %d odabrani - %d odabrana + %d odabrana + %d odabrane %d odabranih - Obrada feeda … + Obrada feeda u tijeku … Zadnje aktualiziranje feeda: %s Grupe kanala - Da, i djelomično pogledane videozapise - Odaberi primjerak + Da, i djelomično pogledana videa + Odaberi jednu instancu Aplikacija će te pitati kamo spremati preuzimanja. \nOmogući birač mapa sustava (SAF), ako želiš preuzimati na vanjsku SD karticu Nije moguće obnoviti ovo preuzimanje Napredak je izgubljen, jer je datoteka izbrisana NewPipe se zatvorio tijekom rada s datotekom Stranica playliste - Videzapisi koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. + Videa koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. \nStvarno ih želiš ukloniti\? Ovo je nepovratna radnja! Još nema zabilježenih playlista Odaberi playlistu obnavljanje Samo na Wi-Fi mreži - Pokreni automatski – %s + Pokreni reprodukciju automatski – %s Prikaži curenje memorije %s gledatelj %s gledatelja %s gledatelja - Uklj/Isklj uslugu, trenutačno odabrana: + Uključi/isključi uslugu, trenutačno odabrana: Kopiraj formatirani izveštaj Izbriši kolačiće koje NewPipe sprema nakon rješavanja reCAPTCHA reCAPTCHA kolačići su izbrisani @@ -548,51 +548,51 @@ YouTube nudi postavku „Ograničeni način rada”, čime se skriva sadržaj za odrasle Uključi YouTube postavku „Ograničeni način rada” Prikaži sadržaj koji vjerojatno nije prikladan za djecu, jer je dobno ograničen (kategorija 18) - Primjerak već postoji - Neuspjela provjera primjerka - Upiši URL primjerka - Dodaj primjerak - Pronađi omiljene primjerke na %s - Odaberi tvoje omiljene PeerTube primjerke - PeerTube primjerci + Instanca već postoji + Nije bilo moguće provjeriti instancu + Upiši URL instance + Dodaj instancu + Pronađi instance koje voliš na %s + Odaberi svoje omiljene PeerTube instance + PeerTube instance Vrijeme premotavanja prema naprijed ili natrag Ništa Promiješaj Ponovi - Provjeri je li tvoj problem već postoji. Dupla pojava problema krade nam vrijeme koje bismo mogli utrošiti na ispravljanje same greške. + Provjeri je li problem već postoji. Prijavljivanje istog već prijavljenog problema krade nam vrijeme koje bismo mogli utrošiti na ispravljanje greške. Za uređivanje radnji u obavijestima, dodirni ih. Označi do tri radnje za prikaz u kompaktnoj obavijesti koristeći oznake na desnoj strani - Zbog ograničenja ExoPlayera, trajanje traženja postavljeno je na %d s - Neka Android prilagodi boju obavijesti prema glavnoj boji minijature (ovo nije dostupno na svim uređajima) + Zbog ograničenja ExoPlayera, trajanje premotavanja postavljeno je na %d s + Neka Android prilagodi boju obavijesti prema glavnoj boji sličice (ovo nije dostupno na svim uređajima) Oboji obavijest NewPipe još ne podržava ovaj sadržaj. \n \nNadamo se da će biti podržan u budućoj verziji. - Prikaži minijaturu kao pozadinu pri zaključanom ekranu i unutar obavijesti - Prikaži minijaturu + Koristi sličicu za pozadinu zaključanog ekrana i za obavijesti + Prikaži sličicu Prikaži izvorno vrijeme elemenata - „Okvir za pristup spremištu” omogućuje preuzimanje na SD karticu + „Storage Access Framework” omogućuje preuzimanje na SD karticu Izvorni tekstovi usluga bit će vidljivi u elementima prijenosa Dostupno je u nekim uslugama. Obično je puno brže, ali može dohvatiti ograničenu količinu stavki i često nepotpune podatke (npr. bez trajanja, vrste stavke, bez stanja uživo) - Mislite li da je učitavanje feeda prespor\? Ako je to slučaj, pokušajte omogućiti brzo učitavanje (možete ga promijeniti u postavkama ili pritiskom na donji gumb). + Misliš da je učitavanje feeda presporo\? Ako da, pokušaj omogućiti brzo učitavanje (možeš ga promijeniti u postavkama ili pritiskom na donji gumb). \n -\nNewPipe nudi dvije strategije ulaganja feeda: -\n• Dohvaćanje cijelog pretplatničkog kanala, koji je spor, ali cjelovit. -\n• Korištenje namjenske krajnje točke usluge, koja je brza, ali obično nije potpuna. +\nNewPipe nudi dvije strategije učitavanja feeda: +\n• Dohvaćanje cijelog pretplatničkog kanala, što je sporo, ali cjelovito. +\n• Korištenje namjenske krajnje točke usluge, što je brzo, ali obično nepotpuno. \n -\nRazlika je u tome što brzom obično nedostaju neke informacije, poput trajanja ili vrste stavke (ne može razlikovati videozapise uživo od uobičajenih), a možda će vratiti i manje predmeta. +\nRazlika je u tome što brzom načinu obično nedostaju neke informacije, poput trajanja ili vrste predmeta (ne može razlikovati videa uživo od običnih videa), a možda će vratiti i manje predmeta. \n \nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom. \n -\nDakle, izbor se svodi na ono što više volite: brzinu ili precizne informacije. +\nDakle, izbor se svodi na ono što više voliš: brzinu ili precizne informacije. Izračunavanje šifriranja Obavijest šifriranja videa Obavijesti o napretku šifriranja videa Nedavni Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru streama, sadržaju streama ili zahtjevu za pretraživanje Prikaži metapodatke - Slični videozapisi + Povezani predmeti Nijedan program na tvom uređaju ovo ne može otvoriti - Poglavlja videozapisa + Poglavlja Opis Komentari Isključi za skrivanje opisa videozapisa i dodatnih informacija @@ -620,12 +620,12 @@ Isklj. Uklj. Način rada na tabletu - Otvori stranicu - Srce autora + Otvori web-stranicu + Od autora obilježeno srcem Privatno Nenavedeno Javno - URL minijature + URL sličice Poslužitelj Podrška Jezik @@ -633,41 +633,41 @@ Licenca Oznake Kategorija - Onemogućite odabir teksta u opisu - Omogućite odabir teksta u opisu + Onemogući biranje teksta u opisu + Omogući biranje teksta u opisu Račun ukinut Prikaži pogledane stavke Autorov račun je ukinut. -\nNewPipe ubuduće neće moći učitavati ovaj feed. -\nŽelite li otkazati pretplatu na ovaj kanal\? - Nije moguće učitati feed za \'%s\'. +\nNewPipe ubuduće neće moći učitavati ovaj feed. +\nŽeliš li otkazati pretplatu na ovaj kanal\? + Nije bilo moguće učitati feed za „%s”. Pogreška pri učitavanju feeda - Počevši od Androida 10, podržan je samo \'Storage Access Framework\' + Počevši od Androida 10, podržano je samo radno okruženje „Storage Access Framework” Od vas će se tražiti gdje spremiti svako preuzimanje Ne prikazuj - Niska kvaliteta (manji) + Niska kvaliteta (manja) Visoka kvaliteta (veća) - Pregled sličica trake za pretraživanje - Mapa za preuzimanje još nije postavljena, odaberite zadanu mapu za preuzimanje + Pregled sličica premotavanja + Mapa za preuzimanje još nije postavljena, odaberi standardnu mapu za preuzimanje Komentari su onemogućeni Označi kao pogledano Način rada brzog feeda ne pruža više informacija o ovome. Interno Privatnost Sada možeš odabrati tekst u opisu. Napomena: stranica će možda treperiti i možda nećeš moći kliknuti poveznice u načinu rada za odabir teksta. - %s daje ovaj razlog: - Obrada... Pričekajte trenutak - Povucite stavke da biste ih uklonili + %s pruža ovaj razlog: + Obrada u tijeku … Može malo potrajati + Za ukljanjanje stavki povuci ih Prikazati indikatore slike - Dovršeno %s preuzimanje - Dovršena %s preuzimanja - Dovršeno %s preuzimanja + Preuzimanje je gotovo + %s preuzimanja su gotova + %s preuzimanja su gotova - Pokreni glavni reproduktor u cjeloekranskom prikazu - Reproduciraj sljedeće - U redu čekanja - Prikažite Picassove vrpce u boji na slikama koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju + Pokreni glavni player u cjeloekranskom prikazu + Reproduciraj sljedeći + Sljedeći u popisu izvođenja + Prikaži Picassove vrpce u boji na slikama koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju Izbrisano %1$s preuzimanje Izbrisana %1$s preuzimanja @@ -678,37 +678,59 @@ Traženje novih verzija … Prijedlozi lokalne pretrage Traži nove verzije - Nemoj pokretati videa u mini reproduktoru, već se izravno pokreni cjeloekranski prikaz, ako je automatsko okretanje zaključano. Mini reproduktoru i dalje možeš pristupiti izlaskom iz cjeloekranskog prikaza - Novi feedovi + Nemoj pokretati videa u mini playeru, već izravno pokreni cjeloekranski prikaz, ako je automatsko okretanje zaključano. Mini playeru i dalje možeš pristupiti napuštanjem cjeloekranskog prikaza + Novi elementi feeda Obavijest o prijavi greške Obavijesti za prijavu grešaka Stvori obavijest o grešci NewPipe je naišao na grešku, dodirni za prijavu Došlo je do greške, pogledaj obavijest Prekini rad playera - Obavijest reproduktora - Prilagođavanje obavijesti reproduktora + Obavijest playera + Konfiguriraj obavijest trenutačno reproduciranog streama Obavijesti Novi videozapisi - Obavijesti novih streamova pretplaćenih kanala - Želite li izbrisati sve preuzete datoteke\? + Obavijesti novih streamova od pretplaćenih kanala + Želiš li izbrisati sve preuzete datoteke\? Obavijesti su onemogućene - Pretplatili ste se ovome kanalu + Pretplatio/la si se na ovaj kanal , - Uključiti/isključiti sve + Uključi/isključi sve Bilo kakva mreža Obavijesti novih streamova pretplaćenih kanala - Pokaži zalogajnicu greške - Učitavanje pojedinosti streama… - Pokrenite provjeru novih streamova - Učestalost provjere - LeakCanary nije dostupno + Prikaži kratku poruku greške + Učitavanje pojedinosti streama … + Pokreni traženje novih streamova + Prvjeravanje učestalosti + Biblioteka „LeakCanary” nije dostupna Podešavanje visine tona po glazbenim polutonovima Obavijesti o novim streamovima Potrebna mrežna veza Zadano za ExoPlayer - Primite obavijesti - Za ovu radnju nije pronađen odgovarajući upravitelj datoteka. -\nMolimo vas da instalirate upravitelj za datoteke ili da pokušate onemogućiti \'%s\' u postavkama preuzimanja. + Primaj obavijesti + Za ovu radnju nije pronađen odgovarajući upravljač datoteka. +\nInstaliraj upravljač datoteka ili pokušaj onemogućiti „%s” u postavkama preuzimanja. Prikvačeni komentar + Prikazuje opciju prekida rada kad se player koristi + Prikaži „Prekini rad playera” + ExoPlayer standard + Posto + Poluton + Streamovi koje program za preuzimanje još ne podržava se ne prikazuju + Vanjski playeri ne podržavaju odabrani stream + Promijeni veličinu intervala učitavanja (trenutačno %s). Niža vrijednost može ubrzati početno učitavanje videa. Promjene zahtijevaju ponovno pokretanje playera. + + %s novi stream + %s nova streama + %s novih streamova + + Veličina intervala učitavanja reprodukcije + Nepoznat format + Nepoznata kvaliteta + Nijedan stream audiosnimaka nije dostupan za vanjske playere + Nijedan video stream nije dostupan za vanjske playere + Odaberi kvalitetu za vanjske playere + Prikaži buduća videa + Za ovu radnju nije pronađen odgovrajući upravljač datoteka. +\nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka. \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index e2518398540..49b47237960 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -319,7 +319,7 @@ Eltüntetés Lejátszási lista könyvjelzőzése Egy hasonló videó hozzáadása a befejeződő (nem ismétlődő) lejátszási sorhoz - Sor + Sorba állítás a fájl nem írható felül Az előre- és visszatekerés időtartama Utolsó lejátszási pozíció visszaállítása @@ -362,11 +362,11 @@ Nincs talalat A kiszolgáló nem fogad többszálú letöltést, próbálkozzon újra ezzel: @string/msg_threads = 1 A kiszolgáló nem küld adatokat - Nem lehet csatlakozni a kiszolgálóhoz + A kiszolgáló szerver nem elérhető A kiszolgáló nem található Nem sikerült biztonságos kapcsolatot létesíteni A célmappa nem hozható létre - A fájlt nem lehet létrehozni + A fájlt nem sikerült létrehozni Hiba megjelenítése Ezzel a névvel egy letöltés már várakozik Ezzel a névvel egy letöltés már folyamatban van @@ -683,4 +683,39 @@ Rögzített megjegyzés LeakCanary nem elérhető + Lejátszó értesítés + Módosítsa a betöltési intervallum méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a videó kezdeti betöltését. A változtatásokhoz a lejátszó újraindítása szükséges. + Az aktuális lejátszás konfigurálása értesítés + Értesítések + Új élő közvetítések + Értesítések új élő közvetítésekről a feliratkozott csatornák esetén + Élő közvetítés betöltése.… + Keressen új élő közvetítést + Új élő közvetítés értesítések + Értesítésen új élő közvetítés esetén a feliratkozott csatornákhoz + Ellenőrzési gyakoriság + Szükséges hálózati kapcsolat + Bármilyen hálózat + Törli az összes letöltött fájlt a lemezről\? + Értesítsen + Értesítéstek kikapcsolva + Lejátszási intervallum mérete + Százaléka + + %s új elő közvetítés + %s új elő közvetítések + + ExoPlayer alapértelmezett + Feliratkoztál erre a csatornára + , + Azok az élő adások melyek nem támogatottak a letöltő által, rejtve vannak. + A választott élő adást nem lehet külső lejátszóval lejátszani. + Összes váltása + Külső lejátszók számára nem érhető el az hang csatorna + Külső lejátszók számára nem érhető el videó + Válassz minőséget külső lejátszókhoz + Ismeretlen formátum + Ismeretlen minőség + Félhang + Jövőbeli videók megjelenítése \ No newline at end of file diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 10d397aef68..2188548413f 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -217,4 +217,7 @@ Հանրային Պիտակներ Ծանուցումները անջատված են + Ոչինչ բացի դատարկությունից + Կրկին փորձել + Հոսքի նորերը \ No newline at end of file diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index d5bc90e6f55..f4383defb7c 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -233,4 +233,16 @@ Solmente alicun apparatos pote reproducer videos 2K/4K Initiar le reproductor principal in schermo plen Solmente le URLs HTTPS es supportate + Repeter + Aleatori + Cargante fe + Privacitate + Licentia + Comenciava le discarga + Private + Aperir le sito web + Per %s + Monstrar le videos futur + Radio + Create per %s \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index e84fb393a53..d4d2db5a858 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -121,7 +121,7 @@ Terlepas apakah Anda memiliki ide untuk; terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu diterima. Semakin banyak akan semakin baik jadinya! Baca lisensi Kontribusi - Subscribe + Berlangganan Disubscribe Apa Yang Baru Lanjutkan pemutaran @@ -550,7 +550,7 @@ Tombol tindakan ketiga Tombol tindakan kedua Tombol tindakan pertama - Ubah ukuran thumbnail yang ditampilkan di notifikasi dari rasio aspek 16:9 ke 1:1 (mungkin terdistorsi) + Ubah ukuran thumbnail yang ditampilkan di notifikasi dari rasio aspek 16:9 ke 1:1 Ubah ukuran thumbnail ke rasio aspek 1:1 Tampilkan kebocoran memori Ditambahkan @@ -704,4 +704,5 @@ Pilih kualitas untuk pemain eksternal Format tidak diketahui Ukuran interval pemuatan playback + Tampilkan video mendatang \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 96d541d805e..c2d0a2c6fd4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -560,8 +560,8 @@ Casuale Niente Ripeti - Ridimensiona copertina alla proporzione 1:1 - Modifica la proporzione della copertina del video mostrata nella notifica da 16:9 a 1:1 (può introdurre distorsioni) + Ritaglia copertina con proporzione 1:1 + Ritaglia la copertina del video mostrata nella notifica, cambiando la proporzione da 16:9 a 1:1 Mostra memory leak Aggiunto alla coda Accoda @@ -716,5 +716,6 @@ Seleziona qualità per lettori esterni Qualità sconosciuta Formato sconosciuto - Dimensione dell\'intervallo di caricamento della riproduzione + Dimensione intervallo di caricamento della riproduzione + Mostra video futuri \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e65897de31b..223a5f21a34 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -14,7 +14,7 @@ 動画を保存するフォルダー ダウンロードした動画をここに保存します 動画ファイルをダウンロードするフォルダーを選択して下さい - デフォルトの解像度 + デフォルトの画質 Kodi で再生 Kore をインストールしますか? 「Kodi で再生」オプションを表示 @@ -24,7 +24,7 @@ ダウンロード 「次の動画」と「関連動画」を表示 対応していないURLです - デフォルトの言語 + デフォルトの言語設定 動画と音声 ビデオ再生、時間: 投稿者アイコンのサムネイル @@ -49,8 +49,8 @@ 保存メニューを設定できませんでした コンテンツ 年齢制限のあるコンテンツを表示 - 申し訳ありません。発生すべきでものではありませんでした。 - メールで不具合を報告 + 申し訳ありません。想定外のエラーが発生しました。 + 不具合をメールで報告 申し訳ありません、不具合が発生しました。 報告 情報: @@ -70,15 +70,15 @@ ファイル名 同時接続数 エラー - NewPipe ダウンロード中 + ダウンロード中 (NewPipe) タップして詳細を表示 お待ちください… クリップボードにコピーしました - 後ほど設定でダウンロードフォルダを定義してください + 後ほど、ダウンロードフォルダーを設定してください ダウンロード ダウンロード 不具合報告 - アプリ/UI がクラッシュしました + アプリ(UI)がクラッシュしました どんな問題:\\nリクエスト:\\nコンテンツ言語:\\nコンテンツ国:\\nアプリ言語:\\nサービス:\\nGMT 時間:\\nパッケージ:\\nバージョン:\\nOSバージョン: reCAPTCHA の要求 reCAPTCHA を要求しました @@ -93,18 +93,18 @@ ポップアップモードで再生中 無効 デフォルトの動画形式 - デフォルトのポップアップ解像度 - より高い解像度を表示 - 一部のデバイスのみ2K/4K動画を再生できます + デフォルトの画質 (ポップアップ表示) + より高い画質を表示 + 2K/4K動画は一部のデバイスでのみ再生できます バックグラウンド ポップアップ 消去 - ポップアップの属性を記憶 - ポップアップしたサイズと位置を記憶します + ポップアップの属性を記憶する + ポップアップのサイズと位置を記憶する 一部の解像度では音声がありません 検索候補の表示 検索時に表示する候補を選択します - 最高の解像度 + 最高 NewPipe について サードパーティー ライセンス © %1$s 作者 %2$s ライセンス %3$s @@ -125,8 +125,8 @@ 新着 検索履歴 検索履歴を記憶します - 視聴履歴 - 再生した履歴を記憶します + 再生履歴 + 再生履歴を記憶します 再生の再開 電話などによる中断の後、再生を再開します プレイヤー @@ -138,9 +138,9 @@ NewPipe の通知 [不明] 動画の再生ができませんでした - 回復不能な再生エラーが発生しました - 何も見つかりませんでした - チャンネル登録なし + 回復不能なエラーが発生しました + 一致する結果はありませんでした + チャンネル登録者なし 動画がありません 保存 ファイル名に使用可能な文字 @@ -178,7 +178,7 @@ データベースをエクスポート 既存の履歴、登録リスト、プレイリストおよび (任意) 設定は上書きされます 再生履歴、登録チャンネル一覧、プレイリストおよび設定をエクスポートします - 再生エラーからの回復中 + エラーから回復中です 外部プレイヤーは、これらのタイプのリンクをサポートしていません エクスポートしました インポートしました @@ -201,7 +201,7 @@ キャッシュを消去 アプリ内のキャッシュデータをすべて削除します キャッシュが消去されました - 次のを自動でキューに追加する + 次の動画を自動でキューに追加する デバッグ ファイル 動画が見つかりません @@ -255,7 +255,7 @@ プライバシーポリシーを確認 おおまかなシーク おおまかなシークを使用することで精度が下がる代わりに高速にシークができます。5 秒、15 秒または 25 秒間隔のシークはできません - すべてのサムネイルの読み込みと保存を無効化します。このオプションを切り替えるとメモリおよびディスク上の画像キャッシュが消去されます + サムネイルの読み込みと保存を無効化します。(このオプションを切り替えるとメモリとディスク上の画像キャッシュが消去されます) キューに関連動画を追加して再生を続ける (繰り返ししない場合) すべての再生履歴を削除しますか? すべての検索履歴を削除しますか? @@ -276,11 +276,11 @@ 最も再生された動画 拡大 プレイリスト - 「長押ししてキュー」のヒントを表示 + 「長押しでキューに追加」のヒントを表示 トラック NewPipe のプレイヤーの通知 新着と人気 - 長押ししてキューに追加 + 長押しでキューに追加 ポップアップで連続再生を開始 お好みの「開く」アクション コンテンツを開くときのデフォルト動作 — %s @@ -302,7 +302,7 @@ 同意する 拒否する 制限なし - モバイルデータ使用時の解像度の制限 + モバイルネットワーク使用時の画質 アプリ切り替え時の最小化 プレイヤーから他のアプリに切り替え時の動作 — %s 何もしない @@ -345,7 +345,7 @@ NewPipe のアップデートがあります! タップでダウンロード 完了 - 保留中 + 順番に処理中 一時停止 順番待ちに追加しました 保存処理をしています @@ -397,7 +397,7 @@ 再生位置を削除しました ファイルが移動または削除されました ファイルを上書きできません - この名前の保留中のダウンロードがあります + 同じファイル名のダウンロードが既に進行中です ファイルの作業中に NewPipe が閉じられました デバイスに空き容量がありません ファイルが削除されたため、進行状況が失われました @@ -428,7 +428,7 @@ %s 人が聴取中 アプリを再起動すると、言語が変更されます - 高速早送り/巻き戻し時間 + 高速早送り/巻き戻し間隔 PeerTube インスタンス PeerTube インスタンスを選択する あなたに最適なインスタンスを探す: %s @@ -531,7 +531,7 @@ プレイリスト ページ プレイリストを選択してください 自動的に再生を開始します — %s - 自動キュー + 自動でキューに追加 アクティブなプレイヤーのキューが入れ替わります プレイヤーを別のプレイヤーに切り替えるとキューが置き換わる可能性があります しない @@ -539,8 +539,8 @@ キューを再生 キューを消去する前に確認する URL を認識できませんでした。他のアプリで開きますか? - 通知に表示される動画サムネイルを 16:9 から 1:1 のアスペクト比にスケールします (ゆがみが生じるかもしれません) - サムネイルを 1:1 のアスペクト比にスケールする + 通知に表示されるサムネイルを 16:9 から正方形にします + サムネイルを正方形にする 以下をタップして通知のアクションを編集します。右側にあるチェックボックスを使用してコンパクトな通知に表示するものを 3 つまで選択します コンパクトな通知に表示されるアクションは 3 つまで選ぶことができます! 5 番目のアクションボタン @@ -569,8 +569,8 @@ 動画のハッシュ化通知 動画のハッシュ化進行状況の通知 コメント - 無効にするとビデオの概要と追加情報を非表示にします - 説明を表示 + 無効にすると動画の概要欄と追加情報を非表示にします + 概要欄を表示 最近 開く 説明 @@ -612,7 +612,7 @@ サムネイルの URL ウェブサイトを開く ダウンロードのたびに保存する場所を尋ねます - ダウンロードフォルダがまだ設定されていません。今すぐデフォルトのフォルダを選択してください + ダウンロードフォルダーがまだ設定されていません。今すぐデフォルトのフォルダーを選択してください Android 10 以降は \'Storage Access Framework\' のみがサポートされます 高速モードでこの情報の詳細は提供されません。 \'%s\' のフィードを読み込めませんでした。 @@ -633,13 +633,13 @@ 低品質 (小) 高品質 (大) シークバーのサムネイルプレビュー - コメントは無効です + コメントは無効になっています 視聴済みとしてマーク リモート検索候補 ローカル検索候補 アイテムをスワイプして削除 直接フルスクリーンモードに切り替えて、ミニプレイヤーで動画を開始しません。自動回転がロックされている場合でも、フルスクリーンを終了することでミニプレイヤーにアクセスできます - フルスクリーンでメインプレイヤーを開始 + プレイヤーをフルスクリーンで開始 %1$s つのダウンロードを削除しました @@ -660,7 +660,7 @@ 新しいフィードアイテム エラー報告通知 エラーが発生しました。通知をご覧ください - NewPipe はエラーに遭遇しました。タップして報告 + エラーが発生しました (タップすると報告できます) スナックバーにエラーを表示 固定されたコメント この動作に適切なファイルマネージャが見つかりませんでした。 @@ -691,9 +691,18 @@ 新しいストリーム 通知 現在再生しているストリームの通知を構成 - 読み込む間隔を変更します (現在 %s)。小さい値にすると初回読み込み時間が短くなります。変更にはプレイヤーの再起動が必要です。 + 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です。 必要なネットワークの種類 パーセント 半音 すべてのネットワーク + データの読み込み間隔 + 未知の形式 + 未知の品質 + サポートされてない動画は表示されていません + 選択された動画は外部プレイヤーではサポートされていません + 外部プレイヤーで利用できる音声情報がありません + 外部プレイヤーで利用できる映像情報がありません + 外部プレイヤーでの品質を選択 + 次の動画を表示する \ No newline at end of file diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 0e2cf696270..9e4d29cfefe 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -539,7 +539,7 @@ ഫോർമാറ്റുചെയ്‌ത റിപ്പോർട്ട് പകർത്തുക പ്ലേലിസ്റ്റ് പേജ് GitHub- ൽ റിപ്പോർട്ട് ചെയ്യുക - ലഘുചിത്രം 1: 1 വീക്ഷണാനുപാതത്തിലേക്ക് സ്കെയിൽ ചെയ്യുക + ലഘുചിത്രം 1: 1 വീക്ഷണാനുപാതത്തിലേക്ക് ക്രോപ് ചെയ്യുക വീഡിയോ കവർ ചിത്രത്തിന്റെ പ്രധാന നിറത്തിന് അനുസരിച്ചു നോട്ടിഫിക്കേഷന്റെ കളർ മാറ്റാൻ ആൻഡ്രോയ്ഡിനെ അനുവദിക്കുക (ഇത് എല്ലാം ഉപകരണങ്ങളിലും ലഭ്യമല്ല ) നോട്ടിഫിക്കേഷൻ വർണ്ണാഭമാകുക ഒന്നുമില്ല @@ -547,7 +547,7 @@ ആവർത്തിക്കുക കോം‌പാക്റ്റ് അറിയിപ്പിൽ‌ കാണിക്കുന്നതിന് നിങ്ങൾക്ക് പരമാവധി മൂന്ന് പ്രവർ‌ത്തനങ്ങൾ‌ തിരഞ്ഞെടുക്കാനാകും! ഇതിനോടൊപ്പം തുറക്കുക - നോട്ടിഫിക്കേഷനിൽ കാണിക്കുന്ന വീഡിയോ കവർ ചിത്രം 16:9 എന്ന അനുപാതത്തിൽ നിന്നും 1:1 ലേക്ക് മാറ്റാം (പ്രശ്നങ്ങൾ ഉണ്ടാവാൻ സാധ്യത ) + നോട്ടിഫിക്കേഷനിൽ കാണിക്കുന്ന വീഡിയോ കവർ ചിത്രം 16:9 എന്ന അനുപാതത്തിൽ നിന്നും 1:1 ലേക്ക് ക്രോപ് ചെയ്യുക ഡൗൺലോഡ് ആരംഭിച്ചു ചുവടെ നിങ്ങളുടെ പ്രിയപ്പെട്ട രാത്രി തീം തിരഞ്ഞെടുക്കാം നിങ്ങളുടെ പ്രിയപ്പെട്ട രാത്രി തീം തിരഞ്ഞെടുക്കുക — %s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fd80a7d547e..c6d7697c535 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -709,4 +709,12 @@ Je bent nu geabonneerd op dit kanaal Alle gedownloade bestanden van schijf wissen\? + De gekozen stream wordt niet ondersteund door externe spelers + Er zijn geen videostreams beschikbaar voor externe spelers + Onbekende kwaliteit + Streams die nog niet kunnen worden opgeslagen, worden niet getoond + Geen audiostreams beschikbaar voor externe spelers + Kies kwaliteit voor externe spelers + Onbekend bestandstype + Intervalgrootte tijdens afspelen \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 283c1f22333..a009023d55c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -575,8 +575,8 @@ Przycisk trzeciej akcji Przycisk drugiej akcji Przycisk pierwszej akcji - Skaluj miniaturę wideo wyświetlaną w powiadomieniu z proporcji 16:9 do 1:1 (może powodować zniekształcenia) - Skaluj miniaturę do proporcji 1:1 + Przycinaj miniaturę wideo wyświetlaną w powiadomieniu z proporcji 16:9 do 1:1 + Przycinaj miniaturę do proporcji 1:1 Dodano do kolejki Dodaj do kolejki Pokaż wycieki pamięci @@ -738,4 +738,5 @@ Wybierz jakość dla zewnętrznych odtwarzaczy Nieznany format Nieznana jakość + Pokaż przyszłe wideo \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0a4b2c2ad5a..9d19a858549 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -560,8 +560,8 @@ Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Dimensionar a miniatura do vídeo mostrada na notificação da proporção 16:9 para 1:1 (pode apresentar distorções) - Dimensionar a miniatura para a proporção de 1:1 + Cortar a miniatura do vídeo mostrada na notificação da proporção 16:9 para 1:1 + Cortar a miniatura para a proporção de 1:1 Mostrar vazamentos de memória Na fila Pôr na fila @@ -717,4 +717,5 @@ Formato desconhecido Qualidade desconhecida Tamanho do intervalo de carregamento da reprodução + Mostrar vídeos futuros \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4f3559eeb87..1f6b755017f 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -716,4 +716,6 @@ Formato desconhecido Qualidade desconhecida Selecione a qualidade para reprodutores externos + Tamanho do intervalo de carregamento da reprodução + Mostrar vídeos futuros \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b1f57929824..86306377f69 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -544,8 +544,8 @@ Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode haver distorções) - Ajustar miniatura à proporção de 1:1 + Cortar a miniatura de vídeo mostrada na notificação de 16:9 para 1:1 + Cortar miniatura na proporção 1:1 Iniciar reprodução automaticamente — %s Reproduzir fila Nunca @@ -716,4 +716,6 @@ Formato desconhecido Qualidade desconhecida A transmissão selecionada não é suportada por reprodutores externos + Mostrar vídeos futuros + Tamanho do intervalo de carregamento da reprodução \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 58a38ea6ed2..52c1ef5a31c 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -378,8 +378,8 @@ Al treilea buton de acțiune Al doilea buton de acțiune Primul buton de acțiune - Scalați miniatura video afișată în notificare de la raportul de aspect 16:9 la 1:1 (poate introduce distorsiuni) - Scalare miniatură la raport aspect 1:1 + Tăiați miniatura video afișată în notificare de la raportul de aspect 16:9 la 1:1 (poate introduce distorsiuni) + Tăiere miniatură la raportul de aspect 1:1 Se arată rezultate pentru:%s Nicio aplicație de pe dispozitivul dvs. nu poate deschide acesta Capitole @@ -722,4 +722,13 @@ V-ați abonat la acest canal Comutați toate , + Fluxurile care încă nu pot fi descărcate nu sunt afișate + Fluxul selectat nu este acceptat de playerele externe + Nu sunt disponibile fluxuri audio pentru playerele externe + Nu sunt disponibile fluxuri video pentru playerele externe + Selectați calitatea pentru playerele externe + Format necunoscut + Calitate necunoscută + Dimensiunea intervalului de încărcare de redare + Afișați videoclipurile din viitor \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c91368c2a70..50e0b4d4814 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -718,7 +718,7 @@ Закреплённый комментарий LeakCanary недоступна Стандартное значение ExoPlayer - Изменить размер интервала загрузки (сейчас %s). Меньшее значение может ускорить начальную загрузку видео. Изменение значения потребует перезапуска плеера. + Изменить размер предварительной загрузки (сейчас %s). Меньшее значение может ускорить загрузку видео. При изменении требуется перезапуск плеера. Загрузка деталей трансляции… Проверить на наличие новых трансляций Удалить все загруженные файлы\? @@ -733,4 +733,6 @@ Нет ни одного доступного аудио потока для внешних проигрывателей Выберите качество для внешних проигрывателей Неизвестное качество + Размер предварительной загрузки + Показывать будущие видео \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 81a71402e4c..d3a92b116e4 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -550,7 +550,7 @@ Pedi una cunfirma in antis de iscantzellare una lista Òrdine casuale Modìfica cada atzione de notìfica inoghe in suta incarchende·la. Ischerta·nde finas a tres de ammustrare in sa notìfica cumpata impreende sas casellas de controllu a destra - Iscala sa miniadura ammustrada in sa notìfica dae su formadu in 16:9 a cussu 1:1 (diat pòdere causare istorchimentos) + Sega sa miniadura ammustrada in sa notìfica dae su formadu in 16:9 a cussu 1:1 Nudda Carrighende Repite @@ -560,7 +560,7 @@ Su de tres butones de atzione Su de duos butones de atzione Su de unu butone de atzione - Pone in iscala sa miniadura in formadu 1:1 + Sega sa miniadura in formadu 1:1 Ammustra sas pèrdidas de memòria Annànghidu a sa lista Pone in lista @@ -716,4 +716,6 @@ Formadu disconnotu Calidade disconnota Su flussu seletzionadu no est galu suportadu dae letores esternos + Mannària de s\'intervallu de carrigamentu de sa riprodutzione + Ammustra sos vìdeos imbenientes \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4645fcfffa3..3d788843237 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -722,4 +722,12 @@ Poltón Nahrávanie podrobností streamu… Percent + Vybraný stream nie je podporovaný externými prehrávačmi + Žiadne audio streamy nie sú k dispozícií pre externé prehrávače + Vybrať kvalitu pre externé prehrávače + Neznámy formát + Interval medzipamäte + Streamy nepodporované sťahovačom sa nezobrazujú + Žiadne video streamy nie sú k dispozícií pre externé prehrávače + Neznáma kvalita \ No newline at end of file diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index d12b1e4d4f2..431ef57ad24 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -19,7 +19,7 @@ Batoonka hawsha sadexaad Batoonka hawsha labaad Batoonka hawsha koowaad - La ekaysii galka muuqaalka xaga ogaysiisyada ka muuqda cabirka 1:1 ayadoo laga soo baddalayo 16:9 (wuxuu keeni karaa shucaac) + La ekaysii galka muuqaalka xaga ogaysiisyada ka muuqda cabirka 1:1 ayadoo laga soo baddalayo 16:9 Galka la ekaysii cabirka 1:1 Soo bandhig istikhyaar ah in muuqaalka lagu furo xarunta madadaalada Kodi Soodhig istikhyaarka \"Ku fur Kodi\" @@ -649,4 +649,6 @@ Tus tilmaamayaasha sawirka Soojeedinada raadinta banaanka Soojeedinada raadinta gudaha + Cabirka soodaarida udhexeeya + Jabi Daareha \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index edcc13b08c2..daf2a448519 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -524,9 +524,9 @@ Skapad av %s Ingen spellista har bokmärkts än Visa endast prenumerationer som inte grupperats - Skala miniatyrbild till 1: 1 bildförhållande + Beskär miniatyrbild till 1: 1 bildförhållande Endast över Wi-Fi - Skala videominiatyrbilden som visas i aviseringen från 16:9- till 1:1-förhållande (kan orsaka bildförvrängning) + Beskär videominiatyrbilden som visas i aviseringen från 16:9 till 1:1 bildförhållande Starta uppspelning automatiskt — %s Uppspelningskö Kunde inte känna igen URL:en. Vill du öppna med annan app\? @@ -713,4 +713,9 @@ Okänd kvalitet Inga ljudströmmar tillgängliga för externa spelare Okänt format + Videoströmmar som ännu inte stöds av nedladdaren visas inte + Inläsningsintervalls storlek + Välj kvalitet för externa spelare + Visa framtida videor + Den valda videoströmmen stöds inte av externa spelare \ No newline at end of file diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 3958e02b005..22ad6fbf5df 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -425,4 +425,29 @@ స్వయంచాలకంగా రూపొందించబడింది (ఎక్కించినవారు కనబడుటలేదు) స్వయంచాలకంగా రూపొందించబడింది శీర్షికలు + సభ్యత్వాల కోసం కొత్త స్ట్రీమ్‌ల గురించి నోటిఫికేషన్‌లు + స్థితి పునరుద్ధరణ + లయ + కొత్త స్ట్రీమ్స్ + + %s కొత్త స్ట్రీమ్ + %s కొత్త స్ట్రీమ్స్ + + స్ట్రీమ్ వివరాలను లోడ్ చేస్తోంది… + మెమరీ లీక్‌లను చూపించు + జీవితచక్రం లేని లోపాలను నివేదించండి + ఈ చర్య నెట్‌వర్క్ ఖరీదైనదని గుర్తుంచుకోండి. +\n +\nమీరు కొనసాగించాలనుకుంటున్నారా\? + శాతం + అర్ధరాగం + ప్లేబ్యాక్ లోడ్ విరామం పరిమాణం + వస్తువులపై అసలు క్రిత సమయాన్ని చూపుము + పారవేయడం తర్వాత ఫ్రాగ్మెంట్ లేదా యాక్టివిటీ లైఫ్‌సైకిల్ వెలుపల బట్వాడా చేయలేని Rx మినహాయింపులను బలవంతంగా నివేదించడం + మెమరీ లీక్ మానిటరింగ్ హీప్ డంపింగ్ చేసినప్పుడు యాప్ స్పందించక పోవడానికి కారణం కావచ్చు + శృతి + అన్‌హుక్ (వక్రీకరణకు కారణం కావచ్చు) + అడుగు + నిశ్శబ్ద సమయంలో వేగంగా ముందుకు వెళ్లుము + ప్లేబ్యాక్ స్పీడ్ నియంత్రణలు \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0986fd74b48..072b9219377 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,8 +1,8 @@ - Başlamak için büyütece dokunun. + Başlamak için büyütece dokun. %1$s tarihinde yayınlandı - Akış oynatıcısı bulunamadı. VLC yüklensin mi\? + Akış oynatıcısı bulunamadı. VLC kurulsun mu\? Yükle İptal Tarayıcıda aç @@ -13,14 +13,14 @@ Bunu mu demek istediniz: \"%1$s\"\? Şununla paylaş Dış video oynatıcı kullan - Dış ses oynatıcı kullanın + Dış ses oynatıcı kullan Video indirme klasörü İndirilen video dosyaları burada depolanır Video dosyaları için indirme klasörünü seç Ses indirme klasörü İndirilen ses dosyaları burada depolanır Ses dosyaları için indirme klasörünü seç - Varsayılan çözünürlük + Öntanımlı çözünürlük Kodi ile oynat Eksik Kore uygulaması yüklensin mi\? \"Kodi ile oynat\" seçeneğini göster @@ -103,7 +103,7 @@ Açılan pencerenin son boyutunu ve konumunu hatırla Bazı çözünürlüklerde sesi kaldırır Arama önerileri - Arama yaparken gösterilecek önerileri seçin + Ararken gösterilecek önerileri seç En iyi çözünürlük NewPipe Hakkında Üçüncü Taraf Lisansları @@ -130,7 +130,7 @@ Abonelikler Yenilikler Arama geçmişi - Arama sorgularını yerel olarak saklayın + Arama sorgularını yerel olarak sakla İzleme geçmişi İzlenen videoların kaydını tut Oynatmayı sürdür @@ -191,7 +191,7 @@ Ana Görünüme Geç Çekmeceyi Aç Çekmeceyi Kapat - Akış oynatıcı bulunamadı (Oynatmak için VLC yükleyebilirsiniz). + Akış oynatıcı bulunamadı (Oynatmak için VLC kurabilirsiniz). Her Zaman Yalnızca Bir Kez Dış oynatıcılar bu tür bağlantıları desteklemez @@ -560,8 +560,8 @@ Üçüncü eylem düğmesi İkinci eylem düğmesi Birinci eylem düğmesi - Bildirimde gösterilen video küçük resmini 16:9\'dan 1:1 en/boy oranına ölçeklendir (bozulmalara neden olabilir) - Küçük resmi 1:1 en/boy oranına ölçeklendir + Bildirimde gösterilen video küçük resmini 16:9\'dan 1:1 en boy oranına kırp + Küçük resmi 1:1 en boy oranına kırp Bellek sızıntılarını göster Sıraya eklendi Kuyruğa ekle @@ -578,7 +578,7 @@ Video dosya özetleme süreci için bildirimler Video dosya özeti bildirimi En Son - Akış oluşturucu, akış içeriği veya bir arama isteği hakkında ek bilgiler içeren meta bilgi kutularını gizlemek için kapatın + Akış oluşturucu, akış içeriği veya arama isteğiyle ilgili ek bilgiler içeren üst veri bilgi kutularını gizlemek için kapat Üst bilgiyi göster Bölümler Açıklama @@ -693,7 +693,7 @@ Yeni akışları denetlemeyi çalıştır Oynatıcı bildirimi - Oynatılan akış bildirimini yapılandırın + Oynatılan akış bildirimini yapılandır Yeni akışlar Akış ayrıntıları yükleniyor… Abonelikler için yeni akışlarla ilgili bildirimler @@ -701,7 +701,7 @@ Bildirimler devre dışı Bildirim alın Artık bu kanala abone oldunuz - Aboneliklerden yeni akışlar hakkında bildirim gönder + Aboneliklerden yeni akışlarla ilgili bildirim gönder Denetleme sıklığı Herhangi bir ağ İndirilen tüm dosyalar diskten silinsin mi\? @@ -709,12 +709,13 @@ Tümünü değiştir Yüzde Ara ton - Seçilen yayın harici oynatıcılar tarafından desteklenmiyor - İndirici tarafından henüz desteklenmeyen yayınlar gösterilmez - Harici oynatıcılar için ses yayını yok - Harici oynatıcılar için video yayını yok - Harici oynatıcılar için kalite seçin + Seçilen akış dış oynatıcılarca desteklenmiyor + İndiricice henüz desteklenmeyen akışlar gösterilmez + Dış oynatıcılar için ses akışı yok + Dış oynatıcılar için video akışı yok + Dış oynatıcılar için nitelik seç Bilinmeyen biçim - Bilinmeyen kalite + Bilinmeyen nitelik Oynatma yükleme aralığı boyutu + Gelecekteki videoları göster \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 736a49c8e6c..835c87f378a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -558,7 +558,7 @@ Кнопка третьої дії Кнопка другої дії Кнопка першої дії - Збільшити ескіз до масштабу 1:1 + Обрізати ескіз до пропорцій 1:1 Відкрити через Завантаження почалося Виберіть нічну тему — %s @@ -616,7 +616,7 @@ Кольорове сповіщення У компактному сповіщенні є не більше трьох дій! Дії можна змінити, натиснувши на них. Позначте не більше трьох для показу в компактному сповіщенні - Масштабувати мініатюру відео 16: 9 до 1:1 (можливі спотворення) + Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1 Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео Вимкнути тунелювання медіа «Фреймворк доступу до сховища» (SAF) підтримується лише починаючи з Android 10 @@ -734,4 +734,5 @@ Виберіть якість для зовнішніх програвачів Невідома якість Розмір інтервалу завантаження відтворення + Показати наступні відео \ No newline at end of file diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index b58f0946dae..2c35822099c 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -1,6 +1,6 @@ - شروع کرنے کے لیے \"تلاش\" پر ٹیپ کریں + شروع کرنے کے لیے \"کلاں نما شیشہ\" پر ٹیپ کریں %1$s کو شائع ہوا انسٹال منسوخ کریں @@ -494,8 +494,10 @@ تیسرا ایکشن بٹن دوسرا ایکشن بٹن پہلا ایکشن بٹن - نوٹیفیکیشن میں دکھائے جانے والے ویڈیو تھمب نیل کو 16: 9 سے 1:1 پہلو تناسب (شاید بگاڑ پیدا ہوسکتا ہے) میں اسکیل کریں + نوٹیفیکیشن میں دکھائے جانے والے ویڈیو تھمب نیل کو 16: 9 سے 1:1 پہلو تناسب میں اسکیل کریں تھمب نیل کو 1:1 کی تناسب میں رکھیں %s کے لئے نتائج دکھا رہا ہے کے ساتھ کھولیں + ویڈیو پلیئر کو کریش کریں + دیکھے ہوئے کو نشان لگائیں \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 2346a4cf9d1..3a933ef98d5 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -67,13 +67,13 @@ Nội dung không khả dụng Không thể thiết lập menu tải về Ứng dụng / Giao diện người dùng bị lỗi - Ai Da, NewPipe đã gặp lỗi. Tôi lấy làm tiếc cho bạn. + :( Lmao, app đã xảy ra lỗi. Hãy lướt xuống dưới để xem lỗi. Báo lỗi qua email Xin lỗi, đã xảy ra sự cố. Báo cáo Thông tin: Chuyện gì đã xảy ra: - Cái gì:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành: + Loại lỗi:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành: Nhận xét của bạn (bằng tiếng Anh): Chi tiết: Xem video, thời lượng: @@ -83,7 +83,7 @@ Video Âm thanh Thử lại - ngàn + nghìn triệu tỉ Bắt đầu @@ -96,7 +96,7 @@ Lỗi NewPipe đang tải xuống Chạm để biết chi tiết - Xin hãy đợi… + Đợi chút xíu nha… Đã sao chép vào clipboard Hãy chọn một thư mục để tải xuống trong phần cài đặt Chế độ popup cần quyền này @@ -108,10 +108,10 @@ © %1$s bởi %2$s dưới %3$s Thông tin Giấy phép - Trình phát nội dung nhẹ và mã nguồn mở cho Android. + Trình phát video nhẹ và mã nguồn mở cho Android. Xem trên GitHub Giấy phép của NewPipe - Sự đóng góp luôn được hoan nghênh – cho dù bạn dịch, có ý tưởng thiết kế, dọn code, hay thay đổi rất nhiều phần code. Càng làm nhiều thì ứng dụng này sẽ càng tốt! + Sự đóng góp của bạn luôn được hoan nghênh – kể cả khi bạn dịch, thay đổi giao diện, dọn code hay thay đổi những thứ khác, sự giúp đỡ của bạn vẫn đáng được trân trọng. Bạn càng làm nhiều, ứng dụng này sẽ càng tốt hơn bao giờ hết (Miễn đừng dịch vớ vẩn là được, nhé :]] )! Đọc giấy phép Đóng góp Ngôn ngữ nội dung ưu tiên @@ -169,7 +169,7 @@ Chuyển sang Main Nhập cơ sở dữ liệu Xuất cơ sở dữ liệu - Ghi đè lịch sử, danh sách đăng ký, playlist (và cài đặt, nếu có chọn) hiện tại của bạn + Ghi đè lịch sử, kênh đăng ký, playlist hiện tại (và cài đặt, nếu có) của bạn Xuất lịch sử, danh sách đăng ký, playlist và cài đặt Xóa lịch sử xem Xóa lịch sử các luồng đã phát và vị trí phát @@ -179,7 +179,7 @@ Xóa lịch sử của từ khóa tìm kiếm Xóa toàn bộ lịch sử tìm kiếm\? Đã xóa lịch sử tìm kiếm - Không thể phát luồng này + Không thể phát video này Đã xảy ra lỗi trình phát không thể khôi phục Phục hồi lại trình phát bị lỗi Trình phát ngoài không hỗ trợ các loại liên kết này @@ -191,7 +191,7 @@ Tên tệp không được để trống Đã xảy ra lỗi: %1$s Không có luồng nào để tải về - Không có gì ở đây + Không có gì cả Kéo để sắp xếp lại Không có người đăng ký @@ -217,8 +217,8 @@ Hầu hết các ký tự đặc biệt Không có ứng dụng nào được cài đặt để phát tệp này Đóng góp - NewPipe được phát triển bởi các tình nguyện viên dành thời gian mang lại cho bạn trải nghiệm tốt nhất. Đóng góp một tách cà phê để giúp các nhà phát triển làm NewPipe tốt hơn nữa. - Trả lại + NewPipe được phát triển bởi các tình nguyện viên dành thời gian và tâm huyết của mình để mang lại cho bạn trải nghiệm tốt nhất. Đóng góp một chai nước suối để giúp chúng tôi làm NewPipe tốt hơn nữa. + Ủng hộ một chai nước suối Trang web Truy cập trang web NewPipe để biết thêm thông tin và tin tức. Chính sách bảo mật của NewPipe @@ -244,8 +244,8 @@ Cảnh báo: Không thể nhập tất cả các tệp. Thao tác này sẽ ghi đè cài đặt hiện tại của bạn. Bạn cũng muốn nhập cài đặt? - Thịnh hành - Mới và hot + Thịnh hành :D + Mới và đang hot Loại bỏ Chi tiết Cài đặt âm thanh @@ -292,7 +292,7 @@ Xuất trước Không thể nhập đăng ký Không thể xuất đăng ký - Nhập danh sách đăng ký YouTube từ một bản Google Takeout: + Nhập danh sách đăng ký YouTube từ Google Takeout: \n \n1. Vào URL này: %1$s \n2. Đăng nhập khi được yêu cầu @@ -307,14 +307,14 @@ \n2. Truy cập URL này: %1$s \n3. Đăng nhập khi được hỏi \n4. Sao chép URL tiểu sử mà bạn đã được chuyển hướng đến. - Hãy nhớ rằng hoạt động này có thể khiến bạn bị trừ tiền. + Hãy nhớ rằng hoạt động này có thể khiến bạn bị mất kênh bạn đã đăng ký trước đó. \n \nBạn có muốn tiếp tục không\? Điều khiển tốc độ phát lại - Speed - Chiều cao - Bỏ gắn (có thể gây méo) - Tua đi nhanh trong khi im lặng + Tốc độ + Độ cao + Bỏ gắn (có thể gây méo nhưng vui) + Tua nhanh trong im lặng Tiếp theo Đặt lại Để tuân thủ Quy định bảo vệ dữ liệu chung của châu Âu (GDPR), chúng tôi sẽ thu hút sự chú ý của bạn đến chính sách bảo mật của NewPipe. Vui lòng đọc kỹ. @@ -322,7 +322,7 @@ Chấp nhận Từ chối Không giới hạn - Giới hạn độ phân giải khi sử dụng dữ liệu di động + Giới hạn độ phân giải khi sử dụng 3G, 4G Thu nhỏ khi chuyển qua ứng dụng khác Hành động khi chuyển sang ứng dụng khác từ trình phát chính — %s Không @@ -354,7 +354,7 @@ Danh sách Lưới Tự động - Đã có bản cập nhật NewPipe! + Đã có bản cập nhật mới! Nhấn để tải về Xong đã tạm dừng @@ -438,14 +438,14 @@ Video đã xem trước và sau khi được thêm vào playlist sẽ bị xóa. \nBạn có chắc không\? Video sẽ không thể hồi phục được! Xóa video đã xem\? - Xóa đã xem + Xóa video đã xem Mặt định hệ thống Ngôn ngữ ứng dụng \'Storage Access Framework\' cho phép tải về thẻ SD Sử dụng trình chọn thư mục của hệ thống (SAF) Xóa file đã tải về Xóa lịch sử tải về - Không thể khôi phục bản download này + Không thể khôi phục bản tải xuống này Bật tiếng Tắt tiếng Yêu thích nhất @@ -503,8 +503,8 @@ Có thể được với một số dịch vụ, thường sẽ nhanh hơn nhưng có thể bị giới hạn nội dung nhận được hoặc nội dung nhận được không đầy đủ (v.d. thời lượng, trạng thái,..) Luôn cập nhật Khoảng thời gian kể từ lần cuối cập nhật thông tin kênh trước khi nó được coi là hết hạn — %s - Ngưỡng thời gian cập nhật feed - Nguồn cấp (feed) + Ngưỡng thời gian cập nhật thông báo + Thông báo (feed) Tạo mới Bạn muốn xóa nhóm kênh này\? Tên nhóm kênh trống @@ -516,7 +516,7 @@ Đang xử lý thông báo… Số kênh không tải được: %d Đang tải thông báo… - Feed cập nhật lần cuối vào: %s + Thông báo cập nhật lần cuối vào: %s Do giới hạn của ExoPlayer, khoảng thời gian tua đã được đặt lại thành %d giây đang khôi phục Tự tạo (không tìm thấy người upload) @@ -526,11 +526,11 @@ Chỉ hiện các kênh chưa được nhóm Không bao giờ Chỉ trên Wi-Fi - Hành vi tự động phát — %s + Tự động phát — %s Phát hàng đợi (Video) Không có danh sách nào ở đây Chọn danh sách - Vui lòng kiểm tra xem vấn đề bạn đang gặp đã có báo cáo trước đó chưa. Nếu bạn tạo nhiều báo cáo trùng lặp, bạn sẽ làm tốn thời gian để chúng tôi đọc thay vì thực sự sửa lỗi. + Vui lòng kiểm tra xem vấn đề mà bạn đang gặp đã báo cáo trước đó hay chưa. Nếu bạn tạo quá nhiều báo cáo trùng lặp, bạn sẽ khiến cho chúng tôi tốn thời gian để đọc chúng thay vì sửa lỗi bạn gặp. Báo cáo trên GitHub Sao chép bản báo cáo đã được định dạng Không thể đọc URL này. Mở với app khác\? @@ -548,16 +548,16 @@ Nút hành động thứ tư Nút hành động thứ ba Nút hành động thứ hai - Nút hành đông đầu tiên - Phóng ảnh thu nhỏ của video trong thông báo từ tỉ lệ 16:9 xuống 1:1 (có thể gây méo ảnh) - Phóng ảnh thu nhỏ theo tỉ lệ 1:1 + Nút hành động đầu tiên + Chỉnh ảnh thu nhỏ của video trên thanh thông báo từ tỉ lệ 16:9 thành 1:1 (có thể gây méo ảnh) + Chỉnh ảnh thu nhỏ thành tỉ lệ 1:1 Đang hiện kết quả cho: %s - Hàng - Hiển thị nội dung không an toàn cho trẻ em vì có giới hạn độ tuổi (+18) + Thêm vào danh sách đang phát + Hiển thị nội dung không an toàn cho trẻ em vì có giới hạn độ tuổi (18+) Hiện ảnh thu nhỏ (thumbnail) trên nền màn hình khóa và trong thông báo Xem hình thu nhỏ - Kiểm tra bộ - Hàng + Kiểm tra bộ nhớ + Đã thêm vào danh sách đang phát Xoá Cookie mà NewPipe lưu trữ sau khi bạn vượt Cookie reCAPTCHA đã được xóa Xóa bỏ Cookie của reCAPCHA @@ -621,11 +621,11 @@ Tài khoản đã bị chấm dứt Hiện các mục đã xem Chế độ nguồn dữ liệu nhanh không cung cấp thêm thông tin về cái này. - Tài khoản của tác giả đã bị chấm dứt. + Tài khoản của người này đã bị chấm dứt. \nNewPipe sẽ không thể tải nguồn dữ liệu này trong tương lai. \nBạn có muốn huỷ đăng ký kênh này không\? - Không thể tải nguồn dữ liệu cho \'%s\'. - Lỗi khi tải nguồn dữ liệu + Không thể tải thông báo cho \'%s\'. + Lỗi khi tải nguồn thông báo \'Storage Access Framework\' chỉ được hỗ trợ từ Android 10 trở đi Bạn sẽ được hỏi nơi bạn muốn lưu mỗi mục tải xuống Chưa có thư mục tải xuống nào được đặt, hãy chọn thư mục tải xuống mặc định ngay @@ -633,8 +633,8 @@ Chất lượng thấp (nhỏ hơn) Chất lượng cao (lớn hơn) Xem trước hình thu nhỏ trên thanh tua - Bình luận đang bị tắt - Đã được người tạo thả tim + Bình luận đã bị tắt + Đã được chủ kênh thả \"thính\" Đánh dấu là đã xem Hiện ruy băng được tô màu Picasso ở trên cùng các hình ảnh và chỉ ra nguồn của chúng: đỏ đối với mạng, xanh lam đối với ổ đĩa và xanh lá đối với bộ nhớ Hiện dấu chỉ hình ảnh @@ -650,11 +650,11 @@ Không bắt đầu video ở trình phát mini, mà chuyển trực tiếp thành chế độ toàn màn hình, nếu tự động xoay bị khóa. Bạn vẫn có thể truy cập trình phát mini bằng cách thoát khỏi toàn màn hình Khởi động trình phát chính ở toàn màn hình Đã cho mục tiếp vào hàng đợi - Cho mục tiếp vào hàng đợi + Cho video kế tiếp vào hàng đợi Đang thực hiện...Có thể mất một lúc Thông báo lỗi Thông báo để báo cáo lỗi - NewPipe đã gặp lỗi, nhấn để báo cáo + NewPipe đã gặp sự cố, nhấn để xem và báo cáo Có lỗi xảy ra, hãy xem thông báo Hiện \"làm trình phát dừng\" Hiện tùy chọn dừng đột ngột khi sử dụng trình phát @@ -687,7 +687,7 @@ Thông báo về video mới từ kênh bạn đã đăng ký Thời gian kiểm tra Yêu cầu kết nối mạng - Bất kỳ mạng nào (có thể tính phí) + Bất kỳ loại mạng nào (có thể tính phí) Xóa tất cả tệp đã tải xuống khỏi ổ đĩa\? Thông báo bị tắt Được thông báo @@ -696,4 +696,13 @@ Phần trăm , Nửa cung + Luồng video mà không được trình tải xuống hỗ trợ sẽ không hiện + Không có video khả dụng cho trình chạy ngoài + Video bạn chọn không hỗ trợ trình chạy bên ngoài + Video này không có âm thanh khả dụng cho trình chạy ngoài + Chọn chất lượng cho trình chạy ngoài + Định dạng không xác định (:P) + Độ phân giải không xác định + Kích thước khoảng thời gian tải + Hiện video đề xuất \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3c307f195ec..c7f91b7ad2b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -550,8 +550,8 @@ 第三操作按钮 第二操作按钮 第一操作按钮 - 将通知中视频缩略图的长宽比从 16:9 强制缩放到 1:1(可能会导致失真) - 强制缩放缩略图至 1:1 比例 + 将通知中视频缩略图的长宽比从 16:9 裁剪到 1:1 + 裁剪缩略图至 1:1 比例 显示内存泄漏 已加入播放队列 加入播放队列 @@ -704,4 +704,6 @@ 没有视频流可用于外部播放器 不显示下载器尚不支持的串流 未知画质 + 回放加载间隔大小 + 显示未来视频 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 9b142a7470a..9cf2f5ee1c3 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -142,12 +142,12 @@ 本機搜尋建議 遠端搜尋建議 喺本機儲存搵過嘅查詢 - 睇過嘅紀錄 + 睇過有紀錄 恢復播放 返返最後播放到去嗰個位 清單度睇到播到去邊 - 縮圖放到去 1:1 長寬比 - 顯示喺通知嘅影片縮圖由 16:9 放到去 1:1 長寬比 (話唔定會鬆郁矇) + 縮圖以 1:1 長寬比框起 + 顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比 通知色彩化 等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意:唔係部部機都用得) 夜色 @@ -200,7 +200,7 @@ 撈起去浮面 匯入資料庫 主播放器用全螢幕開啟 - 如果自動旋轉鎖定,開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式。您仍可結束全螢幕返返去袖珍播放器 + 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。您仍可結束全螢幕返返去袖珍播放器 認唔出呢個 URL。要唔要用另一個 app 開? YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容 有年齡限制 (例如 18+) 故可能兒童不宜嘅內容都照顯示 @@ -322,7 +322,7 @@ 100+ 部影片 ∞ 部影片 未開放留言 - 建立 + 加新 未設定下載資料夾,請立即揀選預設嘅下載資料夾 刪除咗 1 個項目。 執執佢 @@ -394,7 +394,7 @@ 下載 課金 匯出唔到訂閱 - 修改播放器字幕啲字嘅大細同背景款式。要重新開過個 app 先會生效 + 修改播放器字幕大細同背景款式。要重新開過個 app 先會生效 執好就撳一下「搞掂」 靜音 處理緊… 可能要等等 @@ -466,7 +466,7 @@ 喺幕後開始播放 部機冇晒位 頂櫳重試幾多次 - 若然有機會用到流動數據嘅時候,或者用得著,雖則有啲下載或者冇得暫停 + 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載或者冇得暫停 輪住下載 內部 私人 @@ -615,7 +615,7 @@ 當喺主影片播放器轉去第個 app 嘅時候點做好 — %s 借過幕後播 借過浮面播 - 自動開啟播放 — %s + 自動開始播放 — %s 上返行人路 時間軸預覽縮圖 載入緊摘要… @@ -644,7 +644,7 @@ 著作者嘅帳戶已經被終止。 \nNewPipe 日後唔會載入到呢個摘要。 \n您要唔要取消訂閱呢個頻道? - 某啲服務會提供,通常快趣好多,但項目數量可能有限兼詳情欠奉 (例如片長、項目類型、直播狀態) + 某啲服務有提供,通常會快趣好多,但項目數量可能有限兼欠奉詳情 (例如片長、項目類型、直播狀態) 剷走播放到邊個位 係咪要全部剷走晒播放到邊個位? 百分比 @@ -662,4 +662,47 @@ 揀選一個站 轉換播放器嘅時候,排隊播可能會清零 NewPipe 係「著佐權」(copyleft) 自由軟件:您可以隨意使用、考究、分享同改進佢。具體而言,您可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 + 載入相距大細 + 互動頁面 + 預設嘅互動站 + 輸入 URL 或者您嘅 ID 去匯入 SoundCloud 個人檔案: +\n +\n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版) +\n二、去呢個網址:%1$s +\n三、叫您就登入 +\n四、複製佢彈返您去個人檔案嗰版個 URL。 + 您個 ID、soundcloud.com/您個id + 揀選互動站 + 顯示返項目原底話時隔幾耐 + 停用多媒體隧道 + 頻道成軍 + 成軍名留空 + 黃袍 + 您係咪要刪除呢個成軍? + 淨係顯示未成軍嘅訂閱 + 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 + 服務原底嘅字會騷返喺串流項目上面 + 影像要推三色碼 + 顯示定預告上畫嘅影片 + 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 + 點樣用 Google 匯出嚟匯入 YouTube 訂閱: +\n +\n一、去呢個網址:%1$s +\n二、叫您就登入 +\n三、撳一下「包含所有資料」,再撳一下「全部不選」,之後淨係剔返「訂閱」,然後撳「確定」 +\n四、撳一下「下一步」然後揀「建立匯出」 +\n五、個掣騷出嚟嘅時候就撳一下「下載」 +\n六、返返嚟呢度,喺下低撳「匯入檔案」,揀返下載咗嗰個 .zip 檔案 +\n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」),喺下低撳「匯入檔案」,揀返抽出嚟個 csv 檔案 + 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (您可以喺設定度更改,又或者撳一下下低個掣)。 +\n +\nNewPipe 提供兩種載入摘要嘅方針: +\n• 攞晒成個訂閱頻道,慢得嚟志在夠完整。 +\n• 用特設嘅服務終端,快得嚟啲料爭少少。 +\n +\n兩者嘅分別在於,快趣嗰個通常都係爭噉啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 +\n +\nYouTube 就係其中一個服務,有用 RSS 摘要提供呢個快趣嘅門路。 +\n +\n所以就睇您點揀:想快定要準。 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 47117ee90b2..fb908e84148 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -550,8 +550,8 @@ 第三動作按鈕 第二動作按鈕 第一動作按鈕 - 將通知中顯示的影片縮圖從 16:9 縮放到 1:1(可能會導致變形) - 把縮圖縮放到 1:1 的長寬比 + 將通知中顯示的影片縮圖從 16:9 裁剪到 1:1 + 將縮圖裁剪為 1:1 的長寬比 顯示記憶體洩漏 已加入佇列 加入佇列 @@ -704,4 +704,5 @@ 沒有可用於外部播放程式的視訊串流 選取外部播放程式的畫質 播放載入間隔大小 + 顯示未來影片 \ No newline at end of file diff --git a/fastlane/metadata/android/az/changelogs/988.txt b/fastlane/metadata/android/az/changelogs/988.txt new file mode 100644 index 00000000000..525c0f8cc44 --- /dev/null +++ b/fastlane/metadata/android/az/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Videonu başlatmağa başladıqda "Heç bir yayım əldə etmək mümkün olmadı" xətası aradan qaldırıldı +[YouTube] Vide sorğusu əvəzinə "Bu məzmun bu tətbiqdə əlçatan deyil" xətası aradan qaldırıldı diff --git a/fastlane/metadata/android/bn/changelogs/66.txt b/fastlane/metadata/android/bn/changelogs/66.txt new file mode 100644 index 00000000000..05aeec04cd1 --- /dev/null +++ b/fastlane/metadata/android/bn/changelogs/66.txt @@ -0,0 +1,33 @@ +# v0.13.7 এর পরিবর্তনসূচী + +### স্থির +- v0.13.6 এর বাছাই করা ফিল্টার সমস্যাগুলি ঠিক করুন + +# v0.13.6 এর পরিবর্তনসূচী + +### উন্নতি + +- বার্গারমেনু আইকন অ্যানিমেশন #1486 অক্ষম করা হয়েছে +- ডাউনলোড #1472 মুছে ফেলা হয়েছে পূর্বাবস্থায় +- শেয়ার মেনু #1498 এ ডাউনলোড এর অপশন +- লং ট্যাপ মেনু #1454 এ শেয়ার অপশন যোগ করা হয়েছে +- প্রস্থান #1354 এ প্রধান প্লেয়ার ছোট করা যাবে +- লাইব্রেরি সংস্করণ আপডেট এবং ডাটাবেস ব্যাকআপ নিষ্কাশন #1510 +- ExoPlayer 2.8.2 আপডেট #1392 + - দ্রুত গতি পরিবর্তনের জন্য বিভিন্ন ধাপের আকার সমর্থন করতে প্লেব্যাক গতি নিয়ন্ত্রণ ডায়ালগ পুনরায় কাজ করেছে৷ + - প্লেব্যাক গতি নিয়ন্ত্রণে নীরবতার সময় ফাস্ট-ফরওয়ার্ডে একটি টগল যুক্ত করা হয়েছে। এটি অডিওবুক এবং নির্দিষ্ট সঙ্গীত ঘরানার জন্য সহায়ক হওয়া উচিত এবং একটি সত্যিকারের বিরামহীন অভিজ্ঞতা আনতে পারে (এবং প্রচুর নীরবতার সাথে একটি গান ভাঙতে পারে =\\)। + - ম্যানুয়ালি না করে প্লেয়ারে অভ্যন্তরীণভাবে মিডিয়ার পাশাপাশি মেটাডেটা পাস করার অনুমতি দেওয়ার জন্য রিফ্যাক্টর করা মিডিয়া সোর্স রেজোলিউশন। এখন আমাদের কাছে মেটাডেটার একটি একক উৎস আছে এবং প্লেব্যাক শুরু হলে সরাসরি উপলব্ধ। + - প্লেলিস্ট ফ্র্যাগমেন্ট খোলার সময় নতুন মেটাডেটা উপলব্ধ হলে রিমোট প্লেলিস্ট মেটাডেটা আপডেট হচ্ছে না। + - বিভিন্ন UI ফিক্স: #1383, ব্যাকগ্রাউন্ড প্লেয়ার নোটিফিকেশন কন্ট্রোল এখন সবসময় সাদা, ফ্লিংিংয়ের মাধ্যমে পপআপ প্লেয়ার বন্ধ করা সহজ +- মাল্টি সার্ভিসের জন্য রিফ্যাক্টরযুক্ত আর্কিটেকচার সহ নতুন এক্সট্র্যাক্টর ব্যবহার করুন + +### সমাধান + +- #1440 ব্রোকেন ভিডিও ইনফো লেআউট #1491 ঠিক করুন +- দেখুন ইতিহাস সংশোধন #1497 + - #1495, ব্যবহারকারী প্লেলিস্ট অ্যাক্সেস করার সাথে সাথে মেটাডেটা (থাম্বনেল, শিরোনাম এবং ভিডিও গণনা) আপডেট করে। + - #1475, ডাটাবেসে একটি ভিউ রেজিস্টার করে যখন ব্যবহারকারী ডিটেইল ফ্র্যাগমেন্টে এক্সটার্নাল প্লেয়ারে একটি ভিডিও শুরু করে। +- পপআপ মোডের ক্ষেত্রে ক্রিনের সময়সীমা ঠিক করুন। #1463 (স্থির #640) +- প্রধান ভিডিও প্লেয়ার ফিক্স #1509 + - [#1412] ফিক্সড রিপিট মোড প্লেয়ার এনপিই সৃষ্টি করে যখন প্লেয়ার অ্যাক্টিভিটি ব্যাকগ্রাউন্ডে থাকে তখন নতুন ইন্টেন্ট পাওয়া যায়। + - পপআপের জন্য ফিক্সড মিনিমাইজিং প্লেয়ার প্লেয়ারকে ধ্বংস করে না যখন পপআপের অনুমতি না দেওয়া হয়। diff --git a/fastlane/metadata/android/bn/changelogs/730.txt b/fastlane/metadata/android/bn/changelogs/730.txt index fd2b8e1bb79..4d0e49a84dd 100644 --- a/fastlane/metadata/android/bn/changelogs/730.txt +++ b/fastlane/metadata/android/bn/changelogs/730.txt @@ -1,2 +1,2 @@ -# ঠিক করা -- দ্রুত ঠিককরণ ডিক্রিপ্ট ফাংশন ত্রুটি আবারো। +# নিস্কাসিত +- দ্রুত হট নিষ্কাসন ডিক্রিপ্ট ফাংশন ত্রুটি আরেকবার। diff --git a/fastlane/metadata/android/bn/changelogs/770.txt b/fastlane/metadata/android/bn/changelogs/770.txt index 0c853ea745b..5653c91ff64 100644 --- a/fastlane/metadata/android/bn/changelogs/770.txt +++ b/fastlane/metadata/android/bn/changelogs/770.txt @@ -1,4 +1,4 @@ ০.১৭.২ এ পরিবর্তনসূচী -ঠিককরণ +নিষ্কাসন • কোনো ভিডিও নেই সমস্যা ঠিক করা হয়েছে diff --git a/fastlane/metadata/android/bn/changelogs/956.txt b/fastlane/metadata/android/bn/changelogs/956.txt index a01a4c8ed50..48caa0b1654 100644 --- a/fastlane/metadata/android/bn/changelogs/956.txt +++ b/fastlane/metadata/android/bn/changelogs/956.txt @@ -1 +1 @@ -[ইউটিউব] যখন কোন ভিডিও লোড হচ্ছিলো ক্র্যাশ ফিক্স করা হয়েছে +[ইউটিউব] কোনো ভিডিও লোড হওয়ার মধ্যের ক্র্যাশ নিষ্কাসন করা হয়েছে diff --git a/fastlane/metadata/android/bn/short_description.txt b/fastlane/metadata/android/bn/short_description.txt index 1085f6c73b8..6c5a1ea7370 100644 --- a/fastlane/metadata/android/bn/short_description.txt +++ b/fastlane/metadata/android/bn/short_description.txt @@ -1 +1 @@ -অ্যানড্রয়েডের জন্য একটি মুক্ত ও হালকা ইউটিউব ফ্রন্টএন্ড। +অ্যানড্রয়েডের জন্য একটি মুক্ত ও সরল ইউটিউব ফ্রন্টএন্ড। diff --git a/fastlane/metadata/android/bn_BD/changelogs/63.txt b/fastlane/metadata/android/bn_BD/changelogs/63.txt new file mode 100644 index 00000000000..efb6558d323 --- /dev/null +++ b/fastlane/metadata/android/bn_BD/changelogs/63.txt @@ -0,0 +1,8 @@ +### উন্নতিসমূহ +- Import/export সেটিংস #1333 +- চিত্রণ কমানো (দক্ষতার উন্নতি) #1371 +- ছোটখাটো কোডে উন্নতি #1375 +- GDPR এর সবকিছু যোগ হওয়া #1420 + +### নিষ্কাসীত +- ডাউনলোডার: .giga ফাইল থেকে অসমাপ্ত ডাউনলোড গুলোর থেমে যাওয়া লোড এর নিষ্কাসন #1407 diff --git a/fastlane/metadata/android/bn_BD/changelogs/64.txt b/fastlane/metadata/android/bn_BD/changelogs/64.txt new file mode 100644 index 00000000000..502ceb57923 --- /dev/null +++ b/fastlane/metadata/android/bn_BD/changelogs/64.txt @@ -0,0 +1,8 @@ +### উন্নতিসমুহ +- মোবাইল ডেটা ব্যাবহারে ভিডিও মানে সীমা দেয়ার ক্ষমতা যোগ করা হয়েছে। #1339 +- সেশন এর মাধ্যমে উজ্জ্বলতা মনে রাখা। #1442 +- দুর্বল সিপিইউগুলোতে ডাউনলোডের দক্ষতার উন্নতি। #1431 +- মিডিয়া সেশনগুলোই সাহায্যকারী যোগ করা হয়েছে। #1433 + +### নিষ্কাশন +- ডাউনলোডগুলো খুলতে বিধ্বস্ত হওয়া নিষ্কাসন( ছেড়ে রাখা নির্মাণ গুলোর জন্যেও নিষ্কাসন উপলুদ্ধ) #1441 diff --git a/fastlane/metadata/android/bn_BD/full_description.txt b/fastlane/metadata/android/bn_BD/full_description.txt new file mode 100644 index 00000000000..ff00b080f79 --- /dev/null +++ b/fastlane/metadata/android/bn_BD/full_description.txt @@ -0,0 +1 @@ +নিউপাইপ গুগলের বা ইউটিউবের কোনো ফ্রেমওয়ার্ক লাইব্রেরি ব্যাবহার করেনা। এটা শুধু ওয়েবসাইট গুলোকে পারস করে যে তথ্যগুলো দরকার সেগুলোর প্রয়োজনে। এজন্যেই এই অ্যাপটা গুগলের কোনো সেবা ইনস্টল করা ছাড়াই ব্যাবহার করা যায়। আর, নিউপাইপ ব্যাবহার করতে তোমার কোনো ইউটিউব একাউন্ট প্রয়োজন হবে না, আর এইটা ফেশোর মতো। diff --git a/fastlane/metadata/android/bn_BD/short_description.txt b/fastlane/metadata/android/bn_BD/short_description.txt new file mode 100644 index 00000000000..c14b3261bb0 --- /dev/null +++ b/fastlane/metadata/android/bn_BD/short_description.txt @@ -0,0 +1 @@ +অ্যান্ড্রয়েড এর জন্যে একটা মুক্ত সরল ইউটিউব ফ্রন্টএন্ড। diff --git a/fastlane/metadata/android/cs/changelogs/63.txt b/fastlane/metadata/android/cs/changelogs/63.txt new file mode 100644 index 00000000000..f98de65decd --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/63.txt @@ -0,0 +1,8 @@ +### Improvements +- Import/export settings #1333 +- Reduce overdraw (performance improvement) #1371 +- Small code improvements #1375 +- Add everything about GDPR #1420 + +### Fixed +- Downloader: Fix crash on loading unfinished downloads from .giga files #1107 diff --git a/fastlane/metadata/android/cs/changelogs/64.txt b/fastlane/metadata/android/cs/changelogs/64.txt new file mode 100644 index 00000000000..7b2bd1ce5ca --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/64.txt @@ -0,0 +1,8 @@ +### Vylepšení +- Přidáni možnosti omezení kvality videa při použití mobilních dat. #1339 +- Zapamatování jasu pro relaci. #1442 +- Zlepšený výkon pro stahování se slabším CPU #1431 +- Přidána (fungující) podpora pro mediální relace #1433 + +### Oprava +- Opraveno selhání aplikace při otevření stáhnutých souborů (oprava je nyní k dispozici pro vydané sestavy. #1441 diff --git a/fastlane/metadata/android/cs/changelogs/65.txt b/fastlane/metadata/android/cs/changelogs/65.txt new file mode 100644 index 00000000000..8523ba3131a --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/65.txt @@ -0,0 +1,26 @@ +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - + - + - + - +- +- +- +- +- +- + - + - +- +- + - + -. diff --git a/fastlane/metadata/android/cs/changelogs/66.txt b/fastlane/metadata/android/cs/changelogs/66.txt new file mode 100644 index 00000000000..d62f6db4fa8 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/66.txt @@ -0,0 +1,16 @@ +# Changelog of v0.13.7 + +### Fixed +- Fix sort filter issues of v0.13.6 + +# Changelog of v0.13.6 + +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 diff --git a/fastlane/metadata/android/cs/changelogs/68.txt b/fastlane/metadata/android/cs/changelogs/68.txt new file mode 100644 index 00000000000..528100d34f2 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/68.txt @@ -0,0 +1,15 @@ +# changes of v0.14.1 + +### Fixed +- Fixed failed to decrypt video url #1659 +- Fixed description link not extract well #1657 + +# changes of v0.14.0 + +### New +- New Drawer design #1461 +- New customizable front page #1461 + +### Improvements +- Reworked Gesture controls #1604 +- New way to close the popup player #1597 diff --git a/fastlane/metadata/android/cs/changelogs/69.txt b/fastlane/metadata/android/cs/changelogs/69.txt new file mode 100644 index 00000000000..48113281b12 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/69.txt @@ -0,0 +1,9 @@ +### New +- Odstranění a sdílení v odběrech dlouhým klepnutím #1516 +- Uživatelské rozhraní tabletu a rozvržení seznamu mřížky #1617 + +### Vylepšení +- ukládání a opětovné načítání naposledy použitého poměru stran #1748 +- Povolení lineárního rozložení v aktivitě Stahování s úplnými názvy videí #1771 +- Odstraňování a sdílení odběrů přímo z karty odběrů #1516 +- Enqueuing nyní spustí přehrávání videa, pokud fronta přehrávání již skončila #1783 diff --git a/fastlane/metadata/android/cs/changelogs/70.txt b/fastlane/metadata/android/cs/changelogs/70.txt new file mode 100644 index 00000000000..6a4f439762a --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/70.txt @@ -0,0 +1,7 @@ +UPOZORNĚNÍ: Tato verze je pravděpodobně plná chyb, stejně jako ta předchozí. Nicméně vzhledem k úplnému vypnutí od 17. je lepší rozbitá verze než žádná. Nebo ne? ¯\_(ツ)_/¯ + +### Vylepšení +* stažené soubory lze nyní otevřít jedním kliknutím #1879 +* podpora upuštění pro Android 4.1 - 4.3 #1884 +* odstranění starého přehrávače #1884 +* odstranění streamů z aktuální fronty přehrávání přejetím doprava #1915 diff --git a/fastlane/metadata/android/cs/changelogs/71.txt b/fastlane/metadata/android/cs/changelogs/71.txt new file mode 100644 index 00000000000..a0fdaa76fe3 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/71.txt @@ -0,0 +1,7 @@ +### Vylepšení +* Přidání oznámení o aktualizaci aplikace pro sestavení na GitHubu (#1608 by @krtkush) +* Různá vylepšení downloaderu (#1944 by @kapodamy): + * přidat chybějící bílé ikony a použít hardcorový způsob změny barev ikon + * kontrola, zda je iterátor inicializován (oprava #2031) + * umožnit opakování stahování při chybě "post-processing failed" v novém muxeru + * nový muxer MPEG-4 opravuje nesynchronní video a audio toky (#2039) diff --git a/fastlane/metadata/android/cs/changelogs/730.txt b/fastlane/metadata/android/cs/changelogs/730.txt new file mode 100644 index 00000000000..13d0879c898 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/730.txt @@ -0,0 +1,2 @@ +# Fixed +- Znovu opravte chybu funkce dešifrování. diff --git a/fastlane/metadata/android/cs/changelogs/740.txt b/fastlane/metadata/android/cs/changelogs/740.txt new file mode 100644 index 00000000000..479d25e25a2 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/740.txt @@ -0,0 +1,23 @@ +

Improvements

+
    +
  • make links in comments clickable, increase text size
  • +
  • seek on clicking timestamp links in comments
  • +
  • show preferred tab based on recently selected state
  • +
  • add playlist to queue when long clicking on 'Background' in playlist window
  • +
  • search for shared text when it is not an URL
  • +
  • add "share at current time" button to the main video player
  • +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- diff --git a/fastlane/metadata/android/cs/changelogs/750.txt b/fastlane/metadata/android/cs/changelogs/750.txt new file mode 100644 index 00000000000..325be0c281e --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/750.txt @@ -0,0 +1,14 @@ +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 diff --git a/fastlane/metadata/android/cs/changelogs/760.txt b/fastlane/metadata/android/cs/changelogs/760.txt new file mode 100644 index 00000000000..d449ec53a37 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/760.txt @@ -0,0 +1,14 @@ +Změny ve verzi 0.17.1 + +Nové stránky +- Thajská lokalizace + + +Vylepšené stránky +- Znovu přidána akce "začít přehrávat zde" v nabídkách pro dlouhé stisknutí pro seznamy skladeb #2518 +- Přidání přepínače pro výběr souborů SAF / legacy #2521 + +Opraveno +- Oprava mizení tlačítek v zobrazení stahování při přepínání aplikací #2487 +- Oprava pozice přehrávání se ukládá, i když je vypnutá historie sledování +- Oprava sníženého výkonu způsobeného pozicí přehrávání v zobrazeních seznamu #2517 diff --git a/fastlane/metadata/android/cs/changelogs/770.txt b/fastlane/metadata/android/cs/changelogs/770.txt new file mode 100644 index 00000000000..0a07f6bdd95 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/770.txt @@ -0,0 +1,4 @@ +Změny ve verzi 0.17.2 + +Oprava +- Oprava nebylo k dispozici žádné video diff --git a/fastlane/metadata/android/cs/changelogs/780.txt b/fastlane/metadata/android/cs/changelogs/780.txt new file mode 100644 index 00000000000..32cc03d1f76 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/780.txt @@ -0,0 +1,11 @@ +Změny ve verzi 0.17.3 + +Vylepšené stránky +- Přidána možnost vymazat stavy přehrávání #2550 +- Zobrazení skrytých adresářů ve výběru souborů #2591 +- Podpora otevírání adres URL z instancí `invidio.us` pomocí NewPipe #2488 +- Přidána podpora pro adresy URL `music.youtube.com` TeamNewPipe/NewPipeExtractor#194 + +Opraveno +- YouTube] Opraveno 'java.lang.IllegalArgumentException #192 +- YouTube] Opraveno nefunkční živé vysílání TeamNewPipe/NewPipeExtractor#195 diff --git a/fastlane/metadata/android/cs/changelogs/790.txt b/fastlane/metadata/android/cs/changelogs/790.txt new file mode 100644 index 00000000000..04b5c576324 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/790.txt @@ -0,0 +1,9 @@ +Vylepšené stránky +- Přidání více nadpisů pro zlepšení přístupnosti pro nevidomé #2655 +- Udělejte jazyk nastavení složky pro stahování konzistentnější a méně nejednoznačný #2637 + +Opraveno +- Kontrola, zda je stažen poslední bajt v bloku #2646 +- Opraveno posouvání ve fragmentu detailu videa #2672 +- Odstranění dvojité animace vymazání vyhledávacího pole na jednu #2695 +- [SoundCloud] Oprava extrakce client_id #2745 diff --git a/fastlane/metadata/android/cs/changelogs/800.txt b/fastlane/metadata/android/cs/changelogs/800.txt new file mode 100644 index 00000000000..0a22893f19c --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/800.txt @@ -0,0 +1,10 @@ +Nový +- Podpora PeerTube bez P2P (#2201) [Beta]: + ◦ Sledování a stahování videí z instancí PeerTube + ◦ Přidání instancí v nastavení pro přístup ke kompletnímu světu PeerTube + ◦ V systémech Android 4.4 a 7.1 mohou být při přístupu k některým instancím problémy s přenosem SSL, což může vést k chybě sítě. + +- Downloader (#2679): + ◦ Vypočítat předpokládaný čas stahování + ◦ Stáhnout opus (soubory webm) jako ogg + ◦ Obnovení vypršených odkazů ke stažení pro obnovení stahování po dlouhé pauze diff --git a/fastlane/metadata/android/cs/changelogs/810.txt b/fastlane/metadata/android/cs/changelogs/810.txt new file mode 100644 index 00000000000..c04a9cac9af --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/810.txt @@ -0,0 +1,8 @@ +Nový +- Zobrazení miniatury videa na zamykací obrazovce při přehrávání na pozadí + +Vylepšená stránka +- Přidání místního seznamu skladeb do fronty při dlouhém stisknutí tlačítka na pozadí / vyskakovacího tlačítka +- Umožnit posouvání karet hlavní stránky a jejich skrytí, pokud je k dispozici pouze jedna karta +- Omezit počet aktualizací miniatur oznámení v přehrávači na pozadí +- Přidání fiktivní miniatury pro prázdné místní seznamy skladeb diff --git a/fastlane/metadata/android/cs/changelogs/820.txt b/fastlane/metadata/android/cs/changelogs/820.txt new file mode 100644 index 00000000000..9dc52c6f517 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/820.txt @@ -0,0 +1 @@ +Opraven regex názvu dešifrovací funkce, který znemožňuje použití služby YouTube. diff --git a/fastlane/metadata/android/cs/changelogs/830.txt b/fastlane/metadata/android/cs/changelogs/830.txt new file mode 100644 index 00000000000..1f666691264 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/830.txt @@ -0,0 +1 @@ +Aktualizováno klient_id služby SoundCloud pro opravu problémů se službou SoundCloud. diff --git a/fastlane/metadata/android/cs/changelogs/840.txt b/fastlane/metadata/android/cs/changelogs/840.txt new file mode 100644 index 00000000000..73da3bcc5c8 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/840.txt @@ -0,0 +1,8 @@ +Nový +- Přidán volič jazyka pro změnu jazyka aplikace +- Přidáno tlačítko odeslat do Kodi do skládací nabídky přehrávače +- Přidána možnost kopírování komentářů při dlouhém stisknutí + +Vylepšena stránka +- Oprava aktivity ReCaptcha a správné ukládání získaných souborů cookie +- Odstraněna nabídka s tečkami ve prospěch šuplíku a skrytí tlačítka historie, pokud není v nastavení povolena historie sledování diff --git a/fastlane/metadata/android/cs/changelogs/850.txt b/fastlane/metadata/android/cs/changelogs/850.txt new file mode 100644 index 00000000000..86fa0fc0f66 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/850.txt @@ -0,0 +1 @@ +V tomto vydání byla aktualizována verze webových stránek YouTube. Stará verze webových stránek bude v březnu ukončena, a proto je nutné provést aktualizaci NewPipe. diff --git a/fastlane/metadata/android/cs/changelogs/860.txt b/fastlane/metadata/android/cs/changelogs/860.txt new file mode 100644 index 00000000000..b1d6765f850 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/860.txt @@ -0,0 +1,7 @@ +Vylepšené stránky +- Uložení a obnovení, zda je výška tónu a tempo odpojeno, nebo ne +- Podpora výřezu displeje v přehrávači +- Kulaté zobrazení a počet účastníků +- Optimalizováno pro YouTube tak, aby využívalo méně dat + +V této verzi bylo opraveno více než 15 chyb souvisejících s YouTube. diff --git a/fastlane/metadata/android/cs/changelogs/870.txt b/fastlane/metadata/android/cs/changelogs/870.txt new file mode 100644 index 00000000000..27cc41b5daa --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/870.txt @@ -0,0 +1,2 @@ +Jedná se o opravnou verzi, která aktualizuje NewPipe tak, aby opět umožňovala používání služby SoundCloud bez větších potíží. +V extraktoru se nyní používá rozhraní API SoundCloud v2 a byla vylepšena detekce neplatných ID klientů. diff --git a/fastlane/metadata/android/cs/changelogs/900.txt b/fastlane/metadata/android/cs/changelogs/900.txt new file mode 100644 index 00000000000..301ced05932 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/900.txt @@ -0,0 +1,13 @@ +Nový +- Skupiny předplatného a tříděné kanály +- Tlačítko ztlumení zvuku v přehrávačích + +Vylepšené stránky +- Povoleno otevírání odkazů na music.youtube.com a media.ccc.de v aplikaci NewPipe +- Přemístění dvou nastavení ze vzhledu do obsahu +- Skrytí možností vyhledávání po 5, 15 a 25 sekundách, pokud je povoleno nepřesné vyhledávání + +Opraveno +- některá videa WebM nelze zobrazit +- zálohování databáze v systému Android P +- pád při sdílení staženého souboru diff --git a/fastlane/metadata/android/cs/changelogs/910.txt b/fastlane/metadata/android/cs/changelogs/910.txt new file mode 100644 index 00000000000..130b5dc8707 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/910.txt @@ -0,0 +1 @@ +Opravena migrace databáze, která v některých vzácných případech znemožňovala spuštění aplikace NewPipe. diff --git a/fastlane/metadata/android/cs/changelogs/920.txt b/fastlane/metadata/android/cs/changelogs/920.txt new file mode 100644 index 00000000000..b5e3167ee3f --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/920.txt @@ -0,0 +1,9 @@ +Vylepšeno + +- Přidáno datum nahrání a počet zobrazení na položkách mřížky streamu +- Vylepšení rozvržení záhlaví zásuvky + +Opraveno + +- Opraveno tlačítko ztlumení zvuku způsobující pády na rozhraní API 19 +- Opraveno stahování dlouhých videí 1080p 60fps diff --git a/fastlane/metadata/android/cs/changelogs/930.txt b/fastlane/metadata/android/cs/changelogs/930.txt new file mode 100644 index 00000000000..e72a3a61c47 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/930.txt @@ -0,0 +1,10 @@ +Nový +- Vyhledávání na YouTube Music +- Základní podpora Android TV + +Vylepšené stránky +- Přidána možnost odstranit všechna sledovaná videa z místního seznamu skladeb +- Zobrazení zprávy, když obsah ještě není podporován, místo pádu. +- Vylepšena změna velikosti vyskakovacího přehrávače pomocí gest štípnutí +- Enqueue streamy při dlouhém stisknutí tlačítek na pozadí a vyskakovacích tlačítek v kanálu +- Vylepšené zpracování velikosti záhlaví zásuvky diff --git a/fastlane/metadata/android/cs/changelogs/940.txt b/fastlane/metadata/android/cs/changelogs/940.txt new file mode 100644 index 00000000000..7988003d8d2 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/940.txt @@ -0,0 +1,9 @@ +Nový +- Přidání podpory pro komentáře SoundCloud +- Přidání nastavení omezeného režimu YouTube +- Zobrazení podrobností o nadřazeném kanálu PeerTube + +Vylepšené stránky +- Zobrazení tlačítka Kore pouze pro podporované služby +- Blokování gest přehrávače, která začínají na panelu NavigationBar nebo StatusBar +- Změna barvy pozadí tlačítek opakování a přihlášení k odběru na základě barvy služby diff --git a/fastlane/metadata/android/cs/changelogs/950.txt b/fastlane/metadata/android/cs/changelogs/950.txt new file mode 100644 index 00000000000..21e52a36556 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/950.txt @@ -0,0 +1,4 @@ +Tato verze přináší tři drobné opravy: +- Oprava přístupu k úložišti v systému Adroid 10+ +- Opraveno otevírání kiosků +- Opraveno rozbor trvání dlouhých videí diff --git a/fastlane/metadata/android/cs/changelogs/951.txt b/fastlane/metadata/android/cs/changelogs/951.txt new file mode 100644 index 00000000000..e5e3b3a6475 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/951.txt @@ -0,0 +1,6 @@ +Nový +- Přidání vyhledávání pro výběr odběru v dialogovém okně skupiny kanálů +- Přidání filtru do dialogového okna skupiny kanálů pro zobrazení pouze neseskupených odběrů +- Přidání karty seznamu skladeb na hlavní stránku +- Rychlé převíjení vpřed/vzad ve frontě přehrávačů na pozadí/vyskočení. +- Zobrazení návrhu vyhledávání: mysleli jste a zobrazení výsledku pro diff --git a/fastlane/metadata/android/cs/changelogs/953.txt b/fastlane/metadata/android/cs/changelogs/953.txt new file mode 100644 index 00000000000..cb762686232 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/953.txt @@ -0,0 +1 @@ +Oprava extrakce dešifrovací funkce YouTube. diff --git a/fastlane/metadata/android/cs/changelogs/954.txt b/fastlane/metadata/android/cs/changelogs/954.txt new file mode 100644 index 00000000000..e07b70aa2e9 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/954.txt @@ -0,0 +1,6 @@ +- nový pracovní postup aplikace: přehrávání videí na stránce s detailem, přejetí prstem dolů pro minimalizaci přehrávače +- Oznámení MediaStyle: přizpůsobitelné akce v oznámeních, zlepšení výkonu +- základní změna velikosti při používání aplikace NewPipe jako aplikace pro stolní počítače + +- zobrazení dialogu s možnostmi otevření v případě přípitku nepodporované adresy URL +- Zlepšení zkušeností s návrhy vyhledávání, pokud nelze načíst ty vzdálené diff --git a/fastlane/metadata/android/cs/changelogs/955.txt b/fastlane/metadata/android/cs/changelogs/955.txt new file mode 100644 index 00000000000..ed158e34b8e --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/955.txt @@ -0,0 +1,3 @@ +[YouTube] Oprava vyhledávání pro některé uživatele +[YouTube] Oprava náhodných výjimek při dešifrování +[SoundCloud] Adresy URL, které končí lomítkem, jsou nyní zpracovávány správně diff --git a/fastlane/metadata/android/cs/changelogs/956.txt b/fastlane/metadata/android/cs/changelogs/956.txt new file mode 100644 index 00000000000..f3188257313 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] Opraveno selhání při načítání jakéhokoli videa diff --git a/fastlane/metadata/android/cs/changelogs/957.txt b/fastlane/metadata/android/cs/changelogs/957.txt new file mode 100644 index 00000000000..666c5109725 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/957.txt @@ -0,0 +1,8 @@ +- Sjednocení specifických akcí enqueue do jedné +- Gesto dvěma prsty pro zavření přehrávače +- Povolení vymazání souborů cookie reCAPTCHA +- Možnost nezabarvovat oznámení +- Vylepšení způsobu otevírání detailů videa s cílem opravit nekonečné vyrovnávací paměti, chybné chování při sdílení do NewPipe a další nesrovnalosti +- Zrychlení videí na YouTube a oprava videí s věkovým omezením +- Oprava pádu při rychlém převíjení vpřed/vzad +- Nepřeuspořádávat seznamy přetahováním miniatur diff --git a/fastlane/metadata/android/cs/changelogs/958.txt b/fastlane/metadata/android/cs/changelogs/958.txt new file mode 100644 index 00000000000..989f9ad6125 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/958.txt @@ -0,0 +1,15 @@ +Nové a vylepšené: +- Znovu přidána možnost skrýt miniaturu na zamykací obrazovce +- Tažení pro obnovení kanálu +- Vylepšený výkon při načítání místních seznamů + +Opraveno: +- Opraven pád při spuštění aplikace NewPipe po jejím vyjmutí z paměti RAM +- Opraven pád při spuštění, když není připojení k internetu +- Opraveno: Respektování nastavení jasu a nastavení hlasitosti +- YouTube] Opraveny dlouhé seznamy skladeb + +Ostatní: +- Vyčištění kódu a několik interních vylepšení +- Aktualizace závislostí +- diff --git a/fastlane/metadata/android/cs/changelogs/959.txt b/fastlane/metadata/android/cs/changelogs/959.txt new file mode 100644 index 00000000000..18a25645b6d --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/959.txt @@ -0,0 +1,3 @@ +Opravena nekonečná smyčka pádů po otevření hlášení chyb. +Aktualizován seznam instancí PeerTube, které lze automaticky otevřít pomocí NewPipe. +Aktualizovány překlady. diff --git a/fastlane/metadata/android/cs/changelogs/960.txt b/fastlane/metadata/android/cs/changelogs/960.txt new file mode 100644 index 00000000000..c25277f6428 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/960.txt @@ -0,0 +1,4 @@ +- Vylepšený popis možnosti exportu databáze v nastavení. +- Opraveno zpracování komentářů na YouTube. +- Opraveno zobrazení názvu služby media.ccc.de. +- Aktualizovány překlady. diff --git a/fastlane/metadata/android/cs/changelogs/961.txt b/fastlane/metadata/android/cs/changelogs/961.txt new file mode 100644 index 00000000000..db711f0d4c2 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/961.txt @@ -0,0 +1,12 @@ +- [YouTube] Podpora mixu +- [YouTube] Zobrazení informací o veřejnoprávních vysílatelích a Covid-19 +- [media.ccc.de] Přidána nejnovější videa +- Přidán somálský překlad + +- Mnoho interních vylepšení + +- Opraveno sdílení videí z přehrávače +- Opraveno prázdné webové zobrazení ReCaptcha +- Opraven pád, ke kterému docházelo při odebírání streamu ze seznamu +- [PeerTube] Opraveny související streamy +- YouTube] Opraveno vyhledávání hudby na YouTube diff --git a/fastlane/metadata/android/cs/changelogs/963.txt b/fastlane/metadata/android/cs/changelogs/963.txt new file mode 100644 index 00000000000..e971418af19 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/963.txt @@ -0,0 +1 @@ +- [YouTube] Opraveno pokračování kanálu diff --git a/fastlane/metadata/android/cs/changelogs/964.txt b/fastlane/metadata/android/cs/changelogs/964.txt new file mode 100644 index 00000000000..11eacbcd80d --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/964.txt @@ -0,0 +1,8 @@ +- Přidána podpora kapitol v ovládání hráče +- [PeerTube] Přidáno vyhledávání v sépiové barvě +- Znovu přidáno tlačítko pro sdílení v zobrazení detailu videa a popis streamu přesunut do rozložení karet +- Zakázáno obnovení jasu, pokud je gesto jasu zakázáno +- Přidána položka seznamu pro přehrávání videa v Kodi +- Opraven pád v případě, že na některých zařízeních není nastaven výchozí prohlížeč, a vylepšeny dialogy sdílení +- +- diff --git a/fastlane/metadata/android/cs/changelogs/965.txt b/fastlane/metadata/android/cs/changelogs/965.txt new file mode 100644 index 00000000000..c62dfa65c46 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/965.txt @@ -0,0 +1,6 @@ +Opraven pád, ke kterému docházelo při změně pořadí skupin kanálů. +Opraveno získávání dalších videí YouTube z kanálů a seznamů skladeb. +Opraveno získávání komentářů YouTube. +Přidána podpora podcest /watch/, /v/ a /w/ v adresách URL YouTube. +Opraveno získávání id klienta služby SoundCloud a obsahu s geografickým omezením. +Přidána lokalizace do severní kurdštiny. diff --git a/fastlane/metadata/android/cs/changelogs/966.txt b/fastlane/metadata/android/cs/changelogs/966.txt new file mode 100644 index 00000000000..212687b51c4 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/966.txt @@ -0,0 +1,14 @@ +Novinka: +- Přidat novou službu: Bandcamp + +Vylepšeno: +- Přidána možnost, aby aplikace následovala motiv zařízení +- Předcházení některým pádům zobrazením vylepšeného panelu chyb +- Zobrazení více informací o tom, proč je obsah nedostupný +- Hardwarové tlačítko mezerníku spouští přehrávání/pauzu +- Zobrazení přípitku "Stahování zahájeno" + +Opraveno: +- Oprava velmi malé miniatury v detailech videa při přehrávání na pozadí +- Oprava prázdného názvu v minimalizovaném přehrávači +- diff --git a/fastlane/metadata/android/cs/changelogs/967.txt b/fastlane/metadata/android/cs/changelogs/967.txt new file mode 100644 index 00000000000..ba62e27eb8d --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/967.txt @@ -0,0 +1 @@ +Opraveno nesprávné fungování služby YouTube v EU. To bylo způsobeno novým systémem souborů cookie a souhlasu s ochranou osobních údajů, který vyžaduje, aby NewPipe nastavil soubor cookie CONSENT. diff --git a/fastlane/metadata/android/cs/changelogs/968.txt b/fastlane/metadata/android/cs/changelogs/968.txt new file mode 100644 index 00000000000..5c14d8a5ff1 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/968.txt @@ -0,0 +1,7 @@ +Do nabídky dlouhého stisknutí tlačítka byla přidána možnost Podrobnosti o kanálu. +Přidána funkce přejmenování názvu seznamu skladeb z rozhraní seznamu skladeb. +Umožňuje uživateli pozastavit video během jeho ukládání do vyrovnávací paměti. +Vyleštěn bílý motiv. +Opraveno překrývání písem při použití větší velikosti písma. +Opraveno chybějící video na zařízeních Formuler a Zephier. +Opraveny různé pády. diff --git a/fastlane/metadata/android/cs/changelogs/969.txt b/fastlane/metadata/android/cs/changelogs/969.txt new file mode 100644 index 00000000000..8c581404790 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/969.txt @@ -0,0 +1,8 @@ +- Povolení instalace na externí úložiště +- [Bandcamp] Přidána podpora pro zobrazení prvních tří komentářů u streamu +- Zobrazení přípitku "stahování zahájeno" pouze po zahájení stahování +- Nenastavovat soubor cookie reCaptcha, pokud není uložen žádný soubor cookie +- Přehrávač] Zlepšení výkonu mezipaměti +- Přehrávač] Opraveno automatické nepřehrávání přehrávače +- Zrušit předchozí Snackbary při mazání stahování +- Opraven pokus o odstranění objektu, který není v seznamu diff --git a/fastlane/metadata/android/cs/changelogs/970.txt b/fastlane/metadata/android/cs/changelogs/970.txt new file mode 100644 index 00000000000..f526adf8c96 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/970.txt @@ -0,0 +1,11 @@ +Nový +- Zobrazení metadat obsahu (značky, kategorie, licence, ...) pod popisem +- Přidána možnost "Zobrazit podrobnosti o kanálu" ve vzdálených (nelokálních) seznamech skladeb +- Přidána možnost "Otevřít v prohlížeči" do nabídky dlouhého stisknutí tlačítka + +Opravena stránka +- Opraven pád při otáčení na stránce s podrobnostmi o videu +- Opraveno tlačítko "Přehrát s Kodi" v přehrávači, které vždy vyzve k instalaci aplikace Kore +- Opraveno a vylepšeno nastavení cest pro import a export +- +- diff --git a/fastlane/metadata/android/cs/changelogs/971.txt b/fastlane/metadata/android/cs/changelogs/971.txt new file mode 100644 index 00000000000..481b9edf1ec --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/971.txt @@ -0,0 +1,3 @@ +Hotfix +- Zvětšení vyrovnávací paměti pro přehrávání po obnovení vyrovnávací paměti +- Opraven pád na tabletech a televizorech při kliknutí na ikonu přehrávání v přehrávači diff --git a/fastlane/metadata/android/cs/changelogs/972.txt b/fastlane/metadata/android/cs/changelogs/972.txt new file mode 100644 index 00000000000..d0989c7b937 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/972.txt @@ -0,0 +1,14 @@ +Nový +Rozpoznání časových razítek a hashtagů v popisu +Přidáno ruční nastavení režimu tabletu +Přidána možnost skrýt přehrávané položky ve zdroji + +Vylepšený +Správná podpora rozhraní Storage Access Framework +Lepší zpracování chyb nedostupných a ukončených kanálů +List sdílení Android pro uživatele Androidu 10+ nyní zobrazuje název obsahu. +Aktualizované instance Invidious a podpora předávaných odkazů. + +Stabilní +[YouTube] Obsah s věkovým omezením +- diff --git a/fastlane/metadata/android/cs/changelogs/973.txt b/fastlane/metadata/android/cs/changelogs/973.txt new file mode 100644 index 00000000000..2eba9ea7c4c --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/973.txt @@ -0,0 +1,4 @@ +Hotfix +- Oprava ořezávání miniatur a názvů v mřížkovém rozložení kvůli špatnému výpočtu, kolik videí se vejde do jednoho řádku. +- Oprava dialogu stahování, který zmizí, aniž by cokoli provedl, pokud je otevřen z nabídky sdílení +- Aktualizace knihovny související s otevíráním externích činností, například výběrem souborů v rámci Storage Access Framework diff --git a/fastlane/metadata/android/cs/changelogs/974.txt b/fastlane/metadata/android/cs/changelogs/974.txt new file mode 100644 index 00000000000..3149e47375c --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/974.txt @@ -0,0 +1,5 @@ +Hotfix +- Oprava problémů s vyrovnávací pamětí způsobených škrcením YouTube +- Oprava extrakce komentářů YouTube a pádů s vypnutými komentáři +- Oprava vyhledávání hudby na YouTube +- Oprava živých přenosů PeerTube diff --git a/fastlane/metadata/android/cs/changelogs/975.txt b/fastlane/metadata/android/cs/changelogs/975.txt new file mode 100644 index 00000000000..839bf0e3680 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/975.txt @@ -0,0 +1,17 @@ +Nový +- Zobrazení náhledu miniatur při hledání +- Rozpoznání zakázaných komentářů +- Umožňuje označit položku kanálu jako sledovanou +- Zobrazit srdíčka komentářů + +Vylepšené stránky +- Vylepšení rozvržení metadat a značek +- Použití barvy služby na součásti uživatelského rozhraní + +Opraveno +- Oprava miniatur v mini přehrávači +- Oprava nekonečného vyrovnávací paměti u duplicitních položek fronty +- Opravy některých přehrávačů, jako je otáčení a rychlejší zavírání +- +- +- diff --git a/fastlane/metadata/android/cs/changelogs/976.txt b/fastlane/metadata/android/cs/changelogs/976.txt new file mode 100644 index 00000000000..cc28400f559 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/976.txt @@ -0,0 +1,10 @@ +- Přidána možnost přímého otevření přehrávače ve fullscreenu +- Umožňuje vybrat, které typy návrhů vyhledávání se mají zobrazit +- Tmavé téma je nyní tmavší + přidána tmavá úvodní obrazovka +- Vylepšený nástroj pro výběr souborů, který šedě označuje nechtěné soubory +- Opraven import odběrů YouTube +- Opakované přehrávání streamu vyžaduje opětovné klepnutí na tlačítko přehrávání +- Opraveno ukončení zvukové relace +- +- +-. diff --git a/fastlane/metadata/android/cs/changelogs/977.txt b/fastlane/metadata/android/cs/changelogs/977.txt new file mode 100644 index 00000000000..3418d9d4356 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/977.txt @@ -0,0 +1,10 @@ +- Do nabídky dlouhého stisku bylo přidáno tlačítko "přehrát další". +- Do filtru záměrů byla přidána předpona cesty ke krátkým filmům YouTube +- Opraven import nastavení +- Výměna pozice panelu vyhledávání s tlačítky přehrávače na obrazovce Fronta +- Různé opravy související se správcem MediasessionManager +- Opraveno nedokončení panelu vyhledávání po skončení videa +- Zakázáno tunelování médií na RealtekATV +- Rozšířena klikatelná oblast minimalizovaných tlačítek přehrávače + +-. diff --git a/fastlane/metadata/android/cs/changelogs/978.txt b/fastlane/metadata/android/cs/changelogs/978.txt new file mode 100644 index 00000000000..caaf1ac5732 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/978.txt @@ -0,0 +1 @@ +Opraveno provádění kontroly nové verze NewPipe. Tato kontrola se někdy prováděla příliš brzy, a proto vedla k pádu aplikace. To by nyní mělo být opraveno. diff --git a/fastlane/metadata/android/cs/changelogs/979.txt b/fastlane/metadata/android/cs/changelogs/979.txt new file mode 100644 index 00000000000..8d3ee14924b --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/979.txt @@ -0,0 +1,2 @@ +- Opraveno obnovení přehrávání +- Vylepšení zajišťující, že služba, která určuje, zda má NewPipe kontrolovat nové verze, není spuštěna na pozadí diff --git a/fastlane/metadata/android/cs/changelogs/980.txt b/fastlane/metadata/android/cs/changelogs/980.txt new file mode 100644 index 00000000000..59139b3a2bd --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/980.txt @@ -0,0 +1,13 @@ +Nový +- Přidání možnosti "Přidat do seznamu skladeb" do nabídky sdílení +- Přidána podpora pro krátké odkazy na y2u.be a PeerTube + +Vylepšené stránky +- Kompaktnější ovládání rychlosti přehrávání +- Kanál nyní zvýrazňuje nové položky +- Možnost "Zobrazit sledované položky" ve feedu je nyní uložena + +Opraveno +- Opravena extrakce lajků a dislajků na YouTube +- Opraveno automatické přehrávání po návratu z pozadí +A mnoho dalšího diff --git a/fastlane/metadata/android/cs/changelogs/981.txt b/fastlane/metadata/android/cs/changelogs/981.txt new file mode 100644 index 00000000000..6dd389fd720 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/981.txt @@ -0,0 +1,2 @@ +Odstraněna podpora MediaParser, aby se opravilo selhání obnovení přehrávání po vyrovnávací paměti v systému Android 11+. +Zakázáno tunelování médií na přehrávači Philips QM16XE, aby se odstranily problémy s přehráváním. diff --git a/fastlane/metadata/android/cs/changelogs/982.txt b/fastlane/metadata/android/cs/changelogs/982.txt new file mode 100644 index 00000000000..c666499a41f --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/982.txt @@ -0,0 +1 @@ +Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube. diff --git a/fastlane/metadata/android/cs/changelogs/983.txt b/fastlane/metadata/android/cs/changelogs/983.txt new file mode 100644 index 00000000000..004ccca65c0 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/983.txt @@ -0,0 +1,9 @@ +Přidání nového uživatelského rozhraní a chování při hledání dvojitým klepnutím +Možnost vyhledávání v nastavení +Zvýraznění připnutých komentářů jako takových +Přidat podporu open-with-app pro instanci FSFE PeerTube +Přidat oznámení o chybách +Oprava přehrávání první položky fronty při změně hráče +Při vyrovnávací paměti během živých přenosů čekat déle, než dojde k selhání +Oprava pořadí výsledků místního vyhledávání +Oprava prázdných políček položek ve frontě přehrávání diff --git a/fastlane/metadata/android/cs/changelogs/984.txt b/fastlane/metadata/android/cs/changelogs/984.txt new file mode 100644 index 00000000000..3b9eb35a4bf --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/984.txt @@ -0,0 +1,7 @@ +načtení dostatečného množství počátečních položek v seznamech, aby zaplnily celou obrazovku, a oprava posouvání na tabletech a televizorech. +Oprava náhodných pádů při procházení seznamů +Nechat překryvný oblouk rychlého vyhledávání hráče přejít pod uživatelské rozhraní systému +Vrátit změny výřezů při přehrávání ve více oknech, které způsobovaly regresi chybně umístěného přehrávače na některých telefonech +Zvýšit compileSdk z 30 na 31 +Aktualizovat knihovnu pro hlášení chyb +- diff --git a/fastlane/metadata/android/cs/changelogs/985.txt b/fastlane/metadata/android/cs/changelogs/985.txt new file mode 100644 index 00000000000..7035a111220 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/985.txt @@ -0,0 +1 @@ +Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube diff --git a/fastlane/metadata/android/cs/changelogs/986.txt b/fastlane/metadata/android/cs/changelogs/986.txt new file mode 100644 index 00000000000..0ffe8dabc51 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/986.txt @@ -0,0 +1,16 @@ +Nový +• Oznámení o nových streamech +• Bezproblémový přechod mezi přehrávači na pozadí a videem +• Změna výšky tónu podle půltónů +• Připojení fronty hlavního přehrávače k seznamu skladeb + +Vylepšený +• Zapamatujte si velikost kroku rychlosti / stoupání +• Zmírnění počátečního dlouhého ukládání do vyrovnávací paměti v přehrávači videa +• Vylepšete uživatelské rozhraní přehrávače pro Android TV +• Potvrďte před odstraněním všech stažených souborů + +Stabilní +• +• +• diff --git a/fastlane/metadata/android/cs/changelogs/987.txt b/fastlane/metadata/android/cs/changelogs/987.txt new file mode 100644 index 00000000000..51cd846c2a1 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/987.txt @@ -0,0 +1,12 @@ +Nový +- Podpora jiných způsobů doručování než progresivního HTTP: rychlejší načítání přehrávání, opravy pro PeerTube a SoundCloud, přehrávání nedávno ukončených živých přenosů na YouTube. +- Tlačítko Přidat pro přidání vzdáleného seznamu skladeb do místního seznamu skladeb +- Náhled obrázku ve sdíleném listu systému Android 10+ + +Vylepšená stránka +- Vylepšení dialogového okna s parametry přehrávání +- Přesunutí tlačítek pro import/export předplatného do nabídky se třemi tečkami + +Opraveno +- +- diff --git a/fastlane/metadata/android/cs/changelogs/988.txt b/fastlane/metadata/android/cs/changelogs/988.txt new file mode 100644 index 00000000000..76da8121ccb --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Oprava chyby "Nelze načíst žádný stream" při pokusu o přehrání jakéhokoli videa +[YouTube] Oprava zprávy "Následující obsah není v této aplikaci k dispozici." zobrazené místo požadovaného videa diff --git a/fastlane/metadata/android/cs/changelogs/989.txt b/fastlane/metadata/android/cs/changelogs/989.txt new file mode 100644 index 00000000000..08ce8dd95ae --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Oprava nekonečného načítání při pokusu přehrát jakékoli video +• [YouTube] Oprava omezování výkonu u některých videí +• Aktualizace knihovny jsoup na verzi 1.15.3, která obsahuje bezpečnostní opravu diff --git a/fastlane/metadata/android/de/changelogs/987.txt b/fastlane/metadata/android/de/changelogs/987.txt index b6870154cb6..a857b1caac3 100644 --- a/fastlane/metadata/android/de/changelogs/987.txt +++ b/fastlane/metadata/android/de/changelogs/987.txt @@ -9,4 +9,4 @@ Verbesserte Behoben - Fix: Entfernen vollständig angesehener Videos aus der Wiedergabeliste -- Repariert das Thema des Freigabemenüs und den Eintrag "Zur Wiedergabeliste hinzufügen". +- Repariert das Thema des Freigabemenüs und den Eintrag "Zur Wiedergabeliste hinzufügen" diff --git a/fastlane/metadata/android/fr/changelogs/63.txt b/fastlane/metadata/android/fr/changelogs/63.txt index be078632bfb..b9abcd760aa 100644 --- a/fastlane/metadata/android/fr/changelogs/63.txt +++ b/fastlane/metadata/android/fr/changelogs/63.txt @@ -1,8 +1,8 @@ ### Améliorations -- Importation/exportation des paramètres #1333 +- Import/export des paramètres #1333 - Réduction overdraw (amélioration des performances) #1371 - Petites améliorations du code #1375 -- GDPR #1420 +- Ajout d'un popup RGPD #1420 ### Corrections - Téléchargeur : Correction d'un plantage lors du chargement de téléchargements inachevés de fichiers .giga #1407 diff --git a/fastlane/metadata/android/fr/changelogs/65.txt b/fastlane/metadata/android/fr/changelogs/65.txt new file mode 100644 index 00000000000..bb664a3cb18 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/65.txt @@ -0,0 +1,26 @@ +### Améliorations + +- L'animation de l'icône du burgermenu a été désactivé #1486 +- Annulation de la suppression des téléchargements #1472 +- Option de téléchargement dans le menu de partage #1498 +- Ajout d'une option de partage dans le menu "long tap" #1454 +- Réduction du lecteur principal à la sortie #1354 +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 +- Mise à jour de ExoPlayer 2.8.2 #1392 + - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. + - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). + - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. + - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. + - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. +- Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. + +### Corrections + +- Correction #1440 Disposition des informations vidéo cassée #1491 +- Correction de l'historique des vues #1497 + - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. +- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) +- Correction du lecteur vidéo principal #1509 + - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. + - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/66.txt b/fastlane/metadata/android/fr/changelogs/66.txt new file mode 100644 index 00000000000..3a94c81e03f --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/66.txt @@ -0,0 +1,28 @@ +# Journal des modifications de la v0.13.6 + +### Améliorations + +- L'animation de l'icône du menu « hamburger » a été désactivée #1486 +- Annulation de la suppression des téléchargements #1472 +- Option de téléchargement dans le menu de partage #1498 +- Ajout d'une option de partage dans le menu "long tap" #1454 +- Réduction du lecteur principal à la sortie #1354 +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 +- Mise à jour de ExoPlayer 2.8.2 #1392 + - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. + - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). + - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. + - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. + - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. +- Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. + +### Corrections + +- Correction #1440 Disposition des informations vidéo cassée #1491 +- Correction de l'historique des vues #1497 + - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. +- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) +- Correction du lecteur vidéo principal #1509 + - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. + - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/68.txt b/fastlane/metadata/android/fr/changelogs/68.txt new file mode 100644 index 00000000000..9b2760c35fd --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/68.txt @@ -0,0 +1,31 @@ +# Modifications v0.14.1 + +### Corrections +- Échec du décryptage de l'URL vidéo #1659 +- Lien de description, ne s'extrayait pas bien #1657 + +# Modifications v0.14.0 + +### Nouveautés +- Design du dossier #1461 +- Page d'accueil personnalisable #1461 + +### Améliorations +- Contrôles gestuels retravaillés #1604 +- Nouvelle façon de fermer le lecteur popup #1597 + +### Corrections +- Erreur lorsque le nombre d'abonnements n'est pas disponible. Ferme #1649. + - Affiche "le nombre d'abonnés non disponible" dans ces cas. +- NPE lorsqu'une liste de lecture YouTube est vide. +- Kiosques dans SoundCloud +- Refactor et correction du bug #1623 +- Résultat de recherche cyclique #1562 +- Barre de recherche qui n'est pas mise en page de manière statique +- Vidéos YT Premium qui ne sont pas bloquées correctement +- Vidéos qui ne se chargent pas toujours (à cause du parsing DASH) +- Liens dans la description des vidéos +- Afficher un avertissement lorsque quelqu'un essaie de télécharger vers une carte SD externe +- Exception "rien indiqué" qui déclenche un rapport +- La vignette ne s'affiche pas dans le lecteur de fond pour Android 8.1 [voir ici](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Enregistrement du récepteur de diffusion. Ferme le dossier #1641. diff --git a/fastlane/metadata/android/fr/changelogs/69.txt b/fastlane/metadata/android/fr/changelogs/69.txt new file mode 100644 index 00000000000..c96b390d9f9 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/69.txt @@ -0,0 +1,19 @@ +### Nouveau +- Suppression et partage par appui long dans les abonnements #1516 +- Interface utilisateur pour tablettes et disposition de la liste en grille #1617 + +### Améliorations +- Stockage/recharge du dernier rapport d'aspect utilisé #1748 +- Activation de la disposition linéaire dans l'activité Téléchargements avec les noms complets des vidéos #1771 +- Suppression et partage des abonnements directement à partir de l'onglet abonnements #1516 +- La mise en file d'attente déclenche désormais la lecture de la vidéo si la file d'attente de lecture est déjà terminée #1783 +- Paramètres distincts pour les gestes de volume et de luminosité #1644 +- Ajout de la prise en charge de la localisation #1792 + +### Corrections +- Analyse de l'heure pour le format . , afin que NewPipe puisse être utilisé en Finlande. +- Compte d'abonnement +- Ajout permission de service de premier plan pour les appareils API 28+ #1830 + +### Bugs connus +- État de lecture ne peut être enregistré sur Android P diff --git a/fastlane/metadata/android/fr/changelogs/70.txt b/fastlane/metadata/android/fr/changelogs/70.txt new file mode 100644 index 00000000000..fccfccd2bfe --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/70.txt @@ -0,0 +1,25 @@ +ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ + +### Améliorations +* Les fichiers téléchargés peuvent maintenant être ouverts en un seul clic. +* Suppression du support pour Android 4.1 - 4.3 #1884 +* Suppression de l'ancien lecteur #1884 +* Suppression des flux de la file d'attente de lecture actuelle en les faisant glisser vers la droite #1915 +* Suppression du flux en file d'attente automatique lorsqu'un nouveau flux est mis en file d'attente manuellement #1878 +* Post-traitement pour les téléchargements et implémentation des fonctionnalités manquantes #1759 par @kapodamy + * Infrastructure de post-traitement + * Infrastructure de gestion des erreurs (pour le téléchargeur) + * File d'attente au lieu de téléchargements multiples + * Déplacer les téléchargements sérialisés en attente (fichiers `.giga`) vers les données de l'application. + * Implémentation de la répétition maximale des téléchargements + * Mise en pause des téléchargements multi-threads + * Arrêter les téléchargements lors du passage au réseau mobile (ne fonctionne jamais, voir 2ème point) + * Sauvegarder le nombre de threads pour les prochains téléchargements + * Beaucoup d'incohérences corrigées + +### Corrigé +* Correction d'un crash avec la résolution par défaut réglée sur la meilleure et la résolution limitée des données mobiles #1835 +* Correction du crash du lecteur de pop-up #1874 +* NPE lors de l'ouverture du lecteur de fond #1901 +* Correction de l'insertion de nouveaux flux lorsque la mise en file d'attente automatique est activée #1878 +* Correction du problème de décryptage de Shuttown diff --git a/fastlane/metadata/android/fr/changelogs/71.txt b/fastlane/metadata/android/fr/changelogs/71.txt index 0fa046111b4..4d1a5b1f69b 100644 --- a/fastlane/metadata/android/fr/changelogs/71.txt +++ b/fastlane/metadata/android/fr/changelogs/71.txt @@ -1,10 +1,10 @@ ### Améliorations -* Notification maj GitHub (#1608 par @krtkush) -* Améliorations téléchargeur (#1944 par @kapodamy) : -  * icônes blanches manquantes ; utilisation d'une méthode pour changer leurs couleurs -  * vérification si l'itérateur est initialisé (#2031) - * réessayer les téléchargements post-processing failed dans le nouveau muxer -  * nouveau muxer MPEG-4 corrigeant les flux non synchrones (#2039) +* Notification maj GitHub #1608 +* Améliorations téléchargeur #1944 : +  * Ajout des icônes blanches manquantes et utilisation d'une méthode hardcodé pour changer leurs couleurs +  * Vérification si l'itérateur est initialisé (#2031) + * Autoriser le ré-essai de téléchargement après une erreur "post-processing failed" dans le nouveau muxer +  * Nouveau muxer MPEG-4 corrigeant les flux non synchrones (#2039) ### Corrections -* Flux YouTube en direct s'arrêtent (#1996 par @yausername) +* Flux YouTube en direct s'arrêtent #1996 diff --git a/fastlane/metadata/android/fr/changelogs/964.txt b/fastlane/metadata/android/fr/changelogs/964.txt new file mode 100644 index 00000000000..4d65340fccd --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/964.txt @@ -0,0 +1,8 @@ +• Ajout des chapitres dans lecteur +• [PeerTube] Ajout recherche en sépia +• Ajout bouton de partage en vue détaillée de la vidéo, déplacement description du flux dans l'onglet +• Désactivation restauration de luminosité si le geste est désactivé +• Ajout élément de liste pour lire vidéos sur Kodi +• Correction crash si aucun navigateur par défaut défini, amélioration dialogues de partage +• Basculer lecture/pause avec bouton d'espace matériel en lecteur plein écran +• [media.ccc.de] Corrections diff --git a/fastlane/metadata/android/fr/changelogs/966.txt b/fastlane/metadata/android/fr/changelogs/966.txt new file mode 100644 index 00000000000..7cbe82fbfc3 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/966.txt @@ -0,0 +1,14 @@ +Nouveautés +• Ajout Bandcamp + +Améliorations +• Ajout option pour que application suive thème de l'appareil +• Prévention plantages par affichage panneau d'erreurs amélioré +• Plus d'informations sur raison indisponibilité contenu +• Bouton matériel espace déclenche lecture/pause +• Affichage toast "Téléchargement commencé" + +Corrections +• Très petite vignette dans détails de vidéo lors de lecture en arrière-plan +• Titre vide dans lecteur réduit +• Dernier mode redimensionnement pas restauré correctement diff --git a/fastlane/metadata/android/fr/changelogs/969.txt b/fastlane/metadata/android/fr/changelogs/969.txt new file mode 100644 index 00000000000..6ac4a9467d6 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/969.txt @@ -0,0 +1,8 @@ +• Autoriser installation sur un stockage externe +• [Bandcamp] Ajout fonction permettant d'afficher les trois premiers commentaires d'un flux +• Afficher 'download has started' uniquement lorsque téléchargement lancé +• Ne pas définir cookie reCaptcha lorsqu'aucun n'est stocké +• [Player] Amélioration performances cache +• [Player] Correction problème lecture automatique +• Désactiver barres d'état précédentes lors suppr. des téléchargements +• Correction suppression objet ne figurant pas dans la liste diff --git a/fastlane/metadata/android/fr/changelogs/970.txt b/fastlane/metadata/android/fr/changelogs/970.txt new file mode 100644 index 00000000000..928d3782222 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/970.txt @@ -0,0 +1,11 @@ +Nouveautés +• Affichage métadonnées du contenu sous la description +• Ajout option "Afficher les détails de la chaîne" dans les playlists distantes +• Ajout option "Ouvrir dans le navigateur" dans le menu de la touche longue + +Corrections +• Correction d'un crash de rotation sur la page de détails de la vidéo +• Correction du bouton "Jouer avec Kodi" qui demande toujours d'installer Kore +• Correction chemins d'import/export des paramètres +• Correction nombre de commentaires aimés +Et bien plus encore diff --git a/fastlane/metadata/android/fr/changelogs/971.txt b/fastlane/metadata/android/fr/changelogs/971.txt new file mode 100644 index 00000000000..3b302a06b1e --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/971.txt @@ -0,0 +1,3 @@ +Correctifs +• Augmentation de la mémoire tampon pour la lecture après le re-buffer +• Correction d'un crash sur les tablettes et les téléviseurs lors d'un clic sur l'icône de la file d'attente dans le lecteur diff --git a/fastlane/metadata/android/fr/changelogs/973.txt b/fastlane/metadata/android/fr/changelogs/973.txt new file mode 100644 index 00000000000..667279399e3 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/973.txt @@ -0,0 +1,4 @@ +Correctifs +• Correction des vignettes et des titres qui sont coupés dans la mise en page en vue grille, dû à un calcul erroné du nombre de vidéos pouvant tenir dans une rangée. +• Correction de la boîte de dialogue de téléchargement qui disparaît sans rien faire si elle est ouverte à partir du menu de partage +• Maj d'une bibliothèque liée à l'ouverture d'activités externes telles que le sélecteur de fichiers du framewok d'accès stockage diff --git a/fastlane/metadata/android/fr/changelogs/974.txt b/fastlane/metadata/android/fr/changelogs/974.txt new file mode 100644 index 00000000000..d963abe2410 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/974.txt @@ -0,0 +1,5 @@ +Correctifs +• Correction des problèmes de mise en mémoire tampon causés par la restriction de débit de YouTube +• Correction de l'extraction des commentaires de YouTube et des plantages avec les commentaires désactivés +• Correction de la recherche de musique sur YouTube +• Correction des directs PeerTube diff --git a/fastlane/metadata/android/fr/changelogs/977.txt b/fastlane/metadata/android/fr/changelogs/977.txt new file mode 100644 index 00000000000..6232ffa756d --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/977.txt @@ -0,0 +1,8 @@ +• Ajout bouton "lecture suivante" au menu de la pression longue +• Ajout préfixe du chemin des shorts YouTube au filtre d'intention +• Correction importation des paramètres +• Permutation position barre de recherche avec boutons du lecteur dans l'écran de la file d'attente +• Corrections liées à MediasessionManager +• Correction barre de progression qui ne se termine pas après fin de vidéo +• Désactivation tunneling média sur RealtekATV +• Élargissement zone cliquable des boutons de lecture minimisés diff --git a/fastlane/metadata/android/fr/changelogs/980.txt b/fastlane/metadata/android/fr/changelogs/980.txt new file mode 100644 index 00000000000..6835f70c8a3 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/980.txt @@ -0,0 +1,13 @@ +Nouveautés +• Ajout option "Ajouter à la liste de lecture" au menu de partage +• Ajout prise en charge des liens courts y2u.be et PeerTube + +Améliorations +• Commandes de vitesse de lecture plus compactes +• Le flux met désormais en évidence les nouveaux éléments +• L'option "Afficher les éléments surveillés" dans le flux est maintenant enregistrée + +Corrections +• Correction extraction des likes/dislikes de YouTube +• Correction relecture automatique après le retour de l'arrière-plan +Et bien d'autres diff --git a/fastlane/metadata/android/fr/changelogs/987.txt b/fastlane/metadata/android/fr/changelogs/987.txt index e0e1bd7bd15..1641d9a0016 100644 --- a/fastlane/metadata/android/fr/changelogs/987.txt +++ b/fastlane/metadata/android/fr/changelogs/987.txt @@ -1,8 +1,8 @@ Nouveautés -• Prise en charge de d'autres méthodes de diffusion que le HTTP progressif : temps de chargement plus rapide, corrections pour PeerTube et SoundCloud, lecture des nouveaux flux en directs de YouTube -• Boutton pour ajouter une liste de lecture distante à une locale +• Prise en charge d'autres méthodes de diffusion que le HTTP progressif : temps de chargement plus rapide, corrections pour PeerTube et SoundCloud, lecture des nouveaux flux en directs de YouTube +• Bouton pour ajouter une liste de lecture distante à une locale • Prévisualisation d'images lors d'un partage pour Andoid 10+ Améliorations • Amélioration de la boîte de dialogue des paramètres de la lecture -• Déplacement des bouttons importation/exportation vers le menu à trois points +• Déplacement des boutons importation/exportation vers le menu à trois points diff --git a/fastlane/metadata/android/fr/changelogs/988.txt b/fastlane/metadata/android/fr/changelogs/988.txt new file mode 100644 index 00000000000..7ac03bb2ac2 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Correction de l'erreur « Impossible d'obtenir un flux » lors de la lecture d'une vidéo +[YouTube] Correction du message « Le contenu suivant n'est pas disponible sur cette application. » affiché à la place de la vidéo demandée diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt index a593ce32c93..70048c15a31 100644 --- a/fastlane/metadata/android/fr/short_description.txt +++ b/fastlane/metadata/android/fr/short_description.txt @@ -1 +1 @@ -Un lecteur multimédia libre et léger pour Android. +Une interface pour YouTube libre et légère sur Android. diff --git a/fastlane/metadata/android/he/changelogs/988.txt b/fastlane/metadata/android/he/changelogs/988.txt new file mode 100644 index 00000000000..fc69457f787 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] תוקנה השגיאה „אי אפשר לקבל שום תזרים” בעת ניסיון לנגן סרטונים +[YouTube] תוקנה ההודעה „התוכן הבא אינו זמין ביישומון הזה” שמופיעה במקום הסרטון המבוקש diff --git a/fastlane/metadata/android/hu/changelogs/65.txt b/fastlane/metadata/android/hu/changelogs/65.txt new file mode 100644 index 00000000000..c3ee63eccdb --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/65.txt @@ -0,0 +1,26 @@ +### Fejlesztések + +- A burgermenu ikon animációjának letiltása #1486 +- a letöltések törlésének visszavonása #1472 +- Letöltési lehetőség a #1498 megosztás menüben +- Megosztási lehetőség hozzáadva a hosszú érintéssel #1454 +- A fő játékos minimalizálása a 1354-es kijáratnál +- A könyvtár verziójának frissítése és az adatbázis biztonsági mentésének javítása #1510 +- ExoPlayer 2.8.2 frissítés #1392 + - Átdolgoztuk a lejátszási sebesség-vezérlő párbeszédpanelt, hogy támogassa a különböző lépésméreteket a gyorsabb sebességváltás érdekében. + - Hozzáadott egy kapcsolót a gyors előretekeréshez a lejátszási sebesség szabályozásában a csendek alatt. Ez hasznos lehet hangoskönyvek és bizonyos zenei műfajok esetében, és valódi zökkenőmentes élményt nyújthat (és megszakíthat egy dalt sok csenddel =\\). + - Átdolgozott médiaforrás felbontás, amely lehetővé teszi a metaadatok továbbítását a média mellett a lejátszón belül, nem pedig manuálisan. Most már egyetlen metaadatforrásunk van, és közvetlenül elérhető a lejátszás megkezdésekor. + - Javítva a távoli lejátszási lista metaadatai, amelyek nem frissülnek, amikor új metaadatok állnak rendelkezésre a lejátszási lista töredékének megnyitásakor. + - Különféle felhasználói felület-javítások: #1383, a háttérben lévő lejátszó értesítési vezérlői mostantól mindig fehérek, a felugró lejátszót egyszerűbben le lehet állítani dobással +- Használjon új kivonatot refaktorált architektúrával a többszolgáltatáshoz + +### Javítások + +- Javítás: #1440 Sérült videó információs elrendezés #1491 +- Előzmények megtekintése #1497. javítás + - #1495, a metaadatok (bélyegkép, cím és videószám) frissítésével, amint a felhasználó hozzáfér a lejátszási listához. + - #1475, egy nézet regisztrálásával az adatbázisban, amikor a felhasználó elindít egy videót a külső lejátszón a részletrészleten. +- Javítsa ki a képernyő időtúllépését felugró mód esetén. #1463 (fix #640) +- Fő videólejátszó javítás #1509 + - [#1412] Javítva az ismétlési mód, ami a játékos NPE-jét okozza, ha új szándék érkezik, miközben a játékos tevékenysége a háttérben van. + - Javítva, hogy a lejátszó előugró ablakra minimalizálja, nem semmisíti meg a lejátszót ha a popup engedélyt nem adják meg. diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt index 0a96f5e90a1..50752eeaf35 100644 --- a/fastlane/metadata/android/hu/short_description.txt +++ b/fastlane/metadata/android/hu/short_description.txt @@ -1 +1 @@ -Egy ingyenes és könnyű YouTube előtétprogram Androidra. +Ingyenes, könnyű YouTube felület Androidra. diff --git a/fastlane/metadata/android/it/changelogs/63.txt b/fastlane/metadata/android/it/changelogs/63.txt index dd8f7324dc7..a342392ad99 100644 --- a/fastlane/metadata/android/it/changelogs/63.txt +++ b/fastlane/metadata/android/it/changelogs/63.txt @@ -1,8 +1,8 @@ ### Miglioramenti -- Impostazioni di importazione / esportazione # 1333 -- Ridotto l'overdraw (miglioramento delle prestazioni) # 1371 -- Piccoli miglioramenti al codice # 1375 -- Aggiunto tutto ciò che riguarda il GDPR # 1420 +- Impostazioni di importazione / esportazione #1333 +- Ridotto l'overdraw (miglioramento delle prestazioni) #1371 +- Piccoli miglioramenti al codice #1375 +- Aggiunto tutto ciò che riguarda il GDPR #1420 ### Risolto -- Downloader: risolto il crash durante il caricamento di download incompleti dai file .giga # 1407 +- Downloader: risolto il crash durante il caricamento di download incompleti dai file .giga #1407 diff --git a/fastlane/metadata/android/it/changelogs/730.txt b/fastlane/metadata/android/it/changelogs/730.txt new file mode 100644 index 00000000000..3df41556f08 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/730.txt @@ -0,0 +1,2 @@ +# Risolto +- Sistemato di nuovo un errore nella funzione di decifrazione. diff --git a/fastlane/metadata/android/ko/changelogs/63.txt b/fastlane/metadata/android/ko/changelogs/63.txt new file mode 100644 index 00000000000..69ca21e9733 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/63.txt @@ -0,0 +1,8 @@ +### 변경점 +- 불러오기/내보내기 세팅 #1333 +- 오버드로우 현상 개선 (성능 개선) #1371 +- 코드 일부분 개선 #1375 +- GDPR에 관한 모든것 업데이트 #1420 + +### 해결된것 +- 다운로더 : 다운로드가 완료되지 않은 .giga파일을 로딩할때 발생하는 에러 해결#1407 diff --git a/fastlane/metadata/android/ko/changelogs/64.txt b/fastlane/metadata/android/ko/changelogs/64.txt new file mode 100644 index 00000000000..4cef85a41cd --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/64.txt @@ -0,0 +1,8 @@ +### 변경점 +- 불러오기/내보내기 세팅 #1333 +- 오버드로우 현상 개선 (성능 개선) #1371 +- 코드 일부분 개선 #1375 +- GDPR에 관한 모든것 업데이트 #1420 + +### 고친것 +- 다운로더 : 다운로드가 완료되지 않은 .giga파일을 로딩할때 발생하는 문제 해결#1407 diff --git a/fastlane/metadata/android/pl/changelogs/964.txt b/fastlane/metadata/android/pl/changelogs/964.txt new file mode 100644 index 00000000000..1684d6985e2 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/964.txt @@ -0,0 +1,8 @@ +• Dodano wsparcie rozdziałów w kontrolkach odtwarzacza +• [PeerTube] Dodano wyszukiwarkę Sepia +• Dodano ponownie przycisk udostępniania w sekcji szczegółów i przeniesiono informacje o strumieniu do układu karty +• Wyłączono przywracanie jasności przy wyłączonych gestach regulacji jasności +• Dodano element listy umożliwiający odtworzenie wideo w Kodi +• Naprawiono błąd przy braku domyślnej przeglądarki na niektórych urządzeniach i usprawniono menu udostępniania +• Przełączanie odtwarzanie/pauza poprzez wciśnięcie spacji na klawiaturze fizycznej w odtwarzaczu pełnoekranowym +• [media.cc.de] Różne poprawki i usprawnienia diff --git a/fastlane/metadata/android/pl/changelogs/965.txt b/fastlane/metadata/android/pl/changelogs/965.txt new file mode 100644 index 00000000000..d336d984d54 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/965.txt @@ -0,0 +1,5 @@ +Naprawiono błąd przy zmianie kolejności grup kanałów. +Naprawiono pobieranie kolejnych wideo z kanałów i playlist. +Naprawiono pobieranie komentarzy w YouTube. Dodano wsparcie dla ścieżek /watch/, /v/ oraz /w/ w URL-ach YouTube. +Naprawiono pobieranie ID użytkownika SoundCloud i zawartości z ograniczeniami geograficznymi. +Dodano język północnokurdyjski. diff --git a/fastlane/metadata/android/pt/changelogs/955.txt b/fastlane/metadata/android/pt/changelogs/955.txt index cd70b41c9ba..98bed58fecd 100644 --- a/fastlane/metadata/android/pt/changelogs/955.txt +++ b/fastlane/metadata/android/pt/changelogs/955.txt @@ -1,3 +1,3 @@ -[YouTube] A procura por alguns utilizadores corrigida -[YouTube] Exceções de desencriptação aleatórias corrigidas -[SounCloud] URLs que terminam com uma barra são agora analisados corretamente +[YouTube] O problema com busca que afetava utilizadores foi corrigida +[YouTube] Exceções de desencriptação aleatórias foram corrigidas +[SounCloud] URLs que terminam com uma barra são analisadas corretamente diff --git a/fastlane/metadata/android/ru/changelogs/65.txt b/fastlane/metadata/android/ru/changelogs/65.txt new file mode 100644 index 00000000000..51993fef336 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/65.txt @@ -0,0 +1 @@ +эскиз видео diff --git a/fastlane/metadata/android/ru/changelogs/66.txt b/fastlane/metadata/android/ru/changelogs/66.txt new file mode 100644 index 00000000000..51993fef336 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/66.txt @@ -0,0 +1 @@ +эскиз видео diff --git a/fastlane/metadata/android/ru/changelogs/68.txt b/fastlane/metadata/android/ru/changelogs/68.txt new file mode 100644 index 00000000000..51993fef336 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/68.txt @@ -0,0 +1 @@ +эскиз видео diff --git a/fastlane/metadata/android/ru/changelogs/69.txt b/fastlane/metadata/android/ru/changelogs/69.txt new file mode 100644 index 00000000000..c081690f841 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/69.txt @@ -0,0 +1 @@ +настройки diff --git a/fastlane/metadata/android/ru/changelogs/70.txt b/fastlane/metadata/android/ru/changelogs/70.txt new file mode 100644 index 00000000000..da96c42fda6 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/70.txt @@ -0,0 +1 @@ +всплывающий diff --git a/fastlane/metadata/android/ru/changelogs/780.txt b/fastlane/metadata/android/ru/changelogs/780.txt new file mode 100644 index 00000000000..24cfa6e7fbe --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/780.txt @@ -0,0 +1,12 @@ +Изменения в 0.17.3 + +Улучшено +• Добавлена возможность очистки состояний воспроизведения #2550 +• Показ скрытых каталогов в средстве выбора файлов #2591 +• Поддержка URL-адресов из экземпляров `invidio.us`, открываемых с помощью NewPipe #2488 +• Добавлена поддержка URL-адресов `music.youtube.com` TeamNewPipe/NewPipeExtractor #194 + +Исправлено +• [YouTube] Исправлена ошибка java.lang.IllegalArgumentException #192 +• [YouTube] Исправлены неработающие прямые трансляции TeamNewPipe/NewPipeExtractor#195 +• Исправлена проблема с производительностью в Android Pie при загрузке потока #2592 diff --git a/fastlane/metadata/android/ru/changelogs/790.txt b/fastlane/metadata/android/ru/changelogs/790.txt new file mode 100644 index 00000000000..24d1c115af0 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/790.txt @@ -0,0 +1 @@ +папки diff --git a/fastlane/metadata/android/ru/changelogs/985.txt b/fastlane/metadata/android/ru/changelogs/985.txt new file mode 100644 index 00000000000..d3978869d59 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/985.txt @@ -0,0 +1 @@ +Исправлено: YouTube не воспроизводил никакие потоки diff --git a/fastlane/metadata/android/ru/changelogs/987.txt b/fastlane/metadata/android/ru/changelogs/987.txt new file mode 100644 index 00000000000..8e97023650f --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/987.txt @@ -0,0 +1,12 @@ +Новое +• Поддержка методов доставки, отличных от прогрессивного HTTP: ускорение времени загрузки воспроизведения, исправления PeerTube и SoundCloud, воспроизведение недавно закончившихся трансляций YouTube +• Кнопка «Добавить», чтобы добавить удаленный плейлист к локальному +• Предпросмотр изображения на странице общего доступа Android 10+ + +Улучшено +• Улучшения окна параметров воспроизведения +• Перемещение кнопки импорта/экспорта подписки в трехточечное меню + +Исправлено +• Исправлено удаление полностью просмотренных видео из плейлиста +• Исправлена тема меню «Поделиться» и пункт «Добавить в плейлист» diff --git a/fastlane/metadata/android/sk/changelogs/987.txt b/fastlane/metadata/android/sk/changelogs/987.txt new file mode 100644 index 00000000000..b291ba0d507 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/987.txt @@ -0,0 +1,12 @@ +Novinky +• Podpora spôsobov poskytovania iných ako progresívnych HTTP: rýchlejší čas načítania prehrávania, opravy pre PeerTube a SoundCloud, prehrávanie nedávno ukončených priamych prenosov YouTube +• Tlačidlo Pridať na pridanie vzdialeného zoznamu skladieb k lokálnemu +• Ukážka obrázka v zdieľanom hárku so systémom Android 10+ + +Vylepšenia +• Vylepšené dialógové okno parametrov prehrávania +• Presunuté tlačidlá importu/exportu odberov do ponuky (tri bodky) + +Opravy +• Oprava odstraňovania kompletne prehraných videí zo zoznamu videí +• Oprava témy v ponuke zdieľania a pri položke „pridať do zoznamu skladieb“ diff --git a/fastlane/metadata/android/tr/changelogs/63.txt b/fastlane/metadata/android/tr/changelogs/63.txt index b4ccdf68a82..9370c537a89 100644 --- a/fastlane/metadata/android/tr/changelogs/63.txt +++ b/fastlane/metadata/android/tr/changelogs/63.txt @@ -1,8 +1,8 @@ ### Geliştirmeler - İçe/Dışa aktarma ayarları #1333 -- Aşmalar azaltıldı(performance iyileştirmeleri) #1371 +- Aşmalar azaltıldı(performans iyileştirmeleri) #1371 - Küçük kod iyileştirmeleri #1375 - GPDR hakkında her şey eklendi #1420 ### Düzeltildi -- İndirici: .giga dosyalarından bitmeyen indirmeler yüklenirken çökmeler düzeltildi #1407 +- İndirici: .giga dosyalarından bitmemiş indirmeler yüklenirken çökmeler düzeltildi #1407 diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt index e6ca6f1b468..11daef85b63 100644 --- a/fastlane/metadata/android/tr/full_description.txt +++ b/fastlane/metadata/android/tr/full_description.txt @@ -1 +1,2 @@ -NewPipe herhangi bir Google çerçeve kütüphanesi veya YouTube API'si kullanmaz. Gereksindiği bilgileri edinirken yalnızca web sitesini ayrıştırır. Bu nedenle Google hizmetlerinin kurulmadığı aygıtlarda kullanılabilir. Ayrıca, NewPipe'ı kullanırken YouTube hesabına gereksinmezsiniz, özgür ve açık kaynaklı yazılımdır. +NewPipe herhangi bir Google çerçeve kütüphanesi veya YouTube API'ı kullanmaz. Sadece, ihtiyaç duyduğu bilgiyi edinmek için web sitesini ayrıştırır. +Bu nedenle Google hizmetlerinin kurulmadığı aygıtlarda kullanılabilir. Ayrıca, NewPipe'ı kullanırken YouTube hesabına ihtiyacınız yok, ve bu özgür ve açık kaynaklı bir yazılımdır. diff --git a/fastlane/metadata/android/uk/changelogs/988.txt b/fastlane/metadata/android/uk/changelogs/988.txt new file mode 100644 index 00000000000..d882d430ab9 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Виправлено помилку «Не вдалося отримати жодного потоку» під час спроби відтворити будь-яке відео +[YouTube] Виправлено «Цей вміст недоступний у цьому застосунку.» замість запитаного відео diff --git a/fastlane/metadata/android/uk/changelogs/989.txt b/fastlane/metadata/android/uk/changelogs/989.txt new file mode 100644 index 00000000000..2ccd1653ae3 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Виправлено нескінченне завантаження за спроби відтворити будь-яке відео +• [YouTube] Виправлено тротлінг на деяких відео +• Оновлено бібліотеку jsoup до версії 1.15.3, яка включає виправлення безпеки diff --git a/fastlane/metadata/android/zh-Hans/changelogs/988.txt b/fastlane/metadata/android/zh-Hans/changelogs/988.txt new file mode 100644 index 00000000000..67f53fc8fc3 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] 修复 试图播放任何视频时,显示"无法获得任何流 " +[YouTube] 修复 显示"以下内容在此应用中不可用 ",而不是所需要的视频 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/989.txt b/fastlane/metadata/android/zh-Hans/changelogs/989.txt new file mode 100644 index 00000000000..0c89cb98657 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/989.txt @@ -0,0 +1,3 @@ +- [YouTube] 修复 尝试播放任何视频时无限加载 +- [YouTube] 修复 某些视频的节流问题 +- 将jsoup库升级到1.15.3,其中包括一个安全修复 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/988.txt b/fastlane/metadata/android/zh-Hant/changelogs/988.txt new file mode 100644 index 00000000000..684c8844471 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] 修正嘗試播放任何影片時「無法取得任何串流」的錯誤 +[YouTube] 修正請求影片時顯示「以下內容不在此應用程式中可用」的訊息 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/988.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/988.txt new file mode 100644 index 00000000000..bcc006d34c9 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] 修正播咩片都「攞唔到任何串流」嘅問題 +[YouTube] 修正出現「呢部內容喺呢個 app 欠奉」嘅訊息,睇唔到請求嘅影片 From ebce4c5b7e437d0d3fc7c3e82f9257f6825bdd03 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 27 Aug 2022 14:47:57 +0200 Subject: [PATCH 31/31] Add changelog for v0.24.0 (990) --- .../metadata/android/en-US/changelogs/990.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/990.txt diff --git a/fastlane/metadata/android/en-US/changelogs/990.txt b/fastlane/metadata/android/en-US/changelogs/990.txt new file mode 100644 index 00000000000..e12c20ba589 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/990.txt @@ -0,0 +1,15 @@ +This release drops support for Android 4.4 KitKat, now the minimum version is Android 5 Lollipop! + +New +• Download from long-press menu +• Hide future videos in feed +• Share local playlists + +Improved +• Refactor the player code into small components: less RAM used, less bugs +• Improve thumbnails' scale mode +• Vector-ize image placeholders + +Fixed +• Fix various issues with the player notification: outdated/missing media info, distorted thumbnail +• Fix fullscreen using 1/4 of screen