From 16b0df69b15b68f03262662f0c036402c77022bf Mon Sep 17 00:00:00 2001 From: seojun0924 <106897282+seojun0924@users.noreply.github.com> Date: Sat, 19 Nov 2022 01:03:18 +0900 Subject: [PATCH 001/133] Update README.ko.md Updated Korean README with latest version of README --- doc/README.ko.md | 111 +++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/doc/README.ko.md b/doc/README.ko.md index 9703e6a48..c2ede0415 100644 --- a/doc/README.ko.md +++ b/doc/README.ko.md @@ -19,11 +19,11 @@ *Read this in other languages: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* -경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GITHUB 저장소에서 ISSUE를 열람하여 주십시오. +경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오. -NEWPIPE 또는 이것의 FORK을 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. +NewPipe 또는 NewPipe 포크를 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. -## Screenshots +## 스크린샷 [](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) [](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) @@ -38,81 +38,80 @@ [](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) [](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) -## Description +### 지원되는 서비스 -NewPipe는 어떤 구글 프레임워크 라이브러리나, 유튜브 API를 사용하지 않습니다. 웹사이트는 단지 필요한 정보를 가져오기 위해 구문 분석 됩니다. 따라서 이 앱은 구글 서비스의 설치 없이 기기에서 사용될 수 있습니다. 또한, 카피레프트 자유 소프트웨어인 NewPipe를 사용하기 위해 유튜브 계정이 필요하지 않습니다. +NewPipe는 현재 이 서비스들을 지원합니다: -### Features +* YouTube ([웹사이트](https://www.youtube.com/)) 와 YouTube Music ([웹사이트](https://music.youtube.com/)) ([위키](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([웹사이트](https://joinpeertube.org/)) 와 모든 인스턴스 (인스턴스가 무엇인지 아려면 웹사이트를 참조하세요.) ([위키](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([웹사이트](https://bandcamp.com/)) ([위키](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([웹사이트](https://soundcloud.com/)) ([위키](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([웹사이트](https://media.ccc.de/)) ([위키](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) -* 영상 검색 -* 영상의 일반적인 정보 표시 -* 유튜브 영상 보기 -* 유튜브 영상 듣기 -* 팝업 모드 (floating player) -* 영상 공유 -* 영상 다운로드 -* 음성만 다운로드 -* Kodi에서 영상 열람 -* 다음/관련된 영상 표시 -* 특정 언어로 유튜브 검색 -* 연령 제한 컨텐츠 시청/차단 -* 채널에 대한 일반적인 정보 표시 -* 채널 검색 -* 채널에서 영상 시청 -* Orbot/Tor 지원 (아직 직접적이지 않음) -* 1080p/2K/4K 지원 -* 기록 보기 -* 채널 구독 -* 기록 검색 -* 재생목록 검색/시청 -* 추가된 재생목록 시청 -* 영상 추가 -* 지역 재생목록 -* 자막 -* 실시간 방송 지원 -* 댓글 표시 +NewPipe는 여러 영상·오디오 서비스를 지원합니다. YouTube부터 시작해서, 다른 사람들이 몇 년간 여러 서비스들을 추가해주어 NewPipe의 기능을 풍부하게 해 주었습니다. -### Supported Services +현재 상황과, YouTube의 인기로 인해 현재 서비스 중에서 YouTube가 가장 잘 지원됩니다. 다른 서비스를 사용하시거나, 잘 알고 계시다면 지원을 개선할 수 있도록 도와주세요! SoundCloud와 PeerTube의 관리자를 찾고 있습니다. -NewPipe는 여러가지 서비스를 지원합니다. 우리의 [문서](https://teamnewpipe.github.io/documentation/)는 새로운 서비스가 앱과 추출기에 어떻게 추가될 수 있는지에 대한 더 많은 정보를 제공합니다. 만약 새로운 서비스를 추가하고자 한다면, 우리에게 연락해 주시기 바랍니다. 현재 지원되는 서비스: +새로운 서비스를 추가하고 싶으시다면, 먼저 저희에게 연락해 주세요! 저희의 [문서](https://teamnewpipe.github.io/documentation/)가 앱과 [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor)에 서비스를 추가하는 법에 대한 정보를 제공합니다. -* YouTube -* SoundCloud \[beta\] -* media.ccc.de \[beta\] -* PeerTube instances \[beta\] -* Bandcamp \[beta\] +## 설명 -## Updates -NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 인해), 결국 릴리즈가 발생할 것입니다. 이것들의 형식은 x.xx.x 입니다. -이 새로운 버전을 얻기 위해서, 당신은: - 1. 직접 디버그 APK를 생성할 수 있습니다. 이 방법은 당신의 기기에서 새로운 기능을 얻을 수 있는 가장 빠른 방법이지만, 꽤 많이 복잡합니다. - 따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다. - 2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다. - 이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ - 3. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다. - 4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, +NewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식으로 작동합니다. 공식 API가 저희의 목적을 제한하는 경우 (예: YouTube), 또는 독점적인 경우 NewPipe는 웹사이트의 구문을 분석하거나 내부 API를 사용합니다. 즉, NewPipe를 사용할 때 계정은 필요하지 않습니다. + +### 기능 + +* 최대 4K 화질로 영상 보기 +* 백그라운드에서 노래 듣기 (노래 데이터만을 가져오므로 데이터 절약) +* 팝업 모드 (floating player, 또는 Picture-in-Picture) +* 실시간 영상 보기 +* 부제/자막 표시/숨기기 +* 영상과 오디오 검색하기 (YouTube에서는 콘텐츠 언어를 지정할 수 있습니다) +* 영상 대기열 추가 (로컬 플레이리스트에 추가 가능) +* 영상에 대한 기본 정보 표시/숨기기 (설명이나 태그 등) +* 다음/관련 영상 표시/숨기기 +* 댓글 표시/숨기기 +* 영상, 오디오, 채널, 플레이리스트, 앨범 검색하기 +* 채널 내부에서 영상, 오디오 찾기 +* 채널 구독하기 (계정에 로그인 불필요!) +* 구독한 채널의 영상 알림 받기 +* 채널 그룹 생성, 수정 (쉬운 탐색과 관리를 위해) +* 채널 그룹에서 생성된 영상 피드 탐색 +* 시청 기록 보기, 검색 +* 플레이리스트 검색, 시청 (서비스에서 원격으로 받아옴) +* 로컬 플레이리스트 만들기/수정 (다른 서비스에서 할 필요 없이 NewPipe 내부에 저장) +* 영상/오디오/자막 다운로드 +* Kodi에서 열기 +* 나이 제한 영상 시청/차단 + +## 설치 및 업데이트 +당신은 NewPipe를 설치하기 위해 이 방법 중 하나를 사용할 수 있습니다: + 1. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 F-Droid에서 릴리즈를 설치할 수 있습니다. 지침은 여기 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 받고 이것을 설치할 수 있습니다. + 3. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, 이것은 업데이트를 받는 가장 느린 방법입니다. + 4. 스스로 디버그 APK 빌드하기. 이것은 새 기능을 기기에 추가하는 가장 빠른 방법이지만, 매우 복잡하므로, 다른 방법 중 하나를 사용하는 것을 권장합니다. + 5. 이 저장소의 PR에 제공된 기능 또는 버그 픽스에 관심이 있다면, PR의 APK를 받을 수 있습니다. 지침을 위해선 PR 설명을 따르십시오. PR APK는 공식 APK와 같이 설치되기 때문에, 데이터를 잃거나 무언가 잘못될 걱정을 하지 않으도 됩니다. -우리는 대부분의 사용자에게 2번쨰 방법을 추천합니다. 방법 2 또는 3을 사용하여 설치된 APK는 서로 호환되지만, 방법 4를 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 2 또는 3에서는 같은 (우리의)서명 키가 사용되지만, 방법 4에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 1을 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다. +우리는 대부분의 사용자에게 1번째 방법을 추천합니다. 방법 1 또는 2를 사용하여 설치된 APK는 서로 호환되지만 (NewPipe를 방법 1로 설치한 후 방법 2로 업데이트할 수 있음을 의미합니다), 방법 3을 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 1 또는 2에서는 같은 (우리의)서명 키가 사용되지만, 방법 3에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 4를 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다. -한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid가 아직 업데이트를 가지지 않는 경우) 때문에 소스를 바꾸길 원한다면, +한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid에 아직 업데이트가 없는 경우) 때문에 소스를 바꾸길 원한다면, 우리는 다음과 같은 절차를 따르는 것을 권장합니다: 1. 당신의 기록, 구독, 그리고 재생목록을 유지할 수 있도록 Settings > Content > Export Database 를 통해 데이터를 백업하십시오. 2. NewPipe를 삭제하십시오. 3. 새로운 소스에서 APK를 다운로드하고 이것을 설치하십시오. 4. Step 1의 Settings > Content > Import Database 을 통해 데이터를 불러오십시오. -## Contribution +## 기여 당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다. 더 많이 수행될수록 더 많이 발전할 수 있습니다! -만약 참여하고 싶다면, 우리의 [컨트리뷰션 공지](../.github/CONTRIBUTING.md)를 참고하십시오. +만약 참여하고 싶다면, 우리의 [기여 공지](../.github/CONTRIBUTING.md)를 참고하십시오. Translation status -## Donate +## 기부 만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오. @@ -133,12 +132,12 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로
-## Privacy Policy +## 개인정보 보호 정책 NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다. 그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다. -## License +## 라이선스 [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) NewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다. From 0821f6463ac5411cb72afaeb30aff1338d2ac66a Mon Sep 17 00:00:00 2001 From: ge78fug Date: Wed, 25 Jan 2023 19:25:57 +0100 Subject: [PATCH 002/133] Added bottom main-tabs feature --- .../newpipe/fragments/MainFragment.java | 37 +++++++++++++++++++ app/src/main/res/values/settings_keys.xml | 3 ++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/appearance_settings.xml | 8 ++++ 4 files changed, 50 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index de68269e9..66b2f57b3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -3,12 +3,14 @@ package org.schabi.newpipe.fragments; import android.content.Context; import android.os.Bundle; import android.util.Log; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.RelativeLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -17,6 +19,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; import androidx.preference.PreferenceManager; +import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; @@ -29,6 +32,7 @@ import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; import java.util.List; @@ -106,6 +110,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte } else if (hasTabsChanged) { setupTabs(); } + updateTabsPosition(); } @Override @@ -189,6 +194,38 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private void updateTitleForTab(final int tabPosition) { setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } + private void updateTabsPosition() { + final ScrollableTabLayout tabLayout = binding.mainTabLayout; + final ViewPager viewPager = binding.pager; + final RelativeLayout.LayoutParams tabParams = (RelativeLayout.LayoutParams) + tabLayout.getLayoutParams(); + final RelativeLayout.LayoutParams pagerParams = (RelativeLayout.LayoutParams) + viewPager.getLayoutParams(); + if (PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getBoolean(getString(R.string.main_tabs_position_key), false)) { + tabParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP); + tabParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + pagerParams.removeRule(RelativeLayout.BELOW); + pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); + final TypedValue typedValue = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, + true); + getActivity().getWindow().setNavigationBarColor(typedValue.data); + } else { + tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); + pagerParams.removeRule(RelativeLayout.ABOVE); + pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); + final TypedValue typedValue = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValue, + true); + getActivity().getWindow().setNavigationBarColor(typedValue.data); + } + tabLayout.setLayoutParams(tabParams); + viewPager.setLayoutParams(pagerParams); + } @Override public void onTabSelected(final TabLayout.Tab selectedTab) { diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 126818969..bbd46f7e1 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -241,6 +241,9 @@ caption_settings_key caption_user_set_key + + main_tabs_position + show_search_suggestions show_local_search_suggestions diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a4ce92f2..654f01e1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,6 +213,8 @@ Delete entire search history? Search history deleted Fast mode + Change the position of the main tabs + Main Tabs Position Error External storage unavailable diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml index d726e26b7..beb46cdf5 100644 --- a/app/src/main/res/xml/appearance_settings.xml +++ b/app/src/main/res/xml/appearance_settings.xml @@ -66,4 +66,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + From 2b37721a6eeb587446063e162e1a0b9cec2e2f87 Mon Sep 17 00:00:00 2001 From: Marius Wagner Date: Sun, 29 Jan 2023 19:37:46 +0100 Subject: [PATCH 003/133] Update app/src/main/res/values/strings.xml Co-authored-by: Stypox --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 654f01e1e..2cc1f1caf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,8 +213,8 @@ Delete entire search history? Search history deleted Fast mode - Change the position of the main tabs - Main Tabs Position + Move main tab selector to the bottom + Main tabs position Error External storage unavailable From 38db0cc713e2d22770556fc5ac31cdf736053fce Mon Sep 17 00:00:00 2001 From: ge78fug Date: Tue, 31 Jan 2023 16:07:57 +0100 Subject: [PATCH 004/133] Changed the color --- .../newpipe/fragments/MainFragment.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 66b2f57b3..4a702e0dc 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.fragments; import android.content.Context; +import android.content.res.ColorStateList; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; @@ -15,6 +16,7 @@ import android.widget.RelativeLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; @@ -208,10 +210,14 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte pagerParams.removeRule(RelativeLayout.BELOW); pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); - final TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, + final TypedValue typedValueBackground = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValueBackground, true); - getActivity().getWindow().setNavigationBarColor(typedValue.data); + tabLayout.setBackgroundColor(typedValueBackground.data); + tabLayout.setTabRippleColor(ColorStateList.valueOf( + getResources().getColor(R.color.gray))); + tabLayout.setTabIconTint(ColorStateList.valueOf(getResources().getColor(R.color.gray))); + tabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.gray)); } else { tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); @@ -219,9 +225,13 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); final TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValue, + getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true); - getActivity().getWindow().setNavigationBarColor(typedValue.data); + tabLayout.setBackgroundColor(typedValue.data); + tabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor().withAlpha(32)); + tabLayout.setTabIconTint(binding.mainTabLayout.getTabIconTint()); + tabLayout.setSelectedTabIndicatorColor(ContextCompat + .getColor(requireContext(), R.color.white)); } tabLayout.setLayoutParams(tabParams); viewPager.setLayoutParams(pagerParams); From 26b29ca78dc94722b8dfc75130eb723c1258725b Mon Sep 17 00:00:00 2001 From: ge78fug Date: Tue, 7 Feb 2023 18:46:40 +0100 Subject: [PATCH 005/133] Made the requested color changes --- .../newpipe/fragments/MainFragment.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 4a702e0dc..44d99cff7 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.res.ColorStateList; import android.os.Bundle; import android.util.Log; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -34,6 +33,7 @@ import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; @@ -210,26 +210,25 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte pagerParams.removeRule(RelativeLayout.BELOW); pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); - final TypedValue typedValueBackground = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValueBackground, - true); - tabLayout.setBackgroundColor(typedValueBackground.data); - tabLayout.setTabRippleColor(ColorStateList.valueOf( - getResources().getColor(R.color.gray))); - tabLayout.setTabIconTint(ColorStateList.valueOf(getResources().getColor(R.color.gray))); - tabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.gray)); + tabLayout.setBackgroundColor(ThemeHelper + .resolveColorFromAttr(requireContext(), R.attr.colorSecondary)); + final int colorAccent = ThemeHelper.resolveColorFromAttr( + requireContext(), R.attr.colorAccent); + tabLayout.setTabRippleColor(ColorStateList.valueOf(colorAccent).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf(colorAccent)); + tabLayout.setSelectedTabIndicatorColor(colorAccent); } else { tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); pagerParams.removeRule(RelativeLayout.ABOVE); pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); - final TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, - true); - tabLayout.setBackgroundColor(typedValue.data); - tabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor().withAlpha(32)); - tabLayout.setTabIconTint(binding.mainTabLayout.getTabIconTint()); + tabLayout.setBackgroundColor(ThemeHelper + .resolveColorFromAttr(requireContext(), R.attr.colorPrimary)); + tabLayout.setTabRippleColor(ColorStateList.valueOf( + getResources().getColor(R.color.white)).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf( + getResources().getColor(R.color.white))); tabLayout.setSelectedTabIndicatorColor(ContextCompat .getColor(requireContext(), R.color.white)); } From c8ffe65acfff3ea12094c1f0b1b8eb12a7126410 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 26 Feb 2023 15:42:49 +0100 Subject: [PATCH 006/133] Simplify code to set tab layout position --- .../newpipe/fragments/MainFragment.java | 77 ++++++++++--------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 44d99cff7..531d7b1cb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,7 +1,15 @@ package org.schabi.newpipe.fragments; +import static android.widget.RelativeLayout.ABOVE; +import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM; +import static android.widget.RelativeLayout.ALIGN_PARENT_TOP; +import static android.widget.RelativeLayout.BELOW; +import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_BOTTOM; +import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_TOP; + import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -12,10 +20,10 @@ import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; @@ -93,8 +101,6 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte binding.mainTabLayout.setupWithViewPager(binding.pager); binding.mainTabLayout.addOnTabSelectedListener(this); - binding.mainTabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor() - .withAlpha(32)); setupTabs(); } @@ -112,7 +118,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte } else if (hasTabsChanged) { setupTabs(); } - updateTabsPosition(); + + updateTabLayoutPosition(); } @Override @@ -196,44 +203,38 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private void updateTitleForTab(final int tabPosition) { setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } - private void updateTabsPosition() { + + private void updateTabLayoutPosition() { final ScrollableTabLayout tabLayout = binding.mainTabLayout; final ViewPager viewPager = binding.pager; - final RelativeLayout.LayoutParams tabParams = (RelativeLayout.LayoutParams) - tabLayout.getLayoutParams(); - final RelativeLayout.LayoutParams pagerParams = (RelativeLayout.LayoutParams) - viewPager.getLayoutParams(); - if (PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.main_tabs_position_key), false)) { - tabParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP); - tabParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - pagerParams.removeRule(RelativeLayout.BELOW); - pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); - tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); - tabLayout.setBackgroundColor(ThemeHelper - .resolveColorFromAttr(requireContext(), R.attr.colorSecondary)); - final int colorAccent = ThemeHelper.resolveColorFromAttr( - requireContext(), R.attr.colorAccent); - tabLayout.setTabRippleColor(ColorStateList.valueOf(colorAccent).withAlpha(32)); - tabLayout.setTabIconTint(ColorStateList.valueOf(colorAccent)); - tabLayout.setSelectedTabIndicatorColor(colorAccent); - } else { - tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); - pagerParams.removeRule(RelativeLayout.ABOVE); - pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); - tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); - tabLayout.setBackgroundColor(ThemeHelper - .resolveColorFromAttr(requireContext(), R.attr.colorPrimary)); - tabLayout.setTabRippleColor(ColorStateList.valueOf( - getResources().getColor(R.color.white)).withAlpha(32)); - tabLayout.setTabIconTint(ColorStateList.valueOf( - getResources().getColor(R.color.white))); - tabLayout.setSelectedTabIndicatorColor(ContextCompat - .getColor(requireContext(), R.color.white)); - } + final boolean bottom = PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getBoolean(getString(R.string.main_tabs_position_key), false); + + // change layout params to make the tab layout appear either at the top or at the bottom + final var tabParams = (RelativeLayout.LayoutParams) tabLayout.getLayoutParams(); + final var pagerParams = (RelativeLayout.LayoutParams) viewPager.getLayoutParams(); + + tabParams.removeRule(bottom ? ALIGN_PARENT_TOP : ALIGN_PARENT_BOTTOM); + tabParams.addRule(bottom ? ALIGN_PARENT_BOTTOM : ALIGN_PARENT_TOP); + pagerParams.removeRule(bottom ? BELOW : ABOVE); + pagerParams.addRule(bottom ? ABOVE : BELOW, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity( + bottom ? INDICATOR_GRAVITY_TOP : INDICATOR_GRAVITY_BOTTOM); + tabLayout.setLayoutParams(tabParams); viewPager.setLayoutParams(pagerParams); + + // change the background and icon color of the tab layout: + // service-colored at the top, app-background-colored at the bottom + tabLayout.setBackgroundColor(ThemeHelper.resolveColorFromAttr(requireContext(), + bottom ? R.attr.colorSecondary : R.attr.colorPrimary)); + + @ColorInt final int iconColor = bottom + ? ThemeHelper.resolveColorFromAttr(requireContext(), R.attr.colorAccent) + : Color.WHITE; + tabLayout.setTabRippleColor(ColorStateList.valueOf(iconColor).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf(iconColor)); + tabLayout.setSelectedTabIndicatorColor(iconColor); } @Override From 65680b2ccfe2c5e15447f257f1bb247b4415a441 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 26 Feb 2023 15:58:09 +0100 Subject: [PATCH 007/133] Only update main tabs position when it changes --- .../newpipe/fragments/MainFragment.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 531d7b1cb..e1b61ea7c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -8,6 +8,7 @@ import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_BOTTO import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_TOP; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; @@ -56,8 +57,11 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private boolean hasTabsChanged = false; - private boolean previousYoutubeRestrictedModeEnabled; + private SharedPreferences prefs; + private boolean youtubeRestrictedModeEnabled; private String youtubeRestrictedModeEnabledKey; + private boolean mainTabsPositionBottom; + private String mainTabsPositionKey; /*////////////////////////////////////////////////////////////////////////// // Fragment's LifeCycle @@ -80,10 +84,11 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte } }); + prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled); - previousYoutubeRestrictedModeEnabled = - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(youtubeRestrictedModeEnabledKey, false); + youtubeRestrictedModeEnabled = prefs.getBoolean(youtubeRestrictedModeEnabledKey, false); + mainTabsPositionKey = getString(R.string.main_tabs_position_key); + mainTabsPositionBottom = prefs.getBoolean(mainTabsPositionKey, false); } @Override @@ -103,23 +108,25 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte binding.mainTabLayout.addOnTabSelectedListener(this); setupTabs(); + updateTabLayoutPosition(); } @Override public void onResume() { super.onResume(); - final boolean youtubeRestrictedModeEnabled = - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(youtubeRestrictedModeEnabledKey, false); - if (previousYoutubeRestrictedModeEnabled != youtubeRestrictedModeEnabled) { - previousYoutubeRestrictedModeEnabled = youtubeRestrictedModeEnabled; - setupTabs(); - } else if (hasTabsChanged) { + final boolean newYoutubeRestrictedModeEnabled = + prefs.getBoolean(youtubeRestrictedModeEnabledKey, false); + if (youtubeRestrictedModeEnabled != newYoutubeRestrictedModeEnabled || hasTabsChanged) { + youtubeRestrictedModeEnabled = newYoutubeRestrictedModeEnabled; setupTabs(); } - updateTabLayoutPosition(); + final boolean newMainTabsPosition = prefs.getBoolean(mainTabsPositionKey, false); + if (mainTabsPositionBottom != newMainTabsPosition) { + mainTabsPositionBottom = newMainTabsPosition; + updateTabLayoutPosition(); + } } @Override @@ -207,8 +214,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private void updateTabLayoutPosition() { final ScrollableTabLayout tabLayout = binding.mainTabLayout; final ViewPager viewPager = binding.pager; - final boolean bottom = PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.main_tabs_position_key), false); + final boolean bottom = mainTabsPositionBottom; // change layout params to make the tab layout appear either at the top or at the bottom final var tabParams = (RelativeLayout.LayoutParams) tabLayout.getLayoutParams(); From bb1f5d8f382f3345478b6b987a903fe177981075 Mon Sep 17 00:00:00 2001 From: Roger Salas <58913883+rogerjs93@users.noreply.github.com> Date: Wed, 8 Mar 2023 19:27:13 +0200 Subject: [PATCH 008/133] Update README.es.md --- doc/README.es.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README.es.md b/doc/README.es.md index 0d8e6fd65..ead878bb4 100644 --- a/doc/README.es.md +++ b/doc/README.es.md @@ -20,7 +20,7 @@ *Lea esto en otros idiomas: [English](../README.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* -AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDE ENCONTRAR BUGS. SI ENCUENTRA UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. +AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDES ENCONTRAR BUGS. SI ENCUENTRAS UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES. @@ -59,7 +59,7 @@ NewPipe no usa ninguna librería del framework de Google, ni la API de YouTube. * Buscar a través de YouTube en un idioma específico * Mirar/Bloquear videos restringidos por edad * Mostrar información general sobre canales -* Buscar de canales +* Buscador de canales * Mirar videos de un canal * Soporte Orbot/Tor (todavía no directamente) * Soporte para videos en 1080p/2K/4K From de7872d8f2301e7d95d8b6dd362a12cedc80c278 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 17 Mar 2023 21:51:40 +0100 Subject: [PATCH 009/133] feat: add audio language selector --- app/build.gradle | 2 +- .../org/schabi/newpipe/player/Player.java | 11 +++ .../player/mediaitem/MediaItemTag.java | 39 ++++++++ .../player/mediaitem/StreamInfoTag.java | 23 ++++- .../player/resolver/PlaybackResolver.java | 5 + .../resolver/VideoPlaybackResolver.java | 55 ++++++++--- .../newpipe/player/ui/VideoPlayerUi.java | 76 ++++++++++++++- .../org/schabi/newpipe/util/ListHelper.java | 94 +++++++++++++++++-- app/src/main/res/layout/player.xml | 16 ++++ 9 files changed, 295 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5d63f429..c0d423817 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,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:7e793c11aec46358ccbfd8bcfcf521105f4f093a' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:5a9b6ed2e3306b9152cc6689dd61dbbe43483845' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ 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 4243c233b..69b161631 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -88,6 +88,7 @@ import org.schabi.newpipe.databinding.PlayerBinding; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -1886,6 +1887,12 @@ public final class Player implements PlaybackListener, Listener { .map(quality -> quality.getSortedVideoStreams() .get(quality.getSelectedVideoStreamIndex())); } + + public Optional getSelectedAudioStream() { + return Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeAudioLanguage) + .map(MediaItemTag.AudioLanguage::getSelectedAudioStream); + } //endregion @@ -2178,6 +2185,10 @@ public final class Player implements PlaybackListener, Listener { videoResolver.setPlaybackQuality(quality); } + public void setAudioLanguage(@Nullable final String language) { + videoResolver.setAudioLanguage(language); + } + @NonNull public Context getContext() { diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java index f08086287..0ef1eaaf1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java @@ -7,6 +7,7 @@ import com.google.android.exoplayer2.MediaItem.RequestMetadata; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.Player; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -55,6 +56,11 @@ public interface MediaItemTag { return Optional.empty(); } + @NonNull + default Optional getMaybeAudioLanguage() { + return Optional.empty(); + } + Optional getMaybeExtras(@NonNull Class type); MediaItemTag withExtras(@NonNull T extra); @@ -128,4 +134,37 @@ public interface MediaItemTag { ? null : sortedVideoStreams.get(selectedVideoStreamIndex); } } + + final class AudioLanguage { + @NonNull + private final List audioStreams; + private final int selectedAudioStreamIndex; + + private AudioLanguage(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + this.audioStreams = audioStreams; + this.selectedAudioStreamIndex = selectedAudioStreamIndex; + } + + static AudioLanguage of(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + return new AudioLanguage(audioStreams, selectedAudioStreamIndex); + } + + @NonNull + public List getAudioStreams() { + return audioStreams; + } + + public int getSelectedAudioStreamIndex() { + return selectedAudioStreamIndex; + } + + @Nullable + public AudioStream getSelectedAudioStream() { + return selectedAudioStreamIndex < 0 + || selectedAudioStreamIndex >= audioStreams.size() + ? null : audioStreams.get(selectedAudioStreamIndex); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java index 4095f2bc8..5379fc5a6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.player.mediaitem; import com.google.android.exoplayer2.MediaItem; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -25,25 +26,33 @@ public final class StreamInfoTag implements MediaItemTag { @Nullable private final MediaItemTag.Quality quality; @Nullable + private final MediaItemTag.AudioLanguage audioLanguage; + @Nullable private final Object extras; private StreamInfoTag(@NonNull final StreamInfo streamInfo, @Nullable final MediaItemTag.Quality quality, + @Nullable final MediaItemTag.AudioLanguage audioLanguage, @Nullable final Object extras) { this.streamInfo = streamInfo; this.quality = quality; + this.audioLanguage = audioLanguage; this.extras = extras; } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, @NonNull final List sortedVideoStreams, - final int selectedVideoStreamIndex) { + final int selectedVideoStreamIndex, + @NonNull final List audioStreams, + final int selectedAudioStreamIndex) { final Quality quality = Quality.of(sortedVideoStreams, selectedVideoStreamIndex); - return new StreamInfoTag(streamInfo, quality, null); + final AudioLanguage audioLanguage = + AudioLanguage.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, quality, audioLanguage, null); } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) { - return new StreamInfoTag(streamInfo, null, null); + return new StreamInfoTag(streamInfo, null, null, null); } @Override @@ -103,6 +112,12 @@ public final class StreamInfoTag implements MediaItemTag { return Optional.ofNullable(quality); } + @NonNull + @Override + public Optional getMaybeAudioLanguage() { + return Optional.ofNullable(audioLanguage); + } + @Override public Optional getMaybeExtras(@NonNull final Class type) { return Optional.ofNullable(extras).map(type::cast); @@ -110,6 +125,6 @@ public final class StreamInfoTag implements MediaItemTag { @Override public StreamInfoTag withExtras(@NonNull final Object extra) { - return new StreamInfoTag(streamInfo, quality, extra); + return new StreamInfoTag(streamInfo, quality, audioLanguage, extra); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index 9c8cbb8f6..c15447418 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -156,6 +156,11 @@ public interface PlaybackResolver extends Resolver { cacheKey.append(audioStream.getAverageBitrate()); } + if (audioStream.getAudioTrackId() != null) { + cacheKey.append(" "); + cacheKey.append(audioStream.getAudioTrackId()); + } + return cacheKey.toString(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index cf7d73558..2f0c59325 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Optional; import static com.google.android.exoplayer2.C.TIME_UNSET; +import static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; @@ -44,6 +45,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { @Nullable private String playbackQuality; + @Nullable + private String audioLanguage; public enum SourceType { LIVE_STREAM, @@ -74,19 +77,39 @@ public class VideoPlaybackResolver implements PlaybackResolver { final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, getNonTorrentStreams(info.getVideoStreams()), getNonTorrentStreams(info.getVideoOnlyStreams()), false, true); - final int index; + final List audioStreamsList = + getFilteredAudioStreams(context, info.getAudioStreams()); + + final int videoIndex; if (videoStreamsList.isEmpty()) { - index = -1; + videoIndex = -1; } else if (playbackQuality == null) { - index = qualityResolver.getDefaultResolutionIndex(videoStreamsList); + videoIndex = qualityResolver.getDefaultResolutionIndex(videoStreamsList); } else { - index = qualityResolver.getOverrideResolutionIndex(videoStreamsList, + videoIndex = qualityResolver.getOverrideResolutionIndex(videoStreamsList, getPlaybackQuality()); } - final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, index); + + int audioIndex = 0; + if (audioLanguage != null) { + for (int i = 0; i < audioStreamsList.size(); i++) { + final AudioStream stream = audioStreamsList.get(i); + if (stream.getAudioTrackId() != null + && stream.getAudioTrackId().equals(audioLanguage)) { + audioIndex = i; + break; + } + } + } + + final MediaItemTag tag = + StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex); @Nullable final VideoStream video = tag.getMaybeQuality() .map(MediaItemTag.Quality::getSelectedVideoStream) .orElse(null); + @Nullable final AudioStream audio = tag.getMaybeAudioLanguage() + .map(MediaItemTag.AudioLanguage::getSelectedAudioStream) + .orElse(null); if (video != null) { try { @@ -99,14 +122,9 @@ public class VideoPlaybackResolver implements PlaybackResolver { } } - // Create optional audio stream source - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); - final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( - ListHelper.getDefaultAudioFormat(context, audioStreams)); - // Use the audio stream if there is no video stream, or // merge with audio stream in case if video does not contain audio - if (audio != null && (video == null || video.isVideoOnly())) { + if (audio != null && (video == null || video.isVideoOnly() || audioLanguage != null)) { try { final MediaSource audioSource = PlaybackResolver.buildMediaSource( dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag); @@ -179,9 +197,24 @@ public class VideoPlaybackResolver implements PlaybackResolver { this.playbackQuality = playbackQuality; } + @Nullable + public String getAudioLanguage() { + return audioLanguage; + } + + public void setAudioLanguage(@Nullable final String audioLanguage) { + this.audioLanguage = audioLanguage; + } + public interface QualityResolver { int getDefaultResolutionIndex(List sortedVideos); int getOverrideResolutionIndex(List sortedVideos, String playbackQuality); } + + public interface AudioLanguageResolver { + int getDefaultLanguageIndex(List audioStreams); + + int getOverrideLanguageIndex(List audioStreams, String audioLanguage); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 9afd1bf24..3365ade72 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -63,6 +63,7 @@ import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.PlayerBinding; import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; @@ -117,11 +118,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //////////////////////////////////////////////////////////////////////////*/ private static final int POPUP_MENU_ID_QUALITY = 69; + private static final int POPUP_MENU_ID_LANGUAGE = 70; private static final int POPUP_MENU_ID_PLAYBACK_SPEED = 79; private static final int POPUP_MENU_ID_CAPTION = 89; protected boolean isSomePopupMenuVisible = false; private PopupMenu qualityPopupMenu; + private PopupMenu languagePopupMenu; protected PopupMenu playbackSpeedPopupMenu; private PopupMenu captionPopupMenu; @@ -146,7 +149,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //region Constructor, setup, destroy protected VideoPlayerUi(@NonNull final Player player, - @NonNull final PlayerBinding playerBinding) { + @NonNull final PlayerBinding playerBinding) { super(player); binding = playerBinding; setupFromView(); @@ -173,6 +176,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa R.style.DarkPopupMenu); qualityPopupMenu = new PopupMenu(themeWrapper, binding.qualityTextView); + languagePopupMenu = new PopupMenu(themeWrapper, binding.languageTextView); playbackSpeedPopupMenu = new PopupMenu(context, binding.playbackSpeed); captionPopupMenu = new PopupMenu(themeWrapper, binding.captionTextView); @@ -190,6 +194,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected void initListeners() { binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked)); + binding.languageTextView.setOnClickListener( + makeOnClickListener(this::onAudioLanguageClicked)); binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked)); binding.playbackSeekBar.setOnSeekBarChangeListener(this); @@ -266,6 +272,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected void deinitListeners() { binding.qualityTextView.setOnClickListener(null); + binding.languageTextView.setOnClickListener(null); binding.playbackSpeed.setOnClickListener(null); binding.playbackSeekBar.setOnSeekBarChangeListener(null); binding.captionTextView.setOnClickListener(null); @@ -419,6 +426,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.topControls.setPaddingRelative(controlsPad, playerTopPad, controlsPad, 0); binding.bottomControls.setPaddingRelative(controlsPad, 0, controlsPad, 0); binding.qualityTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); + binding.languageTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setMinimumWidth(buttonsMinWidth); binding.captionTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); @@ -984,6 +992,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa private void updateStreamRelatedViews() { player.getCurrentStreamInfo().ifPresent(info -> { binding.qualityTextView.setVisibility(View.GONE); + binding.languageTextView.setVisibility(View.GONE); binding.playbackSpeed.setVisibility(View.GONE); binding.playbackEndTime.setVisibility(View.GONE); @@ -1019,6 +1028,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa } buildQualityMenu(); + buildLanguageMenu(); binding.qualityTextView.setVisibility(View.VISIBLE); binding.surfaceView.setVisibility(View.VISIBLE); @@ -1067,6 +1077,37 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa .ifPresent(s -> binding.qualityTextView.setText(s.getResolution())); } + private void buildLanguageMenu() { + if (languagePopupMenu == null) { + return; + } + languagePopupMenu.getMenu().removeGroup(POPUP_MENU_ID_LANGUAGE); + + final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) + .flatMap(MediaItemTag::getMaybeAudioLanguage) + .map(MediaItemTag.AudioLanguage::getAudioStreams) + .orElse(null); + if (availableStreams == null || availableStreams.size() < 2) { + return; + } + + for (int i = 0; i < availableStreams.size(); i++) { + final AudioStream audioStream = availableStreams.get(i); + // TODO: ensure that audio streams have track names + if (audioStream.getAudioTrackName() == null) { + continue; + } + languagePopupMenu.getMenu().add(POPUP_MENU_ID_LANGUAGE, i, Menu.NONE, + audioStream.getAudioTrackName()); + } + + player.getSelectedAudioStream() + .ifPresent(s -> binding.languageTextView.setText(s.getAudioTrackName())); + binding.languageTextView.setVisibility(View.VISIBLE); + languagePopupMenu.setOnMenuItemClickListener(this); + languagePopupMenu.setOnDismissListener(this); + } + private void buildPlaybackSpeedMenu() { if (playbackSpeedPopupMenu == null) { return; @@ -1175,6 +1216,15 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa .ifPresent(binding.qualityTextView::setText); } + private void onAudioLanguageClicked() { + languagePopupMenu.show(); + isSomePopupMenuVisible = true; + + player.getSelectedAudioStream() + .map(AudioStream::getAudioTrackName) + .ifPresent(binding.languageTextView::setText); + } + /** * Called when an item of the quality selector or the playback speed selector is selected. */ @@ -1208,6 +1258,30 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.qualityTextView.setText(menuItem.getTitle()); return true; + } else if (menuItem.getGroupId() == POPUP_MENU_ID_LANGUAGE) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + //noinspection SimplifyOptionalCallChains + if (currentMetadata == null || !currentMetadata.getMaybeAudioLanguage().isPresent()) { + return true; + } + + final MediaItemTag.AudioLanguage language = + currentMetadata.getMaybeAudioLanguage().get(); + final List availableStreams = language.getAudioStreams(); + final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return true; + } + + player.saveStreamProgressState(); + final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); + player.setRecovery(); + player.setAudioLanguage(newLanguage); + player.reloadPlayQueueManager(); + + binding.languageTextView.setText(menuItem.getTitle()); + return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); final float speed = PLAYBACK_SPEEDS[speedIndex]; diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index b3b7c1792..ed1e1e801 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -42,13 +43,14 @@ public final class ListHelper { // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); - private ListHelper() { } + private ListHelper() { + } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getDefaultResolutionIndex(final Context context, final List videoStreams) { @@ -58,11 +60,11 @@ public final class ListHelper { } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @param defaultResolution the default resolution to look for * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getResolutionIndex(final Context context, final List videoStreams, @@ -71,10 +73,10 @@ public final class ListHelper { } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) - * @param context Android app context - * @param videoStreams list of the video streams to check + * @param context Android app context + * @param videoStreams list of the video streams to check * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getPopupDefaultResolutionIndex(final Context context, final List videoStreams) { @@ -84,11 +86,11 @@ public final class ListHelper { } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @param defaultResolution the default resolution to look for * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getPopupResolutionIndex(final Context context, final List videoStreams, @@ -186,6 +188,80 @@ public final class ListHelper { videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + public static List getFilteredAudioStreams( + @NonNull final Context context, + @Nullable final List audioStreams) { + if (audioStreams == null) { + return Collections.emptyList(); + } + + final HashMap collectedStreams = new HashMap<>(); + + final Comparator cmp; + if (isLimitingDataUsage(context)) { + cmp = getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING); + } else { + cmp = getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING); + } + + final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); + boolean hasPreferredLanguage = false; + + for (final AudioStream stream : audioStreams) { + if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { + continue; + } + + final String trackId; + if (stream.getAudioTrackId() != null) { + trackId = stream.getAudioTrackId(); + } else { + trackId = ""; + } + + final AudioStream presentStream = collectedStreams.get(trackId); + if (presentStream == null || cmp.compare(stream, presentStream) > 0) { + collectedStreams.put(trackId, stream); + + if (stream.getAudioLocale() != null + && stream.getAudioLocale().getISO3Language().equals(preferredLanguage)) { + hasPreferredLanguage = true; + } + } + } + + // Fall back to English if the preferred language was not found + final String preferredLanguageOrEnglish = + hasPreferredLanguage ? preferredLanguage : Locale.ENGLISH.getISO3Language(); + + // Sort collected streams + return collectedStreams.values().stream() + .sorted((s1, s2) -> { + // Preferred language comes first + if (s1.getAudioLocale() != null + && s1.getAudioLocale().getISO3Language() + .equals(preferredLanguageOrEnglish)) { + return -1; + } + if (s2.getAudioLocale() != null + && s2.getAudioLocale().getISO3Language() + .equals(preferredLanguageOrEnglish)) { + return 1; + } + + // Sort audio tracks alphabetically + if (s1.getAudioTrackName() != null) { + if (s2.getAudioTrackName() != null) { + return s1.getAudioTrackName().compareTo(s2.getAudioTrackName()); + } else { + return -1; + } + } + return 1; + }) + .collect(Collectors.toList()); + } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -300,8 +376,8 @@ public final class ListHelper { // Filter out higher resolutions (or not if high resolutions should always be shown) .filter(stream -> showHigherResolutions || !HIGH_RESOLUTION_LIST.contains(stream.getResolution() - // Replace any frame rate with nothing - .replaceAll("p\\d+$", "p"))) + // Replace any frame rate with nothing + .replaceAll("p\\d+$", "p"))) .collect(Collectors.toList()); final HashMap hashMap = new HashMap<>(); diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index b528e4e9b..82760be3a 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -157,6 +157,22 @@ tools:text="The Video Artist LONG very LONG very Long" /> + + Date: Sat, 18 Mar 2023 14:50:19 +0100 Subject: [PATCH 010/133] feat: improve audio track sorting, add prefer_descriptive_audio option --- .../org/schabi/newpipe/util/ListHelper.java | 53 ++++++++++--------- app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/content_settings.xml | 8 +++ 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index ed1e1e801..2714337c2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -233,33 +233,16 @@ public final class ListHelper { // Fall back to English if the preferred language was not found final String preferredLanguageOrEnglish = hasPreferredLanguage ? preferredLanguage : Locale.ENGLISH.getISO3Language(); + final SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(context); + final boolean preferDescriptiveAudio = + preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), + false); + final Comparator trackCmp = + getAudioTrackComparator(preferredLanguageOrEnglish, preferDescriptiveAudio); // Sort collected streams - return collectedStreams.values().stream() - .sorted((s1, s2) -> { - // Preferred language comes first - if (s1.getAudioLocale() != null - && s1.getAudioLocale().getISO3Language() - .equals(preferredLanguageOrEnglish)) { - return -1; - } - if (s2.getAudioLocale() != null - && s2.getAudioLocale().getISO3Language() - .equals(preferredLanguageOrEnglish)) { - return 1; - } - - // Sort audio tracks alphabetically - if (s1.getAudioTrackName() != null) { - if (s2.getAudioTrackName() != null) { - return s1.getAudioTrackName().compareTo(s2.getAudioTrackName()); - } else { - return -1; - } - } - return 1; - }) - .collect(Collectors.toList()); + return collectedStreams.values().stream().sorted(trackCmp).collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -680,4 +663,24 @@ public final class ListHelper { return manager.isActiveNetworkMetered(); } + + private static Comparator getAudioTrackComparator( + final String preferredLanguage, final boolean preferDescriptiveAudio) { + return Comparator.comparing(AudioStream::getAudioLocale, (o1, o2) -> Boolean.compare( + o1 == null || !o1.getISO3Language().equals(preferredLanguage), + o2 == null || !o2.getISO3Language().equals(preferredLanguage)) + ).thenComparing(AudioStream::isDescriptive, (o1, o2) -> + Boolean.compare(o1 ^ preferDescriptiveAudio, o2 ^ preferDescriptiveAudio) + ).thenComparing(AudioStream::getAudioTrackName, (o1, o2) -> { + if (o1 != null) { + if (o2 != null) { + return o1.compareTo(o2); + } else { + return -1; + } + } else { + return 1; + } + }); + } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 6a1d5cd45..9ed34bf26 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -260,6 +260,7 @@ show_next_video show_description show_meta_info + prefer_descriptive_audio stream_info_selected_tab show_hold_to_append content_language diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1c75bba4..9867a8f21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Turn off to hide video description and additional information Show meta info Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request + Prefer descriptive audio + Select an audio track with descriptions for visually impaired people if available Image cache wiped Wipe cached metadata Remove all cached webpage data diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index fddb966c8..684b9e558 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -114,6 +114,14 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + Date: Sat, 18 Mar 2023 16:14:07 +0100 Subject: [PATCH 011/133] fix: remove todo --- .../main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 3365ade72..72d2f0b26 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -1093,7 +1093,6 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); - // TODO: ensure that audio streams have track names if (audioStream.getAudioTrackName() == null) { continue; } From 77649d388c01c0fbca3a1fad2399eb79aa5a8cd2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 18 Mar 2023 16:28:09 +0100 Subject: [PATCH 012/133] fix: reduce complexity --- .../newpipe/player/ui/VideoPlayerUi.java | 91 ++++++++++--------- .../org/schabi/newpipe/util/ListHelper.java | 7 +- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 72d2f0b26..13cbc9fd3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -1236,50 +1236,10 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa } if (menuItem.getGroupId() == POPUP_MENU_ID_QUALITY) { - final int menuItemIndex = menuItem.getItemId(); - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) { - return true; - } - - final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get(); - final List availableStreams = quality.getSortedVideoStreams(); - final int selectedStreamIndex = quality.getSelectedVideoStreamIndex(); - if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { - return true; - } - - player.saveStreamProgressState(); //TODO added, check if good - final String newResolution = availableStreams.get(menuItemIndex).getResolution(); - player.setRecovery(); - player.setPlaybackQuality(newResolution); - player.reloadPlayQueueManager(); - - binding.qualityTextView.setText(menuItem.getTitle()); + onQualityItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_LANGUAGE) { - final int menuItemIndex = menuItem.getItemId(); - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - //noinspection SimplifyOptionalCallChains - if (currentMetadata == null || !currentMetadata.getMaybeAudioLanguage().isPresent()) { - return true; - } - - final MediaItemTag.AudioLanguage language = - currentMetadata.getMaybeAudioLanguage().get(); - final List availableStreams = language.getAudioStreams(); - final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); - if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { - return true; - } - - player.saveStreamProgressState(); - final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); - player.setRecovery(); - player.setAudioLanguage(newLanguage); - player.reloadPlayQueueManager(); - - binding.languageTextView.setText(menuItem.getTitle()); + onLanguageItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); @@ -1292,6 +1252,53 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa return false; } + private void onQualityItemClick(@NonNull final MenuItem menuItem) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) { + return; + } + + final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get(); + final List availableStreams = quality.getSortedVideoStreams(); + final int selectedStreamIndex = quality.getSelectedVideoStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return; + } + + player.saveStreamProgressState(); + final String newResolution = availableStreams.get(menuItemIndex).getResolution(); + player.setRecovery(); + player.setPlaybackQuality(newResolution); + player.reloadPlayQueueManager(); + + binding.qualityTextView.setText(menuItem.getTitle()); + } + + private void onLanguageItemClick(@NonNull final MenuItem menuItem) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeAudioLanguage().isEmpty()) { + return; + } + + final MediaItemTag.AudioLanguage language = + currentMetadata.getMaybeAudioLanguage().get(); + final List availableStreams = language.getAudioStreams(); + final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return; + } + + player.saveStreamProgressState(); + final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); + player.setRecovery(); + player.setAudioLanguage(newLanguage); + player.reloadPlayQueueManager(); + + binding.languageTextView.setText(menuItem.getTitle()); + } + /** * Called when some popup menu is dismissed. */ diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 2714337c2..ef40692d7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -212,12 +212,7 @@ public final class ListHelper { continue; } - final String trackId; - if (stream.getAudioTrackId() != null) { - trackId = stream.getAudioTrackId(); - } else { - trackId = ""; - } + final String trackId = Objects.toString(stream.getAudioTrackId(), ""); final AudioStream presentStream = collectedStreams.get(trackId); if (presentStream == null || cmp.compare(stream, presentStream) > 0) { From 366c39d4c6e52d1c3a9875421d99d38b300bfd0a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 01:15:36 +0100 Subject: [PATCH 013/133] feat: add language selector to audio player --- .../newpipe/player/PlayQueueActivity.java | 89 +++++++++++++++++++ .../org/schabi/newpipe/player/Player.java | 28 +++++- .../player/event/PlayerEventListener.java | 1 + .../player/mediaitem/MediaItemTag.java | 14 +-- .../player/mediaitem/StreamInfoTag.java | 26 ++++-- .../resolver/AudioPlaybackResolver.java | 69 ++++++++------ .../resolver/VideoPlaybackResolver.java | 26 +++--- .../newpipe/player/ui/VideoPlayerUi.java | 66 +++++++------- .../org/schabi/newpipe/util/ListHelper.java | 8 ++ app/src/main/res/layout/player.xml | 2 +- app/src/main/res/menu/menu_play_queue.xml | 8 ++ app/src/main/res/values/strings.xml | 2 + 12 files changed, 241 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 9ce99c15b..fa3668e8b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -13,6 +13,7 @@ import android.provider.Settings; import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; @@ -27,11 +28,13 @@ import com.google.android.exoplayer2.PlaybackParameters; import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.helper.PlaybackParameterDialog; +import org.schabi.newpipe.player.mediaitem.MediaItemTag; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueAdapter; import org.schabi.newpipe.player.playqueue.PlayQueueItem; @@ -44,6 +47,10 @@ import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + public final class PlayQueueActivity extends AppCompatActivity implements PlayerEventListener, SeekBar.OnSeekBarChangeListener, View.OnClickListener, PlaybackParameterDialog.Callback { @@ -52,6 +59,8 @@ public final class PlayQueueActivity extends AppCompatActivity private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80; + private static final int MENU_ID_AUDIO_TRACK = 71; + private Player player; private boolean serviceBound; @@ -97,6 +106,7 @@ public final class PlayQueueActivity extends AppCompatActivity this.menu = m; getMenuInflater().inflate(R.menu.menu_play_queue, m); getMenuInflater().inflate(R.menu.menu_play_queue_bg, m); + buildAudioTrackMenu(); onMaybeMuteChanged(); // to avoid null reference if (player != null) { @@ -153,6 +163,12 @@ public final class PlayQueueActivity extends AppCompatActivity NavigationHelper.playOnBackgroundPlayer(this, player.getPlayQueue(), true); return true; } + + if (item.getGroupId() == MENU_ID_AUDIO_TRACK) { + onAudioTrackClick(item.getItemId()); + return true; + } + return super.onOptionsItemSelected(item); } @@ -591,4 +607,77 @@ public final class PlayQueueActivity extends AppCompatActivity item.setIcon(player.isMuted() ? R.drawable.ic_volume_off : R.drawable.ic_volume_up); } } + + @Override + public void onAudioTrackUpdate() { + buildAudioTrackMenu(); + } + + private void buildAudioTrackMenu() { + if (menu == null) { + return; + } + + final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); + final List availableStreams = + Optional.ofNullable(player.getCurrentMetadata()) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) + .orElse(null); + + if (availableStreams == null || availableStreams.size() < 2) { + audioTrackSelector.setVisible(false); + } else { + final SubMenu audioTrackMenu = audioTrackSelector.getSubMenu(); + audioTrackMenu.clear(); + + for (int i = 0; i < availableStreams.size(); i++) { + final AudioStream audioStream = availableStreams.get(i); + if (audioStream.getAudioTrackName() == null) { + continue; + } + + audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, + audioStream.getAudioTrackName()); + } + + player.getSelectedAudioStream().ifPresent(s -> { + final String trackName = Objects.toString(s.getAudioTrackName(), ""); + audioTrackSelector.setTitle(getString(R.string.play_queue_audio_track) + trackName); + + final String shortName = s.getAudioLocale() != null + ? s.getAudioLocale().getLanguage() : trackName; + audioTrackSelector.setTitleCondensed( + shortName.substring(0, Math.min(shortName.length(), 2))); + audioTrackSelector.setVisible(true); + }); + + } + } + + /** + * Called when an item from the audio track selector is selected. + * + * @param itemId index of the selected item + */ + private void onAudioTrackClick(final int itemId) { + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { + return; + } + + final MediaItemTag.AudioTrack audioTrack = + currentMetadata.getMaybeAudioTrack().get(); + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { + return; + } + + player.saveStreamProgressState(); + final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); + player.setRecovery(); + player.setAudioTrack(newAudioTrack); + player.reloadPlayQueueManager(); + } } 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 69b161631..2d6d23a23 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -1243,6 +1243,9 @@ public final class Player implements PlaybackListener, Listener { } final StreamInfo previousInfo = Optional.ofNullable(currentMetadata) .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null); + final MediaItemTag.AudioTrack previousAudioTrack = + Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); currentMetadata = tag; if (!currentMetadata.getErrors().isEmpty()) { @@ -1263,6 +1266,12 @@ public final class Player implements PlaybackListener, Listener { if (previousInfo == null || !previousInfo.getUrl().equals(info.getUrl())) { // only update with the new stream info if it has actually changed updateMetadataWith(info); + } else if (previousAudioTrack == null + || tag.getMaybeAudioTrack() + .map(t -> t.getSelectedAudioStreamIndex() + != previousAudioTrack.getSelectedAudioStreamIndex()) + .orElse(false)) { + notifyAudioTrackUpdateToListeners(); } }); }); @@ -1759,6 +1768,7 @@ public final class Player implements PlaybackListener, Listener { registerStreamViewed(); notifyMetadataUpdateToListeners(); + notifyAudioTrackUpdateToListeners(); UIs.call(playerUi -> playerUi.onMetadataChanged(info)); } @@ -1890,8 +1900,8 @@ public final class Player implements PlaybackListener, Listener { public Optional getSelectedAudioStream() { return Optional.ofNullable(currentMetadata) - .flatMap(MediaItemTag::getMaybeAudioLanguage) - .map(MediaItemTag.AudioLanguage::getSelectedAudioStream); + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getSelectedAudioStream); } //endregion @@ -2024,6 +2034,15 @@ public final class Player implements PlaybackListener, Listener { } } + private void notifyAudioTrackUpdateToListeners() { + if (fragmentListener != null) { + fragmentListener.onAudioTrackUpdate(); + } + if (activityListener != null) { + activityListener.onAudioTrackUpdate(); + } + } + public void useVideoSource(final boolean videoEnabled) { if (playQueue == null || isAudioOnly == !videoEnabled || audioPlayerSelected()) { return; @@ -2185,8 +2204,9 @@ public final class Player implements PlaybackListener, Listener { videoResolver.setPlaybackQuality(quality); } - public void setAudioLanguage(@Nullable final String language) { - videoResolver.setAudioLanguage(language); + public void setAudioTrack(@Nullable final String audioTrackId) { + videoResolver.setAudioTrack(audioTrackId); + audioResolver.setAudioTrack(audioTrackId); } diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java index 84bd9d277..2cca259c2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java @@ -11,5 +11,6 @@ public interface PlayerEventListener { PlaybackParameters parameters); void onProgressUpdate(int currentProgress, int duration, int bufferPercent); void onMetadataUpdate(StreamInfo info, PlayQueue queue); + default void onAudioTrackUpdate() { } void onServiceStopped(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java index 0ef1eaaf1..1119fb903 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java @@ -57,7 +57,7 @@ public interface MediaItemTag { } @NonNull - default Optional getMaybeAudioLanguage() { + default Optional getMaybeAudioTrack() { return Optional.empty(); } @@ -135,20 +135,20 @@ public interface MediaItemTag { } } - final class AudioLanguage { + final class AudioTrack { @NonNull private final List audioStreams; private final int selectedAudioStreamIndex; - private AudioLanguage(@NonNull final List audioStreams, - final int selectedAudioStreamIndex) { + private AudioTrack(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { this.audioStreams = audioStreams; this.selectedAudioStreamIndex = selectedAudioStreamIndex; } - static AudioLanguage of(@NonNull final List audioStreams, - final int selectedAudioStreamIndex) { - return new AudioLanguage(audioStreams, selectedAudioStreamIndex); + static AudioTrack of(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + return new AudioTrack(audioStreams, selectedAudioStreamIndex); } @NonNull diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java index 5379fc5a6..689f5c72b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java @@ -26,17 +26,17 @@ public final class StreamInfoTag implements MediaItemTag { @Nullable private final MediaItemTag.Quality quality; @Nullable - private final MediaItemTag.AudioLanguage audioLanguage; + private final MediaItemTag.AudioTrack audioTrack; @Nullable private final Object extras; private StreamInfoTag(@NonNull final StreamInfo streamInfo, @Nullable final MediaItemTag.Quality quality, - @Nullable final MediaItemTag.AudioLanguage audioLanguage, + @Nullable final MediaItemTag.AudioTrack audioTrack, @Nullable final Object extras) { this.streamInfo = streamInfo; this.quality = quality; - this.audioLanguage = audioLanguage; + this.audioTrack = audioTrack; this.extras = extras; } @@ -46,9 +46,17 @@ public final class StreamInfoTag implements MediaItemTag { @NonNull final List audioStreams, final int selectedAudioStreamIndex) { final Quality quality = Quality.of(sortedVideoStreams, selectedVideoStreamIndex); - final AudioLanguage audioLanguage = - AudioLanguage.of(audioStreams, selectedAudioStreamIndex); - return new StreamInfoTag(streamInfo, quality, audioLanguage, null); + final AudioTrack audioTrack = + AudioTrack.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, quality, audioTrack, null); + } + + public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, + @NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + final AudioTrack audioTrack = + AudioTrack.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, null, audioTrack, null); } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) { @@ -114,8 +122,8 @@ public final class StreamInfoTag implements MediaItemTag { @NonNull @Override - public Optional getMaybeAudioLanguage() { - return Optional.ofNullable(audioLanguage); + public Optional getMaybeAudioTrack() { + return Optional.ofNullable(audioTrack); } @Override @@ -125,6 +133,6 @@ public final class StreamInfoTag implements MediaItemTag { @Override public StreamInfoTag withExtras(@NonNull final Object extra) { - return new StreamInfoTag(streamInfo, quality, audioLanguage, extra); + return new StreamInfoTag(streamInfo, quality, audioTrack, extra); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e87c93114..2e7b5c7d5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.player.resolver; +import static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams; import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; import android.content.Context; @@ -28,6 +29,8 @@ public class AudioPlaybackResolver implements PlaybackResolver { private final Context context; @NonNull private final PlayerDataSource dataSource; + @Nullable + private String audioTrack; public AudioPlaybackResolver(@NonNull final Context context, @NonNull final PlayerDataSource dataSource) { @@ -43,12 +46,36 @@ public class AudioPlaybackResolver implements PlaybackResolver { return liveSource; } - final Stream stream = getAudioSource(info); - if (stream == null) { - return null; - } + final List audioStreams = + getFilteredAudioStreams(context, info.getAudioStreams()); + final Stream stream; + final MediaItemTag tag; - final MediaItemTag tag = StreamInfoTag.of(info); + if (!audioStreams.isEmpty()) { + int audioIndex = 0; + + if (audioTrack != null) { + for (int i = 0; i < audioStreams.size(); i++) { + final AudioStream audioStream = audioStreams.get(i); + if (audioStream.getAudioTrackId() != null + && audioStream.getAudioTrackId().equals(audioTrack)) { + audioIndex = i; + break; + } + } + } + stream = getStreamForIndex(audioIndex, audioStreams); + tag = StreamInfoTag.of(info, audioStreams, audioIndex); + } else { + final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); + if (!videoStreams.isEmpty()) { + final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); + stream = getStreamForIndex(index, videoStreams); + tag = StreamInfoTag.of(info); + } else { + return null; + } + } try { return PlaybackResolver.buildMediaSource( @@ -59,29 +86,6 @@ public class AudioPlaybackResolver implements PlaybackResolver { } } - /** - * Get a stream to be played as audio. If a service has no separate {@link AudioStream}s we - * use a video stream as audio source to support audio background playback. - * - * @param info of the stream - * @return the audio source to use or null if none could be found - */ - @Nullable - private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); - if (!audioStreams.isEmpty()) { - final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); - return getStreamForIndex(index, audioStreams); - } else { - final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); - if (!videoStreams.isEmpty()) { - final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); - return getStreamForIndex(index, videoStreams); - } - } - return null; - } - @Nullable Stream getStreamForIndex(final int index, @NonNull final List streams) { if (index >= 0 && index < streams.size()) { @@ -89,4 +93,13 @@ public class AudioPlaybackResolver implements PlaybackResolver { } return null; } + + @Nullable + public String getAudioTrack() { + return audioTrack; + } + + public void setAudioTrack(@Nullable final String audioLanguage) { + this.audioTrack = audioLanguage; + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index 2f0c59325..64349409d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -46,7 +46,7 @@ public class VideoPlaybackResolver implements PlaybackResolver { @Nullable private String playbackQuality; @Nullable - private String audioLanguage; + private String audioTrack; public enum SourceType { LIVE_STREAM, @@ -91,11 +91,11 @@ public class VideoPlaybackResolver implements PlaybackResolver { } int audioIndex = 0; - if (audioLanguage != null) { + if (audioTrack != null) { for (int i = 0; i < audioStreamsList.size(); i++) { final AudioStream stream = audioStreamsList.get(i); if (stream.getAudioTrackId() != null - && stream.getAudioTrackId().equals(audioLanguage)) { + && stream.getAudioTrackId().equals(audioTrack)) { audioIndex = i; break; } @@ -107,8 +107,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { @Nullable final VideoStream video = tag.getMaybeQuality() .map(MediaItemTag.Quality::getSelectedVideoStream) .orElse(null); - @Nullable final AudioStream audio = tag.getMaybeAudioLanguage() - .map(MediaItemTag.AudioLanguage::getSelectedAudioStream) + @Nullable final AudioStream audio = tag.getMaybeAudioTrack() + .map(MediaItemTag.AudioTrack::getSelectedAudioStream) .orElse(null); if (video != null) { @@ -124,7 +124,7 @@ public class VideoPlaybackResolver implements PlaybackResolver { // Use the audio stream if there is no video stream, or // merge with audio stream in case if video does not contain audio - if (audio != null && (video == null || video.isVideoOnly() || audioLanguage != null)) { + if (audio != null && (video == null || video.isVideoOnly() || audioTrack != null)) { try { final MediaSource audioSource = PlaybackResolver.buildMediaSource( dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag); @@ -198,12 +198,12 @@ public class VideoPlaybackResolver implements PlaybackResolver { } @Nullable - public String getAudioLanguage() { - return audioLanguage; + public String getAudioTrack() { + return audioTrack; } - public void setAudioLanguage(@Nullable final String audioLanguage) { - this.audioLanguage = audioLanguage; + public void setAudioTrack(@Nullable final String audioLanguage) { + this.audioTrack = audioLanguage; } public interface QualityResolver { @@ -211,10 +211,4 @@ public class VideoPlaybackResolver implements PlaybackResolver { int getOverrideResolutionIndex(List sortedVideos, String playbackQuality); } - - public interface AudioLanguageResolver { - int getDefaultLanguageIndex(List audioStreams); - - int getOverrideLanguageIndex(List audioStreams, String audioLanguage); - } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 13cbc9fd3..df966d591 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -118,13 +118,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //////////////////////////////////////////////////////////////////////////*/ private static final int POPUP_MENU_ID_QUALITY = 69; - private static final int POPUP_MENU_ID_LANGUAGE = 70; + private static final int POPUP_MENU_ID_AUDIO_TRACK = 70; private static final int POPUP_MENU_ID_PLAYBACK_SPEED = 79; private static final int POPUP_MENU_ID_CAPTION = 89; protected boolean isSomePopupMenuVisible = false; private PopupMenu qualityPopupMenu; - private PopupMenu languagePopupMenu; + private PopupMenu audioTrackPopupMenu; protected PopupMenu playbackSpeedPopupMenu; private PopupMenu captionPopupMenu; @@ -176,7 +176,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa R.style.DarkPopupMenu); qualityPopupMenu = new PopupMenu(themeWrapper, binding.qualityTextView); - languagePopupMenu = new PopupMenu(themeWrapper, binding.languageTextView); + audioTrackPopupMenu = new PopupMenu(themeWrapper, binding.audioTrackTextView); playbackSpeedPopupMenu = new PopupMenu(context, binding.playbackSpeed); captionPopupMenu = new PopupMenu(themeWrapper, binding.captionTextView); @@ -194,8 +194,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected void initListeners() { binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked)); - binding.languageTextView.setOnClickListener( - makeOnClickListener(this::onAudioLanguageClicked)); + binding.audioTrackTextView.setOnClickListener( + makeOnClickListener(this::onAudioTracksClicked)); binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked)); binding.playbackSeekBar.setOnSeekBarChangeListener(this); @@ -272,7 +272,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected void deinitListeners() { binding.qualityTextView.setOnClickListener(null); - binding.languageTextView.setOnClickListener(null); + binding.audioTrackTextView.setOnClickListener(null); binding.playbackSpeed.setOnClickListener(null); binding.playbackSeekBar.setOnSeekBarChangeListener(null); binding.captionTextView.setOnClickListener(null); @@ -426,7 +426,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.topControls.setPaddingRelative(controlsPad, playerTopPad, controlsPad, 0); binding.bottomControls.setPaddingRelative(controlsPad, 0, controlsPad, 0); binding.qualityTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); - binding.languageTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); + binding.audioTrackTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setMinimumWidth(buttonsMinWidth); binding.captionTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); @@ -992,7 +992,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa private void updateStreamRelatedViews() { player.getCurrentStreamInfo().ifPresent(info -> { binding.qualityTextView.setVisibility(View.GONE); - binding.languageTextView.setVisibility(View.GONE); + binding.audioTrackTextView.setVisibility(View.GONE); binding.playbackSpeed.setVisibility(View.GONE); binding.playbackEndTime.setVisibility(View.GONE); @@ -1028,7 +1028,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa } buildQualityMenu(); - buildLanguageMenu(); + buildAudioTrackMenu(); binding.qualityTextView.setVisibility(View.VISIBLE); binding.surfaceView.setVisibility(View.VISIBLE); @@ -1077,15 +1077,15 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa .ifPresent(s -> binding.qualityTextView.setText(s.getResolution())); } - private void buildLanguageMenu() { - if (languagePopupMenu == null) { + private void buildAudioTrackMenu() { + if (audioTrackPopupMenu == null) { return; } - languagePopupMenu.getMenu().removeGroup(POPUP_MENU_ID_LANGUAGE); + audioTrackPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_AUDIO_TRACK); final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) - .flatMap(MediaItemTag::getMaybeAudioLanguage) - .map(MediaItemTag.AudioLanguage::getAudioStreams) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) .orElse(null); if (availableStreams == null || availableStreams.size() < 2) { return; @@ -1096,15 +1096,15 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa if (audioStream.getAudioTrackName() == null) { continue; } - languagePopupMenu.getMenu().add(POPUP_MENU_ID_LANGUAGE, i, Menu.NONE, + audioTrackPopupMenu.getMenu().add(POPUP_MENU_ID_AUDIO_TRACK, i, Menu.NONE, audioStream.getAudioTrackName()); } player.getSelectedAudioStream() - .ifPresent(s -> binding.languageTextView.setText(s.getAudioTrackName())); - binding.languageTextView.setVisibility(View.VISIBLE); - languagePopupMenu.setOnMenuItemClickListener(this); - languagePopupMenu.setOnDismissListener(this); + .ifPresent(s -> binding.audioTrackTextView.setText(s.getAudioTrackName())); + binding.audioTrackTextView.setVisibility(View.VISIBLE); + audioTrackPopupMenu.setOnMenuItemClickListener(this); + audioTrackPopupMenu.setOnDismissListener(this); } private void buildPlaybackSpeedMenu() { @@ -1215,13 +1215,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa .ifPresent(binding.qualityTextView::setText); } - private void onAudioLanguageClicked() { - languagePopupMenu.show(); + private void onAudioTracksClicked() { + audioTrackPopupMenu.show(); isSomePopupMenuVisible = true; player.getSelectedAudioStream() .map(AudioStream::getAudioTrackName) - .ifPresent(binding.languageTextView::setText); + .ifPresent(binding.audioTrackTextView::setText); } /** @@ -1238,8 +1238,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa if (menuItem.getGroupId() == POPUP_MENU_ID_QUALITY) { onQualityItemClick(menuItem); return true; - } else if (menuItem.getGroupId() == POPUP_MENU_ID_LANGUAGE) { - onLanguageItemClick(menuItem); + } else if (menuItem.getGroupId() == POPUP_MENU_ID_AUDIO_TRACK) { + onAudioTrackItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); @@ -1275,28 +1275,28 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.qualityTextView.setText(menuItem.getTitle()); } - private void onLanguageItemClick(@NonNull final MenuItem menuItem) { + private void onAudioTrackItemClick(@NonNull final MenuItem menuItem) { final int menuItemIndex = menuItem.getItemId(); @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeAudioLanguage().isEmpty()) { + if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { return; } - final MediaItemTag.AudioLanguage language = - currentMetadata.getMaybeAudioLanguage().get(); - final List availableStreams = language.getAudioStreams(); - final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); + final MediaItemTag.AudioTrack audioTrack = + currentMetadata.getMaybeAudioTrack().get(); + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { return; } player.saveStreamProgressState(); - final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); + final String newAudioTrack = availableStreams.get(menuItemIndex).getAudioTrackId(); player.setRecovery(); - player.setAudioLanguage(newLanguage); + player.setAudioTrack(newAudioTrack); player.reloadPlayQueueManager(); - binding.languageTextView.setText(menuItem.getTitle()); + binding.audioTrackTextView.setText(menuItem.getTitle()); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index ef40692d7..a2e8216a3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -188,6 +188,14 @@ public final class ListHelper { videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + /** + * Filter the list of audio streams and return a list with the preferred stream for + * each audio track. Streams are sorted with the preferred language in the first position. + * + * @param context the context to search for the track to give preference + * @param audioStreams the list of audio streams + * @return the sorted, filtered list + */ public static List getFilteredAudioStreams( @NonNull final Context context, @Nullable final List audioStreams) { diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 82760be3a..89f1ed88e 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -158,7 +158,7 @@ + + + + Remove Details Audio Settings + Audio: + Audio track Hold to enqueue Show channel details Enqueue From 87a88e4df7f6c0040e5bfce735a24d7f8034b20d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 03:06:29 +0100 Subject: [PATCH 014/133] feat: localized audio track names --- app/build.gradle | 2 +- .../newpipe/player/PlayQueueActivity.java | 32 +++++++------- .../newpipe/player/ui/VideoPlayerUi.java | 13 ++---- .../org/schabi/newpipe/util/ListHelper.java | 11 ++++- .../org/schabi/newpipe/util/Localization.java | 42 +++++++++++++++++++ app/src/main/res/values/strings.xml | 6 ++- 6 files changed, 76 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c0d423817..a766b16a8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,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:5a9b6ed2e3306b9152cc6689dd61dbbe43483845' + implementation 'com.github.Theta-Dev:NewPipeExtractor:3fb356a7065c75909ee3856a29be92317c295bb9' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index fa3668e8b..8c56627ec 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -5,6 +5,7 @@ import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; @@ -48,7 +49,6 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.ThemeHelper; import java.util.List; -import java.util.Objects; import java.util.Optional; public final class PlayQueueActivity extends AppCompatActivity @@ -618,14 +618,17 @@ public final class PlayQueueActivity extends AppCompatActivity return; } + final Context context = player.getContext(); final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) .flatMap(MediaItemTag::getMaybeAudioTrack) .map(MediaItemTag.AudioTrack::getAudioStreams) .orElse(null); + final Optional selectedAudioStream = player.getSelectedAudioStream(); - if (availableStreams == null || availableStreams.size() < 2) { + if (availableStreams == null || availableStreams.size() < 2 + || selectedAudioStream.isEmpty()) { audioTrackSelector.setVisible(false); } else { final SubMenu audioTrackMenu = audioTrackSelector.getSubMenu(); @@ -633,25 +636,20 @@ public final class PlayQueueActivity extends AppCompatActivity for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); - if (audioStream.getAudioTrackName() == null) { - continue; - } - audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, - audioStream.getAudioTrackName()); + Localization.audioTrackName(context, audioStream)); } - player.getSelectedAudioStream().ifPresent(s -> { - final String trackName = Objects.toString(s.getAudioTrackName(), ""); - audioTrackSelector.setTitle(getString(R.string.play_queue_audio_track) + trackName); - - final String shortName = s.getAudioLocale() != null - ? s.getAudioLocale().getLanguage() : trackName; - audioTrackSelector.setTitleCondensed( - shortName.substring(0, Math.min(shortName.length(), 2))); - audioTrackSelector.setVisible(true); - }); + final AudioStream s = selectedAudioStream.get(); + final String trackName = Localization.audioTrackName(context, s); + audioTrackSelector.setTitle( + context.getString(R.string.play_queue_audio_track, trackName)); + final String shortName = s.getAudioLocale() != null + ? s.getAudioLocale().getLanguage() : trackName; + audioTrackSelector.setTitleCondensed( + shortName.substring(0, Math.min(shortName.length(), 2))); + audioTrackSelector.setVisible(true); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index df966d591..8aff0af87 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -79,6 +79,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper; import org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHolder; import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; @@ -1093,15 +1094,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); - if (audioStream.getAudioTrackName() == null) { - continue; - } audioTrackPopupMenu.getMenu().add(POPUP_MENU_ID_AUDIO_TRACK, i, Menu.NONE, - audioStream.getAudioTrackName()); + Localization.audioTrackName(context, audioStream)); } player.getSelectedAudioStream() - .ifPresent(s -> binding.audioTrackTextView.setText(s.getAudioTrackName())); + .ifPresent(s -> binding.audioTrackTextView.setText( + Localization.audioTrackName(context, s))); binding.audioTrackTextView.setVisibility(View.VISIBLE); audioTrackPopupMenu.setOnMenuItemClickListener(this); audioTrackPopupMenu.setOnDismissListener(this); @@ -1218,10 +1217,6 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa private void onAudioTracksClicked() { audioTrackPopupMenu.show(); isSomePopupMenuVisible = true; - - player.getSelectedAudioStream() - .map(AudioStream::getAudioTrackName) - .ifPresent(binding.audioTrackTextView::setText); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index a2e8216a3..971ee2759 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -13,6 +13,7 @@ import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import org.schabi.newpipe.extractor.stream.DeliveryMethod; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -244,8 +245,14 @@ public final class ListHelper { final Comparator trackCmp = getAudioTrackComparator(preferredLanguageOrEnglish, preferDescriptiveAudio); + // Filter unknown audio tracks if there are multiple tracks + java.util.stream.Stream cs = collectedStreams.values().stream(); + if (collectedStreams.size() > 1) { + cs = cs.filter(s -> s.getAudioTrackId() != null); + } + // Sort collected streams - return collectedStreams.values().stream().sorted(trackCmp).collect(Collectors.toList()); + return cs.sorted(trackCmp).collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -672,7 +679,7 @@ public final class ListHelper { return Comparator.comparing(AudioStream::getAudioLocale, (o1, o2) -> Boolean.compare( o1 == null || !o1.getISO3Language().equals(preferredLanguage), o2 == null || !o2.getISO3Language().equals(preferredLanguage)) - ).thenComparing(AudioStream::isDescriptive, (o1, o2) -> + ).thenComparing(s -> s.getAudioTrackType() == AudioTrackType.DESCRIPTIVE, (o1, o2) -> Boolean.compare(o1 ^ preferDescriptiveAudio, o2 ^ preferDescriptiveAudio) ).thenComparing(AudioStream::getAudioTrackName, (o1, o2) -> { if (o1 != null) { diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 916b902f0..b4745560c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -21,6 +21,7 @@ import org.ocpsoft.prettytime.units.Decade; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.stream.AudioStream; import java.math.BigDecimal; import java.math.RoundingMode; @@ -261,6 +262,47 @@ public final class Localization { } } + /** + * Get the localized name of an audio track. + *

Example:

+ *

English (original)

+ *

English (descriptive)

+ *

Spanish (dubbed)

+ * + * @param context used to get app language + * @param track a {@link AudioStream} of the track + * @return localized track name + */ + public static String audioTrackName(final Context context, final AudioStream track) { + String res; + + if (track.getAudioLocale() != null) { + res = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); + } else if (track.getAudioTrackName() != null) { + res = track.getAudioTrackName(); + } else { + res = context.getString(R.string.unknown_audio_track); + } + + if (track.getAudioTrackType() != null) { + res += " ("; + switch (track.getAudioTrackType()) { + case ORIGINAL: + res += context.getString(R.string.track_type_original); + break; + case DUBBED: + res += context.getString(R.string.track_type_dubbed); + break; + case DESCRIPTIVE: + res += context.getString(R.string.track_type_descriptive); + break; + } + res += ")"; + } + + return res; + } + /*////////////////////////////////////////////////////////////////////////// // Pretty Time //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c578eeb2..91d618852 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -413,7 +413,7 @@ Remove Details Audio Settings - Audio: + Audio: %s Audio track Hold to enqueue Show channel details @@ -768,10 +768,14 @@ Select quality for external players Unknown format Unknown quality + Unknown Show future items Hide future items Fully watched Partially watched Upcoming Sort + original + dubbed + descriptive \ No newline at end of file From 7aed2eed8af152edd2713c2ce55c6319d9d31046 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 20:40:27 +0100 Subject: [PATCH 015/133] feat: add prefer original option, improve audio stream ordering --- .../resolver/AudioPlaybackResolver.java | 14 +- .../resolver/VideoPlaybackResolver.java | 14 +- .../org/schabi/newpipe/util/ListHelper.java | 179 +++++++++--------- app/src/main/res/values/settings_keys.xml | 3 +- app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/content_settings.xml | 8 - app/src/main/res/xml/video_audio_settings.xml | 16 ++ 7 files changed, 113 insertions(+), 123 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index 2e7b5c7d5..e94295724 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -52,18 +52,8 @@ public class AudioPlaybackResolver implements PlaybackResolver { final MediaItemTag tag; if (!audioStreams.isEmpty()) { - int audioIndex = 0; - - if (audioTrack != null) { - for (int i = 0; i < audioStreams.size(); i++) { - final AudioStream audioStream = audioStreams.get(i); - if (audioStream.getAudioTrackId() != null - && audioStream.getAudioTrackId().equals(audioTrack)) { - audioIndex = i; - break; - } - } - } + final int audioIndex = + ListHelper.getAudioFormatIndex(context, audioStreams, audioTrack); stream = getStreamForIndex(audioIndex, audioStreams); tag = StreamInfoTag.of(info, audioStreams, audioIndex); } else { diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index 64349409d..4f5465751 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -90,18 +90,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { getPlaybackQuality()); } - int audioIndex = 0; - if (audioTrack != null) { - for (int i = 0; i < audioStreamsList.size(); i++) { - final AudioStream stream = audioStreamsList.get(i); - if (stream.getAudioTrackId() != null - && stream.getAudioTrackId().equals(audioTrack)) { - audioIndex = i; - break; - } - } - } - + final int audioIndex = + ListHelper.getAudioFormatIndex(context, audioStreamsList, audioTrack); final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex); @Nullable final VideoStream video = tag.getMaybeQuality() diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 971ee2759..1be020eae 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -38,11 +38,17 @@ public final class ListHelper { // Audio format in order of quality. 0=lowest quality, n=highest quality private static final List AUDIO_FORMAT_QUALITY_RANKING = List.of(MediaFormat.MP3, MediaFormat.WEBMA, MediaFormat.M4A); - // Audio format in order of efficiency. 0=most efficient, n=least efficient + // Audio format in order of efficiency. 0=least efficient, n=most efficient private static final List AUDIO_FORMAT_EFFICIENCY_RANKING = - List.of(MediaFormat.WEBMA, MediaFormat.M4A, MediaFormat.MP3); + List.of(MediaFormat.MP3, MediaFormat.M4A, MediaFormat.WEBMA); // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); + // Audio track types in order of priotity. 0=lowest, n=highest + private static final List AUDIO_TRACK_TYPE_RANKING = + List.of(AudioTrackType.DESCRIPTIVE, AudioTrackType.DUBBED, AudioTrackType.ORIGINAL); + // Audio track types in order of priotity when descriptive audio is preferred. + private static final List AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE = + List.of(AudioTrackType.ORIGINAL, AudioTrackType.DUBBED, AudioTrackType.DESCRIPTIVE); private ListHelper() { } @@ -104,13 +110,23 @@ public final class ListHelper { final MediaFormat defaultFormat = getDefaultFormat(context, R.string.default_audio_format_key, R.string.default_audio_format_value); - // If the user has chosen to limit resolution to conserve mobile data - // usage then we should also limit our audio usage. - if (isLimitingDataUsage(context)) { - return getMostCompactAudioIndex(defaultFormat, audioStreams); - } else { - return getHighestQualityAudioIndex(defaultFormat, audioStreams); + return getAudioIndexByHighestRank(defaultFormat, audioStreams, + getAudioStreamComparator(context)); + } + + public static int getAudioFormatIndex(final Context context, + final List audioStreams, + @Nullable final String trackId) { + if (trackId != null) { + for (int i = 0; i < audioStreams.size(); i++) { + final AudioStream s = audioStreams.get(i); + if (s.getAudioTrackId() != null + && s.getAudioTrackId().equals(trackId)) { + return i; + } + } } + return getDefaultAudioFormat(context, audioStreams); } /** @@ -193,7 +209,7 @@ public final class ListHelper { * Filter the list of audio streams and return a list with the preferred stream for * each audio track. Streams are sorted with the preferred language in the first position. * - * @param context the context to search for the track to give preference + * @param context the context to search for the track to give preference * @param audioStreams the list of audio streams * @return the sorted, filtered list */ @@ -206,15 +222,7 @@ public final class ListHelper { final HashMap collectedStreams = new HashMap<>(); - final Comparator cmp; - if (isLimitingDataUsage(context)) { - cmp = getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING); - } else { - cmp = getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING); - } - - final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); - boolean hasPreferredLanguage = false; + final Comparator cmp = getAudioStreamFormatComparator(context); for (final AudioStream stream : audioStreams) { if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { @@ -226,33 +234,18 @@ public final class ListHelper { final AudioStream presentStream = collectedStreams.get(trackId); if (presentStream == null || cmp.compare(stream, presentStream) > 0) { collectedStreams.put(trackId, stream); - - if (stream.getAudioLocale() != null - && stream.getAudioLocale().getISO3Language().equals(preferredLanguage)) { - hasPreferredLanguage = true; - } } } - // Fall back to English if the preferred language was not found - final String preferredLanguageOrEnglish = - hasPreferredLanguage ? preferredLanguage : Locale.ENGLISH.getISO3Language(); - final SharedPreferences preferences = - PreferenceManager.getDefaultSharedPreferences(context); - final boolean preferDescriptiveAudio = - preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), - false); - final Comparator trackCmp = - getAudioTrackComparator(preferredLanguageOrEnglish, preferDescriptiveAudio); - // Filter unknown audio tracks if there are multiple tracks java.util.stream.Stream cs = collectedStreams.values().stream(); if (collectedStreams.size() > 1) { cs = cs.filter(s -> s.getAudioTrackId() != null); } - // Sort collected streams - return cs.sorted(trackCmp).collect(Collectors.toList()); + // Sort collected streams by name + return cs.sorted(Comparator.comparing(audioStream -> + Localization.audioTrackName(context, audioStream))).collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -420,42 +413,6 @@ public final class ListHelper { return videoStreams; } - /** - * Get the audio from the list with the highest quality. - * Format will be ignored if it yields no results. - * - * @param format The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @return Index of audio stream that produces the most compact results or -1 if not found - */ - static int getHighestQualityAudioIndex(@Nullable final MediaFormat format, - @Nullable final List audioStreams) { - return getAudioIndexByHighestRank(format, audioStreams, - // Compares descending (last = highest rank) - getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING)); - } - - /** - * Get the audio from the list with the lowest bitrate and most efficient format. - * Format will be ignored if it yields no results. - * - * @param format The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @return Index of audio stream that produces the most compact results or -1 if not found - */ - static int getMostCompactAudioIndex(@Nullable final MediaFormat format, - @Nullable final List audioStreams) { - return getAudioIndexByHighestRank(format, audioStreams, - // The "reversed()" is important -> Compares ascending (first = highest rank) - getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING).reversed()); - } - - private static Comparator getAudioStreamComparator( - final List formatRanking) { - return Comparator.nullsLast(Comparator.comparingInt(AudioStream::getAverageBitrate)) - .thenComparingInt(stream -> formatRanking.indexOf(stream.getFormat())); - } - /** * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. @@ -674,23 +631,65 @@ public final class ListHelper { return manager.isActiveNetworkMetered(); } - private static Comparator getAudioTrackComparator( - final String preferredLanguage, final boolean preferDescriptiveAudio) { - return Comparator.comparing(AudioStream::getAudioLocale, (o1, o2) -> Boolean.compare( - o1 == null || !o1.getISO3Language().equals(preferredLanguage), - o2 == null || !o2.getISO3Language().equals(preferredLanguage)) - ).thenComparing(s -> s.getAudioTrackType() == AudioTrackType.DESCRIPTIVE, (o1, o2) -> - Boolean.compare(o1 ^ preferDescriptiveAudio, o2 ^ preferDescriptiveAudio) - ).thenComparing(AudioStream::getAudioTrackName, (o1, o2) -> { - if (o1 != null) { - if (o2 != null) { - return o1.compareTo(o2); - } else { - return -1; - } - } else { - return 1; - } - }); + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * + * @param context App context + * @return Comparator + */ + private static Comparator getAudioStreamFormatComparator( + @NonNull final Context context) { + final boolean limitDataUsage = isLimitingDataUsage(context); + final List formatRanking = limitDataUsage + ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; + + Comparator bitrateComparator = + Comparator.comparingInt(AudioStream::getAverageBitrate); + if (limitDataUsage) { + bitrateComparator = bitrateComparator.reversed(); + } + + return bitrateComparator.thenComparingInt( + stream -> formatRanking.indexOf(stream.getFormat())); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format + * and bitrate. + * + * @param context App context + * @return Comparator + */ + private static Comparator getAudioStreamComparator( + @NonNull final Context context) { + final SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(context); + final boolean preferOriginalAudio = + preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), + false); + final boolean preferDescriptiveAudio = + preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), + false); + final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); + + final List trackTypeRanking = preferDescriptiveAudio + ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; + + return Comparator.comparing(AudioStream::getAudioTrackType, (o1, o2) -> { + if (preferOriginalAudio) { + return Boolean.compare( + o1 == AudioTrackType.ORIGINAL, o2 == AudioTrackType.ORIGINAL); + } + return 0; + }).thenComparing(AudioStream::getAudioLocale, + Comparator.nullsFirst(Comparator.comparing( + locale -> locale.getISO3Language().equals(preferredLanguage)))) + .thenComparing(AudioStream::getAudioTrackType, + Comparator.nullsLast(Comparator.comparingInt(trackTypeRanking::indexOf))) + .thenComparing(AudioStream::getAudioLocale, + Comparator.nullsFirst(Comparator.comparing( + locale -> locale.getISO3Language().equals( + Locale.ENGLISH.getISO3Language())))) + .thenComparing(getAudioStreamFormatComparator(context)); } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 9ed34bf26..36dcf2b33 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -192,6 +192,8 @@ @string/audio_webm_key + prefer_original_audio + prefer_descriptive_audio last_resize_mode @@ -260,7 +262,6 @@ show_next_video show_description show_meta_info - prefer_descriptive_audio stream_info_selected_tab show_hold_to_append content_language diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91d618852..475585879 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Turn off to hide video description and additional information Show meta info Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request + Prefer original audio + Select the original audio track regardless of the language Prefer descriptive audio Select an audio track with descriptions for visually impaired people if available Image cache wiped diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 684b9e558..fddb966c8 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -114,14 +114,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + + + Date: Sun, 19 Mar 2023 21:05:48 +0100 Subject: [PATCH 016/133] feat: add external audio playback language selector --- .../fragments/detail/VideoDetailFragment.java | 65 ++++++++++++++----- .../newpipe/player/PlayQueueActivity.java | 8 +-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 52 insertions(+), 22 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 7278716c0..4bb418e80 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 @@ -164,8 +164,12 @@ public final class VideoDetailFragment private boolean showRelatedItems; private boolean showDescription; private String selectedTabTag; - @AttrRes @NonNull final List tabIcons = new ArrayList<>(); - @StringRes @NonNull final List tabContentDescriptions = new ArrayList<>(); + @AttrRes + @NonNull + final List tabIcons = new ArrayList<>(); + @StringRes + @NonNull + final List tabContentDescriptions = new ArrayList<>(); private boolean tabSettingsChanged = false; private int lastAppBarVerticalOffset = Integer.MAX_VALUE; // prevents useless updates @@ -1042,20 +1046,10 @@ public final class VideoDetailFragment player.setRecovery(); } - if (!useExternalAudioPlayer) { - openNormalBackgroundPlayer(append); + if (useExternalAudioPlayer) { + showExternalAudioPlaybackDialog(); } else { - final List audioStreams = getUrlAndNonTorrentStreams( - currentInfo.getAudioStreams()); - final int index = ListHelper.getDefaultAudioFormat(activity, audioStreams); - - if (index == -1) { - Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, - Toast.LENGTH_SHORT).show(); - return; - } - - startOnExternalPlayer(activity, currentInfo, audioStreams.get(index)); + openNormalBackgroundPlayer(append); } } @@ -1108,7 +1102,7 @@ public final class VideoDetailFragment if (PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(this.getString(R.string.use_external_video_player_key), false)) { - showExternalPlaybackDialog(); + showExternalVideoPlaybackDialog(); } else { replaceQueueIfUserConfirms(this::openMainPlayer); } @@ -2102,7 +2096,7 @@ public final class VideoDetailFragment }).show(); } - private void showExternalPlaybackDialog() { + private void showExternalVideoPlaybackDialog() { if (currentInfo == null) { return; } @@ -2149,6 +2143,43 @@ public final class VideoDetailFragment builder.show(); } + private void showExternalAudioPlaybackDialog() { + if (currentInfo == null) { + return; + } + + final List audioStreams = getUrlAndNonTorrentStreams( + currentInfo.getAudioStreams()); + final List audioTracks = + ListHelper.getFilteredAudioStreams(activity, audioStreams); + + if (audioTracks.isEmpty()) { + Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, + Toast.LENGTH_SHORT).show(); + + } else if (audioTracks.size() == 1) { + startOnExternalPlayer(activity, currentInfo, audioTracks.get(0)); + } else { + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(R.string.select_audio_track_external_players); + + final int selectedAudioStream = + ListHelper.getDefaultAudioFormat(activity, audioTracks); + final CharSequence[] trackNames = audioTracks.stream() + .map(audioStream -> Localization.audioTrackName(activity, audioStream)) + .toArray(CharSequence[]::new); + + builder.setSingleChoiceItems(trackNames, selectedAudioStream, null); + builder.setNegativeButton(R.string.cancel, null); + builder.setPositiveButton(R.string.ok, (dialog, i) -> { + final int index = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); + startOnExternalPlayer(activity, currentInfo, + audioTracks.get(index)); + }); + builder.show(); + } + } + /* * Remove unneeded information while waiting for a next task * */ diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 8c56627ec..fd2128216 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -5,7 +5,6 @@ import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; @@ -618,7 +617,6 @@ public final class PlayQueueActivity extends AppCompatActivity return; } - final Context context = player.getContext(); final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) @@ -637,13 +635,13 @@ public final class PlayQueueActivity extends AppCompatActivity for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, - Localization.audioTrackName(context, audioStream)); + Localization.audioTrackName(this, audioStream)); } final AudioStream s = selectedAudioStream.get(); - final String trackName = Localization.audioTrackName(context, s); + final String trackName = Localization.audioTrackName(this, s); audioTrackSelector.setTitle( - context.getString(R.string.play_queue_audio_track, trackName)); + getString(R.string.play_queue_audio_track, trackName)); final String shortName = s.getAudioLocale() != null ? s.getAudioLocale().getLanguage() : trackName; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 475585879..a4fbba67b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -768,6 +768,7 @@ No audio streams are available for external players No video streams are available for external players Select quality for external players + Select audio track for external players Unknown format Unknown quality Unknown From 9b8ffdd2aa9a0c74d6bdd247ada98a9376df802a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 21:20:21 +0100 Subject: [PATCH 017/133] fix: improve track name localization --- .../org/schabi/newpipe/util/Localization.java | 40 ++++++++++--------- app/src/main/res/values/strings.xml | 7 ++-- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index b4745560c..9123d377c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -11,6 +11,7 @@ import android.text.TextUtils; import android.util.DisplayMetrics; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.PluralsRes; import androidx.annotation.StringRes; import androidx.core.math.MathUtils; @@ -22,6 +23,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import java.math.BigDecimal; import java.math.RoundingMode; @@ -274,33 +276,35 @@ public final class Localization { * @return localized track name */ public static String audioTrackName(final Context context, final AudioStream track) { - String res; - + final String name; if (track.getAudioLocale() != null) { - res = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); + name = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); } else if (track.getAudioTrackName() != null) { - res = track.getAudioTrackName(); + name = track.getAudioTrackName(); } else { - res = context.getString(R.string.unknown_audio_track); + name = context.getString(R.string.unknown_audio_track); } if (track.getAudioTrackType() != null) { - res += " ("; - switch (track.getAudioTrackType()) { - case ORIGINAL: - res += context.getString(R.string.track_type_original); - break; - case DUBBED: - res += context.getString(R.string.track_type_dubbed); - break; - case DESCRIPTIVE: - res += context.getString(R.string.track_type_descriptive); - break; + final String trackType = audioTrackType(context, track.getAudioTrackType()); + if (trackType != null) { + return context.getString(R.string.audio_track_name, name, trackType); } - res += ")"; } + return name; + } - return res; + @Nullable + private static String audioTrackType(final Context context, final AudioTrackType trackType) { + switch (trackType) { + case ORIGINAL: + return context.getString(R.string.audio_track_type_original); + case DUBBED: + return context.getString(R.string.audio_track_type_dubbed); + case DESCRIPTIVE: + return context.getString(R.string.audio_track_type_descriptive); + } + return null; } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a4fbba67b..cc340e99c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -778,7 +778,8 @@ Partially watched Upcoming Sort - original - dubbed - descriptive + %s %s + original + dubbed + descriptive \ No newline at end of file From 61a14765f3bc23c93a004df03b063c4c6014706e Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 22:31:31 +0100 Subject: [PATCH 018/133] fix: ListHelper tests --- .../org/schabi/newpipe/util/ListHelper.java | 34 +++-- .../schabi/newpipe/util/ListHelperTest.java | 122 ++++++++++++++---- 2 files changed, 123 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 1be020eae..002a8014e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -222,7 +222,8 @@ public final class ListHelper { final HashMap collectedStreams = new HashMap<>(); - final Comparator cmp = getAudioStreamFormatComparator(context); + final Comparator cmp = + getAudioStreamFormatComparator(isLimitingDataUsage(context)); for (final AudioStream stream : audioStreams) { if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { @@ -422,7 +423,7 @@ public final class ListHelper { * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ - private static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, + static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, @Nullable final List audioStreams, final Comparator comparator) { if (audioStreams == null || audioStreams.isEmpty()) { @@ -634,12 +635,11 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * - * @param context App context + * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ private static Comparator getAudioStreamFormatComparator( - @NonNull final Context context) { - final boolean limitDataUsage = isLimitingDataUsage(context); + final boolean limitDataUsage) { final List formatRanking = limitDataUsage ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; @@ -664,14 +664,32 @@ public final class ListHelper { @NonNull final Context context) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + final Locale preferredLanguage = Localization.getPreferredLocale(context); final boolean preferOriginalAudio = preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), false); final boolean preferDescriptiveAudio = preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), false); - final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); + return getAudioStreamComparator(preferredLanguage, preferOriginalAudio, + preferDescriptiveAudio, isLimitingDataUsage(context)); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format + * and bitrate. + * @param preferredLanguage Preferred audio stream language + * @param preferOriginalAudio Get the original audio track regardless of its language + * @param preferDescriptiveAudio Prefer the descriptive audio track if available + * @param limitDataUsage choose low bitrate audio stream + * @return Comparator + */ + static Comparator getAudioStreamComparator(final Locale preferredLanguage, + final boolean preferOriginalAudio, + final boolean preferDescriptiveAudio, + final boolean limitDataUsage) { + final String langCode = preferredLanguage.getISO3Language(); final List trackTypeRanking = preferDescriptiveAudio ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; @@ -683,13 +701,13 @@ public final class ListHelper { return 0; }).thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( - locale -> locale.getISO3Language().equals(preferredLanguage)))) + locale -> locale.getISO3Language().equals(langCode)))) .thenComparing(AudioStream::getAudioTrackType, Comparator.nullsLast(Comparator.comparingInt(trackTypeRanking::indexOf))) .thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals( Locale.ENGLISH.getISO3Language())))) - .thenComparing(getAudioStreamFormatComparator(context)); + .thenComparing(getAudioStreamFormatComparator(limitDataUsage)); } } diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 8a75b1b4e..173892e5a 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -3,10 +3,13 @@ package org.schabi.newpipe.util; import org.junit.Test; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import org.schabi.newpipe.extractor.stream.VideoStream; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -29,6 +32,15 @@ public class ListHelperTest { generateAudioStream("mp3-192", MediaFormat.MP3, 192), generateAudioStream("webma-320", MediaFormat.WEBMA, 320)); + private static final List AUDIO_TRACKS_TEST_LIST = List.of( + generateAudioTrack("en.or", "en.or", Locale.ENGLISH, AudioTrackType.ORIGINAL), + generateAudioTrack("en.du", "en.du", Locale.ENGLISH, AudioTrackType.DUBBED), + generateAudioTrack("en.ds", "en.ds", Locale.ENGLISH, AudioTrackType.DESCRIPTIVE), + generateAudioTrack("unknown", null, null, null), + generateAudioTrack("de.du", "de.du", Locale.GERMAN, AudioTrackType.DUBBED), + generateAudioTrack("de.ds", "de.ds", Locale.GERMAN, AudioTrackType.DESCRIPTIVE) + ); + private static final List VIDEO_STREAMS_TEST_LIST = List.of( generateVideoStream("mpeg_4-720", MediaFormat.MPEG_4, "720p", false), generateVideoStream("v3gpp-240", MediaFormat.v3GPP, "240p", false), @@ -199,24 +211,28 @@ public class ListHelperTest { @Test public void getHighestQualityAudioFormatTest() { - AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST)); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getHighestQualityAudioFormatPreferredAbsent() { + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -227,8 +243,8 @@ public class ListHelperTest { generateAudioStream("webma-192", MediaFormat.WEBMA, 192)); // List doesn't contains this format // It should fallback to the highest bitrate audio no matter what format it is - AudioStream stream = testList.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.MP3, testList)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -246,44 +262,53 @@ public class ListHelperTest { generateAudioStream("webma-192-4", MediaFormat.WEBMA, 192))); // List doesn't contains this format, it should fallback to the highest bitrate audio and // the highest quality format. - stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // Adding a new format and bitrate. Adding another stream will have no impact since // it's not a preferred format. testList.add(generateAudioStream("webma-192-5", MediaFormat.WEBMA, 192)); - stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); } @Test public void getHighestQualityAudioNull() { - assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, null)); - assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, new ArrayList<>())); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); } @Test public void getLowestQualityAudioFormatTest() { - AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST)); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); + + AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getLowestQualityAudioFormatPreferredAbsent() { + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -294,14 +319,15 @@ public class ListHelperTest { generateAudioStream("webma-192-1", MediaFormat.WEBMA, 192))); // List doesn't contains this format // It should fallback to the most compact audio no matter what format it is. - AudioStream stream = testList.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.MP3, testList)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // WEBMA is more compact than M4A testList.add(generateAudioStream("webma-192-2", MediaFormat.WEBMA, 128)); - stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -318,20 +344,52 @@ public class ListHelperTest { generateAudioStream("m4a-192-3", MediaFormat.M4A, 192))); // List doesn't contain this format // It should fallback to the most compact audio no matter what format it is. - stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList)); + stream = testList.get( + ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); // Should be same as above - stream = testList.get(ListHelper.getMostCompactAudioIndex(null, testList)); + stream = testList.get( + ListHelper.getAudioIndexByHighestRank(null, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); } @Test public void getLowestQualityAudioNull() { - assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, null)); - assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, new ArrayList<>())); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); + } + + @Test + public void getAudioTrack() { + // English language + Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + AudioStream stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); + + // German language + cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, false, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("de.du", stream.getId()); + + // German language, but prefer original + cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, true, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); + + // Prefer descriptive audio + cmp = ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, true, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.ds", stream.getId()); } @Test @@ -390,6 +448,20 @@ public class ListHelperTest { .build(); } + private static AudioStream generateAudioTrack( + @NonNull final String id, @Nullable final String trackId, + @Nullable final Locale locale, @Nullable final AudioTrackType trackType) { + return new AudioStream.Builder() + .setId(id) + .setContent("", true) + .setMediaFormat(MediaFormat.M4A) + .setAverageBitrate(128) + .setAudioTrackId(trackId) + .setAudioLocale(locale) + .setAudioTrackType(trackType) + .build(); + } + @NonNull private static VideoStream generateVideoStream(@NonNull final String id, @Nullable final MediaFormat mediaFormat, From dbd6e4d11f43e5b4cf69a7db18d11f1605a7cc32 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 22:55:37 +0100 Subject: [PATCH 019/133] fix: sonarcloud lint --- .../newpipe/player/PlayQueueActivity.java | 28 +++++++++---------- .../org/schabi/newpipe/util/ListHelper.java | 5 ++-- .../schabi/newpipe/util/ListHelperTest.java | 6 ++++ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index fd2128216..bf0dc4a56 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -657,23 +657,21 @@ public final class PlayQueueActivity extends AppCompatActivity * @param itemId index of the selected item */ private void onAudioTrackClick(final int itemId) { - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { + if (player.getCurrentMetadata() == null) { return; } + player.getCurrentMetadata().getMaybeAudioTrack().ifPresent(audioTrack -> { + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { + return; + } - final MediaItemTag.AudioTrack audioTrack = - currentMetadata.getMaybeAudioTrack().get(); - final List availableStreams = audioTrack.getAudioStreams(); - final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); - if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { - return; - } - - player.saveStreamProgressState(); - final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); - player.setRecovery(); - player.setAudioTrack(newAudioTrack); - player.reloadPlayQueueManager(); + player.saveStreamProgressState(); + final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); + player.setRecovery(); + player.setAudioTrack(newAudioTrack); + player.reloadPlayQueueManager(); + }); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 002a8014e..68e50b9c1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -239,13 +239,12 @@ public final class ListHelper { } // Filter unknown audio tracks if there are multiple tracks - java.util.stream.Stream cs = collectedStreams.values().stream(); if (collectedStreams.size() > 1) { - cs = cs.filter(s -> s.getAudioTrackId() != null); + collectedStreams.remove(""); } // Sort collected streams by name - return cs.sorted(Comparator.comparing(audioStream -> + return collectedStreams.values().stream().sorted(Comparator.comparing(audioStream -> Localization.audioTrackName(context, audioStream))).collect(Collectors.toList()); } diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 173892e5a..4619f8ad7 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -390,6 +390,12 @@ public class ListHelperTest { stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( null, AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.ds", stream.getId()); + + // Japanese language, fall back to original + cmp = ListHelper.getAudioStreamComparator(Locale.JAPANESE, true, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); } @Test From fdd3b03fe5b1848ccf1765d9eabca49b01a98f01 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 23:37:52 +0100 Subject: [PATCH 020/133] fix: audio stream format selection --- .../org/schabi/newpipe/util/ListHelper.java | 78 +++++++++--------- .../schabi/newpipe/util/ListHelperTest.java | 80 +++++++++---------- 2 files changed, 75 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 68e50b9c1..0164b708f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -107,11 +107,8 @@ public final class ListHelper { public static int getDefaultAudioFormat(final Context context, final List audioStreams) { - final MediaFormat defaultFormat = getDefaultFormat(context, - R.string.default_audio_format_key, R.string.default_audio_format_value); - - return getAudioIndexByHighestRank(defaultFormat, audioStreams, - getAudioStreamComparator(context)); + return getAudioIndexByHighestRank(audioStreams, + getAudioTrackComparator(context).thenComparing(getAudioFormatComparator(context))); } public static int getAudioFormatIndex(final Context context, @@ -222,8 +219,7 @@ public final class ListHelper { final HashMap collectedStreams = new HashMap<>(); - final Comparator cmp = - getAudioStreamFormatComparator(isLimitingDataUsage(context)); + final Comparator cmp = getAudioFormatComparator(context); for (final AudioStream stream : audioStreams) { if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { @@ -417,32 +413,18 @@ public final class ListHelper { * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. * - * @param targetedFormat The target format type or null if it doesn't matter * @param audioStreams List of audio streams * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ - static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, - @Nullable final List audioStreams, - final Comparator comparator) { + static int getAudioIndexByHighestRank(@Nullable final List audioStreams, + final Comparator comparator) { if (audioStreams == null || audioStreams.isEmpty()) { return -1; } final AudioStream highestRankedAudioStream = audioStreams.stream() - .filter(audioStream -> targetedFormat == null - || audioStream.getFormat() == targetedFormat) - .max(comparator) - .orElse(null); - - if (highestRankedAudioStream == null) { - // Fallback: Ignore targetedFormat if not null - if (targetedFormat != null) { - return getAudioIndexByHighestRank(null, audioStreams, comparator); - } - // targetedFormat is already null -> return -1 - return -1; - } + .max(comparator).orElse(null); return audioStreams.indexOf(highestRankedAudioStream); } @@ -631,14 +613,27 @@ public final class ListHelper { return manager.isActiveNetworkMetered(); } + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * @param context app context + * @return Comparator + */ + private static Comparator getAudioFormatComparator( + final @NonNull Context context) { + final MediaFormat defaultFormat = getDefaultFormat(context, + R.string.default_audio_format_key, R.string.default_audio_format_value); + return getAudioFormatComparator(defaultFormat, isLimitingDataUsage(context)); + } + /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * + * @param defaultFormat the default format to look for * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ - private static Comparator getAudioStreamFormatComparator( - final boolean limitDataUsage) { + static Comparator getAudioFormatComparator( + @Nullable final MediaFormat defaultFormat, final boolean limitDataUsage) { final List formatRanking = limitDataUsage ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; @@ -648,18 +643,22 @@ public final class ListHelper { bitrateComparator = bitrateComparator.reversed(); } - return bitrateComparator.thenComparingInt( + return Comparator.comparing(AudioStream::getFormat, (o1, o2) -> { + if (defaultFormat != null) { + return Boolean.compare(o1 == defaultFormat, o2 == defaultFormat); + } + return 0; + }).thenComparing(bitrateComparator).thenComparingInt( stream -> formatRanking.indexOf(stream.getFormat())); } /** - * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format - * and bitrate. + * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * * @param context App context * @return Comparator */ - private static Comparator getAudioStreamComparator( + private static Comparator getAudioTrackComparator( @NonNull final Context context) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); @@ -671,23 +670,21 @@ public final class ListHelper { preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), false); - return getAudioStreamComparator(preferredLanguage, preferOriginalAudio, - preferDescriptiveAudio, isLimitingDataUsage(context)); + return getAudioTrackComparator(preferredLanguage, preferOriginalAudio, + preferDescriptiveAudio); } /** - * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format - * and bitrate. + * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. + * * @param preferredLanguage Preferred audio stream language * @param preferOriginalAudio Get the original audio track regardless of its language * @param preferDescriptiveAudio Prefer the descriptive audio track if available - * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ - static Comparator getAudioStreamComparator(final Locale preferredLanguage, - final boolean preferOriginalAudio, - final boolean preferDescriptiveAudio, - final boolean limitDataUsage) { + static Comparator getAudioTrackComparator( + final Locale preferredLanguage, final boolean preferOriginalAudio, + final boolean preferDescriptiveAudio) { final String langCode = preferredLanguage.getISO3Language(); final List trackTypeRanking = preferDescriptiveAudio ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; @@ -706,7 +703,6 @@ public final class ListHelper { .thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals( - Locale.ENGLISH.getISO3Language())))) - .thenComparing(getAudioStreamFormatComparator(limitDataUsage)); + Locale.ENGLISH.getISO3Language())))); } } diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 4619f8ad7..b4a4167cf 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -211,20 +211,21 @@ public class ListHelperTest { @Test public void getHighestQualityAudioFormatTest() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, false); AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, false); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, false); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @@ -232,7 +233,7 @@ public class ListHelperTest { @Test public void getHighestQualityAudioFormatPreferredAbsent() { final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + ListHelper.getAudioFormatComparator(MediaFormat.MP3, false); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -243,8 +244,7 @@ public class ListHelperTest { generateAudioStream("webma-192", MediaFormat.WEBMA, 192)); // List doesn't contains this format // It should fallback to the highest bitrate audio no matter what format it is - AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, testList, cmp)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -263,7 +263,7 @@ public class ListHelperTest { // List doesn't contains this format, it should fallback to the highest bitrate audio and // the highest quality format. stream = - testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); @@ -271,44 +271,42 @@ public class ListHelperTest { // it's not a preferred format. testList.add(generateAudioStream("webma-192-5", MediaFormat.WEBMA, 192)); stream = - testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); } @Test public void getHighestQualityAudioNull() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); + final Comparator cmp = ListHelper.getAudioFormatComparator(null, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp)); } @Test public void getLowestQualityAudioFormatTest() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); - + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, true); AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, true); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getLowestQualityAudioFormatPreferredAbsent() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -319,15 +317,13 @@ public class ListHelperTest { generateAudioStream("webma-192-1", MediaFormat.WEBMA, 192))); // List doesn't contains this format // It should fallback to the most compact audio no matter what format it is. - AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, testList, cmp)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // WEBMA is more compact than M4A testList.add(generateAudioStream("webma-192-2", MediaFormat.WEBMA, 128)); - stream = - testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -345,56 +341,56 @@ public class ListHelperTest { // List doesn't contain this format // It should fallback to the most compact audio no matter what format it is. stream = testList.get( - ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); // Should be same as above + cmp = ListHelper.getAudioFormatComparator(null, true); stream = testList.get( - ListHelper.getAudioIndexByHighestRank(null, testList, cmp)); + ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); } @Test public void getLowestQualityAudioNull() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); + final Comparator cmp = ListHelper.getAudioFormatComparator(null, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp)); } @Test public void getAudioTrack() { // English language Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, false); AudioStream stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.or", stream.getId()); // German language - cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, false, false, false); + cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, false, false); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("de.du", stream.getId()); // German language, but prefer original - cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, true, false, false); + cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, true, false); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.or", stream.getId()); // Prefer descriptive audio - cmp = ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, true, false); + cmp = ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, true); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.ds", stream.getId()); // Japanese language, fall back to original - cmp = ListHelper.getAudioStreamComparator(Locale.JAPANESE, true, false, false); + cmp = ListHelper.getAudioTrackComparator(Locale.JAPANESE, true, false); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.or", stream.getId()); } From ed06f559aed1a466c2b659474a5f0b5719f224db Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 20 Mar 2023 14:12:08 +0100 Subject: [PATCH 021/133] feat: add track selection to downloader --- app/build.gradle | 2 +- .../newpipe/download/DownloadDialog.java | 166 +++++++++++++----- .../newpipe/util/AudioTrackAdapter.java | 94 ++++++++++ .../org/schabi/newpipe/util/ListHelper.java | 122 ++++++++++++- app/src/main/res/layout/download_dialog.xml | 36 +++- app/src/main/res/values/strings.xml | 1 + 6 files changed, 363 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java diff --git a/app/build.gradle b/app/build.gradle index a766b16a8..e9e1ea124 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,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.Theta-Dev:NewPipeExtractor:3fb356a7065c75909ee3856a29be92317c295bb9' + implementation 'com.github.Theta-Dev:NewPipeExtractor:1aa232475e957ce5d2c036406a983db4190ebf2b' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index d1ee0ee88..5d3679471 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -68,6 +68,8 @@ import org.schabi.newpipe.util.SecondaryStreamHelper; import org.schabi.newpipe.util.SimpleOnSeekBarChangeListener; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; +import org.schabi.newpipe.util.AudioTrackAdapter; +import org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper; import org.schabi.newpipe.util.ThemeHelper; import java.io.File; @@ -95,12 +97,14 @@ public class DownloadDialog extends DialogFragment @State StreamInfo currentInfo; @State - StreamSizeWrapper wrappedAudioStreams; - @State StreamSizeWrapper wrappedVideoStreams; @State StreamSizeWrapper wrappedSubtitleStreams; @State + AudioTracksWrapper wrappedAudioTracks; + @State + int selectedAudioStreamIndex; + @State int selectedVideoIndex; // set in the constructor @State int selectedAudioIndex = 0; // default to the first item @@ -117,6 +121,7 @@ public class DownloadDialog extends DialogFragment private Context context; private boolean askForSavePath; + private AudioTrackAdapter audioTrackAdapter; private StreamItemAdapter audioStreamsAdapter; private StreamItemAdapter videoStreamsAdapter; private StreamItemAdapter subtitleStreamsAdapter; @@ -163,18 +168,26 @@ public class DownloadDialog extends DialogFragment public DownloadDialog(@NonNull final Context context, @NonNull final StreamInfo info) { this.currentInfo = info; + final List audioStreams = + getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP); + final List> groupedAudioStreams = + ListHelper.getGroupedAudioStreams(context, audioStreams); + this.wrappedAudioTracks = new AudioTracksWrapper(groupedAudioStreams, context); + this.selectedAudioStreamIndex = + ListHelper.getDefaultAudioTrackGroup(context, groupedAudioStreams); + // TODO: Adapt this code when the downloader support other types of stream deliveries final List videoStreams = ListHelper.getSortedStreamVideosList( context, getStreamsOfSpecifiedDelivery(info.getVideoStreams(), PROGRESSIVE_HTTP), getStreamsOfSpecifiedDelivery(info.getVideoOnlyStreams(), PROGRESSIVE_HTTP), false, - false + // If there are multiple languages available, prefer streams without audio + // to allow language selection + wrappedAudioTracks.size() > 1 ); this.wrappedVideoStreams = new StreamSizeWrapper<>(videoStreams, context); - this.wrappedAudioStreams = new StreamSizeWrapper<>( - getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP), context); this.wrappedSubtitleStreams = new StreamSizeWrapper<>( getStreamsOfSpecifiedDelivery(info.getSubtitles(), PROGRESSIVE_HTTP), context); @@ -212,33 +225,9 @@ public class DownloadDialog extends DialogFragment setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context)); Icepick.restoreInstanceState(this, savedInstanceState); - final var secondaryStreams = new SparseArrayCompat>(4); - final List videoStreams = wrappedVideoStreams.getStreamsList(); - - for (int i = 0; i < videoStreams.size(); i++) { - if (!videoStreams.get(i).isVideoOnly()) { - continue; - } - final AudioStream audioStream = SecondaryStreamHelper - .getAudioStreamFor(wrappedAudioStreams.getStreamsList(), videoStreams.get(i)); - - if (audioStream != null) { - secondaryStreams.append(i, new SecondaryStreamHelper<>(wrappedAudioStreams, - audioStream)); - } else if (DEBUG) { - final MediaFormat mediaFormat = videoStreams.get(i).getFormat(); - if (mediaFormat != null) { - Log.w(TAG, "No audio stream candidates for video format " - + mediaFormat.name()); - } else { - Log.w(TAG, "No audio stream candidates for unknown video format"); - } - } - } - - this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); - this.audioStreamsAdapter = new StreamItemAdapter<>(wrappedAudioStreams); + this.audioTrackAdapter = new AudioTrackAdapter(wrappedAudioTracks); this.subtitleStreamsAdapter = new StreamItemAdapter<>(wrappedSubtitleStreams); + updateSecondaryStreams(); final Intent intent = new Intent(context, DownloadManagerService.class); context.startService(intent); @@ -265,6 +254,38 @@ public class DownloadDialog extends DialogFragment }, Context.BIND_AUTO_CREATE); } + /** + * Update the displayed video streams based on the selected audio track. + */ + private void updateSecondaryStreams() { + final StreamSizeWrapper audioStreams = getWrappedAudioStreams(); + final var secondaryStreams = new SparseArrayCompat>(4); + final List videoStreams = wrappedVideoStreams.getStreamsList(); + + for (int i = 0; i < videoStreams.size(); i++) { + if (!videoStreams.get(i).isVideoOnly()) { + continue; + } + final AudioStream audioStream = SecondaryStreamHelper + .getAudioStreamFor(audioStreams.getStreamsList(), videoStreams.get(i)); + + if (audioStream != null) { + secondaryStreams.append(i, new SecondaryStreamHelper<>(audioStreams, audioStream)); + } else if (DEBUG) { + final MediaFormat mediaFormat = videoStreams.get(i).getFormat(); + if (mediaFormat != null) { + Log.w(TAG, "No audio stream candidates for video format " + + mediaFormat.name()); + } else { + Log.w(TAG, "No audio stream candidates for unknown video format"); + } + } + } + + this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); + this.audioStreamsAdapter = new StreamItemAdapter<>(audioStreams); + } + @Override public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, @@ -285,13 +306,13 @@ public class DownloadDialog extends DialogFragment dialogBinding.fileName.setText(FilenameUtils.createFilename(getContext(), currentInfo.getName())); - selectedAudioIndex = ListHelper - .getDefaultAudioFormat(getContext(), wrappedAudioStreams.getStreamsList()); + selectedAudioIndex = ListHelper.getDefaultAudioFormat(getContext(), + getWrappedAudioStreams().getStreamsList()); selectedSubtitleIndex = getSubtitleIndexBy(subtitleStreamsAdapter.getAll()); dialogBinding.qualitySpinner.setOnItemSelectedListener(this); - + dialogBinding.audioTrackSpinner.setOnItemSelectedListener(this); dialogBinding.videoAudioGroup.setOnCheckedChangeListener(this); initToolbar(dialogBinding.toolbarLayout.toolbar); @@ -383,7 +404,7 @@ public class DownloadDialog extends DialogFragment new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG, "Downloading video stream size", currentInfo.getServiceId())))); - disposables.add(StreamSizeWrapper.fetchSizeForWrapper(wrappedAudioStreams) + disposables.add(StreamSizeWrapper.fetchSizeForWrapper(getWrappedAudioStreams()) .subscribe(result -> { if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button) { @@ -405,14 +426,29 @@ public class DownloadDialog extends DialogFragment currentInfo.getServiceId())))); } + private void setupAudioTrackSpinner() { + if (getContext() == null) { + return; + } + + dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); + dialogBinding.audioTrackSpinner.setSelection(selectedAudioStreamIndex); + + dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); + dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); + } + private void setupAudioSpinner() { if (getContext() == null) { return; } - dialogBinding.qualitySpinner.setAdapter(audioStreamsAdapter); - dialogBinding.qualitySpinner.setSelection(selectedAudioIndex); + dialogBinding.qualitySpinner.setVisibility(View.GONE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); + dialogBinding.audioTrackSpinner.setVisibility( + wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); + dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); } private void setupVideoSpinner() { @@ -422,7 +458,21 @@ public class DownloadDialog extends DialogFragment dialogBinding.qualitySpinner.setAdapter(videoStreamsAdapter); dialogBinding.qualitySpinner.setSelection(selectedVideoIndex); + dialogBinding.qualitySpinner.setVisibility(View.VISIBLE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.GONE); + onVideoStreamSelected(); + } + + private void onVideoStreamSelected() { + final boolean isVideoOnly = videoStreamsAdapter.getItem(selectedVideoIndex).isVideoOnly(); + + dialogBinding.audioTrackSpinner.setVisibility( + isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); + dialogBinding.defaultAudioTrackPresentText.setVisibility( + !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE + + ); } private void setupSubtitleSpinner() { @@ -432,7 +482,11 @@ public class DownloadDialog extends DialogFragment dialogBinding.qualitySpinner.setAdapter(subtitleStreamsAdapter); dialogBinding.qualitySpinner.setSelection(selectedSubtitleIndex); + dialogBinding.qualitySpinner.setVisibility(View.VISIBLE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.GONE); + dialogBinding.audioTrackSpinner.setVisibility(View.GONE); + dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); } @@ -550,18 +604,27 @@ public class DownloadDialog extends DialogFragment + "parent = [" + parent + "], view = [" + view + "], " + "position = [" + position + "], id = [" + id + "]"); } - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.audio_button: + + switch (parent.getId()) { + case R.id.quality_spinner: + switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { + case R.id.video_button: + selectedVideoIndex = position; + onVideoStreamSelected(); + break; + case R.id.subtitle_button: + selectedSubtitleIndex = position; + break; + } + onItemSelectedSetFileName(); + break; + case R.id.audio_track_spinner: + selectedAudioStreamIndex = position; + updateSecondaryStreams(); + break; + case R.id.audio_stream_spinner: selectedAudioIndex = position; - break; - case R.id.video_button: - selectedVideoIndex = position; - break; - case R.id.subtitle_button: - selectedSubtitleIndex = position; - break; } - onItemSelectedSetFileName(); } private void onItemSelectedSetFileName() { @@ -607,6 +670,7 @@ public class DownloadDialog extends DialogFragment protected void setupDownloadOptions() { setRadioButtonsState(false); + setupAudioTrackSpinner(); final boolean isVideoStreamsAvailable = videoStreamsAdapter.getCount() > 0; final boolean isAudioStreamsAvailable = audioStreamsAdapter.getCount() > 0; @@ -657,6 +721,13 @@ public class DownloadDialog extends DialogFragment dialogBinding.subtitleButton.setEnabled(enabled); } + private StreamSizeWrapper getWrappedAudioStreams() { + if (selectedAudioStreamIndex < 0 || selectedAudioStreamIndex > wrappedAudioTracks.size()) { + return StreamSizeWrapper.empty(); + } + return wrappedAudioTracks.getTracksList().get(selectedAudioStreamIndex); + } + private int getSubtitleIndexBy(@NonNull final List streams) { final Localization preferredLocalization = NewPipe.getPreferredLocalization(); @@ -1013,7 +1084,6 @@ public class DownloadDialog extends DialogFragment psName = Postprocessing.ALGORITHM_WEBM_MUXER; } - psArgs = null; final long videoSize = wrappedVideoStreams.getSizeInBytes( (VideoStream) selectedStream); diff --git a/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java b/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java new file mode 100644 index 000000000..39a05acb3 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java @@ -0,0 +1,94 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * A list adapter for groups of {@link AudioStream}s (audio tracks). + */ +public class AudioTrackAdapter extends BaseAdapter { + private final AudioTracksWrapper tracksWrapper; + + public AudioTrackAdapter(final AudioTracksWrapper tracksWrapper) { + this.tracksWrapper = tracksWrapper; + } + + @Override + public int getCount() { + return tracksWrapper.size(); + } + + @Override + public List getItem(final int position) { + return tracksWrapper.getTracksList().get(position).getStreamsList(); + } + + @Override + public long getItemId(final int position) { + return position; + } + + @Override + public View getView(final int position, final View convertView, final ViewGroup parent) { + final var context = parent.getContext(); + final View view; + if (convertView == null) { + view = LayoutInflater.from(context).inflate( + R.layout.stream_quality_item, parent, false); + } else { + view = convertView; + } + + final ImageView woSoundIconView = view.findViewById(R.id.wo_sound_icon); + final TextView formatNameView = view.findViewById(R.id.stream_format_name); + final TextView qualityView = view.findViewById(R.id.stream_quality); + final TextView sizeView = view.findViewById(R.id.stream_size); + + final List streams = getItem(position); + final AudioStream stream = streams.get(0); + + woSoundIconView.setVisibility(View.GONE); + sizeView.setVisibility(View.VISIBLE); + + if (stream.getAudioTrackId() != null) { + formatNameView.setText(stream.getAudioTrackId()); + } + qualityView.setText(Localization.audioTrackName(context, stream)); + + return view; + } + + public static class AudioTracksWrapper implements Serializable { + private final List> tracksList; + + public AudioTracksWrapper(@NonNull final List> groupedAudioStreams, + @Nullable final Context context) { + this.tracksList = groupedAudioStreams.stream().map(streams -> + new StreamSizeWrapper<>(streams, context)).collect(Collectors.toList()); + } + + public List> getTracksList() { + return tracksList; + } + + public int size() { + return tracksList.size(); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 0164b708f..f8a800b0e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -111,6 +111,19 @@ public final class ListHelper { getAudioTrackComparator(context).thenComparing(getAudioFormatComparator(context))); } + public static int getDefaultAudioTrackGroup(final Context context, + final List> groupedAudioStreams) { + if (groupedAudioStreams == null || groupedAudioStreams.isEmpty()) { + return -1; + } + + final Comparator cmp = getAudioTrackComparator(context); + final List highestRanked = groupedAudioStreams.stream() + .max((o1, o2) -> cmp.compare(o1.get(0), o2.get(0))) + .orElse(null); + return groupedAudioStreams.indexOf(highestRanked); + } + public static int getAudioFormatIndex(final Context context, final List audioStreams, @Nullable final String trackId) { @@ -240,8 +253,50 @@ public final class ListHelper { } // Sort collected streams by name - return collectedStreams.values().stream().sorted(Comparator.comparing(audioStream -> - Localization.audioTrackName(context, audioStream))).collect(Collectors.toList()); + return collectedStreams.values().stream().sorted(getAudioTrackNameComparator(context)) + .collect(Collectors.toList()); + } + + /** + * Group the list of audioStreams by their track ID and sort the resulting list by track name. + * + * @param context app context to get track names for sorting + * @param audioStreams list of audio streams + * @return list of audio streams lists representing individual tracks + */ + public static List> getGroupedAudioStreams( + @NonNull final Context context, + @Nullable final List audioStreams) { + if (audioStreams == null) { + return Collections.emptyList(); + } + + final HashMap> collectedStreams = new HashMap<>(); + + for (final AudioStream stream : audioStreams) { + final String trackId = Objects.toString(stream.getAudioTrackId(), ""); + if (collectedStreams.containsKey(trackId)) { + collectedStreams.get(trackId).add(stream); + } else { + final List list = new ArrayList<>(); + list.add(stream); + collectedStreams.put(trackId, list); + } + } + + // Filter unknown audio tracks if there are multiple tracks + if (collectedStreams.size() > 1) { + collectedStreams.remove(""); + } + + // Sort tracks alphabetically, sort track streams by quality + final Comparator nameCmp = getAudioTrackNameComparator(context); + final Comparator formatCmp = getAudioFormatComparator(context); + + return collectedStreams.values().stream() + .sorted((o1, o2) -> nameCmp.compare(o1.get(0), o2.get(0))) + .map(streams -> streams.stream().sorted(formatCmp).collect(Collectors.toList())) + .collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -413,8 +468,8 @@ public final class ListHelper { * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. * - * @param audioStreams List of audio streams - * @param comparator The comparator used for determining the max/best/highest ranked value + * @param audioStreams List of audio streams + * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ static int getAudioIndexByHighestRank(@Nullable final List audioStreams, @@ -615,6 +670,9 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * + *

The prefered stream will be ordered last.

+ * * @param context app context * @return Comparator */ @@ -628,7 +686,9 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * - * @param defaultFormat the default format to look for + *

The prefered stream will be ordered last.

+ * + * @param defaultFormat the default format to look for * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ @@ -655,6 +715,21 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * + *

In this order:

+ *
    + *
  1. If {@code preferOriginalAudio}: is original audio
  2. + *
  3. Language matches {@code preferredLanguage}
  4. + *
  5. + * Track type ranks highest in this order: + * Original > Dubbed > Descriptive + *

    If {@code preferDescriptiveAudio}: + * Descriptive > Dubbed > Original

    + *
  6. + *
  7. Language is English
  8. + *
+ * + *

The prefered track will be ordered last.

+ * * @param context App context * @return Comparator */ @@ -677,8 +752,23 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * - * @param preferredLanguage Preferred audio stream language - * @param preferOriginalAudio Get the original audio track regardless of its language + *

In this order:

+ *
    + *
  1. If {@code preferOriginalAudio}: is original audio
  2. + *
  3. Language matches {@code preferredLanguage}
  4. + *
  5. + * Track type ranks highest in this order: + * Original > Dubbed > Descriptive + *

    If {@code preferDescriptiveAudio}: + * Descriptive > Dubbed > Original

    + *
  6. + *
  7. Language is English
  8. + *
+ * + *

The prefered track will be ordered last.

+ * + * @param preferredLanguage Preferred audio stream language + * @param preferOriginalAudio Get the original audio track regardless of its language * @param preferDescriptiveAudio Prefer the descriptive audio track if available * @return Comparator */ @@ -699,10 +789,26 @@ public final class ListHelper { Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals(langCode)))) .thenComparing(AudioStream::getAudioTrackType, - Comparator.nullsLast(Comparator.comparingInt(trackTypeRanking::indexOf))) + Comparator.nullsFirst(Comparator.comparingInt(trackTypeRanking::indexOf))) .thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals( Locale.ENGLISH.getISO3Language())))); } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their languages and track types + * for alphabetical sorting. + * + * @param context app context for localization + * @return Comparator + */ + private static Comparator getAudioTrackNameComparator( + @NonNull final Context context) { + final Locale appLoc = Localization.getAppLocale(context); + + return Comparator.comparing(AudioStream::getAudioLocale, Comparator.nullsLast( + Comparator.comparing(locale -> locale.getDisplayName(appLoc)))) + .thenComparing(AudioStream::getAudioTrackType); + } } diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml index 37bbf2b03..6b0a36cc8 100644 --- a/app/src/main/res/layout/download_dialog.xml +++ b/app/src/main/res/layout/download_dialog.xml @@ -71,11 +71,45 @@ android:minWidth="150dp" tools:listitem="@layout/stream_quality_item" /> + + + + + + ,
Toggle all Streams which are not yet supported by the downloader are not shown + The default audio track should be already present in this stream The selected stream is not supported by external players No audio streams are available for external players No video streams are available for external players From 694418d30dd3bedd817a56687096f892c0904db8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 21 Mar 2023 16:58:36 +0100 Subject: [PATCH 022/133] fix: update stream sizes when audio track changed --- .../org/schabi/newpipe/download/DownloadDialog.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 5d3679471..2295c3c7a 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -433,9 +433,6 @@ public class DownloadDialog extends DialogFragment dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); dialogBinding.audioTrackSpinner.setSelection(selectedAudioStreamIndex); - - dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); - dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); } private void setupAudioSpinner() { @@ -445,6 +442,8 @@ public class DownloadDialog extends DialogFragment dialogBinding.qualitySpinner.setVisibility(View.GONE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); + dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); dialogBinding.audioTrackSpinner.setVisibility( wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); @@ -619,8 +618,12 @@ public class DownloadDialog extends DialogFragment onItemSelectedSetFileName(); break; case R.id.audio_track_spinner: + final boolean trackChanged = selectedAudioStreamIndex != position; selectedAudioStreamIndex = position; - updateSecondaryStreams(); + if (trackChanged) { + updateSecondaryStreams(); + fetchStreamsSize(); + } break; case R.id.audio_stream_spinner: selectedAudioIndex = position; From 39a5c8bdfb08a9e5b60b479dbd9968efd331687a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 29 Mar 2023 13:39:29 +0200 Subject: [PATCH 023/133] fix: reset video stream sizes on audio track selection --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 1 + .../java/org/schabi/newpipe/util/StreamItemAdapter.java | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 2295c3c7a..7dd482b21 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -261,6 +261,7 @@ public class DownloadDialog extends DialogFragment final StreamSizeWrapper audioStreams = getWrappedAudioStreams(); final var secondaryStreams = new SparseArrayCompat>(4); final List videoStreams = wrappedVideoStreams.getStreamsList(); + wrappedVideoStreams.resetSizes(); for (int i = 0; i < videoStreams.size(); i++) { if (!videoStreams.get(i).isVideoOnly()) { diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java index 74de45720..4bcdfd02a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -235,7 +235,7 @@ public class StreamItemAdapter extends BaseA this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content); - Arrays.fill(streamSizes, -2); + resetSizes(); } /** @@ -269,6 +269,10 @@ public class StreamItemAdapter extends BaseA .onErrorReturnItem(true); } + public void resetSizes() { + Arrays.fill(streamSizes, -2); + } + public static StreamSizeWrapper empty() { //noinspection unchecked return (StreamSizeWrapper) EMPTY; From 3c74cb3439bd64f7ac92add78e0492e04afaa334 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 20 Jan 2023 16:35:47 +0100 Subject: [PATCH 024/133] Created a setting to switch the sides of volume and brightness --- .../gesture/MainPlayerGestureListener.kt | 13 +++++++++--- .../settings/VideoAudioSettingsFragment.java | 20 +++++++++++++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/video_audio_settings.xml | 8 ++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index a6dba0dd5..75a27896d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.math.MathUtils import androidx.core.view.isVisible +import androidx.preference.PreferenceManager import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.AnimationType @@ -193,10 +194,16 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) + var isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) + var isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) + var displaySide = DisplayPortion.LEFT_HALF + val sidesSwitched = PreferenceManager.getDefaultSharedPreferences(player.context) + .getBoolean(R.string.switch_gesture_sides_key.toString(), false) + if (sidesSwitched) { + displaySide = DisplayPortion.RIGHT_HALF + } if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === DisplayPortion.LEFT_HALF) { + if (getDisplayHalfPortion(initialEvent) === displaySide) { onScrollBrightness(distanceY) } else /* DisplayPortion.RIGHT_HALF */ { onScrollVolume(distanceY) diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index aae9cfca5..4936f979b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -6,8 +6,11 @@ import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.text.format.DateUtils; +import android.view.View; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.ListPreference; import com.google.android.material.snackbar.Snackbar; @@ -21,6 +24,17 @@ import java.util.List; public class VideoAudioSettingsFragment extends BasePreferenceFragment { private SharedPreferences.OnSharedPreferenceChangeListener listener; + @Override + public void onViewCreated(@NonNull final View rootView, + @Nullable final Bundle savedInstanceState) { + super.onViewCreated(rootView, savedInstanceState); + findPreference(getString(R.string.switch_gesture_sides_key)) + .setEnabled(getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.volume_gesture_control_key), true) + && getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.brightness_gesture_control_key), true)); + } + @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { addPreferencesFromResourceRegistry(); @@ -29,6 +43,12 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { listener = (sharedPreferences, key) -> { + findPreference(getString(R.string.switch_gesture_sides_key)) + .setEnabled(sharedPreferences.getBoolean( + getString(R.string.volume_gesture_control_key), true) + && sharedPreferences.getBoolean( + getString(R.string.brightness_gesture_control_key), true)); + // on M and above, if user chooses to minimise to popup player on exit // and the app doesn't have display over other apps permission, // show a snackbar to let the user give permission diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 6a1d5cd45..dae8cc113 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -18,6 +18,7 @@ volume_gesture_control brightness_gesture_control + switch_gesture_sides resume_on_audio_focus_gain popup_remember_size_pos_key use_inexact_seek_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd8b8a58d..67acdcf0c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,8 @@ Use gestures to control player volume Brightness gesture control Use gestures to control player brightness + Switch gesture sides + Switches the sides of the volume and brightness gesture controls Search suggestions Choose the suggestions to show when searching Local search suggestions diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 117ee8703..da932bb38 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -190,6 +190,14 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + Date: Fri, 20 Jan 2023 22:48:10 +0100 Subject: [PATCH 025/133] Update app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt Co-authored-by: Stypox --- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 75a27896d..d6dc37e95 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -196,12 +196,9 @@ class MainPlayerGestureListener( // -- Brightness and Volume control -- var isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) var isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) - var displaySide = DisplayPortion.LEFT_HALF - val sidesSwitched = PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean(R.string.switch_gesture_sides_key.toString(), false) - if (sidesSwitched) { - displaySide = DisplayPortion.RIGHT_HALF - } + val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) + .getBoolean(R.string.switch_gesture_sides_key.toString(), false)) DisplayPortion.RIGHT_HALF + else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { if (getDisplayHalfPortion(initialEvent) === displaySide) { onScrollBrightness(distanceY) From c8d54ec6c77d172bf51dc5d6988aee953375bc6e Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 20 Jan 2023 23:10:55 +0100 Subject: [PATCH 026/133] Changed to val --- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index d6dc37e95..3c40f714e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -194,13 +194,13 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - var isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - var isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) + val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) + val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) .getBoolean(R.string.switch_gesture_sides_key.toString(), false)) DisplayPortion.RIGHT_HALF else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === displaySide) { + if (getDisplayHalfPortion(initialEvent) === brightnessSide) { onScrollBrightness(distanceY) } else /* DisplayPortion.RIGHT_HALF */ { onScrollVolume(distanceY) From 2ba649949fbb6968706dfa5e3058ad7a4fbfcf7e Mon Sep 17 00:00:00 2001 From: ge78fug Date: Sat, 21 Jan 2023 17:11:45 +0100 Subject: [PATCH 027/133] Updated the gesture-switch-toggle --- .../gesture/MainPlayerGestureListener.kt | 5 ++- .../settings/VideoAudioSettingsFragment.java | 40 +++++++++---------- app/src/main/res/values/strings.xml | 1 + 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 3c40f714e..960edbce2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -197,8 +197,9 @@ class MainPlayerGestureListener( val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean(R.string.switch_gesture_sides_key.toString(), false)) DisplayPortion.RIGHT_HALF - else DisplayPortion.LEFT_HALF + .getBoolean(R.string.switch_gesture_sides_key.toString(), false) + ) DisplayPortion.RIGHT_HALF + else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { if (getDisplayHalfPortion(initialEvent) === brightnessSide) { onScrollBrightness(distanceY) diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index 4936f979b..e1a8dd90b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -6,12 +6,10 @@ import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.text.format.DateUtils; -import android.view.View; import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.preference.ListPreference; +import androidx.preference.SwitchPreferenceCompat; import com.google.android.material.snackbar.Snackbar; @@ -24,31 +22,15 @@ import java.util.List; public class VideoAudioSettingsFragment extends BasePreferenceFragment { private SharedPreferences.OnSharedPreferenceChangeListener listener; - @Override - public void onViewCreated(@NonNull final View rootView, - @Nullable final Bundle savedInstanceState) { - super.onViewCreated(rootView, savedInstanceState); - findPreference(getString(R.string.switch_gesture_sides_key)) - .setEnabled(getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.volume_gesture_control_key), true) - && getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.brightness_gesture_control_key), true)); - } - @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { addPreferencesFromResourceRegistry(); updateSeekOptions(); + updateGestureSwitch(); listener = (sharedPreferences, key) -> { - findPreference(getString(R.string.switch_gesture_sides_key)) - .setEnabled(sharedPreferences.getBoolean( - getString(R.string.volume_gesture_control_key), true) - && sharedPreferences.getBoolean( - getString(R.string.brightness_gesture_control_key), true)); - // on M and above, if user chooses to minimise to popup player on exit // and the app doesn't have display over other apps permission, // show a snackbar to let the user give permission @@ -68,6 +50,9 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { } } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); + } else if (getString(R.string.volume_gesture_control_key).equals(key) + || getString(R.string.brightness_gesture_control_key).equals(key)) { + updateGestureSwitch(); } }; } @@ -137,4 +122,19 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { getPreferenceManager().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(listener); } + + private void updateGestureSwitch() { + final SwitchPreferenceCompat gestureSwitch = (SwitchPreferenceCompat) + findPreference(getString(R.string.switch_gesture_sides_key)); + if (getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.volume_gesture_control_key), true) + && getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.brightness_gesture_control_key), true)) { + gestureSwitch.setEnabled(true); + gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary)); + } else { + gestureSwitch.setEnabled(false); + gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary_disabled)); + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67acdcf0c..e1c5bc0bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,6 +107,7 @@ Use gestures to control player brightness Switch gesture sides Switches the sides of the volume and brightness gesture controls + Enable both brightness and volume gestures to use this feature Search suggestions Choose the suggestions to show when searching Local search suggestions From 759a9080a8af28b52f56eda187faca5bb69c15fd Mon Sep 17 00:00:00 2001 From: ge78fug Date: Mon, 23 Jan 2023 21:25:05 +0100 Subject: [PATCH 028/133] Fixed a bug --- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 960edbce2..74542af70 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -197,11 +197,12 @@ class MainPlayerGestureListener( val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean(R.string.switch_gesture_sides_key.toString(), false) - ) DisplayPortion.RIGHT_HALF + .getBoolean( + player.context.getString(R.string.switch_gesture_sides_key), false)) + DisplayPortion.RIGHT_HALF else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === brightnessSide) { + if (getDisplayHalfPortion(initialEvent) == brightnessSide) { onScrollBrightness(distanceY) } else /* DisplayPortion.RIGHT_HALF */ { onScrollVolume(distanceY) From 2ded8c7cc18b7414d244e0e559acd3a1e9d7259f Mon Sep 17 00:00:00 2001 From: ge78fug Date: Sun, 29 Jan 2023 19:23:39 +0100 Subject: [PATCH 029/133] Made two list options --- .../fragments/detail/VideoDetailFragment.java | 5 ++- .../gesture/MainPlayerGestureListener.kt | 33 +++++++++-------- .../newpipe/player/helper/PlayerHelper.java | 10 +++--- .../settings/VideoAudioSettingsFragment.java | 20 ----------- app/src/main/res/values/settings_keys.xml | 35 +++++++++++++++++-- app/src/main/res/values/strings.xml | 14 ++++---- app/src/main/res/xml/video_audio_settings.xml | 32 ++++++++--------- 7 files changed, 79 insertions(+), 70 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 3d59ac6fe..885034e5a 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 @@ -2013,7 +2013,10 @@ public final class VideoDetailFragment restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (!PlayerHelper.isBrightnessGestureEnabled(activity)) { + if (!(PlayerHelper.getRightSideGesture(activity) + .equals(getString(R.string.right_brightness_control_key)) + && PlayerHelper.getLeftSideGesture(activity) + .equals(getString(R.string.left_brightness_control_key)))) { return; } // Restore already saved brightness level diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 74542af70..82cf2244c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -9,7 +9,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.math.MathUtils import androidx.core.view.isVisible -import androidx.preference.PreferenceManager import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.AnimationType @@ -194,23 +193,23 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) - val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean( - player.context.getString(R.string.switch_gesture_sides_key), false)) - DisplayPortion.RIGHT_HALF - else DisplayPortion.LEFT_HALF - if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) == brightnessSide) { - onScrollBrightness(distanceY) - } else /* DisplayPortion.RIGHT_HALF */ { - onScrollVolume(distanceY) + val rightSide = PlayerHelper.getRightSideGesture(player.context) + val leftSide = PlayerHelper.getLeftSideGesture(player.context) + + if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { + when (rightSide) { + player.context.getString(R.string.right_volume_control_key) -> + onScrollVolume(distanceY) + player.context.getString(R.string.right_brightness_control_key) -> + onScrollBrightness(distanceY) + } + } else { + when (leftSide) { + player.context.getString(R.string.left_volume_control_key) -> + onScrollVolume(distanceY) + player.context.getString(R.string.left_brightness_control_key) -> + onScrollBrightness(distanceY) } - } else if (isBrightnessGestureEnabled) { - onScrollBrightness(distanceY) - } else if (isVolumeGestureEnabled) { - onScrollVolume(distanceY) } return true diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 1bc6f41a1..74bcf047c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -228,14 +228,16 @@ public final class PlayerHelper { .getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), false); } - public static boolean isVolumeGestureEnabled(@NonNull final Context context) { + public static String getRightSideGesture(@NonNull final Context context) { return getPreferences(context) - .getBoolean(context.getString(R.string.volume_gesture_control_key), true); + .getString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.default_right_gesture_control_value)); } - public static boolean isBrightnessGestureEnabled(@NonNull final Context context) { + public static String getLeftSideGesture(@NonNull final Context context) { return getPreferences(context) - .getBoolean(context.getString(R.string.brightness_gesture_control_key), true); + .getString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.default_left_gesture_control_value)); } public static boolean isStartMainPlayerFullscreenEnabled(@NonNull final Context context) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index e1a8dd90b..aae9cfca5 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -9,7 +9,6 @@ import android.text.format.DateUtils; import android.widget.Toast; import androidx.preference.ListPreference; -import androidx.preference.SwitchPreferenceCompat; import com.google.android.material.snackbar.Snackbar; @@ -27,7 +26,6 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { addPreferencesFromResourceRegistry(); updateSeekOptions(); - updateGestureSwitch(); listener = (sharedPreferences, key) -> { @@ -50,9 +48,6 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { } } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); - } else if (getString(R.string.volume_gesture_control_key).equals(key) - || getString(R.string.brightness_gesture_control_key).equals(key)) { - updateGestureSwitch(); } }; } @@ -122,19 +117,4 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { getPreferenceManager().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(listener); } - - private void updateGestureSwitch() { - final SwitchPreferenceCompat gestureSwitch = (SwitchPreferenceCompat) - findPreference(getString(R.string.switch_gesture_sides_key)); - if (getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.volume_gesture_control_key), true) - && getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.brightness_gesture_control_key), true)) { - gestureSwitch.setEnabled(true); - gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary)); - } else { - gestureSwitch.setEnabled(false); - gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary_disabled)); - } - } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index dae8cc113..ad6b1777b 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -16,9 +16,6 @@ use_external_video_player use_external_audio_player - volume_gesture_control - brightness_gesture_control - switch_gesture_sides resume_on_audio_focus_gain popup_remember_size_pos_key use_inexact_seek_key @@ -193,6 +190,38 @@ @string/audio_webm_key + left_gesture_control + @string/left_brightness_control_key + left_brightness_control + left_volume_control + left_none_control + + @string/brightness + @string/volume + @string/none + + + @string/left_brightness_control_key + @string/left_volume_control_key + @string/left_none_control_key + + + right_gesture_control + @string/right_volume_control_key + right_brightness_control + right_volume_control + right_none_control + + @string/volume + @string/brightness + @string/none + + + @string/right_volume_control_key + @string/right_brightness_control_key + @string/right_none_control_key + + last_resize_mode diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1c5bc0bb..6890e4dd0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,13 +101,13 @@ Auto-enqueue next stream Continue ending (non-repeating) playback queue by appending a related stream Auto-enqueuing - Volume gesture control - Use gestures to control player volume - Brightness gesture control - Use gestures to control player brightness - Switch gesture sides - Switches the sides of the volume and brightness gesture controls - Enable both brightness and volume gestures to use this feature + Change the left gesture control + Left gesture control + Change the right gesture control + Right gesture control + Brightness + Volume + None Search suggestions Choose the suggestions to show when searching Local search suggestions diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index da932bb38..e4485f154 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -174,27 +174,23 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - - - From 72ca52a29b403961c43ac3e53491b3c1641af159 Mon Sep 17 00:00:00 2001 From: Marius Wagner Date: Tue, 7 Feb 2023 17:10:18 +0000 Subject: [PATCH 030/133] Made the requested changes --- .../fragments/detail/VideoDetailFragment.java | 8 +++--- .../gesture/MainPlayerGestureListener.kt | 8 +++--- app/src/main/res/values/settings_keys.xml | 25 ++++++++----------- 3 files changed, 19 insertions(+), 22 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 885034e5a..e63e549a2 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 @@ -2013,10 +2013,10 @@ public final class VideoDetailFragment restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (!(PlayerHelper.getRightSideGesture(activity) - .equals(getString(R.string.right_brightness_control_key)) - && PlayerHelper.getLeftSideGesture(activity) - .equals(getString(R.string.left_brightness_control_key)))) { + if (PlayerHelper.getRightSideGesture(activity) + .equals(getString(R.string.brightness_control_key)) + || PlayerHelper.getLeftSideGesture(activity) + .equals(getString(R.string.brightness_control_key))) { return; } // Restore already saved brightness level diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 82cf2244c..ce78fcfe2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -198,16 +198,16 @@ class MainPlayerGestureListener( if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { when (rightSide) { - player.context.getString(R.string.right_volume_control_key) -> + player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) - player.context.getString(R.string.right_brightness_control_key) -> + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } } else { when (leftSide) { - player.context.getString(R.string.left_volume_control_key) -> + player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) - player.context.getString(R.string.left_brightness_control_key) -> + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index ad6b1777b..8f3e8e192 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -191,35 +191,32 @@ left_gesture_control - @string/left_brightness_control_key - left_brightness_control - left_volume_control - left_none_control + @string/brightness_control_key + brightness_control + volume_control + none_control @string/brightness @string/volume @string/none - @string/left_brightness_control_key - @string/left_volume_control_key - @string/left_none_control_key + @string/brightness_control_key + @string/volume_control_key + @string/none_control_key right_gesture_control - @string/right_volume_control_key - right_brightness_control - right_volume_control - right_none_control + @string/volume_control_key @string/volume @string/brightness @string/none - @string/right_volume_control_key - @string/right_brightness_control_key - @string/right_none_control_key + @string/volume_control_key + @string/brightness_control_key + @string/none_control_key last_resize_mode From 32cec6c9a74efd65b58ebf504c646bb61a222961 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Tue, 7 Feb 2023 19:08:47 +0100 Subject: [PATCH 031/133] Changed the naming --- .../newpipe/fragments/detail/VideoDetailFragment.java | 4 ++-- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 7 ++----- .../org/schabi/newpipe/player/helper/PlayerHelper.java | 4 ++-- 3 files changed, 6 insertions(+), 9 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 e63e549a2..7654e7689 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 @@ -2013,9 +2013,9 @@ public final class VideoDetailFragment restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (PlayerHelper.getRightSideGesture(activity) + if (PlayerHelper.getActionForRightGestureSide(activity) .equals(getString(R.string.brightness_control_key)) - || PlayerHelper.getLeftSideGesture(activity) + || PlayerHelper.getActionForLeftGestureSide(activity) .equals(getString(R.string.brightness_control_key))) { return; } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index ce78fcfe2..0d28f2f58 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -193,18 +193,15 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val rightSide = PlayerHelper.getRightSideGesture(player.context) - val leftSide = PlayerHelper.getLeftSideGesture(player.context) - if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { - when (rightSide) { + when (PlayerHelper.getActionForRightGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } } else { - when (leftSide) { + when (PlayerHelper.getActionForLeftGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) player.context.getString(R.string.brightness_control_key) -> diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 74bcf047c..a110a80d6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -228,13 +228,13 @@ public final class PlayerHelper { .getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), false); } - public static String getRightSideGesture(@NonNull final Context context) { + public static String getActionForRightGestureSide(@NonNull final Context context) { return getPreferences(context) .getString(context.getString(R.string.right_gesture_control_key), context.getString(R.string.default_right_gesture_control_value)); } - public static String getLeftSideGesture(@NonNull final Context context) { + public static String getActionForLeftGestureSide(@NonNull final Context context) { return getPreferences(context) .getString(context.getString(R.string.left_gesture_control_key), context.getString(R.string.default_left_gesture_control_value)); From 65d8589e7a40c1d2d5fdbf66a4096e4de7030c15 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 10 Feb 2023 08:41:54 +0100 Subject: [PATCH 032/133] Changed the naming --- app/src/main/res/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6890e4dd0..43705056b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,10 +101,10 @@ Auto-enqueue next stream Continue ending (non-repeating) playback queue by appending a related stream Auto-enqueuing - Change the left gesture control - Left gesture control - Change the right gesture control - Right gesture control + Choose gesture for left half of player screen + Left gesture action + Choose gesture for right half of player screen + Right gesture action Brightness Volume None From 7689d1d15cb26ef31193aef4cf0b02f59db13374 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Wed, 1 Mar 2023 23:22:30 +0100 Subject: [PATCH 033/133] Added the migration --- .../newpipe/settings/SettingMigrations.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index b1e2c04eb..21c0e1be4 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -108,6 +108,39 @@ public final class SettingMigrations { } }; + public static final Migration MIGRATION_4_5 = new Migration(4, 5) { + @Override + protected void migrate(final Context context) { + boolean brightnessGestureSwitch = sp.getBoolean( + context.getString(R.string.left_gesture_control_key), false); + boolean volumeGestureSwitch = sp.getBoolean( + context.getString(R.string.right_gesture_control_key), false); + + SharedPreferences.Editor editor = sp.edit(); + + if (volumeGestureSwitch) { + if (!brightnessGestureSwitch) { + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.brightness)); + } + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.volume)); + } else if (brightnessGestureSwitch) { + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.brightness)); + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.volume)); + } else { + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.none)); + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.none)); + } + + editor.apply(); + } + }; + /** * List of all implemented migrations. *

@@ -119,12 +152,13 @@ public final class SettingMigrations { MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, + MIGRATION_4_5, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - public static final int VERSION = 4; + public static final int VERSION = 5; public static void initMigrations(final Context context, final boolean isFirstRun) { From 3c72992c395fc1053c821ed8069bfedf40449ad3 Mon Sep 17 00:00:00 2001 From: Marius Wagner Date: Sun, 26 Feb 2023 17:00:06 +0100 Subject: [PATCH 034/133] Update app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java Co-authored-by: Stypox --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 4 ++-- 1 file changed, 2 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 7654e7689..0950afc3e 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 @@ -2013,9 +2013,9 @@ public final class VideoDetailFragment restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (PlayerHelper.getActionForRightGestureSide(activity) + if (!PlayerHelper.getActionForRightGestureSide(activity) .equals(getString(R.string.brightness_control_key)) - || PlayerHelper.getActionForLeftGestureSide(activity) + && !PlayerHelper.getActionForLeftGestureSide(activity) .equals(getString(R.string.brightness_control_key))) { return; } From d2735607b84a5fbe442302ec9464161faed5daa1 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Mon, 3 Apr 2023 23:11:40 +0200 Subject: [PATCH 035/133] Changed the default of the switches --- .../java/org/schabi/newpipe/settings/SettingMigrations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index 21c0e1be4..e2bb18b2d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -112,9 +112,9 @@ public final class SettingMigrations { @Override protected void migrate(final Context context) { boolean brightnessGestureSwitch = sp.getBoolean( - context.getString(R.string.left_gesture_control_key), false); + context.getString(R.string.left_gesture_control_key), true); boolean volumeGestureSwitch = sp.getBoolean( - context.getString(R.string.right_gesture_control_key), false); + context.getString(R.string.right_gesture_control_key), true); SharedPreferences.Editor editor = sp.edit(); From 704e9bd7b6e4d58d10b0cce349cd3f8a13e46b85 Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 10:02:01 +0200 Subject: [PATCH 036/133] Fix checkstyle --- .../java/org/schabi/newpipe/settings/SettingMigrations.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index e2bb18b2d..818d587d5 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -111,12 +111,12 @@ public final class SettingMigrations { public static final Migration MIGRATION_4_5 = new Migration(4, 5) { @Override protected void migrate(final Context context) { - boolean brightnessGestureSwitch = sp.getBoolean( + final boolean brightnessGestureSwitch = sp.getBoolean( context.getString(R.string.left_gesture_control_key), true); - boolean volumeGestureSwitch = sp.getBoolean( + final boolean volumeGestureSwitch = sp.getBoolean( context.getString(R.string.right_gesture_control_key), true); - SharedPreferences.Editor editor = sp.edit(); + final SharedPreferences.Editor editor = sp.edit(); if (volumeGestureSwitch) { if (!brightnessGestureSwitch) { From 7350b1f32ecd4d571d601036b46b84240658c1ab Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 10:38:13 +0200 Subject: [PATCH 037/133] Add notice to README to not open feature PRs --- .github/CONTRIBUTING.md | 2 ++ README.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d5fdc97e0..088707b6e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,3 +1,5 @@ +### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! + NewPipe contribution guidelines =============================== diff --git a/README.md b/README.md index 52e6eef1a..f184b5360 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! +

NewPipe

A libre lightweight streaming front-end for Android.

From 4bb45c001de54d9734f7e3e1c7fbed75744b9c3e Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 10:27:43 +0200 Subject: [PATCH 038/133] Fix settings migration --- .../newpipe/settings/SettingMigrations.java | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index 818d587d5..1bfaec6c2 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -111,31 +111,17 @@ public final class SettingMigrations { public static final Migration MIGRATION_4_5 = new Migration(4, 5) { @Override protected void migrate(final Context context) { - final boolean brightnessGestureSwitch = sp.getBoolean( - context.getString(R.string.left_gesture_control_key), true); - final boolean volumeGestureSwitch = sp.getBoolean( - context.getString(R.string.right_gesture_control_key), true); + final boolean brightness = sp.getBoolean("brightness_gesture_control", true); + final boolean volume = sp.getBoolean("volume_gesture_control", true); final SharedPreferences.Editor editor = sp.edit(); - if (volumeGestureSwitch) { - if (!brightnessGestureSwitch) { - editor.putString(context.getString(R.string.left_gesture_control_key), - context.getString(R.string.brightness)); - } - editor.putString(context.getString(R.string.right_gesture_control_key), - context.getString(R.string.volume)); - } else if (brightnessGestureSwitch) { - editor.putString(context.getString(R.string.right_gesture_control_key), - context.getString(R.string.brightness)); - editor.putString(context.getString(R.string.left_gesture_control_key), - context.getString(R.string.volume)); - } else { - editor.putString(context.getString(R.string.left_gesture_control_key), - context.getString(R.string.none)); - editor.putString(context.getString(R.string.right_gesture_control_key), - context.getString(R.string.none)); - } + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(volume + ? R.string.volume_control_key : R.string.none_control_key)); + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(brightness + ? R.string.brightness_control_key : R.string.none_control_key)); editor.apply(); } From c08538d25dbe9f4cf005558ef0aa5c2d20144fc4 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 4 Apr 2023 17:42:34 +0200 Subject: [PATCH 039/133] Remove jsoup files from APK Two jsoup files slipped into the META-INF dir of the APK for some reason. README.md and CHANGES are removed automatically now. --- app/build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index a2617aa58..6662b3846 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,6 +96,13 @@ android { buildFeatures { viewBinding true } + + packagingOptions { + // remove two files which belong to jsoup + // no idea how they ended up in the META-INF dir... + exclude 'META-INF/README.md' + exclude 'META-INF/CHANGES' + } } ext { @@ -313,6 +320,7 @@ static String getGitWorkingBranch() { } } +// fix reproducible builds project.afterEvaluate { tasks.compileReleaseArtProfile.doLast { outputs.files.each { file -> From 74bd28cbd9fff4e294b7ede63f09d946084ac804 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 9 Apr 2023 18:45:57 +0530 Subject: [PATCH 040/133] Update AndroidX Core to 1.10.0. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a2617aa58..5e3e5cbcb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -205,7 +205,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.documentfile:documentfile:1.0.1' implementation 'androidx.fragment:fragment-ktx:1.4.1' implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}" From a4a9957a155ddb2564b6381002a759acb7a1ce61 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 18 Aug 2022 18:35:22 +0200 Subject: [PATCH 041/133] Add ExoPlayerSettingsFragment and move playback load interval size setting into it This fragment has been added into SettingsResourceRegistry, to allow searches in its options. It has been placed at the place of the previous playback load interval size setting (so in Video and Audio settings). --- .../settings/ExoPlayerSettingsFragment.java | 14 ++++++++++++++ .../settings/SettingsResourceRegistry.java | 1 + app/src/main/res/values/settings_keys.xml | 2 ++ app/src/main/res/values/strings.xml | 4 ++++ app/src/main/res/xml/exoplayer_settings.xml | 16 ++++++++++++++++ app/src/main/res/xml/video_audio_settings.xml | 12 +++++------- 6 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java create mode 100644 app/src/main/res/xml/exoplayer_settings.xml diff --git a/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java new file mode 100644 index 000000000..7e740f869 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java @@ -0,0 +1,14 @@ +package org.schabi.newpipe.settings; + +import android.os.Bundle; + +import androidx.annotation.Nullable; + +public class ExoPlayerSettingsFragment extends BasePreferenceFragment { + + @Override + public void onCreatePreferences(@Nullable final Bundle savedInstanceState, + @Nullable final String rootKey) { + addPreferencesFromResourceRegistry(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java index 78ddb3786..b3d0741bb 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java @@ -40,6 +40,7 @@ public final class SettingsResourceRegistry { add(PlayerNotificationSettingsFragment.class, R.xml.player_notification_settings); add(UpdateSettingsFragment.class, R.xml.update_settings); add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings); + add(ExoPlayerSettingsFragment.class, R.xml.exoplayer_settings); } private SettingRegistryEntry add( diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 8f3e8e192..f00c25c8c 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1366,4 +1366,6 @@ streams_notifications_channels player_notification_screen + + exoplayer_settings_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43705056b..1dad7c01d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -773,4 +773,8 @@ Partially watched Upcoming Sort + ExoPlayer settings + Manage some ExoPlayer settings. These changes require a player restart to take effect + Use ExoPlayer\'s decoder fallback feature + Enable this option if you have decoder initialization issues, which falls back to lower-priority decoders if primary decoders initialization fail. This may result in poor playback performance than when using primary decoders \ No newline at end of file diff --git a/app/src/main/res/xml/exoplayer_settings.xml b/app/src/main/res/xml/exoplayer_settings.xml new file mode 100644 index 000000000..fd5637115 --- /dev/null +++ b/app/src/main/res/xml/exoplayer_settings.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index e4485f154..75a925c65 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -61,13 +61,11 @@ app:iconSpaceReserved="false" app:useSimpleSummaryProvider="true" /> - From 41da8fc05faf744f7e9a57a1a6adf2225be6cfd4 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 18 Aug 2022 18:59:45 +0200 Subject: [PATCH 042/133] Add ability to use ExoPlayer's decoder fallback option This option could help to avoid decoder initialization issues, which falls back to lower-priority decoders if decoder initialization fails. This may result in poor playback performance than when using primary decoders. It is disabled by default, but can be enabled in ExoPlayer settings. --- app/src/main/java/org/schabi/newpipe/player/Player.java | 4 +++- app/src/main/res/values/settings_keys.xml | 2 ++ app/src/main/res/xml/exoplayer_settings.xml | 8 ++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) 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 4243c233b..cc75a2c22 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -263,7 +263,9 @@ public final class Player implements PlaybackListener, Listener { final PlayerDataSource dataSource = new PlayerDataSource(context, new DefaultBandwidthMeter.Builder(context).build()); loadController = new LoadController(); - renderFactory = new DefaultRenderersFactory(context); + renderFactory = new DefaultRenderersFactory(context) + .setEnableDecoderFallback(prefs.getBoolean( + context.getString(R.string.use_exoplayer_decoder_fallback_key), false)); videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f00c25c8c..7d8c48bda 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1367,5 +1367,7 @@ streams_notifications_channels player_notification_screen + exoplayer_settings_key + use_exoplayer_decoder_fallback_key diff --git a/app/src/main/res/xml/exoplayer_settings.xml b/app/src/main/res/xml/exoplayer_settings.xml index fd5637115..f5314182e 100644 --- a/app/src/main/res/xml/exoplayer_settings.xml +++ b/app/src/main/res/xml/exoplayer_settings.xml @@ -13,4 +13,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + \ No newline at end of file From a6ff85a208ec174f48ea31f4487c66d490a1ae1c Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 18 Aug 2022 19:21:29 +0200 Subject: [PATCH 043/133] Move media tunneling setting to ExoPlayer settings and make this setting available on release builds Media tunneling may be not supported by more devices than the ones we whitelisted before. As a matter of fact, the list of devices on which media tunneling is disabled could be not maintainable in the future, especially if the list of devices grows more and more. A preferable solution is to allow users to configure this setting themselves, allowing them to not wait for their device(s) to be whitelisted in a future NewPipe update. This solution has been applied in this commit and works on every build type. The corresponding preference in the debug settings has been of course removed and the code used to prevent media tunneling activation on specific devices has been removed. --- .../org/schabi/newpipe/player/Player.java | 11 ++------ .../org/schabi/newpipe/util/DeviceUtils.java | 28 ------------------- app/src/main/res/values/settings_keys.xml | 2 +- app/src/main/res/xml/debug_settings.xml | 8 ------ app/src/main/res/xml/exoplayer_settings.xml | 8 ++++++ 5 files changed, 11 insertions(+), 46 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 cc75a2c22..5dc9382e7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -77,7 +77,6 @@ import com.google.android.exoplayer2.text.CueGroup; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; @@ -115,7 +114,6 @@ import org.schabi.newpipe.player.ui.PlayerUiList; import org.schabi.newpipe.player.ui.PopupPlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.DependentPreferenceHelper; -import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PicassoHelper; @@ -522,16 +520,11 @@ public final class Player implements PlaybackListener, Listener { // Setup UIs UIs.call(PlayerUi::initPlayer); - // enable media tunneling - if (DEBUG && PreferenceManager.getDefaultSharedPreferences(context) + // Disable media tunneling if requested by the user from ExoPlayer settings + if (!PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.disable_media_tunneling_key), false)) { - Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] " - + "media tunneling disabled in debug preferences"); - } else if (DeviceUtils.shouldSupportMediaTunneling()) { trackSelector.setParameters(trackSelector.buildUponParameters() .setTunnelingEnabled(true)); - } else if (DEBUG) { - Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] does not support media tunneling"); } } //endregion diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 4b08cfcb5..f656c6144 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -36,22 +36,6 @@ public final class DeviceUtils { private static Boolean isTV = null; private static Boolean isFireTV = null; - /* - * Devices that do not support media tunneling - */ - // Formuler Z8 Pro, Z8, CC, Z Alpha, Z+ Neo - private static final boolean HI3798MV200 = Build.VERSION.SDK_INT == 24 - && Build.DEVICE.equals("Hi3798MV200"); - // Zephir TS43UHD-2 - private static final boolean CVT_MT5886_EU_1G = Build.VERSION.SDK_INT == 24 - && Build.DEVICE.equals("cvt_mt5886_eu_1g"); - // Hilife TV - private static final boolean REALTEKATV = Build.VERSION.SDK_INT == 25 - && Build.DEVICE.equals("RealtekATV"); - // Philips QM16XE - private static final boolean QM16XE_U = Build.VERSION.SDK_INT == 23 - && Build.DEVICE.equals("QM16XE_U"); - private DeviceUtils() { } @@ -211,18 +195,6 @@ public final class DeviceUtils { context.getResources().getDisplayMetrics()); } - /** - * Some devices have broken tunneled video playback but claim to support it. - * See https://github.com/TeamNewPipe/NewPipe/issues/5911 - * @return false if affected device - */ - public static boolean shouldSupportMediaTunneling() { - return !HI3798MV200 - && !CVT_MT5886_EU_1G - && !REALTEKATV - && !QM16XE_U; - } - public static boolean isLandscape(final Context context) { return context.getResources().getDisplayMetrics().heightPixels < context.getResources() .getDisplayMetrics().widthPixels; diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 7d8c48bda..8ff617172 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -227,7 +227,6 @@ show_memory_leaks_key allow_disposed_exceptions_key show_original_time_ago_key - disable_media_tunneling_key show_image_indicators_key show_crash_the_player_key check_new_streams @@ -1369,5 +1368,6 @@ exoplayer_settings_key + disable_media_tunneling_key use_exoplayer_decoder_fallback_key diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml index 7405e47ac..84bb281f3 100644 --- a/app/src/main/res/xml/debug_settings.xml +++ b/app/src/main/res/xml/debug_settings.xml @@ -34,14 +34,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + \ No newline at end of file From a02b92fd59ad7585c42fc5839c0d4b360150a4d0 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sun, 21 Aug 2022 22:20:29 +0200 Subject: [PATCH 044/133] Update playback load interval size setting description - Remove redundant player restart requirement note, as it is written on the ExoPlayer settings description page; - Add precision about the setting effect/limitation, as it only applies on progressive contents/media sources and not on every content/media source; - Remove translations of this description, to ensure that they will be updated by translators. --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 3 +-- app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 3 +-- app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 2 +- 40 files changed, 3 insertions(+), 42 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 95e620ad8..977177996 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -729,7 +729,6 @@ تعليق مثبت LeakCanary غير متوفر الافتراضي ExoPlayer - تغيير حجم الفاصل الزمني للتحميل (حاليا %s). قد تؤدي القيمة الأقل إلى تسريع تحميل الفيديو الأولي. تتطلب التغييرات إعادة تشغيل المشغل تكوين إشعار مشغل البث الحالي الإشعارات تحميل تفاصيل البث… diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 8779fb867..14e915a9e 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -496,7 +496,6 @@ Video fayl xülasəsi prosesi üçün bildirişlər Miniatürü 1:1 görünüş nisbətinə kəs - Yükləmə intervalı həcmini dəyişdir (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ı yenidən başlatmağı 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 Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir Kənar axtarış təklifləri diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 855c577a6..8654715a6 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -70,7 +70,6 @@ Zapamtite posljednju veličinu i položaj iskočnog prozora Koristite brzo neprecizno premotavanje Neprecizno premotavanje dozvoljava pokretaču brže premotavanje s gorom preciznošću. Premotavanje za 5, 15 ili 25 sekundi ne radi s ovim - Promijenite veličinu intervala za učitavanje (trenutačno %s). Niža vrijednost bi vam moglo ubrzat učitavanje videa. Trebate te ponovno učitati pokretač za promjenu. Prebacivanje sa jednog pokretača na drugi bi van moglo zamijeniti pokretni red Isključite da sakrijete komentare Pitajte za potvrdu prije isčišćavanja reda diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 53d32cd93..239740e59 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -700,7 +700,6 @@ هەموو فایلە دابەزێنراوەکان لە دیسک بسڕدرێتەوە؟ پەیامەکان ناکاراکراون پەیامم بکە - "قەبارەی نێوان بارکردنەکە بگۆڕە (لە ئێستادا %s) . بەهایەکی کەمتر لەوانەیە بارکردنی ڤیدیۆی سەرەتایی خێراتر بکات. گۆڕانکارییەکان پێویستیان بە داگیرساندنەوەی لێدەر هەیە" لەسەدا نیمچەتەن بنەڕەتی ExoPlayer diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index eda30eb11..68fa32c3c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -691,7 +691,6 @@ Zobrazit krátké oznámení o chybě Připnutý komentář Shodit přehrávač - 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í o právě přehrávaném streamu diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6b16e6eae..3322590e8 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -462,7 +462,6 @@ Download fuldført %s downloads fuldført - Ændr indlæsningsintervallets størrelse (som nu er på %s). En lavere værdi kan øge videoindlæsningshastigheden. Ændringer kræver en genstart af afspiller Den aktive spilleliste bliver udskiftet Hvis du skifter fra en spiller til en anden, kan din kø blive erstattet Vis metainformation @@ -731,4 +730,4 @@ Playlists der er grået ud, indeholder allerede dette objekt. Inaktiver permanent thumbnail Fejlede at kopiere til udklipsholderen - \ 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 369410508..14fbbc057 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -682,7 +682,6 @@ \nBitte installiere einen Storage Access Framework kompatiblen Dateimanager Angehefteter Kommentar LeakCanary ist nicht verfügbar - Ändern der Größe des Ladeintervalls (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden des Videos beschleunigen. Änderungen erfordern einen Neustart des Players ExoPlayer Standard Benachrichtigungen Benachrichtigen über neue abonnierbare Streams diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 0a42d5d0f..83df4f5a4 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -681,7 +681,6 @@ Καρφιτσωμένο σχόλιο Το LeakCanary δεν είναι διαθέσιμο Εξ\' ορισμού ExoPlayer - Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής Ειδοποιήσεις %s νέα ροή diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 91ba5b654..239bfa81c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -696,7 +696,6 @@ Comentario fijado LeakCanary no está disponible ExoPlayer valor por defecto - Cambie el tamaño del intervalo de carga (actualmente %s). Un valor más bajo puede acelerar la carga inicial de video. Los cambios requieren un reinicio del reproductor Notificaciones Nuevos streams Notificación del reproductor diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 9ec65ce99..07b52d9d2 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -681,7 +681,6 @@ Esiletõstetud kommentaar LeakCanary pole saadaval ExoPlayer\'i vaikimisi väärtused - Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem. Muudatuste jõustamine eeldab rakenduse uuesti käivitamist Meediamängija teavitused Teavitused pole kasutusel Kontrollimise sagedus diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 946de5363..5900031ef 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -690,7 +690,6 @@ Kanal honetara harpidetu zara , Txandakatu denak - Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiaraztea behar du Harpidetzen jario berriei buruz jakinarazi Ezabatu deskargatutako fitxategi guztiak biltegitik\? Harpidetzentzako jario berrien jakinarazpenak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index fe5750dd9..22a7956fa 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -680,7 +680,6 @@ خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده لیک‌کاناری موجود نیست - تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند پیش‌گزیدهٔ اگزوپلیر آگاهی‌ها بار کردن جزییات جریان… diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index c66d1db75..38719e960 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -48,7 +48,6 @@ Pangalawang action button Pangatlong action button Pinapayagan ng di-saktong seek ang player na mag-seek sa mga posisyon nang mabilis ngunit na may pinababang kasaktuhan. Di ito gagana sa pag-seek nang 5, 15, o 25 segundo. - Baguhin ang laki ng pagitan na ilo-load (kasalukuyang %s). Maaaring mapabilis ang unang pag-load sa video kung mababa ito. Kailangang i-restart ang player para gumana ang pagbabago. Patayin para mapigilan ang pag-load sa mga thumbnail, para makatipid ng data at paggamit sa memory. Lilinisin ang parehong image cache na nasa memory at nasa disk Piliin ang mga mungkahing ipapakita habang naghahanap Patayin para itago ang paglalarawan ng video at karagdagang impormasyon diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ea891723b..496a23b65 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -694,7 +694,6 @@ \nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement Commentaire épinglé LeakCanary n\'est pas disponible - Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos. Changer cette valeur nécessite de redémarrer le lecteur Valeur par défaut d’ExoPlayer Nouveaux flux Configurer la notification du flux en cours de lecture diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7aafe4e7e..20ceff5fa 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -671,7 +671,6 @@ Procurar manualmente novas versións A procurar actualizacións… A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado - Cambial dimensión do intervalo de carga (actualmente %s). Un valor máis baixo pode alixeirala carga inicial do vídeo. Os cambios requiren un reinicio da aplicacion Procesando... Pode devagar un momento Crear unha notificación de erro Amosar fitas coloridas de Picasso na cima das imaxes que indican a súa fonte: vermello para a rede, azul para o disco e verde para a memoria diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index ffd65b736..b1989b842 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -705,7 +705,6 @@ הערה ננעצה LeakCanary אינה זמינה ברירת מחדל של ExoPlayer - שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית. שינויים דורשים את הפעלת הנגן מחדש התראות על תזרימים חדשים להרשמה תדירות בדיקה נדרש חיבור לרשת diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 06df20082..985544fe4 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -669,7 +669,6 @@ Komentar dipin LeakCanary tidak tersedia Default ExoPlayer - Ubah ukuran interval pemuatan (saat ini %s). Nilai yang rendah mungkin dapat membuat pemuatan video awal lebih cepat. Perubahan membutuhkan pemutar dimulai ulang Memuat detail stream… Frekuensi pemeriksaan Dibutuhkan koneksi jaringan diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index cac9b0d2a..aff0b3bee 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -693,7 +693,6 @@ Commento in primo piano LeakCanary non è disponibile Predefinito ExoPlayer - Cambia la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video. La modifica richiede il riavvio del lettore Notifiche di nuovi contenuti dalle iscrizioni Frequenza controllo Connessione di rete richiesta diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e9b0798bb..fafbf91f9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -688,7 +688,6 @@ 新しいストリーム 通知 現在再生しているストリームの通知を構成 - 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です 必要なネットワークの種類 パーセント 半音 diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 5c5c7ba42..d54d043db 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -677,7 +677,6 @@ Tagad varat atlasīt tekstu video aprakstā. Notifikācijas - Izmainīt ielādēšanas intervāla izmēru (pašlaik %s). Zemāka vērtība var paātrināt sākotnējo video ielādi. Izmainot vērtību, nepieciešams restartēt atskaņotāju. Avarēt atskaņotāju Pielāgojiet pašlaik atskaņotās plūsmas notifikāciju Atskaņotāja notifikācija diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 2a61f4b0a..286e68bc3 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -653,6 +653,5 @@ അറിയിപ്പുകൾ പ്ലേയർ അറിയിപ്പ് പുതിയ സ്ട്രീമുകൾ - ലോഡ് ഇടവേള മാറ്റുക (ഇപ്പൊൾ %s). കുറഞ്ഞ മൂല്യം വീഡിയോ വേഗത്തിൽ ലോഡ് ചെയ്യാൻ ഇടയാക്കാം. മാറ്റങ്ങൾ പ്രാഭല്യതിൽ വരുത്താൻ പ്ലേയർ പുനരാരംഭിക്കണം. പ്ലേയർ തകർക്കുക \ No newline at end of file diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 490b75bb8..4c4b5c95d 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -625,7 +625,6 @@ Nieuwe streams Meldingen over nieuwe streams voor abonnementen NewPipe meldt een fout, tik om te rapporteren - Verander het laadinterval (momenteel %s). Een lagere waarde kan het laden van video versnellen. Vereist een herstart van de speler. %s nieuwe stream %s nieuwe streams diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index bd901a26f..f6d8ccffa 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -680,7 +680,6 @@ \nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework Vastgemaakt commentaar LeakCanary is niet beschikbaar - Verander de laad interval tijd (nu %s). Een lagere waarde kan het initiële laden van de video versnellen. De wijziging vereist een herstart van de speler ExoPlayer standaard Speler melding Configureer meldingen van de huidige spelende stream diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 109accb82..895b1a935 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -700,7 +700,6 @@ Przypięty komentarz LeakCanary jest niedostępne Rozmiar interwału ładowania odtwarzania - Zmień rozmiar interwału ładowania (aktualnie %s). Niższa wartość może przyspieszyć początkowe ładowanie wideo. Zmiany wymagają ponownego uruchomienia odtwarzacza domyślny ExoPlayera Powiadomienie odtwarzacza Skonfiguruj powiadomienie aktualnie odtwarzanego strumienia diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 91be57038..bfa888d6b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -692,7 +692,6 @@ \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download Comentário fixado O LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado ExoPlayer padrão Notificação do reprodutor Configurar a notificação do fluxo da reprodução atual diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 9c3958ba3..f38a4180d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -692,7 +692,6 @@ \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário fixado LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado Predefinido do ExoPlayer Notificações A carregar detalhes do fluxo… diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0d71e00b8..9719292ec 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -693,7 +693,6 @@ Comentário fixado LeakCanary não está disponível Predefinido do ExoPlayer - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. Se fizer alterações é necessário reiniciar Notificação do reprodutor Configurar a notificação da reprodução do vídeo atual Notificações diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 84eed26ec..bb3ef6665 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -705,7 +705,6 @@ Procent Semiton Implicit ExoPlayer - Modificați dimensiunea intervalului de încărcare (în prezent %s). O valoare mai mică poate accelera încărcarea inițială a videoclipului. Modificările necesită o repornire a playerului Dați crash player-ului LeakCanary nu este disponibil Notificări diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f9ca0f4e..687d83549 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -715,7 +715,6 @@ Закреплённый комментарий LeakCanary недоступна Стандартное значение ExoPlayer - Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера Загрузка сведений о трансляции… Проверить наличие новых трансляций Удалить все загруженные файлы\? @@ -758,4 +757,4 @@ Удалить дубликаты\? Частично просмотрено Вы хотите удалить все повторяющиеся потоки в этом плейлисте\? - \ 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 d2af26930..676a8dd07 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -681,7 +681,6 @@ Cummentu apicadu LeakCanary no est a disponimentu Valore ExoPlayer predefinidu - Muda sa mannària de s\'intervallu de carrigamentu (in custu momentu %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu de incumintzu de su vìdeu. Sas modìficas tenent bisòngiu de torrare a allùghere su riproduidore Cunfigura sa notìfica de su flussu in cursu de riprodutzione Notìficas de flussos noos dae sas iscritziones diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 05f9c70b9..a21b2dfac 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -693,7 +693,6 @@ Zobraziť krátke oznámenie chyby Oznámte chybu ExoPlayer preddefinovaný - Zmeniť interval načítania (aktuálne %s). Menšia hodnota môže zvýšiť rýchlosť prvotného načítania videa. Zmena vyžaduje reštart Upozornenia Frekvencia kontroly Vymazať všetky stiahnuté súbory z disku\? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 92a1d2294..a3bb7068b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -681,7 +681,6 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard - Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver omstart av spelaren Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index fd38b35d5..a0e65045e 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -417,7 +417,6 @@ పరివీక్షణ తేలియాడే విధంగా మార్చు తదుపరి స్ట్రీమ్‌ను స్వీయ-ఎన్క్యూ - లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ ప్రారంభ వీడియో లోడింగ్‌ని వేగవంతం చేయవచ్చు. మార్పులకు ప్లేయర్ రీస్టార్ట్ అవసరం. LeakCanary అందుబాటులో లేదు ప్లేయర్ శీర్షిక వచన స్థాయి మరియు నేపథ్య శైలులను సవరించండి. అమలులోకి రావడానికి యాప్ రీస్టార్ట్ అవసరం స్వయంచాలకంగా రూపొందించబడింది (ఎక్కించినవారు కనబడుటలేదు) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7943e8adf..9b07dd7f7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -679,7 +679,6 @@ Oynatıcıyı çöktür Sabitlenmiş yorum LeakCanary yok - Yükleme ara boyutunu değiştir (şu anda %s). Düşük bir değer videonun ilk yüklenişini hızlandırabilir. Değişiklikler oynatıcının yeniden başlatılmasını gerektirir ExoPlayer öntanımlısı Yeni akış bildirimleri Bildirimler diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6706396ae..4436b30e9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -697,7 +697,6 @@ Закріплений коментар LeakCanary недоступний Типовий ExoPlayer - Змінити розмір інтервалу завантаження (наразі %s). Менше значення може прискорити початкове завантаження відео. Зміни вимагають перезапуску програвача Ви підписалися на цей канал , Сповіщення про нові трансляції для підписок diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fc00769ba..7d0f15132 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -666,7 +666,6 @@ \nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework. Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống - Thay đổi kích thước khoảng thời gian tải (tầm khoảng %s). Để ở giá trị thấp hơn có thể sẽ tăng tốc độ tải video hơn ban đầu. Khởi động lại trình phát để áp dụng thay đổi LeakCanary không khả dụng ExoPlayer mặc định Bình luận được ghim diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4ee6bc285..b4dfa142c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -668,7 +668,6 @@ NewPipe 遇到了一个错误,点击此处报告此错误 置顶评论 LeakCanary 不可用 - 更改加载间隔的大小(当前为 %s),较低的值可以加快视频的首次加载速度。更改需要重启播放器 ExoPlayer 默认 配置当前正在播放的串流的通知 新串流通知 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 8e83c4015..d70913965 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -646,7 +646,6 @@ 係咪要全部剷走晒播放到邊個位? 百分比 半音 - 更改載入斬件大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要開過個播放器至生效 問過先至將排隊播清零 目前播放器入面嘅排隊播將會清零 加一個站 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 75e77fa18..15bf15a0f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -669,7 +669,6 @@ 釘選的留言 LeakCanary 無法使用 ExoPlayer 預設值 - 變更載入間隔大小(目前為 %s)。較低的值可能會提昇初始影片載入速度。變更需要重新啟動播放器 播放器通知 通知 正在載入串流詳細資訊…… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1dad7c01d..767dadab0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,7 +79,7 @@ Inexact seek allows the player to seek to positions faster with reduced precision. Seeking for 5, 15 or 25 seconds doesn\'t work with this Fast-forward/-rewind seek duration Playback load interval size - Change the load interval size (currently %s). A lower value may speed up initial video loading. Changes require a player restart + Change the load interval size on progressive contents (currently %s). A lower value may speed up their initial loading Ask for confirmation before clearing a queue Switching from one player to another may replace your queue The active player queue will be replaced From 787758a4360063cafce3f77d8cf562082419945f Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sun, 26 Feb 2023 19:39:17 +0100 Subject: [PATCH 045/133] [Android 6+] Add ability to always use ExoPlayer's MediaVideoCodecRenderer setOutputSurface workaround As some devices not present in ExoPlayer's list may not implement MediaCodec.setOutputSurface(Surface) properly, this workaround could be useful on these devices. It forces ExoPlayer to fall back on releasing and re-instantiating video codec instances, which is always used on Android 5 and lower due to addition of this method in Android 6. To do so, a CustomMediaCodecVideoRenderer, based on ExoPlayer's MediaVideoCodecRenderer which always return true for the codecNeedsSetOutputSurfaceWorkaround method has been added, which is used in CustomRenderersFactory, a class based on DefaultRenderersFactory which always returns our CustomMediaCodecVideoRenderer as the video renderers. CustomRenderersFactory replaces DefaultRenderersFactory in the player, in the case this setting is enabled. --- .../org/schabi/newpipe/player/Player.java | 17 ++++-- .../helper/CustomMediaCodecVideoRenderer.java | 54 +++++++++++++++++++ .../player/helper/CustomRenderersFactory.java | 43 +++++++++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/exoplayer_settings.xml | 10 +++- 6 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.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 5dc9382e7..b446cbb81 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -69,7 +69,6 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player.PositionInfo; -import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.source.MediaSource; @@ -95,6 +94,7 @@ import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.event.PlayerServiceEventListener; import org.schabi.newpipe.player.helper.AudioReactor; +import org.schabi.newpipe.player.helper.CustomRenderersFactory; import org.schabi.newpipe.player.helper.LoadController; import org.schabi.newpipe.player.helper.PlayerDataSource; import org.schabi.newpipe.player.helper.PlayerHelper; @@ -196,7 +196,7 @@ public final class Player implements PlaybackListener, Listener { @NonNull private final DefaultTrackSelector trackSelector; @NonNull private final LoadController loadController; - @NonNull private final RenderersFactory renderFactory; + @NonNull private final DefaultRenderersFactory renderFactory; @NonNull private final VideoPlaybackResolver videoResolver; @NonNull private final AudioPlaybackResolver audioResolver; @@ -261,9 +261,16 @@ public final class Player implements PlaybackListener, Listener { final PlayerDataSource dataSource = new PlayerDataSource(context, new DefaultBandwidthMeter.Builder(context).build()); loadController = new LoadController(); - renderFactory = new DefaultRenderersFactory(context) - .setEnableDecoderFallback(prefs.getBoolean( - context.getString(R.string.use_exoplayer_decoder_fallback_key), false)); + + renderFactory = prefs.getBoolean( + context.getString( + R.string.always_use_exoplayer_set_output_surface_workaround_key), false) + ? new CustomRenderersFactory(context) : new DefaultRenderersFactory(context); + + renderFactory.setEnableDecoderFallback( + prefs.getBoolean( + context.getString( + R.string.use_exoplayer_decoder_fallback_key), false)); videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java b/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java new file mode 100644 index 000000000..66ac6d50b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java @@ -0,0 +1,54 @@ +package org.schabi.newpipe.player.helper; + +import android.content.Context; +import android.os.Handler; + +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter; +import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; +import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; +import com.google.android.exoplayer2.video.VideoRendererEventListener; + +/** + * A {@link MediaCodecVideoRenderer} which always enable the output surface workaround that + * ExoPlayer enables on several devices which are known to implement + * {@link android.media.MediaCodec#setOutputSurface(android.view.Surface) + * MediaCodec.setOutputSurface(Surface)} incorrectly. + * + *

+ * See {@link MediaCodecVideoRenderer#codecNeedsSetOutputSurfaceWorkaround(String)} for more + * details. + *

+ * + *

+ * This custom {@link MediaCodecVideoRenderer} may be useful in the case a device is affected by + * this issue but is not present in ExoPlayer's list. + *

+ * + *

+ * This class has only effect on devices with Android 6 and higher, as the {@code setOutputSurface} + * method is only implemented in these Android versions and the method used as a workaround is + * always applied on older Android versions (releasing and re-instantiating video codec instances). + *

+ */ +public final class CustomMediaCodecVideoRenderer extends MediaCodecVideoRenderer { + + @SuppressWarnings({"checkstyle:ParameterNumber", "squid:S107"}) + public CustomMediaCodecVideoRenderer(final Context context, + final MediaCodecAdapter.Factory codecAdapterFactory, + final MediaCodecSelector mediaCodecSelector, + final long allowedJoiningTimeMs, + final boolean enableDecoderFallback, + @Nullable final Handler eventHandler, + @Nullable final VideoRendererEventListener eventListener, + final int maxDroppedFramesToNotify) { + super(context, codecAdapterFactory, mediaCodecSelector, allowedJoiningTimeMs, + enableDecoderFallback, eventHandler, eventListener, maxDroppedFramesToNotify); + } + + @Override + protected boolean codecNeedsSetOutputSurfaceWorkaround(final String name) { + return true; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java b/app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java new file mode 100644 index 000000000..668b48c30 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java @@ -0,0 +1,43 @@ +package org.schabi.newpipe.player.helper; + +import android.content.Context; +import android.os.Handler; + +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.Renderer; +import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; +import com.google.android.exoplayer2.video.VideoRendererEventListener; + +import java.util.ArrayList; + +/** + * A {@link DefaultRenderersFactory} which only uses {@link CustomMediaCodecVideoRenderer} as an + * implementation of video codec renders. + * + *

+ * As no ExoPlayer extension is currently used, the reflection code used by ExoPlayer to try to + * load video extension libraries is not needed in our case and has been removed. This should be + * changed in the case an extension is shipped with the app, such as the AV1 one. + *

+ */ +public final class CustomRenderersFactory extends DefaultRenderersFactory { + + public CustomRenderersFactory(final Context context) { + super(context); + } + + @SuppressWarnings("checkstyle:ParameterNumber") + @Override + protected void buildVideoRenderers(final Context context, + @ExtensionRendererMode final int extensionRendererMode, + final MediaCodecSelector mediaCodecSelector, + final boolean enableDecoderFallback, + final Handler eventHandler, + final VideoRendererEventListener eventListener, + final long allowedVideoJoiningTimeMs, + final ArrayList out) { + out.add(new CustomMediaCodecVideoRenderer(context, getCodecAdapterFactory(), + mediaCodecSelector, allowedVideoJoiningTimeMs, enableDecoderFallback, eventHandler, + eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); + } +} diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 8ff617172..f9d0572e8 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1370,4 +1370,5 @@ exoplayer_settings_key disable_media_tunneling_key use_exoplayer_decoder_fallback_key + always_use_exoplayer_set_output_surface_workaround_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 767dadab0..5730e063e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -777,4 +777,6 @@ Manage some ExoPlayer settings. These changes require a player restart to take effect Use ExoPlayer\'s decoder fallback feature Enable this option if you have decoder initialization issues, which falls back to lower-priority decoders if primary decoders initialization fail. This may result in poor playback performance than when using primary decoders + Always use ExoPlayer\'s video output surface setting workaround + This workaround releases and re-instantiates video codecs when a surface change occurs, instead of setting the surface to the codec directly. Already used by ExoPlayer on some devices with this issue, this setting has only an effect on Android 6 and higher\n\nEnabling this option may prevent playback errors when switching the current video player or switching to fullscreen \ No newline at end of file diff --git a/app/src/main/res/xml/exoplayer_settings.xml b/app/src/main/res/xml/exoplayer_settings.xml index d855ad936..7e903fff1 100644 --- a/app/src/main/res/xml/exoplayer_settings.xml +++ b/app/src/main/res/xml/exoplayer_settings.xml @@ -29,4 +29,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - \ No newline at end of file + + + From acebabd02817a9f8bd6e1d22e36c29e56fbe92d8 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 9 Apr 2023 18:46:15 +0530 Subject: [PATCH 046/133] Use AndroidX's PendingIntentCompat class. --- .../org/schabi/newpipe/NewVersionWorker.kt | 4 +- .../org/schabi/newpipe/error/ErrorUtil.kt | 5 +- .../feed/notifications/NotificationHelper.kt | 5 +- .../local/feed/service/FeedLoadService.kt | 6 +- .../player/notification/NotificationUtil.java | 8 +-- .../newpipe/util/PendingIntentCompat.java | 69 ------------------- .../giga/service/DownloadManagerService.java | 6 +- 7 files changed, 18 insertions(+), 85 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index dac831fe4..c46dd6348 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -6,6 +6,7 @@ import android.util.Log import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.net.toUri @@ -19,7 +20,6 @@ import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.exceptions.ReCaptchaException -import org.schabi.newpipe.util.PendingIntentCompat import org.schabi.newpipe.util.ReleaseVersionUtil.coerceUpdateCheckExpiry import org.schabi.newpipe.util.ReleaseVersionUtil.isLastUpdateCheckExpired import org.schabi.newpipe.util.ReleaseVersionUtil.isReleaseApk @@ -60,7 +60,7 @@ class NewVersionWorker( val intent = Intent(Intent.ACTION_VIEW, apkLocationUrl?.toUri()) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val pendingIntent = PendingIntentCompat.getActivity( - applicationContext, 0, intent, 0 + applicationContext, 0, intent, 0, false ) val channelId = applicationContext.getString(R.string.app_update_notification_channel_id) val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId) diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index c7b9beeed..daa598509 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -9,10 +9,10 @@ import android.view.View import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.fragment.app.Fragment import com.google.android.material.snackbar.Snackbar import org.schabi.newpipe.R -import org.schabi.newpipe.util.PendingIntentCompat /** * This class contains all of the methods that should be used to let the user know that an error has @@ -118,7 +118,8 @@ class ErrorUtil { context, 0, getErrorActivityIntent(context, errorInfo), - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT, + false ) ) 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 61a4936c8..dc863126e 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 @@ -10,6 +10,7 @@ import android.os.Build import android.provider.Settings import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager import com.squareup.picasso.Picasso @@ -19,7 +20,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedUpdateInfo import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NavigationHelper -import org.schabi.newpipe.util.PendingIntentCompat import org.schabi.newpipe.util.PicassoHelper /** @@ -76,7 +76,8 @@ class NotificationHelper(val context: Context) { NavigationHelper .getChannelIntent(context, data.listInfo.serviceId, data.listInfo.url) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), - 0 + 0, + false ) ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index 0850fef8c..ff5734feb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -29,6 +29,7 @@ import android.os.IBinder import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.app.ServiceCompat import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable @@ -42,7 +43,6 @@ import org.schabi.newpipe.extractor.ListInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent -import org.schabi.newpipe.util.PendingIntentCompat import java.util.concurrent.TimeUnit class FeedLoadService : Service() { @@ -152,8 +152,8 @@ class FeedLoadService : Service() { private lateinit var notificationBuilder: NotificationCompat.Builder private fun createNotification(): NotificationCompat.Builder { - val cancelActionIntent = - PendingIntentCompat.getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0) + val cancelActionIntent = PendingIntentCompat + .getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0, false) return NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) .setOngoing(true) 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 6e50dda7d..05c2e3af6 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 @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; @@ -21,7 +22,6 @@ 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 org.schabi.newpipe.util.PendingIntentCompat; import java.util.List; import java.util.Objects; @@ -134,7 +134,7 @@ public final class NotificationUtil { .setColorized(player.getPrefs().getBoolean( player.getContext().getString(R.string.notification_colorize_key), true)) .setDeleteIntent(PendingIntentCompat.getBroadcast(player.getContext(), - NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT)); + NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT, false)); // set the initial value for the video thumbnail, updatable with updateNotificationThumbnail setLargeIcon(builder); @@ -152,7 +152,7 @@ public final class NotificationUtil { // also update content intent, in case the user switched players notificationBuilder.setContentIntent(PendingIntentCompat.getActivity(player.getContext(), - NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT)); + NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT, false)); notificationBuilder.setContentTitle(player.getVideoTitle()); notificationBuilder.setContentText(player.getUploaderName()); notificationBuilder.setTicker(player.getVideoTitle()); @@ -335,7 +335,7 @@ public final class NotificationUtil { final String intentAction) { return new NotificationCompat.Action(drawable, player.getContext().getString(title), PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, - new Intent(intentAction), FLAG_UPDATE_CURRENT)); + new Intent(intentAction), FLAG_UPDATE_CURRENT, false)); } private Intent getIntentForNotification() { diff --git a/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java b/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java deleted file mode 100644 index 6b9c36eab..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.schabi.newpipe.util; - -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.Build; - -import androidx.annotation.NonNull; - -public final class PendingIntentCompat { - private PendingIntentCompat() { - } - - private static int addImmutableFlag(final int flags) { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - ? flags | PendingIntent.FLAG_IMMUTABLE : flags; - } - - /** - * Creates a {@link PendingIntent} to start an activity. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the activity should be started. - * @param requestCode The request code - * @param intent The Intent of the activity to be launched. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getActivity(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getActivity(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getActivity(context, requestCode, intent, addImmutableFlag(flags)); - } - - /** - * Creates a {@link PendingIntent} to start a service. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the service should be started. - * @param requestCode The request code - * @param intent The Intent of the service to be launched. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getService(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getService(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getService(context, requestCode, intent, addImmutableFlag(flags)); - } - - /** - * Creates a {@link PendingIntent} to perform a broadcast. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the broadcast should be performed. - * @param requestCode The request code - * @param intent The Intent to be broadcast. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getBroadcast(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getBroadcast(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getBroadcast(context, requestCode, intent, addImmutableFlag(flags)); - } -} diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index edc6bb6fd..009a4f4be 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -33,6 +33,7 @@ import androidx.annotation.StringRes; import androidx.collection.SparseArrayCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat.Builder; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; @@ -43,7 +44,6 @@ import org.schabi.newpipe.player.helper.LockManager; import org.schabi.newpipe.streams.io.StoredDirectoryHelper; import org.schabi.newpipe.streams.io.StoredFileHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PendingIntentCompat; import java.io.File; import java.io.IOException; @@ -146,7 +146,7 @@ public class DownloadManagerService extends Service { mOpenDownloadList = PendingIntentCompat.getActivity(this, 0, openDownloadListIntent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT, false); icLauncher = BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher); @@ -487,7 +487,7 @@ public class DownloadManagerService extends Service { private PendingIntent makePendingIntent(String action) { Intent intent = new Intent(this, DownloadManagerService.class).setAction(action); return PendingIntentCompat.getService(this, intent.hashCode(), intent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT, false); } private void manageLock(boolean acquire) { From 20f0011921d7a80787c17d39dc361778b629ef70 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Thu, 13 Apr 2023 10:44:20 +0530 Subject: [PATCH 047/133] Fix Sonar failure. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1384d0a9c..d199d60f8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.21' + ext.kotlin_version = '1.8.20' repositories { google() mavenCentral() From f8c3ec4be76c886b7262910bb61e5e25c3e43f68 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 4 Feb 2023 23:10:37 +0100 Subject: [PATCH 048/133] Use a whitelist to filter all streams retrieved by the extractor. NewPipe Extractor now extracts all YouTube Itags and therefore only those which can be handled by the player need to be retrieved from the list of all available streams. --- .../resolver/AudioPlaybackResolver.java | 6 +-- .../resolver/VideoPlaybackResolver.java | 8 ++-- .../org/schabi/newpipe/util/ListHelper.java | 38 ++++++++++++++----- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e87c93114..036df51dd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.player.resolver; -import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; +import static org.schabi.newpipe.util.ListHelper.getPlayableStreams; import android.content.Context; import android.util.Log; @@ -68,12 +68,12 @@ public class AudioPlaybackResolver implements PlaybackResolver { */ @Nullable private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams(info.getAudioStreams()); if (!audioStreams.isEmpty()) { final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); return getStreamForIndex(index, audioStreams); } else { - final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); + final List videoStreams = getPlayableStreams(info.getVideoStreams()); if (!videoStreams.isEmpty()) { final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); return getStreamForIndex(index, videoStreams); diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index cf7d73558..c3303266a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -29,7 +29,7 @@ import java.util.Optional; import static com.google.android.exoplayer2.C.TIME_UNSET; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; -import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; +import static org.schabi.newpipe.util.ListHelper.getPlayableStreams; public class VideoPlaybackResolver implements PlaybackResolver { private static final String TAG = VideoPlaybackResolver.class.getSimpleName(); @@ -72,8 +72,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { // Create video stream source final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, - getNonTorrentStreams(info.getVideoStreams()), - getNonTorrentStreams(info.getVideoOnlyStreams()), false, true); + getPlayableStreams(info.getVideoStreams()), + getPlayableStreams(info.getVideoOnlyStreams()), false, true); final int index; if (videoStreamsList.isEmpty()) { index = -1; @@ -100,7 +100,7 @@ public class VideoPlaybackResolver implements PlaybackResolver { } // Create optional audio stream source - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams(info.getAudioStreams()); final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( ListHelper.getDefaultAudioFormat(context, audioStreams)); diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index b3b7c1792..f36866025 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -42,6 +42,21 @@ public final class ListHelper { // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); + /** + * List of supported YouTube Itag ids. + * The original order is kept. + * @see {@link org.schabi.newpipe.extractor.services.youtube.ItagItem#ITAG_LIST} + */ + private static final List SUPPORTED_ITAG_IDS = + List.of( + 17, 36, // video v3GPP + 18, 34, 35, 59, 78, 22, 37, 38, // video MPEG4 + 43, 44, 45, 46, // video webm + 171, 172, 139, 140, 141, 249, 250, 251, // audio + 160, 133, 134, 135, 212, 136, 298, 137, 299, 266, // video only + 278, 242, 243, 244, 245, 246, 247, 248, 271, 272, 302, 303, 308, 313, 315 + ); + private ListHelper() { } /** @@ -121,7 +136,7 @@ public final class ListHelper { */ @NonNull public static List getStreamsOfSpecifiedDelivery( - final List streamList, + @Nullable final List streamList, final DeliveryMethod deliveryMethod) { return getFilteredStreamList(streamList, stream -> stream.getDeliveryMethod() == deliveryMethod); @@ -136,23 +151,28 @@ public final class ListHelper { */ @NonNull public static List getUrlAndNonTorrentStreams( - final List streamList) { + @Nullable final List streamList) { return getFilteredStreamList(streamList, stream -> stream.isUrl() && stream.getDeliveryMethod() != DeliveryMethod.TORRENT); } /** - * Return a {@link Stream} list which only contains non-torrent streams. + * Return a {@link Stream} list which only contains streams which can be played by the player. + *
+ * Some formats are not supported. For more info, see {@link #SUPPORTED_ITAG_IDS}. + * Torrent streams are also removed, because they cannot be retrieved. * * @param streamList the original stream list * @param the item type's class that extends {@link Stream} - * @return a stream list which only contains non-torrent streams + * @return a stream list which only contains streams that can be played the player */ @NonNull - public static List getNonTorrentStreams( - final List streamList) { + public static List getPlayableStreams( + @Nullable final List streamList) { return getFilteredStreamList(streamList, - stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT); + stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT + && (stream.getItagItem() == null + || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); } /** @@ -199,7 +219,7 @@ public final class ListHelper { * @return a new stream list filtered using the given predicate */ private static List getFilteredStreamList( - final List streamList, + @Nullable final List streamList, final Predicate streamListPredicate) { if (streamList == null) { return Collections.emptyList(); @@ -210,7 +230,7 @@ public final class ListHelper { .collect(Collectors.toList()); } - private static String computeDefaultResolution(final Context context, final int key, + private static String computeDefaultResolution(@NonNull final Context context, final int key, final int value) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); From e18a6b09f8e76135b31bf41e3b7da11a1ab56581 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 17 Apr 2023 13:10:29 +0200 Subject: [PATCH 049/133] Apply new itag filter only to YouTube streams --- .../player/resolver/AudioPlaybackResolver.java | 6 ++++-- .../player/resolver/VideoPlaybackResolver.java | 7 ++++--- .../main/java/org/schabi/newpipe/util/ListHelper.java | 11 ++++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index 036df51dd..e1d3af335 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -68,12 +68,14 @@ public class AudioPlaybackResolver implements PlaybackResolver { */ @Nullable private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getPlayableStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams( + info.getAudioStreams(), info.getServiceId()); if (!audioStreams.isEmpty()) { final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); return getStreamForIndex(index, audioStreams); } else { - final List videoStreams = getPlayableStreams(info.getVideoStreams()); + final List videoStreams = getPlayableStreams( + info.getVideoStreams(), info.getServiceId()); if (!videoStreams.isEmpty()) { final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); return getStreamForIndex(index, videoStreams); diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index c3303266a..0017312cf 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -72,8 +72,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { // Create video stream source final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, - getPlayableStreams(info.getVideoStreams()), - getPlayableStreams(info.getVideoOnlyStreams()), false, true); + getPlayableStreams(info.getVideoStreams(), info.getServiceId()), + getPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId()), false, true); final int index; if (videoStreamsList.isEmpty()) { index = -1; @@ -100,7 +100,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { } // Create optional audio stream source - final List audioStreams = getPlayableStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams( + info.getAudioStreams(), info.getServiceId()); final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( ListHelper.getDefaultAudioFormat(context, audioStreams)); diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index f36866025..389bcc84f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.extractor.ServiceList.YouTube; + import android.content.Context; import android.content.SharedPreferences; import android.net.ConnectivityManager; @@ -162,16 +164,19 @@ public final class ListHelper { * Some formats are not supported. For more info, see {@link #SUPPORTED_ITAG_IDS}. * Torrent streams are also removed, because they cannot be retrieved. * - * @param streamList the original stream list * @param the item type's class that extends {@link Stream} + * @param streamList the original stream list + * @param serviceId * @return a stream list which only contains streams that can be played the player */ @NonNull public static List getPlayableStreams( - @Nullable final List streamList) { + @Nullable final List streamList, final int serviceId) { + final int youtubeServiceId = YouTube.getServiceId(); return getFilteredStreamList(streamList, stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT - && (stream.getItagItem() == null + && (serviceId != youtubeServiceId + || stream.getItagItem() == null || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); } From 70b3ba310a8b88b1262249b782f47cbbf57bdfd0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 20 Apr 2023 10:24:19 +0200 Subject: [PATCH 050/133] Upgrade to Gradle 8.0 --- app/build.gradle | 9 +++++---- build.gradle | 2 +- gradle.properties | 3 +++ gradle/wrapper/gradle-wrapper.properties | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6662b3846..6df7214a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,10 +98,11 @@ android { } packagingOptions { - // remove two files which belong to jsoup - // no idea how they ended up in the META-INF dir... - exclude 'META-INF/README.md' - exclude 'META-INF/CHANGES' + resources { + // remove two files which belong to jsoup + // no idea how they ended up in the META-INF dir... + excludes += ['META-INF/README.md', 'META-INF/CHANGES'] + } } } diff --git a/build.gradle b/build.gradle index 1384d0a9c..f5d1a323c 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.0' + classpath 'com.android.tools.build:gradle:8.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle.properties b/gradle.properties index 032d70cee..3b6624de1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,7 @@ +android.defaults.buildfeatures.buildconfig=true android.enableJetifier=false +android.nonFinalResIds=false +android.nonTransitiveRClass=false android.useAndroidX=true org.gradle.jvmargs=-Xmx2048M systemProp.file.encoding=utf-8 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5116c5b18..86eb34367 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.5.1-bin.zip -distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionSha256Sum=4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 6d98ad7abc0e656bcd0359032e03df52801f75d4 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 20 Apr 2023 10:50:48 +0200 Subject: [PATCH 051/133] Further upgrade gradle to 8.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 5 +++-- gradlew | 19 ++++++++++++------- gradlew.bat | 1 + 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 39834 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 G$^QWPgI3l6 delta 38507 zcmZ5|V|b-Ow`DrE&5mumW81cE=Y%KbiP^DjcWk?3+fFCx>6tsvz4Ohlz2CR$=c;F| zT6^#MID}aG4FRPr2LTBW`i6*=gpctJ9u&NTmn5bAFZuTe1riJl%*oY?83OEocCBOm z*CGh=8xamX7#J+C0*+bp4!wIR!7Z>`zJF3fU1o%?Ta>9+ zb-2peu)j)U%4NJxdO9RTp8zB z8G$R+K7NS&89TU8`7`jFQ5EkG2dq8m&9&TEBKB(HPwk~d$*fOb_dZ97Lji@y^}(dD zUyb!PNSw$z??0BT1su-E$$`u5gPFw6R$Y(MIf`$l9{{Wj3_kVK#v+3@AWhwGGo2p_ za@!Sp;73eSL-w1*QTY0dBn|RRztPA^X~Cl{vOM*|x+%#!Q(0bB(jBY-91ClV41hNN4ha3Wt-UvEpsqD#Hsf+03eq0Q3O(;*H@ejQEl)FD7nqQIoS&%6) zkh*@#{RSjiA5a*)pG};XG!R+F2BwKm7m(Uqg4fZ64op!kc<`~}gW zkN*73{t3K@52<72dH?l82vMBw(81X;!_|syzokGxH&DN7A(U#+-_C zAGo#FRR^*Qp<$dL^~{gkc+ZSAJA|{e*mP{-tOQV_JB;jlvg46hw=uv(W^T1^15DF} z_9^;8>JX}t6o|IL)!G#87N1NjJhNr0cAOvl75hc>7_rz$1jL&&%MMi3NapHMw(#@7 z^~Au_fJMfVkY#+t_`ShS=zl*J$IY`8p^Rz9bk7=VWL0-7O^)ky{p=Z^Q}m*spz=_QI88LhYI=X_HHz)(tDt8__Wcn}kB1%q)#nay(OszQEpEH%!Jg)OBy zBS#LwR=<=0vNY?V~PNYQ`;z)?M+&MXqaA+>MHiLD~52PO^h03(>^FjYK{ZWI2x<5(kzNH9jwU>c^lU(7sk@!VKQ z;wY{rD@xZpbz-!cWjY6Pm62GH8$y=dt#nts@x(9>tMPK>C_tqtHmRJ+2}LvHBU^Ma zx+Q(;XmLYUosOzP@yNpfP`1bw!&N1feI|r>P8F-fQmi>7w2?8pD4;S{H@-JOp3i#C z7{&Y(yaH5}!hNG_R~?#yIit_OzN*-k5|QmD=a+Fb#g&VmKT6A7@X*+Qj@LT1c#nPd zlYDS>OW2;L&F8>eH39wS`uc~XmtC!}G&FWd#>}s+{opUs1VO_jK=xIGmhS#@9S^%w ztIbLMd`cnd;2C%alY)1~wETRqC|z9Z^kdP~xVp^5jVRP|T6;Z$f;)v$4BV(C^Lt9F zz+zLHLIUUp0Y5J=%FkfK^H5-7pwx$qcVJTS)c7-S6ZS2iItYam)(i*I(~S$lBFD>O znsesGe43tTC!4bl5SG8w-R5>lT9VWk(l?A$lyMg{xG>o;L<-%IUv$j23zj#vqx!h_ zy`xghtWEf}BNt3spDi*E$~1;N?7FGq7l51-=k@&>N!1<$TV zlTV=~?OH-Xf-8mP1)UXb7k#vSj&CFe-;^ag!qO#Ep(4!)z#AoOoKi3`gy-bc&)hjY zi3Tj=Vvn5-lrE&2X)hJ8lp`IKUscf(MeO3XlcEw1#~qYkkU!91Czy`&q^YhnVx}qi z_F{aCpM-Od>|H4$q-VjQZ-A|;C$5?g=7fBtGHr;z$wgvuW}h*}xE9B_9f=)6Bic`(iG$O7?D z_GKr$n*qVfLMJm6nT9M0Z9e%poBpaeL*qk_$QrR)X0KGGdK#yVT5fYQmPbf+ai5qx zi2Zc~Ls?Bbec&CFtJwL$;l;$#n=t!bGj>0XUVR?ZTG8Y|FoQZOST7*GzND_azzaLg`5LS6a)(WQ&TQ+S=An^xE$`wk@n%r^NlWbMCx!7S6mu#*Po;V*YL6sB3niNGf zGRlSCVYA=-^tR+yCkJnShM^%VZen?zGk$OK- zzhbzo#v8T*|K^D~gz^R|jhxA!t&AgW25Np)vC~A$gaWkz?G!BcP+J(*e387crj>DV zEgQ7gYLz1~?ix!qU4=IuPgP$ijkx{Rk5locq13WrIDx^v&IiDM3BM!+r~jk+r2nt> zGeX4smsRiKffn~zn+6eofdBhM*vD%kLP>}G2H(_zk^1dlki#v603l*849gFNHjGD6JA8-cBj?gLUf&SL&6^_e?aS( zc&M!DN7-FwtjmmJu&G`vF8be`$*CNtUS587zre4rd#qpIH7PjA7o^41MG?r*O>rMh zVPANFyw?cR<&g2L@i2r3=-nA9-}gvI$>V9E6W(MQAqx=!TQXZ?60X3UY5F92!#Ik^ z8b+N-Dh&mlw73w{p>bdRWp%e?lh)Ps4<`h<9L9#2mm1b~3|~zXYqXG(+?r-n0nnmP zax>*qY>p8KN#im`wC(4lv&(r&1ulD~3X7K4f`l~mPIoD-BpEXfJiJaEk1L}3Kmkur zrr9LCmKretP7G9AlhtTa+Nz+j%7czr^ZeUWLKakS_(;Wlxavy5Y}YYXX;ZGtWXN>p zW@!jiAUroGr)H`}Oz6#VT*s(Lo>P@rx7pclMf;YVK6PB!?GOMTKZ=-rk_vn6Ph}p6-!@S zW{KrR_o;QTeXrFdCE=^8@NbW{3t1zhY%B^5r@JLu#{A@@%EA6hJ1$O0e2YN)MKo|mY6G#x49O!97`(1Wkxf?fYftm>lE*h8$dp}| zvi3EJK3)jiYK6{vm|2t5mHN7EX8`w?MON9k1G``opNwnhake9z7gShZu;LI4_+4)_ zDe~P~G@8d9Ta3x?s{!z7nYKrm|8r9R`#x5JCtd`KBUJ!2mwy-1f()j24vHol5x*s+ zz*0z*^fqa1w&Lx%&b%skMf+gtO%$h`A41uUV4E?VbzMk?Fw44}nVR{swDfZP^RU`R z0%qy55frZiVH4{C;;1dM{vIU*p;qrMf01D_rrzzF8)G|;#xy=FiN4TQ z>abs1E(rkSLjjkFqGQI*KXX@LrSpe6lEU zGJr`N7W12)M~An=xEpWLib>Hm*YTq`phBewiz|g?Vi;lkby@X;$5-H@;Zw(Bwj}VY zVS)ZDO^*qO({4FEzML`EiG`xQy5jIRHlD8lnh4-D!{XF#V!FKfR1JxMXpG2o7-xP& z^W-M{%}StQKT3Gn{A=jlV7um*6xl|b;a7v3chk%W))9blbdP4Z>e>ELqqaI}0LN@R4;=GAs3 zW*Ec<|EOPjhEyW;;|Wv7U`{3lnjuicG+iC3hvS({gg?J1re@HX zU@Xbu=UKdfB6x6deQaRa9Es?OwWgu&z8N4Um5g9523E|Dm7_5S88?&%hmCjzC)iOhm@Z;%|RFKhL>^3uLm@l-%%f#w?a!c#6d?nr&6S zl2!PboK>1?(^uUl=Uy6JwHv$(hFtQ49Rtp83r3$FNLt-nh3VP9%@bFu9dh?lQ0+Nv zEw*~g(yAz;ju{nd94lK%pA`xycG(bX&QTck`b^dU9%XAZ+zxCsZ3=2_tChArwV>aH z%wyhKVwg7C{K{9NidGDW5NSH@>Kn8Io`{o&uVE&0dVam9bEJBDpf{=WHrvw5tW^2= z2BfCsixl}cv734Y+>lBGv?Y(VA}6bkck$%5TV!iJ>kUg^k8UUL`tVB8#Zi^@!!y_c z*p^m+n^eGMpng2r;0(by{a;ketxW`hT(rSz++*DRo=vmF7|p>I8Y^*8WUo_sglnvv z;m8n^oW1tZL?P_5{rdo@?AMe7b|^}F)}fDA^;@ufc7`|KPN(aP6^tf1%RIqL>3-f= zICUdd3KXw;Q!RYXE%#dCB$^J}H3;>(8W zx78%hpH#*xOV6Hs{at{>tNtiAJ`)ei&at+@=wKQ|2k=T;tSu9s9r(q`6fG}32^d&F z8f3_wA*#I#YW^OVXWzxh1Obg;4OEwwB6%HofvaMLj#^Y&2@?+q;q+4A8S%NR*6W|a z{O0GrAVA08zH&LDQ99Elek7I2VKOw8ZW}D|A4{$*-3ncL%_s}i6v@J*iPEK>Xdl7P z-@3&PWL!p$=SQ(oEpcv{#(`(CkF2tQ*1g*DwB*=5h#V)~PXxjMjw-)I*>TJbi5w9n7?rd^Ts_HX1Ic)Ul2+&C@ZR0v-x0N@;2=nVPIaj@ z){l%pRk-4@W13phI2&78cE`lvzNCXh9?>%L@8DM11=!MBg_&KO4G`Dw;U-)se2U(5 zf8u#tep%^{5@`jsK=`is&`$Aw$dJ5*JPWIqgesoj z4LuKKi;_ z(rkEyjyzVyZ%KyCf}@k4GgpCzC_o0Zx815rU6S7O$2?IYX;3*e@s zJwh$S>+i~oKB|8uSnbu_pnS;bl>7*l?sG!{CjWCPDK^}u!O}g=%*WyhGV`jVZETt- zJK#B^DKn$O9`zB+hfgB7x4(dd)sC@3UT4}7pWUU5t@eIqACFLf(BnAMMuCd&Xn(=% z8bE&aH|U0qFs3C{X{_e{2J-EoFOr7pO4bZJDu@Y+xMc{g`DbdFD;8YBf_{l0Ues7CuyA$Oj&XDA6 zrfYO&1lI@Ie=Ig*VQ}yIVTn!0p5Zq`B7A(r2a5bZagBrxgQ@Ec20-%fDPd)l0^~on z#cEA5dukmrWZ-7e%&#C}13a@z9leSDgoe zH>jL{1_BM~uPXri@tK)-NCDsl$n+vBxx+MqXZ>-V0adN65{Z>e^tC1L92>hgV7RU@ zh^`t>_>1_g0X0-UfA9CFQ|Oy256eO`uM{(Bne}+8U?!L3ThqO@u0+U&WLh?}Yv&(cD#w zNCl0UArE`L&lw2k>N`C}_ji+sFdV4BKYvg3T`nyQ4b$umCMMYob$xVZCgE!bZJfVH zyy)8S*BUuF8&^FzXYmqY>PMw^Ut(rtS6zEKE=xR-*wTb9Hm&(W`&suZEU0q10xpy4SrMsMhH1FIB+Fd8seDYG`c~R%KOKCbwnk zsxkSjI&M~v$~2|l!B@4(^;fMi);DgcKlPJ(>7~gN%@cZzwF2Y9@|3xCTJeR$Pc7l< zXxBnjpbSpc>v8NbyW=_0w^7@R%iFq;Mho=sAHo6h$h!UAAxf9^`d z+AzE0yfC|Cw&0O>1)*--D1LV?(yso*pKSD8Lfcv?oBsGNq%plI`azcwS; z=@xqc{_8M;?oUVjn&}(DC1)EXwQ3m7^S*SP42p}cQfy45bZ`h$!vfl&DYec_cNhVk z+@%NVK1A4RN_4eyc2jF?_4!C^rIPBT%aor|k+3Zn%bu*AnRNo?pR$yxO>`NGV4c6Gc&O>GUc<@h09W%K;N~{%&9+LX^VQe=;8}0d=X1NrO^078m%v32j)k}6AKlj zP@`t3jo(ZXqzGydNWYmfPYe;ON3XIfbqC`&px{J)YLjgbEr&G?oW$BWGw$YUtL^1# zucF@!{Z8|xUf~vhA!=uuyJk!t&=#Bru#WjP?BdeBSEbBxXDl1xf1>Yg*RlMenR#d8 z0!~al<$T!jr4Ns&XoPqSSznXxYoF_=h;0XX<0SL^$m&bbbwPF57jutJ5J0F5IMYG! zt%qL)IaZw!ijG4eocTlWK{#-G|Avs0&f@?!NwMZrCV<>nqIE`ofdB($5n6QRdd+@12kM3~AEekW!Nk4v5udjvSDTcVll6@oZM}f*Wv_9NG z?N_XKl2YLo(b!2k!FH#JK>!@-NUGX(`Zq#7=HU?${@$-M5SQgl?B!*YRTRqhaak^=`_?)U@I0lQi*0}om${*5vBt=aqf(Fcbe z#1rZ>vlziB8}$%&E^3KT2&nP7ht#Xn)GADSX?-eg=+Rz0edy}eZP0sw-{SJL>))l! z;uIdlq)3sK;MVB#z#W7%xsJ>?u`%Ofdw*J+S0hAAj$9ee-&T-#CB~vxzr1coQOzQm z4DJ3*y4IQtbcy_1={%>n(=*k}CMt9N9qEgEsK1HyP53|Ak7B5|u;icYdi=+L0{^!R z4En>y2XIhYRK^_r>qW4&f`vyHnIJE|4$+8|L|P6v6M;*eWz5pAg|jl1b&c)BUw9Yi z^tkvciXJ|M69^`pa<|z!^-T_XGWj}Z!!7Wn;VQqcFAySQI5{5Dl`naWT856sLstr( zdwD%JIoc)VAj4uVhjG?boUjcSX!Lq7$7G;Z3-H}!$BQi!&1kfBTjewWc4Uzg3X}7qH6OJkZMd zaZockpFD9C-*Vn`%`ofeZE0Q9%QNjCJ+wDv)pWMOLl=GAM~yN{?&;CA-^ugjTzVetMN!{DLniV~bB=6Il*7Kh9#KBpovc zpqqV09mfeI>lCvMn-V!zx!)WB^Fzs%$th@>|3zpe6T(c(P_)Av8$LITT6u)f1&9o= zd*J9qY2E6d|4oQ=;?jRImll>|g_+Ox%lHeXunU(){zmjqAneQds0H{Smm|v%tqe7- z=)Fa3#IB!7hzwLI;Xy<}KEJDcYr(i@Jf1$13YHOyO3J~-->bz`{y!m*f6fnLf3f^3 z5m9T$79~!$;ILjJUYjW}&mzL|2A~#k2}ra=(Aj_BhjGNnjOxhmxRk zA{YhfaWMjhdU(*sD&|<|yjInHV=KnY^uy!fpg?q(^7J(2k!G4AD*Yb7usx3K&DvCk z4fC-yLKWsEs5;K6kokIer4Hxm-{&M#=weHLHXR+A#HYyme|{#OT1>Wf^CO}>^xqo4 z-NB2QFIT8E%ABoPb5@mlk5nPuBc>3Ba?|N+FFXTs(K4CD-p5<5c%LVbae8&v4~U0b zJT|z7Z9}_iW!l4kF}U?)o*Jkre6`vpQ+5X+4l4IPM)w_uL$_UoH&Qcn^>TdWkWNV$ zP;Furr|~=k%}7uw;wk+4a15MBq!usB;u@YZoc>^`PAbab9%oU;xv!qtRFsoOr2rQ* z7Uuv7YWR+(+Wp-?J#FRsauc{oM7Q9~>h4?l21~eA`nJlz43qkFy~-`i3_jwMz@GA8 z-7;EU>*r&oH8tQkprR(E3(>6KEic<))@8~Sr85T(-~SxHZkf3I4zli6a`I!+T%)t1 zbE#r)lSO`YdU|?}kyvn~Ck3PH$>{pV#SYN4UE=9lYtO=zTrgWANwRJNMK$pkA`U{kI=|Fsc+sK+Ogcl@ zbC*y<&{CXI|aJt@rC+3Qf?I2 zu#fS|OaUH6B@}d1?Bc11Y7Y_x&0J5-_&-cf zU4Onmd{PJT3YPyD~_mrJIlflb}Iso3fJB89d%?dyVC)h0gT7b5nA1(XV&eriP53Q z4L}$~=2>+wuRx1+f}_Q1R14B$Tvw|ov(tmtD{+-t0b#kl)DPaS`3C0z#x*#HlMZ?y z%O;S8Toh6N$H))tP*DL6mLNn{=2S!m<0O+qz-AeLt(J!;o`pw6*DZ`I>SzW>@Hka#njH@#l%=*o3gh?SK(jfDB^nE~B3%KpL$>-%><& zDAk-^TDWr*XHlGGR#4I^@Kj~CNylO=<)n28{TUWY0^zroP%~C(pFf~OPaquw5_@MQEtG9khAGF1NjU)*b)wM)SkVKWU zd=?CgXF`=786I_FvO;le`G+LEcj|p5_<9Z#vFJKKQTz_urhO+NxA>rV6)C>s1TfM7 z86+fauG$`6!DXp_<|uVaZi#`eD`GeSE_vjSiT^~TAEL-!U_|wV^PkefO2nlx<)5_h zhWdB0W&|+_L4%k?2ms+02v`Mlx<9JtRLyC>hozuOVaTf*pE&tO)%kHl1_Qv6~1b@WUY zg-YlhD9!VHF9rCqt}cifr=>LHB5;*D!tWQMNzUM91+Re=gVughU(%S8(`RTr_KA>H z(C5f)fYw@!d;u_Bgm)PIpxyR;xg=1Rt@C5-GjZ5(ZI;*S^6?o93Qh^8WU%v|s$U10 zNkD2YBQbE-i~Sio??uB9L~T4M4puS8UFdtT)c%}Ba0irVOECbGE|yF)&OeprC|wxZ z@QB4{fsVh;>)5q_dXcgO zp!=Z+VX*>%dJTby!rtK0-tbEMsZacx@^!V-qH{d-?p#68H7&aBABZKKOYkVN0+0h; zp?KWr8KCJ~-mmXUWRslo4?>3>@#rMK(3K>@()bn3L>IckH_*lzH%SvPIw)iJn3ku= zBK!_34uch`;}o8;pf9R@ePc%O5=M0>yG6M;^*$gS;sZ}k?fy!D)FVW7M?fw~oQ(q5 zDF)2er4a3h`M(0>=X*n7(1ao)l5$5B8qHE}q-ehl9x6zCcP5n5{)}w6`A^6iD+Fpl z{)24$KNFJezfH*OQ#3%T+K$tLGUk^eEhd6n(8dxk78*A$!Ez5?EET$f{Fr6P`rtOx zTs_m#%BH8}Uuq-&`5~CUV1H>2IvBIJzKdivpGfsRT5JD969C5bU6 zjB=fOo0^P@h9>&$$uRrMjB#X*LN*b^>JQk?g0A=8%y%nMOm_ipr3(na0b%Tk#XAlg z$udJ}nr<9AcMV~5H0qd}Vt0*I9Fx=gNl#{FGpp*MF|XW$8{RErHZ<2_ehQB#b)N|3 ztVm{vbaE`BfY|OI=qm(0>~}Iey@_UJB(zHL{L>hs+X&3x@d`$Cj}YVQ(Z?{e!>I~# zUbWowr)=2DuJ!>gmhC!Xq=^y1-Kc+jw*};GXcKA22zVRo<<@K%j(t|Ar~KFl@V#}UD>yNP6pjH(Wi<0-e`P^732&EC68cin7;lBx{D)%;1YJ@ zlcB_1W2ORYtqK~KRgRCMv&TqA*22r`)EM`VczeR1)|GEc`hlLc))mf)icx!@DDRJx zokP9ZrM?<%)>}uvAxm2n)>uq?qlA#(#93-KjhU|M+nDa#=p7W{qQf~NJfP5;J$9Sz zP@Tc0Wq*LrwZVwQeDoLmKk?!`t&IfYlMI7PB``wZcHBH=ZW@)$2mgQiWl@U+VX)D` z!0c)NIgI}oQP7~DGOz#}WBuWzFWIb2ZeQP4i}gl9WBWabi!|2O`XeUlFC{Mx4-Jpy)n%nRBEM(UAf0=4V!pcu+b@6?XWwcAcE0s%C^ECq z{2lFAx!XHC(%-T@rMFikq1A!|1R|eT)j<;?^1Bm%!v1;x%Td;4!qqTLt(aFzsZreV z<)I?8Ztu^1wLZ?}S1gIVc!R<}lt$CIm3Re~lJ6Fn9!cPRu`9*Oqwf9#xfZchW*#ZK z7=4%x=`NLcbvyv7a;l$@ImL&0)mc%pN-;Mn{sPRPwcT2ye_YT%FJA`_^7F`h^)s_MJhh+VzK_HE9I?2=3zR#uLRw)Y^qV^G84OoTPIV~ zAtGm1&3KM~bsBzOPQ|!BXHHpb_0yz($qRTNgL)s1O(Q^CiXCbao$yHd+#7PD+7hpB zT(yru&69DpK|`~AUMG-O&*y~D;M}5w>12Ygk3$(FFM{K|QFrC_NT8)%6GRoPLK2nH zV6kT`;5Y(xpy@>^Ixnq8h8^9^9CLjNKN1pUEf4Yt8J`SsX%a%`CcjfAbC1eYprEPm zSbUqokq7VyHwvO};Wgl_LYld-ucW|I$t$e5jk+n-w~Da*ws;2@Q4ymdK3RFTHK^Xw zEoAg?fMd6u9pSXWj%~4=fgj$FD!q1CvXf$2ko_h%-D*8Gm9=VaHu24aKa`c-Y)2vF zBQ|P!lVwXUgtcn5y2@y)y``bnWO#+s<6@;odjmiNTYZjbh+ciI7&frX+O)N)(LHSt}L6Ys1m{v$pv7E>HpM64I9_sRn8 zjP`(qs9vZ7X_^Ml?Yl8UaUee^Ph2W8 zxy(Pjv$d(Bx=k()(kjg!-`>fl6*8uVQvsRsunqB}n3u^kQik5MC1ZSUoh(BySyE&6 zK{Xo1iGNUa?XKGRIZ;xP0P`eepPjrW)&W2)FBtkgE0*I(8RvGu{>GKe5&9gv2;`w5mYr_1);<+JN;ot;E322g}0TQJ8qOKq}WsB&D+n^#36>Zb4r6WgEoKrbj2*H*=RbD&1s8;G?0ak6Gz zy&OyFHj<|?;W0eLbpe~q4rMb@13#SF+p#fCTsTD8@665pl$9hd|7mFQB9WQMJDsJe zKYtw-Eun>!>D>L@Q=2E3cE9?N!v-K}NuzMoZSo!#a2>zP)W2je+$nkA%n+*hgKK9R zk^95zD3ATIXK$cvTp|mSb6v9gIu?lQj3B!J$ruA1w2Z+5b7Z{&S2Zl`<-2l+)a$7M ziDGW+#M~`qn&0%ZM`c&24z|^F)hH0ngozL^wrDPSI-G~hb_c^iGSR5z=>RSrlXMA7 zRgCyc)G{kz^mM1Z{eS0VvO_J(0VRV~4d;2gERmgOG;*vEBixjAk}z47qHdYLX9r|o zD9m4LBiNCLj~zhERI0inZbs`NZUzw`ZB|R}^k0dW2Q$vVjqta}Q85CWqiuHm+Le?A zFfWml`yFaep19~q<)j9#tZ0;fZV{v423g7) z7ZStV5$GZ|S$l5P2@FKnYN|Kg_XZe`fR`!lq+P|MiE>A5Vod4uutbzG2PMeE1C?xI zy`)-ng--acsrm}u%`3}|y2B3b;To~*S{)^ou`c=0`s3&J5)9aJcmUTpRo{=@X4r5& zjS<+ZPR&~OLp|3XQf?ZlO&Tp+SCIckV)l`(m}CDHaFebL@1BT~?$0Lla3g8kq?e9% z$FJh(I2^Va4}&QVpW2Yc2pw!B0qPXH8|CR-;3lOPb)0)Wd*hb92Y7-Gul(M60jh&VcBY^UTxfAc$X9iUs%{Mz99Ko0y6FA=?J zG^RjTz=YA$iz%|{7P*&9W@qG55I~EijP?Se6AiP|S*hc_V%M%7mH`Fm5^V0-Q;}8r zOHE`M;w1+JhZ*Ok$#A2U=WFAQ!;XhU8HX8(1RAh`+BtU>&yAfm?3KN2##e)@hc05z z^b%BQ_J;m%faBW9^MMq<;nJmY*Ne19Rk6H8>a!(Mvna}!WYQ?0ztAj!>QI#7!eErw zi&v}h$|@ii5hhIORx+PmfPv`IoWxPcN_Z0r%jm?1jj(>!|1mv3W1I2`9ww;Yw@~{; zh^$D_ob^%@WSOXg%FWi~{IA3cX3gpr(BIy}C0Ha2aEY#6=pSyLr7IfeEhv5z_t4&j z)c9F>G1?`Z-O(6;YcVm0(o{f_U8dKCg}f4Cp-6M|;DUEdIV&od&KGhg>83UCUfb_G ziO~=k%Sh`%uZ!Rb>DOA3?#z(npMsUzo)Sv1?Dw^QZOoG=kthI%zJ%gBXXMyBve8x| zmTP7R==Rgwj9M;C_FYBy41+)6z~Ji4xJ?((Gw8F6b>~u3Z0&WLA{^o8yTAzfM`~GJ zOQFBTK?92$Cs+02i2ZPVXz}8*-;c(KCz;@6eqQc3#z>VEm z7G6{B?kL7eO(Tn=l&bD>-kpd5lpgDa3jcR&Jh>jKfigTBR(5~$Chj%)2LlRjilaDL zQ0dpY$e1;PDhvv$=@4EiYd*Xf1K?rPzeavTIzdN*MhByNP z<#=B)9x#idJg*K%+{1VH-Q0Gm=y65&r3GPluo}S^`fjya25dIZlgt&HR zvLWL0}8&r{mJ*@R8KW8EoWRto7;W*l{B~Z;(pdQ2@;@ z!T`qYqe-)ITX(Hwcu3zshOU#vuZ@_7uA_#aw)%3M1J9zLBnR187hxj-t|Vm;Jv=tt ziewhQ+tPLwTw@>?+==zF)5E*O{jbD28^*A6qe=Z9&+GwmA>^bm{qmHqC!BlxG zkWKWkd!@w19bYjf!R@=MJ1Bo>Nsxx@i9_{9Bv82Yfkx3Un1Q15iM9!%S7>UiplgIy zN61P_j=%e8tah0}cDkUuvXO)mQ(aekCB{`ke>(<#S*iL7=A);4Gj0G7By7W^(XU|J zSvju<(n=}Q*Zll`yg>J*>WQ^_o=N5*Rh);ev+V7Vcgg>?FT_yFlw4ce)Qhqhu^@+b zwvse$zv*RfX~C>mx8@`f8C^!L(*G_!Cddlzh<` z!_0x5cm!J@4&iQfE!qfhK-Mic@lubJUj#KePe*P%;oUq=Yn^WDE=|jKByXQi6=s3q zDNS9t5YE&Ajx(tcIc_*~r1BLA&40xEI5yd?zCFZ!D5g&f_{DjTR|^t8@Z|*(xVdJe z(LIw4Tb~~dqBsk0bg|(5Yxg7+j8$35k(@^KOYK~9$M?z(fw=>qx<{F@28zcE*tSgT zKDq4(SgA*A(VmgI`k&su+pL$ZP4beQAL?8lj8!$#W(E*mjU;5cU>uSQgygeumreY6 zrRAI+HXCx5r?XoGILz#Fcl4E8a2P5_vG06B64xExpm^ig`() zLQ^ySK)asUKRX(aCh)ct&B}vsJm}fST`&MPmu6{D2TIIoOdvz)P1=$#9i!J0`UhdezjGBY<=>jYM`=krtc@yLuAPS2 zm?Nr*iq4@YYxsROsnIZw(0&!`UEPoPS4z+hQqH?GcKFrcVenC5|K#Wk^hdZA$q?^m zINcI`12g$fau1B|o~)ubxX-s9l#^q+e`9N~9)o~tRWAA~e>!}IE2@g5qFl{GjbEAp zs7RcKBN3)Hgi{NtraCp?Mxzub^? zhEC4n^-0287m`6y>9{Wa$n>btEcg|3LubIFT=$6b3<&3r+dEeWHL>iD{{F-?Z8L^j zo6o2G?!gHu{_5weX0eKd>qFS0=-E?ZQk!br zXQCVI-3|V}3x&kF^6C(C3X6>{hH_v|cB~@beCsZM?ZP*nJq%B1F>OZ4!0r_mJ_8KoLYFxDZ*t$qj z3J$b)VCo)|5p-Gt|^Dhx;vTTD`LtBLR$jstv_+h{J| ze+$E>V_1{xzLiLf5s zZDWcjFSiU*6pF1d`sIfyp$Xt%rzpdIy}NluIkBv@tV34p;CY#^ZtKr!=3k$*KbbNA zQu;_oa8rC99LRm^Gw@0?xttpNlfQ&v6V(C^3D57>kc$&+MIz9lWMXUb`rT6i%I#LK zB1r1Koswx(n=I#Jj_eIq1;I`VP06G}d(=uFC*K*TDWM^MR%k}3zgIAOpUI>T^vU!r zNSxc9+aB9D+SHfxiFMg0GETm3H2#%+S$BVU+syBRbXI2pAUe~;pf$WZ`uwl@eG|Ms zBJ97B8ys_Th<}0KYVm&$;Gozn{0pGFb3D)=TkLDg(1Fz zn1#ww#!ky`zGz093PhJ@G9m=KPM!l!7QSBJ-Ux!&Gp2u{4dPw)M}Au!a)F>`%fn!0C-FX?o$+Hdh~?$1FX)e)g!vF;lYnft@AP z|9ag^ouHoF5=UW8f{3VETab16$pe6lINTdbe?miaaKSo8N?K4fyQZ2#%5lFsRxsyc z+5OEpUb5O!qtNX5%kzq>v%1Iw;p&2A!6`|xXQN;EhsU?kq<%Q}`Fwej#-X7>nlsOi z*kxxM(Q|j(WazrKc3G>i)6=@e>ow66skQ9W#x6Kbh=#1^+>!_Fg@pnmWjVBeZzBA6 z2XZRqVrd76z)2eLzqmTb?y#aZ4W}_1+qTWdXl&cIablZ|ZKJVm+qT`Hna;cB!_0g- zKVYA=_Ve7h_M@0*vY@_{rF9=iID~3~AOoF}Yrv|^C2{&Vw!{I<2O2I1QT;C1E7f2< zDh#x)3$rt!^Yl{N%k+%?4glg2*#+{@+8EyP?Ru{}PL>eShYbQF$FgwCIY6t@mthzG zq#UIc+q!T&I*i|R#)Q$h1onE)OmMxJ_XmCopfILK_%yw0l?F8D~?T zqokD}H7&&SyoMdwRk2!do#!!a$#tO;q=>-b4yac1A^tHgc`_%RT|P}VUUVj*YySJp zef@@tbxFc3Q<@a9g4#;lllwPBoj}e<#MMWzNb5;K~kHL z+j^=xK)~{hDakkqKAE3y9gr`1s>e5i>Hxi>1JUwqDMZFE1uLp5&TW_~Pu;@Pk_U~WYjy<>t#aB+nngZSY zzHkTA&bfEH6vz=Bvfa79%`(g>v7Rg6!_57bYSMVG;HeJVSnWmd`lhHi)c60~cFS*cm4px=AY}gzmi|A03PDFaU_%*I9qS9< zd998voS7yfuwGaS1eNi(TAf-9)hq=4H`}IlhB4wQJGV2l!da`E>Mp*QfR?{7&*ZBt zzZcTnN`Rz;N8S!8DWlHb$+gCvrx#t$FM-cbX8*!hDRB@~7QF!o7)+60$xP(NI5*?B zLMcq7hHB#QX(l?u-Ym!Q0QyL0G!ll1PM@k{C!w&MLQRN+Za)-?5(`Nyu`wPexzB2Z zo)4K2oT1|CcvKRiv>{`E{$6cqfadldB>c(r@A&IsL*%(Vp!Me19s0knwuN?uO7K4 zoW{R*OWIU&W?!ur>ag=4rOW7~zk!D`q@}By_*Ca7*C3 zv>}}&@@Al{Mln3IQ!_igZC%KaJ$*<$yHy=Q(Ei;7N@=vXz|@wc_e&X9L%2<}Oc!M! z7IKF{sukk{`mFkXiO6lP*tZp?z zadG0P&p4rtwM#dJX({88Zr4=!9ht6w+>EOa6p*`Ck10gcJHlGNKbb>34n4HX&eD6w z=$KVUW}gH~MOdj%Bs1k1fCRzH9pI1mt8qD_FU(1Q0ITq*0CuGj+J4E=Ai{Xqz`-<2 zoW2V!TCH)Ed~SBsg;}=F>{w~H1~SIJNYGI}n#fFQl5|uHban6sEPOIJ%6;PrH+eA# zE;lS)mE@~N0K#~AVO}6F>~*9uNF~ZLnopoS`sRS|IKyxE@rx1_eCu&AYLtRqRv)=) z8m&O34JB0wKz~;nLVwTtyvS>wHB|Mupc}Tk&j4Si8iy@P1^(NiHpI?eK;X@tf5|0! zn9Xi@AmJ_Pz$`5d)1yEwV0quHfpBzbnJunGCY`D~Z_yx6k(0eNeD`#&WwXi++xdBLNa^si2)5^|S1zQ{`oC>_eVRbSpJJ$OlyX;Zpb^T&^y zP90MWWmefYw3nV(L~!BUbM)9a$DnMc)UNg`eDcp9E*HYynqHf%)75M2LtOK~x34s> z8gwi+ui20^dEL!)7A5D%-HTl?mSwtEZFCmXTk+o}HkT!om3cBV!b52<>%5!6+^eqR znZ6_eZZY}FjGT1M--A4aHGNt#rqZ>f==koke>PuA;N>BDfb7peQKS-N*Dh#h>p7LptGo#Q}*!Rc$TtBX8(pY%0 zTBQ$8MPTENujAr*El@m)y&OZwMq4m*3!QJg>N&K(V) z1b|QIUfS1DQBZrf0`!6TXvrk@u`JtOZq$=IGt|UZB6Wt0*5EmcXv0mx>0WJ$0uNp% zLxOW-k~kPk2Han44nw_YB7=7{=zFX#7<@g6<*%KW;gc0JX=x$3)KuoF`T2BsihBVD zT)$U_neCTc`SiNaz0vhmDj_;>pw)p80=?&<$g8D_4ewxm6uaKu`(R+%?P`~A;Art1 zcn(~HeJU~Ec}j$}bD!H#%KCiZt@&%92rWHC?O?X%^~OEm%Zx|2t{QsH>=?9?WzaJT zueM$6xVX1ek>~FWb;t9UaP8D0@uo!jfU-!^XEE!u%IV963#9Rm2qy~^ZX+%X; zO6r?1P4_2$ZptLqy4U%MgBGj}gK=g;i8Wb$$YPv~^s|NHkCU#Wl9Ox8&pz6M(<3gJ zMdeHl+v1Fyq?5Ibv0Yh@jfun3Vf(Z}Cj)PWdW+H|`X#*cMDugq z*54)=T{uIBHe)R9Ddq~GTBkt2Dx58s%|GQ6BQ|fLpBf&eQV8ru#yBt1FpV*Sm6FyfM#E4JJUu2jCF_aCu4N7+{LgezduDy(l%RC;$^%9Z>VW!;@=f!}t|_0;5MTO=7ngg&9xU{dO(C43@3Hw$qN zDZr$dT5ZH2{xgK(T_5IxQ|X15_%q=fBDXUlo5v9dG21>Vb&t20m{{DM3@Dv zAw%}!8QM*ur|1{t+@J5h`1K=*Xs<}fP3J6nf?#U^5~&1c;jt+(d_8oiCYEN2aTfN^ zacmMy(tB)_3Q|D&=J$e!COSn6J!7dTGka128+paI^;vQ-HPo{L+=3eG43)7{(ax%; z?X&I!@>!pYBm}&5!3oTb;iwn!g*#tKeGT>+|i;fH?%_5Yry za{{Y3^1(nr{GdQU*#0M4Zti4gVw3dOn;zJ5Ru)71x{^JWwc}(P{8_G1j>7y8&m{Jd zCze-~XYgj&lh*{gk(vFt|FrGlY<%|Pkd-H+V3JGV3?6Zk%b!Q!RsD4rbzp6yDXAzM zjrZ)DyQ9bXIctZz<7Mt4*ALPGha60T8K-!!DL|mJa*#eySYp^8Dh%{tQf>lxaoB4OecL9F8-otR&0!R^%ke3bEsF_n-JxI*%J=hz@!+<#pXP6#-=QFyQa7gxq++e^eYu)*3`vsiIKqoSh!(L7}+= zns1FJ-FsfeCHxbvSaK!vLmm6p3C=~i8-$_+M(9WG=Gx@QtE>IgC&#`sPUGN_NTcqu zD`w%4uR|3@uf`AEOg+C)Qi#;?b6IpwC-q0*CBVFXdwa4+vt)6BOc_jeumdy6>U2Xc zHs-XIEV~{EBiyn1`ch)C)RU*bj$YxN@g6j0>qqN@FL>-6=ng1E^u3SMtWtFo2}WSm z&gw4h&hc_-2ek289K(pW?M5BAHil`ba=|M4i0euU*tz9M#^OJL&t3c*iqE?MbB-zivpRU?UDcRYts~5$41?&uUJy3HfInE4! z7OTT9KE4MxDoHXL#&7QlcvWih)z~3R5nG%qDN^>xtz*x#WyDO*BF?gCL;Ff+gnq;6 zfCl3m#$~$~TCc z?XxT+eJ1^G{R+Xa3=H%b*$`@UqI2-yb*hRM}70>E4H6y%^D)q7|Lx8>M_{2SGkpsmk9;c6Jy+_s6@)Q-@{MDT8kzXOC%{; zmSmUxlE~u^D=##Ee^!6i zSR%*N&UtSOtCb+X&d;^Oa1H>GAnh}22uO{UMC?@NyN zb=yhKL$34nZ~d<+XGRoYj^?i-_0k;Rar)z|hwt>W#lo+A_RC{bjL_rM@hv6IPqyc7 z-k2>QRLbxM&zkt8qSDX5lJhxSC;&Uq|6v+&*w@iV!lY_rlqGX72F zTHUi!m=b;ac(2k^@aRf-_NdR#9$H73Du)VzlBdQIatbNU zjiP6*29~Oa${tn{M)Xj$iMEP-aWvXO+eHj9KR)})$jb;&;K<*}jZG+rQ?6o8W{P8A zav$KbyW8HxZ8SJJnrAmGM0azuy|~p_?Y*-6ysc1IiffbY{pjmutP+R789He~#<4l6 zvWyW|EW>YRw^V3pfnk2%{A|BEyWK&Hwz)k$Ct6H1|Jz_u$J;L(2jFIAGU=nH!y*%hN z&ImHvOcbkYvq5z|S`@eA5&YLrk%YZpb|py)yZimX+C&Mi8&5F=%VwIG5prWl`ERe# z!km~UbnWyk+q*hqm6*Zk>&H_&(zVi?Se*X3J0bpdReABjRSKS|1nBQ>(=yEgkq?ju z^}cn&78z2h>L=M=P6eJrY|3pQ1BXIB8`U?P!m;Fu@B;EA@;<7LXG}Pq5U+5tfyVeU zCUMJvj*MTovX|QpGvw6q8QNZQLwq^n^$-uW>|SvH3N1XAYxY*a%=$a$%<1C}M1y(b z0a`6|FW>!FS+Ay+R9PD|5?&-c>3qpCJN9j?RbNr4?N)rC&5t4Y#`+#ki;0*)Tu#w~ z(B!hyy}DUKsj7JNF$SBWNy*7n{z?aWqIEyOU{*3*imqn#8ap~&oTWsfo+z6o@gfv~ z7XYp9SP&5*fl0Zv7#gmBw5TOce#~%Gj&sAQH*_YGPeh(h^dJ@H&YW1^x2%UKz-ac@ zdw5v779EfM)};W8!@|LD@5F;fxM}^%H$jm!hvT2wFcaX&Fz(Qs)08fm$<&!2XVeam zp-e!~m<82;NRbyKVtBOP)u<|o-@(k-<*jP(j#~!u$~x=*R~~xWx2{O4q@D+y{cWZ zhF*=6HWXn&EBTUTGJ#8{lPHeS5?&0b*Dhp-@|%jE)YKcop@6Gw$WAdZ6Y6NCT&tlh zMDAnfjHBHVPIR;-DAX>1&Gz)9J=85wmg_Yg9Ziue3OXyZ!};Wv&eGr14jD;JjT)n= zq9Aes_#zfwVF$+?3^J5;RRSeun{n#vT8liY19Zn}DNCK$-1$t=Kj%GYa$5lgZY~l# z(4ZjbG;&(T&iL|t3$KZ#<}=rdLl8Aj;X4A1DVOap8R7D)@?*|$ zE=JePtvUM}p08dZsf%Rc#u;p7x~;~>D}jtzj%*4kT=J8%Ks`yrNekvat8!`nCcLl&*~n8 zz0%_Rpv$PeUt#;p1Be_*yk^4wsJK(~lQ|gq(_GaeigGy?f@4>w$sF+MMT3NV#+@$r zOT1O+^f|a+-s*$i@8?13pA8w04E%*xY(L?H8|aPPcVrlxJ05m5t%ZcL=)>{LX(Gtb z#Jf5F;hiIMF=xC8Dkh+4z-X_;-*OD?+$7%NK1lO`IiL}>fSX$GGwU=a>e!P_;||n@ zQ-np_EpxFJa|p)!NOpRg$QAn6ouIIMNwoiJlArjG5pson=>yC^XbXF`7hWAfTj~&R z%KJ?CzP_1YEWe>(oxO=-c`XFv`lhLkkvIc-P2MmvO(x7iqCf$4DR-#;USF05UV0B4 z(9A+eln#y5$lk~R7rOxkuzejHOnGs;I@*X0CE-H%vk{!0K}PEj{=WjzwBNUgKwI)v zmtkUn-dYfkq%}fhHu58du#vxTB{G7p6~BZFScbp zq6eI>Q=r|K^J{<@ESR#O0wNn8Rt(2w>|j5_g{v~Bqp@A1-3y8u3^Wt{l9nSF3g=Vy z9|c;Y6%_+u5HG#YK0$>DgA=UWg#>woV-LgvD!~8@x5cgRT7Z@f_j0!BURIUZu~AnI zynAQ<)fV}*L5}URu`<*w?$S!Z4ncyF`X}F#0Xj9J7X)CUyBrfDtsEn*9Pp3CX7&dV z(^Eenyyulv7h{of@V%b*oR*PtBCj!}qBn)GBrMIvgW3bV$QCGF#U;hC_I+Bx%$^)0Tz?m3*)1s&B9JP%LTTe+C#zoXmq<{8j>5o|RE_&%Wr{QSt zP+o&SToG^#sw_pop2(`8`ptXUVPB1>ptL;(ti%V!W<-~p0xIMsb~9xhL6;M|x7F&n zUk+lbyM-5J-^)kp>9Kf$TI|UF?T5Ec#6^X%hK8XgvTLNB-_WFbZaPI;RWhy|iRJiB z0w482lRZv&W+$)Fx7=jny*x^xCPD3lr@=$-aeknk6Hf}1hJlrV`Padi05!NkNzd*_ zQd3}9)UQm4UqknOJqD4JfiH=OCui(6@&{|?V2`_pHyi?QX$&bEb`y=(T>k3#$zGCU zUR)Bn|AK*oJDq$%Xx(*#&Y(u$Kv>_2z{`T-vy*2e)SqJ2n5(FuHMvzo->7VI@Gl-+`n2zIitoIF=t>PKT)}UNa=&8)GvWoj$Bm5+#ECb4|A=T6Kip>% zvSj@V8-|BRiXj!(4Vv@#$yYUG0$*@3a~@%~lao<;iwRRu{=v>_Oq@nt{QKu#%j|AA zu~kf_|m4_HVoVyaifhEUqB`K3Q17 zLN_$8*-_Ib_1v0t*OS$+1-c2j-pZRd5@sx zT>aty8aOtHmbB6LVf=8nL^i(sh0WUrP6xm2HJjWsO6MkgH<2f{WXrlImuGa(eoX*G zQcAcwN2-Z^|H==yD|sl3g*R#s;5#hUK1F(KK~aS9&BB+AWg5<%#06jvzYW`iQgage?a#&WW)_sV#h-E@=Rlk0AV1Us@^*E#_;eu*su23Vi{;J<5XuV^#y| zHQGG0bij-cudBx5of1__YTA=j#*w-q@evoK53g#fe@NjR>}iEg)0MD#4C9ke;rM$c zj^j67oerk28^@m|XQ(B-zAtGhouO#`Oq-{$DzLLk)q<*fSJD#K&#x_jqCW+!A65swLmba1%=S%HvPn#Wb}YNAr%IBn99P8E`l1QkN zV|>JNPY@xeFG_BfI|(YCobx(QtSO%YVq+JaFmj<)X*#9hM%k&}`Ys&i{8)WN7s`M_26Cq02_@z@*V&gH}6v ziiMtE*$3^U=MPh;n*!|owH)O}E_*ogXIl1W>nuGJwPqGay&3a~VU{N_S}FNa*QE`P zTKu~m9?{EL75CHh{8hD2YAIv(nyPDfTD)3bGa^NXUFf!czxMW-Vxkg$R4r#Ge96;L&p;g!kt znoA98!V0jTc>_&^?>mw=fd@0EW^XV^f1OR{Ue1U*3|ipvBR;N4&n&=&e-T@}ka(GL zjbQVH93BtaVa`s>N+3&)8zJ%I2AyhR(e1&Vy+49E2?9{fEA6d0dO~Pz@z804`;~%4 z(9!Orya7|=Xcfw3BKa$5Ub^|5XkNtU{ukJ>%IaYrog}dG4wtZ%cJpgw>1BiX<(jEc|KBZ3_?yeYQeE@ zj_M~Wdj|B&zhFJ#UEr0{gLQAOGs9*l=Hm-uZ|lU{+Cd$CFPh~o4ibC*L0IaS?nn0L z;_PJ?iT0*7!WE)YdhmwtYVrXsi%7{t8sYi$qUJ|X!`Ve`h#dC%8;B(fQ8O{oxsSSe zp*aY%vhok{jp|h)o?nyxQ4mB5SesPS1ed!ZY7YQN9EhMh_xY*GlkFIJO{&hmRsIif z!Jl<+C~u_c!y(&D%eA9$Gt*;h&g{RoiwU)#52-lNQ}&=In@L4hT$cX0nVo9wFpR*t z=!QOC^X%9$6Sx@h?cRon5OHu{U_Xe5hGyvamF|Q{8TTq);7-p%V}|u#b#2)2o?CY z)KOe9R#lPh^oxcsJe@ZjucT2#MS^)d4Y%Xa1F*Y%#xGMKS76$MLxBFfmjA7no^AKJ zLl`V_2OmelS_BOJnuqPD?FvGf(y=0V&#z-B# zQtaZV`}{yu!seHrRuKXBldomMgrx@UXHX}a>l|d!tq4=UoR-K}a88GCF;D{3<8Or5 zhD&-DNQG=BwzAzA9TWg5xM{OJW6wK^*@H3DQiP~~17^9)d^o?|!`*dZV!ot$&m)|p`%*>b9 zG(n&8*0tiiR%o9D>LY*FuLT#xyaX(J?G#jN-BkWH{GqzIV{hi(*rBOpB#_(5dDFG? z`Tp1M=4$PW?~%#h^>u`#sehliZvf7t&QtOp*d4VH`PpxXEfg)yMIs^|i7D~t;+aTq z^dZXQWQeabILw%DlbAF%ZTxg#!lTt0`MQ7N&xIX!Z7*&5p(=}BjCY_1LQ*$J_)2}% z%7h2l_9(A?MQ@h}D{6O0ntin(xP7G{n*E6(N%*_RJ3h;Hg!>ql8STCYC*n=Q?KaUi zfI0Xc^eTu%m^>Gac-I%Ex$X!7bAAfYH_yzpgBX*!p)->$mG43iuj>YRRW0Ww)lwvGzPFlT#U3&&opkTrypi-J4-IRe1>w4Uv9UH+1VYDLYr!Y|!rB)D@sT zk#Dt^Kb7ncWOQlcAM>fWJ8L~xG*4elmgIJ!DYVNZ4dPm{l+WEqdh%&52+O?#QYfb7 z70oqVZIRaruF)0=%rLnQrZd+%M3$Ose~QRt-1Z~zVto`tqw;D^xr=pqTL>d8B4lEZ zTCL(Nnw$>%6*Lg$@?I_QqpK9Z=7JBgwZI)&%pi^$FMjBFq zN^!^08j3KvO1DH5=r$v=upGuwfz^C`P@FUtBODO;|5#pNmWe5~Kl{)CH<&7_(9`B* zJ5hG+J~la84`_3$+NtGVf$|StPy&U!hLcpUbcneJT{8!8u-)N|)UPbvBzu*x-Jy-J z-LdwP9-@7mcV&V0hT{D#=sr+8=v4M{WzB`V-me1KDG(rMHHINS;%`MDei+pd9#EqA zRqUF-wgo!Bh6L*GGeg7y2kNkXQ*S^JmSKr9D_hta41nf1A@DOWr`MkRL$2@U4hjMo z%tiaa28j1jdddDZU#Lm7jJ4!s$2)c97ZtuOabd_7XcDcKmP<|8kd_0cVPBy=v>qs| zptR@ zPHa{>so61!){1(`YI+*f`5Z>p6$i^Tg4Sbl+6@xZXY$=zc8Mv>Q)|TyD|+~nP1mXi zT8`+`+mLh{MI7@g+67nBYva9HSV6HzwlF%n+7(xrFE_CKYv~Xf)(lV8{yC4AI>K(v zh?MlCM;09_=D`4Hp*V?FB16S*7u6vQ9|-jJdjIJx#f^R|+!JN((Xnk4&lP6-Go939 z`e{>whW9uM{FoZ2T(gZon1c-Wlf++a>^bI7u2r5Bf$W&VMwT%6!A0P;@cj=BN|O2D zPz9R`ROyvJ%W}JF$+|0_S9!LEe}^Cjx9_(oE>~aVGUoxs&YQMFMhqHoz1eLB$6)TK zf&Emdq3D_Hw)~mRo_i&(reF&WM}ehb+Rkej`bZ1jWv`SVvDD(;VOQh&Xv zZlpLd^>Bf;)J(?yRG&e8nTZJ+3sZ>9zc=Phw2^q{#F|#ouvJFQQuJ(*J`x`4a}g3A_u9quFO$qCLpIk3C>Bh-VjUu-!?BBM7_9bQD% zcWlc|ZKX397PN>dxx?(BsH^?@E3jUAkQ<<4Kdq#ss08i2mQBz?Ko`nzx&H2?M<3p^ zoiA7z_&&;q#iR$Z$lESB;@QwLqTo{`xc%k^SKx9xaBWqj6Q zar<+EFoq|a$yF}Z#WzO_tvUDge!aR`d_f37AFgX?cE19UphR`ZPDeU-h8DM4BZu7< zQS7u~es2YD`1Q{V2wyPeQ;G8)oc1yIFJ%W;p|)a|&W1@uoHJjRl-_{k^b6F31{ndQ zp@STkm>Z6jT>e2M-(%Ry`-kgV36UK!6z`z<%V!Kl`M&A$MJV3MM@Kv`>B={+;U)7vb#yr&@$4 zA7Ql_2}X8=hod`o)Ed)@R`4?YU5N}(S+@-EA$TVPCx7IR8A{I(8_CBBH?0y`6efz&=_uP@f~L@_*R1 zp*xl>y6rY_%l022#XqTwwP7=mhOjb`WCa;7tuJ$LuQqlG?Y%d18H=4i_e0P8L~cfkyo&Lg&-M%u3ewR4d!b^S+A8LF0Ea$Vw;j}GWT ze=4py+b&WOgMEwU+i%AiUVQghZA@k=F2>JY+Ncd=rOuQ^rBxpIG%SIPd zl`(6zM>_hwC){<9Dh!=l#`z_V_ryM1ZM9ysn`L1JyqbFk94kh00Up=VKhcJMAS^}Y zH0ibkTq=%Pu%QR)At#r-MsdU$x;`WERcvj(O;hsyCGa&oV^wHT@P95x9mXPk=-j@M z!)OqKF?q19=c&T1W8p3WffO6I<=s5#ES4%b^fMR@HZT6@WP^k3I-Cjpn`M#oZ@KqGHREa=((jiz_Zp=|8AV}LkLyAk8b=)Xa~7XGD~GYWZLW{a!qXCAh(f*!AR>$ zz_$Tf821Sg>;L|w?OXnA%V;1V0DaPS2@Rm5y7YsRHJ#Jbb8EijY&PUu28Z=Rmy1%Q zWyX9m8@(*%!uWk+CmC4dU^=HQD2+mbt|D@RFLE^r4Mav0I8}JVzX&ANZXhn`erVp1 z&zJMgq)B4u{PNCie7~>KV#BLQn4n3Y+3wwr|MjF z3!g}t+Ql?66$ZQ$6XXh(LaE5Imf7Wdys%V)BjMk6ezh1;Su{olFfL$ zb?*{d^|y66&Ef+lJF$VdFKxVLLUez^)l0%=j(&>QCuCUN$_G7Z4oiC7j7(|A_IGZn zp0QeifDuKKS|W8_yP@n>Y6&o9UTbHw)>-bjlsXlIn=!Mk(c($3thms2EZ0b3G~8~b zbt%fVtUAF~Bf#)z^sL63*zn=Qp2Uc9bKZa=vyizTQIk;#)g^0bg8+~sAK#+4Ef^a-Oplc?aF1zO7EUxkhw6Bm%Ue` z(%&?2r(xS>{OHgr?gEgMSj=Rb)BLbfiZ25jq3pM%_S{JfXNqwj9ii(mndqn_5C zpSNYuX=oxxH_bppo>M=OvHFmL=ZqmR)AA9epCM?3qqKIqKX)LRSge~2gl_<%}gzZ$p;i#Cc;_HxbjTrd`pfYyhOU7^5eZZk!K!U^QQ< zKpl(ik+I@~N>%cwKyUc6Uj)brI=i+`{9MmFIzz)kGncoGek!ubGD%mwYi<_M*lCh2 z0gZR(GRWWvtyGOfWp;_OZO(1kzEtE|c*TkNQ9VZx^J9R`wKN6V{rSksL7DHnNw&bx z^LpWqee#%vwKkw0hA#Oq(C~MPjeM{-9rTz=diNm*r$av^ug+8Bxa)^bw( zl3L0GwmwB%^=K1s)9T?|d<@pB?#SvQEO)6jjlNhaEr3lfC;_kNf)kcpef)iAg({O)IHehaa=P9RXEfB-l8)9I9BP)U&%_lQ4Iq!wu; z^nq2e(S(ll?6!S2dogl+pq}CS4|hy0*y6?kzb|(}tmSr{nGf zSy|JJwTF`#^K&QJl=RNGFYL>EuM_D;!Hkdr9Xbq#O;oo~xE19FSGCYt6ym1+RhXk? zLu^1xI!@*ye2zxMI(@c607Gjdj5C)mbA~H&Y6PeJ!3z^1w?Rj)oZpP>u-(`&V=?g0 z2pxml1wD;OkuQ6fT@D@VDYw^l-j6wJNdBL3*pJq4F+%dQNszvQ4D6=|E)hatO*?s& zuMb?Wzbf?BT)KqRXHy_`#nY@mAcE|7aS?#-2>az%49~Wu-Hlhbpqt$d#h`A)bxi1b zUWC6SI}pfDtL^EU#LsX_w_piN*1Bnb1|*BM+i)lm8U6@6qd=&&}L_5n_E8t zgWDiJi(3&N!iDrOQxab{6p6v0xvvrCn?T+X7Tl5k$MU+akDSFxid36xYvd(Dq)nQ&>GibWCNd z)lD@R32j6_OClq0qBnP(qzo^vh>_qlb;#nzpl4mYT`_U4CWRXpZea%F`8uV7&7HG} zo)n+t&*rHp^f{myQHpvqd4}1*WWdy=#s&$d@i27pucn7fg!|@AEa^}cf|RnylUcKVn|ilT!&6uK%hbuCM;TMV`z6|o`?5vX%9j7akJVb^ z5zo4&RzV+_Yhg%W`Zs6eez0{J-LigE_3fmTo)`#vY5EA;!;Q@Q(ShekpgXq0+JLvS z>ZAX;+M46~NiowvE)D;ezz0B3>9)T`d<}#Ak_7p&)Wu=~+e&6{KD|r$ARjy{U;Jkc zI=>;Mu#YiZyt6?5t|8YvHKqy#!A~)D%Ik|n;XohjL)vd_H;vpaH9Cgb5?y6+L^_H=*IInQ*ordfi=zJh2J$ONpZzu0 z=o-5)rruDLnTwti??f&Fe;cFmVqslLlop(P zV;U1P-$6Zj}RC;=ky}QvJm4)M?;3%xvK!0Kz0^nJv=x zNjC-E{ za7&d=O)*7Gbm}?I@7dT|{BBtq25Xn0c*Gr5UALD0<}B*=B>D3*(WeNyuT{6^W2 zc=%-dW6}G>ED-j44!4YV@{lY}PY)VjZHhv_yLAdz^5*?t@qEWdvciXNlk_HXSD{rU zpaZQgMB_kboDAHwMfIkyDJ;bkySGYgMq2|M-gCQfjlsSysr9&k%90}Gy{!!9y^M40 z`RF=4Ii-lSQ3CG}J^h-#*^$g*g~c-3PDq{I&yR_$gpT1Sc;J{+mPBhh@Xd~O4ivE- zsVarjgS0}DYC6!9EL%{sW=>qMLiUs+>EZyUk{B=&GsMSJ#cK4rdc3e;H9ZK2tmfuS zZ1dEaQ-}O#yHO)(lQ@}jGF!T7r3=rk9Yy7wY&JoK8gd^)R#T`ek}{ls5BvJi9hJq% z7Q|HGMm|#ZXDEsaKQrn)nzN%xjDq9C9HS3CXDpmh1t4@I{8*Ot#MBEv$+j6lAsFA* z&;c+N1!hSvYsEb>FDw6OU$&Y8Cqhef)%Q_##jd#F8&ygl*el0Fkq!`EYYSL8m<- zATc8YMe&@wSEU6C-7ZNY0?~1BuaK5MtpTxK%+cD4DuTRyzl=Akluh2qnIz%^Cxse_ zT3QR9Y+=gz^2nLr)0Ub7>hmY3JPu?RKjc?}BEOe+gV1}{wFKJbWfHHsjC#UtMXFNH z!?z>I3$){RbggnLMEoQ2X9(Et z+^`ULCF;pFqkF>ew#WCXq=~2!>h^z0;I;fqh6C#nxv?tWV?B;X_B;ob7NS+E;E#jay;#5*)6 z?cjJ5j)GEsCP3GW6WECLd}&Q0dsLaBUKS29O{nBpWIq? zWoFOQhXdmrXx%W_=J?eNHGBnj$N;%o)4R%^M@MrL{4>hp`@cw8pc81`AJcU()#u$m zv# zZ;T`k@CJbxhS@UF!gqErfA)2W*W--e;)Q-+fF;T{JM2AiMxo+o2b*0mH57={h+?Q9 ztNv@PKg2_3CE~0OBtZ#UiYH;oy_&r0gkQy~e9DVa3GCfDhm2}m&OKh9rzdzgY{rZ7 zRFVc8ut<`w;ZVCTWWyW=I}7+>IO)Sh{E!d=X#}0ED#j&#l5P4H&j*#!CO%flHF;j8 z+?Twx@a>cXQDr(G$`Xl(7a;?HZq)O_dI+7bn&c1Up4$Sy$1BJahl=ABZOrFK=_ZtZ zKV#*RoK)8T1Yc5BL7452Z_&bYo{MP$!P4!lwumShtgx|sGBU7~wg&uMrD^MEj6(0B zEH$l(fPZj;R?a9MiFw|>Ib9X#clmEDpmpbX8ZO9hNqs9cST{IFWdfZSkM!uhu$I{T zv6L`8Pnu^JXB#w3<4IhWIbLtEPRH*mr-xtu1~qNDd6Ww%-}5nNbU7s__N<9v#D8+OYNH5x_t=rU`@rvlP-)G19oOG^_D&{D*5Z|Ekj-iN8 ziDZMAF?!J^4EIgHv3k=_sZ zy&3%YJ>Kh9uK*xn3*#2y=e_0^u)d$s1rWFU@pR-)ufbVHBG)jK(pU6g3&h>_nB#!?mz0T=z-2^7Elywxd??D{m}DKi{l_;gVHcjV zFZkv*6l;ADSH@Eu4==@l&pSFu0`=)=9IWYkIEZJX;9-5UzHLFjFQn-wbDQW~uNXDU z$3*c9wqRr)(MBc;!P{d763r$E>E;-?z{?4wp@{I(16dy{r-ZiL_3OfCzjKQUx`wy% zha4Nord9K}2*G6~$a{}^)e2yyswWL7&|p5rlFoRm6wMKO9(NEW zQue6+TmgyO(;Z2ygeuo=09vuzK6HexzwyW`g_Fx8hpsBZM3Yym?xWRzqJ?=7=XO34 z<%G-oV4VVH@hA@2Cf2>2g3lnu!df8}gl>>c-`2^y=Q_fMLq5)_cYm~+pL%7jQksee z@B!ekNG@Hyo|Hqq>hR&o-5_JWoNrr_haHXeR;Whb=X#jEq3h3kphrbiBE##WA5K-C z6~MeL>7CBq81m#8f<+;RW=m&Z?z!6iDQ83Y65I-V@IF=fq{_We9rS+EGmT!%&afmC z+L!TI@t%)z8e$-nik;HGRrdc`(k#}O1pw*NrpmJ$*b|5{`Y)lc;B*$nnYBM0ZjqMf zlHPF?y*+GiE8Z>*;)=UC!qE;8=`Ln$USUM?U%V=}_T$Q8!W?2YeU3N6*m9Ar5XPVj z^HO@rPE#qfSN~PkmB&N%MR5ibV;NyEnQViQEus;!g^|6IEnD`ogvk~rQIy?N+1HUm zlqIEvWGA#JWEo_TJxihdo~gvI`DbR%{hs^IxpVIOym#N7?>DL^Z!pz4(6~Z$`1O#? z60{aWACm8j>A0Vgm>(CbdXn@qP-v zJ*blPVxXB>V2oJSsoE;8{c}o9*nDO~U*<=9VH{7^vd;#__^ni(^g0%^VRjDpWVY5+t=W69giE925n(f}o<3FN>o5py<4!o4KOstzNhvzc1j`Evz0+V*I zN$x?TzeojE7WUzz0XI;Xj=9Mxd#P{qgia=PAOzt8ClX*VembnN zE<&A#WhhQO?KAdi!m~o5U{O5*p%?R1-?F1*eCZP%Qj>&a%4EJ~{+O9v?i{kNq0EA` z9VOJh8McLtC)lWHglf_G=@J!_X`~IB6$Q)g)g?eXIXU;l@c8NHvSQrs)Zq4Emh3@ppe_A`_k8ALwQD~yq?6j`k%)$xU@`4$8>AN)$c{Q3~pOrbZ6UXJio zw4_2YYmwB1VOm9*N7{>FaDmXz=KUAU z^PSxcDgQi$$cm_tmZC0Zu0zzE8VYyYG{*oaO6DJ1lzC z{HN=u&lg(17mTY-o-a9%!>7aXtG&=8xNiK+Cc z!A;C+8FMJ=K)cGtO#h$|nlDLsxoLu0 zbLQ6!3S(a@nwKYjeaWGg3DG2JDO@eIY?oO&(vex)?z#!8OSx{al}qV|c`jZS=FzYS zqb&E2uqBMfF*rs_T~}7g!e3-Q8_qR>)U13Z#2!$2pj>f|_F_#CySwlVb!i zJ)7(9y~egg&!*I_pEa(J$>zLtgO07cx~q}(qbEW@C{$Neb@rta0;>xZ$!(mbRD-K? z8HlPLM%ruAd08{&wD5Z0yT3%y0*ez7Y|dhkE}<5=uL^aD(|9MgY)H{U7gx$6z!$1$ zay99ETo^;?&6EmmUVlpI2h`fFyvBmfRI=EU&|Z~}RBm1xN@>>fj{kpbrL}Pnj-aEU zK!HyMgvo3fr`~hmSMjVQ?$T-SSk#@u)&rYm}FuQKF`oe^7oSqi=E#v62eEB z@W6?ziui80=b z2WPYxG(W-Lvr%}_I#wcr9c2l%IwKWoMq@I+%xsm|^{_@k9@8~&=DRlGlsw-N+NYBaN!Y5#x3eA;M0>!63};gp`lum{~<^Zk52={=`tsx)mv^kwu?#HSCH23XsA zovwsd7~y+lKiSsIyJ00x8Z7L!vuC_q61I#m zUwh_W&qv2%S-2{o@nJGC!&`~@;QV||em|YLk=w^($ zQsiCwIE-+rC|ox?}%bcb4aaTS)+cD?O3MN=fCD_6@yLPD9~F7a5m z@lKCziri%W=K$HqI%Tc{ES@mu9*mg<2_2d!g~HP5Rk8}(w%mjN6mNZLf`G-<`*fuV zq>|$C>!5CgTT$d-(I=>Kka6X?{I$cHy+rRh{rER)NoSfrO`KJjqn(V9Jl*_;N6aug z|GsbxmNvs4i!>1_5q_lCHY>a6e@?u&P(XuSq2dW4hhMIgmab#-nNKs!c1GHYA+b0j#t8>FDYHk z6)hfJ7Z8{cdCw$XQuvM1$|$}`8=-8k?SP`|$S_<$kAFMF`lb5SSeT}yQK{7ZkpoPP zE(pA`gWNJ7`VK*OA|@>J&@#z^de1iw-EV@dQ-M{2{tw@Z*}r+I^C^cvKM-|38F-n^ z)qASuq-T`d4_T^BXpQlLg4GXht@}oKZ7I&z5kfqf*MiVypJKF2@{jl`2E}S@s5bB{ z96;d5bvc`ika(j7lMTJbA>$3I&BTW#olz0^I#wf?99*9m~&;I;3u(6;)Is za>Oe%!SN4_4-Z#(E0S)oGM5Z8tc96dLN@;ov4%u|@@iH@h-qyEaFbA)Rg=jnu! zQ@Xy>Bz4Zw1}WIP?#jsT8n$9w7&2^^EV44{PrFG--p}F28Z(p>PSw~7$UN8@TY8ROtfa&OX`Q5f>!>OYSyy-lcyDB(^ zAu)J$_VS*O3~HU{zN5~E*Pj>`Z09PD5iC(jZ`ddl6FVc3Yu;?CBEyW1!lZPK$G@LS ziD!F$l2vcX=BQfU`lQ+w{kwK$rYg1cbbj3qVlfp~ni%$)s49$$H@88fMTw2}G>eg= zk#cC>IiywNTZY@6IkwQ~*S#=Ok#^bx-0L%Vc_-iaaDExn8I+tt_yuaaNbkoz@)ieP z_gJggWnQd@HZgkosP~JVGm%XAxmWR;6Z570T_GBW-T5!{bZs_tn5u0ib4|bS`IC)Oyl1Ad+C>=k z0(_Xxot!CU>XUkPfRW(anlmZ6xYiQIXz+qas?gb;kJNCvIrqT_c@JSHiEMYM8?H3o z%LzL3cHtzpo?kjW>6TE*N52Xx zy4ONA!oW{WoWF~7eZeHiK6p4%Je+iK^&#HWJ-y*^Yx|TSV$DzsmMDFpqVQ^}*(L5| z7=Gf3bfyr$MX484e|QVk>QbYH)5FkU1xc03(WiRU<+ttMb9^q&c{g_YL7t%)ueNQ1 zv4J~>nlcKDz9-1A5FaBt48_j5|8~HqnA+Cw4Luuq!9>gpSJcGC`KwG1f zI3lt7D*AD;GN!su+aoN}EgH@;vbvqb(xK^3+3Rx3D`I^SC;R!sX>Kw_u%sV*ah7W3 zN$EIG8N7p0uL@6<7qBGdTeg#& zIoK+WBXzHp`I}_%U1XGH44Le?K>Jv~L@~C{G>s*|TvX6g#x_KXP1nfRF9Os87sEt; z_Df2b+?%63zF?c5!?ZEkM%*)9JU~WO%%#0D zx0FCAA#7B?I2Nsk_`n;7kRjFI zoQofaP`^LHhS9%2sSh9A!NX|iRh3)_UU-SK16PNSgOGT7BrrS-qhtoY42zLnkn|vF z2Khw@xdJE>rGIrK4F6-MV5XQ+Z2?gpUQUu^W(@~PJ69LUKamv?(U5QSKsQky^rRm_ zLqeIrFGxUpL=-gOK*M2HfGCUtCRjN@9lc-a=pc~5^au>n%0_MqM!>h53fYkie~wKE z5oIR>20`J1KfVj7oq&rd5P;@7^ot|lH)fk{PXOU~86b|bLoD`h!2r}4uh3sEzC7gd z+#K+RO9;H-lKFE?@SPB{$xDV;@v(^gzssmdJ=P77aO4s=BwJdRe_n);MKsyzfdJP( zPP=r+|9F7!gb*zFAW0bekHcTRXbK9YT@K$xf$Yy3JF@t{xaJ=;Aw)o$9FXKV-wr7_ zvUs7@I6DL_3lPUefXs1};NKzHl977`4oLy1)OqAjPvk&_f#GqL9sQ6cR|F=vPoREOR6bvHo2xv{Ifl~qQva@a(oq>|6t(m+qh2|P|*)_c` z;aps|=NHJX%8c9&Yilwxp9fOEZ~-1)pgXeoOSuZx^EP~|!nC*G5<8$|3Q9_F7a>^1 zlDnYcZa{WD0#NZ}1N1y-0p97IN7%)AxXUft|zet6`>8d9Rf^jaE1*W@#zF4 zz%UDgG{bw9NZ{f;3^MSX+z6}tTd#z9G~`ANXg<0<67CH Date: Thu, 20 Apr 2023 11:19:21 +0200 Subject: [PATCH 052/133] Fix gradle build for Java 17 and 19 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3b6624de1..7b138b24e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,5 @@ android.enableJetifier=false android.nonFinalResIds=false android.nonTransitiveRClass=false android.useAndroidX=true -org.gradle.jvmargs=-Xmx2048M +org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED systemProp.file.encoding=utf-8 From 69ef4a987e92cf393aa44679addbe85bc7070648 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 20 Apr 2023 11:31:45 +0200 Subject: [PATCH 053/133] Update CI Java version --- .github/workflows/ci.yml | 25 +++++++++++++++---------- app/build.gradle | 6 +++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d12c5a7c..67bd46992 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,10 +44,10 @@ jobs: if: github.event_name == 'pull_request' run: git checkout -B ${{ github.head_ref }} - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: "temurin" cache: 'gradle' @@ -66,8 +66,13 @@ jobs: timeout-minutes: 20 strategy: matrix: - # api-level 19 is min sdk, but throws errors related to desugaring - api-level: [ 21, 29 ] + include: + - api-level: 21 + target: default + arch: x86 + - api-level: 33 + target: google_apis # emulator API 33 only exists with Google APIs + arch: x86_64 permissions: contents: read @@ -75,10 +80,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: "temurin" cache: 'gradle' @@ -86,8 +91,8 @@ jobs: uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} - # workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160 - emulator-build: 7425822 + target: ${{ matrix.target }} + arch: ${{ matrix.arch }} script: ./gradlew connectedCheck --stacktrace - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553 @@ -108,10 +113,10 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 # Sonar requires JDK 11 + java-version: 17 distribution: "temurin" cache: 'gradle' diff --git a/app/build.gradle b/app/build.gradle index 6df7214a0..b0cd26dd2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,13 +80,13 @@ android { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 encoding 'utf-8' } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11 + jvmTarget = JavaVersion.VERSION_17 } sourceSets { From b567d428ad4617e80a8f085e1833a45b71c3e5e5 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 21 Apr 2023 23:15:37 +0200 Subject: [PATCH 054/133] fix: small codestyle fixes --- .../newpipe/download/DownloadDialog.java | 14 ++-- .../newpipe/player/PlayQueueActivity.java | 3 - .../org/schabi/newpipe/player/Player.java | 83 ++++++++++++------- .../resolver/AudioPlaybackResolver.java | 7 ++ .../newpipe/player/ui/VideoPlayerUi.java | 11 +-- .../org/schabi/newpipe/util/ListHelper.java | 8 +- .../newpipe/util/StreamItemAdapter.java | 6 +- 7 files changed, 80 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 7dd482b21..e0b1606dc 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -103,7 +103,7 @@ public class DownloadDialog extends DialogFragment @State AudioTracksWrapper wrappedAudioTracks; @State - int selectedAudioStreamIndex; + int selectedAudioTrackIndex; @State int selectedVideoIndex; // set in the constructor @State @@ -173,7 +173,7 @@ public class DownloadDialog extends DialogFragment final List> groupedAudioStreams = ListHelper.getGroupedAudioStreams(context, audioStreams); this.wrappedAudioTracks = new AudioTracksWrapper(groupedAudioStreams, context); - this.selectedAudioStreamIndex = + this.selectedAudioTrackIndex = ListHelper.getDefaultAudioTrackGroup(context, groupedAudioStreams); // TODO: Adapt this code when the downloader support other types of stream deliveries @@ -433,7 +433,7 @@ public class DownloadDialog extends DialogFragment } dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); - dialogBinding.audioTrackSpinner.setSelection(selectedAudioStreamIndex); + dialogBinding.audioTrackSpinner.setSelection(selectedAudioTrackIndex); } private void setupAudioSpinner() { @@ -619,8 +619,8 @@ public class DownloadDialog extends DialogFragment onItemSelectedSetFileName(); break; case R.id.audio_track_spinner: - final boolean trackChanged = selectedAudioStreamIndex != position; - selectedAudioStreamIndex = position; + final boolean trackChanged = selectedAudioTrackIndex != position; + selectedAudioTrackIndex = position; if (trackChanged) { updateSecondaryStreams(); fetchStreamsSize(); @@ -726,10 +726,10 @@ public class DownloadDialog extends DialogFragment } private StreamSizeWrapper getWrappedAudioStreams() { - if (selectedAudioStreamIndex < 0 || selectedAudioStreamIndex > wrappedAudioTracks.size()) { + if (selectedAudioTrackIndex < 0 || selectedAudioTrackIndex > wrappedAudioTracks.size()) { return StreamSizeWrapper.empty(); } - return wrappedAudioTracks.getTracksList().get(selectedAudioStreamIndex); + return wrappedAudioTracks.getTracksList().get(selectedAudioTrackIndex); } private int getSubtitleIndexBy(@NonNull final List streams) { diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index bf0dc4a56..cd71c64e9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -667,11 +667,8 @@ public final class PlayQueueActivity extends AppCompatActivity return; } - player.saveStreamProgressState(); final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); - player.setRecovery(); player.setAudioTrack(newAudioTrack); - player.reloadPlayQueueManager(); }); } } 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 144c754a9..89bdd9d69 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -180,13 +180,18 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ // play queue might be null e.g. while player is starting - @Nullable private PlayQueue playQueue; + @Nullable + private PlayQueue playQueue; - @Nullable private MediaSourceManager playQueueManager; + @Nullable + private MediaSourceManager playQueueManager; - @Nullable private PlayQueueItem currentItem; - @Nullable private MediaItemTag currentMetadata; - @Nullable private Bitmap currentThumbnail; + @Nullable + private PlayQueueItem currentItem; + @Nullable + private MediaItemTag currentMetadata; + @Nullable + private Bitmap currentThumbnail; /*////////////////////////////////////////////////////////////////////////// // Player @@ -195,12 +200,17 @@ public final class Player implements PlaybackListener, Listener { private ExoPlayer simpleExoPlayer; private AudioReactor audioReactor; - @NonNull private final DefaultTrackSelector trackSelector; - @NonNull private final LoadController loadController; - @NonNull private final DefaultRenderersFactory renderFactory; + @NonNull + private final DefaultTrackSelector trackSelector; + @NonNull + private final LoadController loadController; + @NonNull + private final DefaultRenderersFactory renderFactory; - @NonNull private final VideoPlaybackResolver videoResolver; - @NonNull private final AudioPlaybackResolver audioResolver; + @NonNull + private final VideoPlaybackResolver videoResolver; + @NonNull + private final AudioPlaybackResolver audioResolver; private final PlayerService service; //TODO try to remove and replace everything with context @@ -225,24 +235,32 @@ public final class Player implements PlaybackListener, Listener { private BroadcastReceiver broadcastReceiver; private IntentFilter intentFilter; - @Nullable private PlayerServiceEventListener fragmentListener = null; - @Nullable private PlayerEventListener activityListener = null; + @Nullable + private PlayerServiceEventListener fragmentListener = null; + @Nullable + private PlayerEventListener activityListener = null; - @NonNull private final SerialDisposable progressUpdateDisposable = new SerialDisposable(); - @NonNull private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable(); + @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; + @NonNull + private final Target currentThumbnailTarget; /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ - @NonNull private final Context context; - @NonNull private final SharedPreferences prefs; - @NonNull private final HistoryRecordManager recordManager; + @NonNull + private final Context context; + @NonNull + private final SharedPreferences prefs; + @NonNull + private final HistoryRecordManager recordManager; /*////////////////////////////////////////////////////////////////////////// @@ -334,7 +352,7 @@ public final class Player implements PlaybackListener, Listener { isAudioOnly = audioPlayerSelected(); if (intent.hasExtra(PLAYBACK_QUALITY)) { - setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY)); + videoResolver.setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY)); } // Resolve enqueue intents @@ -342,7 +360,7 @@ public final class Player implements PlaybackListener, Listener { playQueue.append(newQueue.getStreams()); return; - // Resolve enqueue next intents + // Resolve enqueue next intents } else if (intent.getBooleanExtra(ENQUEUE_NEXT, false) && playQueue != null) { final int currentIndex = playQueue.getIndex(); playQueue.append(newQueue.getStreams()); @@ -914,7 +932,7 @@ public final class Player implements PlaybackListener, Listener { private Disposable getProgressUpdateDisposable() { return Observable.interval(PROGRESS_LOOP_INTERVAL_MILLIS, MILLISECONDS, - AndroidSchedulers.mainThread()) + AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> triggerProgressUpdate(), error -> Log.e(TAG, "Progress update failure: ", error)); @@ -923,7 +941,6 @@ public final class Player implements PlaybackListener, Listener { //endregion - /*////////////////////////////////////////////////////////////////////////// // Playback states //////////////////////////////////////////////////////////////////////////*/ @@ -1247,7 +1264,7 @@ public final class Player implements PlaybackListener, Listener { .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null); final MediaItemTag.AudioTrack previousAudioTrack = Optional.ofNullable(currentMetadata) - .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); + .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); currentMetadata = tag; if (!currentMetadata.getErrors().isEmpty()) { @@ -1270,9 +1287,9 @@ public final class Player implements PlaybackListener, Listener { updateMetadataWith(info); } else if (previousAudioTrack == null || tag.getMaybeAudioTrack() - .map(t -> t.getSelectedAudioStreamIndex() - != previousAudioTrack.getSelectedAudioStreamIndex()) - .orElse(false)) { + .map(t -> t.getSelectedAudioStreamIndex() + != previousAudioTrack.getSelectedAudioStreamIndex()) + .orElse(false)) { notifyAudioTrackUpdateToListeners(); } }); @@ -1361,6 +1378,7 @@ public final class Player implements PlaybackListener, Listener { // Errors //////////////////////////////////////////////////////////////////////////*/ //region Errors + /** * Process exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}. *

There are multiple types of errors:

@@ -1387,8 +1405,9 @@ public final class Player implements PlaybackListener, Listener { * For any error above that is not explicitly catchable, the player will * create a notification so users are aware. * + * * @see com.google.android.exoplayer2.Player.Listener#onPlayerError(PlaybackException) - * */ + */ // Any error code not explicitly covered here are either unrelated to NewPipe use case // (e.g. DRM) or not recoverable (e.g. Decoder error). In both cases, the player should // shutdown. @@ -2141,7 +2160,7 @@ public final class Player implements PlaybackListener, Listener { // because the stream source will be probably the same as the current played if (sourceType == SourceType.VIDEO_WITH_SEPARATED_AUDIO || (sourceType == SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY - && isNullOrEmpty(streamInfo.getAudioStreams()))) { + && isNullOrEmpty(streamInfo.getAudioStreams()))) { // It's not needed to reload the play queue manager only if the content's stream type // is a video stream, a live stream or an ended live stream return !StreamTypeUtil.isVideo(streamType); @@ -2203,12 +2222,18 @@ public final class Player implements PlaybackListener, Listener { } public void setPlaybackQuality(@Nullable final String quality) { + saveStreamProgressState(); + setRecovery(); videoResolver.setPlaybackQuality(quality); + reloadPlayQueueManager(); } public void setAudioTrack(@Nullable final String audioTrackId) { + saveStreamProgressState(); + setRecovery(); videoResolver.setAudioTrack(audioTrackId); audioResolver.setAudioTrack(audioTrackId); + reloadPlayQueueManager(); } @@ -2286,7 +2311,7 @@ public final class Player implements PlaybackListener, Listener { /** * Get the video renderer index of the current playing stream. - * + *

* This method returns the video renderer index of the current * {@link MappingTrackSelector.MappedTrackInfo} or {@link #RENDERER_UNAVAILABLE} if the current * {@link MappingTrackSelector.MappedTrackInfo} is null or if there is no video renderer index. diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e94295724..063a2a297 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -38,6 +38,13 @@ public class AudioPlaybackResolver implements PlaybackResolver { this.dataSource = dataSource; } + /** + * Get a media source providing audio. If a service has no separate {@link AudioStream}s we + * use a video stream as audio source to support audio background playback. + * + * @param info of the stream + * @return the audio source to use or null if none could be found + */ @Override @Nullable public MediaSource resolve(@NonNull final StreamInfo info) { diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 8aff0af87..2638ff041 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -110,7 +110,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected PlayerBinding binding; private final Handler controlsVisibilityHandler = new Handler(Looper.getMainLooper()); - @Nullable private SurfaceHolderCallback surfaceHolderCallback; + @Nullable + private SurfaceHolderCallback surfaceHolderCallback; boolean surfaceIsSetup = false; @@ -533,6 +534,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa /** * Sets the current duration into the corresponding elements. + * * @param currentProgress the current progress, in milliseconds */ private void updatePlayBackElementsCurrentDuration(final int currentProgress) { @@ -545,6 +547,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa /** * Sets the video duration time into all control components (e.g. seekbar). + * * @param duration the video duration, in milliseconds */ private void setVideoDurationToControls(final int duration) { @@ -1261,11 +1264,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa return; } - player.saveStreamProgressState(); final String newResolution = availableStreams.get(menuItemIndex).getResolution(); - player.setRecovery(); player.setPlaybackQuality(newResolution); - player.reloadPlayQueueManager(); binding.qualityTextView.setText(menuItem.getTitle()); } @@ -1285,11 +1285,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa return; } - player.saveStreamProgressState(); final String newAudioTrack = availableStreams.get(menuItemIndex).getAudioTrackId(); - player.setRecovery(); player.setAudioTrack(newAudioTrack); - player.reloadPlayQueueManager(); binding.audioTrackTextView.setText(menuItem.getTitle()); } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index f8a800b0e..b036d55c5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -715,9 +715,9 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * - *

In this order:

+ *

Tracks will be compared this order:

*
    - *
  1. If {@code preferOriginalAudio}: is original audio
  2. + *
  3. If {@code preferOriginalAudio}: use original audio
  4. *
  5. Language matches {@code preferredLanguage}
  6. *
  7. * Track type ranks highest in this order: @@ -752,9 +752,9 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * - *

    In this order:

    + *

    Tracks will be compared this order:

    *
      - *
    1. If {@code preferOriginalAudio}: is original audio
    2. + *
    3. If {@code preferOriginalAudio}: use original audio
    4. *
    5. Language matches {@code preferredLanguage}
    6. *
    7. * Track type ranks highest in this order: diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java index 4bcdfd02a..2eb63ff41 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -224,6 +224,8 @@ public class StreamItemAdapter extends BaseA public static class StreamSizeWrapper implements Serializable { private static final StreamSizeWrapper EMPTY = new StreamSizeWrapper<>(Collections.emptyList(), null); + private static final int SIZE_UNSET = -2; + private final List streamsList; private final long[] streamSizes; private final String unknownSize; @@ -251,7 +253,7 @@ public class StreamItemAdapter extends BaseA final Callable fetchAndSet = () -> { boolean hasChanged = false; for (final X stream : streamsWrapper.getStreamsList()) { - if (streamsWrapper.getSizeInBytes(stream) > -2) { + if (streamsWrapper.getSizeInBytes(stream) > SIZE_UNSET) { continue; } @@ -270,7 +272,7 @@ public class StreamItemAdapter extends BaseA } public void resetSizes() { - Arrays.fill(streamSizes, -2); + Arrays.fill(streamSizes, SIZE_UNSET); } public static StreamSizeWrapper empty() { From 60a5d020182d817c6c56931a92046fdcff9f50f8 Mon Sep 17 00:00:00 2001 From: MBKaba Date: Mon, 24 Apr 2023 10:44:26 +0000 Subject: [PATCH 055/133] =?UTF-8?q?add=20language=20=DF=92=DF=9E=DF=8F=20(?= =?UTF-8?q?nqo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The translation is already done: https://hosted.weblate.org/projects/newpipe/strings/nqo/ --- app/src/main/res/values/settings_keys.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f9d0572e8..f93ed9c45 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -468,6 +468,7 @@ lt hu nl + nqo no nn uz @@ -548,6 +549,7 @@ Lietuvių Magyar Nederlands + ߒߞߏ Norsk Nynorsk O‘zbek From 85198970896c381bd90380bacc1aaf2ef707ce8f Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 25 Apr 2023 18:37:04 +0200 Subject: [PATCH 056/133] Fix ktlint formatter after upgrade to Java 17 See https://github.com/pinterest/ktlint/issues/1195 and https://github.com/ScoopInstaller/Extras/issues/10313. Note that although this should have been fixed in the latest version of ktlint (we are using an old one), the fix doesn't seems to have worked for me. --- app/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 4d350a006..8b9659c1f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -164,6 +164,7 @@ task runKtlint(type: JavaExec) { getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } task formatKtlint(type: JavaExec) { @@ -172,6 +173,7 @@ task formatKtlint(type: JavaExec) { getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "-F", "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } afterEvaluate { From 43b0167a3a7d97f0a002db2634337faaac95a59d Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 26 Apr 2023 16:01:20 +0200 Subject: [PATCH 057/133] Fix CI command injection vulnerability See https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67bd46992..03b04b7c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,7 +42,9 @@ jobs: - name: create and checkout branch # push events already checked out the branch if: github.event_name == 'pull_request' - run: git checkout -B ${{ github.head_ref }} + env: + BRANCH: ${{ github.head_ref }} + run: git checkout -B "$BRANCH" - name: set up JDK 17 uses: actions/setup-java@v3 From 60fc662a261b8a966f4be58a7c335878e92c6f1b Mon Sep 17 00:00:00 2001 From: MBKaba Date: Thu, 27 Apr 2023 12:21:59 +0000 Subject: [PATCH 058/133] Update settings_keys.xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add ߒߞߏ (nqo) language code to Add ߒߞߏ (nqo) language name to --- app/src/main/res/values/settings_keys.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f93ed9c45..73f6c30c9 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1160,6 +1160,7 @@ ne nl nl-be + nqo oc or pa @@ -1243,6 +1244,7 @@ Nनेपाली Nederlands (NL) Nederlands (BE) + ߒߞߏ Occitan ଓଡ଼ିଆ ਪੰਜਾਬੀ From 4e837e838d08d5447051798dd15e575690d8bcc1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 1 May 2023 00:02:37 +0200 Subject: [PATCH 059/133] fix docs in app/src/main/java/org/schabi/newpipe/util/Localization.java Co-authored-by: Audric V. <74829229+AudricV@users.noreply.github.com> --- .../org/schabi/newpipe/util/Localization.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 9123d377c..c4034252d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -266,14 +266,17 @@ public final class Localization { /** * Get the localized name of an audio track. - *

      Example:

      - *

      English (original)

      - *

      English (descriptive)

      - *

      Spanish (dubbed)

      * - * @param context used to get app language - * @param track a {@link AudioStream} of the track - * @return localized track name + *

      Examples of results returned by this method:

      + *
        + *
      • English (original)
      • + *
      • English (descriptive)
      • + *
      • Spanish (dubbed)
      • + *
      + * + * @param context the context used to get the app language + * @param track an {@link AudioStream} of the track + * @return the localized name of the audio track */ public static String audioTrackName(final Context context, final AudioStream track) { final String name; From 22671ca16c6d4e2904116d1faebfb6f95b8103ea Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 1 May 2023 00:04:04 +0200 Subject: [PATCH 060/133] fix: audio stream cache key, code fmt --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 4 +--- .../schabi/newpipe/player/resolver/PlaybackResolver.java | 5 +++++ app/src/main/java/org/schabi/newpipe/util/ListHelper.java | 3 ++- .../test/java/org/schabi/newpipe/util/ListHelperTest.java | 6 ++++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index e0b1606dc..0a92efb93 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -470,9 +470,7 @@ public class DownloadDialog extends DialogFragment dialogBinding.audioTrackSpinner.setVisibility( isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); dialogBinding.defaultAudioTrackPresentText.setVisibility( - !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE - - ); + !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); } private void setupSubtitleSpinner() { diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index c15447418..e204b8372 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -161,6 +161,11 @@ public interface PlaybackResolver extends Resolver { cacheKey.append(audioStream.getAudioTrackId()); } + if (audioStream.getAudioLocale() != null) { + cacheKey.append(" "); + cacheKey.append(audioStream.getAudioLocale().getISO3Language()); + } + return cacheKey.toString(); } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 9c58ed75e..f45f3786d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -797,7 +797,8 @@ public final class ListHelper { * @return Comparator */ static Comparator getAudioTrackComparator( - final Locale preferredLanguage, final boolean preferOriginalAudio, + final Locale preferredLanguage, + final boolean preferOriginalAudio, final boolean preferDescriptiveAudio) { final String langCode = preferredLanguage.getISO3Language(); final List trackTypeRanking = preferDescriptiveAudio diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index b4a4167cf..c7c36eadc 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -451,8 +451,10 @@ public class ListHelperTest { } private static AudioStream generateAudioTrack( - @NonNull final String id, @Nullable final String trackId, - @Nullable final Locale locale, @Nullable final AudioTrackType trackType) { + @NonNull final String id, + @Nullable final String trackId, + @Nullable final Locale locale, + @Nullable final AudioTrackType trackType) { return new AudioStream.Builder() .setId(id) .setContent("", true) From fb00ee8cf9012358d7a0ebf7682bf34d9db2e752 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 1 May 2023 19:26:42 +0200 Subject: [PATCH 061/133] [YouTube] Improve download speed (#9948) --- .../giga/get/DownloadInitializer.java | 8 +++--- .../java/us/shandian/giga/util/Utility.java | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java index 7c0fa9012..1d5a93588 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java @@ -54,12 +54,12 @@ public class DownloadInitializer extends Thread { long lowestSize = Long.MAX_VALUE; for (int i = 0; i < mMission.urls.length && mMission.running; i++) { - mConn = mMission.openConnection(mMission.urls[i], true, -1, -1); + mConn = mMission.openConnection(mMission.urls[i], true, 0, 0); mMission.establishConnection(mId, mConn); dispose(); if (Thread.interrupted()) return; - long length = Utility.getContentLength(mConn); + long length = Utility.getTotalContentLength(mConn); if (i == 0) { httpCode = mConn.getResponseCode(); @@ -84,14 +84,14 @@ public class DownloadInitializer extends Thread { } } else { // ask for the current resource length - mConn = mMission.openConnection(true, -1, -1); + mConn = mMission.openConnection(true, 0, 0); mMission.establishConnection(mId, mConn); dispose(); if (!mMission.running || Thread.interrupted()) return; httpCode = mConn.getResponseCode(); - mMission.length = Utility.getContentLength(mConn); + mMission.length = Utility.getTotalContentLength(mConn); } if (mMission.length == 0 || httpCode == 204) { diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index ecce6639e..3cfa22bd9 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -1,11 +1,8 @@ package us.shandian.giga.util; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; import android.os.Build; import android.util.Log; -import android.widget.Toast; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; @@ -29,8 +26,10 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.HttpURLConnection; import java.util.Locale; +import java.util.Random; import okio.ByteString; +import us.shandian.giga.get.DownloadMission; public class Utility { @@ -232,6 +231,28 @@ public class Utility { return -1; } + /** + * Get the content length of the entire file even if the HTTP response is partial + * (response code 206). + * @param connection http connection + * @return content length + */ + public static long getTotalContentLength(final HttpURLConnection connection) { + try { + if (connection.getResponseCode() == 206) { + final String rangeStr = connection.getHeaderField("Content-Range"); + final String bytesStr = rangeStr.split("/", 2)[1]; + return Long.parseLong(bytesStr); + } else { + return getContentLength(connection); + } + } catch (Exception err) { + // nothing to do + } + + return -1; + } + private static String pad(int number) { return number < 10 ? ("0" + number) : String.valueOf(number); } From d89a3c6c4d6f3bd4045e7a55732f2249b0e6275b Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Tue, 2 May 2023 00:11:09 +0200 Subject: [PATCH 062/133] Remove "default" from audio track already present message We don't know if, on muxed video streams we get for all services which support multiple audio languages, that the audio language returned is the original one or not, even if it should be the case. In order to avoid saying potential false information, this word has been removed from the string resource (ID and value) and the corresponding layout ID in the download dialog. --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 6 +++--- app/src/main/res/layout/download_dialog.xml | 6 +++--- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 0a92efb93..88a3484d9 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -448,7 +448,7 @@ public class DownloadDialog extends DialogFragment dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); dialogBinding.audioTrackSpinner.setVisibility( wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); - dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE); } private void setupVideoSpinner() { @@ -469,7 +469,7 @@ public class DownloadDialog extends DialogFragment dialogBinding.audioTrackSpinner.setVisibility( isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); - dialogBinding.defaultAudioTrackPresentText.setVisibility( + dialogBinding.audioTrackPresentInVideoText.setVisibility( !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); } @@ -484,7 +484,7 @@ public class DownloadDialog extends DialogFragment setRadioButtonsState(true); dialogBinding.audioStreamSpinner.setVisibility(View.GONE); dialogBinding.audioTrackSpinner.setVisibility(View.GONE); - dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE); } diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml index 6b0a36cc8..67aa1577c 100644 --- a/app/src/main/res/layout/download_dialog.xml +++ b/app/src/main/res/layout/download_dialog.xml @@ -94,7 +94,7 @@ tools:visibility="gone" /> , Toggle all Streams which are not yet supported by the downloader are not shown - The default audio track should be already present in this stream + An audio track should be already present in this stream The selected stream is not supported by external players No audio streams are available for external players No video streams are available for external players From 023f6166abf7e566662ccf88e5f11164cc838a3e Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Tue, 2 May 2023 00:18:46 +0200 Subject: [PATCH 063/133] Add Open in browser button to audio external players dialog This change makes the dialog consistent with the video one. --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index d8b2b43a5..8227f1c69 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 @@ -2166,12 +2166,13 @@ public final class VideoDetailFragment if (audioTracks.isEmpty()) { Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, Toast.LENGTH_SHORT).show(); - } else if (audioTracks.size() == 1) { startOnExternalPlayer(activity, currentInfo, audioTracks.get(0)); } else { final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.select_audio_track_external_players); + builder.setNeutralButton(R.string.open_in_browser, (dialog, i) -> + ShareUtils.openUrlInBrowser(requireActivity(), url)); final int selectedAudioStream = ListHelper.getDefaultAudioFormat(activity, audioTracks); From 10c42de2f16a5e2162d718ce431a36020506d71e Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 3 May 2023 10:28:24 +0200 Subject: [PATCH 064/133] Fix uploader and subchannel avatars swapped --- .../fragments/detail/VideoDetailFragment.java | 54 +++++++------------ .../fragment_video_detail.xml | 12 ++--- .../main/res/layout/fragment_video_detail.xml | 12 ++--- 3 files changed, 30 insertions(+), 48 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 8227f1c69..3c07b1a93 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 @@ -61,7 +61,6 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.tabs.TabLayout; -import com.squareup.picasso.Callback; import org.schabi.newpipe.App; import org.schabi.newpipe.R; @@ -649,27 +648,6 @@ public final class VideoDetailFragment } } - private void initThumbnailViews(@NonNull final StreamInfo info) { - PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailThumbnailImageView, new Callback() { - @Override - public void onSuccess() { - // nothing to do, the image was loaded correctly into the thumbnail - } - - @Override - public void onError(final Exception e) { - showSnackBarError(new ErrorInfo(e, UserAction.LOAD_IMAGE, - info.getThumbnailUrl(), info)); - } - }); - - PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailSubChannelThumbnailView); - PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailUploaderThumbnailView); - } - /*////////////////////////////////////////////////////////////////////////// // OwnStack //////////////////////////////////////////////////////////////////////////*/ @@ -1480,12 +1458,9 @@ public final class VideoDetailFragment binding.detailSubChannelThumbnailView.setVisibility(View.GONE); if (!isEmpty(info.getSubChannelName())) { - displayBothUploaderAndSubChannel(info, activity); - } else if (!isEmpty(info.getUploaderName())) { - displayUploaderAsSubChannel(info, activity); + displayBothUploaderAndSubChannel(info); } else { - binding.detailUploaderTextView.setVisibility(View.GONE); - binding.detailUploaderThumbnailView.setVisibility(View.GONE); + displayUploaderAsSubChannel(info); } final Drawable buddyDrawable = @@ -1559,7 +1534,8 @@ public final class VideoDetailFragment binding.detailSecondaryControlPanel.setVisibility(View.GONE); checkUpdateProgressInfo(info); - initThumbnailViews(info); + PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailThumbnailImageView); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); @@ -1596,27 +1572,30 @@ public final class VideoDetailFragment noVideoStreams ? R.drawable.ic_headset_shadow : R.drawable.ic_play_arrow_shadow); } - private void displayUploaderAsSubChannel(final StreamInfo info, final Context context) { + private void displayUploaderAsSubChannel(final StreamInfo info) { binding.detailSubChannelTextView.setText(info.getUploaderName()); binding.detailSubChannelTextView.setVisibility(View.VISIBLE); binding.detailSubChannelTextView.setSelected(true); if (info.getUploaderSubscriberCount() > -1) { binding.detailUploaderTextView.setText( - Localization.shortSubscriberCount(context, info.getUploaderSubscriberCount())); + Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount())); binding.detailUploaderTextView.setVisibility(View.VISIBLE); } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + binding.detailUploaderThumbnailView.setVisibility(View.GONE); } - private void displayBothUploaderAndSubChannel(final StreamInfo info, final Context context) { + private void displayBothUploaderAndSubChannel(final StreamInfo info) { binding.detailSubChannelTextView.setText(info.getSubChannelName()); binding.detailSubChannelTextView.setVisibility(View.VISIBLE); binding.detailSubChannelTextView.setSelected(true); - binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); - final StringBuilder subText = new StringBuilder(); if (!isEmpty(info.getUploaderName())) { subText.append( @@ -1627,7 +1606,7 @@ public final class VideoDetailFragment subText.append(Localization.DOT_SEPARATOR); } subText.append( - Localization.shortSubscriberCount(context, info.getUploaderSubscriberCount())); + Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount())); } if (subText.length() > 0) { @@ -1637,6 +1616,13 @@ public final class VideoDetailFragment } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailUploaderThumbnailView); + binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE); } public void openDownloadDialog() { diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index 9fdede902..d18681056 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -267,23 +267,21 @@ android:layout_height="wrap_content"> + app:shapeAppearance="@style/CircularImageView" /> diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 438c618ef..9aaf6d8d6 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -254,24 +254,22 @@ android:layout_height="wrap_content"> + tools:ignore="RtlHardcoded" /> From 9866eab60fc64ef46e8e4a82f22553bbef764352 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 3 May 2023 11:18:12 +0200 Subject: [PATCH 065/133] Update Android Gradle Plugin to 8.0.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ae41b1c89..f5033c648 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.0.0' + classpath 'com.android.tools.build:gradle:8.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 0bb3e7cb86f336aee00795e9fba914fb8e03e390 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:47:58 +0200 Subject: [PATCH 066/133] Translated using Weblate (Belarusian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 6.7% (5 of 74 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Czech) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Italian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 12.9% (86 of 664 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 99.3% (660 of 664 strings) Translated using Weblate (Estonian) Currently translated at 99.6% (662 of 664 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Polish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Greek) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Russian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (German) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 0.0% (0 of 74 strings) Translated using Weblate (N’Ko) Currently translated at 8.9% (59 of 661 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Greek) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Vietnamese) Currently translated at 99.6% (659 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Added translation using Weblate (N’Ko) Translated using Weblate (Bambara) Currently translated at 0.1% (1 of 661 strings) Translated using Weblate (Bambara) Currently translated at 1.3% (1 of 74 strings) Translated using Weblate (Czech) Currently translated at 100.0% (74 of 74 strings) Added translation using Weblate (Bambara) Merge branch 'origin/dev' into Weblate. Translated using Weblate (Estonian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Co-authored-by: Agnieszka C Co-authored-by: Alexthegib Co-authored-by: Allan Nordhøy Co-authored-by: Bakary Kaba Co-authored-by: Bdd55oo Co-authored-by: Edward Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: Hosted Weblate Co-authored-by: Hoàng Lâm Lê Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Nidi Co-authored-by: Olivia Ng Co-authored-by: Priit Jõerüüt Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Weblate Co-authored-by: Yaron Shahrabani Co-authored-by: gallegonovato Co-authored-by: mono Co-authored-by: random r Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bm/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ Translation: NewPipe/Metadata Translated using Weblate (German) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (French) Currently translated at 99.3% (660 of 664 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Catalan) Currently translated at 93.2% (619 of 664 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 41.4% (275 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 4.0% (3 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ Translated using Weblate (Dutch) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Turkish) Currently translated at 99.3% (660 of 664 strings) Translated using Weblate (Georgian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 67.9% (451 of 664 strings) Translated using Weblate (French) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (French) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Polish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 98.9% (657 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 84.6% (562 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Italian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Turkish) Currently translated at 99.5% (661 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Czech) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (French) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (German) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 5.4% (4 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ Translated using Weblate (N’Ko) Currently translated at 9.4% (7 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ --- app/src/main/res/values-ar/strings.xml | 9 +- app/src/main/res/values-az/strings.xml | 7 + app/src/main/res/values-be/strings.xml | 9 +- app/src/main/res/values-bm/strings.xml | 4 + app/src/main/res/values-ca/strings.xml | 10 +- app/src/main/res/values-cs/strings.xml | 9 +- app/src/main/res/values-de/strings.xml | 9 +- app/src/main/res/values-el/strings.xml | 9 +- app/src/main/res/values-es/strings.xml | 7 + app/src/main/res/values-et/strings.xml | 7 + app/src/main/res/values-fr/strings.xml | 31 +- app/src/main/res/values-he/strings.xml | 17 +- app/src/main/res/values-hi/strings.xml | 9 +- app/src/main/res/values-in/strings.xml | 7 + app/src/main/res/values-it/strings.xml | 13 +- app/src/main/res/values-ja/strings.xml | 9 +- app/src/main/res/values-ka/strings.xml | 70 +- app/src/main/res/values-nb-rNO/strings.xml | 19 +- app/src/main/res/values-nl/strings.xml | 21 +- app/src/main/res/values-nqo/strings.xml | 732 ++++++++++++++++++ app/src/main/res/values-or/strings.xml | 49 +- app/src/main/res/values-pa/strings.xml | 7 + app/src/main/res/values-pl/strings.xml | 13 +- app/src/main/res/values-pt-rBR/strings.xml | 7 + app/src/main/res/values-pt-rPT/strings.xml | 7 + app/src/main/res/values-pt/strings.xml | 7 + app/src/main/res/values-ro/strings.xml | 16 +- app/src/main/res/values-ru/strings.xml | 19 +- app/src/main/res/values-sc/strings.xml | 7 + app/src/main/res/values-sv/strings.xml | 58 +- app/src/main/res/values-tr/strings.xml | 20 +- app/src/main/res/values-uk/strings.xml | 11 +- app/src/main/res/values-vi/strings.xml | 13 +- app/src/main/res/values-zh-rCN/strings.xml | 7 + app/src/main/res/values-zh-rHK/strings.xml | 310 ++++---- app/src/main/res/values-zh-rTW/strings.xml | 7 + .../metadata/android/be/changelogs/65.txt | 26 + .../metadata/android/bm/short_description.txt | 1 + .../metadata/android/cs/short_description.txt | 2 +- .../metadata/android/nqo/changelogs/63.txt | 8 + .../metadata/android/nqo/changelogs/64.txt | 8 + .../metadata/android/nqo/changelogs/65.txt | 26 + .../metadata/android/nqo/changelogs/66.txt | 33 + .../metadata/android/nqo/changelogs/68.txt | 31 + .../metadata/android/nqo/full_description.txt | 1 + .../android/nqo/short_description.txt | 1 + 46 files changed, 1427 insertions(+), 276 deletions(-) create mode 100644 app/src/main/res/values-bm/strings.xml create mode 100644 app/src/main/res/values-nqo/strings.xml create mode 100644 fastlane/metadata/android/be/changelogs/65.txt create mode 100644 fastlane/metadata/android/bm/short_description.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/63.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/64.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/65.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/66.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/68.txt create mode 100644 fastlane/metadata/android/nqo/full_description.txt create mode 100644 fastlane/metadata/android/nqo/short_description.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 977177996..e3b5245b3 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -46,7 +46,7 @@ خطأ تعذر تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو - اضغط على العدسة المكبرة للبدء. + اضغط على \"العدسة المكبرة\" للبدء. اشتراك مشترك الاشتراكات @@ -792,4 +792,11 @@ إزالة التكرارات؟ إظهار التدفقات التالية شاهدت بالكامل + إجراء الإيماءة اليسرى + اجراء الإيماءة اليمنى + السطوع + بدون + اختر إيماءة للنصف الأيسر من شاشة المشغل + اختر إيماءة للنصف الأيمن من شاشة المشغل + مستوى الصوت \ 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 14e915a9e..04201fa52 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -740,4 +740,11 @@ Qismən baxılıb Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\? Yaxınlaşan + Sol jest hərəkəti + Oynadıcı ekranının sağ yarısı üçün jest seç + Sağ jest hərəkəti + Parlaqlıq + Səs səviyyəsi + Heç biri + Oynadıcı ekranının sol yarısı üçün jest seç \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7bbe49ebd..808e2b0c5 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -3,7 +3,7 @@ Націсніце «Пошук», каб пачаць. Апублікавана %1$s Патокавы прайгравальнік не знойдзены. Усталяваць VLC\? - Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). + Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC каб прайграць). Усталяваць Скасаваць Адкрыць у браўзеры @@ -765,4 +765,11 @@ Прыватнасць Мова Падтрымка + Дзеянне левага жэсту + Дзеянне правага жэсту + Яркасць + Нічога + Выбраць жэст для левай часткі экрана прайгравання + Гук + Выбраць жэст для правай часткі экрана прайгравання \ No newline at end of file diff --git a/app/src/main/res/values-bm/strings.xml b/app/src/main/res/values-bm/strings.xml new file mode 100644 index 000000000..62f8281ab --- /dev/null +++ b/app/src/main/res/values-bm/strings.xml @@ -0,0 +1,4 @@ + + + ߥߊߘߏ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. + \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ac25b2992..a690fe132 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -114,7 +114,7 @@ Mostra resolucions superiors Només alguns dispositius poden reproduir vídeos en 2K/4K Reprodueix amb el Kodi - No s\'ha trobat l\'aplicació Kode. Voleu instal·lar-la\? + No s\'ha trobat l\'aplicació Kore. Voleu instal·lar-la\? Mostra «Reprodueix amb el Kodi» Mostra una opció per reproduir un vídeo amb el centre multimèdia Kodi Reproductor emergent intel·ligent @@ -574,8 +574,8 @@ Tercer botó d\'acció Segon botó d\'acció Primer botó d\'acció - Escala la miniatura del vídeo mostrat a la notificació de 16:9 a raó d\'1:1 (pot causar deformacions) - Escala a raó d\'1:1 + Retalla la miniatura del vídeo mostrat a la notificació de 16:9 a 1:1 + Retalla la miniatura amb una relació d\'aspecte 1:1 Mostrant resultats per a: %s Capítols Descripció @@ -702,4 +702,8 @@ Ordenar Configura la notificació de reproducció actual. Canvia la mida de l\'interval de càrrega (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. Els canvis requereixen un reinici del jugador. + Ignora els esdeveniments dels botons de reproducció físics + Útil, per exemple, si feu servir uns auriculars amb els botons físicament trencats + Trieu un gest per la part esquerra de la pantalla + Mida de l\'interval de càrrega de reproducció \ 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 68fa32c3c..f6bc2cfa2 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -550,7 +550,7 @@ Nikdy Pouze na Wi-Fi Automaticky zahájit přehrávání — %s - Přehrát frontu + Fronta přehravání Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\? Automatické přehravání Fronta aktivního přehrávače bude smazána @@ -753,4 +753,11 @@ Nadcházející Odstranit duplicity Chcete odstranit všechny duplicitní streamy v tomto playlistu\? + Akce levého gesta + Akce pravého gesta + Hlasitost + Žádné + Vyberte gesto pro levou polovinu obrazovky přehrávače + Jas + Vyberte gesto pro pravou polovinu obrazovky přehrávače \ 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 14fbbc057..77243f37d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -318,7 +318,7 @@ Datenschutzbestimmungen lesen Akzeptieren Ablehnen - Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipe\'s Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. + Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. \nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen @@ -740,4 +740,11 @@ Demnächst Vollständig angeschaut Teilweise angeschaut + Geste für die linke Hälfte des Player-Bildschirms auswählen + Geste für die rechte Hälfte des Player-Bildschirms auswählen + Keine + Rechte Gestenaktion + Linke Gestenaktion + Helligkeit + Lautstärke \ 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 83df4f5a4..091dd25cb 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -96,7 +96,7 @@ Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε - Αυτόματη πρόσθεση της επόμενης ροής στην ουρά + Αυτόματη προσθήκη της επόμενης ροής στην ουρά Συνέχεια της τρέχουσας (μη επαναλαμβανόμενης) ουράς μετά τη λήξη της, με την προσθήκη μιας σχετικής ροής Επιλογή των προτάσεων που εμφανίζονται κατά την αναζήτηση Αποθήκευση αναζητήσεων στη συσκευή @@ -740,4 +740,11 @@ Θέλετε να καταργήσετε όλες τις διπλότυπες ροές σε αυτήν τη λίστα αναπαραγωγής; Αφαίρεση διπλοτύπων Θεαθέντα μερικώς + Επιλέξτε χειρονομία για το αριστερό μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια αριστερής χειρονομίας + Επιλέξτε χειρονομία για το δεξί μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια δεξιάς χειρονομίας + Φωτεινότητα + Ένταση + Καμία \ 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 239bfa81c..d4087640e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -756,4 +756,11 @@ Eliminar los duplicados Completamente visto Parcialmente visto + Acción del gesto en la izquierda + Acción del gesto a la derecha + Brillo + Volumen + Ninguno + Elige un gesto para la mitad izquierda de la pantalla del reproductor + Elige un gesto para la mitad derecha de la pantalla del reproductor \ 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 07b52d9d2..a2056cba7 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -740,4 +740,11 @@ Tulemas Lõpuni vaadatud Osaliselt vaadatud + Toiming viipel vasakul poolel + Helitugevus + Määratlemata + Vali viibe meediamängija ekraani vasaku poole jaoks + Eredus + Vali viibe meediamängija ekraani parema poole jaoks + Toiming viipel paremal poolel \ 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 496a23b65..742c13c00 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -257,7 +257,7 @@ Le nom du fichier ne peut pas être vide Une erreur est survenue : %1$s Télécharger le flux - Ajout automatique du flux suivant à la file + Ajout automatique du flux suivant à la file de lecture Continue la file de lecture (non répétitive) en ajoutant un flux lié Débogage Remplir @@ -556,7 +556,7 @@ Démarrer la lecture automatiquement — %s Liste de lecture Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \? - Ajout automatique à la file + Ajout auto. à la file La file de lecture du lecteur actif sera remplacée Confirmer avant de supprimer une file de lecture Rien @@ -672,8 +672,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 - Placer en suivant dans la file - Placé en suivant dans la file + Ajouter à la file de lecture + Ajouté à la file de lecture Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… @@ -720,13 +720,13 @@ Tout basculer Pourcent Demi-ton - Les flux qui ne sont pas encore supportés ne sont pas montrés - Aucun flux audio n\'est disponible pour les lecteurs externes + Les flux qui ne sont pas encore pris en charge ne sont pas montrés + Aucun flux audio n’est disponible pour les lecteurs externes Sélectionner la qualité pour les lecteurs externes Format inconnu Qualité inconnue - Le flux séléctionné n\'est pas supporté par les lecteurs externes - Aucun flux vidéo n\'est disponible pour les lecteurs externes + Le flux sélectionné n’est pas pris en charge 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 éléments à venir Masquer les éléments visionnés @@ -743,16 +743,23 @@ Cette option est disponible seulement si %s est sélectionné pour le thème Les listes de lecture grisées contiennent déjà cet élément. Carte - Utile si vous utilisez un casque avec des boutons dysfonctionnels, par exemple + Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels Effacer les doublons - Effacer les doublons \? - Voulez-vous retirer tous les doublons de cette liste \? + Effacer les doublons \? + Voulez-vous retirer tous les doublons de cette liste \? Afficher les flux suivants Entièrement vu Partiellement vu À venir - Ignorer les évènements des boutons média des périphériques + Ignorer les évènements des boutons média physiques Doublon ajouté %d fois Afficher/Cacher les flux Enlever la miniature permanente + Choisir le geste pour la moitié gauche de l’écran du lecteur + Action du geste vers la gauche + Choisir le geste pour la moitié droite de l’écran du lecteur + Volume + Aucune + Action du geste vers la droite + Luminosité \ 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 b1989b842..f1eee568e 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -560,7 +560,7 @@ אף פעם לא רק עם רשת אלחוטית להתחיל לנגן אוטומטית — %s - לנגן את התור + תור נגינה לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? סידור אוטומטי בתור התור מהנגן הפעיל יוחלף @@ -758,4 +758,19 @@ הכפיל נוסף %d פעמים התעלמות מאירועי כפתורי מדיה חומרתיים שימושי, למשל, אם יש לך אוזניות עם כפתורי חומרה מקולקלים + פעולת מחווה שמאלית + פעולת מחווה ימנית + עוצמת שמע + בלי + להסיר את כל השידורים הכפולים ברשימת הנגינה\? + נצפו חלקית + בקרוב + בהירות + נא לבחור מחווה לחצי השמאלי של מסך הנגן + נא לבחור מחווה לחצי הימני של מסך הנגן + הסרת כפילויות + להסיר כפילויות\? + נצפו במלואם + להציג את השידורים הבאים + להציג/להסתיר שידורים \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 86e7a98d0..f2e97d28b 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -58,7 +58,7 @@ उच्च गुणवत्ता स्तर दिखाएं केवल कुछ ही डिवाईस 2के/4के मे वीडियो चला सकते हैं कोडी मे चलाए - लापता Kode ऐप स्थापित करें\? + गैर- मौजूदा Kore ऐप स्थापित करें\? \"कोडी मे चलाएं\" वाला विकल्प दिखाएँ कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें प्रथम स्थापित ध्वनि फॉर्मेट @@ -741,4 +741,11 @@ स्ट्रीम दिखाएँ / छिपाएँ पूरा देखा आंशिक रूप से देखा गया + बाएँ इशारा क्रिया + चमक + आवाज + कोई नहीं + प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें + प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें + दाएँ इशारा क्रिया \ 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 985544fe4..bffd486a0 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -727,4 +727,11 @@ Hapus duplikat\? Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\? Tampilkan saluran berikut + Pilih gestur untuk bagian kiri dari layar pemutar + Tindakan gestur kiri + Tidak ada + Pilih gestur untuk bagian kanan dari layar pemutar + Tindakan gestur kanan + Kecerahan + Volume \ 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 aff0b3bee..68aca05cb 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -750,7 +750,14 @@ Rimuovere tutti gli elementi doppi di questa playlist\? Mostra gli elementi seguenti Mostra/Nascondi elementi - Visto parzialmente - Visto completamente - Prossimamente + Visti parzialmente + Visti completamente + Elementi futuri + Azione gesto sinistro + Azione gesto destro + Luminosità + Volume + Scegli il gesto per la metà sinistra del riproduttore + Nessuno + Scegli il gesto per la metà destra del riproduttore \ 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 fafbf91f9..be3874247 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,7 +16,7 @@ 動画ファイルをダウンロードするフォルダーを選択して下さい デフォルトの画質 Kodi で再生 - Kode をインストールしますか? + インストールされてない Kore アプリをインストールしますか? 「Kodi で再生」オプションを表示 Kodi メディアセンター経由で動画を再生するための設定を表示します 音声 @@ -727,4 +727,11 @@ 完全に視聴済み 一部視聴済み 今後 + 再生画面の左半分用にジェスチャーを選択 + 左のジェスチャー動作 + 再生画面の右半分用のジェスチャーを選択 + 右のジェスチャー動作 + 明るさ + 音量 + \ No newline at end of file diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 9ba01e672..8574ee3b6 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -1,7 +1,7 @@ ნაკადის პლეერი ვერ მოიძებნა (მის დასაკრავად შეგიძლიათ დააინსტალიროთ VLC). - "ნაკადის მოთამაშე ვერ მოიძებნა. დააინსტალირე VLC\?" + ნაკადის მოთამაშე ვერ მოიძებნა. დააყენეთ VLC\? გაუქმება გააზიარეთ როგორც გამოიყენეთ გარე ვიდეო დამკვრელი @@ -18,7 +18,7 @@ დაარტყა დამკვრელი ესკიზის ჩამოჭრა ასპექტის თანაფარდობაზე 1:1 თქვენ შეგიძლიათ აირჩიოთ მაქსიმუმ სამი მოქმედება კომპაქტურ შეტყობინებაში საჩვენებლად! - "შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით" + შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით დისტანციური ძიების შეთავაზებები გამორთეთ ვიდეოს აღწერილობისა და დამატებითი ინფორმაციის დასამალად თემა @@ -33,13 +33,13 @@ გააგრძელეთ დაკვრა გააგრძელეთ დაკვრა შეფერხებების შემდეგ (მაგ. სატელეფონო ზარები დაიწყეთ მთავარი მოთამაშე სრულ ეკრანზე - "URL-ის ამოცნობა ვერ მოხერხდა. სხვა აპით გახსნა\?" + URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით\? ნაგულისხმევი აუდიო ფორმატი აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები დაკვრის დატვირთვის ინტერვალის ზომა - "შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას" + შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას მოითხოვეთ დადასტურება რიგის გასუფთავებამდე - "არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს" + არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა ერთი მოთამაშიდან მეორეზე გადართვამ შესაძლოა შეცვალოს თქვენი რიგი გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება @@ -84,12 +84,12 @@ გამოწერები ფონი ამომხტარი ფანჯარა - დამატება: + დამატება ვიდეოს ჩამოტვირთვის საქაღალდე გადმოწერილი ვიდეო ფაილები ინახება აქ აუდიოს ჩამოტვირთვის საქაღალდე უფრო მაღალი რეზოლუციის ჩვენება - დააინსტალიროთ დაკარგული Kode აპი\? + დავაყენო აუცილებელი Kore აპი\? აჩვენეთ \"დაუკარი კოდით\" ვარიანტი აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით @@ -124,7 +124,7 @@ განაახლეთ დაკვრა აღადგინეთ დაკვრის ბოლო პოზიცია Ავტომატური ჩართვა - აჩვენეთ წვერი \"შეაჩერე რიგში\". + აჩვენეთ წვერი \"შეაჩერე რიგში\" რჩევის ჩვენება ფონზე ან ამომხტარ ღილაკზე დაჭერისას ვიდეოში \"დეტალები:\" URL მხარდაუჭერელია ნაგულისხმევი კონტენტის ქვეყანა @@ -223,7 +223,7 @@ NewPipe-ს შეექმნა შეცდომა, შეეხეთ შეტყობინებისთვის მოხდა შეცდომა, იხილეთ შეტყობინება უკაცრავად, ეს არ უნდა მომხდარიყო. - შეატყობინეთ ამ შეცდომის შესახებ ელფოსტით + ელფოსტით შეტყობინება დააკოპირეთ ფორმატირებული ანგარიში მოხსენება GitHub-ზე Ბოდიში, რაღაც არ არის რიგზე. @@ -292,7 +292,8 @@ ჰეშის გაანგარიშება გთხოვთ მოიცადოთ… კოპირებულია ბუფერში - ეს ნებართვა საჭიროა ამომხტარი ფანჯრის რეჟიმში გასახსნელად + ეს უფლება აუცილებელია +\nმხტუნარა რეჟიმში გასახსნელად 1 ელემენტი წაიშალა. reCAPTCHA გამოწვევა როდესაც მოგვარდება, დააჭირეთ შესრულებულია @@ -312,8 +313,8 @@ საიტი ეწვიეთ NewPipe ვებსაიტს დამატებითი ინფორმაციისა და სიახლეებისთვის. NewPipe-ის კონფიდენციალურობის პოლიტიკა - "NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. -\n NewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას." + NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. +\nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას. წაიკითხეთ კონფიდენციალურობის პოლიტიკა NewPipe-ის ლიცენზია წაიკითხეთ ლიცენზია @@ -557,7 +558,7 @@ ეს კონტენტი მიუწვდომელია თქვენს ქვეყანაში. ეს კონტენტი პირადია, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ანგარიში შეწყვეტილია - %s იძლევა ამ მიზეზს + %s იძლევა ამ მიზეზს: ეს კონტენტი ხელმისაწვდომია მხოლოდ მომხმარებლებისთვის, რომლებმაც გადაიხადეს, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. გამორჩეული რადიო @@ -601,8 +602,9 @@ ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა ჩართეთ YouTube-ის „შეზღუდული რეჟიმი“ - "ეს ვიდეო ასაკობრივი შეზღუდულია. -\n თუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში." + ეს ვიდეო ასაკობრივი შეზღუდულია. +\n +\nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში. ლაივი ეს ვიდეო ასაკობრივად შეზღუდულია. \n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას. @@ -619,7 +621,7 @@ გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები - რა:\\nმოითხოვეთ:\\შინაარსის ენა:\\nშინაარსის ქვეყანა:\\nაპლიკაციის ენა:\\nმომსახურება:\\nGMT დრო:\\პაკეტი:\\ვერსია:\\nOS ვერსია: + რა:\\nმოითხოვეთ:\\nშემცველობის ენა:\\nშემცველობის ქვეყანა:\\nაპლიკაციის ენა:\\nსერვისი:\\nGMT დრო:\\nპაკეტი:\\nვერსია:\\nOS ვერსია: ამტვირთველის ავატარის ესკიზი კომენტარები გამორთულია Შექმნა @@ -644,7 +646,7 @@ \n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“ \n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ \n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი -\n 7. [თუ .zip-ის იმპორტი ვერ მოხერხდა] ამოიღეთ. +\n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ მოედანი ახალი ნაკადების შეტყობინებები მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ. @@ -688,7 +690,7 @@ დამუშავება… შეიძლება რამდენიმე წუთი დასჭირდეს წაშალოთ ეს დასაკრავი სია\? მეხსიერების გაჟონვის ჩვენება - აღდგენა. + აღდგენა რიგი გამოწერების იმპორტი ვერ მოხერხდა შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს @@ -698,7 +700,7 @@ „%s“-ის არხის ჩატვირთვა ვერ მოხერხდა. ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი) გამოიყენეთ ესკიზი როგორც ჩაკეტილი ეკრანის ფონისთვის, ასევე შეტყობინებებისთვის - "როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). + როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). \n \n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას: \n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია. @@ -708,7 +710,7 @@ \n \n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით. \n -\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია." +\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია. ეს არის SoundCloud Go+ სიმღერა, ყოველ შემთხვევაში თქვენს ქვეყანაში, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \'%s\' ჩამოტვირთვის პარამეტრებში @@ -718,4 +720,32 @@ ახლა შეგიძლიათ აირჩიოთ ტექსტი აღწერილობაში. გაითვალისწინეთ, რომ გვერდი შეიძლება ციმციმდეს და ბმულები არ იყოს დაწკაპუნებული შერჩევის რეჟიმში. მხარდაჭერა აუდიო ნაკადები არ არის ხელმისაწვდომი გარე დამკვრელებისთვის + მარცხენა ჟესტის ქმედება + მარჯვენა ჟესტის ქმედება + სიკაშკაშე + ბუფერში კოპირების შეცდომა + ბარათი + გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან\? + ასლი დამატებულია %d-ჯერ + %s-ის გადმოსაწერად დაატყაპუნეთ + აპარატურული მედია ღილაკების მოვლენების გამოტოვება + ნაკადების ჩვენება/დამალვა + შემდეგი ნაკადების ჩვენება + სრულად ნანახი + ეს პარამეტრი ხელმისაწვდომია მხოლოდ როცა თემისთვის %s-ა მონიშნული + სასარგებლოა, მაგალითად, თუ იყენებთ ყურსაცვამდებს, რომლის ფიზიკური ღილაკებიც დაზიანებულია + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარცხენა ნახევრისთვის + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარჯვენა ნახევრისთვის + არაფერი + სწრაფი რეჟიმი + მომავალი + ხმა + ხელმისაწვდომია NewPipe-ის განახლება! + გამოწერების შეტანა/გამოტანა სამწერტილიანი მენიუდან + განაცრისფერებული დასაკრავი სიები ამ ელემენტს უკვე შეიცავენ. + თქვენი NewPipe-ის ვერსია უახლესია + დუბლიკატების წაშლა + მუდმივი მინიატურის მოხსნა + წავშალო დუბლიკატები\? + ნაწილობრივ ნანახი \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d03ae7c5a..42d4d258c 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -51,7 +51,7 @@ Innholdet er utilgjengelig Kunne ikke sette opp nedlastingsmeny Beklager, dette skal ikke skje. - Rapporter denne feilen via e-post + Rapporter via e-post Beklager, noe gikk galt. Rapporter Info: @@ -731,4 +731,21 @@ Hurtigmodus Spillelistene som er utgrået inneholder allerede dette elementet. Duplikat lagt til %d gang(er) + Ignorer enhetens fysiske knapper + Lysstyrke + Velg håndvending for venstre halvdel av avspillerskjermen + Fullført + Velg håndvending for høyre halvdel av avspillerskjermen + Ingen + Fjern duplikater + Fjern alle duplikatstrømmer i denne spillelisten\? + Kommende + Venstre håndvendingshandling + Høyre håndvendingshandling + Lydstyrke + Fjern duplikater\? + Vis/skjul strømmer + Delvis sett + Nyttig hvis hodsettet ditt har knapper som fungerer dårlig + Vis følgende strømmer \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f6d8ccffa..aff8dda84 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kode-app niet gevonden. Deze installeren\? + Kore-app niet gevonden. Deze installeren\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio @@ -50,7 +50,7 @@ Kan downloadmenu niet instellen Vind-ik-leuks Sorry, dit had niet mogen gebeuren. - Deze fout melden via e-mail + Melden via e-mail Sorry, er is iets fout gegaan. Melden Informatie: @@ -730,4 +730,21 @@ Miniatuur niet ingesteld De afspeellijsten die grijs zijn, bevatten dit item al. Duplicaat is %d tijd(en) toegevoegd + Linker gebaaractie + Rechter gebaaractie + Geen + Verwijder duplicaten + Verwijder duplicaten\? + Wil je alle dubbele streams in deze afspeellijst verwijderen\? + Streams weergeven/verbergen + Volledig bekeken + Gedeeltelijk bekeken + Aanstaande + Kies een gebaar voor de rechterhelft van het spelersscherm + Negeer hardware-mediaknopgebeurtenissen + Helderheid + Volume + Handig als je bijvoorbeeld een headset gebruikt met kapotte fysieke knoppen + Kies een gebaar voor de linkerhelft van het spelersscherm + Laat de volgende streams zien \ No newline at end of file diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml new file mode 100644 index 000000000..16c6e6e22 --- /dev/null +++ b/app/src/main/res/values-nqo/strings.xml @@ -0,0 +1,732 @@ + + + ߞߊ߬ ߢߣߊߕߊߟߌ ߘߏ߫ ߦߌ߬ߘߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߕߏߟߏ߲߫ Kodi ߞߟߋߞߟߋ߫ ߕߊ߲ߓߊ߲ ߘߐ߫ + Kore ߟߥߊߟߌߟߊ߲ ߡߊ߫ ߛߐ߬ߘߐ߲߬߸ ߞߵߊ߬ ߡߊߗߍ߫؟ + ߦߋߡߍ߲ߕߊ ߞߏ߬ߋߞߏ߬ߋ߫ ߡߍ߲ ߦߌ߬ߘߊ߬ߕߐ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߘߐ߫߸ ߞߵߏ߬ ߟߊߕߍ߰ ߞߊ߬ ߓߐ߫ ߁߆:߉ ߞߊ߬ ߞߍ߫ ߁:߁ ߓߍ߲߬ߡߊ ߘߌ߫ + ߞߍߟߌ߫ ߝߌߟߊߣߊ߲ ߞߎ߬ߘߎ + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߍߟߌ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ ߡߊߝߊ߬ߟߋ߲߬ ߘߎ߰ߟߊ߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲ ߘߐ߫ ߊ߬ߟߎ߫ ߞߊ߲߬. ߘߏ߫ ߟߎ߫ ߓߊߕߐߡߐ߲߫ (ߞߣߊ߫ ߕߊ߬ߡߌ߲߬ ߃ ߟߊ߫) ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߜߘߋ ߘߐ߫߸ ߞߌߣߌ߲߫ ߛߐ߲߬ߞߌ߲ ߛߌߟߊ ߝߍ߬ ߘߋ߲߬ߞߊ߬ߣߍ߲߬ ߘߐߞߍߕߊ ߞߊ߲߬ + ߞߊ߬ \"ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫\" ߢߣߊߕߊߟߌ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߜߊߘߊ߲߫ + ߞߏ߬ߋߞߏ߬ߋ ߟߊ߬ߕߍ߰ ߁:߁ ߡߊ߬ + ߞߍߟߌ߫ ߝߟߐ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߛߓߊߣߊ߲ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߣߊ߯ߣߌ߲ߣߊ߲ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߟߏ߯ߟߎߣߊ߲ ߞߎ߬ߘߎ + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߬ ߜߘߋ ߘߐ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߍߟߌ߫ ߛߓߊ߬ ߔߋ߫ ߟߋ߬ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߫߹ + ߕߎ߬ߡߊ߬ ߘߐ߫߸ ߌ ߞߊ߲߫ ߦߋ߫ \"%1$s\" ߟߋ߫ ߡߊ߬؟ + ߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߘߊ߫ %1$s + ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬. ߞߊ߬ VLC ߡߊߗߍ߫؟ + ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ (ߌ ߘߌ߫ ߛߋ߫ VLC ߡߊߗߍ߫ ߞߵߊ߬ ߕߏߟߏ߲߫). + ߞߵߊ߬ ߟߊߞߊ߬ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ + ߞߵߊ߬ ߢߊߣߐ߯ߦߊ߫ ߦߏ߫ ߡߊߝߟߍߣߍ߲ + ߞߵߊ߬ ߡߊߗߍ߫ + ߞߵߊ߬ ߘߐߛߊ߬ + ߏ߬ߞߍ߫ + ߞߵߊ߬ ߘߐߕߟߊ߫ + ߞߴߊ߬ ߘߊߦߟߍ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߞߣߐ߫ + ߞߵߊ߬ ߘߊߦߍ߬ߟߍ߫ ߦߊ߲߬ + ߞߵߊ߬ ߟߊߖߌ߰ + ߞߊ߬ ߥߏ߬ߦߏ ߞߐߘߐ߮ ߟߊߖߌ߰ + ߢߊߓߐߟߌ ߟߎ߬ + ߢߌߣߌ߲ߠߌ߲ + ߡߊ߬ߝߘߎ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬ߞߏ ߡߊ߫ ߛߐ߲߬ + ߢߌߣߌ߲ߝߋ߲߫ ߞߐߝߟߌ ߟߎ߬: %s + ߞߵߊ߬ ߘߐߝߘߊ߫ + ߞߐߞߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫ + ߊ߬ ߦߋ߫ ߡߍ߲ߕߊ ߟߋ߫ ߖߐ߬ߛߌ߫ ߟߊ߫ ߓߍ߲߬ߡߊ ߘߏ߫ ߟߎ ߞߘߐ߫ + ߞߊ߬ ߞߐߞߊ߲߫ ߡߍ߲ߕߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫ + ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬ + ߊ߬ ߡߊߝߘߎ߫ + ߊ߬ ߡߊߝߘߎߣߍ߲߫ ߌ ߓߟߏ߫ + ߥߙߏߝߋ ߓߘߊ߫ ߟߊߓߌ߬ߟߊ߬ + ߡߊ߬ߝߘߎ߬ߟߌ߫ ߟߏ߲ߘߐߦߊߞߏ ߡߊ߫ ߛߐ߲߬ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ + ߞߊ߬ ߟߌ߬ߤߟߊ ߦߌ߬ߘߊ߬ + ߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ + ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ + ߞߵߊ߬ ߝߙߊ߬ + ߦߋߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬ + ߝߎ߲ߞߊ߲ߡߊ + ߛߏ߬ߙߌ߲߬ߘߐ ߛߎߥߊ߲ߘߌ߫ + ߦߋߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߦߋߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫ + ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ + ߓߍ߲߬ߡߊ߬ ߛߊ߲ߘߐߕߊ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲ + ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ߫ ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ + ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫ + ߕߙߏߞߏ߫ ߘߊ߲ߘߐ߫ߣߍ߲߫ ߠߋ߬ ߦߋ߫ ߛߋ߫ ߟߊ߫ 2K/4K ߦߋߡߍ߲ߕߊ ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫ + ߊ߬ ߛߐ߲߬ߞߌ߫ ߥߊߘߏ ߞߊ߲߬ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߟߐ߬ߡߊ + ߞߊ߬ ߊ߲ߘߙߏߌߘ ߟߐ߬ ߛߐ߬ߓߌ߲߬ߘߐ߬ߓߏ߲ ߞ߬ߟߐ ߟߊߖߘߍ߬ߕߦߊ߬ ߟߊ߫ ߞߵߊ߬ ߓߍ߲߬ ߞߏ߬ߋߞߏ߬ߋ߫ ߞߐ߬ߟߐ ߓߊߖߎ ߡߊ߬ (ߦߴߊ߬ ߟߐ߲߫ ߞߴߏ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߙߏߞߏ ߓߍ߯ ߟߊ߫) + ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߠߵߊ߬ ߞߍ߫ ߟߊ߫ ߕߏߟߏ߲ߟߊ߲ ߘߌ߫ ߘߌ߲߬ߞߌߙߊ ߟߎ߬ ߢߌߣߌ߲߫ ߞߊߟߌߦߊߓߟߏ ߡߊ߬ ߞߏ߬ߣߵߊ߬ ߕߋߟߋ߲ߣߍ߲߫ ߕߍ߫ ߖߋߞߎ߫. ߞߊ߬ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߝߌ߬ߟߊ߲߬ ߅، ߁߅، ߥߟߊ߫ ߂߅ ߞߘߐ߫߸ ߊ߬ ߣߴߏ߬ ߕߍ߫ ߛߋ߫ ߓߍ߲߬ ߠߊ߫ + ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߘߊߦߟߍ ߟߞߊߟߌߦߊ߫ ߟߊ߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߡߊ߬ߞߏ߫ ߦߋ߫ ߡߍߣߍ߲ߡߊߛߊߦߌ ߟߊ߫ + ߞߊ߬ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߡߊ߬ߣߌ߲߬ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߏ߫ ߝߌߘߊ߲߫ ߕߐ߫ + ߞߊ߬ ߓߐ߫ ߕߏߟߏ߲ߟߊ߲ ߘߏ߫ ߟߊ ߞߊ߬ ߥߊ߫ ߘߏ߫ ߜߘߍ߫ ߟߊ߫߸ ߏ߬ ߘߌ߫ ߛߋߴߌ ߟߊ߫ ߕߎ߲߰ߠߌ߲ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߟߊ߫ + ߡߊ߬ߛߊߦߌ + ߢߓߊߛߊ߲ + ߦߟߌߘߐߗߍ + ߝߏߛߌ߬ + ߡߍ߲ߕߊ + ߡߍ߲ߕߊ߫ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ + ߦߋߡߍ߲ߕߊ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ + ߛߊߛߊ + ߛߎߘߐ߫ ߛߊߛߊ + ߞߣߍߦߊߣߍ߲ + ߘߓߌ߬ߣߍ߲ + ߝߌ߲߬ߡߊ߲ + ߞߊ߬ ߖߊ߬ߕߏ߫ ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ ߟߊ߫ ߕߦߊ ߟߎ߬ ߞߐ߫ + ߞߊ߬ ߖߊ߲߬ߕߏ߫ ߝߎ߲ߞߊ߫ ߝߢߐߘߊ ߘߍ߲߬ߘߍ߲ ߣߴߊ߬ ߘߌ߲߬ߞߌߙߊ ߞߐ߫ + ߞߊ߬ ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߊߟߌ߲ ߠߊߓߊ߯ߙߊ߫ + ߢߍߝߍ߫/ߞߐߝߍ߫ ߢߌߣߌ߲ߠߌ߲߫ ߥߛߎ߬ ߞߊߟߌ߲ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ + ߛߋ߲߬ߠߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߊ߫ ߕߎ߲߰ߠߌ߲ ߘߌߣߊ߬ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ + ߞߊ߬ ߕߙߏߞߏ ߞߟߋߞߟߋ߫ ߞߘߎ ߟߊ߫ ߖߊ߲߬ߖߊ߲߬ ߠߎ߬ ߡߊߓߌ߬ߟߊ߬ + ߏ߬ ߢߊߕߣߐ ߞߊߓߏ߬߸ ߣߴߌ ߦߋ߫ ߕߟߏߡߊߘߏ߲ ߠߊߓߊ߯ߙߊ ߟߊ߫ ߡߍ߲ ߞߘߎ߬ ߜߎ ߟߎ߬ ߕߍ߫ ߛߐ߲߬ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߖߛߐ߫ + ߣߎߡߊ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ + ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߞߌߣߌ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ + ߞߌߣߌ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ + ߞߣߍߦߊ + ߡߊ߲߬ߞߊ߲ + ߝߏߛߌ߬ + ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ ߓߊߕߐߡߐ߲߫ ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߢߌߣߌ߲ߠߌ߲߫ ߕߎߡߊ + ߘߌ߲߬ߞߌ߬ߙߊ߬ߘߐ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߥߎߟߊߟߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߊ߬ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߟߊߓߊ߲ ߠߊ߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߡߊ߬ߛߙߋ ߟߎ߫ ߦߌ߬ߘߊ߬ ߛߙߍߘߍ ߟߎ߬ ߘߐ߫ + ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߡߊߝߍߣߍ߲ߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ߫ + ߞߵߊ߬ ߟߊߖߌ߰ + ߞߊ߬ ߕߏߟߏ߲ߟߊ߲߫ ߓߊߖߎ ߘߊߦߟߍ߬ ߥߊ߲߬ߥߊ߬ ߝߊ ߘߐ߫ + ߞߊ߬ ߞߍߞߌߦߊ \"ߊ߬ ߛߐ߲߬ߞߌ߲߬ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫\" ߦߌ߬ߘߊ߬ + ߛߘߌ߬ߜߋ߲߬ ߘߌߣߍ߲ ߡߊ߫ ߛߋ߫ ߡߊߟߐ߲߫ ߠߊ߫. ߞߵߊ߬ ߘߊߦߟߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫؟ + ߞߣߐߘߐ߫ ߖߡߊ߬ߣߊ߬ ߖߏߣߡߊ + ߌ ߘߌߦߊߣߍ߲߫ ߛߐߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߫ ߦߊ߲߬: %s + ߛߐߘߊ ߘߏ߫ ߝߙߊ߬ + ߛߐߘߊ߫ ߛߘߌ߬ߜߋ߲ + ߛߐߘߊ ߡߊ߫ ߛߋ߫ ߕߎ߬ߢߊ߬ߟߐ߲߬ ߠߊ߫ + HTTPS ߛߘߌߜߋ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߦߋ߫ ߕߊ߬ ߟߊ߫ + ߞߏߟߊߕߊ߯ߡߢߊ + ߦߋߡߍ߲ߕߊ ߣߌ߫ ߡߍ߲ߕߊ + ߘߝߐ߬ߦߊ ߣߌ߫ ߦߟߌߡߊߛߌ߮ + ߦߋߢߊ + ߞߊߘߊ߲ߓߐ + ߟߏ߲ߘߐߦߊߟߌ + ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߕߐ ߛߏ߬ߓߌ߬ߘߐߓߏ߲ ߢߊߓߐ߫ + ߝߊ߲߬ߝߘߊ߬ߞߘߐ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ + ߝߎ߲ߞߊ߲ߡߊ ߞߙߊ߬ߞߏ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ + ߞߣߐߘߐ + ߦߕߎߓߎ߫ \"ߜߍ߲߬ߘߍ߬ߣߍ߲߫ ߗߏ߯ߦߊ\" ߟߊߡߍߣߍ߲߫ + \"ߜߍ߲߬ߘߍ߬ߣߍ߲ ߗߏ߯ߦߊ\" ߘߏ߫ ߦߋ߫ ߦߕߎߓߎ ߓߟߏ߫߸ ߡߍ߲ ߦߋ߫ ߞߣߐߘߐ߫ ߘߋߣߍ߲ߞߏߓߊߦߋ ߟߎ߬ ߢߡߊߘߏ߲߰ ߠߊ߫ + ߝߊ߲ߞߢߊ + ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ + ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ + ߖߊ߲߬ߖߏ߲ ߠߎ߬ + ߘߐ߲߬ߞߟߌ ߟߎ߬ + ߢߊ߰ߙߊ ߟߎ߬ + ߟߊߛߊ߬ߣߍ߲ + ߞߵߊ߬ ߝߌߘߊ߲߫ + ߓߍ߲߬ߡߊ ߓߘߍ߬ߡߊ + ߞߵߊ߬ ߘߐߛߊ߬ + ߞߵߊ߬ ߓߍ߯ ߕߏߟߏ߲߫ + ߞߘߊߎ߫ + ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߣߌߎߔߌߔ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߓߊߖߎ ߘߐ߫ + ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߝߏ߬ߦߌ߬ + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫ + ߘߝߐ߬ߦߊ ߣߌ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߌ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߣߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ + ߦߟߌߘߏ߲ ߠߎ߬ ߖߏ߬ߛߌ߬߸ ߣߌߎߔߌߔ ߦߋ߫ ߡߍ߲ ߠߎ߬ ߟߊߡߊ߲߬ߘߌ߬ ߟߊ߫ ߡߐ߰ߦߊ߬ߟߐ߲ ߘߏ߫ ߝߎߟߋ߲߫ ߕߎߡߊ ߌ ߓߟߏ߫ + ߦߋߞߏ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫؟ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߎߡߊߘߋ߲ ߠߎ߫ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ + ߗߏ߯ߦߊ߫ ߞߊߟߌ߲ + ߝߎ߬ߕߎ߲߬ߕߌ + ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߕߍ߫ ߦߋ߲߬ + ߞߙߏ߬ߝߏ߫ ߝߎ߬ߕߎ߲߬ߕߌ + ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߞߟߊ߬ߣߐ߮ ߡߊ߫ ߝߙߍߕߍߓߐ߫ ߟߊ߫ + ߗߍߦߙߐ ߡߊ߫ ߛߋ߫ ߘߐߛߏ߯ߙߋ߫ ߟߊ߫ + ߞߣߐߘߐ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߟߥߊ߬ߟߌ߬ߟߊ߲ ߓߘߊ߫ ߜߊߘߊ߲߫ + ߞߐߕߐ߮ ߓߘߊ߫ ߡߊߘߏ߬ߣߌ߲߬ ߥߟߴߊ߬ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߎ߲ߓߍ߲ ߛߎߝߊ߫ ߏ߬ ߕߍ߫ ߦߋ߲߬ + ߞߎ߲ߓߍ߲ ߥߟߊ߫ ߞߣߐߘߐ߫ ߛߎߝߊ ߏ߬ ߕߍ߫ ߦߋ߲߬ + ߞߐߕߐ߮ ߕߍ߲߬ ߦߋ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߟߊߛߐ߬ߘߐ߲߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߥߟߊ߫ ߛߓߍߟߌ߫ ߓߟߏ ߡߊ߬ + ߞߐߕߐ߯ ߕߐ߮ ߘߐߞߏߟߏ߲ ߕߍ߫ ߛߋ߫ ߕߏ߫ ߟߊ߫ + ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫: %1$s + ߥߦߏ߬ ߟߊߖߌ߰ߕߊ߬ ߕߍ߫߫ ߦߋ߲߬ + ߛߏ߬ߙߌ߲߬ߘߐ߬ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲ ߠߎ߬ ߕߍ߫ ߞߊ߬ߙߊ߲߬ ߠߊ߫߸ ߛߏ߬ߙߏ߲߬ߘߐ߬ ߖߏߣߡߊ ߟߎ߬ ߟߋ߬ ߟߊߓߊ߯ߙߊ ߌߘߐ߫ + ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫߸ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊߝߍߣߍ߲߫ + ߘߌ߬ߢߍ߬߸ ߊ߬ ߡߊ߫ ߟߊߥߌ߬ߟߴߊ߬ ߡߊ߬. + ߘߌ߬ߢߍ߬߸ ߞߏ߫ ߘߏ߫ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߏߢߊ߬. + ߟߌ߬ߤߟߊ: + ߡߎ߲߬ ߞߍߣߍ߲߫: + ߡߎ߲߬:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ (ߊ߲߬ߞߌ߬ߟߍ߬ ߞߊ߲ ߘߐ߫): + ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬: + ߦߋߡߍ߲ߕߊ ߘߐߞߊ߬ߙߊ߲߸ ߥߎ߬ߛߎ: + ߟߊ߬ߦߟߍ߬ߓߊ߮ ߞߐߦߌߘߊ߫ ߖߌߦߊ ߞߏ߬ߋߞߏ߬ߋ + ߊ߬ ߘߎߡߊ߲߫ ߒߧߍ߫ + ߊ߬ ߡߊ߲ߘߌ߫ ߒߧߍ߫ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ + ߢߐ߲߰ߘߐ߬ ߥߦߏ ߟߎ߬ + ߞߐߝߟߌ߫ ߕߍ߫ ߦߋ߲߬ + ߡߍ߲ߕߊ + ߞߵߊ߬ ߡߊߛߊ߬ߦߌ߬ + ߥߊ߯ + ߞߋ߲߬ + ߥߟߡ + ߞߊ߬ ߥߏ߬ߦߏ߫ ߣߊ߬ߕߊ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ ߞߍ߲ߖߘߍߡߊߓߟߏ ߡߊ߬ + ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߐߞߊ߬ߙߊ߲ ߓߟߏߕߎ߰ (ߞߊߣߊ߬ ߡߊߛߊ߬ߦߌ߬) ߥߏ߬ߦߏ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߟߊ߫ + ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߣߎߡߊ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ + ߘߊ߲߬ߘߌߦߊ ߢߌߣߌ߲ߠߌ߲ ߘߐ߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ + ߞߊ߬ ߘߐ߲߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߓߟߏߕߍ߯ߟߌ ߞߐߝߍ߬ (ߟߊߒߡߊ߫ ߘߐ߫، ߜߋߟߋ߲ߜߋߟߋ߲ ߠߊ߫ ߞߟߌߟߌ ߟߎ߬) + ߞߊ߬ ߞߍߞߌߦߊ ߦߌ߬ߘߊ߬ ߦߋߡߍ߲ߕߊ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߞߐߜߍ ߞߊ߲߬ \"ߝߎ߲ߞߊ߲ߡߊ\" ߥߟߊ߫ \"ߞߘߐߝߊ߲ߝߘߊ\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߬ ߕߎߡߊ + ߕߏߟߏ߲ߟߊ߲߫ ߠߊ߫ ߛߐߓߌ߬ߘߐ߬ߓߏ߲ + ߞߊ߬ ߞߣߐߘߐ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߞߣߐߘߐ ߟߎ߬ ߦߌ߬ߘߊ߬ ߤߊߟߌ߬ ߘߋ߲ߣߍ߲ ߠߎ߬ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߡߍ߲ ߡߊߝߍߣߍ߲߫ (ߦߏ߫ +߁߈) + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߮ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. +\n +\n\"%1$s\" ߟߊߢߊ߯ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߝߟߍ߫. + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߯ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. +\nߦߕߎߓߎ߫ ߟߊ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߏߛߐ߲߬ ߞߊ߬ ߓߍ߲߬ ߖߌ߬ߦߊ߬ߖߟߎ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߠߊ߫ ߞߏ ߡߊ߬، ߣߌߎߔߌߔ ߕߍ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߥߦߏ ߣߌ߲߬ ߛߌ߫ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߏ߬ ߞߏߟߐ߲߬ ߊ߬ ߕߍ߫ ߛߴߊ߬ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫. + ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߛߣߍ߫ + ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ + ߣߌߎߔߌߔ ߕߏߟߏ߲ߟߊ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߌ ߟߊ߫ ߘߝߐ߬ߦߊ߸ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬߸ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߊ߬ߣߌ߫ (ߢߣߊߕߊߟߌ ߘߐ߫) ߢߊߓߐߟߌ ߟߎ߬ ߘߌ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫ + ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߞߊ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߕߍ߫ ߓߍ߲߬. ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߌ߲߬ߞߌߙߊ ߢߡߊߛߊ߬ߦߌ߬ ؟ + ߟߊ߬ߖߌ߰ߟߌ ߢߣߊߥߟߊ߫ ߕߍ߫ ߛߋ߫ ߘߐߛߌ߰ ߟߊ߫ + ߊ߬ ߟߊߛߊ߬ ߞߏߛߊ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߞߊߣߊ߬ ߖߛߐ߫߸ ߞߊ߬ ߟߐ߲ߕߊ ߣߌ߫ ߦߟߌߕߏߟߊ߲ ߡߊߞߐߙߐ߲ߞߐߙߐ߲߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߘߌ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߦߟߌߡߊߛߌ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߕߏߟߊ߲ ߣߌ߫ ߝߘߍ߬ߜߍߟߍ߲ ߞߊ߲߬ + ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߢߡߊߘߏ߲߰ + ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߣߊ߬ߕߊ ߟߎ߬ ߣߌ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߞߊ߲߬ߛߓߍ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ ߣߴߊ߬ ߟߌ߬ߤߟߊ߬ ߜߘߍ߫ ߟߎ߬ ߢߡߊߘߏ߲߰ + ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬߬ ߟߊߛߊ߬ ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߝߏ߬ߘߏ ߢߡߊߘߏ߲߰߸ ߣߴߊ߬ ߦߋ߫ ߥߏ߬ߦߏ ߛߌ߲ߘߌߓߊ߮ ߣߌ߫ ߥߏ߬ߦߏ ߞߣߐߘߐ ߟߥߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߡߊߢߌߣߌ߲߫ ߘߌ߫ + ߦߟߌߡߊߛߌ߯ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫ + ߞߊ߬ ߦߟߌߡߊߛߌ߯ ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߞߊ߬ ߓߟߐߟߐ߫ ߞߐߜߍ ߟߎ߬ ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߯ ߘߐ߫ + ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߓߘߊ߫ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߮ ߞߣߐ߫ + ߞߴߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߴߊ߬ ߖߍ߬ߘߍߡߊ߬ + ߦߋߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߞߊ߬ ߟߐ߲ߕߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߕߏߟߏ߲ߖߘߍ߬ߡߊ + ߛߘߌ߬ߜߋ߲߫ ߕߊ߬ߓߊߟߌ + ߦߋߡߍ߲ߕߊ ߟߎ߬ ߞߊߣߊ߬ ߘߊߦߟߍ߬ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߞߣߐ߫߸ ߞߏ߬ߣߌ߲߬ ߞߵߊ߬ ߟߊߞߊ߬ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߘߐ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߥߟߏߒߖߘߍ߬ߡߊ ߜߊߛߏ߲ߣߍ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߣߴߌ ߓߐ߫ ߘߊ߫ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߗߏ߯ߦߊ ߘߐ߫ + ߞߣߐߘߐ߫ ߞߊ߲߫ ߖߏߣߡߊ + PeerTube ߛߐߘߊ ߟߎ߬ + ߌ ߟߊ߫ PeerTube ߛߐߘߊ߫ ߤߍߣߍ߲ߣߊ߲ߕߊ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫ + ߛߐߘߊ ߏ߬ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫ + ߕߏߟߏ߲ߟߊ߲ + ߊ߬ߓߍ߯ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ + ߥߙߏߝߋ ߟߎ߬ + ߖߌ߬ߦߊ߬ߖߟߎ ߟߎ߬ + ߓߟߏ + ߕߣߐ߬ߓߐ߬ߟߊ ߟߎ߬ + ߕߌߛߐ߲ ߠߎ߬ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߣߌߎߔߌߔ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߛߎ߬ߢߊ߬ ߞߋߟߋ߲߫ ߔߋ߫ + ߞߐߕߐ߮ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߟߎ߬ ߞߐߡߌ߲ߦߊ߫ + [ߟߐ߲ߓߊߟߌ] + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫ + ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߋ߲߬ߕߊ߯ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߥߦߏ߬ ߞߎߘߊ ߟߎ߬ + ߡߊ߬ߝߘߎ߬ߟߌ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߞߊ߬ ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߝߌߘߊ߲߫ + ߥߦߏ߬ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ ߊ߬ߣߌ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߡߊ߬ߝߍ߬ߣߍ߲߬ߣߍ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟ + ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߛߋ߫ ߡߊ߫ ߞߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߓߍ߯ ߖߛߐ߫ ߟߋ߫ + ߝߎ߬ߕߎ߲߬ߕߌ߬ ߘߊߓߍ߲߬ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫ + ߟߛߊ߬ߦߌ߬ߟߌ ߞߊ߬ ߝߘߊ߫ ߕߏߟߏ߲ߠߊ ߝߎ߬ߕߎ߲߬ߕߌ ߟߊ߫ + ߞߐߞߊ߲߫ ߕߏߟߏ߲ߟߊ߲ ߠߎ߬ ߕߍ߫ ߛߘߌ߬ߜߋ߲߬ ߛߎ߯ߦߊ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ + ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ + ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ + ߥߏ߬ߦߏ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߕߏߟߏ߲߫ ߠߊ߫ + ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߊߘߌ߬ߢߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߟߎ߫ ߞߐߞߊ߲߬ + ߣߌߎߔߌߔ ߓߘߊ߫ ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߛߐ߬ߘߐ߲߬߸ ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊ߲߭ߕߍ߰ + ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ ؟ + ߞߵߊ߬ ߞߏߝߐ߫ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫ + ߘߊ߲߬ߕߍ߰ߟߌ߬ ߢߊ߲ߞߊ߲ߦߊߣߍ߲ ߓߊߓߌߟߊ߫ + ߊ߬ ߞߏߝߐ߫ GitHub ߞߊ߲߬ + ߊ߬ ߞߏߝߐ߫ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߥߟߊ߬ ߞߵߊ߬ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ ߢߣߊߥߟߊ ߘߐ߫ ߕߏ߲ߘߋߣߍ߲߫ ߃ߝߍ߬ + ߝߏߛߌ߬ ߕߍ߫ ߦߋ߲߬ + ߊ߬ ߕߣߍߣߍ߫ ߞߵߊ߬ ߘߊߕߏߡߦߊ߫ + ߦߋߡߍ߲ߕߊ + ߊ߬ ߡߊߝߍߣߍ߲߫ ߣߴߌ ߟߊ߫ ߝߙߋߞߋ߫ ߛߎ߮ ߣߌ߲߬ ߘߊ߲߭ߕߍ߰ߣߍ߲߫ ߞߘߐ߬ߡߊ߲߫. ߝߙߋߞߋ߫ ߞߋߟߋ߲ ߓߊ߫ ߞߏߝߐ߫ ߞߏ߫ ߝߌ߲߬߸ ߏ߬ ߦߋ߫ ߊ߲ ߠߊ߫ ߕߎ߬ߡߊ ߟߋ߬ ߘߐߕߌߢߍ߫ ߟߊ߫߸ ߞߊ߬ ߞߏ߫ ߜߘߍ߫ ߟߎ߫ ߞߍ ߘߐߛߊ߬ ߊ߲ ߡߊ߬. + ߞߊ߲߬ߛߓߍ + ߝߊ߬ߝߘߎ߬ߓߊ߯ ߖߊ߬ߕߋ ߡߊ߬ߛߐ߬ߘߐ߲߬ߣߍ߲߬ ߕߍ߫ + ߞߊ߬ ߗߋߢߊ߫ ߟߎ߬ ߟߊߦߟߍ߬ߡߊ߲߬߸ ߡߍ߲ ߠߎ߬ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߕߋ߲߬: + ߡߊ߬ߝߘߎ߬ߓߊ߰ ߝߏߛߌ߬ + + ߡߊ߬ߝߘߎ߬ߓߊ߰ %s + + ߦߋߟߌ߫ ߕߍ߫ ߦߋ߲߬ + + ߦߋߞߏ߫ %s + + ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߘߐߜߍ߫ ߠߊ߫ + + ߘߐߜߍߓߊ߯ %s + + ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߟߊߡߍ߲߫ ߠߊ߫ + + ߟߊ߬ߡߍ߲߬ߓߊ߰ %s + + ߦߋߡߍ߲ߕߊ߫ ߕߍ߫ ߦߋ߲߬ + ߦߋߡߍ߲ߕߊ߫ ߁߀߀+ + ߞߊ߲߬ߞߎ߬ߡߊ߬ ߕߍ߫ ߦߋ߲߬ + + ߥߦߏ߬ ߞߎߘߊ߫ %s + + ߞߵߊ߬ ߟߊߟߐ߬ + ߞߵߊ߬ ߛߌ߲ߘߌ߫ + ߜߋ߲߬ߟߎ߲߬ߠߌ߲߫ ߘߊ߬ߡߊ + ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬ + ߞߵߊ߬ ߕߐ߯ߟߊ߫ + ߞߐߕߐ߯ ߕߐ߮ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߢߐ߲߰ߝߍ + ߝߎ߬ߕߎ߲߬ߕߌ + ߣߌߎߔߌߔ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߟߊ߫ + ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߕߐ߬ߝߍ߬ߦߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߫ ߛߌ߫ ߡߊ߫ ߘߊ߬ߠߊߕߍ߰ ߡߎߣߎ߲߬߸ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߬ ߖߏߣߡߊ ߛߎߥߊ߲ߘߌ߫ ߛߌߛߍ߲߬ + ߞߵߊ߬ ߝߎߟߋ߲߫ + ߞߟߏߘߋ߲߫ ߞߙߍߞߙߍߣߍ߲ ߝߊ߲߬ߓߊ + ߣߌߎߔߌߔ ߞߊ߲߬ + © %1$s߸ %2$s ߓߟߏ߫ %3$s ߞߘߐ߫ + ߊ߬ ߞߊ߲߬ & ߢߞߛ + ߡߊ߬ߜߍ߲߬ߠߌ߲ ߞߍ߫ + ߣߌߎߔߌߔ ߟߊ߬ߘߌߜߍ + ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ + ߣߴߌ ߞߊ߬ ߜߟߍ߬ߦߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߟߥߊߟߌߟߊ߲ ߠߊߓߊ߯ߙߊ ߘߐ߫߸ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߡߊߝߍߣߍ߲߫ ߹ + ߘߝߐ߬ߦߊ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߝߌ߬ߛߌ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߘߐ߫؟ + ߦߋߡߍ߲ߕߊ߫ ߦߋߣߍ߲ߓߊ ߟߎ߬ + ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߣߐߘߐ + ߏ߬ ߘߴߌ ߟߊ߫ ߛߋ߲߬ߠߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߓߍ߯ ߝߌߘߊ߲߫. + ߛߎߥߊ߲ߘߟߌ ߞߍ߫ ߛߏ߬ߙߌ߲߬ߘߐ ߟߎ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߫ ߦߌ߬ߘߊ߬ߕߐ߫ ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߊ߲߬ + ߝߌ߬ߛߌ ߘߏ߫ ߕߣߍ߬ߣߍ߫ ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߞߐߜߍ߫ ߘߐߞߏߟߏ߲ + ߡߊ߬ߝߘߎ߬ߓߊ߰ ߕߍ߫ ߥߙߏߝߋ ߟߊ߫ ߝߟߐ߫ + ߥߙߏߝߋ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߝߍ߲߬ߛߍ߲߫ + ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߛߏ߬ߘߊ߲߬ߛߏ߬ ߅߀ + ߞߍߟߌ߫ ߖߏߣߡߊ ߞߣߐߘߐ߫ ߘߊߦߟߍ ߘߐ߫ — %s + ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ + ߝߎ߲ߞߊ߲ߡߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ + ߞߊ߬ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߞߍ߫ ߞߎߘߍߦߌ߫ + ߡߊ߲߬ߞߊ߲ ߕߍ߰ + ߡߊ߲߬ߞߊ߲ ߓߌ߬ߟߊ߬ + ߊ߬ ߞߍ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߘߌ߫ + ߞߏ߬ߋ߬ߞߏ߬ߋ߬ ߘߎ߲ߡߕߊ ߓߐ߫ ߦߋ߲߬ + ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊߞߎ߲߬ߘߎ߬ + ߟߌ߬ߥߟߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲… + ߞߣߐߘߐ߫ ߡߊߢߌߣߌ߲ߣߍ߲ ߖߛߐߟߌ + ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎߘߊ + ߞߵߊ߬ ߘߐߕߐ߯ߟߊ߫ + ߞߊ߬ ߜߡߊ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ؟ + ߕߏߟߏ߲߫ ߛߙߍߘߍ ߓߘߊ߫ ߛߌ߲ߘߌ߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫ + ߓߊߟߌߣߍ߲ ߓߘߊ߫ ߝߙߊ߬ ߛߎ߬ߢߊ߬ %d + ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ (ߟߊ߬ߦߟߍ߬ߓߊ߮ ߡߊ߫ ߛߐ߬ߘߐ߲߬) + ߞߘߐ߫ ߛߓߍ߫ ߛߌ߫ ߕߍ߫ ߦߋ߲߬ + ߞߵߊ߬ ߟߊߓߍ߲߬ + ߞߵߊ߬ ߟߝߊ߫ + ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ + ߞߘߐߛߓߍ ߟߎ߬ + ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߫ ߜߋ߬ߟߎ߲ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߜߊߘߊ߲߫ + ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߝߙߊߕߌ ߦߌ߬ߘߊ߬ + ߝߎ߬ߕߎ߲߬ߕߌ߬ ߛߐߓߌߘߐߓߏ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫ + ߞߵߊ߬ ߟߊߛߣߍ߫ + ߊ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߯ + ߞߵߊ߬ ߟߊߓߐ߫ ߞߊߕߘߍ߬ + ߟߊ߬ߛߣߍ߬ߟߌ ߦߴߌߘߐ߫… + ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫ + ߟߊ߬ߓߐ߬ߟߌ߫ ߕߊ߬ߡߌ߲߬ߣߍ߲ + ߦߋߡߍ߲ߕߊ߫ ߞߎߘߊ + ߦߋߡߍ߲ߕߊ߫ ∞ + + ߦߋߡߍ߲ߕߊ߫ %s + + ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߞߐ߬ߣߐ߲߬… + ߊ߬ ߓߘߊ߫ ߓߊߓߌߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ + ߊ߬ ߡߊ߫ ߛߋ߫ ߓߊߓߌߟߊ߫ ߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ + ߢߋߙߋ߲ߞߎ߲߫ ߖߊ߬ߕߋ߬ߓߐ + ߡߊ߬ߞߏ ߦߋ߫ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߣߌ߲߬ ߠߊ߫ ߞߊ߬ +\nߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߊߦߟߍ߬ + ߝߛߌ߬ ߞߋߟߋ߲߫ ߓߘߊ߫ ߖߏ߬ߛߌ߬. + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ ߡߊߢߌߣߌ߲ߣߍ߲߫ + ߌ ߓߴߊ߬ ߝߎߟߋ߲߫ ߦߋ߫ \"ߊ߬ ߓߘߊ߫ ߓߊ߲߫\" ߛߐ߲߬ߞߌ߲߫ + ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߣߍ߲ ߠߎ߬ ߞߐߕߐ߯ ߕߐ߮ ߘߐ߫ + ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߓߊߟߌ ߟߎ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ߕߐ߫ ߡߐ߬ߟߐ߲ ߣߌ߬ ߠߋ߬ ߟߊ߫ + ߣߘߐ߬ߓߌ߬ߟߊ߬ߟߌ߬ ߞߟߏߘߋ߲ + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ + ߟߊ߬ߘߌߢߍ ߟߎ߬ + ߊ߬ ߡߊߝߍߣߍ߲߫ GitHub ߞߊ߲߬ + ߊ߲ ߞߣߐߘߐߘߌߦߊ߫ + ߞߊ߬ ߓߟߏߢߐ߲߯ߠߊߛߊ߬ߦߌ߬ + ߊ߬ ߞߍ߫ ߘߊ߫ ߘߟߊߡߌߣߊߟߌ߫ ߡߙߌߦߊ߫ ߘߌ߫ ߓߊ߬߸ ߥߟߊ߫ ߡߊ߬ߞߙߍ߬ߟߌ߫߸ ߥߟߊ߫ ߘߏߝߙߍߕߍ߫ ߟߛߊߣߌ߲ߧߊ߫߸ ߤߊߡߊ߲ߕߍ߫ ߘߏߝߙߍߕߍ߫ ߡߝߊߟߋ߲. ߘߍ߬ߡߍ߲ ߞߍ߫ ߘߊ߫ ߢߊ߫ ߛߌ߫ ߡߊ߬߸ ߊ߬ ߞߊߢߌ߲߬. ߏ߬ ߟߋ ߦߴߊ߬ ߟߊߢߊ߬ ߟߊ߫ ߓߘߍߞߍ߹ + ߗߍߦߙߐ + ߣߌߎߔߌߔ ߟߊ߫ ߗߍߦߙߐ ߡߊߝߍߣߍ߲߫ ߞߊ߬ ߟߌ߬ߤߟߊ ߟߎ߬ ߣߌ߫ ߗߍߞߎߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. + ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ + ߞߊ߬ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߊ߬ߙߊ߲߬ + ߞߊ߬ ߟߊ߬ߘߌߢߍ ߞߊ߬ߙߊ߲߬ + ߊ߬ ߡߊߝߍߣߍ߲߫ ߗߍߦߙߐ ߟߊ߫ + ߘߝߐ߬ߦߊ + ߞߐߟߕߊ߫ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ + ߥߙߏߝߋ߫ ߞߐߜߍ + ߝߎ߲ߞߎ߲ߟߋ߲ + ߥߙߏߝߋ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߝߎ߲ߞߎ߲ߟߋ߲߫ ߖߏߣߡߊ + ߝߎ߲ߞߎ߲ߟߋ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߊ߬ ߓߘߊ߫ ߟߊߛߣߍ߫ + ZIP ߞߐߕߐ߮ ߕߍ߫ ߛߐ߲߬ + ߊ߬ ߓߘߊ߫ ߟߊߓߐ߫ + ߖߊ߲߬ߕߏ߬ߒߘߐ: ߞߐߕߐ߮ ߟߎ߬ ߓߍ߯ ߕߍ߫ ߛߋ߫ ߟߊߛߣߍ߫ ߟߊ߫. + ߕߏߟߏ߲߫ ߛߙߍߘߍ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߬ ߕߍ߫ ߝߟߐ߫ + ߞߊ߲ ߘߌߣߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߣߌ߫ ߟߥߊߟߌߟߊ߲ ߣߊ߬ ߘߊ߫ ߘߐߟߥߌ߬ + ߛߊ߲ߞߊߥߟߌ ߟߎ߬ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߖߛߐ߫ ߟߊ߫ + ߘߌ߲߬ߞߌ߬ߙߊ߬ߡߊ + ߘߌߦߊߢߍߣߍ߲ߓߊ ߟߎ߬ + ߜߊ߬ߙߊ ߟߎ߬ + ߕߏߟߏ߲߫ ߛߙߍߘߍ + ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߢߊߓߐߟߌ ߟߎ߬ + ߊ߬ ߘߌ߯ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߞߎߘߊ ߣߌ߫ ߞߟߊߡߊ߲ + ߞߎߘߊ߫ ߝߙߊ߬ߣߍ߲ ߠߎ߬ + ߞߵߊ߬ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߊ߬ ߓߘߊ߫ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫ + ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߥߏ߬ߦߏ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߖߛߐ ߦߴߌߘߐ߫… + ߢߣߊߥߟߊ ߘߊߦߟߍ߬ + ߢߣߊߥߟߊ ߘߊߕߎ߲߯ + ߟߞߊ߬ߟߌ߫ ߞߍߟߊ߲߫ ߛߊ߬ߥߏ߬ߣߍ߲ߕߊ + ߕߐ߮ + ߞߵߊ߬ ߝߙߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊ߫ + LeakCanary ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߞߊ߬ ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߬ ߦߌ߬ߘߊ߬ + ߞߊ߬ \"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\" ߦߌ߬ߘߊ߬ + ߞߊ߬ \"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\" ߦߌ߬ߘߊ߬ + ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߠߊߥߟߌ߬ + ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߠߊߜߊߛߊ߲߫ + ߗߋߢߊߟߌ ߟߎ߬ ߞߟߏߜߍ߫ ߓߐߛߎ߲ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߕߐ߫ ߟߋ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߘߐ߫ + ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ + ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߣߴߌ ߞߊ߬ ߥߊ߲߬ߊߥߊ߲߬ ߝߌ߲ ߦߋ߫ ߥߟߊ߫ ߜߊߘߊ߲ߜߊߘߊ߲ߠߌ߲ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߐߛߊߙߌ߫ ߕߎߡߊ + ߞߊ߬ ߖߌ߬ߦߊ߬ߓߍ߫ ߦߌ߬ߘߊ߬ߟߊ߲ ߠߎ߫ ߝߍ߲߬ߛߍ߲߫ + ߏ߬ ߦߋ߫ ߔߌߛߊߞߏ߫ ߟߊ߫ ߡߙߎߝߋ߫ ߞߟߐ߬ߡߊ ߟߎ߫ ߟߋ߬ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߫ ߞߎ߲߬ߘߐ߫ ߞߵߊ߬ߟߎ߬ ߓߐߛߎ߲ ߦߌ߬ߘߊ߬: ߥߎߟߋ߲߬ߡߊ߲ ߦߋ߫ ߞߙߏ߬ߝߏ ߕߊ ߘߌ߫߸ ߓߊ߯ߡߊ ߦߋ߫ ߝߘߍ߬ ߜߍߟߍ߲ ߕߊ ߘߌ߫ ߊ߬ߣߌ߫ ߝߙߌߛߌߡߊ ߦߋ߫ ߦߟߌߕߏߟߊ߲ ߕߊ ߘߌ߫ + ߟߊ߬ߓߐ߬ߟߌ ߦߴߌߘߐ߫… + ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߟߊߛߊ߬ߣߍ߲ ߠߋ߬ + ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߘߌ߬ߢߍ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߛߎߥߊ߲ߘߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߞߐߟߊ߫ + ߛߓߍߘߋ߲ ߣߋ߫ ߖߊ߬ߕߋ߬ߘߋ߲ ߠߎ߬ + ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߊ ߞߊߟߌ߲ ߣߌ߫ ߝߍ߯ߡߊ߲ ߊ߲ߘߙߏߦߌߘ ߞߊ߲߬. + ߣߌߎߔߌߔ ߟߊߥߙߌߞߌߣߍ߲߫ ߓߐߒߖߘߍߘߐߓߊ߮ ߟߎ߫ ߟߋ߬ ߓߟߏ߫ ߊ߬ߟߎ߬ ߟߊ߫ ߕߎ߬ߡߊ߬ ߘߐ߬ߞߏߟߏ߲ ߠߎ߬ ߘߐ߫߸ ߞߴߊ߬ ߟߊߢߊ߬ ߊ߬ߟߎ߬ ߛߋߞߏ߫ ߘߊ߬ߡߊ߬ߦߌߙߊ ߟߊ߫. ߌ ߘߌ߫ ߛߋ߫ ߝߌ߬ߙߋ߲߬ߕߎ߬ ߛߐ߲ߞߐ ߘߌ߫ ߟߴߊ߬ߟߎ߫ ߡߊ߬߸ ߞߴߊ߬ߟߎ߬ ߞߣߐߘߐߘߌߦߊ߫ ߟߢߊ߬ߟߌ ߟߊ߫ ߓߘߍߞߍ. + ߣߌߎߔߌߔ ߘߊߞߎ߲ ߦߴߊߟߎ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߕߊ߬ ߟߊ߫ ߛߍ߬ߓߍ ߖߍ߬ߘߍߖߍ߬ߘߍ ߟߋ߬ ߟߊ߫. ߏ߬ ߘߐ߫߸ ߟߥߊߟߌߟߊ߲ ߕߍ߫ ߟߐ߲ߕߊ߫ ߛߌ߫ ߟߥߊ߫ ߟߊ߫ ߣߴߊ߬ ߡߴߌ ߟߊ߫ ߘߌ߬ߢߍ ߢߌߣߌ߲߫. +\nߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߦߴߊ߬ ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߟߴߌ ߢߍ߫ ߟߋ߬ ߥߘߋ߬ߥߘߋ߬ߟߌ ߘߝߊߣߍ߲ ߘߐ߫߸ ߟߐ߲ߕߊ߫ ߢߌ߬ߡߊ߲߬ ߠߥߊߕߐ߫ ߊ߬ ߣߌ߫ ߢߌ߬ߡߊ߲߬ ߠߊߞߎ߲߬ߘߎ߲߬ߕߐ߫ ߌ ߓߊ߫ ߞߍ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߟߊ߫. + ߣߌߎߔߌߔ (NewPipe) ߦߋ߫ ߡߊ߬ߞߏ߬ߟߊ߬ߓߐ߬ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫: ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߵߊ߬ ߞߊ߬ߙߊ߲߬߸ ߞߵߊ߬ ߘߐߕߟߊ߫߸ ߊ߬ߣߌ߫ ߞߵߊ߬ ߟߊߢߊ߬ ߦߏ߫ ߊ߬ ߘߎߡߊ߲߫ ߌ ߢߍ߫ ߢߊ ߡߍ߲. ߊ߬ ߕߌ߯ߕߌ߮ ߘߐ߫߸ ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߠߊ߫ ߥߟߊ߫ ߞߊ߬ ߘߐ߬ߝߊ߬ߟߋ߲߬ߠߌ߲ ߞߍ߫ ߊ߬ ߘߐ߫ ߝߘߏ߬ߓߊ߬ ߟߊߘߌߢߍ߫ ߛߙߊߕߌ ߟߎ߬ ߞߘߐ߫ (GNU General Public License) ߦߏ߫ ߊ߬ ߟߊߖߍ߲ߛߍ߲ߣߍ߲߫ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߎ߬ ߛߌ߲ߘߌߘߊ ߓߟߏ߫ ߢߊ ߡߍ߲ (Free Software Foundation) ߊ߬ ߓߐߞߏ߫ ߃߲ ߘߐ߫߸ ߥߟߊ߫߸ ߌ ߛߊ߬ߥߏ߬ߣߍ߲߬ߕߊ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߊ߬ ߓߐߞߏ߫ ߞߘߐ߫ ߛߌ߫ ߡߊ߬. + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߝߊߣߊ߲߫ ߟߊߛߣߍ߫؟ + ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߊ߲߬ߝߘߊ ߞߘߐ߫ + ߦߙߍߞߍߟߌ ߦߴߌߘߐ߫... ߊ߬ ߘߌ߫ ߛߋ߫ ߥߛߎ߬ ߞߎߘߎ߲߬ߣߍ߲߫ ߕߊ߬ ߟߊ߫ + ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬. + ߞߵߊ߬ ߥߊߘߏ߫ + ߞߊ߬ Rx ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ߫ ߟߊߘߌߓߊߟߌ ߟߎ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߞߘߊߡߊ߫ ߞߎߘߎ߲ ߠߎ߬ ߞߐߞߊ߲߬ ߥߟߊ߫ ߥߊߟߌߦߊ ߛߌ߬ߡߊ߬ߦߊ ߞߎ߲߬ߕߊ߮ ߞߘߐ߫ ߦߙߍߞߍߟߌ߫ ߞߐߝߍ߬ + ߞߊ߬ ߕߎ߬ߡߘߊ߬ ߓߐߛߎ߲ߡߊ ߦߌ߬ߘߊ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߎ߫ ߞߊ߬ + ߜߘߍ ߟߊ߫ ߟߊ߬ߘߌߢߍ + ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ + ߝߌ߬ߛߌ ߣߌ߲߬ ߦߋ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߝߎߛߋߡߦߊߣߍ߲ ߠߎ߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫. + ߞߊ߬ ߞߟߏߜߍ߫ ߘߍ߲߬ߘߍ߲ ߣߌ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߫ ߞߘߐߛߓߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߝߙߋߞߟߊ ߟߎ߬ ߡߊߝߊ߬ߟߋ߲߬. ߡߊ߬ߞߏ ߦߋ߫ ߟߥߊߟߌߟߊ߲߫ ߘߐ߬ߥߌ߬ߟߌ ߟߊ߫ ߞߵߊ߬ ߓߟߏߦߊ߫ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߛߌ߬ ߓߊ߲ߣߍ߲ ߠߎ߬ ߞߏߐߝߐ߫ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߍ߫ ߟߊߛߣߍ߫ ߟߊ߫ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊߓߐ߫ ߟߊ߫ + ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮߸ soundcloud.com/ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮ + ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߗߋߥߊߟߌ ߣߌ߲߬ ߘߌߣߊ߬ ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߛߐ߫ ߞߏߛߓߍ߫. +\n +\nߞߵߊ߬ ߓߟߏߕߎ߲߰؟ + ߞߵߊ߬ ߢߡߊߛߊ߬ߦߌ߬ + ߞߊ߲ߡߊߛߙߋ߫-ߕߟߊ + ߞߊ߬ ߓߍ߲߬ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߝߘߏ߬ߓߊ߬ ߞߎߙߎ߲ߘߎ (GDPR) ߡߊߓߏ߲߬ߧߊ ߡߊ߬߸ ߊ߲ ߧߴߌ ߖߊ߲߭ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߐ߫. ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߘߐߞߊ߬ߙߊ߲߬ ߞߏߢߌ߲߬ߡߊ߬. +\nߌ ߞߊߞߊ߲߫ ߠߋ߬ ߞߵߌ ߛߐ߲߬ ߊ߬ ߡߊ߬ ߞߏ߫ ߛߴߌ ߘߌ߫ ߛߋ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߊ߲ ߡߊ߬. + ߌ ߛߐ߲߬ + ߌ ߓߊ߲߬ + ߘߊ߲߬ ߕߴߊ߬ ߟߊ߫ + ߞߊ߬ ߓߍ߲߬ߡߊ ߘߊ߲߬ߠߊߕߍ߬ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߕߎߡߊ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߣߊ߬ + ߞߙߏ߬ߝߏ߫ ߛߎ߮ ߓߍ߯ + ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ + ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ ߡߊߝߍߣߍ߲߫ + ߞߊ߬ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲߫ ߓߟߏ ߟߊ߫ + ߞߵߊ߬ ߡߊߖߌ߰ ߟߥߊߟߌߟߊ߲ ߘߐߦߟߍߡߊ߲߫ ߕߎߡߊ + ߝߏߛߌ߬ + ߞߵߊ߬ ߡߊߖߌ߰ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߊߦߟߍ߬ ߊ߬ ߖߍ߬ߘߍߡߊ߬ — %s + ߥߝߌ߫ ߘߐߙߐ߲߫ ߞߊ߲߬ + ߦߋߟߌ߫ ߗߏ߯ߦߊ߫ ߛߙߍߘߍ + ߢߊ߲ߛߊ߲ + ߔߊ߬ߔߘߊ + ߖߘߍ߬ߢߍ߫ + ߞߊ߬ ߢߍߕߊ߮ ߜߊߟߊ߲ߞߊ ߟߊߕߌ߲ ߦߌ߬ߘߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߞߊ߲߬ + ߓߘߍ߬ߦߊ߫ ߘߎ߰ߟߊ߬ߕߊ (ߘߐ߰ߡߊ߬ߣߍ߲) + ߊ߬ ߞߣߊ߫ ߦߌ߬ߘߊ߬ + ߌ ߦߋ߫ ߣߌߎߔߌߔ ߓߐߞߏ߫ ߟߊߓߊ߲ ߠߋ߬ ߟߊߓߊ߯ߙߊ ߟߊ߫ + ߊ߬ ߕߐߘߐ߲߫ ߞߵߊ߬ ߟߊߖߌ߰ %s + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߘߞߐ߬ߣߐ߲߬ߠߌ߲ + ߊ߬ ߟߊߟߐ߬ߣߍ߲߫ + ߞߐߝߍ߫-ߦߙߍߞߍߟߌ + ߟߛߊ߬ߦߌ߬ߟߌ + ߞߵߊ߬ ߟߊߕߎ߲߰ + ߓߊ߲߬ ߓߘߊ߫ ߞߍ߫ ߗߋߥߊߟߌ ߘߐ߫ ߞߊ߲ߞߋ ߓߟߏ߫ + ߟߏ߲ߘߐߦߊߟߌ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߦߴߌߘߐ߫… + ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ + ߞߐߕߐ߯ ߘߏ߫ ߓߘߊ߫ ߟߊߖߌ߰ ߕߐ߯ ߛߎ߯ ߞߋߟߋ߲ ߣߌ߲߬ ߘߌ߫ ߞߘߐ߬ߡߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߴߌߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫ + ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߦߌ߬ߘߊ߬ + ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߠߊߞߊ߲ߘߊߣߍ߲ ߕߍ߫ ߛߋ߫ ߓߌ߬ߟߊ߬ ߟߊ߫ ߛߋ߲߬ߠߊ߫ + ߛߐߘߊ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ + ߛߐߘߊ ߕߍ߫ ߟߐ߲ߕߊ߫ ߟߊߣߊ߬ ߟߊ߫ + ߊ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߞߐߝߍ߫-ߦߙߍߞߍߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ + ߣߌߎߔߌߔ ߘߊߕߎ߲߯ ߘߊ߫ ߟߋ߬ ߞߵߊ߬ ߕߘߍ߬ ߊ߬ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ ߞߐߕߐ߮ ߞߊ߲߬ + ߜߍߞߣߍ߫ ߛߌ߫ ߕߍ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߢߍߕߊ߮ ߓߘߊ߫ ߝߏ߫߸ ߓߊߏ߬ ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ + ߟߊ߬ߖߌ߰ߟߌ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫ + ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߫ + ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߝߍ߬ߘߍ ߞߊ߲߬ ؟ + ߟߥߊߟߌߟߊ߲߫ ߞߊ߲ + ߞߵߊ߬ ߟߞߊߟߌߦߊ߫ ߡߊ߬ߞߎ߲ ߕߎ߬ߡߊ ߟߎ߬ ߘߐ߫ + ߛߋ߲߬ߘߊ + ߗߡߍ߬ߘߐ߬ߦߊ + ߕߎ߬ߢߊ߬ߟߐ߲ ߡߊߛߊ߬ߦߌ + ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߛߎ߯ߦߊ + ߞߊ߬ ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߦߌ߬ߘߊ߬ ߣߌ߫ ߓߐߞߏ߫ ߞߎߘߊ߫ ߛߐ߬ߘߐ߲߬ ߘߊ߫ + ߞߵߊ߬ ߡߊߖߌ߰ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߐ߫ + ߤߓߊߘߊ߲߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߞߊ߬ ߕߐ߯ ߞߎ߲߬ߞߋߟߋ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫ + + ߟߊ߬ߖߌ߰ߟߌ߬ %s ߓߘߊ߫ ߓߊ߲߫ + + ߞߵߊ߬ ߞߊ߲߬ߟߊ߫ + ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߦߋ߫ ߞߐߕߐ߮ ߘߏ߫ ߟߊ߫ ߦߊ߲߬ ߞߘߐ߬ߡߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߋ߫ ߘߞߐ߬ߣߐ߲߬ߠߌ߲ ߠߊ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ ߖߊ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߘߐߛߊ߬ ߕߍ߫ + ߞߵߊ߬ ߓߟߏߕߍ߰ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߠߊ߫ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߟߊ߫ + ߊ߬ ߕߐ߬ߣߐ ߦߴߊ߬ ߟߊ߫ ߦߟߍ߬ߡߊ߲߬ ߕߎߡߊ ߜߋߟߋ߲ߜߋߟߋ߲ߠߊ߫ ߟߐ߲ߕߊ ߟߎ߫ ߞߊ߲߬߸ ߞߏ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߓߍ߯ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߘߎ߲߬ߠߌ߲ ߡߊ߬ + ߞߵߊ߬ ߘߊߕߎ߲߯ + + ߟߊ߬ߖߌ߰ߟߌ߬ %1$s ߓߘߊ߫ ߖߏ߬ߛߌ߬ + + ߞߵߊ߬ ߟߊߟߐ߬ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߡߌ߬ߣߊ߬ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߟߊߘߎ߲߫ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߥߊ߫ ߦߙߐ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߫ + ߌ ߣߊ߬ߕߐ߫ ߟߋ߬ ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߟߊߞߎ߲߬ߘߎ߲߬ ߦߙߐ ߡߊ߬. +\nߟߊ߬ߘߌߢߍ ߘߌ߫ ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߡߊ߬ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߟߊߖߌ߰ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߠߋ߫ ߞߊ߲߬ + ߞߊ߬ ߘߊ߲߭ߛߌ߰ ߟߊ߬ߖߌ߰ߟߌ߫ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߫ ߣߊ߬ߕߐ߬ ߞߍ߫ ߟߊ߫ ߕߎ߬ߡߊ߬ߣߍ߲߬ ߞߋߟߋ߲ ߠߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߓߍ߯ ߟߊߞߎ߲߬ߘߎ߬ ߦߙߐ ߘߌߣߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߵߌ ߟߊ߫ + ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߟߊߓߊ߯ߙߊ߫ + ߛߐߘߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ + ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ߛߙߍߘߍ ߣߌ߲߬ ߘߐ߫ ؟ + ߌ ߟߊ߫ ߦߕߎߓߎ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߫ Google Takeout: +\n +\n߁. ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߐߡߌ߬ߘߊ߬: %1$s +\n߂. ߌ ߜߊ߲߬ߞߎ߲߬ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ +\n߃. ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߦߴߊ߬ ߘߐ߫\"߸ ߏ߬ ߞߐ߫ ߦߋ߫ \"ߞߊ߬ ߓߍ߯ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߓߐ߫\"߸ ߏ߬ ߞߐ߫߸ ߌ ߦߋ߫ \"ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬\" ߘߐߙߐ߲߫ ߓߊߕߐߡߐ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߏ߬ߞߍ߫\" ߛߐ߲߬ߞߌ߲߫ +\n߄. ߌ ߦߋ߫ \"ߢߍߕߊ\" ߛߐ߲߬ߞߌ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߟߊ߬ߓߐߟߌ ߘߏ߫ ߛߌ߲ߘߌ߫\" ߛߐ߲߬ߞߌ߲߫ +\n߅. ߌ ߦߋ߫ \"ߞߊ߬ ߟߊߖߌ߰\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߟߊ߲ߞߣߍߡߊߣߍ߲ ߞߐ߫ +\n߆. ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫ ߦߊ߬߸ ߦߋ߫ .zip ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߛߎߥߊ߲ߘߌ߫ +\n߇. [ߣߌ߫ ߝߝߝ ߟߊߛߣߍ ߗߌߙߏ߲߫ ߘߊ߲߫] ߦߋ߫ ߝߝߝ ߞߐߕߐ߮ ߓߐ߬ߛߌ߬ ߊ߬ ߘߐ߫ (ߊ߬ ߛߌߦߊߡߊ߲ ߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߠߋ߬ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\")߸ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߐߕߐ߮ ߟߊߛߣߍ߲߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫߸ ߞߊ߬ csv ߞߐߕߐ߯ ߓߐ߬ߛߌ߬ߣߍ߲ ߛߎ߲ߥߊ߲ߘߌ߫ + ߌ ߟߊ߫ SoundCloud ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߠߊߘߏ߬ ߥߊߟߴߌߟߊ߫ ߜߊ߬ߞߎ߲߬ߕߐ߮ ߞߊ߬ SoundCloud ߢߊߞߙߍ߫ ߘߏ߫ ߟߊߛߣߍ߫: +\n +\n߁. \"ߛߓߍߘߊ߫ ߗߏ߯ߦߊ\" ߟߊߢߊ߯ ߌߟߊ߫ ߓߟߐߟߐ߫ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ (ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߏ߬ ߕߴߌߟߊ߫ ߕߙߏߞߏ߫ ߕߊ߬ߕߊ ߟߊ߫) +\n߂. ߥߊ߫ ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߊ߲߬: %1$s +\n߃. ߌ ߜߊ߲߬ߞߎ߲߬ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ +\n߄. ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߓߊߓߌߟߊ߫߸ ߌ ߟߊߛߌ߲߫ ߛߊ߲ ߦߋ߫ ߡߍ߲ ߡߊ߬ ߏ߬ ߘߌ߬. + ߘߐ߬ߛߊ߬ߙߌ߬ߟߌ߫ ߓߏ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ + ߞߍߛߋ߲ + ߞߊ߲ߡߊߛߙߋ + ߓߐߢߐ߲߯ߓߟߏ (ߊ߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߘߐ߬ߝߊ߰ߟߌ ߛߊߓߎ߫ ߘߌ߫) + ߞߍߥߟߌ߫ ߞߍߕߊ߸ ߌ ߓߊ߫ ߞߍ߫ ߦߟߍ߬ߡߊ߲߬ ߠߊ߫ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫ ߞߵߌ ߕߏ߫ ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߞߊ߲߬ — %s + ߛߙߍߘߍ + ߓߘߍ߬ߦߊ߫ ߛߊ߲ߘߐߕߊ (ߓߟߋ߬ߓߟߋ߬ߓߊ) + ߣߌߎߔߌߔ ߟߏ߲ߘߐߦߊߟߌ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ ߦߋ߫߹ + ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߞߊ߲߬ߟߊ߫ ߟߊ߫ + ߞߎ߲߬ߕߋߟߋ߲߫ ߞߎ߲ߓߍ߲ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ + ߛߐߘߊ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߥߙߍ ߟߎ߫ ߡߊ߬߸ ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߛߊ߬ߦߌ߬ @string/msg_threads = 1 ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߛߋ߬ ߟߊ߫ ߞߍ߫ ߟߊ߫ ߛߐߘߊ ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߛߕߊ ߓߘߊ߫ ߓߊ߲߫ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ ߥߟߊ߫ ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ؟ + \"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\" ߟߋ߬ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬ + ߞߵߊ߬ ߘߊߡߌ߲߬ߣߊ߬ ߊ߲ߘߙߏߌߘ 10 ߡߊ߬߸ \"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\" ߟߋ߬ ߘߐ߲߬ߙߐ߲߫ ߕߊ߬ ߟߊ߫ + ߞߊ߲ߞߋ ߟߊ߫ ߖߏߣߡߊ + ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ + ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ + ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. +\nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹ + ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫ + ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫ + + ߡߌ߬ߛߍ߲߬ %d + + + ߕߎ߬ߡߊ߬ߙߋ߲߬ %d + + ߖߛߐߓߊߟߌ ߟߎ߬: %d + ߥߏ߬ߦߏ ߖߛߐ… + ߥߏ߬ߦߏ ߦߙߍߞߍ… + ߥߏ߬ߦߏ߫ ߝߋ߲߫ ߞߎߘߊ ߟߎ߬ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫ + ߡߊ߬ߝߘߎ߬ߟߌ߬ ߛߌ߫ ߛߎߥߊ߲ߘߌߣߍ߲߫ ߕߍ߫ + + %d ߛߎߥߊ߲ߘߌߣߍ߲߫ + + ߞߙߎ ߕߐ߮ ߘߐߞߏߟߏ߲ ߠߋ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߞߙߎ ߣߌ߲߬ ߖߏ߬ߛߌ߫ ؟ + ߞߎߘߊ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ߬ ߞߙߎߝߓߊߟߌ ߟߎ߬ ߘߐߙߐ߲߫ ߦߌ߬ߘߊ߬ + ߥߏ߬ߦߏ + ߥߏ߬ߦߏ߫ ߟߊߞߎߘߦߊ ߟߎ߬ ߕߍߟߊ + ߕߎ߬ߡߊ ߡߍ߲ ߕߊ߬ߡߌ߲ ߞߐ ߘߐ߫߸ ߥߏ߬ߦߏ ߟߎ߬ ߞߊߞߊ߲߫ ߞߊ߬ ߖߊ߬ߕߋ߬ ߞߘߐ߬ߡߊ߲ ߘߌ߫ — %s + ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߢߊ߯ + ߞߊ߬ ߥߏ߬ߦߏ ߟߎ߫ ߦߌ߬ߘߊ߬/ߢߡߊߘߏ߲߰ + ߣߌߎߔߌߔ ߕߍ߫ ߞߣߐߘߐ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ ߡߎߣߎ߲߬. +\n +\nߕߎ߬ߡߊ߬ ߘߐ߫߸ ߊ߬ ߘߌ߫ ߛߴߊ߬ ߕߊ߬ ߟߊ߫ ߓߐߞߏ߫ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫. + ߥߙߏߝߋ߫ ߞߐߖߌߦߊ߫ ߞߏ߬ߋߞߏ߬ߋ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. +\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬ + ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. + %s ߦߋ߫ ߞߎ߲߭ ߣߌ߲߬ ߠߋ߬ ߝߐ߫ ߟߊ߫: + ߛߊ߲ߞߊߥߟߌ + ߥߎߢߊ߲ߓߍ߲ + ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ) + ߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ — %s + ߌ ߘߌ߫ ߛߴߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ ߟߊ߫ ߘߎ߰ߟߊ߫ ߦߊ߲߬ + ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߘߊߡߌ߲߬ߣߊ߬ + ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߛߊ߬ ߞߊ߲߬ߛߓߍ ߘߐ߫ + ߝߊ߬ߓߏ߲ + ߞߊ߲ + ߞߐߞߘߐߓߌ߲ߓߌ߲ + ߖߊ߬ߕߌ߮ + ߞߏ߬ߋߞߏ߬ߋ߫ ߛߘߌ߬ߜߋ߲ + ߝߘߏ߬ߓߊ + ߊ߬ ߛߙߍߘߍߦߊߣߍ߲߫ ߕߍ߫ + ߘߎ߲߬ߘߎ߬ߡߊ + ߞߣߐߕߊ + ߞߊ߲߬ߞߎ߬ߡߊ߬ ߜߊߘߊ߲ߣߍ߲ + ߡߍ߲ ߕߊ߲߬ߘߏ߬ߣߍ߲߫ ߛߌ߲ߘߌߓߊ߮ ߓߟߏ߫ + ߥߟߊ߬ߙߋ߲ ߗߏ߯ߦߊ + ߟߊߢߊ߯ߣߍ߲ + ߟߊߛߊ߬ߣߍ߲ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߛߊ߬ߣߍ߲߫ + ߞߊ߬ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߡߊߛߐ߬ߘߐ߲߬ + ߸ + ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߓߘߍ߬ߦߊ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߓߘߍ߬ߦߊ߬ ߟߐ߲ߓߊߟߌ + ߡߎ߰ߡߍ߬ ߡߊߝߍߣߍ߲ߣߍ߲ + ߝߊ߲߬ߞߋ߬ߟߋ߲߬ ߡߊߝߍߣߍ߲ߣߍ߲ + ߣߊ߬ߕߐ + ߞߵߊ߬ ߘߐߕߐ߬ߡߐ߲߬ + ߞߊ߲ߠߊߛߓߍ ߟߎ߬ + ߟߊ߬ߘߌߢߍ + ߜߎ߲߬ߘߎ߬ߞߏ + ߛߌ߬ߞߛߊߓߌ߫ ߘߊ߲߭ + ߥߦߏ߬ ߛߎߥߊ߲ߘߌߣߍ߲ ߕߍ߫ ߕߊ߬ ߟߊ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߓߟߏ߫ + ߞߵߊ߬ ߓߍ߯ ߟߊߢߊ߯ + ߥߦߏ߬ ߟߎ߬ ߕߍߣߊ߫ ߦߌ߬ߘߊ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߬ ߕߊ߬ߣߍ߲߬ ߕߍ߫ ߡߎߣߎ߲ + ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߢߊ߲ߞߊ߲߫ ߟߐ߲ߓߊߟߌ + + ߝߌ߬ߟߊ߲߬ %d + + ߞߎߘߊ ߟߎ߬ + ߥߙߏߝߋ߫ ߘߙߎ ߟߎ߬ + ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ ߞߍ߫ ߘߊ߫: %s + + ߕߟߋ߬ %d + + ߝߎ߬ߕߎ߲߬ߕߌ ߥߏ߬ߦߏ ߖߛߐ߫ ߕߎߡߊ + \'%s\' ߥߏ߬ߦߏ ߕߍ߫ ߛߋ߫ ߖߛߐ߫ ߟߊ߫. + ߛߌ߲ߘߌߓߊ߮ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߕߍ߰. +\nߣߌߎߔߌߔ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߖߛߐ߫ ߟߊ߫ ߡߎ߬ߕߎ߲߬. +\nߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߛߊ߬ ߥߙߏߝߋ ߣߌ߲߬ ߡߊ߬ ؟ + ߥߦߏ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߕߍ߫ ߟߌ߬ߤߟߊ߬ ߘߌߦߊߡߊ߲߫ ߘߌ߫ ߟߊ߫ ߝߐߡߊ ߣߌ߲߬ ߞߊ߲߬. + ߞߵߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߥߦߏ߬ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߝߍ߬ ߣߴߏ ߘߌ߫ ߓߍ߲߬ + ߞߵߊ߬ ߟߊߞߎߘߦߊ߫ ߞߘߊߎ߫ + ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߟߊ߬ + ߞߊ߬ ߥߦߏ߬ ߢߍߕߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߛߌ߲ߘߌߣߍ߲߫ %s ߟߋ߬ ߓߟߏ߫ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߞߐߜߍ + %s ߓߟߏ߫ + ߞߐߟߕߊ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߊߓߊ߯ߙߊ߫ ߣߍ߰ߟߌ߬ ߢߊߝߘߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߣߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊ߫ + ߛߌ߰ߘߊ ߟߎ߬ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߦߌ߬ߘߊ߬ + ߟߥߊߟߌߟߊ߲߫ ߛߌ߫ ߕߴߌ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߡߍ߲ ߘߌ߫ ߛߋ߫ ߣߌ߲߬ ߠߊߞߊ߬ ߟߊ߫ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. +\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߥߟߊ߫ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߞߊ߬ \'%s\' ߟߊߛߊ߬ ߟߊ߬ߖߌ߰ߟߌ߲߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ + ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߘߎ߲߬ߘߎ߬ߡߊ ߟߋ߬ ߘߌ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. + ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߓߍ߰ + ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߢߊ߯ ߞߊ߲߬ߛߓߍ ߘߐ߫ + ExoPlayer ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ + ߝߙߏߝߋ ߣߌ߲߬ ߡߊߝߘߎߣߌ߲߫ ߌ ߓߟߏ߫ ߡߎ߬ߕߎ߲߬ + ߞߊ߬ ߞߍߦߙߐ ߘߊߦߟߍ߬ + ߣߌ߲߬ ߦߋ߫ SoundCloud Go+ ߜߋ߬ߙߋ ߘߏ߫ ߟߋ߬ ߘߌ߫߸ ߡߍ߲ ߕߴߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. + ߊ߬ ߦߋ߫ ߗߋߢߊ ߘߏ߫ ߟߎ߫ ߘߐ߫߸ ߊ߬ߟߋ߬ ߞߊߟߌߡߊ߲ߓߊ ߟߋ߬ ߝߊߣߊ߲߫ ߦߋ߫߸ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߌ߫ ߛߋ߫ ߝߌ߬ߛߌ߫ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߠߥߊ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߟߌ߬ߤߟߊ߬ ߘߝߊߓߊߟߌ ߟߎ߬ (ߟߊߒߡߊ߫ ߘߐ߫߸ ߥߎ߬ߛߎ߸ ߝߌ߬ߛߌ ߛߎ߯ߦߊ ߥߟߊ߫ ߝߊ߲ߞߢߊ߫ ߟߌ߬ߤߟߊ) + ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߣߐ߬ߓߐ߬ߟߊ߫ ߛߙߊ߬ߓߐ߬ߟߊ ߟߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. + ߊ߬ ߦߴߌ ߢߣߊ߫ ߟߋ߬ ߞߏ߫ ߥߏ߬ߦߏ ߟߎ߬ ߖߛߐ ߟߊߛߎߡߊߡߊ߲߫ ߠߋ߬ ߞߏߖߎ߯ߦߊ߫؟ ߣߴߏ߬ ߟߋ߸ ߖߛߐߟߌ߫ ߞߊߟߌ߲ ߡߊߝߍߣߍ߲߫ (ߌ ߘߌ߫ ߛߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߥߟߊ߫ ߘߎ߰ߟߊ߬ߘߐ߬ ߞߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫). +\n +\nߣߌߎߔߌߔ ߘߌ߫ ߛߋ߫ ߥߏ߬ߦߏ ߟߎ߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߢߊ߫ ߝߌ߬ߟߊ߫ ߟߋ߫ ߡߊ߬: +\n• ߞߊ߬ ߝߙߏߝߋ߫ ߡߊߝߘߎߣߍ߲ ߠߎ߬ ߡߎ߰ߡߍ ߡߊߛߐ߲߬ߘߐ߲߬߸ ߏ߬ ߛߎߡߊߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫. +\n• ߞߊ߬ ߗߋߢߊ߫ ߓߟߏߡߞߊ߬ߣߍ߲ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߏ߬ ߟߞߊߟߌߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫ ߕߍ߫. +\n +\nߞߍߢߊ߫ ߝߌ߬ߟߊ ߏ߬ ߘߊ߲߬ߝߘߊ߬ߓߐ ߦߋ߫ ߟߋ߬߸ ߡߍ߲ ߞߊߟߌߡߊ߲߫ ߏ߬ ߕߍ߫ ߟߌ߬ߤߟߊ߫ ߓߍ߯ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߦߏ߫ ߝߌ߬ߛߌ ߥߎ߬ߛߎ ߣߴߊ߬ ߛߎ߯ߦߊ (ߢߟߊ߫ ߦߋߟߌ ߘߐ߫ ߘߊ߲߬ߝߘߊ߬ߓߐ߬ ߕߴߊ߬ ߝߊ߲ߞߢߊ߫ ߦߋߡߍ߲ߕߊ ߟߎ߬ ߣߌ߫ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߕߍ߫)߸ ߊ߬ ߘߏ߲߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߴߊ߬ ߡߊ߫ ߥߙߏߝߋ߫ ߝߌ߬ߛߌ ߟߎ߬ ߓߍ߯ ߡߊߛߐ߬ߘߐ߲߬. +\n +\nߟߊߒߡߊ߫ ߘߐ߫߸ ߦߕߎߓߎ ߦߋ߫ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ߬ ߞߊߟߌ߲ (RSS ߥߏ߬ߦߏ) ߕߊ߬ ߟߊ߫. +\n +\nߏ߬ ߘߐ߫߸ ߌߟߋ ߟߵߊ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߠߊ߫: ߣߴߌ ߦߋ߫ ߞߊߟߌߦߊ ߟߋ߫ ߝߍ߬ ߥߟߊ߫ ߟߌ߬ߤߟߊ߬ ߖߐ߲ߖߐ߲. + ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. + ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ + ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. + ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߬ ߢߡߊߘߏ߲߰ + \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index eacac40f1..7fd1f2762 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -73,7 +73,7 @@ ଉଦାହରଣ ବୈଧ କରିପାରିଲା ନାହିଁ ଭିଡିଓ ବର୍ଣ୍ଣନା ଏବଂ ଅତିରିକ୍ତ ସୂଚନା ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ଅଡିଓ - ବାହ୍ୟ ଅଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଅଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ଯୋଡ଼ନ୍ତୁ ସଦସ୍ୟତା ଅଦ୍ୟତନ କରିପାରିଲା ନାହିଁ ଟ୍ୟାବ୍ ବାଛନ୍ତୁ @@ -82,7 +82,7 @@ ଭିଡିଓ ଫାଇଲ୍ ପାଇଁ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ ଡିଫଲ୍ଟ ରେଜୋଲୁସନ କୋଡି ସହିତ ଖୋଲନ୍ତୁ - ଦ୍ୱିତୀୟ କ୍ରିୟା ବଟନ୍ + ଦ୍ୱିତୀୟ କୃତ୍ୟ ବଟନ୍ ପୁନରାବୃତ୍ତି କରନ୍ତୁ ବିଜ୍ଞପ୍ତିକୁ ରଙ୍ଗ କରନ୍ତୁ ପପ୍ଅପ୍ ର ଶେଷ ଆକାର ଏବଂ ସ୍ଥିତି ମନେରଖ @@ -202,21 +202,21 @@ ଡିଫଲ୍ଟ ଅଡିଓ ଫର୍ମାଟ୍ ଅକ୍ଷୟ ସନ୍ଧାନ ପ୍ଲେୟାରକୁ ହ୍ରାସ ହୋଇଥିବା ସଠିକତା ସହିତ ଶୀଘ୍ର ପଦବୀ ଖୋଜିବାକୁ ଅନୁମତି ଦିଏ । 5, 15 କିମ୍ବା 25 ସେକେଣ୍ଡ ଖୋଜିବା ଏହା ସହିତ କାମ କରେ ନାହିଁ %s ପାଇଁ ଫଳାଫଳ ଦେଖାଉଛି - ବାହ୍ୟ ଭିଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଵିଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ସଦସ୍ୟତା ରଦ୍ଦ କରନ୍ତୁ ଚ୍ୟାନେଲ ସଦସ୍ୟତା ରଦ୍ଦ ହେଲା ସଦସ୍ୟତା ପରିବର୍ତ୍ତନ କରିପାରିଲା ନାହିଁ ସୂଚନା ଦେଖାନ୍ତୁ - ମିଶାଅ + ଏଥିରେ ଯୋଡ଼ିବା ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ\? ଥମ୍ୱନେଲ କୁ 1:1 ଅନୁପାତରେ କ୍ରୋପ୍ କରନ୍ତୁ - ପ୍ରଥମ କ୍ରିୟା ବଟନ୍ - ତୃତୀୟ କ୍ରିୟା ବଟନ୍ - ଚତୁର୍ଥ କ୍ରିୟା ବଟନ୍ - ପଞ୍ଚମ କ୍ରିୟା ବଟନ୍ + ପ୍ରଥମ କୃତ୍ୟ ବଟନ୍ + ତୃତୀୟ କୃତ୍ୟ ବଟନ୍ + ଚତୁର୍ଥ କୃତ୍ୟ ବଟନ୍ + ପଞ୍ଚମ କୃତ୍ୟ ବଟନ୍ ଶଫଲ୍ ବଫରିଂ କିଛି ନୁହେଁ @@ -253,7 +253,7 @@ ସମସ୍ତ ପ୍ଲେ କରନ୍ତୁ ସର୍ବଦା ଫାଇଲ୍ - ବିଜ୍ଞପ୍ତି ଗୁଡିକ + ଵିଜ୍ଞପ୍ତି ଆପ୍ ଅଦ୍ୟତନ ବିଜ୍ଞପ୍ତି ନୂତନ NewPipe ସଂସ୍କରଣ ପାଇଁ ବିଜ୍ଞପ୍ତି ଭିଡିଓ ହ୍ୟାସ୍ ବିଜ୍ଞପ୍ତି @@ -273,7 +273,7 @@ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରେ ସନ୍ଧାନ ଇତିହାସ ସଫା କରନ୍ତୁ ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି\? - ବାହ୍ୟ ସଂରକ୍ଷଣ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଷ୍ଟୋରେଜ୍ ଅନୁପଲବ୍ଧ ନେଟୱର୍କ ତ୍ରୁଟି ସମସ୍ତ ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରିପାରିଲା ନାହିଁ ୱେବସାଇଟ୍ ପାର୍ସ କରିପାରିଲା ନାହିଁ @@ -392,7 +392,7 @@ ବନ୍ଦ କର ଡାଉନଲୋଡ୍ ବିରତି କରନ୍ତୁ କେଉଁଠାରେ ଡାଉନଲୋଡ୍ କରିବେ ପଚାରନ୍ତୁ - \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ + \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ ଆଣ୍ଡ୍ରଏଡ୍ 10 ରୁ କେବଳ \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ସମର୍ଥିତ ଏକ ଉଦାହରଣ ବାଛନ୍ତୁ ExoPlayer ପ୍ରତିବନ୍ଧକ ହେତୁ ସନ୍ଧାନ ସମୟସୀମା %d ସେକେଣ୍ଡରେ ସେଟ୍ ହୋଇଥିଲା @@ -427,7 +427,7 @@ ଓଭର୍ ରାଇଟ୍ କରନ୍ତୁ ଥମ୍ବନେଲ୍ URL ହୋଷ୍ଟ - ଜନସାଧାରଣ + ସାର୍ଵଜନୀନ ତାଲିକାଭୁକ୍ତ ନୁହେଁ ବ୍ୟକ୍ତିଗତ ମନ୍ତବ୍ୟଗୁଡିକ ଅକ୍ଷମ ହୋଇଛି @@ -508,7 +508,7 @@ \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । ତ୍ରୁଟି ରିପୋର୍ଟ ଆଲବମ୍ ଗୁଡ଼ିକ - ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭବ ନୁହେଁ ।ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରନ୍ତୁ\? + ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି\? ଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଛି କେବଳ ଥରେ ନୂତନ ପାଇପ୍ ବିଜ୍ଞପ୍ତି @@ -525,7 +525,7 @@ ତ୍ରୁଟି ଭିଡିଓ URL ଦସ୍ତଖତକୁ ଡିବଫସ୍କେଟ୍ କରିପାରିଲା ନାହିଁ ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା - ବାହ୍ୟ ପ୍ଲେୟାରମାନେ ଏହି ପ୍ରକାର ଲିଙ୍କକୁ ସମର୍ଥନ କରନ୍ତି ନାହିଁ + ବହିଃ-ଚାଳକ ଏଭଳି ଲିଙ୍କ୍ ସମର୍ଥନ କରେନି ଫାଇଲ୍ ଘୁଞ୍ଚିଗଲା କିମ୍ବା ଡିଲିଟ୍ ହେଲା ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ପ୍ଲେଲିଷ୍ଟ ବୁକମାର୍କ ନାହିଁ ସେପରି କୌଣସି ଫାଇଲ / ବିଷୟବସ୍ତୁ ଉତ୍ସ ନାହିଁ @@ -590,14 +590,14 @@ \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଦେଖାନ୍ତୁ - ଆଭ୍ୟନ୍ତରୀଣ + ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ସୃଷ୍ଟିକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ହୃଦୟ ଷ୍ଟ୍ରିମ୍ ଯାହା ଏପର୍ଯ୍ୟନ୍ତ ଡାଉନଲୋଡର୍ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ ଅଜ୍ଞାତ ଫର୍ମାଟ୍ - ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍ କୁ କେଉଁଠାରେ ସେଭ୍ କରାଯିବ ତାହା ଆପଣଙ୍କୁ ପଚରାଯିବ । -\nଯଦି ଆପଣ ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) କୁ ସକ୍ଷମ କରନ୍ତୁ + ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\' ଆପଣଙ୍କୁ ପଚରାଯିବ। +\nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ ମେମୋରୀ ଲିକ୍ ଦେଖାନ୍ତୁ ଆଇଟମଗୁଡିକରେ ମୂଳ ସମୟ ପୂର୍ବରୁ ଦେଖାନ୍ତୁ ବିସର୍ଜନ ପରେ ଖଣ୍ଡ କିମ୍ବା କାର୍ଯ୍ୟକଳାପ ଜୀବନଚକ୍ର ବାହାରେ ଅଣସଂରକ୍ଷିତ Rx ବ୍ୟତିକ୍ରମଗୁଡିକର ଫୋର୍ସ ରିପୋର୍ଟିଂ @@ -616,8 +616,8 @@ ଗୋଟିଏ ଡାଉନଲୋଡ୍ ଏକ ସମୟରେ ଚାଲିବ ସମ୍ପ୍ରତି ଟାବଲେଟ୍ ମୋଡ୍ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଅଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ ଭବିଷ୍ୟତର ଆଇଟମ୍ ଲୁଚାନ୍ତୁ ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ @@ -706,7 +706,7 @@ ଟ୍ୟାଗ୍ସ ସୂଚିତ କର , - ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବାହ୍ୟ ଖେଳାଳିଙ୍କ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ + ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବହିଃ-ଚାଳକ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ %s ଜଣ ଶ୍ରୋତା ମୋଟ %s ଜଣ ଶ୍ରୋତା @@ -741,4 +741,11 @@ ପୁରା ଦେଖାଯାଇଛି ଆଂଶିକ ଦେଖାଯାଇଛି ଆଗାମୀ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ବାମ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ବାମ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ଡାହାଣ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ଡାହାଣ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ଉଜ୍ଜ୍ୱଳତା + ଭଲ୍ୟୁମ୍ + କିଛି ନୁହେଁ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index f5a38353b..3759b42a0 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -741,4 +741,11 @@ ਆਗਾਮੀ ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ ਸਟ੍ਰੀਮ ਵਿਖਾਓ/ਲੁਕਾਓ + ਸੱਜੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਖੱਬੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਚਮਕ + ਕੋਈ ਨਹੀਂ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਆਵਾਜ਼ \ 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 895b1a935..e46190d44 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -420,7 +420,7 @@ \nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci Minął czas połączenia Używaj systemowego selektora folderów (SAF) - Systemowy selektor folderów (SAF) umożliwia pobieranie na kartę pamięci + Storage Access Framework umożliwia pobieranie na kartę pamięci Wyczyść pozycje odtwarzania Usuwa wszystkie pozycje odtwarzania Usunąć wszystkie pozycje odtwarzania\? @@ -529,7 +529,7 @@ 100+ wideo Artyści Albumy - Piosenki + Utwory To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. @@ -642,7 +642,7 @@ \nNewPipe nie będzie w stanie załadować tego kanału w przyszłości. \nCzy chcesz anulować subskrypcję tego kanału\? Nie udało się załadować kanału dla „%s”. - Począwszy od Androida 10 obsługiwany jest tylko systemowy selektor folderów (SAF) + Począwszy od Androida 10 obsługiwany jest tylko Storage Access Framework Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik Nie ustawiono jeszcze folderu zapisywania, wybierz domyślny teraz Błąd podczas ładowania kanału @@ -761,4 +761,11 @@ W pełni obejrzane Częściowo obejrzane Nadchodzące + Wybierz gest dla lewej strony ekranu odtwarzacza + Akcja gestu z lewej + Wybierz gest dla prawej strony ekranu odtwarzacza + Jasność + Głośność + Brak + Akcja gestu z prawej \ 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 bfa888d6b..e16fae2b7 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -753,4 +753,11 @@ Parcialmente assistido Em breve Totalmente assistido + Escolha o gesto da mão esquerda da tela do jogador + Ação do gesto esquerdo + Escolha o gesto da mão direita da tela do jogador + Brilho + Volume + Nenhum + Ação do gesto direito \ 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 f38a4180d..6d85f60fb 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -753,4 +753,11 @@ Proximamente Remover duplicados\? Quer remover todos os fluxos duplicados nesta lista de reprodução\? + Ação de gesto de esquerda + Ação do gesto correto + Luminosidade + Volume + Nenhum + Escolher gesto para metade esquerda do ecrã do reprodutor + Escolher gesto para metade direita do ecrã do reprodutor \ 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 9719292ec..b04740759 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -753,4 +753,11 @@ Completamente visto Mostrar os seguintes vídeos Parcialmente visto + Ação de gesto de esquerda + Ação do gesto correto + Luminosidade + Volume + Nenhum + Escolher gesto para metade esquerda do ecrã do reprodutor + Escolher gesto para metade direita do ecrã do reprodutor \ 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 bb3ef6665..d0239a062 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -204,7 +204,7 @@ Importați baza de date Exportați baza de date Suprascrie istoricul, abonamentele, listele de redare și (opțional) setările curente - Exportează istoricul, abonamentele, playlist-urile și setările + Exportați istoricul, abonamentele, listele de redare și setările Nu a putut reda acest flux A apărut o eroare irecuperabilă a player-ului Se recuperează din eroarea player-ului @@ -729,13 +729,13 @@ Afișați elementele din viitor Ascunde elementele vizionate Ascunde elementele din viitor - Vezi pe website + Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! Întrebări frecvente - Sortează + Sortare Modul rapid Importați sau exportați abonamente din meniul cu 3 puncte - Rulați cea mai recentă versiune NewPipe + Folosiți cea mai recentă versiune NewPipe Atingeți pentru a descărca %s Această opțiune este disponibilă numai dacă %s este selectată ca temă Cartelă @@ -743,11 +743,11 @@ Dezactivare miniatură permanentă Listele de redare care colorate în gri conțin deja acest element. Duplicat adăugat de %d ori - Ignoră evenimentele butonului media hardware - Util, de exemplu, dacă utilizezi o cască cu butoane fizice defecte - Dorești să elimini toate fluxurile dublate din această listă de redare\? + Ignorați evenimentele butonului media hardware + Util, de exemplu, dacă utilizați o cască cu butoane fizice defecte + Doriți să eliminați toate fluxurile dublate din această listă de redare\? Eliminare dubluri - Elimini dublurile\? + Eliminați dublurile\? Afișează următoarele fluxuri Afișare/Ascundere fluxuri Vizionat complet diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 687d83549..43b5c772f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -68,7 +68,7 @@ Не удалось создать меню загрузки Приложение/UI завершило работу Никогда такого не было, и вот опять. - Отправить по электронной почте + Отправить по почте Извините, что-то пошло не так. Отчёт Информация: @@ -325,7 +325,7 @@ При открытии ссылки Хотите импортировать настройки? Конфиденциальность - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия. \nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. @@ -746,9 +746,9 @@ Доступно, когда Тема установлена в %s Убрать постоянную миниатюру Дубликат добавлен %d раз(а) - Плейлисты, выделенные серым уже содержат этот объект. - Игнорировать события аппаратной мультимедийной кнопки - Полезно, например, если вы используете гарнитуру со сломанными физическими кнопками + Плейлисты, выделенные серым, уже содержат этот объект. + Игнорировать события аппаратных кнопок + Полезно при использовании гарнитуры со сломанными кнопками Показать следующие стримы Показать/скрыть стримы Полностью просмотрено @@ -756,5 +756,12 @@ Удалить дубликаты Удалить дубликаты\? Частично просмотрено - Вы хотите удалить все повторяющиеся потоки в этом плейлисте\? + Удалить все дубликаты потоков в этом плейлисте\? + Жест для левой стороны экрана плеера + Действие жеста слева + Жест для правой стороны экрана плеера + Действие жеста справа + Яркость + Громкость + Ничего diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 676a8dd07..544e32520 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -740,4 +740,11 @@ Bidu de su totu Bidu in parte Luego + Atzione de su gestu de manca + Atzione de su gestu de destra + Volume + Issèbera unu gestu pro sa metade de manca de s\'ischermu de su riproduidore + Issèbera unu gestu pro sa metade de destra de s\'ischermu de su riproduidore + Luminosidade + Perunu \ 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 a3bb7068b..ceb872449 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -17,11 +17,11 @@ Tar bort ljud vid vissa upplösningar Använd extern ljudspelare Bakgrund - Extrafönster - Mapp för hämtning av video + Popup + Hämtningsmapp för video Hämtade videofiler lagras här - Välj hämtningsmappen för videofiler - Mapp för hämtning av ljud + Välj hämtningsmapp för videofiler + Hämtningsmapp för ljud Hämtade ljudfiler lagras här Välj hämtningsmapp för ljudfiler Standardupplösning @@ -39,7 +39,7 @@ Ljust Mörkt Svart - Kom ihåg popupstorlek och position + Kom ihåg popup inställningar Kom ihåg popup-rutans senaste storlek och position Sökförslag Välj förslag att visa i samband med sökning @@ -90,7 +90,7 @@ Håll koll på videor som du tittat på Återuppta uppspelning Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal) - Visa \"Håll för att placera i kön\"-tips + Visa \"Håll för att köa\"-tips Visa tips när bakgrunds- eller popup-knappen trycks på sidan för videodetaljer Spelare Beteende @@ -151,7 +151,7 @@ Hämta Tillåtna tecken i filnamn Ogiltiga tecken ersätts med detta värde - Ersättningstecknet + Ersättningstecken Bokstäver och siffror De flesta specialtecken Om NewPipe @@ -175,13 +175,13 @@ Välj en kanal Inga kanal prenumerationer ännu Välj en kiosk - Trendigt + Trendande Topp 50 Nytt och populärt Ta bort Detaljer Ljudinställningar - Håll för att placera i kön + Håll för att köa Börja spela i bakgrunden Börja spela i en popup Donera @@ -190,7 +190,7 @@ Webbplats För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats. Visa info - Bokmärkta spellistor + Bokmärkta Spellistor Lägg till i Använd snabb icke-exakt sökning Läs in miniatyrbilder @@ -214,7 +214,7 @@ Spår Användare Växla till Bakgrunden - Växla till popup + Växla till Popup Växla till main Importera databas Exportera databas @@ -280,9 +280,9 @@ Passa Fyll Zoom - Autogenererade + Automatiskt genererad Textning - Ändra spelarens textskala och bakgrundsstil. Kräver omstart av appen för att träda i kraft + Ändra spelarens textskala och bakgrundsstil. Kräver att appen startas om för att träda i kraft Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning Rapportera out-of-lifecycle fel Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning @@ -303,7 +303,7 @@ \n4. Klicka på \"Nästa steg\" och sen på \"Skapa export\" \n5. Klicka på \"Hämta\"-knappen när den kommer fram \n6. Klicka på IMPORTERA FIL nedan och välj den nedladdade zip-filen -\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/prenumerationer/prenumerationer.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen +\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/subscriptions/subscriptions.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen Importera en SoundCloud-profil genom att skriva in webbadressen eller ditt ID: \n \n1. Aktivera \"skrivbordsläge\" i en webbläsare (sidan är inte tillgänglig för mobila enheter) @@ -330,7 +330,7 @@ Minimera vid växling av applikationen Åtgärd när du växlar till andra applikationer från huvudvideospelare — %s Ingen - Minimera till bakgrunds-spelare + Minimera till bakgrundsspelare Minimera till popup-spelare Sluta prenumerera Välj flik @@ -353,7 +353,7 @@ Listvy Lista Rutnät - Automatiskt + Automatisk En NewPipe-uppdatering är tillgänglig! Färdig pausad @@ -431,7 +431,7 @@ kan inte skriva över filen Det finns redan en hämtad fil med det här namnet En fil med det namnet finns redan - återställer + återhämtar Väntande Originaltexter från tjänster kommer att synas i streamobjekt Visa ursprungstid på objekt @@ -536,8 +536,8 @@ Femte åtgärdsknappen Fjärde åtgärdsknappen Tredje åtgärdsknappen - Andra händelseknapp - Första händelseknapp + Andra åtgärdsknappen + Första åtgärdsknappen Detta innehåll stöds ännu inte av NewPipe. \n \nDetta kommer förhoppningsvis ändras i en kommande version. @@ -574,7 +574,7 @@ Inaktivera för att dölja videobeskrivning och ytterligare information Visa meta-information Använd miniatyrbild som bakgrund till både låsskärm och aviseringar - Redigera varje aviseringshandling nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger + Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger Låt Android färglägga varje avisering individuellt utifrån miniatyrbildens huvudsakliga färg (notera att detta inte är tillgängligt på alla enheter) Färglägg avisering Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! @@ -637,7 +637,7 @@ Aviseringar för videohashningsframsteg Miniatyrbild-webbadress Inaktivera medietunnel om du upplever en svart skärm eller stamning vid videouppspelning - Inaktivera mediatunnel + Inaktivera medietunnel Hjärtmärkt av innehållsskaparen Du kan välja det natt-tema du föredrar nedan Välj det natt-tema du föredrar — %s @@ -659,7 +659,7 @@ Senaste Svep objekt för att ta bort dem Förslag via fjärrsökning - Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om auto-rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge + Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om automatisk rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge Visa Picasso färgade band ovanpå bilderna som anger deras källa: rött för nätverk, blått för disk och grönt för minne Sök efter uppdateringar Kolla manuellt efter nya versioner @@ -669,7 +669,7 @@ Krascha spelaren Visar ett kraschalternativ vid användning av spelaren Felrapport-avisering - Avisering för att rapportera fel + Aviseringar om att rapportera fel NewPipe stötte på ett fel, tryck för att rapportera Ett fel uppstod, se aviseringen Visa en fel snackbar @@ -681,6 +681,7 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard + Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver att spelaren startas om Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk @@ -688,7 +689,7 @@ Aviseringar är avstängda Bli meddelad Du har nu prenumenerat till denna kanalen - Avisering om nya strömmar för prenumenanter + Aviseringar om nya strömmar för prenumerationer %s Ny ström %s Nya strömmar @@ -699,7 +700,7 @@ Aviseringar Nya strömmar Laddar strömdetaljer… - Avisering om nya strömmar + Aviseringar om nya strömmar , Spelaravisering Växla alla @@ -740,4 +741,11 @@ Visa/Dölj strömmar Fullständigt sedd Kommande + Volym + Ingen + Välj en gest för den vänstra halvan av spelarskärmen + Ljusstyrka + Vänster gest åtgärd + Välj en gest för den högra halvan av spelarskärmen + Höger gest åtgärd \ 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 9b07dd7f7..d2cf9b9c2 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,9 +1,9 @@ - Başlamak için büyütece dokun. + Başlamak için büyütece dokunun. %1$s tarihinde yayınlandı Akış oynatıcısı bulunamadı. VLC kurulsun mu\? - Yükle + Kur İptal Tarayıcıda aç Paylaş @@ -421,8 +421,8 @@ Öntanımlı Kiosk Kimse izlemiyor - %s izleyen - %s izleyen + %s izleyici + %s izleyici Kimse dinlemiyor @@ -481,8 +481,8 @@ Abonelikleri seç Abonelik seçilmedi - %d seçildi - %d seçildi + %d öğe seçildi + "%d öğe seçildi" Boş grup adı Bu grubu silmek istiyor musunuz\? @@ -683,8 +683,8 @@ Yeni akış bildirimleri Bildirimler - %s yeni akış - %s yeni akış + %s yeni yayın + %s yeni yayın Yeni akışları denetlemeyi çalıştır Oynatıcı bildirimi @@ -740,4 +740,8 @@ Tamamen izlendi Yaklaşan Kısmen izlendi + Parlaklık + Ses düzeyi + Hiçbiri + Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin \ 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 4436b30e9..913892dc2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -197,7 +197,7 @@ Про застосунок і ЧаП Вільне та легке потокове програвання на Android. Які б не були ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг — будь-яка допомога завжди у пригоді. Що більше зроблено, то ліпшим стає NewPipe! - Зневадження + Налагодження Нічого немає… чути лише цвіркунів Немає переглядів @@ -595,7 +595,7 @@ Додано у чергу Додати у чергу Розв\'язати - Обчислення гешу + Обчислення хешу Очистити збережені під час вирішення reCAPTCHA реп\'яшки (cookies) Реп\'яшки (cookies) reCAPTCHA видалено Очистити реп\'яшки (cookies) reCAPTCHA @@ -757,4 +757,11 @@ Показати такі трансляції Повністю переглянуто Частково переглянуто + Яскравість + Нічого + Дія жестом ліворуч + Виберіть жест для лівої половини екрана програвача + Виберіть жест для правої половини екрана програвача + Дія жесту праворуч + Гучність \ 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 7d0f15132..e1e15038b 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -28,7 +28,7 @@ Hiện độ phân giải cao hơn Chỉ một số thiết bị hỗ trợ phát video 2K/4K Phát bằng Kodi - Cài đặt ứng dụng Kode\? + Cài đặt ứng dụng Kodi\? Hiện tùy chọn \"Phát bằng Kodi\" Hiện tùy chọn phát video qua trung tâm media Kodi Âm thanh @@ -663,7 +663,7 @@ Mục thông báo mới Làm trình phát dừng Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework. +\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống LeakCanary không khả dụng @@ -716,4 +716,13 @@ Nhấn để tải %s Chế độ tia sét Danh sách này bị trùng lặp. + Hữu ích trong trường hợp phím bấm âm lượng trên tai nghe hoặc thiết bị của bạn bị hỏng + Không nhận phím điều khiển âm lượng vật lý + Loại bỏ mục trùng lặp + Loại bỏ mục trùng lặp\? + Bạn có muốn loại bỏ tất cả các nguồn trùng nhau trong danh sách phát này\? + Hiện/Ẩn nguồn phát + Hiện các nguồn phát sau + Đã xem xong + Đã xem 1 phần \ 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 b4dfa142c..82ee4b2ff 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -727,4 +727,11 @@ 只看了一部分 即将到来 删除重复 + 亮度 + 音量 + 右半边手势动作 + 左半边手势动作 + 选择播放器屏幕左半边手势 + 选择播放器屏幕右半边手势 + \ 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 d70913965..100f71938 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -12,21 +12,21 @@ 用出面嘅音樂播放器 影片下載路徑 下載咗嘅影片檔案會收埋喺度 - 揀選影片檔案嘅下載資料夾 - 預設解像度 + 揀選影片檔案嘅下載文件夾 + 預設嘅解像度 用 Kodi 嚟播放 - 要唔要裝缺少嘅 Kore app? + 裝唔裝缺少咗嘅 Kore app? 顯示「用 Kodi 嚟播放」嘅選項 顯示以 Kodi 媒體中心播放影片嘅選項 聲音 預設聲音檔案格式 - 色系 + 主題 黑暗 明亮 下載 顯示「接續落」同「咁上下」嘅影片 唔支援呢個網址 - 內容預設語言 + 預設內容語言 影音 版面 幕後播緊 @@ -34,17 +34,17 @@ 播放影片,片長: 上載者嘅頭像縮圖 讚好 - 劣評 + 負皮 搵唔到串流播放器。要唔要裝 VLC? 喺瀏覽器開啟 - 分享影片比 - 音樂下載資料夾 + 分享影片畀 + 音樂下載文件夾 下載咗嘅音樂檔案會收埋喺度 - 揀選音樂檔案嘅下載資料夾 + 揀選音樂檔案嘅下載文件夾 撳放大鏡開始。 內容 顯示年齡設限嘅內容 - 直播 + 實況 問題 載入唔晒全部縮圖 影片 URL 簽章解唔到碼 @@ -55,8 +55,8 @@ 出咗啲問題,唔好意思。 報告 資訊: - 出事: - 您嘅意見 (請以英文輸入): + 出咗咩事: + 你嘅見解 (請以英文輸入): 詳情: 影片 聲音 @@ -64,10 +64,10 @@ 下載 下載 問題報告 - 內容未能提供 + 未能提供內容 開始 暫停 - 刪除 + 剷走 校驗碼 檔案名稱 @@ -79,13 +79,13 @@ 複製咗去剪貼簿 請之後喺設定度揀定一個下載資料夾 以浮面模式開啟 - 預設浮面解像度 + 預設浮面播放器嘅解像度 顯示更高解像度 - 得某啲機至播到 2K/4K 影片 - 預設影片檔案格式 + 得某啲機先播到 2K/4K 影片 + 預設嘅影片檔案格式 純黑 浮面播緊 - 魂&我 + 全部嘢 App/界面閃退 經過:\\n請求:\\n內容語言:\\n內容國家:\\nApp 語言:\\n服務:\\nGMT 時間:\\n封裝:\\n版本:\\nOS 版本: @@ -97,12 +97,12 @@ 某啲影片可能會冇聲 幕後播 浮面播 - 記住浮面點擺法 - 記住對上一次浮面嘅大細同擺位 + 記住浮面嘅擺法 + 記住上次浮面嘅大細同擺位 搜尋建議 揀選搜尋嘅時候顯示邊啲建議 不適用 - 清除 + 抹走 最佳解像度 十億 關於 NewPipe @@ -110,14 +110,14 @@ © %1$s %2$s 版權所有,根據 %3$s 嘅條款授權 跋記 版權協議 - 喺 Android 上盡享自由輕便串流。 + 喺 Android 上盡享自由輕快嘅串流。 去 GitHub 睇下 NewPipe 嘅版權協議 - 無論您對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都無任歡迎您幫手。聚沙成塔,眾志成城! + 無論你對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都勁歡迎你嚟幫手。聚沙成塔,眾志成城! 閱讀版權協議 貢獻 - 抹走睇過嘅紀錄 - 搵唔到串流播放器 (您可以裝 VLC 嚟播)。 + 抹走播放紀錄 + 搵唔到串流播放器 (你可以裝 VLC 嚟播)。 下載串流檔案 訂閱 訂閱咗 @@ -128,7 +128,7 @@ 顯示資訊 訂閱 儲起嘅播放清單 - 用粗略快轉 + 用粗略嘅快轉 加入去 選擇標籤 第一粒動作掣 @@ -137,27 +137,27 @@ 第四粒動作掣 隨機播放 緩衝緊 - 空白 + 空寥寥 用手勢去控制播放器光暗 本機搜尋建議 遠端搜尋建議 - 喺本機儲存搵過嘅查詢 - 睇過有紀錄 + 喺本機儲低搵過嘅紀錄 + 有睇過有紀錄 恢復播放 - 返返最後播放到去嗰個位 + 返返去最後播放嘅嗰個位 清單度睇到播到去邊 縮圖以 1:1 長寬比框起 顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比 通知色彩化 等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意:唔係部部機都用得) - 夜色 + 夜間 跳前/跳後嘅快轉長短 - 關閉去隱藏影片描述同附加資訊 + 閂埋佢去隱藏影片描述同附加資訊 剔低睇過 開啟方式係 搜尋到嘅嘢係:%s 第五粒動作掣 - 撳一下下面每粒掣去更改各個通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度顯示 + 撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度 精簡通知最多淨係擺到三個動作! 循環播放 載入縮圖 @@ -172,16 +172,16 @@ 音量手勢控制 用手勢去控制播放器音量 光暗手勢控制 - 關閉去避免載入縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 - 粗糙快轉允許播放器比較籠統噉快轉去其他位置。快轉 5、15 或 25 秒就太精緻,粗做唔到 + 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 + 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 - 內容預設國家 + 預設嘅國家內容 演出者 專輯 淨係支援 HTTPS 嘅 URL 除錯 復原 - 刪除咗個檔案 + 剷走咗個檔案 幾時都係 一次咁多 檔案 @@ -194,19 +194,19 @@ 使用者 事件 歌曲 - 抹走當您完成 reCAPTCHA 嘅時候 NewPipe 儲存嘅 Cookie + 抹走當你完成 reCAPTCHA 嘅時候, NewPipe 儲存嘅 Cookie 轉返主版面 收埋喺背景 撈起去浮面 匯入資料庫 主播放器用全螢幕開啟 - 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。您仍可結束全螢幕返返去袖珍播放器 + 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。你仍可結束全螢幕返返去袖珍播放器 認唔出呢個 URL。要唔要用另一個 app 開? YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容 - 有年齡限制 (例如 18+) 故可能兒童不宜嘅內容都照顯示 + 有年齡限制 (例如 18+/兒童不宜)嘅內容都照顯示 呢部影片有年齡限制。 \n -\n如果您想睇,請喺設定度開啟「%1$s」。 +\n如果你想睇,請喺設定度開啟「%1$s」。 呢部影片有年齡限制。 \n鑑於 YouTube 就年齡限制影片嘅新政策,NewPipe 存取唔到條片嘅任何影像串流,所以播放唔到。 [未知] @@ -214,7 +214,7 @@ 抹走咗 reCAPTCHA Cookie 恢復播放 打斷 (例如有電話) 完之後繼續播放 - 記低睇過嘅影片 + 記低晒睇過嘅影片 自動播放 更新 開啟 YouTube 嘅「嚴格篩選模式」 @@ -229,7 +229,7 @@ 外置播放器唔支援呢類型嘅連結 搵唔到影像串流 搵唔到聲音串流 - 檔案搬走咗或刪除咗 + 檔案搬走咗或剷走咗 個檔案唔喺度,又或者欠缺讀寫權限 檔名冇得留空 復原緊播放器錯誤 @@ -238,24 +238,24 @@ 讀取唔到儲存咗嘅分頁,所以用返預設分頁 還原返預設噉樣 發生錯誤:%1$s - 您係咪要還原返做預設嗰個樣? + 你係咪要還原返做預設嗰個樣? 複製執咗格式嘅報告 乜都搵唔到 名稱 接受 - 關閉 + 閂埋佢 下載失敗 - 完成咗 %s 個下載 + 完成咗 %s 嘅下載 產生獨一無二嘅名稱 匯入檔案 匯出緊… 先前嘅匯出 - 惟請注意:呢項操作可能相當消耗網絡數據。 + 請注意:呢項操作可能相當消耗網絡數據。 \n -\n您係咪要繼續? +\n你係咪要繼續? 幾時都唔使 自動 低畫質 (細格啲) @@ -294,9 +294,9 @@ 匯入唔到訂閱 節奏 播放速度控掣 - 系統預設噉樣 + 系統預設 檢查有冇更新 - 個 App 用咩文 + 個 App 用咩語言 睇咗嗰啲剷咗佢 係咪要剷走睇咗嘅影片? 網站 @@ -325,11 +325,11 @@ 刪除咗 1 個項目。 執執佢 搞掂 - NewPipe 專案非常著重您嘅私隱。因此,呢個 app 未得您同意係唔會收集任何資料。 -\nNewPipe 嘅私隱政策,詳述當您傳送彈 app 報告時,有咩資料會傳送同保存。 + NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 +\nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 最近播放 最常播放 - 頭版內容 + 頭條新嘢 頭版要擺放邊啲分頁 打橫掃走啲項目去剷走佢 空白頁 @@ -338,13 +338,13 @@ 頭 50 位 最新同大熱 警告:未能匯入晒全部檔案。 - 噉樣做會冚咗您而家嘅設定個囉噃。 - 您想唔想匯入埋啲設定? + 噉樣做會冚咗你而家嘅設定個囉噃。 + 你想唔想匯入埋啲設定? 載入唔到留言 最近新加 剷咗佢 詳細資料 - 唔使靜音 + 唔使噤聲 背景播放器 浮面播放器 幾時都問 @@ -359,8 +359,8 @@ 匯入緊… 無聲嘅時候快轉 重設 - 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請您注意 NewPipe 嘅私隱政策。請仔細閱讀。 -\n您必須接受先可以傳送錯誤報告畀我哋。 + 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。 +\n你必須接受,先可以傳送錯誤報告畀我哋。 拒絕 用流動數據嘅時候限制解像度 更新 @@ -387,53 +387,53 @@ 改過個名 字母同數目字 - 大部份特殊字元 + 大部份嘅特殊字元 下載 課金 匯出唔到訂閱 修改播放器字幕大細同背景款式。要重新開過個 app 先會生效 執好就撳一下「搞掂」 - 靜音 + 噤聲 處理緊… 可能要等等 令播放器閃退 自動輪候 - 係咪要全部剷走晒睇過嘅紀錄? + 係咪要全部剷走晒睇片嘅紀錄? 顯示元資訊 - 關閉去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 + 閂埋佢去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 顯示「撳住就輪候」提示 - 揀選啱您心水嘅 PeerTube 站 + 揀選啱你心水嘅 PeerTube 站 紀錄與快取 NewPipe 播放器嘅通知 抹除元資料快取 抹除咗元資料快取 - 自動輪候接續落串流 - 排隊播要完嘅時候 (又未設定循環播放) 就追加一條咁上下嘅串流 + 自動輪候接落串流 + 排隊清單嘅片要播完嘅時候 (並未設定循環播放) ,就追加一條相似性質嘅串流片 PeerTube 站 - 去 %s 發掘啱您心水嘅站 + 去 %s 發掘啱你心水嘅站 播放清單 問題報告通知 報告問題嘅通知 - 剷走播放過嘅串流同播放到邊個位嘅紀錄 + 剷走播放過嘅串流同之前啲片睇到邊嘅紀錄 剷走咗睇過嘅紀錄 NewPipe 遇到問題,撳一下去報告 發生問題,詳見通知 - 拖拉執排位 + 拖條片去執好清單排位 轉換服務,而家揀選咗嘅係: 清單檢視模式 - 做噉一半冇咗,因為個檔案刪除咗 - 連線等太耐 + 做做下冇咗,因為個檔案刪除咗 + 等太耐連線 開始晒所有下載 - 下載排隊逐個嚟,唔要一次過 + 下載要排隊逐個嚟 近期 - 帳戶已被終止 + 已終止帳戶 語言 支援 覆寫唔到個檔案 暫停晒所有下載 平板電腦模式 - 個檔案建立唔到 - 您係咪想喺搜尋紀錄度刪除呢個項目? + 建立唔到呢個檔案 + 你係咪想喺搜尋紀錄度剷走呢個項目? 睇下咩問題 有個整緊嘅下載撞名 有個等緊嘅下載撞名 @@ -443,45 +443,45 @@ 年齡限制 您部機冇 app 開到佢 呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。 - 揀選啱您心水嘅夜色主題 — %s + 揀選啱你心水嘅夜色主題 — %s 呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。 - 您可以喺下面揀選啱您心水嘅夜色主題 - 停用揀選描述入面嘅文字 + 你可以喺下面揀選啱你心水嘅夜色主題 + 停止揀選描述入面嘅文字 一格格 一行行 加入去播放清單 新嘅播放清單 顯示頻道詳情 - 唔見影 + 唔見咗影 揀選一個播放清單 伺服器唔接受多執行緒下載,請改用 @string/msg_threads = 1 再試下啦 連接唔到伺服器 播放清單頁面 撳住就輪候 - 目的地資料夾建立唔到 + 建立唔到呢個目的地資料夾 建立唔到安全連線 喺幕後開始播放 部機冇晒位 頂櫳重試幾多次 - 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載或者冇得暫停 - 輪住下載 + 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載冇得暫停 + 輪住嚟下載 內部 私人 停止 按用量收費嘅網絡就閘住 抹走下載紀錄 - 您想抹走您嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? + 你想抹走你嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? 剷走下載咗嘅檔案 - 刪除咗 %1$s 個下載 + 剷走咗 %1$s 個下載 問我要下載去邊 - 排隊尾 + 排隊排隊尾 搵唔到伺服器 - 伺服器冇傳回資料 + 伺服器冇傳返資料嚟 後期處理失敗 - NewPipe 未搞掂個檔案就關閉咗 - 呢個下載恢復唔到 + NewPipe 未搞掂個檔案就閂埋咗 + 呢個下載檔案恢復唔到 同個下載咗嘅檔案撞名 同個現有嘅檔案撞名 @@ -494,7 +494,7 @@ 由 %s 建立 出自 %s 章節 - 呢部內容 NewPipe 仲未支援。 + NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 顯示睇過嘅項目 @@ -503,13 +503,13 @@ \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式 - 呢部內容限區,喺您所在國家未有提供。 - 呢首 (至少喺您所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 - 呢部內容屬於私人,因此 NewPipe 未能串流或下載。 + 呢部內容限區,喺你所在國家未有提供。 + 呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 + 呢部內容係私人嘢,因此 NewPipe 未能串流或下載。 自動 (跟返部機嘅主題色系) 精選 廣播 - 您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結會撳唔到。 + 你而家可以揀選喺描述入面嘅文字喇。不過要單聲先,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結可能會撳唔到。 啟用揀選描述入面嘅文字 版權協議 分類 @@ -521,39 +521,39 @@ 置頂留言 創作者畀咗心心 開啟網站 - + 主機 喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示 紀錄 - 紀錄 - 攝下個等陣播 - 記憶體洩露監測喺傾卸堆疊嘅時候,或者會導致個 app 冇反應 - 閂選單 - 攝咗做下個等陣播 + 歷史紀錄 + 攝咗做下個播 + 記憶體洩露監測喺傾卸堆疊嘢嘅時候,或者會導致個 app 冇反應 + 閂埋選單 + 攝咗做下個播 點做法 影片雜湊進度嘅通知 大笪地 抹走搜尋紀錄 - 刪除搜尋關鍵字嘅紀錄 + 剷走晒搜尋關鍵字嘅紀錄 係咪要全部剷走晒搜尋嘅紀錄? 頻道頁面 揀選一個頻道 排隊播 聲音設定 - 開選單 + 開啟選單 揀做播放清單縮圖 整咗個播放清單 加咗入播放清單 LeakCanary 用唔到 顯示記憶體洩露 - 強制報告喺片段或活動週期棄置後送遞唔到嘅 Rx 例外狀況 + 強制報告喺片段或週期棄置後送遞唔到嘅 Rx 狀況 顯示「令播放器閃退」 用播放器嘅時候顯示一個閃退選項 令個 app 閃退 顯示一則錯誤橫條 - 建立一則錯誤通知 + 建立一則出現錯誤通知 好,包括埋睇過但未睇晒嘅影片 - 礙於 ExoPlayer 所限,快轉長短經已改為 %d 秒 + 礙於 ExoPlayer 所限,快轉長度經已改為 %d 秒 影片雜湊通知 排咗去隊尾 揀定「開啟」動作 @@ -565,47 +565,47 @@ 未有頻道訂閱 轉咗播放清單縮圖。 報告週期完結後嘅錯誤 - 每次下載都會問您要儲存去邊 - 每次下載都會問您要儲存去邊。 -\n如果您想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) + 每次下載都會問你要儲存去邊 + 每次下載都會問你要儲存去邊。 +\n如果你想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) 用系統資料夾揀選器 (SAF) 加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 -\n您肯定?剷走咗冇得掹個囉喎! - 「儲存空間存取框架」呢壇嘢,俾您下載落外置 SD 卡嗰度 - Android 10 打上局住要用「儲存空間存取框架」 +\n你肯定?剷走咗冇得掹個囉喎! + 「儲存空間存取框架」係畀你下載落外置 SD 卡嗰度 + Android 10 打上,局住要用「儲存空間存取框架」 ExoPlayer 預設值 外置儲存空間用唔到 - 排隊尾輪候播 - 刪除咗搜尋紀錄 - 冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾位置? + 排隊尾等待播放 + 剷走晒搜尋紀錄 + 冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾嘅位置? 喺浮面開始播放 收起播放清單 - 唔再收起 - 係咪要刪除呢個播放清單? + 唔再收埋 + 係咪要剷走呢個播放清單? 播放器通知 調整目前播放緊咩串流嘅通知 訂閱有新加串流嘅通知 載入緊串流詳細資料… - 通知訂閱有新加串流 + 通知訂閱有新嘅串流 檢查頻率 用咩網絡連線 咩網絡都無所謂 收取通知 - 您而家訂閱咗呢個頻道 + 你而家訂閱咗呢個頻道 全部切換 執行檢查有冇新加串流 通知 - 新加串流 + 新加嘅串流 %s 個新加串流 - 新加串流通知 + 新嘅串流通知 係咪要喺磁碟機上面消除晒全部下載咗嘅檔案? 通知已停用 單曲 全部剷走晒播放到邊個位 - 請睇過係咪已經有人喺度講緊您呢次彈 app 嘅狀況。若然重複發表新嘅議題,就會嘥咗我哋可以真正用嚟修復個問題嘅時間㗎喇。 - NewPipe 係由一班熱心人用空閒時間義務開發,為您帶嚟最佳嘅使用體驗。係時候少少無拘,支持返開發者令 NewPipe 更臻完美,同時一顆心意挺佢哋可以嘆返杯咖啡。 + 請睇過係咪已經有人喺度講緊你呢次彈 app 嘅狀況。若然重複發表已有嘅議題,就會嘥咗我哋可以真正用嚟修復其他錯漏嘅時間㗎喇。 + NewPipe 係由一班熱心人用空閒時間義務咁開發㗎,為咗帶畀你最佳嘅使用體驗。係時候慷慨解囊,撐返開發者嘅付出,使 NewPipe 更臻完美,同時畀杯咖啡佢哋嘆下。 站內 聚首 轉 app 嘅時候借過 @@ -618,7 +618,7 @@ 載入緊摘要… 處理緊摘要… 摘要 - 摘要上次更新:%s + 摘要上次更新到:%s 未有載入:%d 摘要隔幾耐要更新 訂閱對上一次更新後,隔幾耐視之為過時 — %s @@ -640,73 +640,74 @@ 下載工具暫未支援嘅串流,就無謂擺出嚟喇 著作者嘅帳戶已經被終止。 \nNewPipe 日後唔會載入到呢個摘要。 -\n您要唔要取消訂閱呢個頻道? - 某啲服務有提供,通常會快趣好多,但項目數量可能有限兼欠奉詳情 (例如片長、項目類型、直播狀態) +\n你要唔要取消訂閱呢個頻道? + 某啲服務有提供,通常會快趣好多,但項目數量可能有限同埋資訊欠奉 (例如片長、項目類型、直播狀態) 剷走播放到邊個位 - 係咪要全部剷走晒播放到邊個位? + 係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄? 百分比 半音 - 問過先至將排隊播清零 - 目前播放器入面嘅排隊播將會清零 + 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要重新開過個播放器先至生效 + 問咗先至將排隊列表清走 + 目前播放器嘅排隊列表將會清走 加一個站 請輸入個站嘅 URL 驗證唔到個站 個站已經喺度喇 - 冚過您目前嘅紀錄、訂閱、播放清單,同埋 (有得揀係咪冚埋) 設定 + 冚過你目前嘅紀錄、訂閱、播放清單,同埋 (有得揀係咪冚埋) 設定 匯出紀錄、訂閱、播放清單,同埋設定 新嘅摘要項目 揀選一個站 - 轉換播放器嘅時候,排隊播可能會清零 - NewPipe 係「著佐權」(copyleft) 自由軟件:您可以隨意使用、考究、分享同改進佢。具體而言,您可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 - 載入斬件大細 + 轉換播放器嘅時候,排隊列表可能會清走 + NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 + 載入播放間隔大細 互動頁面 - 預設嘅互動站 - 輸入 URL 或者您嘅 ID 去匯入 SoundCloud 個人檔案: + 預設嘅互動站(Kiosk) + 輸入 URL 或者你嘅 ID 去匯入 SoundCloud 個人檔案: \n \n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版) \n二、去呢個網址:%1$s -\n三、叫您就登入 -\n四、複製佢彈返您去個人檔案嗰版個 URL。 - 您個 ID、soundcloud.com/您個id +\n三、叫你登入就去馬 +\n四、複製佢彈返畀你去個人檔案嗰版個 URL。 + 你個 ID、soundcloud.com/你個id 揀選互動站 - 顯示返項目原底話時隔幾耐 + 顯示返項目原本話時隔幾耐 停用多媒體隧道 - 頻道成軍 - 成軍名留空 - 黃袍 - 您係咪要刪除呢個成軍? - 淨係顯示未成軍嘅訂閱 + 頻道成谷 + 成谷名留空 + + 你係咪要刪除呢個谷? + 淨係顯示未成谷嘅訂閱 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 - 服務原底嘅字會騷返喺串流項目上面 + 服務原本嘅字會騷返喺串流項目上面 影像要推三色碼 未夠鐘上畫嘅項目照顯示 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n \n一、去呢個網址:%1$s -\n二、叫您就登入 +\n二、叫你就登入 \n三、撳一下「包含所有資料」,再撳一下「全部不選」,之後淨係剔返「訂閱」,然後撳「確定」 \n四、撳一下「下一步」然後揀「建立匯出」 \n五、個掣騷出嚟嘅時候就撳一下「下載」 \n六、返返嚟呢度,喺下低撳「匯入檔案」,揀返下載咗嗰個 .zip 檔案 \n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」),喺下低撳「匯入檔案」,揀返抽出嚟個 csv 檔案 - 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (您可以喺設定度更改,又或者撳一下下低個掣)。 + 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (你可以喺設定度更改,又或者撳一下下低個掣)。 \n \nNewPipe 提供兩種載入摘要嘅方針: \n• 攞晒成個訂閱頻道,慢得嚟志在夠完整。 \n• 用特設嘅服務終端,快得嚟啲料爭少少。 \n -\n兩者嘅分別在於,快趣嗰個通常都係爭噉啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 +\n兩者嘅分別在於,快趣嗰個通常都係爭咁啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 \n -\nYouTube 就係其中一個服務,有用 RSS 摘要提供呢個快趣嘅門路。 +\nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n -\n所以就睇您點揀:想快定要準。 +\n所以就睇你點揀:想快定要準。 收埋睇過嘅項目 未夠鐘上畫嘅項目就收埋 去網站睇下 排序 常見問題 - 若然您用呢個 app 有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! + 若然你係用緊呢個 app嗰陣有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! 快速模式 右上角嘅選單有得匯入或匯出訂閱 您已經用緊最新版本嘅 NewPipe @@ -718,13 +719,20 @@ 灰咗嘅播放清單,即係已經有呢個項目。 重複加入咗 %d 次 忽略硬件多媒體掣嘅事件 - 譬如話您個耳機上面啲實體掣軭咗就會有用 + 譬如話你用耳機嗰陣,撳上面啲實體掣就會有用 重複嗰啲剷咗佢 重複咗嗰啲係咪要剷走? - 下列嘅串流騷出嚟 + 下列嘅串流見得光 顯示/隱藏串流 睇晒 未睇晒 未夠鐘上畫 - 您係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 你係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 揀選左手邊播放器螢幕嘅手勢 + 左手邊手勢動作 + 揀選右手邊播放器螢幕嘅手勢 + 右手邊手勢動作 + 亮度 + 聲音 + \ 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 15bf15a0f..0623eef85 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -727,4 +727,11 @@ 即將到來 移除重複的 您想要移除所有在此播放清單中重複的串流? + 左側手勢動作 + 右側手勢動作 + 亮度 + 音量 + 為播放器畫面左側選擇手勢 + 為播放器畫面右側選擇手勢 + \ No newline at end of file diff --git a/fastlane/metadata/android/be/changelogs/65.txt b/fastlane/metadata/android/be/changelogs/65.txt new file mode 100644 index 000000000..e50dcef77 --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/65.txt @@ -0,0 +1,26 @@ +### Выпраўлена + +- Выключэнне анімацыі меню атладчыка #1486 +- адмяніць выдаленне усталёўкі #1472 +- Опцыя "Усталяваць у меню падзяліцца #1498 +- Дададзена опцыя падзяліцца да меню доўгага касання #1454 +- Мінімізаваць галоўны прайгравальнік пры выхадзе #1354 +- Абноўлена версія бібліятэкі і выпраўлены бэкап базы дадзеных #1510 +- ExoPlayer 2.8.2 Абнаўленне #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/bm/short_description.txt b/fastlane/metadata/android/bm/short_description.txt new file mode 100644 index 000000000..918d3ef3e --- /dev/null +++ b/fastlane/metadata/android/bm/short_description.txt @@ -0,0 +1 @@ +ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߜ߲ߘߙߏߌߘ ߞߊ߲߬. diff --git a/fastlane/metadata/android/cs/short_description.txt b/fastlane/metadata/android/cs/short_description.txt index 36dc2a0e6..597347b24 100644 --- a/fastlane/metadata/android/cs/short_description.txt +++ b/fastlane/metadata/android/cs/short_description.txt @@ -1 +1 @@ -Svobodný a nenáročný YouTube přehrávač for Android. +Svobodný a nenáročný YouTube frontend pro Android. diff --git a/fastlane/metadata/android/nqo/changelogs/63.txt b/fastlane/metadata/android/nqo/changelogs/63.txt new file mode 100644 index 000000000..fd5ca6fd5 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/63.txt @@ -0,0 +1,8 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ +- ߟߊ߬ߛߣߍ߬ߟߌ/ߟߊߝߏ߬ߦߟߌ߫ ߢߊߓߐߟߌ ߟߎ߬ #1333 +- ߞߙߍ߬ߢߍ߬ߡߊ߬ߛߊߦߌ ߟߊߘߐ߯ߦߊ (ߘߏߢߊߟߌ ߓߘߊ߫ ߟߊߢߊ߬) #1371 +- ߘߏߝߙߍߕߍ߫ ߘߋ߲ߣߍ߲ ߠߊߢߊ߭ #1375 +- GDPR ߞߏ ߓߍ߯ ߝߊ߬ߙߊ #1420 + +### ߘߐ߬ߓߍ߲߬ߠߌ߲ +- ߟߊ߬ߖߌ߰ߟߊ߲: ߕߌߢߍߟߌ ߘߏ߫ ߓߘߊ߫ ߘߐߓߍ߲߬ ߡߍ߲ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߓߊ߲ߓߊߟߌ ߟߎ߬ ߖߛߐ ߝߍ߬ ߞߊ߬ ߝߘߊ߫ .giga ߞߐߕߐ߮ ߟߎ߬ ߟߊ߫ #1407 diff --git a/fastlane/metadata/android/nqo/changelogs/64.txt b/fastlane/metadata/android/nqo/changelogs/64.txt new file mode 100644 index 000000000..cd6ad2b7d --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/64.txt @@ -0,0 +1,8 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ +- ߦߋߡߍ߲ߕߊ߫ ߓߘߍ߬ߦߊ߫ ߘߊ߲߬ߠߊߕߍ߱ ߛߋߞߏߦߊ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ ߘߐ߫ #1339 +- ߞߊ߬ ߞߣߍߦߊ ߟߊߞߎ߲߬ߘߎ߬ ߛߌ߰ߘߐ ߢߍ߫ #1442 +- ߟߊߖߌ߰ߟߌ߫ ߢߣߊ߬ߦߊ ߟߢߊ߬ߟߌ ߟߎ߬ ߦߙߍߞߍߟߊ߲߫ ߖߊߝߏߣߍ߲ ߢߍ߫ #1431 +- ߞߟߋߞߟߋ߫ ߘߌ߯ߘߐ ߟߎ߬ ߞߐߞߘߐߓߌ߲ߓߌ߲ #1433 + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߜߊߛߊ߲ߠߌ߲ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߦߟߍ߫ ߕߎߡߊ (ߊ߬ ߡߊߟߐ߬ߘߐ߲߬ߕߊ ߦߋ߫ ߓߐߞߏ߫ ߞߐߟߕߊ ߟߎ߫ ߟߋ߬ ߘߐ߫) #1441 diff --git a/fastlane/metadata/android/nqo/changelogs/65.txt b/fastlane/metadata/android/nqo/changelogs/65.txt new file mode 100644 index 000000000..ad622b387 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/65.txt @@ -0,0 +1,26 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ + +- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 +- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 +- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498 +- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ "ߕߐߘߐ߲߫ ߖߊ߲" ߢߣߊߥߟߊ ߟߊ߫ #1454 +- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 +- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 +- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392 + - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫. + - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\) + - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬. + - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ. + - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ : #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬. + - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫. + +### ߛߊߞߍߟߌ ߟߎ߬ + +- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 +- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497 + - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬. + - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬. +- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640) +- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 + - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫. + - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/changelogs/66.txt b/fastlane/metadata/android/nqo/changelogs/66.txt new file mode 100644 index 000000000..2b9afde7d --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/66.txt @@ -0,0 +1,33 @@ +# ߓߐߞߏ߫ ߀.߁߃.߇ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߫ ߝߐ߰ߓߍ + +### ߛߊߞߍߣߍ߲ ߠߎ߬ +- ߓߐߞߏ߫ ߀.߁߃.߆ ߘߕߐ߬ߡߐ߲߬ߠߌ߲߫ ߛߍ߲ߛߍ߲ߟߊ߲ ߝߙߋߞߋ ߘߏ߫ ߓߘߊ߫ ߛߊߞߍ߫ + +# ߓߐߞߏ߫ ߀.߁߃.߆ ߡߝߊ߬ߟߋ߲߬ߠߌ߲߫ ߠߎ߬ ߛߙߍߘߍ + +### ߟߢߊ߬ߟߌ ߟߎ߬ + +- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 +- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 +- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498 +- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ "ߕߐߘߐ߲߫ ߖߊ߲" ߢߣߊߥߟߊ ߟߊ߫ #1454 +- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 +- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 +- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392 + - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫. + - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\) + - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬. + - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ. + - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ : #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬. + - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫. + +### ߛߊߞߍߟߌ ߟߎ߬ + +- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 +- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497 + - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬. + - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬. +- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640) +- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 + - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫. + - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/changelogs/68.txt b/fastlane/metadata/android/nqo/changelogs/68.txt new file mode 100644 index 000000000..9d12539b0 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/68.txt @@ -0,0 +1,31 @@ +# ߓ߀.߁߄.߁ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߘߏߝߙߍߕߍߓߐ ߗߌߙߏ߲ #1659 +- ߞߊ߲߬ߛߓߍ߫ ߛߘߌ߬ߜߋ߲ ߕߎ߲߬ ߕߍ߫ ߟߛߊ߬ ߟߴߊ߬ ߢߌ߲߬ߡߊ ߟߊ߫ #1657 + +# ߓ߀.߁߄.߀ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ + +### ߞߎߘߊ ߟߎ߬ +- ߞߎ߲ߓߍ߲߫ ߞߙߍ߬ߢߍ #1461 +- ߟߊ߬ߛߣߍ߬ߟߌ߬ ߞߐߜߍ߫ ߟߊߖߘߍ߬ߕߦߊ߬ߕߊ #1461 + +### ߟߡߊ߬ߟߌ ߟߎ߬ +- ߡߊ߬ߡߙߊ߬ߟߌ߫ ߖߍ߰ߙߍ߬ߡߊ ߟߎ߬ ߓߘߊ߫ ߘߐߓߊ߯ߙߊ߫ #1604 +- ߘߐߛߊߙߌߟߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ߫ ߘߊߕߎ߲߯ ߢߊ߫ ߞߎߘߊ #1597 + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߝߎ߬ߕߎ߲߬ߕߌ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬. ߏ߬ ߘߌ߫ ߘߊߕߎ߲߯ #1649. + - ߏ߬ ߘߐ߫߸ ߊ߬ ߘߴߊ߬ ߦߌ߬ߘߊ߬ ߞߏ߫ "ߡߊ߬ߝߘߎ߬ߓߊ߮ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬". +- ߛߊߞߍߟߌ ߓߘߊ߫ ߞߍ߫ NPE ߟߊ߫߸ ߣߌ߫ ߦߕߎߓߎ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߘߏ߫ ߘߐߞߏߟߏ߲ ߦߋ߫ +- ߝߎ߲ߞߎ߲ߟߋ߲ ߠߎ߬ SoundCloud ߞߣߐ߫ +- ߜߊߛߊ߲ߠߌ߲߫ ߘߐߓߊ߯ߙߊ ߣߵߊ߬ ߛߊߞߍߟߌ #1623 +- ߢߌߣߌ߲ߠߌ߲߫ ߞߎ߲߬ߕߊ߰ߡߊ ߟߎ߬ ߞߐߝߟߌ #1562 +- ߢߌߣߌ߲ߠߌ߲߫ ߜߋߟߊ߲ߞߊ ߡߍ߲ ߡߊ߫ ߓߌ߲߬ߟߊ߬ ߞߐߜߍ ߞߊ߬ ߞߵߊ߬ ߜߊߘߊ߲߫ +- ߦߕߎߕߓߎ߫ ߛߙߊ߬ߕߊ ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߓߟߏߕߍ߰ ߞߏߢߊ߬ +- ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߖߛߐ߫ ߟߊ߫ ߡߎ߰ߡߍ߫ (DASH ߘߐߞߕߌ߫ ߞߏߛߐ߲߬) +- ߛߘߌ߲߬ߜߋ߲ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߦߋߡߍ߲ߕߊ ߟߎ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ +- ߊ߬ ߘߌ߫ ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߦߌ߬ߘߊ߬ ߣߌ߫ ߡߐ߱ ߘߏ߫ ߞߵߊ߬ ߝߐ߫ ߞߴߊ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߟߊ߫ ߞߐߞߊ߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬ +- ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ "ߝߏ߬ߛߌ߬ ߡߊ߫ ߛߌߝߊ߫" ߡߍ߲ ߘߌ߫ ߘߊ߬ߕߍ߰ߟߌ ߟߊߟߥߌ߬ +- ߞߏ߬ߋߞߏ߬ߋ ߕߍ߫ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߊ߲ߘߙߏߌߘ ߈.߁ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߊߖߎ ߞߣߐ߫ [ߊ߬ ߝߟߍ߫ ߦߊ߲߬](https://github.com/TeamNewPipe/NewPipe/issues/943) +- ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲߫ ߟߊߛߣߍߟߊ߲ ߠߊߞߎ߲߬ߘߎ. ߏ߬ ߦߋ߫ ߞߎ߲ߓߍ߲ ߘߊߕߎ߲߯ ߠߊ߫ #1641. diff --git a/fastlane/metadata/android/nqo/full_description.txt b/fastlane/metadata/android/nqo/full_description.txt new file mode 100644 index 000000000..0041d7a3a --- /dev/null +++ b/fastlane/metadata/android/nqo/full_description.txt @@ -0,0 +1 @@ +NewPipe ߕߍ߫ ߜ߭ߎߜ߭ߐߟ ߟߊ߫ ߝߊߙߡߑߥߐߙߞ ߟߍߙߘߊ߫ ߛߌ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߥߟߊ߫ ߦߕߎߓߎ߫ ߟߊ߫ API. ߊ߬ ߦߋ߫ ߗߍߦߙߐ ߘߐߛߍ߲߬ߛߍ߲߬ ߠߊ߫ ߟߵߊ߬ ߘߊߞߘߐ߫ ߞߊ߬ ߟߐ߲ߕߊ߫ ߡߊ߬ߞߏ߬ߡߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. ߏ߬ ߞߏߛߐ߲߬ ߟߥߊߟߌߟߊ߲ ߣߌ߲߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߤߊߟߌ߬ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߜ߭ߎߜ߭ߐߟ ߗߋߢߊ ߟߎ߬ ߡߊߗߍߣߍ߲߫ ߕߍ߫. ߊ߬ ߣߴߌߞߐ߫߸ ߌ ߡߊ߬ߞߏ߬ ߕߍ߫ ߦߕߎߓߎ߫ ߖߊߕߋߘߊ߫ ߟߊ߫ ߞߊ߬ ߣߌߎߔߌߔ ߟߊߓߊ߯ߙߊ߫. ߊ߬ ߘߏ߲߬ ߝߛߙߌ ߟߋ߬ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/short_description.txt b/fastlane/metadata/android/nqo/short_description.txt new file mode 100644 index 000000000..a798a5d85 --- /dev/null +++ b/fastlane/metadata/android/nqo/short_description.txt @@ -0,0 +1 @@ +ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߊ߲ߘߙߏߌߘ ߢߍ߫. From 51ee6f87e0393f07dd41372f197c8c4ddbb1aabe Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:42:18 +0200 Subject: [PATCH 067/133] Remove translations of previously deleted string feed_toggle_hide_played_items --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 44 files changed, 44 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index e3b5245b3..9ebda78fa 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -767,7 +767,6 @@ حجم الفاصل الزمني لتحميل التشغيل عرض العناصر المستقبلية إخفاء العناصر المستقبلية - إخفاء العناصر التي تمت مشاهدتها أسئلة مكررة إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! مشاهدة على الموقع diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 04201fa52..eaacd3fc3 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -714,7 +714,6 @@ Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi Gələcək elementləri göstər - Baxılan elementləri gizlət Gələcək elementləri gizlət Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun! Tez-tez soruşulan suallar diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 808e2b0c5..ef07948be 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -504,7 +504,6 @@ Падпіскі не выбраны Апошняе абнаўленне: %s Паказаць прагледжаныя матэрыялы - Схаваць прагледжаныя матэрыялы Аўтаматычна (тэма прылады) Выберыце ўлюбёную начную тэму - %s Дазвол вылучэння тэксту ў апісанні diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 6bfe27af8..57d6ac5ce 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -636,7 +636,6 @@ %1$sটি ডাউনলোড মুছা হয়েছে \"চালক বন্ধ করো\" দেখাও - দেখা ভুক্তি লুকাও বিজ্ঞপ্তি নিষ্ক্রিয় ভবিষ্যৎ ভুক্তি লুকাও ত্রুটি বিজ্ঞপ্তি বানাও diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f6bc2cfa2..c979b9843 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -727,7 +727,6 @@ 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 k dispozici žádné videostreamy - Skrýt zhlédnuté položky Skrýt nadcházející položky Často kladené dotazy Pokud máte potíže s používáním aplikace, přečtěte si tyto odpovědi na časté otázky! diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3322590e8..e02101a57 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -709,7 +709,6 @@ Du kører den nyeste version af NewPipe På grund af ExoPlayer-begrænsninger blev søgetiden sat til %d sekunder Vis kun ikke-grupperede abonnementer - Skjul sete elementer Side med spillelister Du kan vælge dit foretrukne nattema nedenfor Vælg dit foretrukne nattema - %s diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 77243f37d..8849a516a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -714,7 +714,6 @@ Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe Zukünftige Elemente anzeigen - Angesehene Elemente ausblenden Zukünftige Elemente ausblenden Auf der Webseite ansehen Häufig gestellte Fragen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 091dd25cb..15f469166 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -714,7 +714,6 @@ Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής Εμφάνιση μελλοντικών αντικειμένων - Απόκρυψη θεαθέντων Απόκρυψη μελλοντικών αντικειμένων Συχνές ερωτήσεις Προβολή στην ιστοσελίδα diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d4087640e..27f0194d5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -730,7 +730,6 @@ Calidad desconocida Mostrar elementos futuros Tamaño del intervalo de carga de reproducción - Ocultar los elementos mirados Ocultar elementos futuros Ver en la página web Preguntas frecuentes diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a2056cba7..ddf72dfa4 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -715,7 +715,6 @@ Taasesituseks vajalike andmete laadimise samm Näita tulevasi üksuseid Peida tulevased üksused - Peida vaadatud üksused Korduma kippuvad küsimused Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas! Edasi loe veebisaidist diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5900031ef..e3f2e44e5 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -715,7 +715,6 @@ Erakutsi etorkizuneko elementuak Hautatu kanpoko erreproduzigailuen kalitatea Ezkutatu etorkizuneko elementuak - Ezkutatu ikusitako elementuak Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. Webgunean ikusi Akatsa arbelera kopiatzean diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 22a7956fa..b797e2e55 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -715,7 +715,6 @@ اندازهٔ دورهٔ بار کردن پخش نمایش موارد آینده نهفتن موارد آینده - نهفتن موارد دیده شده سوالات متداول اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید! نمایش در وبسایت diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 742c13c00..1477c6793 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -729,7 +729,6 @@ Aucun flux vidéo n’est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture Afficher les éléments à venir - Masquer les éléments visionnés Masquer les éléments à venir Foire aux questions Voir sur le site web diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 20ceff5fa..635ba3b6f 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -715,7 +715,6 @@ Mostrar elementos próximos Non hai emisións de audio dispoñíbeis para reprodutores externos Ocultar elementos próximos - Ocultalos elementos xa ollados Ver na páxina web Preguntas máis frecuentes Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index f1eee568e..367c50559 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -740,7 +740,6 @@ תצורה לא מוכרת גודל משך טעינת נגינה הצגת פריטים עתידיים - הסתרת פריטים במעקב הסתרת פריטים עתידיים מיון הצגה באתר diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index f2e97d28b..808046eb1 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -663,7 +663,6 @@ ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - देखे गए आइटम छुपाएं भविष्य आइटम छुपाएं कई बार पूछे प्रश्न वेबसाइट पर देखें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index fa3505011..720e322e2 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -729,5 +729,4 @@ Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka Sakrij buduće stavke - Sakrij pogledane stavke \ 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 6327aba2d..26bddfafa 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -720,7 +720,6 @@ Megtekintés a weboldalon Rendezés Ha problémája van az alkalmazás használatával, akkor nézze meg az ezekre a gyakori kérdésekre adott válaszokat! - Megnézett elemek elrejtése Gyors mód Feliratkozások importálása vagy exportálása a 3 pontos menüből Ön a Newpipe legfrissebb verzióját futtatja diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index bffd486a0..ca2f9acee 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -701,7 +701,6 @@ Format tidak diketahui Ukuran interval pemuatan playback Tampilkan item mendatang - Sembunyikan item yang telah ditonton Sembunyikan item mendatang Pertanyaan yang sering diajukan Jika Anda mengalami masalah menggunakan aplikasi, pastikan untuk melihat jawaban untuk pertanyaan yang umum! diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 0129ead5b..63540b9c6 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -581,7 +581,6 @@ Virkja hraðstraumsham Afvirkja hraðstraumsham Sýna spiluð atriði - Fela spiluð atriði NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 68aca05cb..95920f278 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -727,7 +727,6 @@ Formato sconosciuto Dimensione intervallo di caricamento della riproduzione Mostra elementi futuri - Nascondi elementi visti Nascondi elementi futuri Domande frequenti Se riscontri problemi nell\'utilizzo dell\'app, dai un\'occhiata alle risposte delle domande più comuni! diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index be3874247..3614cb6e7 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -701,7 +701,6 @@ 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 次のアイテムを表示する - 再生済みを隠す 次のアイテムを隠す 並び替え ウェブサイトを表示 diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 8574ee3b6..d709e0cef 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -541,7 +541,6 @@ ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა ნანახი ნივთების ჩვენება - ნანახი ნივთების დამალვა ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 20ddac776..8133b2a86 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -702,7 +702,6 @@ 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. - 감시한 항목 숨기기 향후 항목 숨기기 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 64026f53c..3b6a08264 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -726,7 +726,6 @@ Pasirinktos transliacijos išoriniai grotuvai nepalaiko Išoriniams grotuvams garso transliacijos nepasiekiamos Pasirinkite kokybę skirtą išoriniams grotuvams - Slėpti peržiūrėtus elementus Pranešimai yra išjungti „ExoPlayer“ numatytasis Nežinoma kokybė diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 42d4d258c..2f3a52338 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -703,7 +703,6 @@ Strømmer som ennå ikke er støttet av nedlasteren, vises ikke Velg kvalitet for eksterne spillere Vis fremtidige elementer - Skjul viste elementer Ingen videostrømmer er tilgjengelige for eksterne spillere Ukjent format Ukjent kvalitet diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index aff8dda84..fb7afe446 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -714,7 +714,6 @@ Onbekend formaat Intervalgrootte tijdens afspelen Toon toekomstige objecten - Verberg bekeken objecten Verberg toekomstige objecten Veelgestelde vragen Als u problemen ondervindt bij het gebruik van de app, bekijk dan deze antwoorden op veelgestelde vragen! diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 7fd1f2762..f8452693f 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -697,7 +697,6 @@ ଏକ ସଦସ୍ୟତା ପୂର୍ବରୁ ଶେଷ ଅଦ୍ୟତନ ପରେ ସମୟ ପୁରୁଣା ବୋଲି ବିବେଚନା କରାଯାଏ -%s ଫିଡ୍ ଲୋଡ୍ କରିବାରେ ତ୍ରୁଟି ଫାଷ୍ଟ ଫିଡ୍ ମୋଡ୍ ଏହା ଉପରେ ଅଧିକ ସୂଚନା ପ୍ରଦାନ କରେ ନାହିଁ । - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଲୁଚାନ୍ତୁ ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ । \n \nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି । diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 3759b42a0..8a08a72b7 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -663,7 +663,6 @@ ਤਰੁੱਟੀ ਤੇ ਸਨੈਕਬਾਰ ਵਿਖਾਓ ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ) ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਲੁਕਾਓ ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਵਿਖਾਓ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e46190d44..786152429 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -735,7 +735,6 @@ Nieznany format Nieznana jakość Pokaż przyszłe pozycje - Ukryj obejrzane pozycje Ukryj przyszłe pozycje Często zadawane pytania Jeśli masz problemy podczas korzystania z aplikacji, koniecznie sprawdź odpowiedzi na najczęściej pojawiające się pytania! diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e16fae2b7..056dcbb5b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -728,7 +728,6 @@ Tamanho do intervalo de carregamento da reprodução Mostrar itens futuros Ocultar itens futuros - Ocultar itens assistidos Visualizar no site Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns! Perguntas frequentes diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6d85f60fb..70d7f7ea2 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -727,7 +727,6 @@ Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução Mostrar artigos futuros - Ocultar itens reproduzidos Ocultar artigos futuros Perguntas frequentes Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b04740759..70d7eb449 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -727,7 +727,6 @@ A transmissão selecionada não é suportada por reprodutores externos Mostrar artigos futuros Tamanho do intervalo de carregamento da reprodução - Ocultar itens reproduzidos Ocultar artigos futuros Perguntas frequentes Ver no site diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index d0239a062..62798bca7 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -727,7 +727,6 @@ Calitate necunoscută Dimensiunea intervalului de încărcare de redare Afișați elementele din viitor - Ascunde elementele vizionate Ascunde elementele din viitor Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 43b5c772f..b90770e8d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -731,7 +731,6 @@ Неизвестное качество Размер предварительной загрузки Показывать будущие элементы - Скрыть проигранные Скрывать будущие видео Ответы на частые вопросы Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 544e32520..583ca65f8 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -714,7 +714,6 @@ Su flussu seletzionadu no est galu suportadu dae letores esternos Mannària de s\'intervallu de carrigamentu de sa riprodutzione Ammustra sos elementos imbenientes - Cua sos elementos pompiados Cua sos elementos imbenientes Preguntas fitianas Si ses tenende problemas impreende s\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas! diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index a21b2dfac..6e08a2030 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -727,7 +727,6 @@ Žiadne video streamy nie sú k dispozícií pre externé prehrávače Neznáma kvalita Zobraziť budúce položky - Skryť videné položky Skryť nasledujúce položky Často kladené otázky Pozrieť na webovej stránke diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index ceb872449..86fa13335 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -716,7 +716,6 @@ Visa framtida objekt Den valda videoströmmen stöds inte av externa spelare Göm framtida objekt - Göm sedda objekt Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor! Vanligt ställda frågor Visa på webbplats diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d2cf9b9c2..8bdd03aaa 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -714,7 +714,6 @@ Oynatma yükleme aralığı boyutu Gelecekteki ögeleri göster Gelecekteki ögeleri gizle - İzlenen ögeleri gizle Sık Sorulan Sorular Web sitesinde görüntüle Uygulamayı kullanırken sorun yaşıyorsanız, sık sorulan sorulara verilen bu yanıtlara göz atmayı unutmayın! diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 913892dc2..b6a58b6d4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -731,7 +731,6 @@ Невідома якість Розмір інтервалу завантаження відтворення Показати наступні елементи - Сховати переглянуті елементи Сховати майбутні елементи Переглянути на сайті Поширені запитання diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e1e15038b..bb31e716e 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -706,7 +706,6 @@ Câu hỏi thường gặp Xem trên website Nếu bạn gặp vấn đề khi sử dụng ứng dụng , hãy chắc chắn rằng bạn đã tìm kiếm các câu hỏi thường thấy ! - Ẩn các video đã xem Nhập hoặc xuất các kênh bạn đăng ký bằng cách nhấn nút 3 chấm ở góc trên màn hình Không thể sao chép vào khay nhớ tạm Đã thêm khoảng thời gian %d trùng lặp (s) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 82ee4b2ff..69204d387 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -701,7 +701,6 @@ 未知画质 播放加载间隔大小 显示未来项目 - 隐藏看过的项目 隐藏未来项目 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 100f71938..db31b24fe 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -702,7 +702,6 @@ \nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n \n所以就睇你點揀:想快定要準。 - 收埋睇過嘅項目 未夠鐘上畫嘅項目就收埋 去網站睇下 排序 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0623eef85..bd843045c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -702,7 +702,6 @@ 播放載入間隔大小 顯示未來項目 隱藏未來項目 - 隱藏已觀看的項目 常見問題 在網站上檢視 排序 From f1524b6abafd15ac019b01cf83835fc6536b4eb7 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:45:03 +0200 Subject: [PATCH 068/133] Remove translations of previously deleted string feed_toggle_show_played_items --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 53 files changed, 53 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9ebda78fa..c8b711f7d 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -675,7 +675,6 @@ إيقاف تشغيل وضع الجهاز اللوحي - إظهار العناصر التي تمت مشاهدتها تم تعطيل التعليقات لا تظهر جودة منخفضة (أصغر) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index eaacd3fc3..3a9320326 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -489,7 +489,6 @@ Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. \nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? - Baxılan elementləri göstər Seçilmiş Çəkməcəni Bağla Video oynadıcı diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index ef07948be..e50e0006f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -503,7 +503,6 @@ Падпіскі не выбраны Апошняе абнаўленне: %s - Паказаць прагледжаныя матэрыялы Аўтаматычна (тэма прылады) Выберыце ўлюбёную начную тэму - %s Дазвол вылучэння тэксту ў апісанні diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index d1cb10fd7..fa700784c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -550,7 +550,6 @@ Показвай цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) Автоматична (тази на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) - Покажи гледани Избете плейлист Известия Изчистване на бисквитките от reCAPTCHA diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 57d6ac5ce..ff6ace24f 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -570,7 +570,6 @@ মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে। \n \nচালিয়ে যাবে\? - দেখা ভুক্তি দেখাও ট্যাবলেট অবস্থা বন্ধ চালু diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index a690fe132..22d973f6b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -624,7 +624,6 @@ Automàtic (tema del dispositiu) %s dóna aquesta raó: Usuari suspes - Mostra contingut visualitzat El compte de l\'autor ha estat esborrat. \nNewPipe no serà capaç de carregar aquest fil en el futur. \nUs voleu desubscriure d\'aquest canal\? diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 239740e59..52808f5d8 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -618,7 +618,6 @@ دواین وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و پەیامەکان به‌كاردەهێنرێن پیشاندانی وێنۆچكه‌ - تەماشاکراوەکان پیشان بدرێن بۆ دابه‌زاندنی هه‌ر بابه‌تێك پرست پێ ده‌كرێت له‌باره‌ی شوێنی دابه‌زاندنیان ناكاراكردنی تونێلكردنی میدیا ئه‌و بابه‌تانه‌ی نه‌گونجاون بۆ منداڵان پیشان بدرێن كه‌ سنووری ته‌مه‌ن ده‌یانگرێته‌وه‌ (وه‌ك +18) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c979b9843..22aa66f69 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -645,7 +645,6 @@ Vypnuto Zapnuto Režim tabletu - Zobrazit zhlédnuté položky Nezobrazovat Nízká kvalita (menší) Vysoká kvalita (větší) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e02101a57..c8f171ae2 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -550,7 +550,6 @@ Tid siden sidste opdatering for at et abonnoment bliver forældet - %s Altid opdater Vælg abonnementer - Vis sete elementer Dette indhold er ikke tilgængeligt i dit land. Af %s Videoer, der er blevet set før og efter, at de er blevet tilføjet til spillelisten, vil blive fjernet. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8849a516a..37ef317b4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -642,7 +642,6 @@ An Tablet-Modus Aus - Angesehene Elemente anzeigen Als gesehen markieren Vom Ersteller mit Herz versehen Farbige Picasso-Bänder über den Bildern anzeigen, die deren Quelle angeben: rot für Netzwerk, blau für Festplatte und grün für Speicher diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 15f469166..2b4c94911 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -635,7 +635,6 @@ Ανενεργό Ενεργό Κατάσταση tablet - Εμφάνιση αναπαραχθέντων Τα σχόλια είναι απενεργοποιημένα Απόκρυψη Χαμηλή ποιότητα (μικρότερο) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 27f0194d5..9a984c4f3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -648,7 +648,6 @@ Apagado Encendido Modo tableta - Mostrar elementos ya vistos No mostrar Baja calidad (más pequeño) Alta calidad (más grande) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index ddf72dfa4..531d8cf75 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -613,7 +613,6 @@ Saadaval mõnedes teenustes. See on tavaliselt palju kiirem, kuid võib tagastada piiratud koguse elemente ja sageli osalise informatsiooni (nt. puudub kestus, elemendi tüüp, laiv olek) Sa saad nüüd valida kirjelduse tekstist. Pane tähele, et valikurežiimis võib leht vilkuda ja lingid ei pruugi olla klõpsatavd. Autor: %s - Kuva vaadatud üksused Keela kiire režiim Luba kiire režiim Hangi võimalusel spetsiaalsest voost diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index e3f2e44e5..6b19f2bf1 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -628,7 +628,6 @@ Pribatutasuna %s arrazoi hau ematen du: Kontua ezabatu da - Bistako elementuak erakustea Jario azkarrak ez du honi buruz informazio gehiagorik ematen. Adin muga Miniaturaren URL-a diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b797e2e55..31c81c34d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -559,7 +559,6 @@ کیفیت پایین (کوچک‌تر) کیفیت بالا (بزرگ‌تر) نظرها از کار افتاده‌اند - نمایش موارد دیده‌شده خطا در بار کردن خوراک از کار انداختن تونل‌زنی رسانه نمایش جزییات کانال diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index fcd0cb609..644e535c4 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -629,7 +629,6 @@ Kategoria Salli tekstin valinta kuvauksessa Tili suljettu - Näytä katsotut kohteet Tekijän käyttäjätili on suljettu. \nNewPipe ei pysty lataamaan tätä syötettä tulevaisuudessa. \nHaluatko poistaa kanavan tilauksesta\? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1477c6793..705d6c2f7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -642,7 +642,6 @@ Inactif Actif Mode tablette - Afficher les éléments visionnés Le compte de l’auteur a été résilié. \nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. \nSouhaitez-vous vous désabonner de cette chaîne \? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 635ba3b6f..d404c5a78 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -606,7 +606,6 @@ Este contido é privado, polo que non pode ser transmitido nin descarregado polo NewPipe. Non posúe ningunha aplicación para abrir isto Usar miniaturas para a pantalla de bloqueo e para as notificacións - Mostrar elementos vistos Os comentarios están desactivados Mostrar contido potencialmente non apto para menores porque ten unha limitación de idade (como +18) Definir cor da notificación diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 367c50559..3a1699ea6 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -655,7 +655,6 @@ כבוי פעיל מצב מחשב לוח - הצגת פריטים שנצפו תגובות מושבתות לא להציג איכות נמוכה (קטן יותר) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 808046eb1..130877793 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -622,7 +622,6 @@ ऐप को क्रैश करें श्रेणी आपसे पूछा जाएगा कि प्रत्येक डाउनलोड को कहां सहेजना है - देखे गए आइटम दिखाएं थंमनेल यूआरएल ऑफ़ हमेशा अपडेट करें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 720e322e2..fcf6c68f8 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -633,7 +633,6 @@ 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Želiš li otkazati pretplatu na ovaj kanal\? diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 26bddfafa..66d54bb2b 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -629,7 +629,6 @@ Tekerősáv bélyegkép-előnézete Magas minőségű (nagyobb) Hiba a lista betöltésekor - Megnézett elemek megjelenítése Nyelv Támogatás Weboldal megnyitása diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index ca2f9acee..75ff85f65 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -625,7 +625,6 @@ Nonaktif Aktif Mode tablet - Tampilkan item yang sudah ditonton Jangan tampilkan Kualitas rendah (lebih kecil) Kualitas tinggi (lebih besar) diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 63540b9c6..a5c8ad068 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -580,7 +580,6 @@ Hraðstraumshamurinn veitir ekki frekari upplýsingar um þetta. Virkja hraðstraumsham Afvirkja hraðstraumsham - Sýna spiluð atriði NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 95920f278..eb50e2c39 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -645,7 +645,6 @@ Disattivata Attiva Modalità tablet - Mostra elementi visti Non mostrare Qualità bassa (più piccola) Qualità alta (più grande) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3614cb6e7..4244ff489 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -625,7 +625,6 @@ オン タブレットモード %s がこの理由を提示: - 視聴したアイテムを表示 表示しない 低品質 (小) 高品質 (大) diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index d709e0cef..d7ff105d5 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -540,7 +540,6 @@ მიიღეთ გამოყოფილი არხიდან, როცა ხელმისაწვდომია ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა - ნანახი ნივთების ჩვენება ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8133b2a86..2c7833939 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -595,7 +595,6 @@ 해결 잠금 화면 배경과 알림 모두에 썸네일 사용 선택한 구독이 없습니다 - 시청 항목 표시 자동 대기열에 추가 %s 다운로드 완료 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 3b6a08264..6906840ba 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -637,7 +637,6 @@ Dabar apraše galite pasirinkti tekstą aprašyme. Atminkite, kad puslapis gali mirgėti, o nuorodos gali būti nespustelėjamos, kai veikia pasirinkimo režimas. %s pateikia šią priežastį: Paskyra anuliuota - Rodyti peržiūrėtus elementus Greito srauto režimas nesuteikia daugiau informacijos apie tai. Autoriaus paskyra anuliuota. \n„NewPipe“ negalės įkelti šio kanalo ateityje. diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index d54d043db..e92f06344 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -636,7 +636,6 @@ Ieslēgt teksta atlasīšanu video aprakstā Lejupielādes mape vēl nav iestatīta, izvēlieties noklusējuma lejupielādes mapi Pārvelciet objektus, lai tos noņemtu - Rādīt noskatītos video Lokālie meklēšanas ieteikumi Rādīt attēlu indikatorus Augstas kvalitātes (lielāks) diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 286e68bc3..729a90e4b 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -627,7 +627,6 @@ താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ്‌ തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം. ഇതിന്റെ കാരണം %s നൽകും: അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു - കണ്ട ഐറ്റംസ് കാണിക്കുക ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല. സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു. \nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല. diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 2f3a52338..f67604d15 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -613,7 +613,6 @@ Skru på merking av tekst i beskrivelsen %s oppgav denne grunnen: Konto terminert - Vis avspilte elementer Kunne ikke laste inn informasjonskanal for «%s». Kunne ikke laste inn informasjonskanal Fra Android 10 er kun «lagringstilgangsrammeverk» støttet diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fb7afe446..175ce506f 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -626,7 +626,6 @@ Open website %s geeft de volgende reden: Account getermineerd - Toon bekeken items De snelle feed mode levert hierover niet meer informatie. De account van de auteur is getermineerd. \nNewPipe zal niet in staat zijn deze feed in de toekomst te laden. diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index f8452693f..ad1b6c3da 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -589,7 +589,6 @@ ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି । \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଦେଖାନ୍ତୁ ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 8a08a72b7..43d8f835e 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -647,7 +647,6 @@ ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ ਮੁੱਖ ਪਲੇਅਰ ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਵਿਖਾਓ ਪਲੇਅਬੈਕ ਲੋਡ ਦਾ ਅੰਤਰਾਲ ਆਕਾਰ %s ਨਵੀਂ ਸਟਰੀਮ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 786152429..b7cfc4224 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -647,7 +647,6 @@ Nie ustawiono jeszcze folderu zapisywania, wybierz domyślny teraz Błąd podczas ładowania kanału Niepubliczny - Pokaż obejrzane pozycje Wyłączony Włączony Tryb tabletu diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 056dcbb5b..1a1aea03c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -645,7 +645,6 @@ Desligado Ligado Modo tablet - Mostrar itens vistos Não mostrar Baixa qualidade (menor) Alta qualidade (maior) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 70d7f7ea2..6f42cfe74 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -637,7 +637,6 @@ Agora pode selecionar o texto na descrição. Note que a página pode cintilar e as ligações podem não ser clicáveis enquanto estiver no modo de seleção. %s fornece este motivo: Conta encerrada - Mostrar itens vistos O modo de feed rápido não fornece mais informações sobre isto. A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 70d7eb449..1d1110b4c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -618,7 +618,6 @@ Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão %s fornece este motivo: Conta encerrada - Mostrar itens vistos O modo de feed rápido não fornece mais informações sobre isto. A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 62798bca7..80c70fa73 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -638,7 +638,6 @@ Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar link-urile să nu poată fi accesate în modul de selecție. %s oferă acest motiv: Contul a fost închis - Afișați elementele vizionate Modul rapid nu furnizează mai multe informații în acest sens. Contul autorului a fost închis. \nNewPipe nu va mai putea încărca acest flux în viitor. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b90770e8d..9d11705f3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -653,7 +653,6 @@ Отключить Включить Режим планшета - Показать проигранные Комментарии отключены Не показывать Низкое качество (меньше) diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 583ca65f8..f59d79879 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -635,7 +635,6 @@ Istudadu Allutu Modalidade tauledda - Ammustra sos elementos pompiados No ammustres Calidade bassa (prus minore) Calidade arta (prus manna) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6e08a2030..455edc4f2 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -647,7 +647,6 @@ Zapnuté Režim tabletu Obľúbené autorom - Zobrazovať pozreté položky %1$s sťahovanie zmazané %1$s sťahovania zmazané diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 6a299d481..c04b1d7fe 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -622,7 +622,6 @@ Hadda waad dooran kartaa qoraalka ku dhexjira faahfaahinta. Ogow markaad caalamdinayso qoraalka boggu wuu boodboodi karaa tixraacyadana waxay noqon karaan kuwo aan lagu dhufan karin. %s wuxuu sheegayaa sababtan: Akoonka waa lajoojiyay - Tus kuwa ladaawaday Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan. Akoonka soosaaraha waa la joojiyay. \nNewPipe ma awoodi doono inuu soo kiciyo bandhiggan mustaqbalka. diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 5fbe1c012..14fa56a23 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -615,7 +615,6 @@ Kjo përmbajtje është private, kështu që nuk mund të luhet apo shkarkohet nga NewPipe. Kjo përmbajtje nuk është e disponueshme në shtetin tuaj. Përdor pamje statike për sfondin e ekranit të kyçur si dhe për njoftimet - Shfaq objektet e para Modaliteti i feed-it të shpejtë nuk mundëson më tepër informacion mbi këtë. Llogaria e autorit është bllokuar. \nNewPipe nuk do mund ta ngarkojë këtë feed në të ardhmen. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 142f179c9..80528adc1 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -644,7 +644,6 @@ искљ укљ Режим таблета - Прикажи пуштано Закажи следеће Заказано је следеће Местни предлози претраге diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 86fa13335..524716d12 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -627,7 +627,6 @@ Öppna med Visa miniatyrer Kanalens visningsminiatyr - Visa sedda objekt Det snabba flödesläget ger inte mer information om detta. Fel vid inläsning av flödet Markera som sedd diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8bdd03aaa..fd6679e3b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -634,7 +634,6 @@ Kapat Tablet kipi - İzlenen ögeleri göster Konum çubuğu küçük resim ön izlemesi Gösterme Düşük nitelik (küçük) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b6a58b6d4..376685cfe 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -646,7 +646,6 @@ Увімкнути Режим планшета Обліковий запис припинено - Показувати переглянуті обʼєкти Режим швидкої підписки не надає багато інформації щодо цього. Коментарі вимкнено Не показувати diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index bb31e716e..e03ceb610 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -616,7 +616,6 @@ Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn. %s cung cấp lý do này: 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 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. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 69204d387..e11d0fa28 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -623,7 +623,6 @@ 你会被问到在哪里保存每个下载 尚未设置下载文件夹,现在选择默认下载文件夹 平板模式 - 显示已观看的项目 关闭 开启 评论功能已停用 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index db31b24fe..2063426a8 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -497,7 +497,6 @@ NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 - 顯示睇過嘅項目 %s 話理由如下: 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bd843045c..df0af45cc 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -625,7 +625,6 @@ 關閉 開啟 平板電腦模式 - 顯示已檢視的項目 留言已停用 不要顯示 低品質(較小) From e109e8cf1c6040b7d9231cd3232c8d2c32d576dc Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:52:31 +0200 Subject: [PATCH 069/133] Remove translations of previously deleted string volume_gesture_control_title --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa-rPK/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 72 files changed, 72 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c8b711f7d..d3c5ea484 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -352,7 +352,6 @@ التحديثات تم حذف الملف تنبيه تحديث التطبيق - إيماء التحكم بالصوت الأحداث إشعارات لإصدار NewPipe الجديد وحدة التخزين الخارجية غير متوفرة diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 3a9320326..ef99d8ff4 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -64,7 +64,6 @@ Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et Parlaqlıq jesti idarəetməsi Oynadıcı səsini nizamlamaq üçün jestlər istifadə et - Səs səviyyəsi jesti idarəetməsi Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 15beb49bb..b800f7559 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -226,7 +226,6 @@ Cargando\'l conteníu solicitáu Política de privacidá de NewPipe - Control per xestos del volume Control per xestos del brillu El ficheru nun pue crease El sirvidor nun unvia datos diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index a4101a9be..e13d4aa88 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -20,7 +20,6 @@ Player tovushini boshqarish uchun imo-ishoralardan foydalanish Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning Yorqinlik ishoralarini boshqarish - Ovoz balandligini ishoralarni boshqarish Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index e50e0006f..22ba158c9 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Жэст гучнасці Мяняць гучнасць плэера жэстамі Жэст яркасці Мяняць яркасць плэера жэстамі diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index fa700784c..5bc994d5b 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Контрол на звука с жестове Използвай жестове за контрол на звука Контрол на яркостта с жестове Използвай жестове за контрол на яркостта diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index f37711eb0..ac580a81b 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -150,7 +150,6 @@ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 53d99fb5f..9d122daff 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -77,7 +77,6 @@ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index ff6ace24f..77ec918a0 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -223,7 +223,6 @@ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 8654715a6..0700e81b2 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -88,7 +88,6 @@ Nijedan medijski prijenosnik nije nađen na vašem uređaju (možete VLC instalisati da bi ste ga pokrenili). Uklonite sve keširane podatke web stranica Automatski sljedeći prijenos u red stavite - Pokretna kontrola zvučne glasnine Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje Koristite pokrete za kontrolu jačine zvuka pokretača diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 22d973f6b..dc2b9d23a 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Control de volum per gestos Fes servir gestos per controlar el volum del reproductor Control de brillantor per gestos Fes servir gestos per controlar la brillantor del reproductor diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 52808f5d8..791e1668e 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -172,7 +172,6 @@ دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن دابه‌زاندن ژێرنووسەکان - کۆنترۆڵی دەنگ بەجوڵەی پەنجە خستنه‌ نۆبه‌تی-خۆكاری په‌خشی دواتر لێده‌ره‌ دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن کردار ڕەتکرایەوە لەلایەن سیستەمەوە diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 22aa66f69..03269e80b 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Ovládání hlasitosti gesty Používat gesta pro ovládání hlasitosti přehrávače Ovládání jasu gesty Používat gesta pro ovládání jasu přehrávače diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c8f171ae2..2ed16cf9b 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Juster lydstyrke ved hjælp af fingerbevægelser Brug fingerbevægelser til at kontrollere afspillerens lydstyrke Styr lysstyrken med fingerbevægelser Brug fingerbevægelser til at justere afspillerens lysstyrke diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 37ef317b4..56d234a29 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gestensteuerung für Lautstärke Gesten verwenden, um die Lautstärke einzustellen Gestensteuerung für Helligkeit Gesten verwenden, um die Helligkeit einzustellen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 2b4c94911..8a68d8f76 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Έλεγχος ήχου με χειρονομιές Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου Έλεγχος φωτεινότητας με χειρονομίες Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index b52cfe99f..5fd9b96a9 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Kontrolo de volumena gesto Uzi gestojn por kontroli la volumon Kontrolo de gesto de brilo Uzi gestojn por kontroli la brilon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9a984c4f3..c90f1fa0e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Control de volumen por gestos Usar gestos para controlar el volumen del reproductor Control de brillo por gestos Usar gestos para controlar el brillo del reproductor diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 531d8cf75..87adacc01 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Helitugevuse juhtimine viibetega Kasuta viipeid helitugevuse reguleerimiseks Ereduse reguleerimine viibetega Kasuta viipeid heleduse reguleerimiseks diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 6b19f2bf1..5ac22af9d 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Keinuen bidezko bolumenaren kontrola Erabili keinuak erreproduzigailuaren bolumena kontrolatzeko Keinuen bidezko distiraren kontrola Erabili keinuak erreproduzigailuaren distira kontrolatzeko diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 31c81c34d..df37c9543 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - کنترل اشاره ای صدا از اشارات برای کنترل حجم صدا استفاده شود کنترل روشنایی اشاره ای از اشارات برای کنترل روشنایی استفاده شود diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 644e535c4..d41b583a1 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -394,7 +394,6 @@ Käytä eleitä ohjataksesi soittimen kirkkautta Kirkkauden eleohjaus Käytä eleitä ohjataksesi soittimen äänenvoimakkuutta - Äänenvoimakkuuden eleohjaus Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 38719e960..56aff898e 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -91,7 +91,6 @@ Kasaysayan ng mga hinanap Gumamit ng gesture para kontrolin ang liwanag ng player Kontrolin ang liwanag gamit gesture - Kontrolin ang volume gamit gesture Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 705d6c2f7..6ab748f33 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Contrôle gestuel du volume Utiliser des gestes pour contrôler le volume du lecteur Contrôle gestuel de la luminosité Utiliser des gestes pour contrôler la luminosité du lecteur diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d404c5a78..bfae40547 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -333,7 +333,6 @@ Minimizar o reprodutor popup Limitado Só son compatibles os URLs HTTPS - Control por xestos do volume Desactiva para agochalos comentarios Retomar a reprodución Páxina das listas de reprodución diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 3a1699ea6..096adadb4 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - מחוות בקרת עצמת שמע שימוש במחוות כדי לשלוט בעצמת השמע של הנגן מחוות בקרת בהירות שימוש במחוות כדי לשלוט בבהירות הנגן diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 130877793..9c7e18fd7 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -325,7 +325,6 @@ न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। अनसब्सक्राईब करें टैब चुने - ध्वनि नियंत्रण इशारा कतारबद्ध करें वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे रोशनी स्तर नियंत्रण के इशारे diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index fcf6c68f8..6471f506c 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Kontrola glasnoće pomoću gesti Koristi geste za upravljanje glasnoćom playera Kontrola svjetline pomoću gesti Koristi gesture za upravljanje svjetlinom playera diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 66d54bb2b..c5db2b72f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -335,7 +335,6 @@ Gesztusok használata a fényerő szabályozásához Fényerő gesztus Gesztusok használata a lejátszó hangerejének szabályzásához - Hangerő gesztus Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 75ff85f65..c9c2a0070 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Kontrol gestur volume Gunakan gestur untuk mengontrol volume pemutar Kontrol gestur kecerahan Gunakan gestur untuk mengontrol kecerahan pemutar diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index a5c8ad068..aef8aa82c 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Hljóðstyrksbending Nota bendingar til að stjórna hljóðstyrk spilara Birtustigsbending Nota bendingar til að stjórna birtustig spilara diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index eb50e2c39..4a1ea5604 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Gesti controllo volume Utilizza i gesti per controllare il volume del lettore multimediale Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 4244ff489..5821c8e71 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - 音量のジェスチャー制御 ジェスチャーを使用して、プレイヤーの音量を制御します 明るさのジェスチャー制御 ジェスチャーを使用して、プレイヤーの明るさを制御します diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index d7ff105d5..762fab286 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -116,7 +116,6 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - ხმის ჟესტების კონტროლი სიკაშკაშის ჟესტების კონტროლი გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index c5c4ee46b..0a415ce0f 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -231,7 +231,6 @@ Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin Kontrola tevgera ronahiyê Tevgerên bikar bînin da ku hêjmara lîstikvan kontrol bikin - Kontrola tevgera deng Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 2c7833939..efdbd4eb3 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처 음량 조작 제스처를 사용하여 플레이어의 볼륨 제어 제스처 밝기 조작 제스처를 사용하여 플레이어의 밝기 제어 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 886725624..3c4871472 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - کۆنترۆڵی دەنگ بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6906840ba..aeb770ed8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -344,7 +344,6 @@ Naudoti gestus ryškumo valdymui Ryškumo gesto valdymas Naudoti gestus garsumo valdymui - Garsumo gesto valdymas Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index e92f06344..2f6baccb1 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -506,7 +506,6 @@ Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu Spilgtuma kontrole, atskaņojot video Velkot ar pirkstu, mainiet video atskaņošanas skaļumu - Skaļuma kontrole, atskaņojot video Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 4039949c7..3c1a0a93f 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Гест за контрола на гласност Користете гестови за подесување на гласноста Гестови за контрола на осветленост Користете гест за контрола на осветленоста diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 729a90e4b..6d1a6dd9b 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -328,7 +328,6 @@ ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക ആംഗ്യം ഉപയോഗിച്ച് വോള്യം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ വോള്യം നിയന്ത്രിക്കുക തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 24dcbfc86..34a7d3462 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Kontrol gestur volume Gunakan gestur untuk melaraskan volume pemain Kontrol gestur kecerahan Gunakan gestur untuk melaraskan kecerahan pemain diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index f67604d15..e341c632f 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Håndvendingskontroll for lydstyrke Bruk håndvendinger for å kontrollere avspillerens lydstyrke Håndvendingskontroll for lysstyrke Bruk håndvendinger for å kontrollere avspillerens lysstyrke diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 28207c583..2acfaf5db 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - आवाज मात्रा नियन्त्रण गर्न इशाराको प्रयोग प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग चमक इशारा नियन्त्रण प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 4c4b5c95d..4ad5c3141 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Veegbesturing voor volume Gebruik gebaren om het volume van de speler aan te passen Veegbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 175ce506f..ba23f32ba 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebaarbesturing voor volume Gebruik gebaren om het volume van de speler aan te passen Gebaarbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index ad1b6c3da..9af33d4d5 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -106,7 +106,6 @@ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା - ଭଲ୍ୟୁମ୍ ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ ପ୍ଲେୟାରର ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ପରାମର୍ଶ ଖୋଜ ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 0cc27a059..4a3baf403 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -48,7 +48,6 @@ تصویر دی کیش ہٹا دتی گئی اے کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو - آواز اشرہ کنٹرول آواز کنٹرول کرن لئی شواواں دی ورتون کرو ڈاؤن‌لوڈ پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 43d8f835e..546c12dad 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਆਵਾਜ਼ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b7cfc4224..a292e41c1 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Kontrola głośności gestami Używaj gestów do sterowania głośnością odtwarzacza Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1a1aea03c..fb7fa59b0 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Gesto para volume Use gestos para mudar volume do player Gesto para brilho Use gestos para mudar brilho do player diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6f42cfe74..2d3af7647 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -71,7 +71,6 @@ Não foi possível importar as subscrições Transferências A processar… - Gestos para controlo de volume Este vídeo está restringido a idades. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1d1110b4c..0f6f5ffb6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Gestos para controlo de volume Utilizar gestos para controlar o volume do reprodutor Gestos para controlo de brilho Utilizar gestos para controlar o brilho do reprodutor diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 80c70fa73..bc167b97a 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Controlul prin gesturi al volumului Utilizați gesturi pentru a controla volumul Controlul prin gesturi a luminozității Utilizați gesturi pentru a controla luminozitatea diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9d11705f3..eb4b11643 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -362,7 +362,6 @@ Выберите вкладку Отписаться Менять громкость плеера жестом - Жест громкости Обновления Файл удалён Уведомление об обновлении приложения diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index f59d79879..d36d3b6b9 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -470,7 +470,6 @@ Imprea sos gestos pro controllare sa luminosidade de su riproduidore Gestos de controllu de sa luminosidade Imprea sos gestos pro controllare su volume de su riproduidore - Gestos de controllu de su volume Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 455edc4f2..4366dc3d8 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Ovládanie hlasitosti gestom Používať gestá pre ovládanie hlasitosti Ovládanie jasu gestom Použivať gestá pre ovládanie jasu diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index d46bd667a..16418e663 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -437,7 +437,6 @@ Uporabi poteze za nadzor svetlosti predvajalnika Poteza za nadzor svetlosti Uporabi poteze za nadzor glasnosti predvajalnika - Nadzor potez za glasnost Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index c04b1d7fe..a2dabbe1e 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -397,7 +397,6 @@ Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka Maamulista iftiinka (farta) Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad umaamusho codka - Maamulista codka (farta) Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 14fa56a23..55ae7da22 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -485,7 +485,6 @@ Përdorni gjestet për të kontrolluar ndriçimin e luajtësit Kontrolli i gjesteve të ndriçimit Përdorni gjeste për të kontrolluar volumin e luajtësit - Kontrolli i gjesteve të volumit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 80528adc1..e7cb525db 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -500,7 +500,6 @@ Користите покрете за контролу осветљаја Контрола осветљености потезом Користите потезе за контролу јачине звука плејера - Контрола јачине звука потезом Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 524716d12..9bfe0dd1c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Gestkontroll för volym Använd gester för att justera spelarens volym Gestkontroll för ljusstyrka Använd gester för att justera ljusstyrkan diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 3b8bff427..5cc87f5cc 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - சத்தக் கட்டுப்பாடு செய்கை இயக்கிச் சத்தத்தைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து வெளிச்ச கட்டுப்பாடு செய்கை இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index a0e65045e..e0febaed4 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -214,7 +214,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - వాల్యూమ్ సంజ్ఞ నియంత్రణ ప్లేయర్ వాల్యూమ్‌ను నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 19297e8f3..d006e9431 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - การควบคุมระดับเสียงด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น การควบคุมความสว่างด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index fd6679e3b..d48ddb0ad 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Hareketli ses denetimi Oynatıcının sesini denetlemek için hareketleri kullan Hareketli parlaklık denetimi Oynatıcının parlaklığını denetlemek için hareketleri kullan diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 376685cfe..9f5cc30dc 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Жест керування гучністю Змінювати гучність звуку жестами Жест керування яскравістю Змінювати яскравість програвача жестами diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index a49d7b301..15333cf84 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - صوتی اشارہ کنٹرول پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں چمک کا متحرک کنٹرول پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e03ceb610..88ed4e480 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Điều khiển âm lượng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh âm lượng Điều khiển độ sáng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh độ sáng diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e11d0fa28..868c04c8f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 手势控制音量 使用手势控制播放器的音量 手势控制亮度 使用手势控制播放器的亮度 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 2063426a8..2741e62de 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -169,7 +169,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 音量手勢控制 用手勢去控制播放器音量 光暗手勢控制 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index df0af45cc..f95fc1ec5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 音量手勢控制 使用手勢控制播放器音量 亮度手勢控制 使用手勢控制播放器亮度 From e83105916275497d33d9b869e388edd870139936 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:55:36 +0200 Subject: [PATCH 070/133] Remove translations of previously deleted string volume_gesture_control_summary --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-jv/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa-rPK/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 73 files changed, 73 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d3c5ea484..ff39bdf35 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -346,7 +346,6 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - استخدم إيماءات التحكم في صوت المشغّل التحكم بإيماءات السطوع استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ef99d8ff4..de8a47d42 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -63,7 +63,6 @@ Axtarış təklifləri Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et Parlaqlıq jesti idarəetməsi - Oynadıcı səsini nizamlamaq üçün jestlər istifadə et Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index b800f7559..35b2a621c 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -150,7 +150,6 @@ Llistes de reproducción Pistes Usuarios - Usa xestos pa controlar el volume del reproductor Usa xestos pa controlar el brillu del reproductor Reafitamientu de valores El númberu de soscriptores nun ta disponible diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index e13d4aa88..211f1efe2 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -17,7 +17,6 @@ Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\? %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing - Player tovushini boshqarish uchun imo-ishoralardan foydalanish Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning Yorqinlik ishoralarini boshqarish Avto-navbat diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 22ba158c9..0f5f69335 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Мяняць гучнасць плэера жэстамі Жэст яркасці Мяняць яркасць плэера жэстамі Абнаўленні diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 5bc994d5b..4499e26f2 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Използвай жестове за контрол на звука Контрол на яркостта с жестове Използвай жестове за контрол на яркостта Файлът е изтрит diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index ac580a81b..a39b667c7 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -149,7 +149,6 @@ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 9d122daff..9c72f8812 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -76,7 +76,6 @@ খোজ ইতিহাস প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 77ec918a0..3ae700615 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -222,7 +222,6 @@ সার্চ পরামর্শ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 0700e81b2..0b444a176 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -90,7 +90,6 @@ Automatski sljedeći prijenos u red stavite Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje - Koristite pokrete za kontrolu jačine zvuka pokretača Kontrola osvetljenja sa pokretima Prijedlozi za pretragu Koristite pokrete za kontrolu svjetline pokretača diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index dc2b9d23a..6ae7a52c3 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Fes servir gestos per controlar el volum del reproductor Control de brillantor per gestos Fes servir gestos per controlar la brillantor del reproductor Actualitzacions diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 791e1668e..5411206be 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -343,7 +343,6 @@ فایل نەدۆزرایەوە چارەسەردەکرێت - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ بابەتی پەڕەی سەرەکی دیار کردنی بەژدارییەکان هاورده‌كردنی فایل diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 03269e80b..d28144e6f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Používat gesta pro ovládání hlasitosti přehrávače Ovládání jasu gesty Používat gesta pro ovládání jasu přehrávače Aktualizace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 2ed16cf9b..2b3eefbe8 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Brug fingerbevægelser til at kontrollere afspillerens lydstyrke Styr lysstyrken med fingerbevægelser Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 56d234a29..2efcc68d8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gesten verwenden, um die Lautstärke einzustellen Gestensteuerung für Helligkeit Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8a68d8f76..ad7e87b49 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου Έλεγχος φωτεινότητας με χειρονομίες Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 5fd9b96a9..928da506f 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Uzi gestojn por kontroli la volumon Kontrolo de gesto de brilo Uzi gestojn por kontroli la brilon Ĝisdatigoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c90f1fa0e..7b29d3008 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Usar gestos para controlar el volumen del reproductor Control de brillo por gestos Usar gestos para controlar el brillo del reproductor Actualizaciones diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 87adacc01..fd76a995d 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Kasuta viipeid helitugevuse reguleerimiseks Ereduse reguleerimine viibetega Kasuta viipeid heleduse reguleerimiseks Uuendused diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5ac22af9d..c6d4bdde7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Erabili keinuak erreproduzigailuaren bolumena kontrolatzeko Keinuen bidezko distiraren kontrola Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index df37c9543..33f978be6 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - از اشارات برای کنترل حجم صدا استفاده شود کنترل روشنایی اشاره ای از اشارات برای کنترل روشنایی استفاده شود بازگردانی diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index d41b583a1..8894fe1fd 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -393,7 +393,6 @@ Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä Käytä eleitä ohjataksesi soittimen kirkkautta Kirkkauden eleohjaus - Käytä eleitä ohjataksesi soittimen äänenvoimakkuutta Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 56aff898e..18d14f550 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -78,7 +78,6 @@ Nalinis na ang cache ng metadata Kusang ipila ang susunod na stream Ipagpatuloy na tapusin (di umuulit) ang pila sa pamamagitan ng pagdagdag ng isang katulad na stream - Gumamit ng gesture para kontrolin ang volume ng player Mga mungkahi sa paghahanap Itago ang mga hinanap nang lokal Kasaysayan ng napanood diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6ab748f33..ca8998440 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Utiliser des gestes pour contrôler le volume du lecteur Contrôle gestuel de la luminosité Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index bfae40547..f85c41b64 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -530,7 +530,6 @@ Posicións nas listas Restaurar a última posición de reprodución Control do xesto de brillo - Use xestos para controlalo volume do reprodutor Ensinalos comentarios Duración da busca rápida cara a adiante / cara atrás Elixir lapela diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 096adadb4..b667167ab 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - שימוש במחוות כדי לשלוט בעצמת השמע של הנגן מחוות בקרת בהירות שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 9c7e18fd7..63bfb7a7a 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -326,7 +326,6 @@ अनसब्सक्राईब करें टैब चुने कतारबद्ध करें - वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे रोशनी स्तर नियंत्रण के इशारे वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 6471f506c..c1d451341 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Koristi geste za upravljanje glasnoćom playera Kontrola svjetline pomoću gesti Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index c5db2b72f..7a70da494 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -334,7 +334,6 @@ Pozíciók a listákban Gesztusok használata a fényerő szabályozásához Fényerő gesztus - Gesztusok használata a lejátszó hangerejének szabályzásához Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index c9c2a0070..4747ac949 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Gunakan gestur untuk mengontrol volume pemutar Kontrol gestur kecerahan Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index aef8aa82c..c868e835a 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Nota bendingar til að stjórna hljóðstyrk spilara Birtustigsbending Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4a1ea5604..87382a7bc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Utilizza i gesti per controllare il volume del lettore multimediale Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5821c8e71..3693ac464 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - ジェスチャーを使用して、プレイヤーの音量を制御します 明るさのジェスチャー制御 ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 6b518b2e2..0a1e270ce 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -8,7 +8,6 @@ Goleki saran Ngontrol kepadhangan ngaggo gesture Kontrol kepadhangan nganggo gestur - Gunake gesture gawe ngontrol volum Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 762fab286..0580e30f3 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -45,7 +45,6 @@ გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება ძიების შეთავაზებები წაშალეთ ყველა ქეშირებული ვებგვერდის მონაცემები - გამოიყენეთ ჟესტები მოთამაშის ხმის გასაკონტროლებლად შემდეგი ნაკადის ავტომატური შეყვანა გააგრძელეთ დაკვრის რიგის (არაგანმეორებადი) დასრულება შესაბამისი ნაკადის დამატებით მეტამონაცემების ქეში წაშლილია diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 0a415ce0f..607eabfa0 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -230,7 +230,6 @@ Pêşniyarên lêgerînê Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin Kontrola tevgera ronahiyê - Tevgerên bikar bînin da ku hêjmara lîstikvan kontrol bikin Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index efdbd4eb3..467925104 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처를 사용하여 플레이어의 볼륨 제어 제스처 밝기 조작 제스처를 사용하여 플레이어의 밝기 제어 업데이트 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 3c4871472..1907b5e67 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index aeb770ed8..505b0bc85 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -343,7 +343,6 @@ Vietos sąraše Naudoti gestus ryškumo valdymui Ryškumo gesto valdymas - Naudoti gestus garsumo valdymui Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 2f6baccb1..8d0a6acea 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -505,7 +505,6 @@ Meklēšanas ieteikumi Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu Spilgtuma kontrole, atskaņojot video - Velkot ar pirkstu, mainiet video atskaņošanas skaļumu Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 3c1a0a93f..72ea0fd48 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Користете гестови за подесување на гласноста Гестови за контрола на осветленост Користете гест за контрола на осветленоста Ажурирања diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 6d1a6dd9b..1c21151cc 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -327,7 +327,6 @@ സെർച്ച് നിർദ്ദേശങ്ങൾ ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക - ആംഗ്യം ഉപയോഗിച്ച് വോള്യം നിയന്ത്രിക്കാം തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 34a7d3462..fd19745a1 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Gunakan gestur untuk melaraskan volume pemain Kontrol gestur kecerahan Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index e341c632f..d4b979779 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Bruk håndvendinger for å kontrollere avspillerens lydstyrke Håndvendingskontroll for lysstyrke Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 2acfaf5db..476789b8a 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग चमक इशारा नियन्त्रण प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 4ad5c3141..f4aaadf28 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Gebruik gebaren om het volume van de speler aan te passen Veegbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Updates diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ba23f32ba..d567c6a19 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebruik gebaren om het volume van de speler aan te passen Gebaarbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 9af33d4d5..25e83aec7 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -142,7 +142,6 @@ ଶେଷ ପ୍ଲେବେକ୍ ସ୍ଥିତିକୁ ପୁନଃ ସ୍ଥାପନ କରନ୍ତୁ ତାଲିକାରେ ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ସୂଚକ ଦେଖାନ୍ତୁ ସମସ୍ତ କ୍ୟାଚ୍ ହୋଇଥିବା ୱେବପୃଷ୍ଠା ତଥ୍ୟ ଅପସାରଣ କରନ୍ତୁ - ପ୍ଲେୟାର ଭଲ୍ୟୁମକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ସନ୍ଧାନ କରିବା ସମୟରେ ଦେଖାଇବାକୁ ପରାମର୍ଶଗୁଡିକ ବାଛନ୍ତୁ ବାଧା ପରେ ଖେଳିବା ଜାରି ରଖନ୍ତୁ (ଯଥା ଫୋନକଲ୍) ଭିଡିଓ \"ବିବରଣୀ:\" ରେ ପୃଷ୍ଠଭୂମି କିମ୍ବା ପପ୍ଅପ୍ ବଟନ୍ ଦବାଇବା ସମୟରେ ଟିପ୍ ଦେଖାନ୍ତୁ diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 4a3baf403..534ac790f 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -48,7 +48,6 @@ تصویر دی کیش ہٹا دتی گئی اے کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو - آواز کنٹرول کرن لئی شواواں دی ورتون کرو ڈاؤن‌لوڈ پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ پلےبیک دوبارہ شروع کرو diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 546c12dad..7413072eb 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a292e41c1..4d82b79e3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Używaj gestów do sterowania głośnością odtwarzacza Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fb7fa59b0..5bfe1a9ef 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Use gestos para mudar volume do player Gesto para brilho Use gestos para mudar brilho do player Debug diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 2d3af7647..8601d02de 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -241,7 +241,6 @@ Remover todo o histórico de pesquisas\? Reportar por e-mail Escolher separador - Utilizar gestos para controlar o volume do reprodutor Grelha Exportado Escolha a pasta para colocar os ficheiros de áudio diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0f6f5ffb6..853791fda 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Utilizar gestos para controlar o volume do reprodutor Gestos para controlo de brilho Utilizar gestos para controlar o brilho do reprodutor Atualizações diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index bc167b97a..8218853fc 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Utilizați gesturi pentru a controla volumul Controlul prin gesturi a luminozității Utilizați gesturi pentru a controla luminozitatea Actualizări diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eb4b11643..7910b1bff 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -361,7 +361,6 @@ Количество подписчиков недоступно Выберите вкладку Отписаться - Менять громкость плеера жестом Обновления Файл удалён Уведомление об обновлении приложения diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index d36d3b6b9..bd9751eb2 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -469,7 +469,6 @@ Cussìgios de chirca Imprea sos gestos pro controllare sa luminosidade de su riproduidore Gestos de controllu de sa luminosidade - Imprea sos gestos pro controllare su volume de su riproduidore Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4366dc3d8..25a7249dc 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Používať gestá pre ovládanie hlasitosti Ovládanie jasu gestom Použivať gestá pre ovládanie jasu Aktualizácie diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 16418e663..da08ca40c 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -436,7 +436,6 @@ Pokaži indikator položaja predvajalnika na seznamih Uporabi poteze za nadzor svetlosti predvajalnika Poteza za nadzor svetlosti - Uporabi poteze za nadzor glasnosti predvajalnika Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index a2dabbe1e..076164ce1 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -396,7 +396,6 @@ Soojeedinada raadinta Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka Maamulista iftiinka (farta) - Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad umaamusho codka Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 55ae7da22..195823378 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -484,7 +484,6 @@ Shfaq sugjerime kur jeni duke kërkuar Përdorni gjestet për të kontrolluar ndriçimin e luajtësit Kontrolli i gjesteve të ndriçimit - Përdorni gjeste për të kontrolluar volumin e luajtësit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e7cb525db..1fdb2ec1a 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -499,7 +499,6 @@ Наставак репродукције Користите покрете за контролу осветљаја Контрола осветљености потезом - Користите потезе за контролу јачине звука плејера Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9bfe0dd1c..47fc57724 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Använd gester för att justera spelarens volym Gestkontroll för ljusstyrka Använd gester för att justera ljusstyrkan Uppdateringar diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 5cc87f5cc..52b75e339 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - இயக்கிச் சத்தத்தைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து வெளிச்ச கட்டுப்பாடு செய்கை இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index e0febaed4..9890f32a1 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -214,7 +214,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - ప్లేయర్ వాల్యూమ్‌ను నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి శోధన చరిత్ర diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index d006e9431..33955f7e0 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น การควบคุมความสว่างด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d48ddb0ad..0822b2463 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Oynatıcının sesini denetlemek için hareketleri kullan Hareketli parlaklık denetimi Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9f5cc30dc..77de33629 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Змінювати гучність звуку жестами Жест керування яскравістю Змінювати яскравість програвача жестами Оновлення diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 15333cf84..9a558c85c 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں چمک کا متحرک کنٹرول پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 88ed4e480..a306e8abd 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Sử dụng cử chỉ để điều chỉnh âm lượng Điều khiển độ sáng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 868c04c8f..25b25c1f4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 使用手势控制播放器的音量 手势控制亮度 使用手势控制播放器的亮度 视频默认语言 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 2741e62de..7c10e963f 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -169,7 +169,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 用手勢去控制播放器音量 光暗手勢控制 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f95fc1ec5..9b845339c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 使用手勢控制播放器音量 亮度手勢控制 使用手勢控制播放器亮度 更新 From 2f31ea88647f60d41016280c27094e88f0f68fcb Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:58:33 +0200 Subject: [PATCH 071/133] Remove translations of previously deleted string brightness_gesture_control_title --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-jv/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 72 files changed, 72 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ff39bdf35..bb70e5833 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -346,7 +346,6 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - التحكم بإيماءات السطوع استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index de8a47d42..d9e079ae1 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -62,7 +62,6 @@ Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et - Parlaqlıq jesti idarəetməsi Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 35b2a621c..18dcb0048 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -225,7 +225,6 @@ Cargando\'l conteníu solicitáu Política de privacidá de NewPipe - Control per xestos del brillu El ficheru nun pue crease El sirvidor nun unvia datos La llingua va camudar namás que se reanicie l\'aplicación. diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 211f1efe2..202367ead 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -18,7 +18,6 @@ %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning - Yorqinlik ishoralarini boshqarish Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 0f5f69335..38607ac64 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Жэст яркасці Мяняць яркасць плэера жэстамі Абнаўленні Файл выдалены diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4499e26f2..30eb4fbc9 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Контрол на яркостта с жестове Използвай жестове за контрол на яркостта Файлът е изтрит Събития diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index a39b667c7..29b987e25 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -148,7 +148,6 @@ মেটাডেটা ক্যাশ মোছা হয়েছে পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 9c72f8812..bfbe9c50b 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -75,7 +75,6 @@ ইতিহাস খোজ ইতিহাস প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 3ae700615..dbe51285a 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -221,7 +221,6 @@ সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 0b444a176..8587c4436 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -90,7 +90,6 @@ Automatski sljedeći prijenos u red stavite Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje - Kontrola osvetljenja sa pokretima Prijedlozi za pretragu Koristite pokrete za kontrolu svjetline pokretača Odaberite prijedloge koje želite prikazati prilikom pretrage diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6ae7a52c3..e627828a4 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Control de brillantor per gestos Fes servir gestos per controlar la brillantor del reproductor Actualitzacions S\'ha eliminat el fitxer diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 5411206be..ae1f4d212 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -148,7 +148,6 @@ پیشاندانی کێشە هەرده‌م نوێ بكرێته‌وه‌ ناتوانرێت بەژدارییەکان هاورده‌ بكرێنه‌وه‌ - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە دیمه‌ن هاوردە كردنی داتابه‌یس مێژووی گه‌ڕان diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d28144e6f..603b71aab 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Ovládání jasu gesty Používat gesta pro ovládání jasu přehrávače Aktualizace Soubor smazán diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 2b3eefbe8..07b3956dc 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Styr lysstyrken med fingerbevægelser Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag Vælg forslagene, der vises, når der søges diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2efcc68d8..ed8dbd1d9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gestensteuerung für Helligkeit Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Wiedergabebenachrichtigung diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ad7e87b49..ddedc31ed 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Έλεγχος φωτεινότητας με χειρονομίες Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις Συμβάντα diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 928da506f..766666066 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Kontrolo de gesto de brilo Uzi gestojn por kontroli la brilon Ĝisdatigoj Dosiero forviŝita diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7b29d3008..04a674ac9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Control de brillo por gestos Usar gestos para controlar el brillo del reproductor Actualizaciones Eventos diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index fd76a995d..405b24357 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Ereduse reguleerimine viibetega Kasuta viipeid heleduse reguleerimiseks Uuendused Sündmused diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c6d4bdde7..431430e8b 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Keinuen bidezko distiraren kontrola Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak Gertaerak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 33f978be6..3cc525b8d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - کنترل روشنایی اشاره ای از اشارات برای کنترل روشنایی استفاده شود بازگردانی چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 8894fe1fd..1320257b4 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -392,7 +392,6 @@ Jatka toistoa Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä Käytä eleitä ohjataksesi soittimen kirkkautta - Kirkkauden eleohjaus Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 18d14f550..6cc32a9fe 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -89,7 +89,6 @@ Mga posisyon sa listahan Kasaysayan ng mga hinanap Gumamit ng gesture para kontrolin ang liwanag ng player - Kontrolin ang liwanag gamit gesture Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ca8998440..add1ef41f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Contrôle gestuel de la luminosité Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour Fichier supprimé diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index f85c41b64..ee3a849d9 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -529,7 +529,6 @@ Eliminar datos Posicións nas listas Restaurar a última posición de reprodución - Control do xesto de brillo Ensinalos comentarios Duración da busca rápida cara a adiante / cara atrás Elixir lapela diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index b667167ab..3b88c8d2a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - מחוות בקרת בהירות שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים קובץ נמחק diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 63bfb7a7a..7d8435057 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -326,7 +326,6 @@ अनसब्सक्राईब करें टैब चुने कतारबद्ध करें - रोशनी स्तर नियंत्रण के इशारे वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट फाइल मिटा दी गयी diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index c1d451341..2bb6d28d6 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Kontrola svjetline pomoću gesti Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja Otkrivanje grešaka diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 7a70da494..1f3335149 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -333,7 +333,6 @@ Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban Gesztusok használata a fényerő szabályozásához - Fényerő gesztus Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 4747ac949..0104c7c44 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Kontrol gestur kecerahan Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan Acara diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index c868e835a..f81b9762f 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Birtustigsbending Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er Endurheimta síðustu spilunarstöðu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 87382a7bc..f6ec1375b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3693ac464..e812a61b0 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - 明るさのジェスチャー制御 ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました アプリの更新通知 diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 0a1e270ce..fa9b6a17e 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -7,7 +7,6 @@ Duduhke saran nalika nggoleki Goleki saran Ngontrol kepadhangan ngaggo gesture - Kontrol kepadhangan nganggo gestur Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 0580e30f3..c13475866 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -115,7 +115,6 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - სიკაშკაშის ჟესტების კონტროლი გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად ნახვის ისტორია diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 607eabfa0..164c419fd 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -229,7 +229,6 @@ Dema ku lêgerînê pêşniyaran nîşan bidin Pêşniyarên lêgerînê Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin - Kontrola tevgera ronahiyê Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 467925104..716866e79 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처 밝기 조작 제스처를 사용하여 플레이어의 밝기 제어 업데이트 트랙 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 1907b5e67..6e8fc5774 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 505b0bc85..34a72c178 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -342,7 +342,6 @@ Sąraše rodyti atkūrimo vietos indikatorių Vietos sąraše Naudoti gestus ryškumo valdymui - Ryškumo gesto valdymas Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 8d0a6acea..625dc4e43 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -504,7 +504,6 @@ Izvēlieties, kādus ieteikumus rādīt, rakstot meklēšanas joslā Meklēšanas ieteikumi Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu - Spilgtuma kontrole, atskaņojot video Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 72ea0fd48..b05015ac3 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Гестови за контрола на осветленост Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 1c21151cc..e6c0acde1 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -326,7 +326,6 @@ സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക സെർച്ച് നിർദ്ദേശങ്ങൾ ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index fd19745a1..3417ef543 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Kontrol gestur kecerahan Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian Tunjukkan cadangan semasa mencari diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d4b979779..3fc842dd4 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Håndvendingskontroll for lysstyrke Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer Hendelser diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 476789b8a..8453c568c 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - चमक इशारा नियन्त्रण प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू खोजी गर्दा सुझावहरू देखाउन diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index f4aaadf28..348a99521 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Veegbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Updates Gebeurtenissen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d567c6a19..1790a3cd6 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebaarbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken Bestand verwijderd diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 25e83aec7..82add3736 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -220,7 +220,6 @@ କିଛି ନୁହେଁ ଡିଫଲ୍ଟ ଭିଡିଓ ଫର୍ମାଟ୍ ପପ୍ଅପ୍ ଗୁଣଗୁଡିକ ମନେରଖ - ଉଜ୍ଜ୍ୱଳତା ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ ପ୍ରକ୍ରିୟାକରଣ… କିଛି ସମୟ ନେଇପାରେ ପ୍ଲେୟାର କ୍ୟାପସନ୍ ଟେକ୍ସଟ୍ ସ୍କେଲ୍ ଏବଂ ପୃଷ୍ଠଭୂମି ଶୈଳୀକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । କାର୍ଯ୍ୟକାରୀ ହେବାକୁ ଆପ୍ ପୁନଃଆରମ୍ଭ ଆବଶ୍ୟକ କରେ LeakCanary ଉପଲବ୍ଧ ନାହିଁ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 7413072eb..33e11ba66 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ ਅਪਡੇਟਾਂ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4d82b79e3..041ec1808 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje Usunięto plik diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5bfe1a9ef..e4490e8a6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Gesto para brilho Use gestos para mudar brilho do player Debug Atualizações diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 8601d02de..4ed58311d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -255,7 +255,6 @@ A obter informação… Sugestões de pesquisa Definir como miniatura da lista de reprodução - Gestos para controlo de brilho Abrir menu %s subscritor diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 853791fda..c213d3aa4 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Gestos para controlo de brilho Utilizar gestos para controlar o brilho do reprodutor Atualizações Ficheiro eliminado diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 8218853fc..1e6c12649 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Controlul prin gesturi a luminozității Utilizați gesturi pentru a controla luminozitatea Actualizări Evenimente diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7910b1bff..83b16b297 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -351,7 +351,6 @@ Сетка Автоматически Менять яркость плеера жестом - Жест яркости Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? SD-карта недоступна Вкладки, видимые на главной странице diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index bd9751eb2..e50bb922c 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -468,7 +468,6 @@ Issèbera sos consìgios de ammustrare in sas chircas Cussìgios de chirca Imprea sos gestos pro controllare sa luminosidade de su riproduidore - Gestos de controllu de sa luminosidade Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 25a7249dc..b0852fff2 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Ovládanie jasu gestom Použivať gestá pre ovládanie jasu Aktualizácie Udalosti diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index da08ca40c..465368722 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -435,7 +435,6 @@ Samodejno predvajanje Pokaži indikator položaja predvajalnika na seznamih Uporabi poteze za nadzor svetlosti predvajalnika - Poteza za nadzor svetlosti Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 076164ce1..50a4d373e 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -395,7 +395,6 @@ Dooro soojeedinada lasoo bandhigo marka wax la raadinayo Soojeedinada raadinta Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka - Maamulista iftiinka (farta) Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 195823378..00ffbc5a9 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -483,7 +483,6 @@ Historia e kërkimit Shfaq sugjerime kur jeni duke kërkuar Përdorni gjestet për të kontrolluar ndriçimin e luajtësit - Kontrolli i gjesteve të ndriçimit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 1fdb2ec1a..dc54c7833 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -498,7 +498,6 @@ Вратите последњу позицију репродукције Наставак репродукције Користите покрете за контролу осветљаја - Контрола осветљености потезом Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 47fc57724..8ff6c3602 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Gestkontroll för ljusstyrka Använd gester för att justera ljusstyrkan Uppdateringar Fil raderad diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 52b75e339..399f843e6 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - வெளிச்ச கட்டுப்பாடு செய்கை இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் கோப்பு அழிக்கப்பட்டது diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 9890f32a1..405239bc2 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -214,7 +214,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి శోధన చరిత్ర శోధన ప్రశ్నలను స్థానికంగా నిల్వ చేయండి diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 33955f7e0..f29b304f0 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - การควบคุมความสว่างด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา แสดงคำแนะนำเมื่อทำการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0822b2463..eafbe31c9 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Hareketli parlaklık denetimi Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler Dosya silindi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 77de33629..7a53ff854 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Жест керування яскравістю Змінювати яскравість програвача жестами Оновлення Події diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 9a558c85c..8218cc21d 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - چمک کا متحرک کنٹرول پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان تازہ کاریاں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a306e8abd..633772f8a 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Điều khiển độ sáng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật Sự kiện diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 25b25c1f4..c7e1171cd 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 手势控制亮度 使用手势控制播放器的亮度 视频默认语言 应用更新通知 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 7c10e963f..4da9ca177 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -169,7 +169,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 光暗手勢控制 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9b845339c..a141fb9e5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 亮度手勢控制 使用手勢控制播放器亮度 更新 已刪除檔案 From 41038f452dbae927c1d63ce9f25e69bfb1a9eb83 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 02:01:54 +0200 Subject: [PATCH 072/133] Remove translations of previously deleted string brightness_gesture_control_summary --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-jv/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 72 files changed, 72 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index bb70e5833..66ca28ea1 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -346,7 +346,6 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف تنبيه تحديث التطبيق diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index d9e079ae1..bcd5564df 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -61,7 +61,6 @@ Axtarış tarixçəsi Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri - Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 18dcb0048..f9c6109e6 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -150,7 +150,6 @@ Llistes de reproducción Pistes Usuarios - Usa xestos pa controlar el brillu del reproductor Reafitamientu de valores El númberu de soscriptores nun ta disponible Anovamientos diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 202367ead..affa805e6 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -17,7 +17,6 @@ Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\? %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing - Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 38607ac64..276c78176 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Мяняць яркасць плэера жэстамі Абнаўленні Файл выдалены Апавяшчэнне аб абнаўленні праграмы diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 30eb4fbc9..75297e9b3 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Използвай жестове за контрол на яркостта Файлът е изтрит Събития Показвай коментари diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 29b987e25..4e6655e45 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -147,7 +147,6 @@ ক্যাশ করা মেটাডেটা মোছ মেটাডেটা ক্যাশ মোছা হয়েছে পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index bfbe9c50b..162dfde39 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -74,7 +74,6 @@ ডাউনলোড ইতিহাস খোজ ইতিহাস - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index dbe51285a..b0887510e 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -220,7 +220,6 @@ খোজ ইতিহাস সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 8587c4436..50dcf839c 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -91,7 +91,6 @@ Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje Prijedlozi za pretragu - Koristite pokrete za kontrolu svjetline pokretača Odaberite prijedloge koje želite prikazati prilikom pretrage Lokalni prijedlozi za pretraživanje Razdaljeni prijedlozi za pretraživanje diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index e627828a4..010823e43 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Fes servir gestos per controlar la brillantor del reproductor Actualitzacions S\'ha eliminat el fitxer L\'emmagatzematge extern no està disponible diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index ae1f4d212..f761323f9 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -327,7 +327,6 @@ ناتوانیت گۆڕانكاری له‌م به‌ژدارییه‌دا بكه‌یت قه‌باره‌ی بنەڕەتی بچووککردنەوە بۆ پەنجەرە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما گۆرانییەکان دابه‌زاندنی فایلی پەخش شێوازی پیشاندانی خشتە diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 603b71aab..6380ffc2a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Používat gesta pro ovládání jasu přehrávače Aktualizace Soubor smazán Oznámení o aktualizaci aplikace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 07b3956dc..28cf01af0 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag Vælg forslagene, der vises, når der søges Søgehistorik diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ed8dbd1d9..735c16fab 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Wiedergabebenachrichtigung Konfiguriert die Benachrichtigung zum aktuell abgespielten Stream diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ddedc31ed..b74d5eb0c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις Συμβάντα Το αρχείο διαγράφηκε diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 766666066..a3a7a6af4 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Uzi gestojn por kontroli la brilon Ĝisdatigoj Dosiero forviŝita Sciigo por ĝisdatigi apon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 04a674ac9..eb7584813 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Usar gestos para controlar el brillo del reproductor Actualizaciones Eventos Notificación de actualización de la aplicación diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 405b24357..3fe9abd5f 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Kasuta viipeid heleduse reguleerimiseks Uuendused Sündmused Fail kustutati diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 431430e8b..ea4af6b0a 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak Gertaerak Fitxategia ezabatu da diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 3cc525b8d..fd65ce27d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - از اشارات برای کنترل روشنایی استفاده شود بازگردانی چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: چالش ری‌کپچا diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1320257b4..8caf6bf0b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -391,7 +391,6 @@ Tietojen tyhjennys Jatka toistoa Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä - Käytä eleitä ohjataksesi soittimen kirkkautta Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 6cc32a9fe..4cafaff85 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -88,7 +88,6 @@ Ipakita ang pananda ng posisyon ng pag-play sa mga listahan Mga posisyon sa listahan Kasaysayan ng mga hinanap - Gumamit ng gesture para kontrolin ang liwanag ng player Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index add1ef41f..f9372811f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour Fichier supprimé Notification de mise à jour de l’application diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index ee3a849d9..3dc0d4794 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -453,7 +453,6 @@ A actualización de NewPipe está dispoñible! Automático Mostra os indicadores de posición de reprodución nas listas - Use xestos para controlar o brillo do reprodutor Rede Lista Modo de visualización da lista diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 3b88c8d2a..e44cc580a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים קובץ נמחק התראת עדכון יישומון diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 7d8435057..cb8ddc3b8 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -326,7 +326,6 @@ अनसब्सक्राईब करें टैब चुने कतारबद्ध करें - वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट फाइल मिटा दी गयी ऐप अपडेट अधिसूचना diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 2bb6d28d6..ed64e5078 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja Otkrivanje grešaka Obavijest o novoj verziji programa diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1f3335149..6f7779915 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -332,7 +332,6 @@ Adatok törlése Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban - Gesztusok használata a fényerő szabályozásához Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 0104c7c44..f7bba4573 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan Acara Berkas dihapus diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index f81b9762f..1d6804eae 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er Endurheimta síðustu spilunarstöðu Spilunarstöður í listum diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f6ec1375b..fdb28c573 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato Notifiche per aggiornamenti dell\'app diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e812a61b0..e6f7b7b83 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました アプリの更新通知 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index fa9b6a17e..2f68f9bc9 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -6,7 +6,6 @@ Riwayatmu biyen cuk Duduhke saran nalika nggoleki Goleki saran - Ngontrol kepadhangan ngaggo gesture Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index c13475866..81aae3ac8 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -115,7 +115,6 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად ნახვის ისტორია განაახლეთ დაკვრა diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 164c419fd..41f2742ab 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -228,7 +228,6 @@ Dîroka lêgerînê Dema ku lêgerînê pêşniyaran nîşan bidin Pêşniyarên lêgerînê - Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 716866e79..49ea9cf0f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처를 사용하여 플레이어의 밝기 제어 업데이트 트랙 사용자 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 6e8fc5774..8d1ffbab8 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان فایل سڕایەوە diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 34a72c178..30fae7787 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -341,7 +341,6 @@ Išvalyti duomenis Sąraše rodyti atkūrimo vietos indikatorių Vietos sąraše - Naudoti gestus ryškumo valdymui Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 625dc4e43..bef5ac478 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -503,7 +503,6 @@ Meklēšanas vēsture Izvēlieties, kādus ieteikumus rādīt, rakstot meklēšanas joslā Meklēšanas ieteikumi - Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index b05015ac3..524c82aef 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана Известување за ажурирање на апликација diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index e6c0acde1..d75570d45 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -325,7 +325,6 @@ അന്വേഷണ ചരിത്രം സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക സെർച്ച് നിർദ്ദേശങ്ങൾ - ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 3417ef543..648849205 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian Tunjukkan cadangan semasa mencari Sejarah carian diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 3fc842dd4..e96008e14 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer Hendelser Fil slettet diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 8453c568c..05c82808e 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू खोजी गर्दा सुझावहरू देखाउन खोज इतिहास diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 348a99521..bf77f9da3 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Gebruik gebaren om de helderheid van de speler aan te passen Updates Gebeurtenissen Bestand verwijderd diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 1790a3cd6..e65d013d0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken Bestand verwijderd App update melding diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 82add3736..3e3e1fd5c 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -106,7 +106,6 @@ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା - ପ୍ଲେୟାରର ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ପରାମର୍ଶ ଖୋଜ ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ ସୁଦୂର ସନ୍ଧାନ ପରାମର୍ଶ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 33e11ba66..17e015609 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ ਅਪਡੇਟਾਂ ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 041ec1808..79c270ce6 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje Usunięto plik Powiadomienie o aktualizacji aplikacji diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e4490e8a6..463d222f6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Use gestos para mudar brilho do player Debug Atualizações Eventos diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4ed58311d..d17da4549 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -474,7 +474,6 @@ Escolha uma instância Limpar todos os dados da página web Fechar menu - Utilizar gestos para controlar o brilho do reprodutor Remover visualizados Carácter de substituição Vídeo diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c213d3aa4..0b3180a15 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Utilizar gestos para controlar o brilho do reprodutor Atualizações Ficheiro eliminado Notificação de nova versão diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1e6c12649..9e8d9b306 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Utilizați gesturi pentru a controla luminozitatea Actualizări Evenimente Fișier șters diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 83b16b297..b4ac25bc4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -350,7 +350,6 @@ Список Сетка Автоматически - Менять яркость плеера жестом Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? SD-карта недоступна Вкладки, видимые на главной странице diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index e50bb922c..4a2797b75 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -467,7 +467,6 @@ Cronologia de sas chircas Issèbera sos consìgios de ammustrare in sas chircas Cussìgios de chirca - Imprea sos gestos pro controllare sa luminosidade de su riproduidore Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b0852fff2..282b18698 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Použivať gestá pre ovládanie jasu Aktualizácie Udalosti Súbor vymazaný diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 465368722..7e89a1ed5 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -434,7 +434,6 @@ Pokaži nasvet, ko boste pritisnili na ozadje ali pojavno okno v \"Podrobnosti:\" Samodejno predvajanje Pokaži indikator položaja predvajalnika na seznamih - Uporabi poteze za nadzor svetlosti predvajalnika Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 50a4d373e..b2ec76d77 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -394,7 +394,6 @@ Wixii laraadiyay Dooro soojeedinada lasoo bandhigo marka wax la raadinayo Soojeedinada raadinta - Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 00ffbc5a9..75e4daac1 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -482,7 +482,6 @@ Ruani frazat e kërkuara lokalisht Historia e kërkimit Shfaq sugjerime kur jeni duke kërkuar - Përdorni gjestet për të kontrolluar ndriçimin e luajtësit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index dc54c7833..208b7f6e9 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -497,7 +497,6 @@ Позиције на листама Вратите последњу позицију репродукције Наставак репродукције - Користите покрете за контролу осветљаја Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 8ff6c3602..b3e0932b0 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Använd gester för att justera ljusstyrkan Uppdateringar Fil raderad Avisering för appuppdatering diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 399f843e6..0a4f30670 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் கோப்பு அழிக்கப்பட்டது செயலி புதுப்பித்தல் அறிவிப்பு diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 405239bc2..2351be263 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -186,7 +186,6 @@ పాప్అప్ చివరి పరిమాణం మరియు స్థానాన్ని గుర్తుంచుకోండి వీడియో వివరణ మరియు అదనపు సమాచారాన్ని దాచడాన్ని ఆఫ్ చేయండి స్ట్రీమ్ సృష్టికర్త, స్ట్రీమ్ కంటెంట్ లేదా శోధన అభ్యర్థన గురించి అదనపు సమాచారంతో మెటా సమాచార పెట్టెలను దాచడానికి ఆఫ్ చేయండి - ప్లేయర్ ప్రకాశాన్ని నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి శోధిస్తున్నప్పుడు చూపాల్సిన సూచనలను ఎంచుకోండి చివరి ప్లేబ్యాక్ స్థానాన్ని పునరుద్ధరించండి మీకు ఇష్టమైన పీర్‌ట్యూబ్ సందర్భాలను ఎంచుకోండి diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index f29b304f0..2b31bb988 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา แสดงคำแนะนำเมื่อทำการค้นหา ประวัติการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index eafbe31c9..f1e678426 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler Dosya silindi Uygulama güncelleme bildirimi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 7a53ff854..d5c88ae2b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Змінювати яскравість програвача жестами Оновлення Події Файл видалено diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 8218cc21d..6d8b538aa 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان تازہ کاریاں فائل حذف ہوگئی diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 633772f8a..fcb532435 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật Sự kiện Đã xóa tập tin diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c7e1171cd..9dadccfae 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 使用手势控制播放器的亮度 视频默认语言 应用更新通知 NewPipe 新版本的通知 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 4da9ca177..49996f06a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -138,7 +138,6 @@ 隨機播放 緩衝緊 空寥寥 - 用手勢去控制播放器光暗 本機搜尋建議 遠端搜尋建議 喺本機儲低搵過嘅紀錄 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a141fb9e5..bb887e249 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 使用手勢控制播放器亮度 更新 已刪除檔案 應用程式更新通知 From ecbf5d5ead91bf31214d1a879bce8ff7778da5da Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 7 May 2023 09:57:38 +0530 Subject: [PATCH 073/133] Remove unused resources. --- .../main/res/drawable-hdpi/ic_close_white.png | Bin 342 -> 0 bytes .../res/drawable-hdpi/ic_hourglass_top_white.png | Bin 252 -> 0 bytes .../main/res/drawable-hdpi/ic_replay_white.png | Bin 486 -> 0 bytes .../main/res/drawable-mdpi/ic_close_white.png | Bin 230 -> 0 bytes .../res/drawable-mdpi/ic_hourglass_top_white.png | Bin 220 -> 0 bytes .../main/res/drawable-mdpi/ic_replay_white.png | Bin 327 -> 0 bytes .../drawable-nodpi/newpipe_logo_nude_shadow.png | Bin 3123 -> 0 bytes .../main/res/drawable-xhdpi/ic_close_white.png | Bin 487 -> 0 bytes .../drawable-xhdpi/ic_hourglass_top_white.png | Bin 345 -> 0 bytes .../main/res/drawable-xhdpi/ic_replay_white.png | Bin 646 -> 0 bytes .../main/res/drawable-xxhdpi/ic_close_white.png | Bin 804 -> 0 bytes .../drawable-xxhdpi/ic_hourglass_top_white.png | Bin 485 -> 0 bytes .../main/res/drawable-xxhdpi/ic_replay_white.png | Bin 1075 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_close_white.png | Bin 1676 -> 0 bytes .../drawable-xxxhdpi/ic_hourglass_top_white.png | Bin 687 -> 0 bytes .../res/drawable-xxxhdpi/ic_replay_white.png | Bin 1569 -> 0 bytes app/src/main/res/drawable/ic_fast_forward.xml | 10 ---------- app/src/main/res/drawable/ic_fast_rewind.xml | 10 ---------- app/src/main/res/drawable/ic_history_future.xml | 15 --------------- app/src/main/res/drawable/ic_visibility_off.xml | 10 ---------- app/src/main/res/values-ar/strings.xml | 2 -- app/src/main/res/values-az/strings.xml | 2 -- app/src/main/res/values-be/strings.xml | 2 -- app/src/main/res/values-bn/strings.xml | 2 -- app/src/main/res/values-cs/strings.xml | 2 -- app/src/main/res/values-da/strings.xml | 2 -- app/src/main/res/values-de/strings.xml | 2 -- app/src/main/res/values-el/strings.xml | 2 -- app/src/main/res/values-es/strings.xml | 2 -- app/src/main/res/values-et/strings.xml | 2 -- app/src/main/res/values-eu/strings.xml | 2 -- app/src/main/res/values-fa/strings.xml | 2 -- app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-gl/strings.xml | 2 -- app/src/main/res/values-he/strings.xml | 2 -- app/src/main/res/values-hi/strings.xml | 2 -- app/src/main/res/values-hr/strings.xml | 2 -- app/src/main/res/values-hu/strings.xml | 2 -- app/src/main/res/values-ia/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 2 -- app/src/main/res/values-is/strings.xml | 2 -- app/src/main/res/values-it/strings.xml | 2 -- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-ka/strings.xml | 2 -- app/src/main/res/values-ko/strings.xml | 2 -- app/src/main/res/values-lt/strings.xml | 2 -- app/src/main/res/values-nb-rNO/strings.xml | 2 -- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-nn/strings.xml | 2 -- app/src/main/res/values-nqo/strings.xml | 2 -- app/src/main/res/values-or/strings.xml | 2 -- app/src/main/res/values-pa/strings.xml | 2 -- app/src/main/res/values-pl/strings.xml | 2 -- app/src/main/res/values-pt-rBR/strings.xml | 2 -- app/src/main/res/values-pt-rPT/strings.xml | 2 -- app/src/main/res/values-pt/strings.xml | 2 -- app/src/main/res/values-ro/strings.xml | 2 -- app/src/main/res/values-ru/strings.xml | 2 -- app/src/main/res/values-sc/strings.xml | 2 -- app/src/main/res/values-sk/strings.xml | 2 -- app/src/main/res/values-sv/strings.xml | 2 -- app/src/main/res/values-tr/strings.xml | 2 -- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-vi/strings.xml | 2 -- app/src/main/res/values-zh-rCN/strings.xml | 2 -- app/src/main/res/values-zh-rHK/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- app/src/main/res/values/dimens.xml | 5 ----- app/src/main/res/values/donottranslate.xml | 1 - app/src/main/res/values/strings.xml | 2 -- app/src/main/res/xml/provider_paths.xml | 9 --------- 71 files changed, 155 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable/ic_fast_forward.xml delete mode 100644 app/src/main/res/drawable/ic_fast_rewind.xml delete mode 100644 app/src/main/res/drawable/ic_history_future.xml delete mode 100644 app/src/main/res/drawable/ic_visibility_off.xml delete mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/app/src/main/res/drawable-hdpi/ic_close_white.png b/app/src/main/res/drawable-hdpi/ic_close_white.png deleted file mode 100644 index 5546fb0ff3d5b5d6f698de9dbc3275b3d45797a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmV-c0jd6pP)?vvh5(7w>f{xM$=sUHK(EjMZ^5ZYg&4T>8QwUcQt1QVBqKs zdQ<*S^|TaO+IZy*fHxRS!AL7bh*w<*1|w6Q@fyQmf~h2fiKc9WhACsQso3DHi%rD_ zZwJMufs o8uY}5y)$Jscwo&eyYo%^24my`hw~VCk^lez07*qoM6N<$f+r4=5dZ)H diff --git a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png deleted file mode 100644 index 1f1f9046c8cf0e0ff2110a0a155c5ebf7db62eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmV};o6m^D4rW3>5M9IV79+DWArPF(@*M;TT$OdDBY!m8oHg>K> z8hZs-->xY3ni?oSzo!tSCz+QbQR|N4s0l&isNk*@moQnu%_02e;D#d4rnCxrC-H?p z=~1-Hwzm7{va1;F#BGH}h@UlJgG0TjC0zH9Bme*t6S?W(By@KG0000@P)xnQdo z(>bbjg>S#xG?NWxx-~rYhE0%v<~H5Mkn6V~d|tAJB6oEuSmxezsCR5GGW$skS-uR? z$?HWXciRLS2T{`%Opgwg0vqEmKe_h1FBJ3}I2nI=9{dmr`WGCEzuX2&go3JqmGPHT zK`%Fj_|OakBa;2gJ`bdX9&tR$(R<$oP%$M`51jUT{Pk_dfqh;|%Dm|?7@Y96^@$8H zKk--4lU9HW-U<{907*qoM6N<$f|{?`RsaA1 diff --git a/app/src/main/res/drawable-mdpi/ic_close_white.png b/app/src/main/res/drawable-mdpi/ic_close_white.png deleted file mode 100644 index 1037ea613ad4cf04ab3b3d07655d269b89016399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iwVp1HAr-goPTbAg>>%KBeage0 zD@WYVh&oJUF>!EESK(;doU)U1@$;0{oZfAWaXWThJbQc{i>dNjO}DfM>z;QuyQ-#` z+3{$-sASUS-TpajqQ(I?v(|a$8!pV5euPh?_T7b#Okq*x!3}d$1Vc*xd3&cZb9J5) zIV)7nzp3N9!1s5NEDyiDi_~$bnjXvYGPeAuBZ%?#Z@swa8JSzV-xnFIdT`K(uWaUu cw@x*TAD=(VQ?YYD19Uipr>mdKI;Vst03+O8qyPW_ diff --git a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png deleted file mode 100644 index 734e8eca3094c8b8dbffb17fc5d63b8f89f4055b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i#hxyXAr-fh7U=)b{}nIIEpl}2 z!iV-|7Yz28{$S=%PL^SC)M#Vd(ajvwayGW?efA6+woi#`d7F<(DAZ@p4i^fVA|JQm z8#kBrlV)yV)2KrN8t-41q?yfA3z3dnX|gyovH8Ih&Z+YrGm0yT#Vz4F%q7y;!o1DW zd+LlY_PqT*Cv5LsO#Sh(;CoV_OA_bt5{)ho4PFzO-}|{Z<&?EQPMqiZl8a%nRmh3P TJuPQ}&Smg)^>bP0l+XkK$v9A) diff --git a/app/src/main/res/drawable-mdpi/ic_replay_white.png b/app/src/main/res/drawable-mdpi/ic_replay_white.png deleted file mode 100644 index 24558a423017b4b4d8a83d0e2b3b6b26e4fb51b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmV-N0l5B&P)p_0;< z`ByYhZNL8toAPC*1G@!3k~ik(~mlQ7h(v ze>kT_o-1uiTuH4deqo)whh3Na2Xpa7EI(P91frf{Q7OM)iOZ#cad?{oTykB1xxff~ zN(FB)GbfmZ$En~XPO8mD)H;h}sbDOA>X8-n_ggR`6|}g4J36EjT|C4^P15W5ircy+ z22-n-2l$k=x6wY~x09wAY_Mt0_=ER`<~WDmt_T3&p9{L>d6`Bd9reO@-#vH8Fb!%d ZivLE6J?$Egq>2Cl002ovPDHLkV1k;*kTL)O diff --git a/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png b/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png deleted file mode 100644 index 49c12af83fafffaae317d44c2d62c78ccb96f79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3123 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 diff --git a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png deleted file mode 100644 index e53c699dbf874ad860ef13408ac0474c24cff23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmV-f0jBz&?*WA7T|0^j4?Wq6vO0P;Ntu755L;X zpW$y@U^sJN4$Ofc8)yyHjtk@(Lp1Vnfmo*YomwUi<5)VVyiz$>hViUkCc5)hp))m6 z`$|3ed_PpC@mVA5$C*kj*FvwAi^IE!>{Q@i_n@*9h4-+Kx`3y@-Ft$I)FMnLkvfBi zlSJa=0nSp%^z(ZqxI0>hj<1yGd_c@|uTggvtB(R~4pi_4T$INSb<;#46Dl%=>vTZLE6s^MV4 rs0GLHc0G=bw(N)mwC@CtWH1T}nd33G84VkqPW-4v`7$Z4!|Q>}?zX;2nF|!Dd!pDQ&e} zc}6rTHpS;Iv5hr@@Yv2|sp;^sy>j_;=St6jH|-d{cV|dXT%O~@Dh@Us0PuxN-R@KQ z1_99IBCCZ}%vt_1wW@8L?|(x8x?Nz^aEkpDuecAa<8t)?svR7J!yd|#HJXFX1Tfjw z;b-amWSwkhGXMz>24Qii*+~SeI8p%QwS)w zR&Hza@+9wEF9!M?6GVZXbc2LPqYaUpq9d^i4u#X-PcXz7TDF(o( zE3*{bDF%8RmMXT6NNCtJAX*fLk(MfmZVfAm-k5;oX!2+MJN#kT^#V zAkVhxy8SZqIO z`+UxM);sL)1OLCZoba8w;qljb|6jkJp0zbwV|98z)}ewau<@DMqAI}=4`z$BbO$4Ir>Y&bOurYs z(>C|A-m>{AUcv6-4)Mo#E!((7{@jkFo44QS{(ZeWwR}#g(%**QW4aMnFQ2}5ZkMaD z-?G0&NB6|;+{SzP+%kECb(!AB|L-a@@mv+p!N>V<&ov|t5w0Nz9 z|MjkE8&_=?wtwGV6q|c`nXET+Mn=?G`x0B(;XDD(}t*-n_8V$8Grqn^#Gj*D%ix zy}RR~^o=!)z22!u%EJNLy{zJJ^b)<8_vmtpL+PyK`AH&rJxj)f>KZlNlf2AZKdn#R_4j@eloYlfThFLq`nlUWrz^={^-!X$mO!yowJpMjZvb-NRb>3o=LtA+p6 zw9S1KQ;HSrl51Ugu{+OlLyh9whN0YZu}itG>rfsSdZrZ9$=!zo?&ZalnCiI*Wihh& z`V@F@x?C8QHJy>@6|l3^)(A&vXj|F=UPU7p=ii;4MUk_$GFA(pP&2l&Es_>`XWk`U zQw33W;^}g#Ti!M3Q73$Zj>l^5WgS=H8(isB5)@95f>KZlNz$?){#T z)3ltdjC%FD<$w#gEK2?DG$%i~It8v>cvC0NJ)oM(QUlri#^ItlZ8bPrhH zNbrM>F*2mh$1P~SFzRTWFF4T}ISuW1lELZMqfeXPa;4VGhg@i%hIaXbuIWemxR+Y) z_DXg4aVum+?Dkb569p@3Bj?&mRgj3HX4glWnd}k`p~( zawrV%^-7{ZQ>_;5@EIkcFnr8Q2?BNYPZm z3elB1hSccq7SW23j8&qW^$V#n#{HtlLNXo~-Dgay@3fy1T@#XVjp#XVNp-VZB04D~ z<9N|lUr%v<`k8&AKZIm_Q@eOw_Udc`|J>nL-Q8qt1-=#ls1eu_#_g@1?E zGu2W=>-|#CyyE=Bc0@1awYMtqJ9UWG`L7tHSHD(0>Q_04 zDC;O)+cGZPEQ6@l)4r^a(iZQ*0lx2L^@!?S*v4(l91pA4P_;XJ)|ke7oD$uQ_f?Om z(@?EjObTtI%typX(SG+j%va1aT0fma(AfZEz124z?O_#YsLt))nZiD=%skg?Ox8Bf zy2te{cCJg^;9k$$Dc9)VUSL{`(?&))Tdn+6I5y=?UN66~OpVs7GT--f3u#kgvJ)&- zFS$DN9cFYW6lFf-Y|GVXS+#{u_D-dtkd)}-y?*8*Yc(Zng|q$8J7ZlhFdg(W$yXig tDvwy<0QOqyL034+=S002ovPDHLkV1jB&B(eYi diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white.png deleted file mode 100644 index 06854ca49c6da9a6b0a733265df8345eefe6230a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1676 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 diff --git a/app/src/main/res/drawable/ic_fast_forward.xml b/app/src/main/res/drawable/ic_fast_forward.xml deleted file mode 100644 index 4edc96a9b..000000000 --- a/app/src/main/res/drawable/ic_fast_forward.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_fast_rewind.xml b/app/src/main/res/drawable/ic_fast_rewind.xml deleted file mode 100644 index 33d9f56ef..000000000 --- a/app/src/main/res/drawable/ic_fast_rewind.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_history_future.xml b/app/src/main/res/drawable/ic_history_future.xml deleted file mode 100644 index db6f2acbf..000000000 --- a/app/src/main/res/drawable/ic_history_future.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml deleted file mode 100644 index f833d5e06..000000000 --- a/app/src/main/res/drawable/ic_visibility_off.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 66ca28ea1..569701eea 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -760,8 +760,6 @@ تنسيق غير معروف جودة غير معروفة حجم الفاصل الزمني لتحميل التشغيل - عرض العناصر المستقبلية - إخفاء العناصر المستقبلية أسئلة مكررة إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! مشاهدة على الموقع diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index bcd5564df..29c320016 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -708,8 +708,6 @@ Naməlum format Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi - Gələcək elementləri göstər - Gələcək elementləri gizlət Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun! Tez-tez soruşulan suallar Veb Saytında bax diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 276c78176..7538ad9db 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -515,8 +515,6 @@ Выберыце якасць для знешніх плэераў Невядомая якасць Невядомы фармат - Паказаць наступны матэрыял - Схаваць наступныя матэрыялы Сартаваць З-за абмежаванняў ExoPlayer працягласць пошуку была ўсталявана на %d сякундаў Раздзелы diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index b0887510e..6c3cca7a1 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -632,10 +632,8 @@ \"চালক বন্ধ করো\" দেখাও বিজ্ঞপ্তি নিষ্ক্রিয় - ভবিষ্যৎ ভুক্তি লুকাও ত্রুটি বিজ্ঞপ্তি বানাও ভুক্তি মুছতে ডানে-বামে সরাও সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত… - ভবিষ্যৎ ভুক্তি দেখাও প্লেব্যাক লোড বিরতির আকার \ 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 6380ffc2a..7e9125ef6 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -718,11 +718,9 @@ U externích přehrávačů nejsou dostupné žádné zvukové streamy Neznámý formát Neznámá kvalita - Zobrazit nadcházející položky 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 k dispozici žádné videostreamy - Skrýt nadcházející položky Často kladené dotazy Pokud máte potíže s používáním aplikace, přečtěte si tyto odpovědi na časté otázky! Zobrazit na webu diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 28cf01af0..0bd7e9875 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -674,7 +674,6 @@ URL til miniaturebillede Fra Tablet-tilstand - Skjul fremtidige elementer Denne video er kun tilgængelig for YouTube Music Premium-medlemmer, så den kan ikke streames eller downloades af NewPipe. \"Storage Access Framework\" gør det muligt at downloade til et eksternt SD-kort Fremtving indberetning af ikke-leverbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse @@ -717,7 +716,6 @@ Skift alle Ingen lydstreams er tilgængelige for eksterne afspillere Vælg kvalitet til eksterne afspillere - Vis fremtidige elementer Sortér Ignorer hardware medie knapper Brugbart f.eks. hvis du bruger et headset med ødelagte fysiske knapper diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 735c16fab..0e477f38a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -708,8 +708,6 @@ Streams, die der Downloader noch nicht unterstützt, werden nicht angezeigt Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe - Zukünftige Elemente anzeigen - Zukünftige Elemente ausblenden Auf der Webseite ansehen Häufig gestellte Fragen Wenn du Probleme bei der Verwendung der App hast, lies bitte die Antworten auf häufig gestellte Fragen! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b74d5eb0c..d0d003f98 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -708,8 +708,6 @@ Άγνωστος τύπος αρχείου Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής - Εμφάνιση μελλοντικών αντικειμένων - Απόκρυψη μελλοντικών αντικειμένων Συχνές ερωτήσεις Προβολή στην ιστοσελίδα Εάν αντιμετωπίζετε προβλήματα με τη χρήση της εφαρμογής, φροντίστε να ελέγξετε αυτές τις απαντήσεις σε συνήθεις ερωτήσεις! diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index eb7584813..552a8f542 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -723,9 +723,7 @@ Elija la calidad para reproductores externos Formato desconocido Calidad desconocida - Mostrar elementos futuros Tamaño del intervalo de carga de reproducción - Ocultar elementos futuros Ver en la página web Preguntas frecuentes Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes! diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 3fe9abd5f..5b2e8e125 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -708,8 +708,6 @@ Protsent Pooltoon Taasesituseks vajalike andmete laadimise samm - Näita tulevasi üksuseid - Peida tulevased üksused Korduma kippuvad küsimused Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas! Edasi loe veebisaidist diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index ea4af6b0a..c8d16b698 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -707,9 +707,7 @@ Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik Formatu ezezaguna Kalitate ezezaguna - Erakutsi etorkizuneko elementuak Hautatu kanpoko erreproduzigailuen kalitatea - Ezkutatu etorkizuneko elementuak Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. Webgunean ikusi Akatsa arbelera kopiatzean diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index fd65ce27d..3d8e8da9b 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -708,8 +708,6 @@ قالب ناشناخته کیفیت ناشناخته اندازهٔ دورهٔ بار کردن پخش - نمایش موارد آینده - نهفتن موارد آینده سوالات متداول اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید! نمایش در وبسایت diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f9372811f..5443fe3c8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -723,8 +723,6 @@ Le flux sélectionné n’est pas pris en charge 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 éléments à venir - Masquer les éléments à venir Foire aux questions Voir sur le site web Si vous avez des difficultés à utiliser l\'application, consultez les réponses aux questions les plus fréquentes ! diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 3dc0d4794..1490a5960 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -707,9 +707,7 @@ 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 - Mostrar elementos próximos Non hai emisións de audio dispoñíbeis para reprodutores externos - Ocultar elementos próximos Ver na páxina web Preguntas máis frecuentes Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index e44cc580a..eb6a33cdb 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -734,8 +734,6 @@ בחירת איכות לנגנים חיצוניים תצורה לא מוכרת גודל משך טעינת נגינה - הצגת פריטים עתידיים - הסתרת פריטים עתידיים מיון הצגה באתר תשובות לשאלות נפוצות diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index cb8ddc3b8..270a47f06 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -649,7 +649,6 @@ क्या आप इस समूह को हटाना चाहते हैं\? नया फ़ीड - भविष्य आइटम दिखाएं नई फ़ीड आइटम फ़ीड संसाधित हो रही है … वेबसाइट खोलें @@ -658,7 +657,6 @@ ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - भविष्य आइटम छुपाएं कई बार पूछे प्रश्न वेबसाइट पर देखें आइटम हटाने के लिए स्वाइप करें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index ed64e5078..11ad99b93 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -720,8 +720,6 @@ Nijedan stream audiosnimaka nije dostupan za vanjske playere Nijedan video stream nije dostupan za vanjske playere Odaberi kvalitetu za vanjske playere - Prikaži buduće stavke Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka - Sakrij buduće stavke \ 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 6f7779915..b8b32005a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -709,8 +709,6 @@ Ismeretlen formátum Ismeretlen minőség Félhang - Jövőbeli elemek megjelenítése - Jövőbeli elemek elrejtése Gyakran ismételt kérdések Megtekintés a weboldalon Rendezés diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index aa847b2a4..d4ae5b455 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -241,7 +241,6 @@ 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 f7bba4573..e9bd9d0eb 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -695,8 +695,6 @@ Pilih kualitas untuk pemain eksternal Format tidak diketahui Ukuran interval pemuatan playback - Tampilkan item mendatang - Sembunyikan item mendatang Pertanyaan yang sering diajukan Jika Anda mengalami masalah menggunakan aplikasi, pastikan untuk melihat jawaban untuk pertanyaan yang umum! Tampilkan di situs web diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 1d6804eae..e27217971 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -608,7 +608,6 @@ Eyða sóttum skrám Viltu hreinsa niðurhalsferilinn eða eyða öllum sóttum skrám\? Engir myndstraumar eru í boði fyrir ytri spilara - Fela framtíðaratriði Eyða vefkökum reCAPTCHA Vefkökum reCAPTCHA eytt Stærð forhleðslu @@ -706,7 +705,6 @@ Valinn straumur er ekki studdur af ytri spilurum Engir hljóðstraumar eru í boði fyrir ytri spilara Veldu gæði fyrir ytri spilara - Sýna framtíðaratriði Ef þú átt í vandræðum með að nota forritið vertu viss um að skoða þessi svör við algengum spurningum! Algengar spurningar Skoða á vefsíðu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index fdb28c573..a653c09ae 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -721,8 +721,6 @@ Qualità sconosciuta Formato sconosciuto Dimensione intervallo di caricamento della riproduzione - Mostra elementi futuri - Nascondi elementi futuri Domande frequenti Se riscontri problemi nell\'utilizzo dell\'app, dai un\'occhiata alle risposte delle domande più comuni! Ordina diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e6f7b7b83..5d7c0922f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -695,8 +695,6 @@ 外部プレイヤーで利用可能な音声ストリームがありません 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 - 次のアイテムを表示する - 次のアイテムを隠す 並び替え ウェブサイトを表示 タップして%sをダウンロード diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 81aae3ac8..89c2193da 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -590,8 +590,6 @@ აირჩიეთ ხარისხი გარე დამკვრელებისთვის უცნობი ფორმატი უცნობი ხარისხი - მომავალი ელემენტების ჩვენება - სამომავლო ნივთების დამალვა დალაგება ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 49ea9cf0f..de9731a9a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -658,7 +658,6 @@ 자동 (장치 테마) 고정된 댓글 추천 - 향후 항목 표시하기 알 수 없는 형식 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 @@ -697,7 +696,6 @@ 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. - 향후 항목 숨기기 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 웹사이트에서 보기 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 30fae7787..1f4922a08 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -702,11 +702,9 @@ Gaukite pranešimą Dabar užsiprenumeravote šį kanalą - Rodyti būsimus elementus Reikalingas tinklo ryšys Transliacijos, kurių dar nepalaiko atsisiuntimo programa, nerodomos Nežinomas formatas - Slėpti būsimus elementus Bet koks tinklas Ištrinti visus atsisiųstus failus iš disko\? Grotuvo pranešimas diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index e96008e14..da6193e90 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -697,11 +697,9 @@ Du abonnerer nå på denne kanalen Strømmer som ennå ikke er støttet av nedlasteren, vises ikke Velg kvalitet for eksterne spillere - Vis fremtidige elementer Ingen videostrømmer er tilgjengelige for eksterne spillere Ukjent format Ukjent kvalitet - Skjul fremtidige elementer Ofte stilte spørsmål Vis på nettsiden Start sjekk etter nye strømmer diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e65d013d0..254a90c41 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -708,8 +708,6 @@ Selecteer kwaliteit voor externe spelers Onbekend formaat Intervalgrootte tijdens afspelen - Toon toekomstige objecten - Verberg toekomstige objecten Veelgestelde vragen Als u problemen ondervindt bij het gebruik van de app, bekijk dan deze antwoorden op veelgestelde vragen! Bekijk op de website diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index f7d4eec86..5f34c0ccf 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -54,8 +54,6 @@ Ingen ljodstraumar er tilgjengelege for ytre spelarar Ingen videostraumar er tilgjengelege for ytre spelarar Vel kvalitet for ytre spelarar - Vis framtidige ting - Skjul framtidige ting Skil ut Opna nettstaden Du fylgjer no denne kanalen diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index 16c6e6e22..5cceb93a4 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -727,6 +727,4 @@ ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. - ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߫ ߦߌ߬ߘߊ߬ - ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߬ ߢߡߊߘߏ߲߰ \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 3e3e1fd5c..f329fc44e 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -498,7 +498,6 @@ ExoPlayer ଡିଫଲ୍ଟ ବୟସ ସୀମା ଅଜ୍ଞାତ ଗୁଣବତ୍ତା - ଭବିଷ୍ୟତ ଆଇଟମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ । \n \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । @@ -614,7 +613,6 @@ ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ - ଭବିଷ୍ୟତର ଆଇଟମ୍ ଲୁଚାନ୍ତୁ ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ ହଜାର ସୂଚନା ପାଇବା… diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 17e015609..82082f875 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -660,8 +660,6 @@ ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਵਿਖਾਓ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਲੁਕਾਓ ਆਮ ਸਵਾਲ ਵੈੱਬਸਾਈਟ \'ਤੇ ਵੇਖੋ ਸਟਰੀਮ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 79c270ce6..ecb3322f7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -729,8 +729,6 @@ Wybierz jakość dla zewnętrznych odtwarzaczy Nieznany format Nieznana jakość - Pokaż przyszłe pozycje - Ukryj przyszłe pozycje Często zadawane pytania Jeśli masz problemy podczas korzystania z aplikacji, koniecznie sprawdź odpowiedzi na najczęściej pojawiające się pytania! Zobacz na stronie internetowej diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 463d222f6..558fe1b3e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -721,8 +721,6 @@ Formato desconhecido Qualidade desconhecida Tamanho do intervalo de carregamento da reprodução - Mostrar itens futuros - Ocultar itens futuros Visualizar no site Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns! Perguntas frequentes diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d17da4549..de0bed0a4 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -721,8 +721,6 @@ Qualidade desconhecida Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução - Mostrar artigos futuros - Ocultar artigos futuros Perguntas frequentes Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! Ver no sítio web diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0b3180a15..1fb73e4d6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -720,9 +720,7 @@ Formato desconhecido Qualidade desconhecida A transmissão selecionada não é suportada por reprodutores externos - Mostrar artigos futuros Tamanho do intervalo de carregamento da reprodução - Ocultar artigos futuros Perguntas frequentes Ver no site Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 9e8d9b306..dff39cce4 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -721,8 +721,6 @@ Format necunoscut Calitate necunoscută Dimensiunea intervalului de încărcare de redare - Afișați elementele din viitor - Ascunde elementele din viitor Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! Întrebări frecvente diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b4ac25bc4..6028b1ada 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -725,8 +725,6 @@ Выберите качество для внешних плееров Неизвестное качество Размер предварительной загрузки - Показывать будущие элементы - Скрывать будущие видео Ответы на частые вопросы Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! Посмотреть на веб-сайте diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 4a2797b75..2119ddc21 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -708,8 +708,6 @@ Calidade disconnota Su flussu seletzionadu no est galu suportadu dae letores esternos Mannària de s\'intervallu de carrigamentu de sa riprodutzione - Ammustra sos elementos imbenientes - Cua sos elementos imbenientes Preguntas fitianas Si ses tenende problemas impreende s\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas! Pòmpia in su situ web diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 282b18698..9c497c785 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -721,8 +721,6 @@ Streamy nepodporované sťahovačom sa nezobrazujú Žiadne video streamy nie sú k dispozícií pre externé prehrávače Neznáma kvalita - Zobraziť budúce položky - Skryť nasledujúce položky Často kladené otázky Pozrieť na webovej stránke Usporiadať diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index b3e0932b0..3d9dc6ee1 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -708,9 +708,7 @@ Videoströmmar som ännu inte stöds av nedladdaren visas inte Inläsningsintervalls storlek Välj kvalitet för externa spelare - Visa framtida objekt Den valda videoströmmen stöds inte av externa spelare - Göm framtida objekt Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor! Vanligt ställda frågor Visa på webbplats diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f1e678426..97ff192cd 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -707,8 +707,6 @@ Bilinmeyen biçim Bilinmeyen nitelik Oynatma yükleme aralığı boyutu - Gelecekteki ögeleri göster - Gelecekteki ögeleri gizle Sık Sorulan Sorular Web sitesinde görüntüle Uygulamayı kullanırken sorun yaşıyorsanız, sık sorulan sorulara verilen bu yanıtlara göz atmayı unutmayın! diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d5c88ae2b..253160568 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -725,8 +725,6 @@ Виберіть якість для зовнішніх програвачів Невідома якість Розмір інтервалу завантаження відтворення - Показати наступні елементи - Сховати майбутні елементи Переглянути на сайті Поширені запитання Якщо у вас виникли проблеми з використанням застосунку, обов\'язково ознайомтеся з відповідями на поширені запитання! diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fcb532435..2d7227001 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -695,8 +695,6 @@ Đị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 - Ẩn video đề xuất Thể loại Câu hỏi thường gặp Xem trên website diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9dadccfae..229359921 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -695,8 +695,6 @@ 不显示下载器尚不支持的串流 未知画质 播放加载间隔大小 - 显示未来项目 - 隐藏未来项目 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! 在网站上查看 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 49996f06a..960954ca7 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -675,7 +675,6 @@ 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 服務原本嘅字會騷返喺串流項目上面 影像要推三色碼 - 未夠鐘上畫嘅項目照顯示 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n @@ -697,7 +696,6 @@ \nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n \n所以就睇你點揀:想快定要準。 - 未夠鐘上畫嘅項目就收埋 去網站睇下 排序 常見問題 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bb887e249..86bd7620d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -695,8 +695,6 @@ 沒有可用於外部播放程式的視訊串流 選取外部播放程式的畫質 播放載入間隔大小 - 顯示未來項目 - 隱藏未來項目 常見問題 在網站上檢視 排序 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e35b3c2e5..e47b72c9a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,9 +3,7 @@ 16dp 8dp - 32dp 12dp - 8dp 4dp 2dp @@ -134,9 +132,6 @@ 12sp - 12dp - 6dp - 4dp 16sp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index b595a8f2c..528542ce7 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -24,7 +24,6 @@ https://newpipe.net/FAQ/ %1$s/%2$s YouTube - SoundCloud @string/app_name LeakCanary %1$s-%2$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2104526a..eb774f338 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -776,8 +776,6 @@ Unknown format Unknown quality Unknown - Show future items - Hide future items Fully watched Partially watched Upcoming diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml deleted file mode 100644 index a7cd061b8..000000000 --- a/app/src/main/res/xml/provider_paths.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - From 0ab99619080bd5c93d1edb0431835013f7130313 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Fri, 12 May 2023 01:09:08 -0400 Subject: [PATCH 074/133] Organize the proguard file --- app/proguard-rules.pro | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5e10d3916..d21f33e1f 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,32 +1,18 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /home/the-scrabi/bin/Android/Sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} +# https://developer.android.com/build/shrink-code +## Helps debug release versions -dontobfuscate + +## Rules for NewPipeExtractor -keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } - -keep class org.mozilla.javascript.** { *; } - -keep class org.mozilla.classfile.ClassFileWriter --keep class com.google.android.exoplayer2.** { *; } - -dontwarn org.mozilla.javascript.tools.** -# Rules for icepick. Copy paste from https://github.com/frankiesardo/icepick +## Rules for ExoPlayer +-keep class com.google.android.exoplayer2.** { *; } + +## Rules for Icepick. Copy pasted from https://github.com/frankiesardo/icepick -dontwarn icepick.** -keep class icepick.** { *; } -keep class **$$Icepick { *; } @@ -35,11 +21,11 @@ } -keepnames class * { @icepick.State *;} -## Rules for OkHttp. Copy paste from https://github.com/square/okhttp +## Rules for OkHttp. Copy pasted from https://github.com/square/okhttp -dontwarn okhttp3.** -dontwarn okio.** -## +## See https://github.com/TeamNewPipe/NewPipe/pull/1441 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; !static !transient ; @@ -47,5 +33,5 @@ private void readObject(java.io.ObjectInputStream); } -# for some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) +## For some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) -keep class org.schabi.newpipe.settings.notifications.** { *; } From fe82029dc7ad4ae78406edae56d9dd0ba6d09dff Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Fri, 12 May 2023 01:12:12 -0400 Subject: [PATCH 075/133] Fix unresolved extractor --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8b9659c1f..e0bbca636 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -201,7 +201,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:v0.22.6' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:8495ad619e' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ From 677bb4070f5958f076b38fc9ab667f4465ec0671 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 26 May 2023 10:29:10 +0200 Subject: [PATCH 076/133] Add rewrite announcement to readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f184b5360..e3261eb94 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! +

      We are planning to rewrite large chunks of the codebase, to bring about a new, modern and stable NewPipe!

      +

      Please do not open pull requests for new features now, only bugfix PRs will be accepted.

      NewPipe

      From c8e8915c2ec6906309491896318fd079b6c51a21 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 26 May 2023 11:05:32 +0200 Subject: [PATCH 077/133] Move questions to Discussions --- .github/{ISSUE_TEMPLATE => DISCUSSION_TEMPLATE}/question.yml | 0 .github/ISSUE_TEMPLATE/config.yml | 3 +++ 2 files changed, 3 insertions(+) rename .github/{ISSUE_TEMPLATE => DISCUSSION_TEMPLATE}/question.yml (100%) diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/question.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/question.yml rename to .github/DISCUSSION_TEMPLATE/question.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b0fdb56db..4721637bf 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ blank_issues_enabled: false contact_links: + - name: ❓ Question + url: https://github.com/TeamNewPipe/NewPipe/discussions/new?category=questions + about: Ask about anything NewPipe-related - name: 💬 IRC url: https://web.libera.chat/#newpipe about: Chat with us via IRC for quick Q/A From 577301c4eb288ac656c1ac3df881b5b178ff3f2a Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 26 May 2023 11:52:06 +0200 Subject: [PATCH 078/133] Proper filename for questions discussion template --- .github/DISCUSSION_TEMPLATE/{question.yml => questions.yml} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename .github/DISCUSSION_TEMPLATE/{question.yml => questions.yml} (81%) diff --git a/.github/DISCUSSION_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/questions.yml similarity index 81% rename from .github/DISCUSSION_TEMPLATE/question.yml rename to .github/DISCUSSION_TEMPLATE/questions.yml index 134f171f7..befb6280e 100644 --- a/.github/DISCUSSION_TEMPLATE/question.yml +++ b/.github/DISCUSSION_TEMPLATE/questions.yml @@ -1,11 +1,11 @@ name: Question description: Ask about anything NewPipe-related -labels: [question, needs triage] +labels: [question] body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this issue! :hugs: + Thanks for taking the time to fill out this form! :hugs: Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe). @@ -14,7 +14,7 @@ body: attributes: label: "Checklist" 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." + - label: "I made sure that there are *no existing issues or discussions* - [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 From 4e3bf3c2f93be962ffe4da838df043a477ff0f6d Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Tue, 30 May 2023 12:22:05 -0400 Subject: [PATCH 079/133] Update some libraries --- app/build.gradle | 21 ++++++++++----------- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e0bbca636..c2e8a95b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ plugins { id "kotlin-kapt" id "kotlin-parcelize" id "checkstyle" - id "org.sonarqube" version "3.5.0.2730" + id "org.sonarqube" version "4.0.0.2929" } android { @@ -107,14 +107,14 @@ android { } ext { - checkstyleVersion = '10.3.1' + checkstyleVersion = '10.11.0' androidxLifecycleVersion = '2.5.1' androidxRoomVersion = '2.4.3' androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.5' + exoPlayerVersion = '2.18.7' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' @@ -122,7 +122,6 @@ ext { leakCanaryVersion = '2.9.1' stethoVersion = '1.6.0' mockitoVersion = '4.0.0' - assertJVersion = '3.23.1' } configurations { @@ -193,7 +192,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle @@ -241,10 +240,10 @@ dependencies { kapt "frankiesardo:icepick-processor:${icepickVersion}" // HTML parser - implementation "org.jsoup:jsoup:1.15.3" + implementation "org.jsoup:jsoup:1.16.1" // HTTP client - implementation "com.squareup.okhttp3:okhttp:4.10.0" + implementation "com.squareup.okhttp3:okhttp:4.11.0" // Media player implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}" @@ -279,7 +278,7 @@ dependencies { implementation 'com.jakewharton:process-phoenix:2.1.2' // Reactive extensions for Java VM - implementation "io.reactivex.rxjava3:rxjava:3.1.5" + implementation "io.reactivex.rxjava3:rxjava:3.1.6" implementation "io.reactivex.rxjava3:rxandroid:3.0.2" // RxJava binding APIs for Android UI widgets implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" @@ -301,10 +300,10 @@ dependencies { testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "org.mockito:mockito-inline:${mockitoVersion}" - androidTestImplementation "androidx.test.ext:junit:1.1.3" - androidTestImplementation "androidx.test:runner:1.4.0" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test:runner:1.5.2" androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" - androidTestImplementation "org.assertj:assertj-core:${assertJVersion}" + androidTestImplementation "org.assertj:assertj-core:3.23.1" } static String getGitWorkingBranch() { diff --git a/build.gradle b/build.gradle index f5033c648..24a28bd6e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.8.20' + ext.kotlin_version = '1.8.21' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.0.1' + classpath 'com.android.tools.build:gradle:8.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8196ca199..2c3425d49 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 6bcc8691fa66884668c118053165e807ce46813b Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 5 Jun 2023 20:34:55 +0200 Subject: [PATCH 080/133] =?UTF-8?q?handle=20links=20to=20the=20PeerTube=20?= =?UTF-8?q?instance=20=E2=80=9Cpeertube.stream=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit also sort the lines, because it will quickly become a mess otherwise --- app/src/main/AndroidManifest.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9d86dde6d..1127c55a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -357,15 +357,16 @@ + - - - - + + - + + + From 3622438a9de2dd965848aaa607fc479ee384a4c2 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 14 Jun 2023 12:01:36 +0200 Subject: [PATCH 081/133] Translated using Weblate (Arabic) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 55.4% (41 of 74 strings) Translated using Weblate (Greek) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Malayalam) Currently translated at 83.7% (572 of 683 strings) Translated using Weblate (Lithuanian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Italian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (French) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Tigrinya) Currently translated at 2.1% (15 of 683 strings) Translated using Weblate (Tigrinya) Currently translated at 4.0% (3 of 74 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 22.2% (152 of 683 strings) Translated using Weblate (Turkish) Currently translated at 98.8% (675 of 683 strings) Added translation using Weblate (Tigrinya) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (683 of 683 strings) Added translation using Weblate (Kannada) Translated using Weblate (Norwegian Nynorsk) Currently translated at 13.4% (92 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Korean) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Korean) Currently translated at 12.1% (9 of 74 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (683 of 683 strings) Added translation using Weblate (English (Middle)) Added translation using Weblate (English (Old)) Added translation using Weblate (Sicilian) Added translation using Weblate (Aymara) Added translation using Weblate (Arabic (Najdi)) Added translation using Weblate (Kashmiri) Added translation using Weblate (German (Low)) Translated using Weblate (Korean) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Latvian) Currently translated at 93.7% (640 of 683 strings) Translated using Weblate (Dutch) Currently translated at 64.8% (48 of 74 strings) Translated using Weblate (Azerbaijani) Currently translated at 95.9% (71 of 74 strings) Translated using Weblate (German) Currently translated at 74.3% (55 of 74 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Korean) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (683 of 683 strings) Deleted translation using Weblate (Kashmiri) Deleted translation using Weblate (Arabic (Najdi)) Deleted translation using Weblate (Aymara) Deleted translation using Weblate (Sicilian) Deleted translation using Weblate (English (Old)) Deleted translation using Weblate (English (Middle)) Deleted translation using Weblate (German (Low)) Translated using Weblate (Belarusian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Italian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Russian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Slovak) Currently translated at 17.5% (13 of 74 strings) Translated using Weblate (French) Currently translated at 90.5% (67 of 74 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Hebrew) Currently translated at 99.2% (678 of 683 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Polish) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Greek) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Italian) Currently translated at 97.2% (664 of 683 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (French) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (German) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (German) Currently translated at 100.0% (683 of 683 strings) Co-authored-by: Agnieszka C Co-authored-by: AhHyeon An Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Alexthegib Co-authored-by: Arnis Jaundzeikars Co-authored-by: AudricV Co-authored-by: Balázs Meskó Co-authored-by: Domokun Co-authored-by: Emin Tufan Çetin Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Marian Hanzel Co-authored-by: Nidi Co-authored-by: Olivia Ng Co-authored-by: Priit Jõerüüt Co-authored-by: Rex_sa Co-authored-by: SC Co-authored-by: Surfoo Co-authored-by: TobiGr Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Weblate Co-authored-by: Yaron Shahrabani Co-authored-by: ai Co-authored-by: atilluF <110931720+atilluF@users.noreply.github.com> Co-authored-by: ctntt Co-authored-by: gallegonovato Co-authored-by: gbpu Co-authored-by: gymka Co-authored-by: jeffin-v Co-authored-by: nautilusx Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: thami simo Co-authored-by: tryvseu Co-authored-by: Макар Разин Co-authored-by: 이정희 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/ 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/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ti/ Translation: NewPipe/Metadata Translated using Weblate (Hungarian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Galician) Currently translated at 99.7% (681 of 683 strings) Translated using Weblate (Hungarian) Currently translated at 17.5% (13 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/ Translated using Weblate (Hindi) Currently translated at 100.0% (74 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translated using Weblate (N’Ko) Currently translated at 98.5% (673 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) --- app/src/main/res/values-ar/strings.xml | 34 ++++- app/src/main/res/values-az/strings.xml | 104 +++++++++------ app/src/main/res/values-be/strings.xml | 23 +++- app/src/main/res/values-cs/strings.xml | 32 ++++- app/src/main/res/values-de/strings.xml | 22 ++++ app/src/main/res/values-el/strings.xml | 22 ++++ app/src/main/res/values-es/strings.xml | 22 ++++ app/src/main/res/values-et/strings.xml | 22 ++++ app/src/main/res/values-fr/strings.xml | 24 +++- app/src/main/res/values-gl/strings.xml | 28 ++++- app/src/main/res/values-he/strings.xml | 22 ++++ app/src/main/res/values-hi/strings.xml | 23 +++- app/src/main/res/values-hu/strings.xml | 52 +++++++- app/src/main/res/values-in/strings.xml | 22 ++++ app/src/main/res/values-it/strings.xml | 22 ++++ app/src/main/res/values-kn/strings.xml | 2 + app/src/main/res/values-ko/strings.xml | 36 +++++- app/src/main/res/values-lt/strings.xml | 48 ++++++- app/src/main/res/values-lv/strings.xml | 87 +++++++++---- app/src/main/res/values-ml/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 32 ++++- app/src/main/res/values-nn/strings.xml | 119 +++++++++++++++--- app/src/main/res/values-nqo/strings.xml | 11 +- app/src/main/res/values-pa/strings.xml | 23 +++- app/src/main/res/values-pl/strings.xml | 22 ++++ app/src/main/res/values-pt-rBR/strings.xml | 34 ++++- app/src/main/res/values-pt-rPT/strings.xml | 116 ++++++++++------- app/src/main/res/values-pt/strings.xml | 32 ++++- app/src/main/res/values-ru/strings.xml | 24 +++- app/src/main/res/values-sc/strings.xml | 22 ++++ app/src/main/res/values-sk/strings.xml | 41 +++++- app/src/main/res/values-sv/strings.xml | 23 +++- app/src/main/res/values-ti/strings.xml | 19 +++ app/src/main/res/values-tr/strings.xml | 15 +++ app/src/main/res/values-uk/strings.xml | 22 ++++ app/src/main/res/values-zh-rCN/strings.xml | 22 ++++ app/src/main/res/values-zh-rHK/strings.xml | 31 ++++- app/src/main/res/values-zh-rTW/strings.xml | 22 ++++ .../metadata/android/ar/changelogs/65.txt | 28 +++++ .../metadata/android/ar/changelogs/66.txt | 35 ++++++ .../metadata/android/ar/changelogs/780.txt | 12 ++ .../metadata/android/ar/changelogs/790.txt | 14 +++ .../metadata/android/az/full_description.txt | 2 +- .../metadata/android/de/changelogs/993.txt | 12 ++ .../metadata/android/fr/short_description.txt | 2 +- .../metadata/android/hi/changelogs/993.txt | 12 ++ .../metadata/android/hu/changelogs/63.txt | 2 +- .../metadata/android/hu/changelogs/65.txt | 30 ++--- .../metadata/android/hu/changelogs/68.txt | 31 +++++ .../metadata/android/hu/changelogs/974.txt | 5 + .../metadata/android/hu/changelogs/978.txt | 1 + .../metadata/android/hu/changelogs/979.txt | 2 + .../metadata/android/hu/changelogs/991.txt | 2 +- .../metadata/android/hu/changelogs/993.txt | 12 ++ .../metadata/android/hu/full_description.txt | 2 +- .../metadata/android/ko/changelogs/952.txt | 7 ++ .../metadata/android/nl/changelogs/953.txt | 2 +- .../metadata/android/sk/changelogs/65.txt | 26 ++++ .../metadata/android/sk/changelogs/66.txt | 33 +++++ .../metadata/android/sk/changelogs/989.txt | 3 + .../metadata/android/sk/changelogs/990.txt | 15 +++ .../metadata/android/sk/changelogs/992.txt | 17 +++ .../metadata/android/sk/changelogs/993.txt | 12 ++ .../metadata/android/ti/changelogs/850.txt | 1 + .../metadata/android/ti/full_description.txt | 1 + .../metadata/android/ti/short_description.txt | 1 + 66 files changed, 1403 insertions(+), 198 deletions(-) create mode 100644 app/src/main/res/values-kn/strings.xml create mode 100644 app/src/main/res/values-ti/strings.xml create mode 100644 fastlane/metadata/android/ar/changelogs/65.txt create mode 100644 fastlane/metadata/android/ar/changelogs/66.txt create mode 100644 fastlane/metadata/android/ar/changelogs/780.txt create mode 100644 fastlane/metadata/android/ar/changelogs/790.txt create mode 100644 fastlane/metadata/android/de/changelogs/993.txt create mode 100644 fastlane/metadata/android/hi/changelogs/993.txt create mode 100644 fastlane/metadata/android/hu/changelogs/68.txt create mode 100644 fastlane/metadata/android/hu/changelogs/974.txt create mode 100644 fastlane/metadata/android/hu/changelogs/978.txt create mode 100644 fastlane/metadata/android/hu/changelogs/979.txt create mode 100644 fastlane/metadata/android/hu/changelogs/993.txt create mode 100644 fastlane/metadata/android/ko/changelogs/952.txt create mode 100644 fastlane/metadata/android/sk/changelogs/65.txt create mode 100644 fastlane/metadata/android/sk/changelogs/66.txt create mode 100644 fastlane/metadata/android/sk/changelogs/989.txt create mode 100644 fastlane/metadata/android/sk/changelogs/990.txt create mode 100644 fastlane/metadata/android/sk/changelogs/992.txt create mode 100644 fastlane/metadata/android/sk/changelogs/993.txt create mode 100644 fastlane/metadata/android/ti/changelogs/850.txt create mode 100644 fastlane/metadata/android/ti/full_description.txt create mode 100644 fastlane/metadata/android/ti/short_description.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 569701eea..0bf017961 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -23,7 +23,7 @@ فاتح خطأ في الشبكة لم يتم العثور على مشغل بث. تثبيت VLC؟ - فتح في متصفح الويب + فتح في المتصفح الصوت تشغيل بواسطة كودي البحث @@ -91,7 +91,7 @@ محتوى مقيد للبالغين بث مباشر تقرير عن المشكلة - متوقف + معطل تنظيف أفضل دقة تراجع @@ -133,7 +133,7 @@ لاتوجد فيديوهات ابدأ إيقاف مؤقت - حذف + احذف التوقيع حسناً اسم الملف @@ -158,9 +158,9 @@ ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! عرض على GitHub - تبرع + تبرَّع يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. - تبرع + رد الجميل موقع الويب قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات. تراخيص NewPipe @@ -174,7 +174,7 @@ الشائعة أفضل ٥٠ جديد وساخن - حذف + أحذف التفاصيل إعدادات الصوت بدأ التشغيل في نافذة منبثقة @@ -791,4 +791,26 @@ اختر إيماءة للنصف الأيسر من شاشة المشغل اختر إيماءة للنصف الأيمن من شاشة المشغل مستوى الصوت + قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي + تفضل الصوت الوصفي + الصوت : %s + المسار الصوتي + يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث + حدد مسار الصوت للمشغلات الخارجية + غير معروف + إعدادات ExoPlayer + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول + استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + %s %s + الافتراضي + مدبلجة + وصفي + حدد المسار الصوتي الأصلي بغض النظر عن اللغة + تفضيل الصوت الأصلي + حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا + استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer + قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث +\n +\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة \ 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 29c320016..0072f8187 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -4,35 +4,35 @@ %1$s tarixində yayımlanıb Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz). - Yüklə + Quraşdır Ləğv et Brauzerdə aç Paylaş - Endir - Yayım faylını endir + Yüklə + Yayım faylın yüklə Axtarış Tənzimləmələr - Bunu demək istəyirdiniz: \"%1$s\"\? + \"%1$s\" nəzərdə tuturdunuz\? ilə paylaş Xarici video oynadıcı istifadə et - Bəzi ayırdetmələrdə səsi silir + Bəzi formatlarda səsi silir Xarici səs oynadıcı istifadə et Abunə Ol Abunə olundu Kanal abunəliyi ləğv edildi Məlumat göstər - Abunələr - Əlfəcinlənmiş Pleylistlər + Abunəliklər + Əlfəcinlənmiş Oynatma Siyahıları Yeniliklər Fon - Video endirmə qovluğu - Endirilmiş video fayllar burada saxlanılır - Video fayllar üçün endirmə qovluğu seç - Səs endirmə qovluğu - Endirilmiş səs faylları burada saxlanılır - Səs faylları üçün endirmə qovluğu seç - Standart ayırdetmə - Daha böyük ayırdetmələr göstər + Video yükləmə qovluğu + Yüklənilmiş video fayllar burada saxlanılır + Video fayllar üçün yükləmə qovluğu seç + Səs yükləmə qovluğu + Yüklənilmiş səs faylları burada saxlanılır + Səs faylları üçün yükləmə qovluğu seç + Standart format + Daha böyük formatlar göstər \"Kodi\" ilə Oynat Çatışmayan \"Kore\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər @@ -85,13 +85,13 @@ İkinci fəaliyyət düyməsi Birinci fəaliyyət düyməsi Yalnız bəzi cihazlar 2K/4K videoları oynada bilir - Standart ani görüntü ayırdetməsi + Standart ani görüntü formatı Əlavə Et Ani Görüntü Paneli Seç Abunəliyi yeniləmək alınmadı Abunəliyi dəyişmək alınmadı - Nəticələr göstərilir: %s + %s üçün nəticələr göstərilir Kanallar %s tərəfindən YouTube\'un \"Məhdud Rejimi\"ni aç @@ -425,21 +425,21 @@ Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et Ən Yeni Bu məzmun ölkənizdə mövcud deyil. - Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlana və ya endirilə bilməz. + Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, beləliklə, NewPipe tərəfindən yayımlana və ya yüklənilə bilməz. Avtomatik (cihaz teması) Sevimli gecə temanızı seçin — %s - Sabitlənmiş şərh - Bildirişlər deaktiv edilib + Sancaqlanmış şərh + Bildirişlər qeyri-aktivdir Bildiriş al Artıq bu kanala abunə oldunuz , - Hamısını dəyişdir + Hamısın dəyişdir Fayl adı Həll et Abunəlikləri ixrac etmək mümkün olmadı - %s izləyici - %s izləyici + %s baxıcı + %s baxıcı Yeni versiyaları əl ilə yoxla @@ -485,7 +485,7 @@ Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. \nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? - Seçilmiş + Seçilən Çəkməcəni Bağla Video oynadıcı Video fayl xülasəsi prosesi üçün bildirişlər @@ -518,8 +518,8 @@ Eyni vaxtda ancaq bir endirmə həyata keçiriləcək Hesab ləğv edildi %s bu səbəbi təmin edir: - Endirmə başladı - Açıqlamadakı mətni seçməyi deaktiv et + Yükləmə başladı + Açıqlamadakı mətni seçməyi qeyri-aktiv et Kateqoriya Daxili Açıqlamadakı mətni seçməyi aktivləşdir @@ -544,7 +544,7 @@ Endirmə tamamlandı %s endirmə tamamlandı - Standart ExoPlayer + ExoPlayer standartı Mövcud olduqda xüsusi axından al Baxılmış videolar silinsin\? İzləniləni sil @@ -616,7 +616,7 @@ Bura ixrac et Faylı idxal et Abunəlikləri idxal etmək mümkün olmadı - Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatın bizə göndərmək üçün qəbul etməlisiniz. + Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta məlumatın bizə göndərmək üçün qəbul etməlisiniz. Bu adda fayl artıq mövcuddur Bu adla gözlənilən bir endirmə var Təyinat qovluğu yaradıla bilməz @@ -667,16 +667,16 @@ Yayım təfərrüatları yüklənir… Media tunelini deaktiv et Tətbiq çökdü - YouTube abunəliklərini Google takeout\'dan -\nidxal edin: + YouTube abunəliklərin Google Takeout-dan +\nidxal et: \n -\n1. Bu URL\'ə keçin: %1$s -\n2. Soruşulduqda daxil olun -\n3.\"Bütün Məlumatlar Daxildir\",sonra \"Heçbirini Seçmə\", yalnız \"abunəliklər\"i seçin və \"Oldu\" kliklə -\n4. \"Növbəti addım\"üzərinə klikləyin, sonra isə \"İxrac Yarat\" üzərinə klikləyin -\n5. Görünəndən sonra \"Endir\"düyməsini basın -\n6. Aşağıdakı FAYLI İDXAL ET düyməsinə klikləyin və endirilmiş .zip faylını seçin -\n7. [Əgər .zip faylı idxalı uğursuz olsa] .csv faylını çıxarın(adətən\"YouTubevəYouTubeMusic/subscriptions/subscriptions.csv\" altında),aşağıda İDXAL EDİLƏN FAYL-ı klikləyin və çıxarılmış csv faylını seçin +\n1. %1$s URL\'ə keçin: +\n2. Soruşulduqda daxil ol +\n3. \"Bütün Məlumatlar Daxildir\",sonra \"Hamısın Seçmə\", yalnız \"abunəlikləri\" seç və \"Oldu\" kliklə +\n4. \"Növbəti addım\"üzərinə kliklə, sonra isə \"İxrac Yarat\" üzərinə kliklə +\n5. Görünəndən sonra, \"Endirin\"düyməsin bas +\n6. Aşağıda FAYLI İDXAL ET düyməsin kliklə və yüklənilmiş (.zip) faylın seç +\n7. [Əgər .zip faylı idxalı uğursuz olsa] .csv faylın çıxar(adətən\"YouTubeandYouTubeMusic/subscriptions/subscriptions.csv\" altında),aşağıda FAYLI İDXAL ET-ə kliklə və çıxarılan csv faylın seç Oynatma Sürəti Nizamlamaları Ayır (pozuntuya səbəb ola bilər) Xətanı göstər @@ -696,14 +696,14 @@ Bu əməliyyat üçün uyğun fayl meneceri tapılmadı. \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ə və keçidlər kliklənməyə bilər. + İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və linklər kliklənməyə bilər. Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç Belə fayl/məzmun mənbəyi yoxdur - Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir + Seçilən yayım xarici oynadıcılar tərəfindən dəstəklənmir Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir - Xarici oynadıcılar üçün heç bir səs yayımı yoxdur - Xarici oynadıcılar üçün heç bir video yayımı yoxdur + Xarici oynadıcılar üçün mövcud səs yayımı yoxdur + Xarici oynadıcılar üçün mövcud video yayımı yoxdur Xarici oynadıcılar üçün keyfiyyət seç Naməlum format Naməlum keyfiyyət @@ -739,4 +739,26 @@ Səs səviyyəsi Heç biri Oynadıcı ekranının sol yarısı üçün jest seç + Orijinal səsə üstünlük ver + Dildən asılı olmayaraq orijinal səs axını seç + Təsviri səsə üstünlük ver + Varsa, görmə qabiliyyəti zəifləyən insanlar üçün təsviri olan səs axını seçin + Səs: %s + Səs axını + Səs axını bu yayımda olmalıdır + Xarici oynadıcılar üçün səs axını seç + Naməlum + ExoPlayer tənzimləmələri + Bəzi ExoPlayer tənzimləmələrin idarə et. Bu dəyişiklikləri təsirli etmək üçün oynadıcını yenidən başlatmaq tələb olunur + ExoPlayer-in çözücü xüsusiyyətin istifadə et + Əsas çözücüləri işlətmə uğursuz olarsa, çözücü işlətmək probleminiz varsa (daha aşağı prioritetli çözücülərə düşür), bu seçimi aktiv edin. Bu, əsas çözücülərdən istifadə ilə müqayisədə zəif oynatma performansı ilə nəticələnə bilər + Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer tərəfindən bu problemi olan bəzi cihazlarda istifadə olunur, bu tənzimləmənin təsiri yalnız Android 6 və daha yüksəkdə var. +\n +\nBu seçimi aktivləşdirmə cari video oynadıcı dəyişdiriləndə və ya tam ekrana keçəndə oynatma xətalarının qarşısını ala bilər + %s %s + orijinal + dublyaj edilib + təsviri + Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et + Qabaqcıl məzmunda yükləmə aralığı həcmin dəyişdir (hazırda %s). Daha aşağı dəyər onların ilkin yüklənilməsin sürətləndirə bilər \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7538ad9db..0a007ab9d 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -584,7 +584,7 @@ %d хвілінаў %d хвілінаў - Змяніць памер інтэрвалу загрузкі (зараз %s). Меншае значэнне можа паскорыць пачатковую загрузку відэа. Змены патрабуюць перазапуск плэера + Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (у цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю Прапановы лакальнага пошуку Наладзіць апавяшчэнне аб бягучым прайграванні патоку @@ -764,4 +764,25 @@ Выбраць жэст для левай часткі экрана прайгравання Гук Выбраць жэст для правай часткі экрана прайгравання + Выбіраць зыходную гукавую дарожку незалежна ад мовы + Аддаць перавагу арыгінальнаму гуку + Аддаць перавагу апісальнаму гуку + Выберыце гукавую дарожку з апісаннем для людзей са слабым зрокам, калі яна ёсць + Аўдыё: %s + Гукавая дарожка + Выберыце гукавую дарожку для знешніх прайгравальнікаў + Невядомая + Налады ExoPlayer + Выкарыстоўваць функцыю рэзервовага дэкодэра ExoPlayer + Заўсёды выкарыстоўваць спосаб абыходу налад паверхні відэавываду ExoPlayer + %s %s + арыгінальны + дубляваны + апісальны + Гукавая дарожка ўжо павінна прысутнічаць у гэтай плыні + Уключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў + Кіраванне некаторымі наладамі ExoPlayer. Каб гэтыя змены ўступілі ў сілу, патрабуецца перазапуск гульца + Гэты абыходны шлях вызваляе і паўторна стварае відэакодэкі, калі адбываецца змяненне паверхні, замест таго, каб усталёўваць паверхню непасрэдна для кодэка. ExoPlayer ужо выкарыстоўваецца на некаторых прыладах з гэтай праблемай, гэты параметр мае ўплыў толькі на прыладах з Android 6 і вышэй +\n +\nУключэнне гэтай опцыі можа прадухіліць памылкі прайгравання пры пераключэнні бягучага відэаплэера або пераключэнні ў поўнаэкранны рэжым \ 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 7e9125ef6..72a780e9b 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -117,7 +117,7 @@ Chování Historie a mezipaměť Přehrávání v okně - Vypnuto + Zakázáno Vyčistit Nejlepší rozlišení Vrátit @@ -153,7 +153,7 @@ O NewPipe Licence třetích stran © %1$s od %2$s pod %3$s - O aplikaci a ČKD + O aplikaci a FAQ Licence Svobodné a nenáročné streamování v Androidu. Zobraz na GitHubu @@ -356,8 +356,8 @@ Mřížka Automaticky Aktualizace NewPipe je k dispozici! - Hotovo - Vyčkávání + Dokončeno + Čekání Pozastaveno ve frontě zpracování @@ -366,7 +366,7 @@ Stahování se nezdařilo Vytvořit jedinečný název Přepsat - Stažený soubor s tímto názvem již existuje + Soubor s tímto názvem již existuje Stažený soubor s tímto názvem již existuje Stahování s tímto názvem již probíhá Zobrazit chybu @@ -752,4 +752,26 @@ Vyberte gesto pro levou polovinu obrazovky přehrávače Jas Vyberte gesto pro pravou polovinu obrazovky přehrávače + Změna velikosti intervalu načítání progresivního obsahu (aktuálně %s). Nižší hodnota může urychlit jejich počáteční načítání + Upřednostňovat původní zvuk + Vybrat původní zvukovou stopu bez ohledu na jazyk + Upřednostňovat popisný zvuk + Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je k dispozici + Neznámá + Nastavení přehrávače ExoPlayer + Správa některých nastavení přehrávače ExoPlayer. Tyto změny vyžadují restartování přehrávače, aby se projevily + Použít funkci náhradního dekodéru přehrávače ExoPlayer + Tuto možnost povolte, pokud máte problémy s inicializací dekodéru. V případě selhání inicializace primárních dekodérů se přehrávač vrátí zpět k dekodérům s nižší prioritou. To může mít za následek nižší výkon přehrávání než při použití primárních dekodérů + Vždy použít nastavení povrchu výstupu videa v přehrávači ExoPlayer + %s %s + původní + dabovaná + popisná + Zvuková stopa + V tomto streamu by již měla být přítomna zvuková stopa + Vyberte zvukovou stopu pro externí přehrávače + Toto obejití uvolní a znovu nainstaluje kodeky videa, když dojde ke změně povrchu, místo aby se povrch nastavil přímo na kodek. Toto nastavení, které již bylo použito v přehrávači ExoPlayer na některých zařízeních s tímto problémem, má vliv pouze na Android 6 a vyšší. +\n +\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí na celou obrazovku + Zvuk: %s \ 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 0e477f38a..17dbb3f97 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -739,4 +739,26 @@ Linke Gestenaktion Helligkeit Lautstärke + Ändere die Größe des Ladeintervalls für progressive Inhalte (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden der Inhalte beschleunigen. + Originalton bevorzugen + Wähle die Originaltonspur unabhängig von der Sprache + Beschreibendes Audio bevorzugen + Wähle eine Audiospur mit Beschreibungen für sehbehinderte Menschen, falls verfügbar + Audio: %s + Audiospur + Verwalte einige ExoPlayer-Einstellungen. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden + Verwende die Decoder-Fallback-Funktion von ExoPlayer + Verwende immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung + Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher +\n +\nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern + Original + Synchronisiert + Beschreibend + Audiospur für externe Player auswählen + In diesem Stream sollte bereits eine Audiospur vorhanden sein + Aktiviere diese Option, wenn du Probleme mit der Decoderinitialisierung hast, die auf Decoder mit niedrigerer Priorität zurückgreift, wenn die Initialisierung des primären Decoders fehlschlägt. Dies kann zu einer schlechteren Wiedergabeleistung führen als bei der Verwendung von Primärdecodern + Unbekannt + ExoPlayer-Einstellungen + %s %s \ 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 d0d003f98..6f45645e2 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -739,4 +739,26 @@ Φωτεινότητα Ένταση Καμία + Προτίμηση πρωτότυπου ήχου + Επιλογή του πρωτότυπου κομματιού ήχου ανεξάρτητα από τη γλώσσα + Προτίμηση του περιγραφικού ήχου + Ήχος: %s + Κομμάτι ήχου + Ένα κομμάτι ήχου θα πρέπει να υπάρχει ήδη σε αυτήν τη ροή + Επιλογή ήχου για εξωτερικές συσκευές αναπαραγωγής + Άγνωστο + Ρυθμίσεις ExoPlayer + Διαχειριστείτε ορισμένες ρυθμίσεις του ExoPlayer. Αυτές οι αλλαγές απαιτούν επανεκκίνηση του προγράμματος αναπαραγωγής για να τεθεί σε ισχύ + Χρησιμοποιήστε την δυνατότητα εναλλακτικού αποκωδικοποιητή του ExoPlayer + Ενεργοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με την προετοιμασία του αποκωδικοποιητή, η οποία επιστρέφει σε αποκωδικοποιητές χαμηλότερης προτεραιότητας εάν αποτύχει η προετοιμασία του πρωτεύοντος αποκωδικοποιητή. Αυτό μπορεί να έχει ως αποτέλεσμα κακή απόδοση αναπαραγωγής από ότι όταν χρησιμοποιείτε κύριους αποκωδικοποιητές + Χρησιμοποιείτε πάντα τον εναλλακτικό τρόπο ρύθμισης της επιφάνειας εξόδου βίντεο του ExoPlayer + Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση. +\n +\nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη + %s %s + αρχικό + μεταγλωττισμένο + περιγραφικό + Αλλάξτε το μέγεθος του διαστήματος φόρτωσης σε προοδευτικά περιεχόμενα (προς το παρόν %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική τους φόρτωση + Επιλογή ήχου με περιγραφές για άτομα με προβλήματα όρασης, εάν είναι διαθέσιμος \ 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 552a8f542..0b74955f2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -755,4 +755,26 @@ Ninguno Elige un gesto para la mitad izquierda de la pantalla del reproductor Elige un gesto para la mitad derecha de la pantalla del reproductor + Prefiero el audio original + Selecciona la pista de audio original independientemente del idioma + Prefiero un audio descriptivo + Selecciona una pista de audio con descripciones para personas con discapacidad visual, si está disponible + Audio: %s + Pista de audio + Ya debería existir una pista de audio en esta transmisión + Selecciona una pista de audio para reproductores externos + Desconocido + Utilice la función de respaldo del decodificador de ExoPlayer + Utiliza siempre la configuración de ExoPlayer para la interfaz de salida del video como una solución alternativa + %s %s + original + doblado + descriptivo + Cambia el tamaño del intervalo de carga en contenidos progresivos (actualmente %s). Un valor más bajo puede acelerar la carga inicial + Ajustes para ExoPlayer + Gestiona algunos ajustes de ExoPlayer. Estos cambios requieren reiniciar el reproductor para que surtan efecto + Habilite esta opción si tiene problemas con la inicialización del decodificador recurriendo a decodificadores de menor prioridad si el decodificador principal no se inicializa. Esto puede dar como resultado un rendimiento de reproducción más bajo que cuando se usan decodificadores primarios + Esta solución alternativa libera los códecs de video y los vuelve a instanciar cuando cambia la máscara, en lugar de configurar la máscara directamente en el códec. ExoPlayer ya usa esta configuración en algunos dispositivos con este problema y solo afecta a Android 6 y versiones posteriores +\n +\nHabilitar esta opción puede evitar errores de reproducción al cambiar el reproductor de video actual o cambiar al modo de pantalla completa \ 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 5b2e8e125..919168552 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -739,4 +739,26 @@ Eredus Vali viibe meediamängija ekraani parema poole jaoks Toiming viipel paremal poolel + Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem + Eelista algset heliriba + Sõltumata keelevalikutest eelista esmaseks määratud heliriba + Eelista kirjeldavat heliriba + Eelista nägemispuudega inimeste jaoks koostatud heliriba, kui selline on olemas + Heli: %s + Selles meediavoos peaks heliriba juba olemas olema + Kasuta ExoPlayer\'i alternatiivset dekooderit + Kasuta alati ExoPlayer\'i video väljundpinna seadistamise lahendust + %s %s + algne + dubleeritud + kirjeldav + Heliriba + Vali heliriba väliste meediamängijate jaoks + Teadmata + ExoPlayer\'i seadistused + Järgnevas saad hallata mõningaid ExoPlayer\'i seadistusi. Need muudatused vajavad jõustumiseks meediamängija uuesti käivitamist + Kasuta seda võimalust, kui põhidekooder ei käivitu korralikult. Selle asemel laaditakse alternatiivne dekooder, kuid tulemuseks võib olla kehvem taasesituse kvaliteet + Video väljundpinna muutumisel see alternatiivne lahendus eemaldab videokodekid kasutusest ja laadib nad uuesti ega ürita videokodeke uue väljundpinnaga sobitada. See seadistus toimib vaid Android 6 ja uuemates versioonides ning mõne seadme puhul on juba automaatselt kasutusel +\n +\nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel \ 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 5443fe3c8..8ce9b8737 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -672,7 +672,7 @@ Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… - Vérifier les mises à jours + Vérifier les mises à jour Nouveaux éléments du flux Faire planter le lecteur Afficher « Faire planter le lecteur » @@ -754,4 +754,26 @@ Aucune Action du geste vers la droite Luminosité + Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos + Préférence pour l\'audio original + Sélectionner la piste audio originale quelle que soit la langue + Préférer l\'audio descriptif + Audio : %s + Piste audio + Une piste audio doit déjà être présente dans ce flux + Inconnue + Paramètres d’ExoPlayer + Gérez certains paramètres d\'ExoPlayer. Ces modifications nécessitent un redémarrage du lecteur pour être prises en compte + Utiliser la fonctionnalité de repli du décodeur d\'ExoPlayer + Toujours utiliser la solution de contournement de définition de surface de sortie vidéo d\'ExoPlayer + %s %s + original + doublée + descriptif + Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. +\n +\nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran + Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible + Sélectionner la piste audio pour les lecteurs externes + Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires \ 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 1490a5960..729220689 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -41,7 +41,7 @@ Mostrar resolucións máis altas Só algúns dispositivos poden reproducir vídeos en 2K/4K Reproducir co Kodi - Quere instalar o aplicativo Kode que falta\? + Quere instalar o aplicativo Kore que falta\? Mostrar a opción «Reproducir co Kodi» Mostrar unha opción para reproducir o vídeo co Kodi Media Center Audio @@ -732,4 +732,30 @@ Completamente visto Parcialmente visto Proximamente + Escolla o xesto para a metade dereita da pantalla do reprodutor + Acción do xesto para a dereita + Acción do xesto na esquerda + Brillo + Volume + Ningún + Audio: %s + Faixa de audio + Xa debe existir unha faixa de audio nesta emisión + Selecione a faixa de áudio para reprodutores externos + Descoñecida + Configuracións ExoPlayer + Xestione algunhas configuracións de ExoPlayer. É necesario reiniciar o reprodutor para aplicar os cambios + Use a función fallback do decodificador do ExoPlayer + Habilite esta opción se ten problemas na inciciación do decodificador. Usaranse decodificadores de menor prioridade se os primarios fallan. Isto pode resultar nun menor rendemento comparado co dos primarios + Usar sempre Explayer como alternativa de saída de vídeo + %s %s + orixinal + dobrado + descritivo + Altera o tamaño do intervalo de carregamento progresivo (o actual é %s). Un valor menor pode acelerar o carregamento inicial do vídeo + Preferir o audio orixinal + Seleccionar o audio orixinal independentemente do idioma + Seleciona o audio con descrición para persoas con dificuldades de visión, se estar dispoñíbel + Prefirir o audio descritivo + Escolla o xesto para a metade esquerda da pantalla do reprodutor \ 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 eb6a33cdb..e3ff17deb 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -765,4 +765,26 @@ נצפו במלואם להציג את השידורים הבאים להציג/להסתיר שידורים + להעדיף שמע מקורי + לבחור את רצועת השמע המקורית ללא תלות בשפה + להעדיף שמע מפורט + לבחור רצועת שמע עם תיאורים לכבדי ראייה אם ניתן + שמע: %s + רצועת שמע + רצועת שמע כבר אמורה להיות כחלק מהתזרים + לא ידועה + הגדרות ExoPlayer + להשתמש ביכולת הגיבוי של המפענח של ExoPlayer + מקורי + מדובב + בחירת רצועת שמע לנגנים חיצוניים + מפורט + ניהול חלק מהגדרות של ה־ExoPlayer שלך. השינויים האלו דורשים את הפעלת הנגן מחדש כדי להיכנס לתוקף + שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית + יש להפעיל את האפשרות הזאת אם נתקלת בבעיות עם אתחול מפענח, מה שגורם להנחתה למפענחים עם עדיפות נמוכה יותר אם אתחול המפענחים העיקריים נכשל. עלול לגרום לביצועי נגינה נחותים לעומת מפענחים ראשיים + %s %s + תמיד להשתמש במעקף הגדרות משטח פלט הווידאו של ExoPlayer + המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד +\n +\nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 270a47f06..369eaf4f7 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -668,7 +668,7 @@ लाइसेंस यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें! कतार में आगे जोड़ें - लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान आरंभिक वीडियो लोडिंग को गति दे सकता है। परिवर्तन के लिए प्लेयर को पुनः आरंभ करने की आवश्यकता होती है + प्रगतिशील सामग्री पर लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान उनकी आरंभिक लोडिंग को गति दे सकता है लीककैनरी उपलब्ध नहीं है एक त्रुटी हुई है, अधिसूचना देखें यदि आप काली स्क्रीन या वीडियो प्लेबैक खड़खड़ाते हुए चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें @@ -740,4 +740,25 @@ प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें दाएँ इशारा क्रिया + मूल ऑडियो को प्राथमिकता दें + यदि उपलब्ध हो तो दृष्टिबाधित लोगों के लिए विवरण के साथ एक ऑडियो ट्रैक का चयन करें + वर्णनात्मक ऑडियो को प्राथमिकता दें + भाषा की परवाह किए बिना मूल ऑडियो ट्रैक का चयन करें + ऑडियो: %s + ऑडियो ट्रैक + बाहरी प्लेयर्स के लिए ऑडियो ट्रैक का चयन करें + अज्ञात + ExoPlayer सेटिंग्स + एक्सोप्लेयर के डिकोडर फॉलबैक फीचर का उपयोग करें + हमेशा ExoPlayer के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें + %s %s + मूल + डब + वर्णनात्मक + एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए + इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती हैं। प्राथमिक डिकोडर का उपयोग करते समय इसके परिणामस्वरूप खराब प्लेबैक प्रदर्शन हो सकता है + कुछ ExoPlayer सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए किसी प्लेयर को पुनरारंभ करने की आवश्यकता होती है + सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है +\n +\nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है \ 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 b8b32005a..0048f7862 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -51,9 +51,9 @@ Ez történt: Az Ön megjegyzése (angolul): Részletek: - Elnézet, valami balul sült el. + Elnézést, valami balul sült el. Elnézést, ennek nem kellett volna megtörténnie. - Hiba bejelentése e-mailben + Jelentés e-mailben Nem sikerült a letöltési menü beállítása Nem sikerült a videó URL aláírásának feloldása Újra @@ -620,7 +620,7 @@ Lista feldolgozása… Egyes szolgáltatásoknál érhető el, általában sokkal gyorsabb, és korlátozott számú elemet adhat vissza, gyakran hiányos információkkal (például nincs hossz, elemtípus, vagy élő videó állapot) Fiók eltávolítva - Megjelölés megtekintettként + Megjelölés megnézettként Még nincs letöltési mappa beállítva, válassza ki az alapértelmezett letöltési mappát most Tekerősáv bélyegkép-előnézete Magas minőségű (nagyobb) @@ -676,7 +676,7 @@ 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 + Módosítsa a progresszív tartalmak betöltési intervallumának méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a kezdeti betöltésüket. Az aktuális lejátszás konfigurálása értesítés Értesítések Új élő közvetítések @@ -717,4 +717,48 @@ Feliratkozások importálása vagy exportálása a 3 pontos menüből Ön a Newpipe legfrissebb verzióját futtatja Nyomjon a %s letöltéséhez + Bal gesztus művelete + Jobb gesztus művelete + Fényerő + Hangerő + Egyik sem + A kiszürkített lejátszólisták már tartalmazzák ezt az elemet. + Állandó bélyegkép feloldása + Ismétlődések eltávolítása + Végignézve + Részben megnézve + Kártya + Ez a beállítás csak a(z) %s téma esetén érhető el + Hardveresmédiagomb-események figyelmen kívül hagyása + A következő közvetítések megjelenítése + Az eredeti hangsáv választása, a nyelvtől függetlenül + A látássérülteknek szóló leírást tartalmazó hangsáv választása, ha van ilyen + Válasszon gesztust a lejátszóképernyő bal feléhez + Nem sikerült a vágólapra másolás + Ismételt elem %d alkalommal hozzáadva + Közvetítések be/ki + Egy hangsáv már jelen van ebben a közvetítésben + Hangsáv kiválasztása a külső lejátszók számára + Ismeretlen + Közelgő + ExoPlayer beállítások + Az ExoPlayer néhány beállításának kezelése. A változások életbe lépéséhez újra kell indítani a lejátszót. + Az ExoPlayer dekódoló tartalék funkciójának használata + Engedélyezze ezt a beállítást, ha dekóder előkészítési problémái vannak, ami alacsonyabb prioritású dekóderekre váltást okoz, ha az elsődleges dekóderek előkészítése sikertelen. Ez rosszabb lejátszási teljesítményt eredményezhet, mint az elsődleges dekóderek használata. + Kerülőmegoldás: mindig az ExoPlayer videokimeneti felületének használata + Ez a kerülőmegoldás elengedi és újból előkészíti a videokodekeket, ha felületváltozás történik, ahelyett, hogy közvetlenül a kodeknél állítaná be a felületet. Ez már alapból használatban van egyes, az ezzel a problémával érintett eszközöknél, a beállításnak Android 6 vagy újabb esetén van hatása. +\n +\nA beállítás bekapcsolása megakadályozhatja a lejátszási hibákat, ha átváltja a jelenlegi videolejátszót, vagy teljes képernyőre vált. + %s %s + szinkronizált + leíró + Hasznos, ha olyan fülhallgatót használ, melyen meghibásodtak a fizikai gombok + Eredeti hang előnyben részesítése + Leíró hanganyag előnyben részesítése + Válasszon gesztust a lejátszóképernyő jobb feléhez + Hang: %s + Hangsáv + Eltávolítja az ismétlődéseket\? + Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? + eredeti \ 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 e9bd9d0eb..a505467b9 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -726,4 +726,26 @@ Tindakan gestur kanan Kecerahan Volume + Kelola beberapa pengaturan ExoPlayer. Perubahan ini mengharuskan pemain memulai ulang agar diterapkan + Aktifkan opsi ini jika Anda mengalami masalah inisialisasi dekoder, yang akan kembali ke dekoder dengan prioritas lebih rendah jika inisialisasi dekoder primer gagal. Hal ini dapat mengakibatkan performa pemutaran yang buruk dibandingkan saat menggunakan dekoder primer + Solusi ini melepaskan dan memasang kembali codec video ketika terjadi perubahan permukaan, alih-alih mengatur permukaan ke codec secara langsung. Sudah digunakan oleh ExoPlayer pada beberapa perangkat dengan masalah ini, pengaturan ini hanya berpengaruh pada Android 6 dan yang lebih tinggi +\n +\nMengaktifkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh + Ubah ukuran interval pemuatan pada konten progresif (saat ini %s). Nilai yang lebih rendah dapat mempercepat pemuatan awalnya + Lebih suka audio asli + Pilih trek audio asli apa pun bahasanya + Lebih suka audio deskriptif + Pilih trek audio dengan deskripsi untuk orang tunanetra jika tersedia + Suara: %s + Trek audio + Trek audio harus sudah ada dalam aliran ini + Pilih trek audio untuk pemutar eksternal + Tidak diketahui + Pengaturan ExoPlayer + Gunakan fitur fallback dekoder ExoPlayer + Selalu gunakan solusi pengaturan permukaan keluaran video ExoPlayer + %s %s + asli + disulih suara + deskriptif \ 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 a653c09ae..19898de4b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -752,4 +752,26 @@ Scegli il gesto per la metà sinistra del riproduttore Nessuno Scegli il gesto per la metà destra del riproduttore + Modifica la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video + Preferisci audio originale + Seleziona la traccia audio originale indipendentemente dalla lingua + Preferisci audio descrittivo + Se disponibile, seleziona una traccia audio con descrizioni per ipovedenti + Audio: %s + Traccia audio + Seleziona traccia audio per lettori esterni + Gestisci alcune impostazioni di ExoPlayer. È necessario riavviare il riproduttore per applicarle + Sconosciuta + Impostazioni ExoPlayer + Usa la funzione di fallback del decoder di ExoPlayer + Usa sempre la soluzione alternativa per impostare la superficie di uscita video di ExoPlayer + %s %s + originale + doppiato + descrittivo + Per questo elemento dovrebbe già essere presente una traccia audio + Attivare questa opzione in caso di problemi di inizializzazione del decodificatore. Verranno usati decodificatori di priorità inferiore se l\'inizializzazione di quelli primari fallisce. Le prestazioni di riproduzione potrebbero essere inferiori rispetto all\'uso di quelli primari + Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive +\n +\nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero \ No newline at end of file diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-kn/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index de9731a9a..f54da3990 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,7 +16,7 @@ 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 - 누락된 한국어 앱을 설치하시겠습니까\? + 누락된 Kore 앱을 설치하겠습니까\? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -335,7 +335,7 @@ 팝업 플레이어로 최소화 단계 초기화 - 저장된 탭을 읽을 수 없으므로, 기본 탭을 사용합니다 + 저장된 탭을 불러올 수 없었으므로, 기본 탭을 사용합니다 초기화 초기 설정으로 복원하시겠습니까\? 구독자 수를 가져올 수 없습니다 @@ -662,7 +662,7 @@ 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 스트림 작성자, 스트림 콘텐츠 또는 검색 요청에 대한 추가 정보가 있는 메타 정보 상자를 숨기려면 끄세요 - 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 비디오 로딩 속도가 빨라질 수 있습니다. 변경하려면 플레이어를 다시 시작해야 합니다 + 프로그레시브 콘텐츠의 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 로딩 속도가 빨라질 수 있음 충돌에 대해 논의하는 문제가 이미 존재하는지 확인하세요. 중복 티켓을 생성할 때 실제 버그를 수정하는 데 시간을 할애할 수 있습니다. 오류 알림 생성 구독 선택 @@ -705,7 +705,7 @@ 최신 버전의 NewPipe를 실행 중입니다 %s를 다운로드하려면 탭하세요. 영구 썸네일 설정 해제 - 이 옵션은 테마로 %s을 선택한 경우에만 사용할 수 있습니다 + 이 옵션은 %s가 테마로 선택되었을 경우에만 사용할 수 있습니다 중복 추가 %d 번 회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다. 카드 @@ -720,4 +720,32 @@ 하드웨어 미디어 버튼 이벤트 무시 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 스트림 보이기/숨기기 + 플레이어 화면 왼쪽 절반에 대한 제스처 선택 + 원본 오디오 선호 + 언어에 관계없이 원본 오디오 트랙 선택 + 가능한 경우 시각 장애인을 위한 설명이 포함된 오디오 트랙 선택 + 설명이 포함된 오디오 선호 + 플레이어 화면 오른쪽 절반에 대한 제스처 선택 + 오른쪽 제스처 동작 + 밝기 + 왼쪽 제스처 동작 + 볼륨 + 없음 + 오디오: %s + 오디오 트랙 + 이 스트림에 오디오 트랙이 이미 존재해야 함 + 외부 플레이어용 오디오 트랙 선택 + 알 수 없음 + ExoPlayer 설정 + ExoPlayer 설정을 관리합니다. 이러한 변경 사항을 적용하려면 플레이어를 다시 시작해야 함 + ExoPlayer의 디코더 폴백 기능 사용 + 항상 ExoPlayer의 비디오 출력 표면 설정 해결 방법 사용 + %s %s + 원본 + 더빙됨 + 설명 + 디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음 + 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 +\n +\n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1f4922a08..9a45545a4 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -70,7 +70,7 @@ Negalima sutvarkyti atsisiuntimų meniu Programėlė/ vartotojo sąsaja nulūžo Atsiprašome, taip neturėjo įvykti. - Pranešti apie šią klaidą el. paštu + Pranešti el. paštu Atsiprašome, kažkas ne taip. Ataskaita Informacija: @@ -711,7 +711,7 @@ Pranešimai apie naujas transliacijas prenumeratoms Naujos transliacijos Įkeliama išsami transliacijos informacija… - Pakeiskite pakrovimo intervalo dydį (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį vaizdo įrašo įkėlimą. Dėl pakeitimų reikia iš naujo paleisti grotuvą + Pakeiskite pakrovimo intervalo dydį progresiniam turiniui (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį įkėlimą Procentai Pustonis Atkūrimo pakrovimo intervalo dydis @@ -730,4 +730,48 @@ Greitasis režimas Naudojate naujausią „NewPipe“ versiją Bakstelėkite, kad atsisiųstumėte %s + Ar norite pašalinti visus pasikartojančius srautus iš šio grojaraščio\? + Būsimas + Grojaraščiai jau turintys šį elementą išaktyvuoti. + Kartojasi pridėta %d kartus + Atjungti nuolatinę peržiūrą + Nepaisyti aparatinės įrangos media mygtukų įvykių + Naudinga naudojant ausines su sugedusiais fiziniais mygtukais + Pilnai peržiūrėta + Pageidaujama originalus garso takelis + Pasirinkti originalų audio takelį nepaisant kalbos nustatymo + Pageidaujama pasirinktinis garso takelis + Jei įmanoma, pasirinkti garso takelį su aprašymu žmonėms su klausos negalia + Pasirinkti gęstą kairei grotuvo ekrano pusei + Kairio gesto veiksmas + Pasirinkite gestą dešiniai grotuvo ekrano pusej + Garsas: %s + Audio takelis + Kortelė + Pašalinti besikartojančius + Pašalinti besikartojančius\? + Rodyti šiuos srautus + Iš dalies peržiūrėta + \"ExoPlayer\" nustatymai + Tvarkykite kai kuriuos \"ExoPlayer\" nustatymus. Kad šie pakeitimai įsigaliotų, grotuvą reikia paleisti iš naujo + Naudokite „ExoPlayer“ dekoderio atsarginę funkciją + Visada naudokite \"ExoPlayer\" vaizdo išvesties paviršiaus nustatymų apėjimą + %s %s + Nepavyko nukopijuoti į iškarpinę + originalus + Dešinio gesto veiksmas + Ryškumas + Garsas + Nieko + Rodyti / slėpti srautus + Ši parinktis galima tik tada, kai %s pasirinkta kaip tema + Šiame sraute jau turėtų būti garso takelis + Pasirinkite garso takelį išoriniams grotuvams + Nežinomas + Šis apeinamasis sprendimas atlaisvina ir iš naujo nustato vaizdo kodekus, kai pasikeičia paviršius, užuot tiesiogiai nustatęs paviršių kodekui. Šis nustatymas jau naudojamas \"ExoPlayer\" kai kuriuose įrenginiuose, kuriuose buvo ši problema, šis nustatymas turi poveikį tik \"Android 6\" ir naujesniuose įrenginiuose. +\n +\nĮjungus šią parinktį gali būti išvengta atkūrimo klaidų, kai perjungiamas dabartinis vaizdo grotuvas arba pereinama į visą ekraną + dubliuotas + Įjunkite šią parinktį, jei kyla dekoderio inicializavimo problemų, o nepavykus inicializuoti pagrindinių dekoderių, grįžtama prie žemesnio prioriteto dekoderių. Dėl to atkūrimo našumas gali būti prastesnis nei naudojant pirminius dekoderius + aprašomasis \ No newline at end of file diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index bef5ac478..c8d3221eb 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -68,7 +68,7 @@ Atbalstiet Libre, viegla atskaņošana uz Android. Licences - Par + Par un BUJ Trešo pušu Licences Par NewPipe Lielākā daļa īpašo rakstzīmju @@ -155,8 +155,8 @@ Detaļas: Jūsu komentārs (Angliski): Kas:\\nRequest:\\nContent Valoda:\\nContent Valsts:\\nApp Valoda:\\nService:\\nGMT Laiks:\\nPackage:\\nVersion:\\nOS versija: - Notifikācijas video apstrādes progresam - Video haša notifikācija + Paziņojumi video apstrādes progresam + Video haša paziņojums Atcerēties pēdējo popup izmēru un pozīciju Atcerēties popup īpašības Noklusējuma popup izšķirtspēja @@ -169,7 +169,7 @@ Lūdzu, pārbaudiet, vai neviens cits jau nav iesniedzis jūsu kļūdu. Veidojot dublētas biļetes, jūs aizņemat laiku, ko mēs varētu izmantot, labojot citas kļūmes. Ziņot izmantojot GitHub Kopēt formatētu ziņojumu - Ziņojiet par šo kļūdu pa e-pastu + Ziņojiet pa e-pastu Piedotiet, tam nevajadzēja notikt. Dot atļauju rādīt pāri citām aplikācijām Vai jūs vēlaties atjaunot noklusējumus\? @@ -221,10 +221,10 @@ Pārslēgt uz Popup Pārslēgt uz Fonu [Nezināms] - Notifikācijas NewPipe versijām - Aplikācijas atjauninājuma notifikācija - Notifikācijas priekš NewPipe atskaņotāja - NewPipe Notifikācija + Paziņojumi par jaunām NewPipe versijām + Aplikācijas atjauninājuma paziņojums + Paziņojumi priekš NewPipe atskaņotāja + NewPipe paziņojums Fails Tikai Vienreiz Vienmēr @@ -243,7 +243,7 @@ Videoklipi Atskaņošanas saraksts Kanāli - Viss + Visi Kļūdas ziņojums Lejupielādes Lejupielādes @@ -306,7 +306,7 @@ Plūsmas atjaunināšanas biežuma slieksnis Straume Rādīt tikai nesagrupētus abonementus - Jauns + Jauna Vai vēlaties izdzēst šo grupu\? Tukšs grupas nosaukums @@ -441,7 +441,7 @@ Tendences © %1$s no %2$s zem %3$s Lejupielāde neizdevās - Rinda + Pievienot rindai Pausēts Gaida Pabeigts @@ -532,7 +532,7 @@ Noklusējuma video formāts Noklusējuma audio formāts Audio - Ļaujiet Android pielāgot notifikācijas krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) + Ļaujiet Android pielāgot paziņojuma krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) Kopīgot Atvērt ar Atvērt pārlūkprogrammā @@ -542,20 +542,20 @@ Netika atrasts video atskaņotājs. Instalēt VLC\? Publicēts %1$s Nospiediet uz meklēšanas ikonas, lai sāktu. - Iekrāsot notifikāciju + Iekrāsot paziņojumu Nekas Ielādējas Sajaukt Atkārtot - Jūs varat izvēlēties tikai 3 darbības, kuras rādīs kompaktajā notifikācijā! - Rediģējiet katru notifikācijas darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā notifikācijā, izmantojot rūtiņas labajā pusē + Jūs varat izvēlēties tikai 3 darbības, kuras rādīs kompaktajā paziņojumā! + Rediģējiet katru paziņojuma darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā paziņojumā, izmantojot rūtiņas labajā pusē Piektā darbības poga Ceturtā darbības poga Trešā darbības poga Otrā darbības poga Pirmā darbības poga - Piemērot video attēlu, kuru rāda notifikācijā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) - Piemērot video attēlu 1:1 proporcijai + Apgriezt video attēlu, kuru rāda paziņojumā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) + Apgriezt video attēlu uz 1:1 proporciju Rādīt opciju atskaņot video ar Kodi mediju centru Rādīt \"Atskaņot ar Kodi\" opciju Instalēt trūkstošo Kode aplikāciju\? @@ -572,7 +572,7 @@ Pievienot Fons Izvēlieties Cilni - Saglabātie atskaņošanas saraksti + Saglabātie saraksti Abonementi Rādīt informāciju Nevarēja atjaunināt abonementu @@ -671,10 +671,10 @@ Lejupielādes pabeigtas Tagad varat atlasīt tekstu video aprakstā. - Notifikācijas + Paziņojumi Avarēt atskaņotāju - Pielāgojiet pašlaik atskaņotās plūsmas notifikāciju - Atskaņotāja notifikācija + Pielāgojiet pašlaik atskaņotās plūsmas paziņojumu + Atskaņotāja paziņojums Jaunās tiešraides Radās kļūda, detalizētāku informāciju skatiet paziņojumā @@ -688,4 +688,49 @@ Kļūdas ziņojuma paziņojums Atskaņošanas ielādēšanas intervāla lielums NewPipe radās kļūdu, pieskarieties, lai ziņotu + Kreisā žesta darbība + Neizdevās kopēt starpliktuvē + Noņemt pastāvīgo sīktēlu + Pārbaudīt, vai nav jaunas tiešraides + Rāda avarēšanas iespēju, kad lietojat atskaņotāju + Dzēst dublikātus + Rādīt sekojošās tiešraides + Saraksti, kas atzīmēti pelēkā, jau satur šo objektu. + LeakCanary nav pieejams + Izveidot kļūdas paziņojumu + Jebkurš tīkls + Jums ir jaunākā NewPipe versija + Noderīgi, piemēram, lietojot austiņas ar bojātām pogām + Izvēlēties skaņu celiņu ar audio aprakstu cilvēkiem ar redzes traucējumiem, ja tāds ir pieejams + Ignorēt ierīces multimēdiju pogas + Izdzēst visus lejupielādētos failus\? + Jaunumi kanālā + Dot priekšroku oriģinālajai skaņai + Izvēlēties oriģinālo skaņu celiņu, neatkarīgi no valodas + Dot priekšroku skaņu celiņam ar audio aprakstu + Izvēlēties žestu kreisajai atskaņotāja ekrāna pusei + Izvēlēties žestu labajai atskaņotāja ekrāna pusei + Labējā žesta darbība + Spilgtums + Skaļums + Nekā + Importējiet vai eksportējiet abonementus 3-punktu izvēlnē + Ja Jums rodas problēmas ar lietotni, noteikti apskatiet šīs atbildes bieži uzdotiem jautājumiem! + Skatīt tīkla vietnē + Skaņa: %s + Skaņu celiņš + Ielādē straumes informāciju… + Dublikāts pievienots %d reizi(-es) + Rādīt \"avarēt atskaņotāju\" + Karte + Spiediet, lai lejupielādētu %s + Dzēst dublikātus\? + Vai vēlaties dzēst visus tiešraižu dublikātus šajā sarakstā\? + Rādīt/slēpt tiešraides + Ātrais režīms + Paziņot par jaunām tiešraidēm no abonementiem + Procenti + Pustonis + Paziņojumi par jaunām tiešraidēm + Pārbaužu biežums \ 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 d75570d45..29769acae 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -649,4 +649,6 @@ പ്ലേയർ അറിയിപ്പ് പുതിയ സ്ട്രീമുകൾ പ്ലേയർ തകർക്കുക + യഥാർത്ഥ ശബ്ദത്തിന് പരിഗണന കൊടുക്കുക + ഭാഷ ഏതായാലും യഥാർത്ഥ ശബ്ദം തിരഞ്ഞെടുക്കുക \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 254a90c41..bf43f47da 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kore-app niet gevonden. Deze installeren\? + Ontbrekende Kore-app installeren\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio @@ -725,18 +725,40 @@ Linker gebaaractie Rechter gebaaractie Geen - Verwijder duplicaten - Verwijder duplicaten\? + Verwijder dubbelen + Verwijder dubbelen\? Wil je alle dubbele streams in deze afspeellijst verwijderen\? Streams weergeven/verbergen Volledig bekeken Gedeeltelijk bekeken Aanstaande Kies een gebaar voor de rechterhelft van het spelersscherm - Negeer hardware-mediaknopgebeurtenissen + Fysieke knoppen voor mediabediening negeren Helderheid Volume - Handig als je bijvoorbeeld een headset gebruikt met kapotte fysieke knoppen + Handig, als je bijvoorbeeld een headset gebruikt met fysieke knoppen die stuk zijn Kies een gebaar voor de linkerhelft van het spelersscherm Laat de volgende streams zien + Selecteer een audiotrack met beschrijvingen voor slechtzienden, indien beschikbaar + Deze tijdelijke oplossing geeft videocodecs vrij en activeert ze opnieuw wanneer er een oppervlakteverandering optreedt, in plaats van de oppervlakte rechtstreeks op de codec in te stellen. Dit wordt al gebruikt door ExoPlayer op sommige apparaten met dit probleem; deze instelling heeft alleen effect op Android 6 en hoger +\n +\nAls je deze optie inschakelt, voorkom je mogelijk afspeelfouten bij het wisselen van de huidige videospeler of het overschakelen naar volledig scherm + Wijzig de grootte van het laadinterval voor progressieve inhoud (momenteel %s). Een lagere waarde kan het initiële laden versnellen + Geef de voorkeur aan originele audio + Selecteer de originele audiotrack, ongeacht de taal + Geef de voorkeur aan beschrijvende audio + Audio: %s + Audiotrack + Er zou al een audiotrack in deze stream aanwezig moeten zijn + Selecteer audiotrack voor externe spelers + Onbekend + ExoPlayer-instellingen + Beheer enkele ExoPlayer-instellingen. Deze wijzigingen vereisen een herstart van de speler om van kracht te worden + Gebruik de terugvalfunctie van de ExoPlayer-decoder + Schakel deze optie in als je problemen hebt met de initialisatie van de decoder, die terugvalt op decoders met een lagere prioriteit als de initialisatie van de primaire decoder mislukt. Dit kan leiden tot slechtere afspeelprestaties dan bij gebruik van primaire decoders + Gebruik altijd de tijdelijke oplossing voor het instellen van het video-uitvoeroppervlak van ExoPlayer + %s %s + origineel + nagesynchroniseerd + beschrijvend \ No newline at end of file diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 5f34c0ccf..55c3cdc62 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -2,29 +2,29 @@ Trykk på aukeglaset for å byrja. Gjeve ut den %1$s - Fann ingen straumspelar. Legg inn VLC\? - Ingen straumavspelar funne (du kan leggja inn VLC for å spela av straumen). + Fann ingen straumavspelarar. Legg inn VLC\? + Fann ingen straumavspelarar (du kan leggja inn VLC for å spela av straumen). Legg inn Avbryt Greitt - Opna i ein nettlesar + Opn i ein nettlesar Merk som sett Sprett opp i eit vindauga - Opna med + Opn med Del Søk Innstillingar Meinte du «%1$s»\? Del med - Nytta ytre videospelar + Nytt ytre videospelar Tek bort ljod ved somme oppløysingar - Nytta ein ytre ljodavspelar + Nytt ein ytre ljodavspelar Fylg Fylgjer Stogg å fylgja - Gjeve opp å fylgja kanalen + Stogga å fylgja kanalen Vis opplysingar - Fylgingar + Fylgde Gøymde spelelister Vel fane Sprett opp @@ -34,30 +34,30 @@ Vis høgare oppløysingar Berre somme einingar kan spela av 2K-/4K-videoar Spel av med Kodi - Syna \"Spela av med Kodi\"-val + Vis \"Spela av med Kodi\"-val Hent Hent straumfil Gøymer henta videofiler her Bakgrunn Videohentingsmappe - Henta ljodfiler vert gøymt her + Henta ljodfiler vert gøymde her Vel hentemappe for ljodfiler Legg inn saknande Kore-app\? Viser svar for: %s - Kunne ikkje brigde fylging - Nettbrettmodus + Greidde ikkje å brigde fylginga + Nettbrettvising Av Merknader er slått av , Slå av/på alle - Ingen ljodstraumar er tilgjengelege for ytre spelarar - Ingen videostraumar er tilgjengelege for ytre spelarar - Vel kvalitet for ytre spelarar + Ingen ljodstraumar er tilgjengelege for ytre avspelarar + Ingen videostraumar er tilgjengelege for ytre avspelarar + Vel kvalitet for ytre avspelarar Skil ut - Opna nettstaden + Opn nettstaden Du fylgjer no denne kanalen - Vald straum er ikkje stødd av ytre spelarar + Vald straum er ikkje stødd av ytre avspelarar Straumar som ikkje enno er stødde av hentaren, er ikkje synlege Ukjend kvalitet Ukjend format @@ -68,4 +68,89 @@ Skjer videosmåbiletet som vert vist i varselet, ifrå storleikshøvet 16:9 til 1:1 Fyrste gjerdknapp Andre gjerdknapp + Ingenting + Ljod + Tredje gjerdknapp + Fjerde gjerdknapp + Femte gjerdknapp + Du kan berre velja opp til tre gjerder til å verta viste i det tette varselet. + Gjenta + Bland + Lét varsla + La Android velja léten til varsla ut ifrå hovudléten i småbiletet (merk at dette ikkje er tilgjengeleg på alle einingar) + Forvalt ljodformat + Forvalt videoformat + Ham + Nattham + Ljos + Mørk + Svart + Hugs oppsprettseigenskapar + Hugs den siste storleiken og staden til oppsprettsvindauga + Stadfest radtømming + Byte ifrå ein avspelar til ein annan kan skifta ut rada di + Den noverande avspelingsrada vil verta skift ut + Hent fram småbilete + Sjå bort ifrå mediaknappetrykk + Nyttig om du til dømes nyttar høyretelefonar med skadde knappar + Ingen + Søkjeframlegg + Søkjeframlegg på eininga + Søkjeframlegg på nettet + Vis søkjeframlegg ved søk + Visingshistorikk + Spel av der du slapp + Kjente ikkje att nettadressa. Opn med ein annan app\? + Forvalt innhaldsland + Avspelar + Krasj avspelaren + Trykk på ei varselgjerd under for å byta ho ut. Vel opptil tre av dei til å verta viste i det samantrengde varselet ved å merkja dei av på høgre side + Nytt kvikk slurvne spoling + Hopplengd (framover/bakover) + Slurvne spoling lar avspelaren spole kvikkare, men slurvnare. 5, 15 og 25-sekundshopping verkar ikkje med dette + Tøm data + Ustødd nettadresse + Vis «Hald for å rade»-råd + Vis «Neste» og «Liknande» videoar + Vis utsegner + Slå av for å skjula utsegner + Vis utgreiingar + Slå av for å skjula videoutgreiingar og ytterlegare opplysingar + Vis metadata + Slå av for å skjula medadataområde med tilleggsopplysingar om straumskaparen, strauminnhaldet eller eit søk + Vel det opphavlege ljodsporet utan omsyn til tungemålet + Helst utgreiande ljod + Sjølvverkande rad neste straum + Hald fram ei ugjentakande avspelingsrad ved å leggja til ein liknande straum + Rad sjølvverkande + Venstre handvendingsgjerd + Vel ei handvending for den høgre sida av avspelingsskjermen + Søkjehistorikk + Spar søk på eininga + Hald fram straumar der du sist slapp + Vis listeframgang + Vis avspelingsstadteikn i lister + Lag ei liste over avspelte straumar + Hald fram avspeling + Hald fram med å spela av etter avbrot (t.d. telefonsamtaler) + Hent + Byrj hovudavspelaren i fullskjerm + Om sjølvverkande snuing er slegen av, byrj videoar i fullskjerm i staden for i småavspelaren. Du kan framleis nytte småavspelaren ved å gå ut av fullskjermsvisinga + Spel av sjølvverkande + Vis eit råd ved trykk på «Bakgrunn» eller «Sprett opp»-knappane i videodetaljane + Forvalt tungemål for innhald + Stør berre HTTPS-nettadresser + Åtferd + Video og ljod + Utsjånaden + Avspelingsvarsel + Spelar av i bakgrunnen + Hopp over togner + Helst opphavleg ljod + Om tilgjengeleg, vel eit ljodspor med utgreiingar for blinde + Vel ei handvending for den venstre sida av avspelingsskjermen + Høgre handvendingsgjerd + Ljosstyrke + Ljodstyrke + Oppdateringar \ No newline at end of file diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index 5cceb93a4..e177035b2 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -62,7 +62,7 @@ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߟߐ߬ߡߊ ߞߊ߬ ߊ߲ߘߙߏߌߘ ߟߐ߬ ߛߐ߬ߓߌ߲߬ߘߐ߬ߓߏ߲ ߞ߬ߟߐ ߟߊߖߘߍ߬ߕߦߊ߬ ߟߊ߫ ߞߵߊ߬ ߓߍ߲߬ ߞߏ߬ߋߞߏ߬ߋ߫ ߞߐ߬ߟߐ ߓߊߖߎ ߡߊ߬ (ߦߴߊ߬ ߟߐ߲߫ ߞߴߏ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߙߏߞߏ ߓߍ߯ ߟߊ߫) ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߠߵߊ߬ ߞߍ߫ ߟߊ߫ ߕߏߟߏ߲ߟߊ߲ ߘߌ߫ ߘߌ߲߬ߞߌߙߊ ߟߎ߬ ߢߌߣߌ߲߫ ߞߊߟߌߦߊߓߟߏ ߡߊ߬ ߞߏ߬ߣߵߊ߬ ߕߋߟߋ߲ߣߍ߲߫ ߕߍ߫ ߖߋߞߎ߫. ߞߊ߬ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߝߌ߬ߟߊ߲߬ ߅، ߁߅، ߥߟߊ߫ ߂߅ ߞߘߐ߫߸ ߊ߬ ߣߴߏ߬ ߕߍ߫ ߛߋ߫ ߓߍ߲߬ ߠߊ߫ - ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߘߊߦߟߍ ߟߞߊߟߌߦߊ߫ ߟߊ߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߡߊ߬ߞߏ߫ ߦߋ߫ ߡߍߣߍ߲ߡߊߛߊߦߌ ߟߊ߫ + ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߣߐߘߐ߫ ߢߍߕߊ߯ߡߊ ߞߊ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߊ߬ ߖߛߐߟߌ߫ ߝߟߐ ߟߞߊߟߌߦߊ߫ ߟߊ߫ ߞߊ߬ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߡߊ߬ߣߌ߲߬ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߏ߫ ߝߌߘߊ߲߫ ߕߐ߫ ߞߊ߬ ߓߐ߫ ߕߏߟߏ߲ߟߊ߲ ߘߏ߫ ߟߊ ߞߊ߬ ߥߊ߫ ߘߏ߫ ߜߘߍ߫ ߟߊ߫߸ ߏ߬ ߘߌ߫ ߛߋߴߌ ߟߊ߫ ߕߎ߲߰ߠߌ߲ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߟߊ߫ ߡߊ߬ߛߊߦߌ @@ -727,4 +727,13 @@ ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. + ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߢߟߊߝߌ߲ߓߊ߯ߕߐ ߟߎ߬ ߢߌ߫߸ ߣߴߏ߬ ߘߐ߫ ߞߍ߫ ߘߊ߫ ߦߋ߲߬ + ߡߍ߲ߘߊ: %s + ߡߍ߲ߕߊ߫ ߜߙߋ + ߡߍ߲ߕߊ߫ ߜߙߋ ߘߏ߫ ߞߊߞߊ߲߫ ߞߊ߬ ߞߍ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫ + ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + Exoplayer ߢߊߓߐߟߌ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎ߲ߞߎ߲ߡߊ ߛߎ߲ߥߊ߲ߘߌ߫߸ ߊ߬ ߞߍߘߊ߫ ߞߊ߲ ߛߎ߯-ߛߎ߯ ߘߌ߫ + ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߟߊߝߌ߬ߛߊ߬ߦߊ߫ + ߡߊߟߐ߲ߓߊߟߌ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 82082f875..69dad642b 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -639,7 +639,7 @@ ਸੀਕਬਾਰ ਥੰਮਨੇਲ ਦੀ ਝਲਕ ਸਮਾਂ-ਅਵਧੀ ਜਦ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਦੁਬਾਰਾ ਅੱਪਡੇਟ ਕੀਤੀ ਜਾ ਸਕੇ — %s ਰਚਨਾਕਾਰ ਨੇ ਦਿਲੋਂ ਪਸੰਦ ਕੀਤਾ - ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਵੀਡੀਓ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ। ਬਦਲਾਅ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਤੇ ਹੀ ਹੋਣਗੇ + ਪ੍ਰਗਤੀਸ਼ੀਲ ਸਮੱਗਰੀ ਉੱਤੇ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਉਸਨੂੰ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ ਮੁੱਖ ਪਲੇਅਰ ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ @@ -740,4 +740,25 @@ ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ ਆਵਾਜ਼ + ਇਹ ਚੋਣ ਯੋਗ ਕਰੋ, ਜੇ ਤੁਹਾਨੂੰ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਸਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਜੋ ਕਿ ਘੱਟ-ਤਰਜੀਹ ਵਾਲੇ ਡੀਕੋਡਰਾਂ \'ਤੇ ਵਾਪਸ ਆ ਜਾਂਦੀਆਂ ਹਨ, ਜੇਕਰ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੋ ਜਾਂਦੇ ਹਨ। ਇਸ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲੋਂ ਮਾੜੀ ਪਲੇਬੈਕ ਕਾਰਗੁਜ਼ਾਰੀ ਹੋ ਸਕਦੀ ਹੈ + ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਜਦੋਂ ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੁੰਦੀ ਹੈ ਤਾਂ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਰਿਲੀਜ਼ ਕਰਦਾ ਹੈ ਅਤੇ ਮੁੜ-ਇੰਸਟੈਂਟ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \'ਤੇ ਐਕਸੋਪਲੇਅਰ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਚੁੱਕਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \'ਤੇ ਪ੍ਰਭਾਵ ਹੈ +\n +\nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਵਰਤਮਾਨ ਵੀਡੀਓ ਪਲੇਅਰ ਦੀ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਵੇਲੇ ਪਲੇਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰੋਕਿਆ ਜਾ ਸਕਦਾ ਹੈ + ਅਸਲੀ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਭਾਸ਼ਾ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਅਸਲੀ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਵਰਣਨਾਤਮਕ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਜੇ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਦ੍ਰਿਸ਼ਟੀ ਤੋਂ ਅਪੰਗ ਲੋਕਾਂ ਵਾਸਤੇ ਵਰਣਨਾਂ ਵਾਲਾ ਕੋਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਆਡੀਓ: %s + ਆਡੀਓ ਟਰੈਕ + ਇੱਕ ਆਡੀਓ ਟਰੈਕ ਇਸ ਸਟਰੀਮ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ + ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਅਗਿਆਤ + ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗ + ਕੁਝ ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। ਇਹਨਾਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ + ਐਕਸੋਪਲੇਅਰ ਦੀ ਡੀਕੋਡਰ ਫਾਲਬੈਕ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਹਮੇਸ਼ਾ ਐਕਸੋਪਲੇਅਰ ਦੀ ਵਿਡੀਓ ਆਉਟਪੁੱਟ ਸਤਹ ਸੈਟਿੰਗ ਵਰਕਰਾਊਂਡ ਦੀ ਵਰਤੋਂ ਕਰੋ + %s %s + ਅਸਲੀ + ਡੱਬ ਕੀਤਾ + ਵਰਣਨਾਤਮਕ \ 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 ecb3322f7..7cb787bcc 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -760,4 +760,26 @@ Głośność Brak Akcja gestu z prawej + Zmień rozmiar interwału ładowania zawartości progresywnych (aktualnie %s). Niższa wartość może przyspieszyć ich początkowe ładowanie + Preferuj oryginalny dźwięk + Wybieraj oryginalną ścieżkę dźwiękową niezależnie od języka + Preferuj audiodeskrypcję + Dźwięk: %s + Ścieżka dźwiękowa + Ścieżka dźwiękowa powinna już się znajdować w tym strumieniu + Wybierz ścieżkę dźwiękową dla zewnętrznych odtwarzaczy + Nieznana + Ustawienia ExoPlayera + Zarządzaj niektórymi ustawieniami ExoPlayera. Zmiany te wymagają ponownego uruchomienia odtwarzacza, aby zostały uwzględnione + Używaj funkcji zapasowego dekodera ExoPlayera + Włącz tę opcję, jeśli masz problemy z inicjalizacją dekodera. Przywraca dekodery o niższym priorytecie, jeśli inicjalizacja podstawowych dekoderów się nie powiedzie. Może to spowodować słabszą wydajność odtwarzania niż podczas korzystania z podstawowych dekoderów + Zawsze używaj obejścia ustawienia powierzchni wyjścia wideo ExoPlayera + %s %s + oryginalna + dubbing + audiodeskrypcja + Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna + To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. +\n +\nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran \ 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 558fe1b3e..048485d96 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -79,8 +79,8 @@ Reproduzir com Kodi Pesquisar Mostra uma opção para ver vídeo pelo media center do Kodi - Usar player de áudio externo - Usar player de vídeo externo + Usar reprodutor de áudio externo + Usar reprodutor de vídeo externo Mostrar opção \"Reproduzir com Kodi\" O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do app:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do Sistema Operacional: Abrir no modo popup @@ -247,7 +247,7 @@ Reportar erros de out-of-lifecycle Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte Usar busca de posição rápida (inexata) - A busca inexata permite que o player ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos + A busca inexata permite que o reprodutor de vídeo ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos Pôr próximo vídeo na fila automaticamente Continua a reprodução da fila (sem repetição) adicionando mais vídeos similares Arquivo @@ -550,7 +550,7 @@ Não foi possível reconhecer a URL. Abrir com outro aplicativo\? Pôr na fila automaticamente A fila do player ativo será substituída - Mudar de um player para outro pode substituir sua fila + Mudar de um reprodutor de vídeo para outro pode substituir sua fila Pedir confirmação antes de limpar uma fila Aleatório Carregando @@ -671,7 +671,7 @@ Procurar por atualizações Procurar manualmente por novas versões Procurando por atualizações… - Travar o player + Travar o reprodutor de vídeo Mostrar \"Travar o player\" Mostra uma opção de travamento ao usar o player Novos itens do feed @@ -714,7 +714,7 @@ Por cento Semitom A transmissão selecionada não é compatível com players externos - Nenhum áudio de transmissão está disponível para players externos + Nenhum transmissão de áudio está disponível para players externos Transmissões que ainda não são suportadas pelo downloader não são exibidos Nenhum vídeo de transmissão está disponível para players externos Selecione a qualidade para players externos @@ -752,4 +752,26 @@ Volume Nenhum Ação do gesto direito + Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original e independentemente do idioma + Dar preferência ao áudio descritivo + Selecionar um áudio com descrição para pessoas com dificuldades de visão, se disponível + Áudio: %s + Faixa de áudio + Seleciona faixa de áudio para players externo + Desconhecido + Configurações de ExoPlayer + Gerenciar algumas configurações de ExoPlayer. É necessário reiniciar o player para aplicar as mudanças + %s %s + original + dublado + descritivo + Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície para o codec diretamente. Já usado pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior +\n +\nAtivar esta opção pode evitar erros de reprodução ao alternar o reprodutor de vídeo atual ou alternar para tela cheia + Uma faixa de áudio já deve estar presente neste stream + Utilizar a função de fallback do decodificador do ExoPlayer + Sempre utilizar o configuração de saída de vídeo alternativa do ExoPlayer + Habilite essa opção se você tiver problemas de inicialização do decodificador, que retorna codificadores de baixa prioridade se o decodificador primário falhar. Isso pode resultar em pior desempenho de reprodução \ 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 de0bed0a4..f05ce58a9 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -44,8 +44,8 @@ Histórico de visualizações %s visualização - %s visualizações - %s visualizações + %s subscritores + %s subscritores Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? Histórico e cache @@ -115,9 +115,9 @@ %d segundos - %d selecionada - %d selecionadas - %d selecionadas + %d selecionado + %d selecionados + %d selecionados Partilhar Ver política de privacidade @@ -156,10 +156,10 @@ Limpar Cancelar subscrição Conteúdo - Os textos originais dos serviços serão visíveis nos itens de fluxo + Os textos originais dos serviços serão visíveis nos itens do vídeo Publicado em %1$s Avanço rápido durante silêncio - Não foram encontradas emissões de áudio + Não foram encontrados áudios NewPipe foi fechado enquanto trabalhava no ficheiro Nova lista de reprodução © %1$s de %2$s nos termos da %3$s @@ -168,7 +168,7 @@ Miniatura da lista de reprodução alterada. Não foi possível carregar os comentários País padrão para conteúdo - Aplicação livre de reprodução de emissões para Android. + Aplicação livre de reprodução de transmissões para Android. Idioma padrão para conteúdo Importar subscrições do YouTube do Google Takeout: \n @@ -204,7 +204,7 @@ Gerar nome único Ação a executar ao trocar para outra aplicação a partir do menu principal - %s Utilizar reprodutor de vídeo externo - O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da app\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: + O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da aplicação\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nSO Versão: Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! Limpar dados Apenas uma vez @@ -292,7 +292,7 @@ Terminada Histórico de vídeos apagado - Não tem um reprodutor de vídeo. Instalar VLC\? + Não tem um reprodutor de vídeo. Instalar o VLC\? Desative para ocultar comentários Limitar resolução se em dados móveis Separadores mostrados na página principal @@ -348,14 +348,14 @@ Desafio reCAPTCHA Importar de 1 item eliminado. - Não foram encontradas emissões de vídeo + Não foram encontrados vídeos Página \'kiosk\' %d hora %d horas %d horas - Enfileirar o próximo stream automaticamente + Adicionar o próximo vídeo à fila automaticamente Defina as suas instâncias favoritas PeerTube Exportar histórico, subscrições, listas de reprodução e definições Melhor resolução @@ -380,7 +380,7 @@ Detalhes Erro de rede Histórico de pesquisa - Alternar serviço, agora selecionado: + Alternar serviço atualmente selecionado: Remover Comentários (em inglês): Reprodutor de vídeo @@ -463,7 +463,7 @@ Mostrar informação Limpar histórico de visualizações Não é possível guardar no cartão SD. Repor pasta de descargas\? - Checksum + Soma de controlo Restaurar última posição de reprodução Ativar reprodutor \'popup\' Se possível, obter de uma fonte dedicada @@ -482,7 +482,7 @@ Vídeos Meta-dados em cache limpos Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup - Não foi encontrado um reprodutor (pode instalar VLC para reproduzir). + Não foi encontrado um reprodutor (pode instalar o VLC para reproduzir). Ser-lhe-á perguntado onde guardar cada transferência. \nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo Mostrar opção \"Reproduzir no Kodi\" @@ -563,7 +563,7 @@ Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Cortar a miniatura de vídeo mostrada na notificação de 16:9 a 1:1 + Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções) Cortar miniatura na proporção 1:1 Mostrar \'leaks\' de memória Colocado na fila @@ -598,7 +598,7 @@ Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe. Este conteúdo não está disponível no seu país. Este vídeo tem uma restrição de idade. -\nDevido às novas políticas do YouTube com vídeos com restrição de idade, o NewPipe não pode acessar nenhum dos seus fluxos de vídeo, portanto, é incapaz de reproduzi-lo. +\nDevido às novas políticas do YouTube quanto a vídeos com restrição de idade, o NewPipe não pode aceder as estes vídeos, por isso não consegue reproduzi-lo. Rádio Destaques Resolver @@ -653,27 +653,27 @@ Sugestões de pesquisa remotas Sugestões de pesquisa locais - %1$s descarga apagada - %1$s descargas apagadas - %1$s descargas apagadas + Transferência %1$s eliminada + Transferências %1$s eliminadas + Transferências %1$s eliminadas - Descarga concluída - %s descargas concluídas - %s descargas concluídas + Download concluído + %s Transferências concluídas + %s Transferências concluídas Deslizar itens para removê-los Não iniciar vídeos no reprodutor mini, mas ir diretamente ao ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo Iniciar reprodutor principal em ecrã completo Enfileirado o próximo - Enfileirar o próximo + Pôr na fila o próximo A processar… Pode demorar um momento Procurar atualizações Verificar manualmente se existe uma nova versão A procurar atualizações… Novos itens Travar o reprodutor - Mostrar \"travar o reprodutor\" + Mostrar \"Travar o reprodutor\" Mostra uma opção de travamento ao usar o reprodutor Notificação de relatório de erros Notificações para reportar erros @@ -689,28 +689,28 @@ LeakCanary não está disponível Predefinido do ExoPlayer Notificações - A carregar detalhes do fluxo… - Verificar se há novos fluxos - Notificações sobre novos fluxos + A carregar detalhes do vídeo… + Verificar se há novos vídeos + Notificações sobre novos vídeos Frequência da verificação Apagar todos os ficheiros descarregados do disco\? Notificações são desativadas - %s fluxo novo - %s fluxos novos - %s fluxos novos + %s vídeo novo + %s vídeos novos + %s vídeos novos - Notificar sobre novos fluxos de assinaturas + Notificar sobre novos vídeos nas assinaturas Conexão de rede necessária Qualquer rede Alternar tudo - Notificações sobre novos fluxos para assinaturas + Notificações sobre novos vídeos para assinaturas Notificação do reprodutor - Configurar a notificação da reprodução do fluxo atual + Configurar a notificação da reprodução do vídeo atual Seja notificado Agora assinou este canal , - Novos fluxos + Novos vídeos Por cento Semitom Não estão disponíveis transmissões de vídeo a reprodutores externos @@ -722,34 +722,56 @@ Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução Perguntas frequentes - Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! - Ver no sítio web + Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! + Ver no site Modo rápido Importar ou exportar subscrições do menu de 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s Ordenação - Esta opção só está disponível se %s for selecionado como tema + Esta opção só está disponível se estiver selecionado %s para o tema Desativar miniatura permanente Não foi possível copiar para a área de transferência Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) Ignorar eventos com botões físicos - Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos + Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados Remover duplicados - Mostrar os seguintes fluxos - Mostrar/ocultar fluxos + Mostrar os seguintes vídeos + Mostrar/ocultar vídeos Completamente visto Parcialmente visto Proximamente Remover duplicados\? - Quer remover todos os fluxos duplicados nesta lista de reprodução\? - Ação de gesto de esquerda - Ação do gesto correto - Luminosidade + Quer remover todos os vídeos duplicados nesta lista de reprodução\? + Ação do gesto para a esquerda + Ação do gesto para a direita + Brilho Volume Nenhum - Escolher gesto para metade esquerda do ecrã do reprodutor - Escolher gesto para metade direita do ecrã do reprodutor + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Áudio: %s + Faixa de áudio + Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução + Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior +\n +\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + original + dobrado + descritivo + Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original independentemente do idioma + Dar preferência ao áudio descritivo + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Já deve existir uma faixa de áudio nesta transmissão + Selecionar faixa de áudio para reprodutores externos + Desconhecida + Configurações ExoPlayer + Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações + Utilizar a função de fallback do descodificador do ExoPlayer + %s %s \ 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 1fb73e4d6..ab8ab5703 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -745,11 +745,33 @@ Completamente visto Mostrar os seguintes vídeos Parcialmente visto - Ação de gesto de esquerda - Ação do gesto correto - Luminosidade + Ação do gesto para a esquerda + Ação do gesto para a direita + Brilho Volume Nenhum - Escolher gesto para metade esquerda do ecrã do reprodutor - Escolher gesto para metade direita do ecrã do reprodutor + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior +\n +\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original independentemente do idioma + Dar preferência ao áudio descritivo + Áudio: %s + Faixa de áudio + Já deve existir uma faixa de áudio nesta transmissão + Selecionar faixa de áudio para reprodutores externos + Desconhecida + Configurações ExoPlayer + Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações + Utilizar a função de fallback do descodificador do ExoPlayer + Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução + Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + %s %s + original + dobrado + descritivo \ 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 6028b1ada..7c6463d74 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -756,4 +756,26 @@ Яркость Громкость Ничего - + Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера + Отдать предпочтение описательному звуку + Аудио: %s + Звуковая дорожка + Неизвестная + Настройки ExoPlayer + Управление некоторыми настройками ExoPlayer. Эти изменения требуют перезапуска плеера, чтобы они вступили в силу + Использовать резервную функцию декодера ExoPlayer + Всегда использовать обходной путь настройки поверхности видеовыхода ExoPlayer + %s %s + оригинальный + дублированный + описательный + Отдать предпочтение оригинальному звуку + Выбирать исходную звуковую дорожку независимо от языка + Выбирать звуковую дорожку с описаниями для слабовидящих, если они доступны + Звуковая дорожка уже должна присутствовать в этом потоке + Выберите звуковую дорожку для внешних проигрывателей + Включите этот параметр, если у вас есть проблемы с инициализацией декодера, который возвращается к декодерам с более низким приоритетом в случае сбоя инициализации основных декодеров. Это может привести к ухудшению качества воспроизведения по сравнению с использованием первичных декодеров + Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше +\n +\nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим + \ 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 2119ddc21..4d7e99fb6 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -739,4 +739,26 @@ Issèbera unu gestu pro sa metade de destra de s\'ischermu de su riproduidore Luminosidade Perunu + Modìfica sa mannària de s\'intervallu de càrriga de cuntenutos consecutivos (como %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu initziale issoro + Preferi s\'àudio originale + Preferi un\'àudio descritivu + Seletziona una rasta àudio cun descritziones pro persones cun problemas de vista, si bi nd\'at a disponimentu + Àudio: %s + Rasta àudio + Disconnotu + Manìgia unas cantas impostatziones de ExoPlayer. Custas modìficas tenent bisòngiu de torrare a allùghere su riproduidore pro chi tèngiant efetu + Imprea sa funtzionalidade de riserva de su decodificadore de ExoPlayer + %s %s + originale + dopiadu + descritivu + Imprea semper sa solutzione alternativa de s\'impostatzione de superfìtzie de s\'essida vìdeu de ExoPlayer + Custa solutzione alternativa lìberat e torrat a istantziare sos codificadores de vìdeu cando acontesset unu càmbiu de superfìtzie, in càmbiu de impostare sa superfìtzie e su codificadore in manera direta. Giai impreada dae ExoPlayer in unos cantos dispositivos cun custu problema, custa impostatziones tenet un\'efetu petzi in Android 6 e versiones prus noas. +\n +\nS\'abilitatzione de custa optzione diat pòdere prevènnere faddinas de riprodutzione cando si càmbiat su riproduidore vìdeu atuale o si colat a s\'ischermu intreu + Seletziona una rasta àudio pro riproduidores esternos + Seletziona sa rasta sonora originale in manera indipendente dae sa limba + Una rasta àudio diat dèpere èssere giai presente in custu flussu + Impostatziones pro ExoPlayer + Abìlita custa optzione si tenes problemas de initzializatzione de su decodificadore, chi colat a decodificadores a prioridade prus bassa si s\'initzializatzione de sos decodificadores primàrios fallit. Custu diat pòdere causare unu rendimentu de riprodutzione bassu cunfronta a s\'impreu de decodificadores primàrios \ 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 9c497c785..a09a7638e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -52,7 +52,7 @@ Naživo Nemožno nastaviť menu preberania Pardon, toto sa nemalo stať. - Nahlásiť túto chybu mejlom + Nahlásiť cez e-mail Pardon, niečo sa pokazilo. Správa Info: @@ -735,4 +735,43 @@ Táto možnosť je dostupná len pre motív %s Rýchly režim Import alebo export odberov z 3-bodkovej ponuky + Akcia gesta vľavo + Akcia pre gesto v pravej polovici obrazovky + Akcia gesta vpravo + Akcia pre gesto v ľavej polovici obrazovky + Jas + Hlasitosť + Nič + Odstrániť duplikáty + Odstrániť duplikáty\? + Rozpozerané + Dopozerané + Toto sa môže hodiť v prípade, že máte pokazené tlačidlo na slúchadlách + Ignorovať fyzické tlačidlá + Zmena veľkosti intervalu načítania pri progresívnom obsahu (v súčasnosti %s). Nižšia hodnota môže urýchliť ich počiatočné načítanie + Preferovať pôvodné audio + Vyberať pôvodnú zvukový stopu bez ohľadu na nastavený jazyk + Preferovať prehrávanie popisu + Zvuk: %s + Zvuková stopa + Chcete odstrániť všetky duplikátne streamy z tohoto zoznamu\? + Zobrazovať nasledovné streamy + V tomto streame by už mala byť prítomná zvuková stopa + Výber zvukovej stopy pre externé prehrávače + Neznáma + Nadchádzajúce + Úprava nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je nutné reštartovať ExoPlayer + Túto možnosť povoľte, ak máte problémy s inicializáciou dekodéra, ktorý sa v prípade zlyhania inicializácie primárnych dekodérov vráti k dekodérom s nižšou prioritou. To môže mať za následok nižší výkon prehrávania ako pri použití primárnych dekodérov + Používať funkciu záložného dekodéra prehrávača ExoPlayer + Vždy použiť nastavenia výstupu videa ExoPlayera + %s %s + povodná + dabovaná + Vyberať zvukovú stopu s popisom pre zrakovo postihnutých ak je k dispozicií + Zobrazovať/Skrývať streamy + Nastavenia ExoPlayer + Toto riešenie spôsobí to, že pri zmene textúry sa aktuálne používaný kodek uvoľní a potom znova použije, miesto toho aby sa textúra rovno použila na kodek. Toto nastavenie, ktoré už ExoPlayer používa na niektorých zariadeniach s týmto problémom, má vplyv len na Android 6 a vyšší +\n +\nPovolenie tejto možnosti môže zabrániť chybám pri prehrávaní pri prepínaní aktuálneho prehrávača videa alebo prepínaní na celú obrazovku + popisná \ 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 3d9dc6ee1..d6491cb74 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -676,7 +676,7 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard - Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver att spelaren startas om + Ändra storleken på laddningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första laddningen Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk @@ -740,4 +740,25 @@ Vänster gest åtgärd Välj en gest för den högra halvan av spelarskärmen Höger gest åtgärd + Ljud: %s + Ljudspår + Ett ljudspår bör redan finnas i denna ström + Välj ljudspår för externa spelare + Okänt + ExoPlayer inställningar + Hantera vissa ExoPlayer inställningar. Dessa ändringar kräver en omstart av spelaren för att träda i kraft + Använd alltid ExoPlayers lösning för inställning av videoutgångsyta + Föredra originalljud + Välj originalljudspåret oavsett språk + Föredra beskrivande ljud + Välj ett ljudspår med beskrivningar för synskadade personer om det finns tillgängligt + Använd ExoPlayers reservfunktion för avkodare + Aktivera det här alternativet om du har problem med initiering av avkodare, vilket faller tillbaka på avkodare med lägre prioritet om initieringen av primära avkodare misslyckas. Detta kan leda till sämre uppspelningsprestanda än vid användning av primära avkodare + Denna lösning frigör och återinstansierar videokodeker när en ytförändring inträffar, istället för att ställa in ytan direkt till kodeken. Används redan av ExoPlayer på vissa enheter med detta problem, denna inställning har endast effekt på Android 6 och senare +\n +\nOm du aktiverar det här alternativet kan det förhindra uppspelningsfel när du byter aktuell videospelare eller växlar till fullskärm + %s %s + original + beskrivande + dubbad \ No newline at end of file diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml new file mode 100644 index 000000000..dcd5df884 --- /dev/null +++ b/app/src/main/res/values-ti/strings.xml @@ -0,0 +1,19 @@ + + + ሰረዝ + ኣብ ብሮውዘር ክፉት + ውጽኢት ምርኣዩ ን፦%s + መጀመርታ ምእንቲ ኽትጅምር ነቲ ዜጕልሕ መረጼን ጠውቆ። + ኣብ %1$s እተሓትመ + ዋላ ሓደ ወሓይዝ ዚጻወት ሰብ ኣይተረኽበን። VLC + ሐራይ + ምድላው + \"%1$s\" ማለቱ ድዩ፧ + ዚተሪየ ጋባራ + ክፉቴ ምሲ + ፋይል ውሕጅ ኣራግፍ + ድለ + ኣካፍሎም + ኣራግፍ + ኣካፍሎም ምሲ + \ 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 97ff192cd..ecc17ccf1 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -736,4 +736,19 @@ Ses düzeyi Hiçbiri Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin + Varsa, görsel engelli kişiler için betimlemeli ses parçasını seç + Bilinmeyen + ExoPlayer ayarları + Kimi ExoPlayer ayarlarını yönet. Bu değişiklikler oynatıcının yeniden başlatılmasını gerektirir + özgün + dublaj + betimlemeli + %s %s + Dış oynatıcılar için ses parçası seç + Dil ne olursa olsun özgün ses parçasını seç + Ses: %s + Özgün sesi yeğle + Betimlemeli sesi yeğle + Ses parçası + Bu akışta halihazırda bir ses parçası bulunmalıdır \ 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 253160568..b8d8349df 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -756,4 +756,26 @@ Виберіть жест для правої половини екрана програвача Дія жесту праворуч Гучність + Змінити розмір інтервалу завантаження прогресивного вмісту (наразі %s). Нижче значення може прискорити його початкове завантаження + Надавати перевагу оригінальному аудіо + Вибирати оригінальну звукову доріжку незалежно від мови + Надавати перевагу описовому аудіо + Вибирати звукову доріжку з описом для людей із вадами зору, якщо вона є + Аудіо: %s + Звукова доріжка + Вибір звукової доріжки для зовнішніх програвачів + Невідомо + Налаштування ExoPlayer + Керування деякими налаштуваннями ExoPlayer. Щоб ці зміни набули чинності, потрібно перезапустити програвач + Використовувати запасну функцію декодера ExoPlayer + Завжди використовувати обхідний шлях налаштування поверхні відеовиходу ExoPlayer + %s %s + оригінальна + дубльована + описова + У цій трансляції вже має бути звукова доріжка + Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів + Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях +\n +\nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму \ 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 229359921..0b07ca4a3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -726,4 +726,26 @@ 选择播放器屏幕左半边手势 选择播放器屏幕右半边手势 + 更改渐进式内容的加载间隔大小(当前为 %s)。较低的值可加快初始加载 + 偏好描述性音频 + 如果可用,为视障人群选择带描述的音轨 + 音频:%s + 此串流中应该已经有音轨 + 选择外部播放器音轨 + 未知 + 管理一些 ExoPlayer 设置。这些更改需要重启播放器才能生效 + 使用 ExoPlayer 的编码器回退功能 + 始终使用 ExoPlayer 的视频输出界面设置变通方法 + 此变通方法在发生界面更改时会释放并重新初始化视频编解码器,而不是直接将编解码器设置到新界面。在某些有这个问题的设备上,Exoplayer 已经在使用这个方法。此设置仅适用于 Android 6 及更高的系统版本 +\n +\n启用此选项可防止切换当前视频播放器或切换到全屏播放时出现播放错误 + %s %s + 原始 + 配音 + 描述 + 偏好原始音频 + 不管何种语言都选择原始音轨 + 音轨 + ExoPlayer 设置 + 如遇解码器初始化方面的问题可开启此选项。启用后,如主解码器初始化失败,ExoPlayer 将使用较低优先级的解码器进行播放。请注意,这可能导致播放性能下降 \ 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 960954ca7..4be2a20f7 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -437,7 +437,7 @@ 喺鎖定畫面背景同埋通知都擺放縮圖 開始咗下載 年齡限制 - 您部機冇 app 開到佢 + 你部機冇 app 開到佢 呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。 揀選啱你心水嘅夜色主題 — %s 呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。 @@ -596,7 +596,7 @@ 新嘅串流通知 係咪要喺磁碟機上面消除晒全部下載咗嘅檔案? - 通知已停用 + 已停用通知 單曲 全部剷走晒播放到邊個位 請睇過係咪已經有人喺度講緊你呢次彈 app 嘅狀況。若然重複發表已有嘅議題,就會嘥咗我哋可以真正用嚟修復其他錯漏嘅時間㗎喇。 @@ -641,7 +641,7 @@ 係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄? 百分比 半音 - 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要重新開過個播放器先至生效 + 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波 問咗先至將排隊列表清走 目前播放器嘅排隊列表將會清走 加一個站 @@ -653,7 +653,7 @@ 新嘅摘要項目 揀選一個站 轉換播放器嘅時候,排隊列表可能會清走 - NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 + NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按你選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 載入播放間隔大細 互動頁面 預設嘅互動站(Kiosk) @@ -702,7 +702,7 @@ 若然你係用緊呢個 app嗰陣有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! 快速模式 右上角嘅選單有得匯入或匯出訂閱 - 您已經用緊最新版本嘅 NewPipe + 你已經用緊最新版本嘅 NewPipe 撳一下去下載 %s 唔再揀定封面縮圖 色系揀做%s 嘅時候至有得揀 @@ -727,4 +727,25 @@ 亮度 聲音 + 首選嘅原始聲音 + 首選嘅敘述性聲音 + 如果可以用嘅話,會為視障人士揀敘述性音軌 + 無論語言係咩,都揀選原始音軌 + 聲音: %s + 音軌 + 未知 + 呢個串流已經有音軌喇 + Exoplayer 設定 + 管理一啲 ExoPlayer 設定。呢啲變更需要重新啟動播放程式先會生效 + 用 ExoPlayer 嘅解碼器汰退功能 + 如果遇到解碼器初始化問題,請啟用呢個選項,如果主解碼器初始化失敗,就會用優先順序較低的解碼器。咁樣可能會導致播放性能比使用主解碼器嗰陣差 + 幾時都用 Exoplayer嘅浮面影片輸出設定解決方法 + %s %s + 原始嘅 + 配音嘅 + 敘述性 + 為外面嘅播放器揀選音軌 + 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 +\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 86bd7620d..db8ecfb12 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -726,4 +726,26 @@ 為播放器畫面左側選擇手勢 為播放器畫面右側選擇手勢 + 偏好原始音訊 + 音訊:%s + 音訊軌道 + 此串流應已存在音訊軌道 + 為外部播放程式選取音訊軌道 + 未知 + ExoPlayer 設定 + 使用 ExoPlayer 的解碼器汰退功能 + 一律使用 ExoPlayer 的視訊輸出表面設定解決方法 + %s %s + 原始 + 配音 + 描述性 + 變更漸進式內容的載入間隔大小(目前為 %s)。較低的值可能會加速初始載入速度 + 偏好描述性的音訊 + 若可用,為視障人士選取帶有描述的音訊軌道 + 無論語言都選取原始音訊軌道 + 管理一些 ExoPlayer 設定。這些變更需要重新啟動播放程式才會生效 + 若您有解碼器初始化的問題,請啟用此選項,若主要的解碼器初始化失敗,其將會汰退至較低優先度的解碼器。這可能會導致播放效能比使用主要解碼器時差 + 此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器,而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定,此設定僅對 Android 6 或更新版本有效。 +\n +\n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤 \ No newline at end of file diff --git a/fastlane/metadata/android/ar/changelogs/65.txt b/fastlane/metadata/android/ar/changelogs/65.txt new file mode 100644 index 000000000..15a3af72a --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/65.txt @@ -0,0 +1,28 @@ +### تحسينات + +- تعطيل الرسوم المتحركة لرمز قائمة برجر#1486 +- التراجع عن حذف التنزيلات #1472 +- خيار التنزيل في قائمة المشاركة #1498 +- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 +- تصغير المشغل الرئيسي عند الخروج #1354 +- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 +- ExoPlayer 2.8.2 تحديث #1392 + - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع. + - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة +سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت =\\). + -دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية + وهو متاح مباشرة عند بدء التشغيل. + -عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل. + - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه +- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة + +### إصلاحات + +- يصلح #1440 تخطيط معلومات الفيديو المكسور #1491 +- عرض تاريخ الإصلاح #1497 + - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. + - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل. +- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640) +- إصلاح مشغل الفيديو الرئيسي #1509 + - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية. + - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق. diff --git a/fastlane/metadata/android/ar/changelogs/66.txt b/fastlane/metadata/android/ar/changelogs/66.txt new file mode 100644 index 000000000..126196307 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/66.txt @@ -0,0 +1,35 @@ +# التغيير منv0.13.7 + +### ثابت +- إصلاح مشكلات عامل التصفية من v0.13.6 + +# التغيير من v0.13.6 + +### تحسينات + +- تعطيل الرسوم المتحركة لرمز قائمة برجر #1486 +- التراجع عن حذف التنزيلات #1472 +- خيار التنزيل في قائمة المشاركة #1498 +- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 +- تصغير المشغل الرئيسي عند الخروج #1354 +- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 +- ExoPlayer 2.8.2 تحديث #1392 + - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع. + - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت +=\\). + - دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية و + متاح مباشرة عند بدء التشغيل. + - عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل. + - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه +- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة + +### إصلاحات + +- الإصلاح #1440 تخطيط معلومات الفيديو المكسور#1491 +- عرض تاريخ الإصلاح #1497 + - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. + - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل. +- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640) +- إصلاح مشغل الفيديو الرئيسي #1509 + - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية. + - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق. diff --git a/fastlane/metadata/android/ar/changelogs/780.txt b/fastlane/metadata/android/ar/changelogs/780.txt new file mode 100644 index 000000000..4932a5d80 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/780.txt @@ -0,0 +1,12 @@ +تغييرات في 0.17.3 + +محسّن +• تمت إضافة خيار لمسح حالات التشغيل #2550 +• إظهار الدلائل المخفية في منتقي الملفات #2591 +• دعم عناوين URL من مثيلات "invidio.us" ليتم فتحها باستخدام NewPipe #2488 +• أضف دعمًا لـ `music.youtube.com` URLs TeamNewPipe/NewPipeمستخرج#194 + +ثابت +• [موقع YouTube] ثابت 'java.lang.IllegalArgumentException #192 +• [YouTube] البث المباشر الثابت لا يعمل TeamNewPipe/NewPipeExtractor#195 +• تم إصلاح مشكلة الأداء في أندرويد عند تنزيل البث #2592 diff --git a/fastlane/metadata/android/ar/changelogs/790.txt b/fastlane/metadata/android/ar/changelogs/790.txt new file mode 100644 index 000000000..4e6aed24c --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/790.txt @@ -0,0 +1,14 @@ +محسّن +• أضف المزيد من العناوين لتحسين إمكانية الوصول للمكفوفين #2655 +• اجعل لغة إعداد مجلد التنزيل أكثر اتساقًا وأقل غموضًا #2637 + +ثابت +• تحقق مما إذا تم تنزيل آخر بايت في الكتلة #2646 +• التمرير الثابت في جزء تفاصيل الفيديو #2672 +• إزالة الرسوم المتحركة مربع مسح البحث المزدوج إلى واحد #2695 +• [SoundCloud] إصلاح استخراج client_id #2745 + +تطوير +• أضف التبعيات المفقودة الموروثة من NewPipeExtractor إلى NewPipe #2535 +• الانتقال إلى AndroidX #2685 +• تحديث ل ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/az/full_description.txt b/fastlane/metadata/android/az/full_description.txt index 2843f8abe..50efa3929 100644 --- a/fastlane/metadata/android/az/full_description.txt +++ b/fastlane/metadata/android/az/full_description.txt @@ -1 +1 @@ -Newpipe hər hansı Google çərçivə kitabxanası və ya Youtube API-si istifadə etmir. O sadəcə zəruri məlumatları toplamaq məqsədilə veb-saytı təhlil edir. Buna görə də bu tətbiqetmə Google Xidmətləri quraşdırılmamış cihazlarda istifadə edilə bilər. Həmçinin NewPipe istifadə etməyiniz üçün YouTube hesabına ehtiyacınız yoxdur və o, azad və açıq qaynaqlı tətbiqdir. +NewPipe hər hansı Google quruluş kitabxanası və ya Youtube API istifadə etmir. O yalnız ehtiyac olan məlumatları toplamaq üçün veb-saytı təhlil edir. Bu səbəbdən, bu tətbiq Google Xidmətləri quraşdırılmamış cihazlarda istifadə edilə biləndir. Həmçinin NewPipe istifadə etmək üçün YouTube hesabına ehtiyacınız yoxdur və o, azad və açıq qaynaqlı tətbiqdir. diff --git a/fastlane/metadata/android/de/changelogs/993.txt b/fastlane/metadata/android/de/changelogs/993.txt new file mode 100644 index 000000000..54b04faa7 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/993.txt @@ -0,0 +1,12 @@ +Neu +• Warnung bei Erstellung von Duplikaten in Wiedergabelisten und neue Schaltfläche um Duplikate zu entfernen +• Möglichkeit, Hardware Tasten zu ignorieren +• Möglichkeit, teilweise gesehene Videos im Feed auszublenden + +Verbessert +• Mehr Rasterspalten auf großen Displays +• Fortschrittsbalken sind jetzt konsistent mit Einstellungen + +Behoben +• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern auf Android 11+ +• Fullscreen-Bedingung benötigte zweimaliges Drücken auf MIUI diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt index 70048c15a..d0a541cd3 100644 --- a/fastlane/metadata/android/fr/short_description.txt +++ b/fastlane/metadata/android/fr/short_description.txt @@ -1 +1 @@ -Une interface pour YouTube libre et légère sur Android. +Une interface libre et légère pour YouTube sur Android. diff --git a/fastlane/metadata/android/hi/changelogs/993.txt b/fastlane/metadata/android/hi/changelogs/993.txt new file mode 100644 index 000000000..57b6fe8be --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/993.txt @@ -0,0 +1,12 @@ +नया +• प्लेलिस्ट डुप्लिकेट जोड़ते समय चेतावनी जोड़ें और उन्हें हटाने के लिए बटन जोड़ें +• हार्डवेयर बटन को अनदेखा करने की अनुमति दें +• फ़ीड में आंशिक रूप से देखे गए वीडियो को छिपाने की अनुमति दें + +बेहतर +• बड़ी स्क्रीन पर अधिक ग्रिड कॉलम का उपयोग करें +• प्रगति संकेतक सेटिंग्स के अनुरूप बनाएं + +फिक्स +• एंड्रॉइड 11+ पर ब्राउज़र यूआरएल, डाउनलोड और बाहरी खिलाड़ियों को खोलने को ठीक करें +• एमआईयूआई पर दो टैप की आवश्यकता वाले फुलस्क्रीन के साथ इंटरेक्टि करना ठीक करें diff --git a/fastlane/metadata/android/hu/changelogs/63.txt b/fastlane/metadata/android/hu/changelogs/63.txt index e9b4b461c..8a08f438c 100644 --- a/fastlane/metadata/android/hu/changelogs/63.txt +++ b/fastlane/metadata/android/hu/changelogs/63.txt @@ -5,4 +5,4 @@ - GDPR információk hozzáadása #1420 ### Javítva -- Letöltés: A befejezetlen .giga fájlokból történő betöltés közbeni összeomlás javítása #1407 +- Letöltő: A befejezetlen .giga fájl letöltések betöltése közbeni összeomlás javítása #1407 diff --git a/fastlane/metadata/android/hu/changelogs/65.txt b/fastlane/metadata/android/hu/changelogs/65.txt index c3ee63ecc..e1180478a 100644 --- a/fastlane/metadata/android/hu/changelogs/65.txt +++ b/fastlane/metadata/android/hu/changelogs/65.txt @@ -1,26 +1,26 @@ ### Fejlesztések -- A burgermenu ikon animációjának letiltása #1486 +- A burgermenü ikonanimá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 +- Letöltési lehetőség a megosztás menüben #1498 - 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 fő lejátszó minimalizálása a kilépésnél #1354 - 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 + - Átdolgoztuk a lejátszásisebesség-vezérlő párbeszédpanelt, hogy támogassa a különböző lépésmértéket a gyorsabb sebességváltás érdekében. + - Hozzáadott kapcsoló a gyors előre- hátratekeréshez a lejátszásisebesség-vezérlőben 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 megtörhet 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, manuális helyett. 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 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óifelület-javítások: #1383, a háttérlejátszó értesítési vezérlői mostantól mindig fehérek, a felugró lejátszót egyszerűbben le lehet állítani eldobással +- Újraírt extractor használata több szolgá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 +- a #1440 Sérült videó információs elrendezés #1491 +- Előzmények megtekintése #1497 - #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. +- a képernyő időtúllépése felugró mód esetén. #1463 (javítva #640) +- Fő videólejátszó #1509 + - [#1412] az ismétlés mód, ami a lejátszó NPE-t okozza, ha új szándék érkezik, miközben a lejátszó a háttérben fut. + - a lejátszó felugró ablakra minimalizálása nem semmisíti meg a lejátszót, ha a felugró ablak nem engedélyezett. diff --git a/fastlane/metadata/android/hu/changelogs/68.txt b/fastlane/metadata/android/hu/changelogs/68.txt new file mode 100644 index 000000000..d292749fd --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/68.txt @@ -0,0 +1,31 @@ +# Változások v0.14.1 + +### Javítva +- a nem sikerül visszafejteni a videó URL-t #1659 +- a leíró link nem jól kibontható #1657 + +# Változások v0.14.0 + +### Új +- fiókkialakítás #1461 +- testreszabható címlap #1461 + +### Fejlesztések +- Átdolgozott gesztusvezérlők #1604 +- Új módja a felugrólejátszó bezárásának #1597 + +### Javítva +- a feliratkozók száma nem érhető el hibája. Bezárva a #1649. +- Ezekben az esetekben „A feliratkozók száma nem érhető el” megjelenítése +- az NPE, ha egy YouTube lejátszási lista üres +- Gyors javítás a SoundCloud kioszkjaihoz +- Refaktor és hibajavítás #1623 + - a ciklikus keresési eredmény #1562 + - a keresősáv nincs statikusan elrendezve + - az YT Prémium videó nincs megfelelően blokkolva + - a videók néha nem töltődnek be (a DASH elemzés miatt) + - a linkek a videó leírásában + - Figyelmeztetés megjelenítése, ha valaki külső SD-kártyára próbál letölteni + - a semmi sem jelenik meg kivétel jelentést vált ki + - A bélyegkép nem jelenik meg az Android 8.1 háttérlejátszóban [lásd itt](https://github.com/TeamNewPipe/NewPipe/issues/943) +- a műsorszóró vevőregisztrációja. Bezárva a #1641. diff --git a/fastlane/metadata/android/hu/changelogs/974.txt b/fastlane/metadata/android/hu/changelogs/974.txt new file mode 100644 index 000000000..f932a89c3 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/974.txt @@ -0,0 +1,5 @@ +Gyorsjavítás +• Javítva a YouTube szabályozás által okozott pufferelési problémák +• Javítva a YouTube megjegyzések kinyerése átal okozott összeomlás, letiltott megjegyzéseknél +• Javítva a YouTube zenei keresés +• Javítva a PeerTube élő közvetítések diff --git a/fastlane/metadata/android/hu/changelogs/978.txt b/fastlane/metadata/android/hu/changelogs/978.txt new file mode 100644 index 000000000..68cae7c9d --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/978.txt @@ -0,0 +1 @@ +Kijavítva az új NewPipe-verzió ellenőrzésének végrehajtása. Ez az ellenőrzés néha túl korán lett végregajtva, és ez az alkalmazás összeomlásához vezetett. Ezt most meg lett oldva. diff --git a/fastlane/metadata/android/hu/changelogs/979.txt b/fastlane/metadata/android/hu/changelogs/979.txt new file mode 100644 index 000000000..d7733434d --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/979.txt @@ -0,0 +1,2 @@ +- Javítva a lejátszásfolytatás +- Fejlesztések annak biztosítására, hogy az a szolgáltatás, amely meghatározza, hogy a NewPipe új verzióellenőrzéseket keres-e, ne induljon el a háttérben diff --git a/fastlane/metadata/android/hu/changelogs/991.txt b/fastlane/metadata/android/hu/changelogs/991.txt index 386cded5a..cd4640f8c 100644 --- a/fastlane/metadata/android/hu/changelogs/991.txt +++ b/fastlane/metadata/android/hu/changelogs/991.txt @@ -10,4 +10,4 @@ Javítások Hibajavítások • Többféle összeomlás lett javítva -• [YouTube] Javítva lett a csatornák betöltése, a nem dedikált feed és néhány ország visszajátszási gondjait megkerültük +• [YouTube] Javítva lett a csatornák betöltése, a nem elkülönített feed, és néhány ország lejátszási gondjait megkerültük diff --git a/fastlane/metadata/android/hu/changelogs/993.txt b/fastlane/metadata/android/hu/changelogs/993.txt new file mode 100644 index 000000000..81b8e9a1d --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/993.txt @@ -0,0 +1,12 @@ +Új +• Figyelmeztetés hozzáadása lejátszási lista ismétlődéseinek hozzáadásakor, és gomb hozzáadása ezek eltávolításához +• Engedélyezve a hardvergombok figyelmen kívül hagyása +• A hírfolyamban részben megtekintett videók elrejtésének engedélyezése + +Fejlesztés +• Több rácsoszlop használata a nagy képernyőkön +• A folyamatjelzők összhangban állítása a beállításokkal + +Javítva +• A böngésző nyitó URL-címeinek, letöltéseinek és külső lejátszóinak javítása Android 11+ rendszeren +• A MIUI két érintést igénylő teljes képernyős kölcsönhatásának javítása diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt index 772992ee4..6ea92d55a 100644 --- a/fastlane/metadata/android/hu/full_description.txt +++ b/fastlane/metadata/android/hu/full_description.txt @@ -1 +1 @@ -A NewPipe nem használ semmilyen Google keretrendszer programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélkül futó eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube-fiókra sem. A NewPipe szabad és nyílt forráskódú szoftver. +A NewPipe nem használ semmilyen Google keretrendszer programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélküli eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube fiókra és ez szabad és nyílt forráskódú szoftver (FLOSS). diff --git a/fastlane/metadata/android/ko/changelogs/952.txt b/fastlane/metadata/android/ko/changelogs/952.txt new file mode 100644 index 000000000..4fa66285c --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/952.txt @@ -0,0 +1,7 @@ +개선된 사항 +• 유튜브에서만 가능했던 자동재생 기능이 이제 모든 서비스에서 사용가능합니다 + +고쳐진점 +• 유튜브의 새로운 컨티뉴어스를 지원하여 관련된 스트림과 연관된 문제를 고쳤습니다 +• 연령제한된 유튜브 비디오 기능을 고쳤습니다 +• [안드로이드 TV] 오래 지속되는 포커스 하이라이트 오버레이를 고쳤습니다 diff --git a/fastlane/metadata/android/nl/changelogs/953.txt b/fastlane/metadata/android/nl/changelogs/953.txt index ca4000ebd..8f7f8b89a 100644 --- a/fastlane/metadata/android/nl/changelogs/953.txt +++ b/fastlane/metadata/android/nl/changelogs/953.txt @@ -1 +1 @@ -Hersteld: extractie van de decoderingsfunctie van YouTube. +Herstel de extractie van de decoderingsfunctie van YouTube. diff --git a/fastlane/metadata/android/sk/changelogs/65.txt b/fastlane/metadata/android/sk/changelogs/65.txt new file mode 100644 index 000000000..c7cac2626 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/65.txt @@ -0,0 +1,26 @@ +### Zlepšenia + +- Zakázanie animácie ikony burgermenu #1486 +- Zrušenie odstránenia stiahnutých súborov #1472 +- Možnosť sťahovania v ponuke zdieľania #1498 +- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 +- Minimalizácia hlavného prehrávača pri ukončení #1354 +- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 +- Aktualizácia ExoPlayer 2.8.2 #1392 + - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. + - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). + - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. + - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. + - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia +- Použitie nového extraktora s preformulovanou architektúrou pre multiservis + +### Opravy + +- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 +- Oprava histórie zobrazenia #1497 + - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. + - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. +- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) +- Oprava hlavného prehrávača videa č. 1509 + - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. + - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. diff --git a/fastlane/metadata/android/sk/changelogs/66.txt b/fastlane/metadata/android/sk/changelogs/66.txt new file mode 100644 index 000000000..ba9808cba --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/66.txt @@ -0,0 +1,33 @@ +# Zoznam zmien verzie v0.13.7 + +### Opravené +- Oprava problémov s triediacim filtrom vo verzii v0.13.6 + +# Zoznam zmien verzie v0.13.6 + +### Vylepšenia + +- Zakázanie animácie ikony burgermenu #1486 +- Zrušenie odstránenia stiahnutých súborov #1472 +- Možnosť sťahovania v ponuke zdieľania #1498 +- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 +- Minimalizácia hlavného prehrávača pri ukončení #1354 +- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 +- Aktualizácia ExoPlayer 2.8.2 #1392 + - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. + - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). + - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. + - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. + - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia +- Použitie nového extraktora s preformulovanou architektúrou pre multiservis + +### Opravy + +- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 +- Oprava histórie zobrazenia #1497 + - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. + - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. +- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) +- Oprava hlavného prehrávača videa č. 1509 + - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. + - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. diff --git a/fastlane/metadata/android/sk/changelogs/989.txt b/fastlane/metadata/android/sk/changelogs/989.txt new file mode 100644 index 000000000..ff412ff7d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/989.txt @@ -0,0 +1,3 @@ +- [YouTube] Oprava nekonečného načítavania pri pokuse o prehrávanie akéhokoľvek videa +- [YouTube] Oprava obmedzovania výkonu pri niektorých videách +- Aktualizácia knižnice jep na verziu 1.15.3, ktorá obsahuje opravu zabezpečenia diff --git a/fastlane/metadata/android/sk/changelogs/990.txt b/fastlane/metadata/android/sk/changelogs/990.txt new file mode 100644 index 000000000..3a073d720 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/990.txt @@ -0,0 +1,15 @@ +V tejto verzii sa ruší podpora systému Android 4.4 KitKat, teraz je minimálna verzia Android 5 Lollipop! + +Novinky +- Stiahnutie z ponuky dlhého stlačenia +- Skrytie budúcich videí v kanáli +- Zdieľanie miestnych zoznamov skladieb + +Vylepšenia +- Prepracovanie kódu prehrávača do malých komponentov: menej použitej pamäte RAM, menej chýb +- Vylepšenie režimu zmenšovania miniatúr +- Vektorizácia zástupných znakov obrázkov + +Opravy +- Oprava rôznych problémov s oznámením prehrávača: neaktuálne/chýbajúce informácie o médiách, skreslené miniatúry +- Oprava zobrazenia na celú obrazovku pomocou 1/4 obrazovky diff --git a/fastlane/metadata/android/sk/changelogs/992.txt b/fastlane/metadata/android/sk/changelogs/992.txt new file mode 100644 index 000000000..0ae2b2e9f --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/992.txt @@ -0,0 +1,17 @@ +Nové +- Počet odberateľov v detailoch videa +- Stiahnutie z frontu +- Trvalé nastavenie miniatúry zoznamu skladieb +- Dlhé stlačenie hashtagov a odkazov +- Režim zobrazenia kariet + +Vylepšená stránka +- Väčšie tlačidlo na zatvorenie miniprehrávača +- Hladšie zmenšovanie miniatúr +- Cieľový systém Android 13 (API 33) +- Vyhľadávanie už nepozastavuje prehrávač + +Opravená stránka +- Oprava prekrytia na DeX/myši +- Povolenie prehrávača na pozadí bez samostatných zvukových tokov +- Rôzne opravy YouTube a ďalšie… diff --git a/fastlane/metadata/android/sk/changelogs/993.txt b/fastlane/metadata/android/sk/changelogs/993.txt new file mode 100644 index 000000000..9db62cc8c --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/993.txt @@ -0,0 +1,12 @@ +Nové +- Pridanie upozornenia pri pridávaní duplikátov do zoznamu skladieb a pridanie tlačidla na ich odstránenie +- Umožniť ignorovanie hardvérových tlačidiel +- Umožniť skrývanie čiastočne sledovaných videí v kanáli + +Vylepšená stránka +- Použitie väčšieho počtu stĺpcov mriežky na veľkých obrazovkách +- Zosúladiť ukazovatele priebehu s nastaveniami + +Opravená stránka +- Oprava otvárania adries URL prehliadača, sťahovania a externých prehrávačov v systéme Android 11+ +- Oprava interakcie s celou obrazovkou vyžadujúcou dve ťuknutia na MIUI diff --git a/fastlane/metadata/android/ti/changelogs/850.txt b/fastlane/metadata/android/ti/changelogs/850.txt new file mode 100644 index 000000000..7d7d9fe5a --- /dev/null +++ b/fastlane/metadata/android/ti/changelogs/850.txt @@ -0,0 +1 @@ +እዚ ሕታም እዚ እቲ ወብ ሳይት ዩቱብ ዘዳለዎ ሕታም እዋናዊ እዩ ነይሩ። እቲ ናይ ቀደም ወብ ሳይት ሕታም ኣብ መጋቢት ስለ ዚቋረጽ ነቲ ሓድሽ ፓይፕ ከተመሓይሾ ኣሎካ። diff --git a/fastlane/metadata/android/ti/full_description.txt b/fastlane/metadata/android/ti/full_description.txt new file mode 100644 index 000000000..f0afa90ab --- /dev/null +++ b/fastlane/metadata/android/ti/full_description.txt @@ -0,0 +1 @@ +ኒውፓይፕ ዝዀነ ይኹን ናይ ጎልጋል ቤተ-መጻሕፍቲ ወይ ናይ ዩቱብ ኤፒኢ ኣይጥቀምን ኢዩ። ነቲ ወብ ሳይት ዜድልዮ ሓበሬታ ንምርካብ ጥራይ እዩ ዚምርምሮ ። ስለዚ እዚ ኣፕሊኬሽን እዚ ብዘይ ናይ ጎልጋል ሰርቪስ ኣብ ኤለክትሮኒካዊ መሳርሒታት ክትጥቀመሉ ትኽእል ኢኻ ። ኒውፓይፕ ንምጥቃም እውን ናይ ዩቱብ ሕሳብ ኣየድልየካን ኢዩ እዚ ኸኣ FLOSS ኢዩ። diff --git a/fastlane/metadata/android/ti/short_description.txt b/fastlane/metadata/android/ti/short_description.txt new file mode 100644 index 000000000..f7f2099a1 --- /dev/null +++ b/fastlane/metadata/android/ti/short_description.txt @@ -0,0 +1 @@ +ብናጻ ፈኲስ ናይ ዩቱብ ግንባር ንኣንድሮይድ ። From 8bdeed8f287dd94210e4d981d231d22e1265e5fe Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 15 Jun 2023 15:51:56 +0200 Subject: [PATCH 082/133] Add support for new GitHub assetes URLs in image minimizer workflow --- .github/workflows/image-minimizer.js | 103 ++++++++++++++------------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/.github/workflows/image-minimizer.js b/.github/workflows/image-minimizer.js index df1a30f9b..5fbd1f3b8 100644 --- a/.github/workflows/image-minimizer.js +++ b/.github/workflows/image-minimizer.js @@ -30,10 +30,12 @@ module.exports = async ({github, context}) => { } // Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com//.) - const REGEX_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; + const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; + const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm; // Check if we found something - let foundSimpleImages = REGEX_IMAGE_LOOKUP.test(initialBody); + let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody) + || REGEX_ASSETS_IMAGE_LOCKUP.test(initialBody); if (!foundSimpleImages) { console.log('Found no simple images to process'); return; @@ -47,53 +49,8 @@ module.exports = async ({github, context}) => { var wasMatchModified = false; // Try to find and replace the images with minimized ones - let newBody = await replaceAsync(initialBody, REGEX_IMAGE_LOOKUP, async (match, g1, g2) => { - console.log(`Found match '${match}'`); - - if (g1.endsWith(IGNORE_ALT_NAME_END)) { - console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`); - return match; - } - - let probeAspectRatio = 0; - let shouldModify = false; - try { - console.log(`Probing ${g2}`); - let probeResult = await probe(g2); - if (probeResult == null) { - throw 'No probeResult'; - } - if (probeResult.hUnits != 'px') { - throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`; - } - if (probeResult.height <= 0) { - throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`; - } - if (probeResult.wUnits != 'px') { - throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`; - } - if (probeResult.width <= 0) { - throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`; - } - console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`); - - probeAspectRatio = probeResult.width / probeResult.height; - shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO; - } catch(e) { - console.log('Probing failed:', e); - // Immediately abort - return match; - } - - if (shouldModify) { - wasMatchModified = true; - console.log(`Modifying match '${match}'`); - return `${g1}`; - } - - console.log(`Match '${match}' is ok/will not be modified`); - return match; - }); + let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync); + newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOCKUP, minimizeAsync); if (!wasMatchModified) { console.log('Nothing was modified. Skipping update'); @@ -129,4 +86,52 @@ module.exports = async ({github, context}) => { const data = await Promise.all(promises); return str.replace(regex, () => data.shift()); } + + async function minimizeAsync(match, g1, g2) { + console.log(`Found match '${match}'`); + + if (g1.endsWith(IGNORE_ALT_NAME_END)) { + console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`); + return match; + } + + let probeAspectRatio = 0; + let shouldModify = false; + try { + console.log(`Probing ${g2}`); + let probeResult = await probe(g2); + if (probeResult == null) { + throw 'No probeResult'; + } + if (probeResult.hUnits != 'px') { + throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`; + } + if (probeResult.height <= 0) { + throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`; + } + if (probeResult.wUnits != 'px') { + throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`; + } + if (probeResult.width <= 0) { + throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`; + } + console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`); + + probeAspectRatio = probeResult.width / probeResult.height; + shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO; + } catch(e) { + console.log('Probing failed:', e); + // Immediately abort + return match; + } + + if (shouldModify) { + wasMatchModified = true; + console.log(`Modifying match '${match}'`); + return `${g1}`; + } + + console.log(`Match '${match}' is ok/will not be modified`); + return match; + } } From 1a2fbd812269a322ff4da4cb65089d6ede0eb7a1 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 1 Jul 2023 13:29:39 +0200 Subject: [PATCH 083/133] Update acra and checkstyle fixing vulnerability in dependency com.google.guava See https://app.snyk.io/org/thescrabi/project/27dc214e-7f4f-47bb-a77c-443201491254 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c2e8a95b1..fdb5ed651 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -107,7 +107,7 @@ android { } ext { - checkstyleVersion = '10.11.0' + checkstyleVersion = '10.12.1' androidxLifecycleVersion = '2.5.1' androidxRoomVersion = '2.4.3' @@ -272,7 +272,7 @@ dependencies { implementation "io.noties.markwon:linkify:${markwonVersion}" // Crash reporting - implementation "ch.acra:acra-core:5.9.7" + implementation "ch.acra:acra-core:5.10.1" // Properly restarting implementation 'com.jakewharton:process-phoenix:2.1.2' From 5716d51112e4e6e9454c9e682dce1cc852f6e80b Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 6 Jul 2023 20:06:08 +0200 Subject: [PATCH 084/133] Update screenshots --- .../en-US/images/phoneScreenshots/00.png | Bin 0 -> 611172 bytes .../en-US/images/phoneScreenshots/01.png | Bin 0 -> 550800 bytes .../en-US/images/phoneScreenshots/02.png | Bin 0 -> 770038 bytes .../en-US/images/phoneScreenshots/03.png | Bin 0 -> 268316 bytes .../en-US/images/phoneScreenshots/04.png | Bin 0 -> 81032 bytes .../en-US/images/phoneScreenshots/05.png | Bin 0 -> 444604 bytes .../en-US/images/phoneScreenshots/06.png | Bin 0 -> 505906 bytes .../en-US/images/phoneScreenshots/07.png | Bin 0 -> 116448 bytes .../en-US/images/phoneScreenshots/08.png | Bin 0 -> 749492 bytes .../en-US/images/phoneScreenshots/shot_01.png | Bin 65454 -> 0 bytes .../en-US/images/phoneScreenshots/shot_02.png | Bin 60988 -> 0 bytes .../en-US/images/phoneScreenshots/shot_03.png | Bin 108678 -> 0 bytes .../en-US/images/phoneScreenshots/shot_04.png | Bin 91545 -> 0 bytes .../en-US/images/phoneScreenshots/shot_05.png | Bin 180488 -> 0 bytes .../en-US/images/phoneScreenshots/shot_06.png | Bin 151860 -> 0 bytes .../en-US/images/phoneScreenshots/shot_07.png | Bin 271556 -> 0 bytes .../en-US/images/phoneScreenshots/shot_08.png | Bin 140160 -> 0 bytes .../en-US/images/phoneScreenshots/shot_09.png | Bin 47980 -> 0 bytes .../en-US/images/phoneScreenshots/shot_10.png | Bin 102904 -> 0 bytes .../en-US/images/tenInchScreenshots/09.png | Bin 0 -> 1928609 bytes .../en-US/images/tenInchScreenshots/10.png | Bin 0 -> 2451781 bytes .../images/tenInchScreenshots/shot_11.png | Bin 426133 -> 0 bytes .../images/tenInchScreenshots/shot_12.png | Bin 392356 -> 0 bytes 23 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/00.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/01.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/02.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/03.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/04.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/05.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/06.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/07.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/08.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png create mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png create mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png delete mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png delete mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a74f5a5b927c446deab57b0bd4496cbda0e288a GIT binary patch literal 611172 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%0A_uW@%_$+(Tu^gb>NBDrT`W&U zGWZS7Nq+}17_dZpAProK$}tHHIHW!yl@0Ag8~za9$%#mV4~5`y^U#s;J19298?$~v zL5)B`MM1rdNRQnNFMTqU9GC4jkxl?2K)c)AuV26R&m8cJgOJ|No`%qv76t5ju6i6S z@riK-^rl&7`t3er{w8F$m{wd~SSkAik93a5m?T{CMTt(ifq>(Dz~HkMkN0E9f0Gg| z74RJwZu)^V&+8)1x=P&lUe7uQ=Fn3cC2HZ@+ZVI-1PhzPp!u$wk2$)(H-i6R@B5>> zl@(J|(u=a7>&OVV7d9ELmo-994?4r%o;i%_6_5UEXXugpv$iBm;1)C*LceesgvU{LuZS@Sn186kx4i>wfc*6nw3)X(O zU%)s5PCm-fW!3^@37cm&corDcfC?fF1|Z%UDar<*CI$yz3~z-d>%rwAyu5b|IL(L` zP6G1&>Ph1Yq)@=5T;beTgrmh&-s_3`PyOG%T_+v$>Xjr-jzeDj^FHfeDB?-r!`NdJ za3-j`04;_KZCd4N_Ahxfo6;b%wiLM+Y?|`Gt`WDEHm3oT!P$e3wpz4*-r4D5AKr^!L_K*Ee1~?uNWg zmEej&ZcNQPB(HKZLcY5qe1M+wLpZhzp+w6EnuP*p3A0wFqWb%=i25+PF~k zLKZkq(R^0gBHMWz z{=IYk0%Lnv`YHti9bHh7GyXKWGd>@=66DEGi1eqDudJ2&&%gaCrkOjxX(BxuWL zFrtl_%KD`#t+Z6G;icatM!tA-P~;ss0QpKP;cZSP+pGh z9Z{dP=5q7Yx&A&xJ?wCt?2VnO26jaD`Et_!9s&yVMUK1_Kkc6trFu+P- z*<19u;?Y&UPKh#FnsNvwx$_7gll9*cz)%v=xkFwMSwgz+UqYq(<-ecd7C88R#Xw6# zC`DN5n%=^bjDmXSV9=`~fpM9xrGhSWtC5`6zi_)v@pR*&*$4Gg<)X2KKNS zpG>5*pJlp^&Z$)Wg9A3ZW#w>`6JSl()DM3FSxtHo^CNI9TIZDW2$*W|PM{`8AF(RV z`dTLrbp~07TLTsFBHBmx)C5XkD*JcD<=!B*zbMmbD-)^w77DMJ`;33OUgggozF8i3 z>URRa<}n}fJ9)=A#q;G7GS}&>uNR%}iSD@3p<(&-5q4LF%ivvj{JZBIH zJQb)bR`DLxi1SnWLm6~`=-J^*Xf6J5Ax0&*>v;A`Y2_0I0FM$Sj9QKsw+A2OAhM>y z>x29Y^vf#HP>614ZZ!nc{P$D#H;;C%<8)j+JhWwHUlijJNaxp^B;>JzkZ7=fp+{

      !r0RXM!>M=d@-D$Q16Wb3Cnt$;2&G3Ir>zW4E{h``;y6r82=@{>gie!C`y(&3TV z*!a35)ayUPhRBeHmv_~%Yx8HB&YU`F7S48)B8OK!hcz|uLCOVj=R9p(Y}7Xj`kuqv2G764;Y81X zEzj(e80$>uUeW_$Mlj(9wBg)AeFqK}Bll@7xk`oQ`ytOOldjR0MGHYf?MnSGT}NPC^W+a9oV=b`k%DujUqVVbA>uSqLN`HXluMnzoejE&H=&pa#y(x7VCmzspZNS_U(=#ilXSs0i8!%=sjv9^ z#w3e!LU|oep?*#Vsqgwvbr^3BrffKhOSyJNXAZ>zA0OAlvFPRg{FQ3uoHXRA z9FNAQg$74^=^APz9u18O&Kmp6;crI4pdbqh!8`|1UtpvN_oD0Ac`+ifOx#e2Bnj zFKfRYbj6MI+`RU`NBQnsQN6)YpEFt)42%ubP@!0=mRY!5zA}0 zVB;_+gunv%oLTO$;1aK7T|pU7hq>ZyI2cAg`f}T8%J&CV$c4i)QzaTQWSD-Tq1aaVGbXB(xM~k?Rz}vl zxY$ct1X4x~&zWfdw+r-uBDky|)8M$E?Knk{;qiRGjx|?GyUWvh!`AZy0yHtQKe|$m zD{1q!&@$3o2FiyX1YG%yLgAsN-G7F{-wkhh4@U8VprVzDmQM|2*i<2-(3@Eqeyp@i z=F+kf3coe#OU!GtUJ?&e3QNanY`Xpj0oTo(BmY5%I~vJMkI%ZXsu)Oluh2{(SV1&s zR#X#R1jEF*aNjLZuE3#zE6^|g9DMMSb%NejzE!z z@hxQT^qtse!U@gFF)|sw&DqRncF)vxmODo(5rP5|Hr^{a|PZ zCHR_NgkC_`@uVOq)sTDn*V(m>MCrS5SAGA>Lk}!k4JF#__-yxyPVDRtlS+dPIOW>C z6_CtXhB&gf)fKjJb@3&5d^EWz_5QTn=!Db$lyq6~Ze}7zs<}!DhC0?p=Exs9gClH6 z(A+rKxS(7$(IvaI+@Fs-^$CUL=lbu`pb~g!65E`3Oy-DaT(8)1^-_ZL5opd>2>g*c z6+5@Q1X(Eo{%G=Fr43fjw@=MZ1B@x`-wOUk095A)^fp9z^*}Pvan-{?<+Gg!cqgM1 z%creUHPNEZze-`qkVH9a5pm%uJJ=pzwtNB&I{0FMSH#xY-d1w6PzY$@0g1?6M#psq zJg0*h19hEULW@V|eFU9WJH%AZuGaK_1#sD)*+ z`S7Zv$zuL3du8h_mQ(aXX&>>+E=bOHD`+tw2#MUMQBwEJ*cV?QuOVEfh&FH9NL9vW z(x1QO?`IzsY^m*VJU0y#JC4b-o0=Em5z)3+hVmmxqX(T*ah!O`)Ks@t8KQ;i=4Ll8 zy1KSlmxJlLLP#)Qom0JcLLbXuagkIOSrQSdn9@BVTGHI@G_a)ZdVQ!bG`(+7^=05P zdP#H$vXlhmm*$D#j}O@=Sfna6^tupaT8I-ySt080K_SjjfvU4tM#2RcEQ4ieK1lYe zNKkct1Ui;n32ZFva+yig?>e0vRs!k?PXqSyfRf_JJwm0M-m(XOY|56D~Yce202 z;5J$yRZB~uql34!#BavqsT$oqr$o~G2tb!~QVc6>JjB$_ZWr{9n*pv5oZqsqLB|a+ zrbIx91Q=?H(3|!ncn1Qs&pGv1;!&BHnMDo&!>{c)jKk24Cq6%dIhQCNL+id@PHe(~ zAAm!T+`b#|KHGn=&+e9mfKylTw%WK7$*d8QiJOX@`p%L35_`=s% zq(i*k79$!m6iaHQ#&I@*max#9w2OT<1OlPUEz{0)-KC(xy^2BW#bD+)Z9sWBsQVT# zAu$y_m5}GPIque!-bb6xNK~}9k@t#ico2$UDOI+WOhHrxZAsjUQ4!Wx2g3yo1>j=J zo%+X{Iaa>6tMZ1}Zb93hgD0--lfO~z8cdsDzg&(^d;b+@Y?>-PvrVU7SceVaGgNtx zBgb=h_pgh%Zgytn?=V*#BC;UX2bFg=iB1~id&#kxGg(=vTW1;wsfq<2r02QN zqIr$|`BO!eEEs2>Y=}{YWcshyBTp?h?Wgp`v&S4h7VeEoN8fZ$gFT;)9Bjnw#?MBsWV2J99oWzzwN>s<}S7xAl5 z@ok20exNbc@;98E*pdV@1bgEtgn|X>K`>9f)Nc=t&3|u4hQP~=g{6xIH~=@c_z@UlMf+S12OGBh|l6bRZj=(~Q|ojMy{pW5%9`m=ua=gh&f zNIk2Z&wfO^VA`%n&0%s%hz(SE6|SZ3QLw1kg8I40y>sn0JOEy>z0PNV(M6*vcE$`# z56c(6UX?bad!c2mWti-QA}@iZ=aVL9+DYn!g#GK;GeZBPn2k3%zMHmBGpo%PotD$p z0|d98AU&vx>1q$=Oquu%$}fivMdY~un3zO)ji@M<{hixHutrzcU^q+tMJ8YK+xtPH zH-n7GT12=fTDK7G>#n&_si*8lK2|2S?^Y_GZ_Hp5%SKDeBVo{ml*xqB=jj>uSH2+9 zA^d6SU6*g8eR<9HW(l7fRTXpfRm$e{7YR88NB2Op5s8xz4?k+nRjtmZ6AM|7vEpVU_>f zJyK$+fjOT%iRbV!?j;5^`ISL{ab%co0+FgDRDFu6KeK2}!NS^bF^j*~i1)byr4a$& zD@8QQf}w8*0XQgfs4qz}p+gDW3@G@BGePP6v6T3DxO>LV1BbhWP$#tX=^Pq7Zpg=1 ztM$qK4*R><1iY`a&Bo||Mwm;Aaj&0V7muy=Gg5ACZVDeDZYaf(3$Nc-SCy>=%DAz8 zbeyj*y{%+W5I#7>stM}>Yw15&P3rZ~a9`lwca5``oSet?#i9pMwwnbP$0k3bvEj4? zIOk3efXxAy!0)y00(e5^AsNIkcCK;CEDG*b)CnK_)Ii>kz;6@5nQ6z=wSVUbu{vPYKsn8|9P;_q?7J`o!(u36o{&hjbI}IJn|I>tN~2b& zVu!lUR5V|;o`vaiDF{x{IPbpBwT#z(8d?|rddv{E9#;HK*tfAGr!>c_`&3TU zF)feJJMeyD98=k_#V>a`kEmwXkmbGV`3D+7Pn-20Ux$>(wscAiNPq3Ra1y2m;c2Pw zO(~48*o?BH-!n>buB+uZO9itJ{j9~6eS#I7%mMzoG)T9Gj@x8CfDjk* zhGiIIWtG=XM#;X??g9lZ*lIrO0BtcZ4-&%O{eykV10SLu#MBj2D6%#`v$;>N<}Np% zn$U>Q5QmG$Jp8P{Qt&Di+lx~$yj#M7#wwB&AH@t3YKj&^D@~sus(VpcL|Z*|(T*D# zMT$