diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 2c79d62cd..4137c7635 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ liberapay: TeamNewPipe +custom: 'https://newpipe.net/donate/' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a707ff0a..49e78e997 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,6 +52,7 @@ jobs: test-android: # macos has hardware acceleration. See android-emulator-runner action runs-on: macos-latest + timeout-minutes: 20 strategy: matrix: # api-level 19 is min sdk, but throws errors related to desugaring @@ -73,6 +74,13 @@ jobs: # workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160 emulator-build: 7425822 script: ./gradlew connectedCheck --stacktrace + + - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553 + uses: actions/upload-artifact@v2 + if: failure() + with: + name: android-test-report-api${{ matrix.api-level }} + path: app/build/reports/androidTests/connected/** sonar: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 40e7d2c03..1352b6917 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,8 @@ captures/ *~ .weblate *.class -**/debug/ -**/release/ +app/debug/ +app/release/ # vscode / eclipse files *.classpath diff --git a/README.md b/README.md index 492c3247f..186b613f7 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@

WebsiteBlogFAQPress


-*Read this in other languages: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Read this in other languages: [English](README.md), [Español](doc/README.es.md), [한국어](doc/README.ko.md), [Soomaali](doc/README.so.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md).* WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY. diff --git a/app/build.gradle b/app/build.gradle index 689d7f08e..ead430fd1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,16 +8,16 @@ plugins { } android { - compileSdkVersion 30 + compileSdk 30 buildToolsVersion '30.0.3' defaultConfig { applicationId "org.schabi.newpipe" resValue "string", "app_name", "NewPipe" - minSdkVersion 19 - targetSdkVersion 29 - versionCode 981 - versionName "0.21.15" + minSdk 19 + targetSdk 29 + versionCode 982 + versionName "0.21.16" multiDexEnabled true @@ -65,7 +65,7 @@ android { } } - lintOptions { + lint { checkReleaseBuilds false // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: @@ -98,7 +98,7 @@ android { } ext { - checkstyleVersion = '9.2' + checkstyleVersion = '9.2.1' androidxLifecycleVersion = '2.3.1' androidxRoomVersion = '2.3.0' @@ -112,6 +112,7 @@ ext { leakCanaryVersion = '2.5' stethoVersion = '1.6.0' mockitoVersion = '4.0.0' + assertJVersion = '3.22.0' } configurations { @@ -188,7 +189,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.21.12' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:65129e6' /** Checkstyle **/ checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" @@ -290,6 +291,7 @@ dependencies { androidTestImplementation "androidx.test.ext:junit:1.1.3" androidTestImplementation "androidx.test:runner:1.4.0" androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" + androidTestImplementation "org.assertj:assertj-core:${assertJVersion}" } static String getGitWorkingBranch() { diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt index 3f3a038d8..24be0f868 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt @@ -1,19 +1,19 @@ package org.schabi.newpipe.local.history import androidx.test.core.app.ApplicationProvider +import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test -import org.junit.rules.Timeout import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.history.model.SearchHistoryEntry import org.schabi.newpipe.testUtil.TestDatabase import org.schabi.newpipe.testUtil.TrampolineSchedulerRule +import java.time.LocalDateTime import java.time.OffsetDateTime -import java.util.concurrent.TimeUnit +import java.time.ZoneOffset class HistoryRecordManagerTest { @@ -23,9 +23,6 @@ class HistoryRecordManagerTest { @get:Rule val trampolineScheduler = TrampolineSchedulerRule() - @get:Rule - val timeout = Timeout(1, TimeUnit.SECONDS) - @Before fun setup() { database = TestDatabase.createReplacingNewPipeDatabase() @@ -45,109 +42,137 @@ class HistoryRecordManagerTest { // that the number of Lists it returns is exactly 1, we can only check if the first List is // correct. Why on earth has a Flowable been used instead of a Single for getAll()?!? val entities = database.searchHistoryDAO().all.blockingFirst() - assertEquals(1, entities.size) - assertEquals(1, entities[0].id) - assertEquals(0, entities[0].serviceId) - assertEquals("Hello", entities[0].search) + assertThat(entities).hasSize(1) + assertThat(entities[0].id).isEqualTo(1) + assertThat(entities[0].serviceId).isEqualTo(0) + assertThat(entities[0].search).isEqualTo("Hello") } @Test fun deleteSearchHistory() { val entries = listOf( - SearchHistoryEntry(OffsetDateTime.now(), 0, "A"), - SearchHistoryEntry(OffsetDateTime.now(), 2, "A"), - SearchHistoryEntry(OffsetDateTime.now(), 1, "B"), - SearchHistoryEntry(OffsetDateTime.now(), 0, "B"), + SearchHistoryEntry(time.minusSeconds(1), 0, "A"), + SearchHistoryEntry(time.minusSeconds(2), 2, "A"), + SearchHistoryEntry(time.minusSeconds(3), 1, "B"), + SearchHistoryEntry(time.minusSeconds(4), 0, "B"), ) // make sure all 4 were inserted database.searchHistoryDAO().insertAll(entries) - assertEquals(entries.size, database.searchHistoryDAO().all.blockingFirst().size) + assertThat(database.searchHistoryDAO().all.blockingFirst()).hasSameSizeAs(entries) // try to delete only "A" entries, "B" entries should be untouched manager.deleteSearchHistory("A").test().await().assertValue(2) val entities = database.searchHistoryDAO().all.blockingFirst() - assertEquals(2, entities.size) - assertTrue(entries[2].hasEqualValues(entities[0])) - assertTrue(entries[3].hasEqualValues(entities[1])) + assertThat(entities).hasSize(2) + assertThat(entities).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 } + .containsExactly(*entries.subList(2, 4).toTypedArray()) // assert that nothing happens if we delete a search query that does exist in the db manager.deleteSearchHistory("A").test().await().assertValue(0) val entities2 = database.searchHistoryDAO().all.blockingFirst() - assertEquals(2, entities2.size) - assertTrue(entries[2].hasEqualValues(entities2[0])) - assertTrue(entries[3].hasEqualValues(entities2[1])) + assertThat(entities2).hasSize(2) + assertThat(entities2).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 } + .containsExactly(*entries.subList(2, 4).toTypedArray()) // delete all remaining entries manager.deleteSearchHistory("B").test().await().assertValue(2) - assertEquals(0, database.searchHistoryDAO().all.blockingFirst().size) + assertThat(database.searchHistoryDAO().all.blockingFirst()).isEmpty() } @Test fun deleteCompleteSearchHistory() { val entries = listOf( - SearchHistoryEntry(OffsetDateTime.now(), 1, "A"), - SearchHistoryEntry(OffsetDateTime.now(), 2, "B"), - SearchHistoryEntry(OffsetDateTime.now(), 0, "C"), + SearchHistoryEntry(time.minusSeconds(1), 1, "A"), + SearchHistoryEntry(time.minusSeconds(2), 2, "B"), + SearchHistoryEntry(time.minusSeconds(3), 0, "C"), ) // make sure all 3 were inserted database.searchHistoryDAO().insertAll(entries) - assertEquals(entries.size, database.searchHistoryDAO().all.blockingFirst().size) + assertThat(database.searchHistoryDAO().all.blockingFirst()).hasSameSizeAs(entries) // should remove everything manager.deleteCompleteSearchHistory().test().await().assertValue(entries.size) - assertEquals(0, database.searchHistoryDAO().all.blockingFirst().size) + assertThat(database.searchHistoryDAO().all.blockingFirst()).isEmpty() + } + + private fun insertShuffledRelatedSearches(relatedSearches: Collection) { + + // shuffle to make sure the order of items returned by queries depends only on + // SearchHistoryEntry.creationDate, not on the actual insertion time, so that we can + // verify that the `ORDER BY` clause does its job + database.searchHistoryDAO().insertAll(relatedSearches.shuffled()) + + // make sure all entries were inserted + assertEquals( + relatedSearches.size, + database.searchHistoryDAO().all.blockingFirst().size + ) } @Test fun getRelatedSearches_emptyQuery() { - // make sure all entries were inserted - database.searchHistoryDAO().insertAll(RELATED_SEARCHES_ENTRIES) - assertEquals( - RELATED_SEARCHES_ENTRIES.size, - database.searchHistoryDAO().all.blockingFirst().size - ) + insertShuffledRelatedSearches(RELATED_SEARCHES_ENTRIES) // make sure correct number of searches is returned and in correct order val searches = manager.getRelatedSearches("", 6, 4).blockingFirst() - assertEquals(4, searches.size) - assertEquals(RELATED_SEARCHES_ENTRIES[6].search, searches[0]) // A (even if in two places) - assertEquals(RELATED_SEARCHES_ENTRIES[4].search, searches[1]) // B - assertEquals(RELATED_SEARCHES_ENTRIES[5].search, searches[2]) // AA - assertEquals(RELATED_SEARCHES_ENTRIES[2].search, searches[3]) // BA + assertThat(searches).containsExactly( + RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places) + RELATED_SEARCHES_ENTRIES[4].search, // B + RELATED_SEARCHES_ENTRIES[5].search, // AA + RELATED_SEARCHES_ENTRIES[2].search, // BA + ) + } + + @Test + fun getRelatedSearches_emptyQuery_manyDuplicates() { + insertShuffledRelatedSearches( + listOf( + SearchHistoryEntry(time.minusSeconds(9), 3, "A"), + SearchHistoryEntry(time.minusSeconds(8), 3, "AB"), + SearchHistoryEntry(time.minusSeconds(7), 3, "A"), + SearchHistoryEntry(time.minusSeconds(6), 3, "A"), + SearchHistoryEntry(time.minusSeconds(5), 3, "BA"), + SearchHistoryEntry(time.minusSeconds(4), 3, "A"), + SearchHistoryEntry(time.minusSeconds(3), 3, "A"), + SearchHistoryEntry(time.minusSeconds(2), 0, "A"), + SearchHistoryEntry(time.minusSeconds(1), 2, "AA"), + ) + ) + + val searches = manager.getRelatedSearches("", 9, 3).blockingFirst() + assertThat(searches).containsExactly("AA", "A", "BA") } @Test fun getRelatedSearched_nonEmptyQuery() { - // make sure all entries were inserted - database.searchHistoryDAO().insertAll(RELATED_SEARCHES_ENTRIES) - assertEquals( - RELATED_SEARCHES_ENTRIES.size, - database.searchHistoryDAO().all.blockingFirst().size - ) + insertShuffledRelatedSearches(RELATED_SEARCHES_ENTRIES) // make sure correct number of searches is returned and in correct order val searches = manager.getRelatedSearches("A", 3, 5).blockingFirst() - assertEquals(3, searches.size) - assertEquals(RELATED_SEARCHES_ENTRIES[6].search, searches[0]) // A (even if in two places) - assertEquals(RELATED_SEARCHES_ENTRIES[5].search, searches[1]) // AA - assertEquals(RELATED_SEARCHES_ENTRIES[1].search, searches[2]) // BA + assertThat(searches).containsExactly( + RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places) + RELATED_SEARCHES_ENTRIES[5].search, // AA + RELATED_SEARCHES_ENTRIES[1].search, // BA + ) // also make sure that the string comparison is case insensitive val searches2 = manager.getRelatedSearches("a", 3, 5).blockingFirst() - assertEquals(searches, searches2) + assertThat(searches).isEqualTo(searches2) } companion object { - val RELATED_SEARCHES_ENTRIES = listOf( - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(7), 2, "AC"), - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(6), 0, "ABC"), - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(5), 1, "BA"), - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(4), 3, "A"), - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(2), 0, "B"), - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(3), 2, "AA"), - SearchHistoryEntry(OffsetDateTime.now().minusSeconds(1), 1, "A"), + private val time = OffsetDateTime.of(LocalDateTime.of(2000, 1, 1, 1, 1), ZoneOffset.UTC) + + private val RELATED_SEARCHES_ENTRIES = listOf( + SearchHistoryEntry(time.minusSeconds(7), 2, "AC"), + SearchHistoryEntry(time.minusSeconds(6), 0, "ABC"), + SearchHistoryEntry(time.minusSeconds(5), 1, "BA"), + SearchHistoryEntry(time.minusSeconds(4), 3, "A"), + SearchHistoryEntry(time.minusSeconds(2), 0, "B"), + SearchHistoryEntry(time.minusSeconds(3), 2, "AA"), + SearchHistoryEntry(time.minusSeconds(1), 1, "A"), ) } } diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt index 249492d8f..c392d8d3d 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt @@ -4,13 +4,11 @@ import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test -import org.junit.rules.Timeout import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.testUtil.TestDatabase import org.schabi.newpipe.testUtil.TrampolineSchedulerRule -import java.util.concurrent.TimeUnit class LocalPlaylistManagerTest { @@ -20,9 +18,6 @@ class LocalPlaylistManagerTest { @get:Rule val trampolineScheduler = TrampolineSchedulerRule() - @get:Rule - val timeout = Timeout(1, TimeUnit.SECONDS) - @Before fun setup() { database = TestDatabase.createReplacingNewPipeDatabase() diff --git a/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsBVDLeakCanary.java b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsBVDLeakCanary.java new file mode 100644 index 000000000..a2d65f6f4 --- /dev/null +++ b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsBVDLeakCanary.java @@ -0,0 +1,20 @@ +package org.schabi.newpipe.settings; + +import android.content.Intent; + +import leakcanary.LeakCanary; + +/** + * Build variant dependent (BVD) leak canary API implementation for the debug settings fragment. + * This class is loaded via reflection by + * {@link DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI}. + */ +@SuppressWarnings("unused") // Class is used but loaded via reflection +public class DebugSettingsBVDLeakCanary + implements DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI { + + @Override + public Intent getNewLeakDisplayActivityIntent() { + return LeakCanary.INSTANCE.newLeakDisplayActivityIntent(); + } +} diff --git a/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java deleted file mode 100644 index f48be553f..000000000 --- a/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.schabi.newpipe.settings; - -import android.os.Bundle; - -import androidx.preference.Preference; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.error.ErrorInfo; -import org.schabi.newpipe.error.ErrorUtil; -import org.schabi.newpipe.error.UserAction; -import org.schabi.newpipe.util.PicassoHelper; - -import leakcanary.LeakCanary; - -public class DebugSettingsFragment extends BasePreferenceFragment { - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.debug_settings); - - final Preference showMemoryLeaksPreference - = findPreference(getString(R.string.show_memory_leaks_key)); - final Preference showImageIndicatorsPreference - = findPreference(getString(R.string.show_image_indicators_key)); - final Preference crashTheAppPreference - = findPreference(getString(R.string.crash_the_app_key)); - final Preference showErrorSnackbarPreference - = findPreference(getString(R.string.show_error_snackbar_key)); - final Preference createErrorNotificationPreference - = findPreference(getString(R.string.create_error_notification_key)); - - assert showMemoryLeaksPreference != null; - assert showImageIndicatorsPreference != null; - assert crashTheAppPreference != null; - assert showErrorSnackbarPreference != null; - assert createErrorNotificationPreference != null; - - showMemoryLeaksPreference.setOnPreferenceClickListener(preference -> { - startActivity(LeakCanary.INSTANCE.newLeakDisplayActivityIntent()); - return true; - }); - - showImageIndicatorsPreference.setOnPreferenceChangeListener((preference, newValue) -> { - PicassoHelper.setIndicatorsEnabled((Boolean) newValue); - return true; - }); - - crashTheAppPreference.setOnPreferenceClickListener(preference -> { - throw new RuntimeException(); - }); - - showErrorSnackbarPreference.setOnPreferenceClickListener(preference -> { - ErrorUtil.showUiErrorSnackbar(DebugSettingsFragment.this, - "Dummy", new RuntimeException("Dummy")); - return true; - }); - - createErrorNotificationPreference.setOnPreferenceClickListener(preference -> { - ErrorUtil.createNotification(requireContext(), - new ErrorInfo(new RuntimeException("Dummy"), UserAction.UI_ERROR, "Dummy")); - return true; - }); - } -} diff --git a/app/src/main/java/org/apache/commons/text/similarity/FuzzyScore.java b/app/src/main/java/org/apache/commons/text/similarity/FuzzyScore.java new file mode 100644 index 000000000..bbab7fd78 --- /dev/null +++ b/app/src/main/java/org/apache/commons/text/similarity/FuzzyScore.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.text.similarity; + +import java.util.Locale; + +/** + * A matching algorithm that is similar to the searching algorithms implemented in editors such + * as Sublime Text, TextMate, Atom and others. + * + *

+ * One point is given for every matched character. Subsequent matches yield two bonus points. + * A higher score indicates a higher similarity. + *

+ * + *

+ * This code has been adapted from Apache Commons Lang 3.3. + *

+ * + * @since 1.0 + * + * Note: This class was forked from + * + * apache/commons-text (8cfdafc) FuzzyScore.java + * + */ +public class FuzzyScore { + + /** + * Locale used to change the case of text. + */ + private final Locale locale; + + + /** + * This returns a {@link Locale}-specific {@link FuzzyScore}. + * + * @param locale The string matching logic is case insensitive. + A {@link Locale} is necessary to normalize both Strings to lower case. + * @throws IllegalArgumentException + * This is thrown if the {@link Locale} parameter is {@code null}. + */ + public FuzzyScore(final Locale locale) { + if (locale == null) { + throw new IllegalArgumentException("Locale must not be null"); + } + this.locale = locale; + } + + /** + * Find the Fuzzy Score which indicates the similarity score between two + * Strings. + * + *
+     * score.fuzzyScore(null, null)                          = IllegalArgumentException
+     * score.fuzzyScore("not null", null)                    = IllegalArgumentException
+     * score.fuzzyScore(null, "not null")                    = IllegalArgumentException
+     * score.fuzzyScore("", "")                              = 0
+     * score.fuzzyScore("Workshop", "b")                     = 0
+     * score.fuzzyScore("Room", "o")                         = 1
+     * score.fuzzyScore("Workshop", "w")                     = 1
+     * score.fuzzyScore("Workshop", "ws")                    = 2
+     * score.fuzzyScore("Workshop", "wo")                    = 4
+     * score.fuzzyScore("Apache Software Foundation", "asf") = 3
+     * 
+ * + * @param term a full term that should be matched against, must not be null + * @param query the query that will be matched against a term, must not be + * null + * @return result score + * @throws IllegalArgumentException if the term or query is {@code null} + */ + public Integer fuzzyScore(final CharSequence term, final CharSequence query) { + if (term == null || query == null) { + throw new IllegalArgumentException("CharSequences must not be null"); + } + + // fuzzy logic is case insensitive. We normalize the Strings to lower + // case right from the start. Turning characters to lower case + // via Character.toLowerCase(char) is unfortunately insufficient + // as it does not accept a locale. + final String termLowerCase = term.toString().toLowerCase(locale); + final String queryLowerCase = query.toString().toLowerCase(locale); + + // the resulting score + int score = 0; + + // the position in the term which will be scanned next for potential + // query character matches + int termIndex = 0; + + // index of the previously matched character in the term + int previousMatchingCharacterIndex = Integer.MIN_VALUE; + + for (int queryIndex = 0; queryIndex < queryLowerCase.length(); queryIndex++) { + final char queryChar = queryLowerCase.charAt(queryIndex); + + boolean termCharacterMatchFound = false; + for (; termIndex < termLowerCase.length() + && !termCharacterMatchFound; termIndex++) { + final char termChar = termLowerCase.charAt(termIndex); + + if (queryChar == termChar) { + // simple character matches result in one point + score++; + + // subsequent character matches further improve + // the score. + if (previousMatchingCharacterIndex + 1 == termIndex) { + score += 2; + } + + previousMatchingCharacterIndex = termIndex; + + // we can leave the nested loop. Every character in the + // query can match at most one character in the term. + termCharacterMatchFound = true; + } + } + } + + return score; + } + + /** + * Gets the locale. + * + * @return The locale + */ + public Locale getLocale() { + return locale; + } + +} diff --git a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java index fcad0b612..fde006a60 100644 --- a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java +++ b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java @@ -14,6 +14,7 @@ import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.SaveUploaderUrlHelper; import java.util.Collections; @@ -61,11 +62,13 @@ public final class QueueItemMenuUtil { return true; case R.id.menu_item_channel_details: - // An intent must be used here. - // Opening with FragmentManager transactions is not working, - // as PlayQueueActivity doesn't use fragments. - NavigationHelper.openChannelFragmentUsingIntent(context, item.getServiceId(), - item.getUploaderUrl(), item.getUploader()); + SaveUploaderUrlHelper.saveUploaderUrlIfNeeded(context, item, + // An intent must be used here. + // Opening with FragmentManager transactions is not working, + // as PlayQueueActivity doesn't use fragments. + uploaderUrl -> NavigationHelper.openChannelFragmentUsingIntent( + context, item.getServiceId(), uploaderUrl, item.getUploader() + )); return true; case R.id.menu_item_share: shareText(context, item.getTitle(), item.getUrl(), diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index a8fdcae26..1e5bd8799 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -185,7 +185,11 @@ class AboutActivity : AppCompatActivity() { SoftwareComponent( "RxJava", "2016 - 2020", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2 - ) + ), + SoftwareComponent( + "SearchPreference", "2018", "ByteHamster", + "https://github.com/ByteHamster/SearchPreference", StandardLicenses.MIT + ), ) private const val POS_ABOUT = 0 private const val POS_LICENSE = 1 diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java deleted file mode 100644 index fd4588700..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.schabi.newpipe.database.history.model; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.Index; -import androidx.room.PrimaryKey; - -import java.time.OffsetDateTime; - -import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SEARCH; - -@Entity(tableName = SearchHistoryEntry.TABLE_NAME, - indices = {@Index(value = SEARCH)}) -public class SearchHistoryEntry { - public static final String ID = "id"; - public static final String TABLE_NAME = "search_history"; - public static final String SERVICE_ID = "service_id"; - public static final String CREATION_DATE = "creation_date"; - public static final String SEARCH = "search"; - - @ColumnInfo(name = ID) - @PrimaryKey(autoGenerate = true) - private long id; - - @ColumnInfo(name = CREATION_DATE) - private OffsetDateTime creationDate; - - @ColumnInfo(name = SERVICE_ID) - private int serviceId; - - @ColumnInfo(name = SEARCH) - private String search; - - public SearchHistoryEntry(final OffsetDateTime creationDate, final int serviceId, - final String search) { - this.serviceId = serviceId; - this.creationDate = creationDate; - this.search = search; - } - - public long getId() { - return id; - } - - public void setId(final long id) { - this.id = id; - } - - public OffsetDateTime getCreationDate() { - return creationDate; - } - - public void setCreationDate(final OffsetDateTime creationDate) { - this.creationDate = creationDate; - } - - public int getServiceId() { - return serviceId; - } - - public void setServiceId(final int serviceId) { - this.serviceId = serviceId; - } - - public String getSearch() { - return search; - } - - public void setSearch(final String search) { - this.search = search; - } - - @Ignore - public boolean hasEqualValues(final SearchHistoryEntry otherEntry) { - return getServiceId() == otherEntry.getServiceId() - && getSearch().equals(otherEntry.getSearch()); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt new file mode 100644 index 000000000..8cb9a25ca --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt @@ -0,0 +1,40 @@ +package org.schabi.newpipe.database.history.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index +import androidx.room.PrimaryKey +import java.time.OffsetDateTime + +@Entity( + tableName = SearchHistoryEntry.TABLE_NAME, + indices = [Index(value = [SearchHistoryEntry.SEARCH])] +) +data class SearchHistoryEntry( + @field:ColumnInfo(name = CREATION_DATE) var creationDate: OffsetDateTime?, + @field:ColumnInfo( + name = SERVICE_ID + ) var serviceId: Int, + @field:ColumnInfo(name = SEARCH) var search: String? +) { + @ColumnInfo(name = ID) + @PrimaryKey(autoGenerate = true) + var id: Long = 0 + + @Ignore + fun hasEqualValues(otherEntry: SearchHistoryEntry): Boolean { + return ( + serviceId == otherEntry.serviceId && + search == otherEntry.search + ) + } + + companion object { + const val ID = "id" + const val TABLE_NAME = "search_history" + const val SERVICE_ID = "service_id" + const val CREATION_DATE = "creation_date" + const val SEARCH = "search" + } +} 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 a5e590ba0..05630ef79 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 @@ -1098,6 +1098,11 @@ public final class VideoDetailFragment toggleFullscreenIfInFullscreenMode(); + if (isPlayerAvailable()) { + // FIXME Workaround #7427 + player.setRecovery(); + } + if (!useExternalAudioPlayer) { openNormalBackgroundPlayer(append); } else { @@ -1114,6 +1119,9 @@ public final class VideoDetailFragment // See UI changes while remote playQueue changes if (!isPlayerAvailable()) { playerHolder.startService(false, this); + } else { + // FIXME Workaround #7427 + player.setRecovery(); } toggleFullscreenIfInFullscreenMode(); @@ -1521,6 +1529,8 @@ public final class VideoDetailFragment animate(binding.detailThumbnailPlayButton, true, 200); binding.detailVideoTitleView.setText(title); + binding.detailSubChannelThumbnailView.setVisibility(View.GONE); + if (!isEmpty(info.getSubChannelName())) { displayBothUploaderAndSubChannel(info); } else if (!isEmpty(info.getUploaderName())) { @@ -2206,12 +2216,20 @@ public final class VideoDetailFragment mainFragment.setDescendantFocusability(afterDescendants); toolbar.setDescendantFocusability(afterDescendants); ((ViewGroup) requireView()).setDescendantFocusability(blockDescendants); - mainFragment.requestFocus(); + // Only focus the mainFragment if the mainFragment (e.g. search-results) + // or the toolbar (e.g. Textfield for search) don't have focus. + // This was done to fix problems with the keyboard input, see also #7490 + if (!mainFragment.hasFocus() && !toolbar.hasFocus()) { + mainFragment.requestFocus(); + } } else { mainFragment.setDescendantFocusability(blockDescendants); toolbar.setDescendantFocusability(blockDescendants); ((ViewGroup) requireView()).setDescendantFocusability(afterDescendants); - binding.detailThumbnailRootLayout.requestFocus(); + // Only focus the player if it not already has focus + if (!binding.getRoot().hasFocus()) { + binding.detailThumbnailRootLayout.requestFocus(); + } } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index a61cec11d..85c47ec74 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -268,7 +268,10 @@ public class PlaylistFragment extends BaseListInfoFragment { ShareUtils.openUrlInBrowser(requireContext(), url); break; case R.id.menu_item_share: - ShareUtils.shareText(requireContext(), name, url, currentInfo.getThumbnailUrl()); + if (currentInfo != null) { + ShareUtils.shareText(requireContext(), name, url, + currentInfo.getThumbnailUrl()); + } break; case R.id.menu_item_bookmark: onBookmarkClicked(); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 15424334d..055c27733 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -25,7 +25,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; @@ -34,7 +33,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.TooltipCompat; -import androidx.core.content.ContextCompat; import androidx.core.text.HtmlCompat; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.ItemTouchHelper; @@ -65,6 +63,7 @@ import org.schabi.newpipe.settings.NewPipeSettings; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.KeyboardUtil; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; @@ -670,31 +669,15 @@ public class SearchFragment extends BaseListFragment animateAlpha(enterOrExit, duration, delay, execOnEnd) AnimationType.SCALE_AND_ALPHA -> animateScaleAndAlpha(enterOrExit, duration, delay, execOnEnd) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 5b593bcd7..905290b48 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -271,7 +271,7 @@ class FeedFragment : BaseStateFragment() { override fun onDestroyView() { // Ensure that all animations are canceled - feedBinding.newItemsLoadedButton?.clearAnimation() + tryGetNewItemsLoadedButton()?.clearAnimation() feedBinding.itemsList.adapter = null _feedBinding = null 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 c038f5573..5bf239a86 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -51,9 +51,6 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.animation.PropertyValuesHolder; -import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; @@ -154,6 +151,7 @@ import org.schabi.newpipe.info_list.StreamSegmentAdapter; import org.schabi.newpipe.ktx.AnimationType; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.MainPlayer.PlayerType; +import org.schabi.newpipe.player.event.DisplayPortion; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.event.PlayerGestureListener; import org.schabi.newpipe.player.event.PlayerServiceEventListener; @@ -188,6 +186,7 @@ import org.schabi.newpipe.util.StreamTypeUtil; import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; import org.schabi.newpipe.views.ExpandableSurfaceView; +import org.schabi.newpipe.views.player.PlayerFastSeekOverlay; import java.io.IOException; import java.util.ArrayList; @@ -247,6 +246,7 @@ public final class Player implements public static final int DEFAULT_CONTROLS_DURATION = 300; // 300 millis public static final int DEFAULT_CONTROLS_HIDE_TIME = 2000; // 2 Seconds public static final int DPAD_CONTROLS_HIDE_TIME = 7000; // 7 Seconds + public static final int SEEK_OVERLAY_DURATION = 450; // 450 millis /*////////////////////////////////////////////////////////////////////////// // Other constants @@ -313,7 +313,6 @@ public final class Player implements private PlayerBinding binding; - private ValueAnimator controlViewAnimator; private final Handler controlsVisibilityHandler = new Handler(); // fullscreen player @@ -365,6 +364,7 @@ public final class Player implements private int maxGestureLength; // scaled private GestureDetectorCompat gestureDetector; + private PlayerGestureListener playerGestureListener; /*////////////////////////////////////////////////////////////////////////// // Listeners and disposables @@ -449,6 +449,8 @@ public final class Player implements initPlayer(true); } initListeners(); + + setupPlayerSeekOverlay(); } private void initViews(@NonNull final PlayerBinding playerBinding) { @@ -525,9 +527,9 @@ public final class Player implements binding.resizeTextView.setOnClickListener(this); binding.playbackLiveSync.setOnClickListener(this); - final PlayerGestureListener listener = new PlayerGestureListener(this, service); - gestureDetector = new GestureDetectorCompat(context, listener); - binding.getRoot().setOnTouchListener(listener); + playerGestureListener = new PlayerGestureListener(this, service); + gestureDetector = new GestureDetectorCompat(context, playerGestureListener); + binding.getRoot().setOnTouchListener(playerGestureListener); binding.queueButton.setOnClickListener(this); binding.segmentsButton.setOnClickListener(this); @@ -578,6 +580,68 @@ public final class Player implements v.getPaddingRight(), v.getPaddingBottom())); } + + /** + * Initializes the Fast-For/Backward overlay. + */ + private void setupPlayerSeekOverlay() { + binding.fastSeekOverlay + .seekSecondsSupplier( + () -> (int) (retrieveSeekDurationFromPreferences(this) / 1000.0f)) + .performListener(new PlayerFastSeekOverlay.PerformListener() { + + @Override + public void onDoubleTap() { + animate(binding.fastSeekOverlay, true, SEEK_OVERLAY_DURATION); + } + + @Override + public void onDoubleTapEnd() { + animate(binding.fastSeekOverlay, false, SEEK_OVERLAY_DURATION); + } + + @Override + public FastSeekDirection getFastSeekDirection( + @NonNull final DisplayPortion portion + ) { + if (exoPlayerIsNull()) { + // Abort seeking + playerGestureListener.endMultiDoubleTap(); + return FastSeekDirection.NONE; + } + if (portion == DisplayPortion.LEFT) { + // Check if it's possible to rewind + // Small puffer to eliminate infinite rewind seeking + if (simpleExoPlayer.getCurrentPosition() < 500L) { + return FastSeekDirection.NONE; + } + return FastSeekDirection.BACKWARD; + } else if (portion == DisplayPortion.RIGHT) { + // Check if it's possible to fast-forward + if (currentState == STATE_COMPLETED + || simpleExoPlayer.getCurrentPosition() + >= simpleExoPlayer.getDuration()) { + return FastSeekDirection.NONE; + } + return FastSeekDirection.FORWARD; + } + /* portion == DisplayPortion.MIDDLE */ + return FastSeekDirection.NONE; + } + + @Override + public void seek(final boolean forward) { + playerGestureListener.keepInDoubleTapMode(); + if (forward) { + fastForward(); + } else { + fastRewind(); + } + } + }); + playerGestureListener.doubleTapControls(binding.fastSeekOverlay); + } + //endregion @@ -635,6 +699,7 @@ public final class Player implements final boolean isMuted = intent.getBooleanExtra(IS_MUTED, isMuted()); /* + * TODO As seen in #7427 this does not work: * There are 3 situations when playback shouldn't be started from scratch (zero timestamp): * 1. User pressed on a timestamp link and the same video should be rewound to the timestamp * 2. User changed a player from, for example. main to popup, or from audio to main, etc @@ -1795,71 +1860,6 @@ public final class Player implements return binding != null && binding.playbackControlRoot.getVisibility() == View.VISIBLE; } - /** - * Show a animation, and depending on goneOnEnd, will stay on the screen or be gone. - * - * @param drawableId the drawable that will be used to animate, - * pass -1 to clear any animation that is visible - * @param goneOnEnd will set the animation view to GONE on the end of the animation - */ - public void showAndAnimateControl(final int drawableId, final boolean goneOnEnd) { - if (DEBUG) { - Log.d(TAG, "showAndAnimateControl() called with: " - + "drawableId = [" + drawableId + "], goneOnEnd = [" + goneOnEnd + "]"); - } - if (controlViewAnimator != null && controlViewAnimator.isRunning()) { - if (DEBUG) { - Log.d(TAG, "showAndAnimateControl: controlViewAnimator.isRunning"); - } - controlViewAnimator.end(); - } - - if (drawableId == -1) { - if (binding.controlAnimationView.getVisibility() == View.VISIBLE) { - controlViewAnimator = ObjectAnimator.ofPropertyValuesHolder( - binding.controlAnimationView, - PropertyValuesHolder.ofFloat(View.ALPHA, 1.0f, 0.0f), - PropertyValuesHolder.ofFloat(View.SCALE_X, 1.4f, 1.0f), - PropertyValuesHolder.ofFloat(View.SCALE_Y, 1.4f, 1.0f) - ).setDuration(DEFAULT_CONTROLS_DURATION); - controlViewAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(final Animator animation) { - binding.controlAnimationView.setVisibility(View.GONE); - } - }); - controlViewAnimator.start(); - } - return; - } - - final float scaleFrom = goneOnEnd ? 1f : 1f; - final float scaleTo = goneOnEnd ? 1.8f : 1.4f; - final float alphaFrom = goneOnEnd ? 1f : 0f; - final float alphaTo = goneOnEnd ? 0f : 1f; - - - controlViewAnimator = ObjectAnimator.ofPropertyValuesHolder( - binding.controlAnimationView, - PropertyValuesHolder.ofFloat(View.ALPHA, alphaFrom, alphaTo), - PropertyValuesHolder.ofFloat(View.SCALE_X, scaleFrom, scaleTo), - PropertyValuesHolder.ofFloat(View.SCALE_Y, scaleFrom, scaleTo) - ); - controlViewAnimator.setDuration(goneOnEnd ? 1000 : 500); - controlViewAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(final Animator animation) { - binding.controlAnimationView.setVisibility(goneOnEnd ? View.GONE : View.VISIBLE); - } - }); - - - binding.controlAnimationView.setVisibility(View.VISIBLE); - binding.controlAnimationView.setImageDrawable( - AppCompatResources.getDrawable(context, drawableId)); - controlViewAnimator.start(); - } - public void showControlsThenHide() { if (DEBUG) { Log.d(TAG, "showControlsThenHide() called"); @@ -1904,6 +1904,7 @@ public final class Player implements } private void showHideShadow(final boolean show, final long duration) { + animate(binding.playbackControlsShadow, show, duration, AnimationType.ALPHA, 0, null); animate(binding.playerTopShadow, show, duration, AnimationType.ALPHA, 0, null); animate(binding.playerBottomShadow, show, duration, AnimationType.ALPHA, 0, null); } @@ -2047,7 +2048,7 @@ public final class Player implements if (currentState == STATE_BLOCKED) { changeState(STATE_BUFFERING); } - simpleExoPlayer.setMediaSource(mediaSource); + simpleExoPlayer.setMediaSource(mediaSource, false); simpleExoPlayer.prepare(); } @@ -2101,8 +2102,8 @@ public final class Player implements startProgressLoop(); } - controlsVisibilityHandler.removeCallbacksAndMessages(null); - animate(binding.playbackControlRoot, false, DEFAULT_CONTROLS_DURATION); + // if we are e.g. switching players, hide controls + hideControls(DEFAULT_CONTROLS_DURATION, 0); binding.playbackSeekBar.setEnabled(false); binding.playbackSeekBar.getThumb() @@ -2129,8 +2130,6 @@ public final class Player implements updateStreamRelatedViews(); - showAndAnimateControl(-1, true); - binding.playbackSeekBar.setEnabled(true); binding.playbackSeekBar.getThumb() .setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN)); @@ -2178,18 +2177,21 @@ public final class Player implements stopProgressLoop(); } - showControls(400); - binding.loadingPanel.setVisibility(View.GONE); - - animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0, - () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow); - animatePlayButtons(true, 200); - if (!isQueueVisible) { - binding.playPauseButton.requestFocus(); - } - }); + // Don't let UI elements popup during double tap seeking. This state is entered sometimes + // during seeking/loading. This if-else check ensures that the controls aren't popping up. + if (!playerGestureListener.isDoubleTapping()) { + showControls(400); + binding.loadingPanel.setVisibility(View.GONE); + animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0, + () -> { + binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow); + animatePlayButtons(true, 200); + if (!isQueueVisible) { + binding.playPauseButton.requestFocus(); + } + }); + } changePopupWindowFlags(IDLE_WINDOW_FLAGS); // Remove running notification when user does not want minimization to background or popup @@ -2207,7 +2209,6 @@ public final class Player implements if (DEBUG) { Log.d(TAG, "onPausedSeek() called"); } - showAndAnimateControl(-1, true); animatePlayButtons(false, 100); binding.getRoot().setKeepScreenOn(true); @@ -2516,23 +2517,11 @@ public final class Player implements Log.e(TAG, "ExoPlayer - onPlayerError() called with:", error); saveStreamProgressState(); - - // create error notification - final ErrorInfo errorInfo; - if (currentMetadata == null) { - errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM, - "Player error[type=" + error.type + "] occurred, currentMetadata is null"); - } else { - errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM, - "Player error[type=" + error.type + "] occurred while playing " - + currentMetadata.getMetadata().getUrl(), - currentMetadata.getMetadata()); - } - ErrorUtil.createNotification(context, errorInfo); + boolean isCatchableException = false; switch (error.type) { case ExoPlaybackException.TYPE_SOURCE: - processSourceError(error.getSourceException()); + isCatchableException = processSourceError(error.getSourceException()); break; case ExoPlaybackException.TYPE_UNEXPECTED: setRecovery(); @@ -2545,22 +2534,60 @@ public final class Player implements break; } + if (isCatchableException) { + return; + } + + createErrorNotification(error); + if (fragmentListener != null) { fragmentListener.onPlayerError(error); } } - private void processSourceError(final IOException error) { - if (exoPlayerIsNull() || playQueue == null) { - return; + private void createErrorNotification(@NonNull final ExoPlaybackException error) { + final ErrorInfo errorInfo; + if (currentMetadata == null) { + errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM, + "Player error[type=" + error.type + "] occurred, currentMetadata is null"); + } else { + errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM, + "Player error[type=" + error.type + "] occurred while playing " + + currentMetadata.getMetadata().getUrl(), + currentMetadata.getMetadata()); } + ErrorUtil.createNotification(context, errorInfo); + } + + /** + * Process an {@link IOException} returned by {@link ExoPlaybackException#getSourceException()} + * for {@link ExoPlaybackException#TYPE_SOURCE} exceptions. + * + *

+ * This method sets the recovery position and sends an error message to the play queue if the + * exception is not a {@link BehindLiveWindowException}. + *

+ * @param error the source error which was thrown by ExoPlayer + * @return whether the exception thrown is a {@link BehindLiveWindowException} ({@code false} + * is always returned if ExoPlayer or the play queue is null) + */ + private boolean processSourceError(final IOException error) { + if (exoPlayerIsNull() || playQueue == null) { + return false; + } + setRecovery(); if (error instanceof BehindLiveWindowException) { - reloadPlayQueueManager(); - } else { - playQueue.error(); + simpleExoPlayer.seekToDefaultPosition(); + simpleExoPlayer.prepare(); + // Inform the user that we are reloading the stream by switching to the buffering state + onBuffering(); + return true; } + + playQueue.error(); + return false; } //endregion @@ -2837,7 +2864,6 @@ public final class Player implements } seekBy(retrieveSeekDurationFromPreferences(this)); triggerProgressUpdate(); - showAndAnimateControl(R.drawable.ic_fast_forward, true); } public void fastRewind() { @@ -2846,7 +2872,6 @@ public final class Player implements } seekBy(-retrieveSeekDurationFromPreferences(this)); triggerProgressUpdate(); - showAndAnimateControl(R.drawable.ic_fast_rewind, true); } //endregion @@ -4278,6 +4303,10 @@ public final class Player implements return binding.currentDisplaySeek; } + public PlayerFastSeekOverlay getFastSeekOverlay() { + return binding.fastSeekOverlay; + } + @Nullable public WindowManager.LayoutParams getPopupLayoutParams() { return popupLayoutParams; diff --git a/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt index 29ae7c5c3..c89eabb47 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt @@ -411,7 +411,7 @@ abstract class BasePlayerGestureListener( var doubleTapControls: DoubleTapListener? = null private set - val isDoubleTapEnabled: Boolean + private val isDoubleTapEnabled: Boolean get() = doubleTapDelay > 0 var isDoubleTapping = false @@ -459,10 +459,6 @@ abstract class BasePlayerGestureListener( doubleTapControls?.onDoubleTapFinished() } - fun enableMultiDoubleTap(enable: Boolean) = apply { - doubleTapDelay = if (enable) DOUBLE_TAP_DELAY else 0 - } - // /////////////////////////////////////////////////////////////////// // Utils // /////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java index 25ace1c05..794fe9b3c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java @@ -55,12 +55,10 @@ public class PlayerGestureListener player.hideControls(0, 0); } - if (portion == DisplayPortion.LEFT) { - player.fastRewind(); + if (portion == DisplayPortion.LEFT || portion == DisplayPortion.RIGHT) { + startMultiDoubleTap(event); } else if (portion == DisplayPortion.MIDDLE) { player.playPause(); - } else if (portion == DisplayPortion.RIGHT) { - player.fastForward(); } } @@ -232,10 +230,10 @@ public class PlayerGestureListener if (DEBUG) { Log.d(TAG, "onPopupResizingStart called"); } - player.showAndAnimateControl(-1, true); player.getLoadingPanel().setVisibility(View.GONE); player.hideControls(0, 0); + animate(player.getFastSeekOverlay(), false, 0); animate(player.getCurrentDisplaySeek(), false, 0, ALPHA, 0); } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java index 708b72ff2..a2f0d7149 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java @@ -9,6 +9,7 @@ import com.google.android.exoplayer2.source.SingleSampleMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.source.hls.playlist.DefaultHlsPlaylistTracker; import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource; import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.upstream.DataSource; @@ -17,9 +18,18 @@ import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.TransferListener; public class PlayerDataSource { + + public static final int LIVE_STREAM_EDGE_GAP_MILLIS = 10000; + + /** + * An approximately 4.3 times greater value than the + * {@link DefaultHlsPlaylistTracker#DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT default} + * to ensure that (very) low latency livestreams which got stuck for a moment don't crash too + * early. + */ + private static final double PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT = 15; private static final int MANIFEST_MINIMUM_RETRY = 5; private static final int EXTRACTOR_MINIMUM_RETRY = Integer.MAX_VALUE; - public static final int LIVE_STREAM_EDGE_GAP_MILLIS = 10000; private final DataSource.Factory cacheDataSourceFactory; private final DataSource.Factory cachelessDataSourceFactory; @@ -44,8 +54,13 @@ public class PlayerDataSource { public HlsMediaSource.Factory getLiveHlsMediaSourceFactory() { return new HlsMediaSource.Factory(cachelessDataSourceFactory) .setAllowChunklessPreparation(true) - .setLoadErrorHandlingPolicy( - new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY)); + .setLoadErrorHandlingPolicy(new DefaultLoadErrorHandlingPolicy( + MANIFEST_MINIMUM_RETRY)) + .setPlaylistTrackerFactory((dataSourceFactory, loadErrorHandlingPolicy, + playlistParserFactory) -> + new DefaultHlsPlaylistTracker(dataSourceFactory, loadErrorHandlingPolicy, + playlistParserFactory, PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT) + ); } public DashMediaSource.Factory getLiveDashMediaSourceFactory() { diff --git a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java index 1e1b03b4f..e08562908 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java @@ -2,7 +2,6 @@ package org.schabi.newpipe.settings; import android.content.ActivityNotFoundException; import android.content.Intent; -import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.widget.Toast; @@ -15,14 +14,10 @@ import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.ThemeHelper; public class AppearanceSettingsFragment extends BasePreferenceFragment { - private static final boolean CAPTIONING_SETTINGS_ACCESSIBLE = - Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - - private String captionSettingsKey; @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.appearance_settings); + addPreferencesFromResourceRegistry(); final String themeKey = getString(R.string.theme_key); // the key of the active theme when settings were opened (or recreated after theme change) @@ -51,16 +46,11 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment { } else { removePreference(nightThemeKey); } - - captionSettingsKey = getString(R.string.caption_settings_key); - if (!CAPTIONING_SETTINGS_ACCESSIBLE) { - removePreference(captionSettingsKey); - } } @Override public boolean onPreferenceTreeClick(final Preference preference) { - if (preference.getKey().equals(captionSettingsKey) && CAPTIONING_SETTINGS_ACCESSIBLE) { + if (preference.getKey().equals(getString(R.string.caption_settings_key))) { try { startActivity(new Intent(Settings.ACTION_CAPTIONING_SETTINGS)); } catch (final ActivityNotFoundException e) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java index a745861ad..619579f3a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java @@ -28,6 +28,11 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat { super.onCreate(savedInstanceState); } + protected void addPreferencesFromResourceRegistry() { + addPreferencesFromResource( + SettingsResourceRegistry.getInstance().getPreferencesResId(this.getClass())); + } + @Override public void onViewCreated(@NonNull final View rootView, @Nullable final Bundle savedInstanceState) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 1c8eb5cd2..47458ad3f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -1,5 +1,8 @@ package org.schabi.newpipe.settings; +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -21,7 +24,6 @@ import org.schabi.newpipe.DownloaderImpl; import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorUtil; -import org.schabi.newpipe.error.ReCaptchaActivity; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.extractor.localization.Localization; @@ -38,9 +40,6 @@ import java.util.Date; import java.util.Locale; import java.util.Objects; -import static org.schabi.newpipe.extractor.utils.Utils.isBlank; -import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; - public class ContentSettingsFragment extends BasePreferenceFragment { private static final String ZIP_MIME_TYPE = "application/zip"; @@ -70,7 +69,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { importExportDataPathKey = getString(R.string.import_export_data_path); youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled); - addPreferencesFromResource(R.xml.content_settings); + addPreferencesFromResourceRegistry(); final Preference importDataPreference = requirePreference(R.string.import_data); importDataPreference.setOnPreferenceClickListener((Preference p) -> { @@ -105,21 +104,6 @@ public class ContentSettingsFragment extends BasePreferenceFragment { .getPreferredContentCountry(requireContext()); initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en"); - final Preference clearCookiePref = requirePreference(R.string.clear_cookie_key); - clearCookiePref.setOnPreferenceClickListener(preference -> { - defaultPreferences.edit() - .putString(getString(R.string.recaptcha_cookies_key), "").apply(); - DownloaderImpl.getInstance().setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, ""); - Toast.makeText(getActivity(), R.string.recaptcha_cookies_cleared, - Toast.LENGTH_SHORT).show(); - clearCookiePref.setVisible(false); - return true; - }); - - if (defaultPreferences.getString(getString(R.string.recaptcha_cookies_key), "").isEmpty()) { - clearCookiePref.setVisible(false); - } - findPreference(getString(R.string.download_thumbnail_key)).setOnPreferenceChangeListener( (preference, newValue) -> { PicassoHelper.setShouldLoadImages((Boolean) newValue); diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java new file mode 100644 index 000000000..395c7c0f0 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java @@ -0,0 +1,108 @@ +package org.schabi.newpipe.settings; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.preference.Preference; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.ErrorUtil; +import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.util.PicassoHelper; + +import java.util.Optional; + +public class DebugSettingsFragment extends BasePreferenceFragment { + private static final String DUMMY = "Dummy"; + + @Override + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResourceRegistry(); + + final Preference allowHeapDumpingPreference + = findPreference(getString(R.string.allow_heap_dumping_key)); + final Preference showMemoryLeaksPreference + = findPreference(getString(R.string.show_memory_leaks_key)); + final Preference showImageIndicatorsPreference + = findPreference(getString(R.string.show_image_indicators_key)); + final Preference crashTheAppPreference + = findPreference(getString(R.string.crash_the_app_key)); + final Preference showErrorSnackbarPreference + = findPreference(getString(R.string.show_error_snackbar_key)); + final Preference createErrorNotificationPreference + = findPreference(getString(R.string.create_error_notification_key)); + + assert allowHeapDumpingPreference != null; + assert showMemoryLeaksPreference != null; + assert showImageIndicatorsPreference != null; + assert crashTheAppPreference != null; + assert showErrorSnackbarPreference != null; + assert createErrorNotificationPreference != null; + + final Optional optBVLeakCanary = getBVDLeakCanary(); + + allowHeapDumpingPreference.setEnabled(optBVLeakCanary.isPresent()); + showMemoryLeaksPreference.setEnabled(optBVLeakCanary.isPresent()); + + if (optBVLeakCanary.isPresent()) { + final DebugSettingsBVDLeakCanaryAPI pdLeakCanary = optBVLeakCanary.get(); + + showMemoryLeaksPreference.setOnPreferenceClickListener(preference -> { + startActivity(pdLeakCanary.getNewLeakDisplayActivityIntent()); + return true; + }); + } else { + allowHeapDumpingPreference.setSummary(R.string.leak_canary_not_available); + showMemoryLeaksPreference.setSummary(R.string.leak_canary_not_available); + } + + showImageIndicatorsPreference.setOnPreferenceChangeListener((preference, newValue) -> { + PicassoHelper.setIndicatorsEnabled((Boolean) newValue); + return true; + }); + + crashTheAppPreference.setOnPreferenceClickListener(preference -> { + throw new RuntimeException(DUMMY); + }); + + showErrorSnackbarPreference.setOnPreferenceClickListener(preference -> { + ErrorUtil.showUiErrorSnackbar(DebugSettingsFragment.this, + DUMMY, new RuntimeException(DUMMY)); + return true; + }); + + createErrorNotificationPreference.setOnPreferenceClickListener(preference -> { + ErrorUtil.createNotification(requireContext(), + new ErrorInfo(new RuntimeException(DUMMY), UserAction.UI_ERROR, DUMMY)); + return true; + }); + } + + /** + * Tries to find the {@link DebugSettingsBVDLeakCanaryAPI#IMPL_CLASS} and loads it if available. + * @return An {@link Optional} which is empty if the implementation class couldn't be loaded. + */ + private Optional getBVDLeakCanary() { + try { + // Try to find the implementation of the LeakCanary API + return Optional.of((DebugSettingsBVDLeakCanaryAPI) + Class.forName(DebugSettingsBVDLeakCanaryAPI.IMPL_CLASS) + .getDeclaredConstructor() + .newInstance()); + } catch (final Exception e) { + return Optional.empty(); + } + } + + /** + * Build variant dependent (BVD) leak canary API for this fragment. + * Why is LeakCanary not used directly? Because it can't be assured + */ + public interface DebugSettingsBVDLeakCanaryAPI { + String IMPL_CLASS = + "org.schabi.newpipe.settings.DebugSettingsBVDLeakCanary"; + + Intent getNewLeakDisplayActivityIntent(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index 681aee409..fe327e1b5 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -54,7 +54,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.download_settings); + addPreferencesFromResourceRegistry(); downloadPathVideoPreference = getString(R.string.download_path_video_key); downloadPathAudioPreference = getString(R.string.download_path_audio_key); diff --git a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java index 33e0ba16b..86e651e2b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java @@ -8,9 +8,11 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; +import org.schabi.newpipe.DownloaderImpl; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; +import org.schabi.newpipe.error.ReCaptchaActivity; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.InfoCache; @@ -29,7 +31,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.history_settings); + addPreferencesFromResourceRegistry(); cacheWipeKey = getString(R.string.metadata_cache_wipe_key); viewsHistoryClearKey = getString(R.string.clear_views_history_key); @@ -37,6 +39,21 @@ public class HistorySettingsFragment extends BasePreferenceFragment { searchHistoryClearKey = getString(R.string.clear_search_history_key); recordManager = new HistoryRecordManager(getActivity()); disposables = new CompositeDisposable(); + + final Preference clearCookiePref = requirePreference(R.string.clear_cookie_key); + clearCookiePref.setOnPreferenceClickListener(preference -> { + defaultPreferences.edit() + .putString(getString(R.string.recaptcha_cookies_key), "").apply(); + DownloaderImpl.getInstance().setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, ""); + Toast.makeText(getActivity(), R.string.recaptcha_cookies_cleared, + Toast.LENGTH_SHORT).show(); + clearCookiePref.setEnabled(false); + return true; + }); + + if (defaultPreferences.getString(getString(R.string.recaptcha_cookies_key), "").isEmpty()) { + clearCookiePref.setEnabled(false); + } } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java index 12599b828..d7fb559d6 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java @@ -1,8 +1,11 @@ package org.schabi.newpipe.settings; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; -import androidx.preference.Preference; +import androidx.annotation.NonNull; import org.schabi.newpipe.App; import org.schabi.newpipe.CheckForNewAppVersion; @@ -12,16 +15,58 @@ import org.schabi.newpipe.R; public class MainSettingsFragment extends BasePreferenceFragment { public static final boolean DEBUG = MainActivity.DEBUG; + private SettingsActivity settingsActivity; + @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.main_settings); + addPreferencesFromResourceRegistry(); + setHasOptionsMenu(true); // Otherwise onCreateOptionsMenu is not called + + // Check if the app is updatable if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) { - final Preference update - = findPreference(getString(R.string.update_pref_screen_key)); - getPreferenceScreen().removePreference(update); + getPreferenceScreen().removePreference( + findPreference(getString(R.string.update_pref_screen_key))); defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply(); } + + // Hide debug preferences in RELEASE build variant + if (!DEBUG) { + getPreferenceScreen().removePreference( + findPreference(getString(R.string.debug_pref_screen_key))); + } + } + + @Override + public void onCreateOptionsMenu( + @NonNull final Menu menu, + @NonNull final MenuInflater inflater + ) { + super.onCreateOptionsMenu(menu, inflater); + + // -- Link settings activity and register menu -- + settingsActivity = (SettingsActivity) getActivity(); + + inflater.inflate(R.menu.menu_settings_main_fragment, menu); + + final MenuItem menuSearchItem = menu.getItem(0); + + settingsActivity.setMenuSearchItem(menuSearchItem); + + menuSearchItem.setOnMenuItemClickListener(ev -> { + settingsActivity.setSearchActive(true); + return true; + }); + } + + @Override + public void onDestroy() { + // Unlink activity so that we don't get memory problems + if (settingsActivity != null) { + settingsActivity.setMenuSearchItem(null); + settingsActivity = null; + } + super.onDestroy(); } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt index e03aa4074..6bea8b69e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt @@ -7,7 +7,7 @@ import org.schabi.newpipe.R class NotificationSettingsFragment : BasePreferenceFragment() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.notification_settings) + addPreferencesFromResourceRegistry() if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { val colorizePref: Preference? = findPreference(getString(R.string.notification_colorize_key)) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index a766ee074..383390506 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.settings; -import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -51,16 +50,11 @@ public class SelectKioskFragment extends DialogFragment { private SelectKioskAdapter selectKioskAdapter = null; private OnSelectedListener onSelectedListener = null; - private OnCancelListener onCancelListener = null; public void setOnSelectedListener(final OnSelectedListener listener) { onSelectedListener = listener; } - public void setOnCancelListener(final OnCancelListener listener) { - onCancelListener = listener; - } - /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ @@ -91,14 +85,6 @@ public class SelectKioskFragment extends DialogFragment { // Handle actions //////////////////////////////////////////////////////////////////////////*/ - @Override - public void onCancel(@NonNull final DialogInterface dialogInterface) { - super.onCancel(dialogInterface); - if (onCancelListener != null) { - onCancelListener.onCancel(); - } - } - private void clickedItem(final SelectKioskAdapter.Entry entry) { if (onSelectedListener != null) { onSelectedListener.onKioskSelected(entry.serviceId, entry.kioskId, entry.kioskName); @@ -114,10 +100,6 @@ public class SelectKioskFragment extends DialogFragment { void onKioskSelected(int serviceId, String kioskId, String kioskName); } - public interface OnCancelListener { - void onCancel(); - } - private class SelectKioskAdapter extends RecyclerView.Adapter { private final List kioskList = new Vector<>(); diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index 02e2538c5..3872e5172 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -1,22 +1,48 @@ package org.schabi.newpipe.settings; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.View; +import android.widget.EditText; +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import com.jakewharton.rxbinding4.widget.RxTextView; + +import org.schabi.newpipe.App; +import org.schabi.newpipe.CheckForNewAppVersion; +import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.SettingsLayoutBinding; +import org.schabi.newpipe.settings.preferencesearch.PreferenceParser; +import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchConfiguration; +import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchFragment; +import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchItem; +import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchResultHighlighter; +import org.schabi.newpipe.settings.preferencesearch.PreferenceSearchResultListener; +import org.schabi.newpipe.settings.preferencesearch.PreferenceSearcher; import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.KeyboardUtil; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.views.FocusOverlayView; -import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; +import java.util.concurrent.TimeUnit; + +import icepick.Icepick; +import icepick.State; /* * Created by Christian Schabesberger on 31.08.15. @@ -38,21 +64,54 @@ import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; * along with NewPipe. If not, see . */ -public class SettingsActivity extends AppCompatActivity - implements BasePreferenceFragment.OnPreferenceStartFragmentCallback { +public class SettingsActivity extends AppCompatActivity implements + PreferenceFragmentCompat.OnPreferenceStartFragmentCallback, + PreferenceSearchResultListener { + private static final String TAG = "SettingsActivity"; + private static final boolean DEBUG = MainActivity.DEBUG; + + @IdRes + private static final int FRAGMENT_HOLDER_ID = R.id.settings_fragment_holder; + + private PreferenceSearchFragment searchFragment; + + @Nullable + private MenuItem menuSearchItem; + + private View searchContainer; + private EditText searchEditText; + + // State + @State + String searchText; + @State + boolean wasSearchActive; + @Override protected void onCreate(final Bundle savedInstanceBundle) { setTheme(ThemeHelper.getSettingsThemeStyle(this)); assureCorrectAppLanguage(this); + super.onCreate(savedInstanceBundle); + Icepick.restoreInstanceState(this, savedInstanceBundle); + final boolean restored = savedInstanceBundle != null; final SettingsLayoutBinding settingsLayoutBinding = SettingsLayoutBinding.inflate(getLayoutInflater()); setContentView(settingsLayoutBinding.getRoot()); + initSearch(settingsLayoutBinding, restored); setSupportActionBar(settingsLayoutBinding.settingsToolbarLayout.toolbar); - if (savedInstanceBundle == null) { + if (restored) { + // Restore state + if (this.wasSearchActive) { + setSearchActive(true); + if (!TextUtils.isEmpty(this.searchText)) { + this.searchEditText.setText(this.searchText); + } + } + } else { getSupportFragmentManager().beginTransaction() .replace(R.id.settings_fragment_holder, new MainSettingsFragment()) .commit(); @@ -63,6 +122,12 @@ public class SettingsActivity extends AppCompatActivity } } + @Override + protected void onSaveInstanceState(@NonNull final Bundle outState) { + super.onSaveInstanceState(outState); + Icepick.saveInstanceState(this, outState); + } + @Override public boolean onCreateOptionsMenu(final Menu menu) { final ActionBar actionBar = getSupportActionBar(); @@ -74,10 +139,25 @@ public class SettingsActivity extends AppCompatActivity return super.onCreateOptionsMenu(menu); } + @Override + public void onBackPressed() { + if (isSearchActive()) { + setSearchActive(false); + return; + } + super.onBackPressed(); + } + @Override public boolean onOptionsItemSelected(final MenuItem item) { final int id = item.getItemId(); if (id == android.R.id.home) { + // Check if the search is active and if so: Close it + if (isSearchActive()) { + setSearchActive(false); + return true; + } + if (getSupportFragmentManager().getBackStackEntryCount() == 0) { finish(); } else { @@ -91,14 +171,221 @@ public class SettingsActivity extends AppCompatActivity @Override public boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller, final Preference preference) { - final Fragment fragment = Fragment - .instantiate(this, preference.getFragment(), preference.getExtras()); + showSettingsFragment(instantiateFragment(preference.getFragment())); + return true; + } + + private Fragment instantiateFragment(@NonNull final String className) { + return getSupportFragmentManager() + .getFragmentFactory() + .instantiate(this.getClassLoader(), className); + } + + private void showSettingsFragment(final Fragment fragment) { getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out, R.animator.custom_fade_in, R.animator.custom_fade_out) - .replace(R.id.settings_fragment_holder, fragment) + .replace(FRAGMENT_HOLDER_ID, fragment) .addToBackStack(null) .commit(); - return true; } + + @Override + protected void onDestroy() { + setMenuSearchItem(null); + searchFragment = null; + super.onDestroy(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Search + //////////////////////////////////////////////////////////////////////////*/ + //region Search + + private void initSearch( + final SettingsLayoutBinding settingsLayoutBinding, + final boolean restored + ) { + searchContainer = + settingsLayoutBinding.settingsToolbarLayout.toolbar + .findViewById(R.id.toolbar_search_container); + + // Configure input field for search + searchEditText = searchContainer.findViewById(R.id.toolbar_search_edit_text); + RxTextView.textChanges(searchEditText) + // Wait some time after the last input before actually searching + .debounce(200, TimeUnit.MILLISECONDS) + .subscribe(v -> runOnUiThread(this::onSearchChanged)); + + // Configure clear button + searchContainer.findViewById(R.id.toolbar_search_clear) + .setOnClickListener(ev -> resetSearchText()); + + ensureSearchRepresentsApplicationState(); + + // Build search configuration using SettingsResourceRegistry + final PreferenceSearchConfiguration config = new PreferenceSearchConfiguration(); + + + // Build search items + final PreferenceParser parser = new PreferenceParser(getApplicationContext(), config); + final PreferenceSearcher searcher = new PreferenceSearcher(config); + + // Find all searchable SettingsResourceRegistry fragments + SettingsResourceRegistry.getInstance().getAllEntries().stream() + .filter(SettingsResourceRegistry.SettingRegistryEntry::isSearchable) + // Get the resId + .map(SettingsResourceRegistry.SettingRegistryEntry::getPreferencesResId) + // Parse + .map(parser::parse) + // Add it to the searcher + .forEach(searcher::add); + + if (restored) { + searchFragment = (PreferenceSearchFragment) getSupportFragmentManager() + .findFragmentByTag(PreferenceSearchFragment.NAME); + if (searchFragment != null) { + // Hide/Remove the search fragment otherwise we get an exception + // when adding it (because it's already present) + hideSearchFragment(); + } + } + if (searchFragment == null) { + searchFragment = new PreferenceSearchFragment(); + } + searchFragment.setSearcher(searcher); + } + + /** + * Ensures that the search shows the correct/available search results. + *
+ * Some features are e.g. only available for debug builds, these should not + * be found when searching inside a release. + */ + private void ensureSearchRepresentsApplicationState() { + // Check if the update settings are available + if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) { + SettingsResourceRegistry.getInstance() + .getEntryByPreferencesResId(R.xml.update_settings) + .setSearchable(false); + } + + // Hide debug preferences in RELEASE build variant + if (DEBUG) { + SettingsResourceRegistry.getInstance() + .getEntryByPreferencesResId(R.xml.debug_settings) + .setSearchable(true); + } + } + + public void setMenuSearchItem(final MenuItem menuSearchItem) { + this.menuSearchItem = menuSearchItem; + + // Ensure that the item is in the correct state when adding it. This is due to + // Android's lifecycle (the Activity is recreated before the Fragment that registers this) + if (menuSearchItem != null) { + menuSearchItem.setVisible(!isSearchActive()); + } + } + + public void setSearchActive(final boolean active) { + if (DEBUG) { + Log.d(TAG, "setSearchActive called active=" + active); + } + + // Ignore if search is already in correct state + if (isSearchActive() == active) { + return; + } + + wasSearchActive = active; + + searchContainer.setVisibility(active ? View.VISIBLE : View.GONE); + if (menuSearchItem != null) { + menuSearchItem.setVisible(!active); + } + + if (active) { + getSupportFragmentManager() + .beginTransaction() + .add(FRAGMENT_HOLDER_ID, searchFragment, PreferenceSearchFragment.NAME) + .addToBackStack(PreferenceSearchFragment.NAME) + .commit(); + + KeyboardUtil.showKeyboard(this, searchEditText); + } else if (searchFragment != null) { + hideSearchFragment(); + getSupportFragmentManager() + .popBackStack( + PreferenceSearchFragment.NAME, + FragmentManager.POP_BACK_STACK_INCLUSIVE); + + KeyboardUtil.hideKeyboard(this, searchEditText); + } + + resetSearchText(); + } + + private void hideSearchFragment() { + getSupportFragmentManager().beginTransaction().remove(searchFragment).commit(); + } + + private void resetSearchText() { + searchEditText.setText(""); + } + + private boolean isSearchActive() { + return searchContainer.getVisibility() == View.VISIBLE; + } + + private void onSearchChanged() { + if (!isSearchActive()) { + return; + } + + if (searchFragment != null) { + searchText = this.searchEditText.getText().toString(); + searchFragment.updateSearchResults(searchText); + } + } + + @Override + public void onSearchResultClicked(@NonNull final PreferenceSearchItem result) { + if (DEBUG) { + Log.d(TAG, "onSearchResultClicked called result=" + result); + } + + // Hide the search + setSearchActive(false); + + // -- Highlight the result -- + // Find out which fragment class we need + final Class targetedFragmentClass = + SettingsResourceRegistry.getInstance() + .getFragmentClass(result.getSearchIndexItemResId()); + + if (targetedFragmentClass == null) { + // This should never happen + Log.w(TAG, "Unable to locate fragment class for resId=" + + result.getSearchIndexItemResId()); + return; + } + + // Check if the currentFragment is the one which contains the result + Fragment currentFragment = + getSupportFragmentManager().findFragmentById(FRAGMENT_HOLDER_ID); + if (!targetedFragmentClass.equals(currentFragment.getClass())) { + // If it's not the correct one display the correct one + currentFragment = instantiateFragment(targetedFragmentClass.getName()); + showSettingsFragment(currentFragment); + } + + // Run the highlighting + if (currentFragment instanceof PreferenceFragmentCompat) { + PreferenceSearchResultHighlighter + .highlight(result, (PreferenceFragmentCompat) currentFragment); + } + } + + //endregion } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java new file mode 100644 index 000000000..c4751abea --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java @@ -0,0 +1,148 @@ +package org.schabi.newpipe.settings; + +import androidx.annotation.NonNull; +import androidx.annotation.XmlRes; +import androidx.fragment.app.Fragment; + +import org.schabi.newpipe.R; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +/** + * A registry that contains information about SettingsFragments. + *
+ * includes: + *
    + *
  • Class of the SettingsFragment
  • + *
  • XML-Resource
  • + *
  • ...
  • + *
+ * + * E.g. used by the preference search. + */ +public final class SettingsResourceRegistry { + + private static final SettingsResourceRegistry INSTANCE = new SettingsResourceRegistry(); + + private final Set registeredEntries = new HashSet<>(); + + private SettingsResourceRegistry() { + add(MainSettingsFragment.class, R.xml.main_settings).setSearchable(false); + + add(AppearanceSettingsFragment.class, R.xml.appearance_settings); + add(ContentSettingsFragment.class, R.xml.content_settings); + add(DebugSettingsFragment.class, R.xml.debug_settings).setSearchable(false); + add(DownloadSettingsFragment.class, R.xml.download_settings); + add(HistorySettingsFragment.class, R.xml.history_settings); + add(NotificationSettingsFragment.class, R.xml.notification_settings); + add(UpdateSettingsFragment.class, R.xml.update_settings); + add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings); + } + + private SettingRegistryEntry add( + @NonNull final Class fragmentClass, + @XmlRes final int preferencesResId + ) { + final SettingRegistryEntry entry = + new SettingRegistryEntry(fragmentClass, preferencesResId); + this.registeredEntries.add(entry); + return entry; + } + + public SettingRegistryEntry getEntryByFragmentClass( + final Class fragmentClass + ) { + Objects.requireNonNull(fragmentClass); + return registeredEntries.stream() + .filter(e -> Objects.equals(e.getFragmentClass(), fragmentClass)) + .findFirst() + .orElse(null); + } + + public SettingRegistryEntry getEntryByPreferencesResId(@XmlRes final int preferencesResId) { + return registeredEntries.stream() + .filter(e -> Objects.equals(e.getPreferencesResId(), preferencesResId)) + .findFirst() + .orElse(null); + } + + public int getPreferencesResId(@NonNull final Class fragmentClass) { + final SettingRegistryEntry entry = getEntryByFragmentClass(fragmentClass); + if (entry == null) { + return -1; + } + return entry.getPreferencesResId(); + } + + public Class getFragmentClass(@XmlRes final int preferencesResId) { + final SettingRegistryEntry entry = getEntryByPreferencesResId(preferencesResId); + if (entry == null) { + return null; + } + return entry.getFragmentClass(); + } + + public Set getAllEntries() { + return new HashSet<>(registeredEntries); + } + + public static SettingsResourceRegistry getInstance() { + return INSTANCE; + } + + + public static class SettingRegistryEntry { + @NonNull + private final Class fragmentClass; + @XmlRes + private final int preferencesResId; + + private boolean searchable = true; + + public SettingRegistryEntry( + @NonNull final Class fragmentClass, + @XmlRes final int preferencesResId + ) { + this.fragmentClass = Objects.requireNonNull(fragmentClass); + this.preferencesResId = preferencesResId; + } + + @SuppressWarnings("HiddenField") + public SettingRegistryEntry setSearchable(final boolean searchable) { + this.searchable = searchable; + return this; + } + + public Class getFragmentClass() { + return fragmentClass; + } + + public int getPreferencesResId() { + return preferencesResId; + } + + public boolean isSearchable() { + return searchable; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final SettingRegistryEntry that = (SettingRegistryEntry) o; + return getPreferencesResId() == that.getPreferencesResId() + && getFragmentClass().equals(that.getFragmentClass()); + } + + @Override + public int hashCode() { + return Objects.hash(getFragmentClass(), getPreferencesResId()); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java index bc183d08a..04bad3815 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -38,7 +38,7 @@ public class UpdateSettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.update_settings); + addPreferencesFromResourceRegistry(); findPreference(getString(R.string.update_app_key)) .setOnPreferenceChangeListener(updatePreferenceChange); 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 c0d274fe0..039f00c1d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -23,7 +23,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.video_audio_settings); + addPreferencesFromResourceRegistry(); updateSeekOptions(); diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java new file mode 100644 index 000000000..7c231cafb --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java @@ -0,0 +1,111 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import android.text.TextUtils; + +import org.apache.commons.text.similarity.FuzzyScore; + +import java.util.Comparator; +import java.util.Locale; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + +public class PreferenceFuzzySearchFunction + implements PreferenceSearchConfiguration.PreferenceSearchFunction { + + private static final FuzzyScore FUZZY_SCORE = new FuzzyScore(Locale.ROOT); + + @Override + public Stream search( + final Stream allAvailable, + final String keyword + ) { + final int maxScore = (keyword.length() + 1) * 3 - 2; // First can't get +2 bonus score + + return allAvailable + // General search + // Check all fields if anyone contains something that kind of matches the keyword + .map(item -> new FuzzySearchGeneralDTO(item, keyword)) + .filter(dto -> dto.getScore() / maxScore >= 0.3f) + .map(FuzzySearchGeneralDTO::getItem) + // Specific search - Used for determining order of search results + // Calculate a score based on specific search fields + .map(item -> new FuzzySearchSpecificDTO(item, keyword)) + .sorted(Comparator.comparing(FuzzySearchSpecificDTO::getScore).reversed()) + .map(FuzzySearchSpecificDTO::getItem) + // Limit the amount of search results + .limit(20); + } + + static class FuzzySearchGeneralDTO { + private final PreferenceSearchItem item; + private final float score; + + FuzzySearchGeneralDTO( + final PreferenceSearchItem item, + final String keyword) { + this.item = item; + this.score = FUZZY_SCORE.fuzzyScore( + TextUtils.join(";", item.getAllRelevantSearchFields()), + keyword); + } + + public PreferenceSearchItem getItem() { + return item; + } + + public float getScore() { + return score; + } + } + + static class FuzzySearchSpecificDTO { + private static final Map, Float> WEIGHT_MAP = Map.of( + // The user will most likely look for the title -> prioritize it + PreferenceSearchItem::getTitle, 1.5f, + // The summary is also important as it usually contains a larger desc + // Example: Searching for '4k' → 'show higher resolution' is shown + PreferenceSearchItem::getSummary, 1f, + // Entries are also important as they provide all known/possible values + // Example: Searching where the resolution can be changed to 720p + PreferenceSearchItem::getEntries, 1f + ); + + private final PreferenceSearchItem item; + private final float score; + + FuzzySearchSpecificDTO( + final PreferenceSearchItem item, + final String keyword) { + this.item = item; + + float attributeScoreSum = 0; + int countOfAttributesWithScore = 0; + for (final Map.Entry, Float> we + : WEIGHT_MAP.entrySet()) { + final String valueToProcess = we.getKey().apply(item); + if (valueToProcess.isEmpty()) { + continue; + } + + attributeScoreSum += + FUZZY_SCORE.fuzzyScore(valueToProcess, keyword) * we.getValue(); + countOfAttributesWithScore++; + } + + if (countOfAttributesWithScore != 0) { + this.score = attributeScoreSum / countOfAttributesWithScore; + } else { + this.score = 0; + } + } + + public PreferenceSearchItem getItem() { + return item; + } + + public float getScore() { + return score; + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java new file mode 100644 index 000000000..1f507c7f1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java @@ -0,0 +1,199 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.XmlRes; +import androidx.preference.PreferenceManager; + +import org.xmlpull.v1.XmlPullParser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Parses the corresponding preference-file(s). + */ +public class PreferenceParser { + private static final String TAG = "PreferenceParser"; + + private static final String NS_ANDROID = "http://schemas.android.com/apk/res/android"; + private static final String NS_SEARCH = "http://schemas.android.com/apk/preferencesearch"; + + private final Context context; + private final Map allPreferences; + private final PreferenceSearchConfiguration searchConfiguration; + + public PreferenceParser( + final Context context, + final PreferenceSearchConfiguration searchConfiguration + ) { + this.context = context; + this.allPreferences = PreferenceManager.getDefaultSharedPreferences(context).getAll(); + this.searchConfiguration = searchConfiguration; + } + + public List parse( + @XmlRes final int resId + ) { + final List results = new ArrayList<>(); + final XmlPullParser xpp = context.getResources().getXml(resId); + + try { + xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); + xpp.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true); + + final List breadcrumbs = new ArrayList<>(); + while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) { + if (xpp.getEventType() == XmlPullParser.START_TAG) { + final PreferenceSearchItem result = parseSearchResult( + xpp, + joinBreadcrumbs(breadcrumbs), + resId + ); + + if (!searchConfiguration.getParserIgnoreElements().contains(xpp.getName()) + && result.hasData() + && !"true".equals(getAttribute(xpp, NS_SEARCH, "ignore"))) { + results.add(result); + } + if (searchConfiguration.getParserContainerElements().contains(xpp.getName())) { + // This code adds breadcrumbs for certain containers (e.g. PreferenceScreen) + // Example: Video and Audio > Player + breadcrumbs.add(result.getTitle() == null ? "" : result.getTitle()); + } + } else if (xpp.getEventType() == XmlPullParser.END_TAG + && searchConfiguration.getParserContainerElements() + .contains(xpp.getName())) { + breadcrumbs.remove(breadcrumbs.size() - 1); + } + + xpp.next(); + } + } catch (final Exception e) { + Log.w(TAG, "Failed to parse resid=" + resId, e); + } + return results; + } + + private String joinBreadcrumbs(final List breadcrumbs) { + return breadcrumbs.stream() + .filter(crumb -> !TextUtils.isEmpty(crumb)) + .collect(Collectors.joining(" > ")); + } + + private String getAttribute( + final XmlPullParser xpp, + @NonNull final String attribute + ) { + final String nsSearchAttr = getAttribute(xpp, NS_SEARCH, attribute); + if (nsSearchAttr != null) { + return nsSearchAttr; + } + return getAttribute(xpp, NS_ANDROID, attribute); + } + + private String getAttribute( + final XmlPullParser xpp, + @NonNull final String namespace, + @NonNull final String attribute + ) { + return xpp.getAttributeValue(namespace, attribute); + } + + private PreferenceSearchItem parseSearchResult( + final XmlPullParser xpp, + final String breadcrumbs, + @XmlRes final int searchIndexItemResId + ) { + final String key = readString(getAttribute(xpp, "key")); + final String[] entries = readStringArray(getAttribute(xpp, "entries")); + final String[] entryValues = readStringArray(getAttribute(xpp, "entryValues")); + + return new PreferenceSearchItem( + key, + tryFillInPreferenceValue( + readString(getAttribute(xpp, "title")), + key, + entries, + entryValues), + tryFillInPreferenceValue( + readString(getAttribute(xpp, "summary")), + key, + entries, + entryValues), + TextUtils.join(",", entries), + breadcrumbs, + searchIndexItemResId + ); + } + + private String[] readStringArray(@Nullable final String s) { + if (s == null) { + return new String[0]; + } + if (s.startsWith("@")) { + try { + return context.getResources().getStringArray(Integer.parseInt(s.substring(1))); + } catch (final Exception e) { + Log.w(TAG, "Unable to readStringArray from '" + s + "'", e); + } + } + return new String[0]; + } + + private String readString(@Nullable final String s) { + if (s == null) { + return ""; + } + if (s.startsWith("@")) { + try { + return context.getString(Integer.parseInt(s.substring(1))); + } catch (final Exception e) { + Log.w(TAG, "Unable to readString from '" + s + "'", e); + } + } + return s; + } + + private String tryFillInPreferenceValue( + @Nullable final String s, + @Nullable final String key, + final String[] entries, + final String[] entryValues + ) { + if (s == null) { + return ""; + } + if (key == null) { + return s; + } + + // Resolve value + Object prefValue = allPreferences.get(key); + if (prefValue == null) { + return s; + } + + /* + * Resolve ListPreference values + * + * entryValues = Values/Keys that are saved + * entries = Actual human readable names + */ + if (entries.length > 0 && entryValues.length == entries.length) { + final int entryIndex = Arrays.asList(entryValues).indexOf(prefValue); + if (entryIndex != -1) { + prefValue = entries[entryIndex]; + } + } + + return String.format(s, prefValue.toString()); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java new file mode 100644 index 000000000..02fbf9577 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java @@ -0,0 +1,87 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.schabi.newpipe.databinding.SettingsPreferencesearchListItemResultBinding; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +class PreferenceSearchAdapter + extends RecyclerView.Adapter { + private List dataset = new ArrayList<>(); + private Consumer onItemClickListener; + + @NonNull + @Override + public PreferenceViewHolder onCreateViewHolder( + @NonNull final ViewGroup parent, + final int viewType + ) { + return new PreferenceViewHolder( + SettingsPreferencesearchListItemResultBinding.inflate( + LayoutInflater.from(parent.getContext()), + parent, + false)); + } + + @Override + public void onBindViewHolder( + @NonNull final PreferenceViewHolder holder, + final int position + ) { + final PreferenceSearchItem item = dataset.get(position); + + holder.binding.title.setText(item.getTitle()); + + if (TextUtils.isEmpty(item.getSummary())) { + holder.binding.summary.setVisibility(View.GONE); + } else { + holder.binding.summary.setVisibility(View.VISIBLE); + holder.binding.summary.setText(item.getSummary()); + } + + if (TextUtils.isEmpty(item.getBreadcrumbs())) { + holder.binding.breadcrumbs.setVisibility(View.GONE); + } else { + holder.binding.breadcrumbs.setVisibility(View.VISIBLE); + holder.binding.breadcrumbs.setText(item.getBreadcrumbs()); + } + + holder.itemView.setOnClickListener(v -> { + if (onItemClickListener != null) { + onItemClickListener.accept(item); + } + }); + } + + void setContent(final List items) { + dataset = new ArrayList<>(items); + this.notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return dataset.size(); + } + + void setOnItemClickListener(final Consumer onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + static class PreferenceViewHolder extends RecyclerView.ViewHolder { + final SettingsPreferencesearchListItemResultBinding binding; + + PreferenceViewHolder(final SettingsPreferencesearchListItemResultBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java new file mode 100644 index 000000000..5835dcab5 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java @@ -0,0 +1,43 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceScreen; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; + +public class PreferenceSearchConfiguration { + private PreferenceSearchFunction searcher = new PreferenceFuzzySearchFunction(); + + private final List parserIgnoreElements = Arrays.asList( + PreferenceCategory.class.getSimpleName()); + private final List parserContainerElements = Arrays.asList( + PreferenceCategory.class.getSimpleName(), + PreferenceScreen.class.getSimpleName()); + + + public void setSearcher(final PreferenceSearchFunction searcher) { + this.searcher = Objects.requireNonNull(searcher); + } + + public PreferenceSearchFunction getSearcher() { + return searcher; + } + + public List getParserIgnoreElements() { + return parserIgnoreElements; + } + + public List getParserContainerElements() { + return parserContainerElements; + } + + @FunctionalInterface + public interface PreferenceSearchFunction { + Stream search( + Stream allAvailable, + String keyword); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java new file mode 100644 index 000000000..308abbc4e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java @@ -0,0 +1,80 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; + +import org.schabi.newpipe.databinding.SettingsPreferencesearchFragmentBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * Displays the search results. + */ +public class PreferenceSearchFragment extends Fragment { + public static final String NAME = PreferenceSearchFragment.class.getSimpleName(); + + private PreferenceSearcher searcher; + + private SettingsPreferencesearchFragmentBinding binding; + private PreferenceSearchAdapter adapter; + + public void setSearcher(final PreferenceSearcher searcher) { + this.searcher = searcher; + } + + @Nullable + @Override + public View onCreateView( + @NonNull final LayoutInflater inflater, + @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState + ) { + binding = SettingsPreferencesearchFragmentBinding.inflate(inflater, container, false); + + binding.searchResults.setLayoutManager(new LinearLayoutManager(getContext())); + + adapter = new PreferenceSearchAdapter(); + adapter.setOnItemClickListener(this::onItemClicked); + binding.searchResults.setAdapter(adapter); + + return binding.getRoot(); + } + + public void updateSearchResults(final String keyword) { + if (adapter == null || searcher == null) { + return; + } + + final List results = + !TextUtils.isEmpty(keyword) + ? searcher.searchFor(keyword) + : new ArrayList<>(); + + adapter.setContent(new ArrayList<>(results)); + + setEmptyViewShown(results.isEmpty()); + } + + private void setEmptyViewShown(final boolean shown) { + binding.emptyStateView.setVisibility(shown ? View.VISIBLE : View.GONE); + binding.searchResults.setVisibility(shown ? View.GONE : View.VISIBLE); + } + + public void onItemClicked(final PreferenceSearchItem item) { + if (!(getActivity() instanceof PreferenceSearchResultListener)) { + throw new ClassCastException( + getActivity().toString() + " must implement SearchPreferenceResultListener"); + } + + ((PreferenceSearchResultListener) getActivity()).onSearchResultClicked(item); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java new file mode 100644 index 000000000..52935ef8e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java @@ -0,0 +1,102 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import androidx.annotation.NonNull; +import androidx.annotation.XmlRes; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * Represents a preference-item inside the search. + */ +public class PreferenceSearchItem { + /** + * Key of the setting/preference. E.g. used inside {@link android.content.SharedPreferences}. + */ + @NonNull + private final String key; + /** + * Title of the setting, e.g. 'Default resolution' or 'Show higher resolutions'. + */ + @NonNull + private final String title; + /** + * Summary of the setting, e.g. '480p' or 'Only some devices can play 2k/4k'. + */ + @NonNull + private final String summary; + /** + * Possible entries of the setting, e.g. 480p,720p,... + */ + @NonNull + private final String entries; + /** + * Breadcrumbs - a hint where the setting is located e.g. 'Video and Audio > Player' + */ + @NonNull + private final String breadcrumbs; + /** + * The xml-resource where this item was found/built from. + */ + @XmlRes + private final int searchIndexItemResId; + + public PreferenceSearchItem( + @NonNull final String key, + @NonNull final String title, + @NonNull final String summary, + @NonNull final String entries, + @NonNull final String breadcrumbs, + @XmlRes final int searchIndexItemResId + ) { + this.key = Objects.requireNonNull(key); + this.title = Objects.requireNonNull(title); + this.summary = Objects.requireNonNull(summary); + this.entries = Objects.requireNonNull(entries); + this.breadcrumbs = Objects.requireNonNull(breadcrumbs); + this.searchIndexItemResId = searchIndexItemResId; + } + + public String getKey() { + return key; + } + + public String getTitle() { + return title; + } + + public String getSummary() { + return summary; + } + + public String getEntries() { + return entries; + } + + public String getBreadcrumbs() { + return breadcrumbs; + } + + public int getSearchIndexItemResId() { + return searchIndexItemResId; + } + + boolean hasData() { + return !key.isEmpty() && !title.isEmpty(); + } + + public List getAllRelevantSearchFields() { + return Arrays.asList( + getTitle(), + getSummary(), + getEntries(), + getBreadcrumbs()); + } + + + @Override + public String toString() { + return "PreferenceItem: " + title + " " + summary + " " + key; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultHighlighter.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultHighlighter.java new file mode 100644 index 000000000..418a3ea46 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultHighlighter.java @@ -0,0 +1,127 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.RippleDrawable; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.util.TypedValue; + +import androidx.appcompat.content.res.AppCompatResources; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceGroup; +import androidx.recyclerview.widget.RecyclerView; + +import org.schabi.newpipe.R; + + +public final class PreferenceSearchResultHighlighter { + private static final String TAG = "PrefSearchResHighlter"; + + private PreferenceSearchResultHighlighter() { + } + + /** + * Highlight the specified preference. + *
+ * Note: This function is Thread independent (can be called from outside of the main thread). + * + * @param item The item to highlight + * @param prefsFragment The fragment where the items is located on + */ + public static void highlight( + final PreferenceSearchItem item, + final PreferenceFragmentCompat prefsFragment + ) { + new Handler(Looper.getMainLooper()).post(() -> doHighlight(item, prefsFragment)); + } + + private static void doHighlight( + final PreferenceSearchItem item, + final PreferenceFragmentCompat prefsFragment + ) { + final Preference prefResult = prefsFragment.findPreference(item.getKey()); + + if (prefResult == null) { + Log.w(TAG, "Preference '" + item.getKey() + "' not found on '" + prefsFragment + "'"); + return; + } + + final RecyclerView recyclerView = prefsFragment.getListView(); + final RecyclerView.Adapter adapter = recyclerView.getAdapter(); + if (adapter instanceof PreferenceGroup.PreferencePositionCallback) { + final int position = ((PreferenceGroup.PreferencePositionCallback) adapter) + .getPreferenceAdapterPosition(prefResult); + if (position != RecyclerView.NO_POSITION) { + recyclerView.scrollToPosition(position); + recyclerView.postDelayed(() -> { + final RecyclerView.ViewHolder holder = + recyclerView.findViewHolderForAdapterPosition(position); + if (holder != null) { + final Drawable background = holder.itemView.getBackground(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP + && background instanceof RippleDrawable) { + showRippleAnimation((RippleDrawable) background); + return; + } + } + highlightFallback(prefsFragment, prefResult); + }, 200); + return; + } + } + highlightFallback(prefsFragment, prefResult); + } + + /** + * Alternative highlighting (shows an → arrow in front of the setting)if ripple does not work. + * + * @param prefsFragment + * @param prefResult + */ + private static void highlightFallback( + final PreferenceFragmentCompat prefsFragment, + final Preference prefResult + ) { + // Get primary color from text for highlight icon + final TypedValue typedValue = new TypedValue(); + final Resources.Theme theme = prefsFragment.getActivity().getTheme(); + theme.resolveAttribute(android.R.attr.textColorPrimary, typedValue, true); + final TypedArray arr = prefsFragment.getActivity() + .obtainStyledAttributes( + typedValue.data, + new int[]{android.R.attr.textColorPrimary}); + final int color = arr.getColor(0, 0xffE53935); + arr.recycle(); + + // Show highlight icon + final Drawable oldIcon = prefResult.getIcon(); + final boolean oldSpaceReserved = prefResult.isIconSpaceReserved(); + final Drawable highlightIcon = + AppCompatResources.getDrawable( + prefsFragment.requireContext(), + R.drawable.ic_play_arrow); + highlightIcon.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); + prefResult.setIcon(highlightIcon); + + prefsFragment.scrollToPreference(prefResult); + + new Handler(Looper.getMainLooper()).postDelayed(() -> { + prefResult.setIcon(oldIcon); + prefResult.setIconSpaceReserved(oldSpaceReserved); + }, 1000); + } + + private static void showRippleAnimation(final RippleDrawable rippleDrawable) { + rippleDrawable.setState( + new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}); + new Handler(Looper.getMainLooper()) + .postDelayed(() -> rippleDrawable.setState(new int[]{}), 1000); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java new file mode 100644 index 000000000..1f0636454 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java @@ -0,0 +1,7 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import androidx.annotation.NonNull; + +public interface PreferenceSearchResultListener { + void onSearchResultClicked(@NonNull PreferenceSearchItem result); +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java new file mode 100644 index 000000000..176dc5d14 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java @@ -0,0 +1,35 @@ +package org.schabi.newpipe.settings.preferencesearch; + +import android.text.TextUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class PreferenceSearcher { + private final List allEntries = new ArrayList<>(); + + private final PreferenceSearchConfiguration configuration; + + public PreferenceSearcher(final PreferenceSearchConfiguration configuration) { + this.configuration = configuration; + } + + public void add(final List items) { + allEntries.addAll(items); + } + + List searchFor(final String keyword) { + if (TextUtils.isEmpty(keyword)) { + return new ArrayList<>(); + } + + return configuration.getSearcher() + .search(allEntries.stream(), keyword) + .collect(Collectors.toList()); + } + + public void clear() { + allEntries.clear(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/package-info.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/package-info.java new file mode 100644 index 000000000..00929235e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/package-info.java @@ -0,0 +1,10 @@ +/** + * Contains classes for searching inside the preferences. + *
+ * This code is based on + * ByteHamster/SearchPreference + * (MIT license) but was heavily modified/refactored for our use. + * + * @author litetex + */ +package org.schabi.newpipe.settings.preferencesearch; diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java index 95f7f50ba..490e299bd 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java @@ -44,8 +44,6 @@ import java.util.List; import static org.schabi.newpipe.settings.tabs.Tab.typeFrom; public class ChooseTabsFragment extends Fragment { - private static final int MENU_ITEM_RESTORE_ID = 123456; - private TabsManager tabsManager; private final List tabList = new ArrayList<>(); @@ -110,21 +108,14 @@ public class ChooseTabsFragment extends Fragment { @NonNull final MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - final MenuItem restoreItem = menu.add(Menu.NONE, MENU_ITEM_RESTORE_ID, Menu.NONE, - R.string.restore_defaults); + final MenuItem restoreItem = menu.add(R.string.restore_defaults); restoreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), R.drawable.ic_settings_backup_restore)); - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - if (item.getItemId() == MENU_ITEM_RESTORE_ID) { + restoreItem.setOnMenuItemClickListener(ev -> { restoreDefaults(); return true; - } - - return super.onOptionsItemSelected(item); + }); } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java b/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java new file mode 100644 index 000000000..71c0d3944 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java @@ -0,0 +1,43 @@ +package org.schabi.newpipe.util; + +import android.app.Activity; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.core.content.ContextCompat; + +/** + * Utility class for the Android keyboard. + *

+ * See also https://stackoverflow.com/q/1109022 + *

+ */ +public final class KeyboardUtil { + private KeyboardUtil() { + } + + public static void showKeyboard(final Activity activity, final EditText editText) { + if (activity == null || editText == null) { + return; + } + + if (editText.requestFocus()) { + final InputMethodManager imm = ContextCompat.getSystemService(activity, + InputMethodManager.class); + imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); + } + } + + public static void hideKeyboard(final Activity activity, final EditText editText) { + if (activity == null || editText == null) { + return; + } + + final InputMethodManager imm = ContextCompat.getSystemService(activity, + InputMethodManager.class); + imm.hideSoftInputFromWindow(editText.getWindowToken(), + InputMethodManager.RESULT_UNCHANGED_SHOWN); + + editText.clearFocus(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index c01e051b0..22e0a2dd0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -157,9 +157,8 @@ public final class NavigationHelper { return; } - if (PlayerHolder.getInstance().getType() != PlayerType.POPUP) { - Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show(); - } + Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show(); + final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback); intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.POPUP.ordinal()); ContextCompat.startForegroundService(context, intent); @@ -168,10 +167,9 @@ public final class NavigationHelper { public static void playOnBackgroundPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) { - if (PlayerHolder.getInstance().getType() != MainPlayer.PlayerType.AUDIO) { - Toast.makeText(context, R.string.background_player_playing_toast, Toast.LENGTH_SHORT) - .show(); - } + Toast.makeText(context, R.string.background_player_playing_toast, Toast.LENGTH_SHORT) + .show(); + final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback); intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.AUDIO.ordinal()); ContextCompat.startForegroundService(context, intent); diff --git a/app/src/main/java/org/schabi/newpipe/util/SaveUploaderUrlHelper.java b/app/src/main/java/org/schabi/newpipe/util/SaveUploaderUrlHelper.java new file mode 100644 index 000000000..3c7b1ce91 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/SaveUploaderUrlHelper.java @@ -0,0 +1,94 @@ +package org.schabi.newpipe.util; + +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; + +import android.content.Context; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import org.schabi.newpipe.NewPipeDatabase; +import org.schabi.newpipe.R; +import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.ErrorUtil; +import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.player.playqueue.PlayQueueItem; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.schedulers.Schedulers; + +/** + * Utility class for putting the uploader url into the database - when required. + */ +public final class SaveUploaderUrlHelper { + private SaveUploaderUrlHelper() { + } + + // Public functions which call the function that does + // the actual work with the correct parameters + public static void saveUploaderUrlIfNeeded(@NonNull final Fragment fragment, + @NonNull final StreamInfoItem infoItem, + @NonNull final SaveUploaderUrlCallback callback) { + saveUploaderUrlIfNeeded(fragment.requireContext(), + infoItem.getServiceId(), + infoItem.getUrl(), + infoItem.getUploaderUrl(), + callback); + } + public static void saveUploaderUrlIfNeeded(@NonNull final Context context, + @NonNull final PlayQueueItem queueItem, + @NonNull final SaveUploaderUrlCallback callback) { + saveUploaderUrlIfNeeded(context, + queueItem.getServiceId(), + queueItem.getUrl(), + queueItem.getUploaderUrl(), + callback); + } + + /** + * Fetches and saves the uploaderUrl if it is empty (meaning that it does + * not exist in the video item). The callback is called with either the + * fetched uploaderUrl, or the already saved uploaderUrl, but it is always + * called with a valid uploaderUrl that can be used to show channel details. + * + * @param context Context + * @param serviceId The serviceId of the item + * @param url The item url + * @param uploaderUrl The uploaderUrl of the item, if null or empty, it + * will be fetched using the item url. + * @param callback The callback that returns the fetched or existing + * uploaderUrl + */ + private static void saveUploaderUrlIfNeeded(@NonNull final Context context, + final int serviceId, + @NonNull final String url, + // Only used if not null or empty + @Nullable final String uploaderUrl, + @NonNull final SaveUploaderUrlCallback callback) { + if (isNullOrEmpty(uploaderUrl)) { + Toast.makeText(context, R.string.loading_channel_details, + Toast.LENGTH_SHORT).show(); + ExtractorHelper.getStreamInfo(serviceId, url, false) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + NewPipeDatabase.getInstance(context).streamDAO() + .setUploaderUrl(serviceId, url, result.getUploaderUrl()) + .subscribeOn(Schedulers.io()).subscribe(); + callback.onCallback(result.getUploaderUrl()); + }, throwable -> ErrorUtil.createNotification(context, + new ErrorInfo(throwable, UserAction.REQUESTED_CHANNEL, + "Could not load channel details") + )); + } else { + callback.onCallback(uploaderUrl); + } + } + + public interface SaveUploaderUrlCallback { + void onCallback(@NonNull String uploaderUrl); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java index 0ffbe4137..1b4c8046c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java @@ -2,12 +2,11 @@ package org.schabi.newpipe.util; import android.content.Context; import android.net.Uri; -import android.widget.Toast; +import android.util.Log; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; -import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -21,40 +20,19 @@ import org.schabi.newpipe.util.external_communication.ShareUtils; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.schedulers.Schedulers; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; - public enum StreamDialogEntry { ////////////////////////////////////// // enum values with DEFAULT actions // ////////////////////////////////////// show_channel_details(R.string.show_channel_details, (fragment, item) -> { - if (isNullOrEmpty(item.getUploaderUrl())) { - final int serviceId = item.getServiceId(); - final String url = item.getUrl(); - Toast.makeText(fragment.getContext(), R.string.loading_channel_details, - Toast.LENGTH_SHORT).show(); - ExtractorHelper.getStreamInfo(serviceId, url, false) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(result -> { - NewPipeDatabase.getInstance(fragment.requireContext()).streamDAO() - .setUploaderUrl(serviceId, url, result.getUploaderUrl()) - .subscribeOn(Schedulers.io()).subscribe(); - openChannelFragment(fragment, item, result.getUploaderUrl()); - }, throwable -> Toast.makeText( - // TODO: Open the Error Activity - fragment.getContext(), - R.string.error_show_channel_details, - Toast.LENGTH_SHORT - ).show()); - } else { - openChannelFragment(fragment, item, item.getUploaderUrl()); - } + SaveUploaderUrlHelper.saveUploaderUrlIfNeeded(fragment, item, + uploaderUrl -> openChannelFragment(fragment, item, uploaderUrl)); }), /** @@ -63,20 +41,24 @@ public enum StreamDialogEntry { * Info: Add this entry within showStreamDialog. */ enqueue(R.string.enqueue_stream, (fragment, item) -> { - NavigationHelper.enqueueOnPlayer(fragment.getContext(), new SinglePlayQueue(item)); + fetchItemInfoIfSparse(fragment, item, fullItem -> + NavigationHelper.enqueueOnPlayer(fragment.getContext(), fullItem)); }), enqueue_next(R.string.enqueue_next_stream, (fragment, item) -> { - NavigationHelper.enqueueNextOnPlayer(fragment.getContext(), new SinglePlayQueue(item)); + fetchItemInfoIfSparse(fragment, item, fullItem -> + NavigationHelper.enqueueNextOnPlayer(fragment.getContext(), fullItem)); }), - start_here_on_background(R.string.start_here_on_background, (fragment, item) -> - NavigationHelper.playOnBackgroundPlayer(fragment.getContext(), - new SinglePlayQueue(item), true)), + start_here_on_background(R.string.start_here_on_background, (fragment, item) -> { + fetchItemInfoIfSparse(fragment, item, fullItem -> + NavigationHelper.playOnBackgroundPlayer(fragment.getContext(), fullItem, true)); + }), - start_here_on_popup(R.string.start_here_on_popup, (fragment, item) -> - NavigationHelper.playOnPopupPlayer(fragment.getContext(), - new SinglePlayQueue(item), true)), + start_here_on_popup(R.string.start_here_on_popup, (fragment, item) -> { + fetchItemInfoIfSparse(fragment, item, fullItem -> + NavigationHelper.playOnPopupPlayer(fragment.getContext(), fullItem, true)); + }), set_as_playlist_thumbnail(R.string.set_as_playlist_thumbnail, (fragment, item) -> { }), // has to be set manually @@ -218,4 +200,39 @@ public enum StreamDialogEntry { fragment.requireActivity().getSupportFragmentManager(), item.getServiceId(), uploaderUrl, item.getUploaderName()); } + + ///////////////////////////////////////////// + // helper functions // + ///////////////////////////////////////////// + + private static void fetchItemInfoIfSparse(final Fragment fragment, + final StreamInfoItem item, + final Consumer callback) { + if (!(item.getStreamType() == StreamType.LIVE_STREAM + || item.getStreamType() == StreamType.AUDIO_LIVE_STREAM) + && item.getDuration() < 0) { + // Sparse item: fetched by fast fetch + ExtractorHelper.getStreamInfo( + item.getServiceId(), + item.getUrl(), + false + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + final HistoryRecordManager recordManager = + new HistoryRecordManager(fragment.getContext()); + recordManager.saveStreamState(result, 0) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnError(throwable -> Log.e("StreamDialogEntry", + throwable.toString())) + .subscribe(); + + callback.accept(new SinglePlayQueue(result)); + }, throwable -> Log.e("StreamDialogEntry", throwable.toString())); + } else { + callback.accept(new SinglePlayQueue(item)); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt b/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt new file mode 100644 index 000000000..e3d142916 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt @@ -0,0 +1,89 @@ +package org.schabi.newpipe.views.player + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.util.AttributeSet +import android.view.View + +class CircleClipTapView(context: Context?, attrs: AttributeSet) : View(context, attrs) { + + private var backgroundPaint = Paint() + + private var widthPx = 0 + private var heightPx = 0 + + // Background + + private var shapePath = Path() + private var arcSize: Float = 80f + private var isLeft = true + + init { + requireNotNull(context) { "Context is null." } + + backgroundPaint.apply { + style = Paint.Style.FILL + isAntiAlias = true + color = 0x30000000 + } + + val dm = context.resources.displayMetrics + widthPx = dm.widthPixels + heightPx = dm.heightPixels + + updatePathShape() + } + + fun updateArcSize(baseView: View) { + val newArcSize = baseView.height / 11.4f + if (arcSize != newArcSize) { + arcSize = newArcSize + updatePathShape() + } + } + + fun updatePosition(newIsLeft: Boolean) { + if (isLeft != newIsLeft) { + isLeft = newIsLeft + updatePathShape() + } + } + + private fun updatePathShape() { + val halfWidth = widthPx * 0.5f + + shapePath.reset() + + val w = if (isLeft) 0f else widthPx.toFloat() + val f = if (isLeft) 1 else -1 + + shapePath.moveTo(w, 0f) + shapePath.lineTo(f * (halfWidth - arcSize) + w, 0f) + shapePath.quadTo( + f * (halfWidth + arcSize) + w, + heightPx.toFloat() / 2, + f * (halfWidth - arcSize) + w, + heightPx.toFloat() + ) + shapePath.lineTo(w, heightPx.toFloat()) + + shapePath.close() + invalidate() + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + widthPx = w + heightPx = h + updatePathShape() + } + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + + canvas?.clipPath(shapePath) + canvas?.drawPath(shapePath, backgroundPaint) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt new file mode 100644 index 000000000..649b60494 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -0,0 +1,145 @@ +package org.schabi.newpipe.views.player + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import androidx.annotation.NonNull +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.END +import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID +import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.START +import androidx.constraintlayout.widget.ConstraintSet +import org.schabi.newpipe.MainActivity +import org.schabi.newpipe.R +import org.schabi.newpipe.player.event.DisplayPortion +import org.schabi.newpipe.player.event.DoubleTapListener + +class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : + ConstraintLayout(context, attrs), DoubleTapListener { + + private var secondsView: SecondsView + private var circleClipTapView: CircleClipTapView + private var rootConstraintLayout: ConstraintLayout + + private var wasForwarding: Boolean = false + + init { + LayoutInflater.from(context).inflate(R.layout.player_fast_seek_overlay, this, true) + + secondsView = findViewById(R.id.seconds_view) + circleClipTapView = findViewById(R.id.circle_clip_tap_view) + rootConstraintLayout = findViewById(R.id.root_constraint_layout) + + addOnLayoutChangeListener { view, _, _, _, _, _, _, _, _ -> + circleClipTapView.updateArcSize(view) + } + } + + private var performListener: PerformListener? = null + + fun performListener(listener: PerformListener) = apply { + performListener = listener + } + + private var seekSecondsSupplier: () -> Int = { 0 } + + fun seekSecondsSupplier(supplier: () -> Int) = apply { + seekSecondsSupplier = supplier + } + + // Indicates whether this (double) tap is the first of a series + // Decides whether to call performListener.onAnimationStart or not + private var initTap: Boolean = false + + override fun onDoubleTapStarted(portion: DisplayPortion) { + if (DEBUG) + Log.d(TAG, "onDoubleTapStarted called with portion = [$portion]") + + initTap = false + + secondsView.stopAnimation() + } + + override fun onDoubleTapProgressDown(portion: DisplayPortion) { + val shouldForward: Boolean = + performListener?.getFastSeekDirection(portion)?.directionAsBoolean ?: return + + if (DEBUG) + Log.d( + TAG, + "onDoubleTapProgressDown called with " + + "shouldForward = [$shouldForward], " + + "wasForwarding = [$wasForwarding], " + + "initTap = [$initTap], " + ) + + /* + * Check if a initial tap occurred or if direction was switched + */ + if (!initTap || wasForwarding != shouldForward) { + // Reset seconds and update position + secondsView.seconds = 0 + changeConstraints(shouldForward) + circleClipTapView.updatePosition(!shouldForward) + secondsView.setForwarding(shouldForward) + + wasForwarding = shouldForward + + if (!initTap) { + initTap = true + } + } + + performListener?.onDoubleTap() + + secondsView.seconds += seekSecondsSupplier.invoke() + performListener?.seek(forward = shouldForward) + } + + override fun onDoubleTapFinished() { + if (DEBUG) + Log.d(TAG, "onDoubleTapFinished called with initTap = [$initTap]") + + if (initTap) performListener?.onDoubleTapEnd() + initTap = false + + secondsView.stopAnimation() + } + + private fun changeConstraints(forward: Boolean) { + val constraintSet = ConstraintSet() + with(constraintSet) { + clone(rootConstraintLayout) + clear(secondsView.id, if (forward) START else END) + connect( + secondsView.id, if (forward) END else START, + PARENT_ID, if (forward) END else START + ) + secondsView.startAnimation() + applyTo(rootConstraintLayout) + } + } + + interface PerformListener { + fun onDoubleTap() + fun onDoubleTapEnd() + /** + * Determines if the playback should forward/rewind or do nothing. + */ + @NonNull + fun getFastSeekDirection(portion: DisplayPortion): FastSeekDirection + fun seek(forward: Boolean) + + enum class FastSeekDirection(val directionAsBoolean: Boolean?) { + NONE(null), + FORWARD(true), + BACKWARD(false); + } + } + + companion object { + private const val TAG = "PlayerFastSeekOverlay" + private val DEBUG = MainActivity.DEBUG + } +} diff --git a/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt b/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt new file mode 100644 index 000000000..d209d24da --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt @@ -0,0 +1,181 @@ +package org.schabi.newpipe.views.player + +import android.animation.Animator +import android.animation.ValueAnimator +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import org.schabi.newpipe.R +import org.schabi.newpipe.databinding.PlayerFastSeekSecondsViewBinding +import org.schabi.newpipe.util.DeviceUtils + +class SecondsView(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) { + + companion object { + const val ICON_ANIMATION_DURATION = 750L + } + + var cycleDuration: Long = ICON_ANIMATION_DURATION + set(value) { + firstAnimator.duration = value / 5 + secondAnimator.duration = value / 5 + thirdAnimator.duration = value / 5 + fourthAnimator.duration = value / 5 + fifthAnimator.duration = value / 5 + field = value + } + + var seconds: Int = 0 + set(value) { + binding.tvSeconds.text = context.resources.getQuantityString( + R.plurals.seconds, value, value + ) + field = value + } + + // Done as a field so that we don't have to compute on each tab if animations are enabled + private val animationsEnabled = DeviceUtils.hasAnimationsAnimatorDurationEnabled(context) + + val binding = PlayerFastSeekSecondsViewBinding.inflate(LayoutInflater.from(context), this) + + init { + orientation = VERTICAL + layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + } + + fun setForwarding(isForward: Boolean) { + binding.triangleContainer.rotation = if (isForward) 0f else 180f + } + + fun startAnimation() { + stopAnimation() + + if (animationsEnabled) { + firstAnimator.start() + } else { + // If no animations are enable show the arrow(s) without animation + showWithoutAnimation() + } + } + + fun stopAnimation() { + firstAnimator.cancel() + secondAnimator.cancel() + thirdAnimator.cancel() + fourthAnimator.cancel() + fifthAnimator.cancel() + + reset() + } + + private fun reset() { + binding.icon1.alpha = 0f + binding.icon2.alpha = 0f + binding.icon3.alpha = 0f + } + + private fun showWithoutAnimation() { + binding.icon1.alpha = 1f + binding.icon2.alpha = 1f + binding.icon3.alpha = 1f + } + + private val firstAnimator: ValueAnimator = CustomValueAnimator( + { + binding.icon1.alpha = 0f + binding.icon2.alpha = 0f + binding.icon3.alpha = 0f + }, + { + binding.icon1.alpha = it + }, + { + secondAnimator.start() + } + ) + + private val secondAnimator: ValueAnimator = CustomValueAnimator( + { + binding.icon1.alpha = 1f + binding.icon2.alpha = 0f + binding.icon3.alpha = 0f + }, + { + binding.icon2.alpha = it + }, + { + thirdAnimator.start() + } + ) + + private val thirdAnimator: ValueAnimator = CustomValueAnimator( + { + binding.icon1.alpha = 1f + binding.icon2.alpha = 1f + binding.icon3.alpha = 0f + }, + { + binding.icon1.alpha = 1f - binding.icon3.alpha + binding.icon3.alpha = it + }, + { + fourthAnimator.start() + } + ) + + private val fourthAnimator: ValueAnimator = CustomValueAnimator( + { + binding.icon1.alpha = 0f + binding.icon2.alpha = 1f + binding.icon3.alpha = 1f + }, + { + binding.icon2.alpha = 1f - it + }, + { + fifthAnimator.start() + } + ) + + private val fifthAnimator: ValueAnimator = CustomValueAnimator( + { + binding.icon1.alpha = 0f + binding.icon2.alpha = 0f + binding.icon3.alpha = 1f + }, + { + binding.icon3.alpha = 1f - it + }, + { + firstAnimator.start() + } + ) + + private inner class CustomValueAnimator( + start: () -> Unit, + update: (value: Float) -> Unit, + end: () -> Unit + ) : ValueAnimator() { + + init { + duration = cycleDuration / 5 + setFloatValues(0f, 1f) + + addUpdateListener { update(it.animatedValue as Float) } + addListener(object : AnimatorListener { + override fun onAnimationStart(animation: Animator?) { + start() + } + + override fun onAnimationEnd(animation: Animator?) { + end() + } + + override fun onAnimationCancel(animation: Animator?) = Unit + + override fun onAnimationRepeat(animation: Animator?) = Unit + }) + } + } +} diff --git a/app/src/main/res/drawable-night/ic_pin.xml b/app/src/main/res/drawable-night/ic_pin.xml new file mode 100644 index 000000000..6fe406341 --- /dev/null +++ b/app/src/main/res/drawable-night/ic_pin.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_pin.xml b/app/src/main/res/drawable/ic_pin.xml new file mode 100644 index 000000000..70578fbeb --- /dev/null +++ b/app/src/main/res/drawable/ic_pin.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_play_seek_triangle.xml b/app/src/main/res/drawable/ic_play_seek_triangle.xml new file mode 100644 index 000000000..1aee026db --- /dev/null +++ b/app/src/main/res/drawable/ic_play_seek_triangle.xml @@ -0,0 +1,11 @@ + + + + + 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 98b24f511..1ee11c49b 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 @@ -651,7 +651,6 @@ android:layout_height="60dp" android:layout_alignParentStart="true" android:background="@color/transparent_background_color" - android:contentDescription="@string/list_thumbnail_view_description" android:gravity="center_vertical" android:paddingLeft="@dimen/video_item_search_padding" android:paddingRight="@dimen/video_item_search_padding" diff --git a/app/src/main/res/layout-large-land/player.xml b/app/src/main/res/layout-large-land/player.xml index f3b1056d2..71a325cf3 100644 --- a/app/src/main/res/layout-large-land/player.xml +++ b/app/src/main/res/layout-large-land/player.xml @@ -54,11 +54,21 @@ tools:ignore="ContentDescription" tools:visibility="visible" /> + + + @@ -469,8 +479,8 @@ android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitCenter" android:visibility="gone" - app:tint="@color/white" app:srcCompat="@drawable/ic_fullscreen" + app:tint="@color/white" tools:ignore="ContentDescription,RtlHardcoded" tools:visibility="visible" /> @@ -493,8 +503,8 @@ android:clickable="true" android:focusable="true" android:scaleType="fitCenter" - app:tint="@color/white" app:srcCompat="@drawable/ic_previous" + app:tint="@color/white" tools:ignore="ContentDescription" /> @@ -505,8 +515,8 @@ android:layout_weight="1" android:background="?attr/selectableItemBackgroundBorderless" android:scaleType="fitCenter" - app:tint="@color/white" app:srcCompat="@drawable/ic_pause" + app:tint="@color/white" tools:ignore="ContentDescription" /> @@ -572,8 +582,8 @@ android:focusable="true" android:padding="10dp" android:scaleType="fitXY" - app:tint="@color/white" - app:srcCompat="@drawable/ic_close" /> + app:srcCompat="@drawable/ic_close" + app:tint="@color/white" /> - - - - - + + diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index b7d97cac5..23c9a166a 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -626,7 +626,6 @@ android:layout_height="60dp" android:layout_alignParentStart="true" android:background="@color/transparent_background_color" - android:contentDescription="@string/list_thumbnail_view_description" android:gravity="center_vertical" android:paddingLeft="@dimen/video_item_search_padding" android:paddingRight="@dimen/video_item_search_padding" diff --git a/app/src/main/res/layout/list_channel_item.xml b/app/src/main/res/layout/list_channel_item.xml index 6af6add2b..e302af0c5 100644 --- a/app/src/main/res/layout/list_channel_item.xml +++ b/app/src/main/res/layout/list_channel_item.xml @@ -63,7 +63,6 @@ android:layout_width="@dimen/video_item_search_thumbnail_image_width" android:layout_height="@dimen/video_item_search_thumbnail_image_height" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:src="@drawable/buddy" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/itemTitleView" diff --git a/app/src/main/res/layout/list_channel_mini_item.xml b/app/src/main/res/layout/list_channel_mini_item.xml index cc91b858f..650685d50 100644 --- a/app/src/main/res/layout/list_channel_mini_item.xml +++ b/app/src/main/res/layout/list_channel_mini_item.xml @@ -15,7 +15,6 @@ android:layout_height="42dp" android:layout_centerVertical="true" android:layout_marginRight="12dp" - android:contentDescription="@string/list_thumbnail_view_description" android:src="@drawable/buddy_channel_item" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml index f6ddc3924..81f27aaca 100644 --- a/app/src/main/res/layout/list_comments_item.xml +++ b/app/src/main/res/layout/list_comments_item.xml @@ -18,18 +18,29 @@ android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:focusable="false" android:src="@drawable/buddy" tools:ignore="RtlHardcoded" /> + + diff --git a/app/src/main/res/layout/list_playlist_grid_item.xml b/app/src/main/res/layout/list_playlist_grid_item.xml index 0c9390455..270abbde8 100644 --- a/app/src/main/res/layout/list_playlist_grid_item.xml +++ b/app/src/main/res/layout/list_playlist_grid_item.xml @@ -17,7 +17,6 @@ android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail_playlist" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_playlist_item.xml b/app/src/main/res/layout/list_playlist_item.xml index 390528de1..84cce8395 100644 --- a/app/src/main/res/layout/list_playlist_item.xml +++ b/app/src/main/res/layout/list_playlist_item.xml @@ -18,7 +18,6 @@ android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail_playlist" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_playlist_mini_item.xml b/app/src/main/res/layout/list_playlist_mini_item.xml index 835b18a6e..fe40449c6 100644 --- a/app/src/main/res/layout/list_playlist_mini_item.xml +++ b/app/src/main/res/layout/list_playlist_mini_item.xml @@ -18,7 +18,6 @@ android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail_playlist" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_stream_grid_item.xml b/app/src/main/res/layout/list_stream_grid_item.xml index fc6e03648..e770e6614 100644 --- a/app/src/main/res/layout/list_stream_grid_item.xml +++ b/app/src/main/res/layout/list_stream_grid_item.xml @@ -14,7 +14,6 @@ android:id="@+id/itemThumbnailView" android:layout_width="@dimen/video_item_grid_thumbnail_image_width" android:layout_height="@dimen/video_item_grid_thumbnail_image_height" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/list_stream_item.xml b/app/src/main/res/layout/list_stream_item.xml index 7f2f74c64..5806ed96e 100644 --- a/app/src/main/res/layout/list_stream_item.xml +++ b/app/src/main/res/layout/list_stream_item.xml @@ -14,7 +14,6 @@ android:id="@+id/itemThumbnailView" android:layout_width="@dimen/video_item_search_thumbnail_image_width" android:layout_height="@dimen/video_item_search_thumbnail_image_height" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail" app:layout_constraintBottom_toTopOf="@+id/itemProgressView" diff --git a/app/src/main/res/layout/list_stream_mini_item.xml b/app/src/main/res/layout/list_stream_mini_item.xml index 4c68d9001..5de3eac46 100644 --- a/app/src/main/res/layout/list_stream_mini_item.xml +++ b/app/src/main/res/layout/list_stream_mini_item.xml @@ -17,7 +17,6 @@ android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_stream_playlist_grid_item.xml b/app/src/main/res/layout/list_stream_playlist_grid_item.xml index c8b360062..ac57ae378 100644 --- a/app/src/main/res/layout/list_stream_playlist_grid_item.xml +++ b/app/src/main/res/layout/list_stream_playlist_grid_item.xml @@ -17,7 +17,6 @@ android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/list_stream_playlist_item.xml b/app/src/main/res/layout/list_stream_playlist_item.xml index 58a4b917f..9ac1045e2 100644 --- a/app/src/main/res/layout/list_stream_playlist_item.xml +++ b/app/src/main/res/layout/list_stream_playlist_item.xml @@ -18,7 +18,6 @@ android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="@dimen/video_item_search_image_right_margin" - android:contentDescription="@string/list_thumbnail_view_description" android:scaleType="centerCrop" android:src="@drawable/dummy_thumbnail" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/picker_subscription_item.xml b/app/src/main/res/layout/picker_subscription_item.xml index be26d064c..5f0344057 100644 --- a/app/src/main/res/layout/picker_subscription_item.xml +++ b/app/src/main/res/layout/picker_subscription_item.xml @@ -21,7 +21,6 @@ android:id="@+id/thumbnail_view" android:layout_width="48dp" android:layout_height="48dp" - android:contentDescription="@string/list_thumbnail_view_description" tools:src="@drawable/buddy_channel_item" /> + + + @@ -633,24 +643,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - + + diff --git a/app/src/main/res/layout/player_fast_seek_overlay.xml b/app/src/main/res/layout/player_fast_seek_overlay.xml new file mode 100644 index 000000000..1e0640eb7 --- /dev/null +++ b/app/src/main/res/layout/player_fast_seek_overlay.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/player_fast_seek_seconds_view.xml b/app/src/main/res/layout/player_fast_seek_seconds_view.xml new file mode 100644 index 000000000..57f5aa787 --- /dev/null +++ b/app/src/main/res/layout/player_fast_seek_seconds_view.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/select_channel_item.xml b/app/src/main/res/layout/select_channel_item.xml index 8e00aca96..df28a36ec 100644 --- a/app/src/main/res/layout/select_channel_item.xml +++ b/app/src/main/res/layout/select_channel_item.xml @@ -17,7 +17,6 @@ android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="5dp" - android:contentDescription="@string/list_thumbnail_view_description" android:src="@drawable/buddy" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/settings_layout.xml b/app/src/main/res/layout/settings_layout.xml index 33237d7b0..1b7b8b5e2 100644 --- a/app/src/main/res/layout/settings_layout.xml +++ b/app/src/main/res/layout/settings_layout.xml @@ -6,14 +6,14 @@ android:orientation="vertical" tools:context="org.schabi.newpipe.MainActivity"> + + - - diff --git a/app/src/main/res/layout/settings_preferencesearch_fragment.xml b/app/src/main/res/layout/settings_preferencesearch_fragment.xml new file mode 100644 index 000000000..89a25b217 --- /dev/null +++ b/app/src/main/res/layout/settings_preferencesearch_fragment.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/settings_preferencesearch_list_item_result.xml b/app/src/main/res/layout/settings_preferencesearch_list_item_result.xml new file mode 100644 index 000000000..2e20f274c --- /dev/null +++ b/app/src/main/res/layout/settings_preferencesearch_list_item_result.xml @@ -0,0 +1,36 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_settings_main_fragment.xml b/app/src/main/res/menu/menu_settings_main_fragment.xml new file mode 100644 index 000000000..fbe3b4e09 --- /dev/null +++ b/app/src/main/res/menu/menu_settings_main_fragment.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png b/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png index 49800ec19..b57cb4b99 100644 Binary files a/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png and b/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png differ diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 0034cf2dc..0b17fdfd2 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -21,7 +21,6 @@ تثبيت تطبيق Kore غير موجود. هل تريد تثبيته؟ فاتح - صور معاينة الفيديو خطأ في الشبكة لم يتم العثور على مشغل بث. تثبيت VLC؟ افتح في المتصفح @@ -99,7 +98,7 @@ تراجع تشغيل الكل تنبيهات NewPipe - تنبيهات مشغل NewPipe للخلفية والنوافذ المنبثقة + تنبيهات مشغل NewPipe [غير معروف] تعذر إعداد قائمة التنزيل تعطل التطبيق / واجهة المستخدم @@ -108,7 +107,7 @@ استرداد المشغل من الخطأ عذرًا، لم ينبغِ أن يحدث ذلك. الإبلاغ عن هذا الخطأ عبر البريد الإلكتروني - عذرا، حدث خطأ ما. + عذرًا، حدث خطأ ما. أبلِغ معلومات: ماذا حدث: @@ -158,7 +157,7 @@ التراخيص تطبيق مجاني خفيف البث على أندرويد. ساهم - إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية ، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل ! + إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! عرض على GitHub تبرع يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. @@ -291,7 +290,7 @@ لا يوجد بث متاح للتنزيل تم حذف عنصر واحد. لم يتم تثبيت أي تطبيق لتشغيل هذا الملف - NewPipe هو برنامج مفتوح المصدر و بحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. و على وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار جديد. + NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار جديد. آخر ما تم تشغيله الأكثر تشغيلا هذا سوف يُزيل إعداداتك الحالية. @@ -326,10 +325,10 @@ إلغاء الإرتباط (قد يسبب تشويه) هل تريد أيضا استيراد الإعدادات؟ سياسة خصوصية NewPipe - يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك ، لا يجمع التطبيق أي بيانات دون موافقتك. + يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. \nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. الإطلاع على سياسة الخصوصية - من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR) ، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. + من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. \nو يجب عليك قبولها لإرسال تقرير الأخطاء إلينا. قبول رفض @@ -354,7 +353,7 @@ استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف - تتبيه تحديث التطبيق + تنبيه تحديث التطبيق إيماء التحكم بالصوت الأحداث إشعارات لإصدار NewPipe الجديد @@ -379,7 +378,7 @@ متوقف في قائمة الانتظار قيد المعالجة - طابور + قائمة الانتظار تم رفضها من قبل النظام فشل التنزيل إنشاء اسم فريد @@ -434,7 +433,7 @@ حذف مواقف التشغيل حذف كل مواقف التشغيل حذف كل مواقف التشغيل؟ - تبديل الخدمة ، المحدد حاليًا: + تبديل الخدمة، المحدد حاليًا: الكشك الافتراضي لا توجد مشاهدة لا أحد يستمع @@ -481,21 +480,21 @@ الفيديوهات %d ثانية - %d ثواني - %d ثواني + %d ثانية + %d ثانية %d ثواني - %d ثواني - %d ثواني + %d ثانية + %d ثانية - هل تعتقد تحميل تغذية بطيء جدا؟ إذا كان الأمر كذلك ، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). + هل تعتقد تحميل التغذية بطيء جدا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). \n \nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: -\n• جلب قناة الاشتراك بأكملها ، وهي بطيئة ولكنها كاملة. -\n• استخدام نقطة نهاية خدمة مخصصة ، وهي سريعة ولكنها عادة لا تكتمل. +\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. +\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادة لا تكتمل. \n -\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات ، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. +\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. \n -\n يوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. +\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. \n \nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. تعطيل الوضع السريع @@ -534,19 +533,19 @@ %d ساعة - %d ساعات - %d ساعات + %d ساع + %d ساعة %d ساعات - %d ساعات - %d ساعات + %d ساعة + %d ساعة %d دقيقة - %d الدقائق - %d الدقائق - %d الدقائق - %d الدقائق - %d الدقائق + %d دقيقة + %d دقيقة + %d دقائق + %d دقيقة + %d دقيقة نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية إلغاء كتم الصوت @@ -595,7 +594,7 @@ لا شيء جارٍ التحميل خلط - كرّر + تكرار يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط! قم بتحرير كل إشعار أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها لتظهر في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين زر الإجراء الخامس @@ -632,13 +631,13 @@ إظهار الوصف فتح مع يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe. - يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium ، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. + يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. - هذا هو مسار SoundCloud Go+ ، على الأقل في بلدك ، لذلك لا يمكن بثها أو تنزيلها من قبل NewPipe. + هذا مسار SoundCloud Go + ، على الأقل في بلدك ، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. هذا المحتوى غير متوفر في بلدك. اغلق التطبيق قسريا هذا الفيديو مقيد بالفئة العمرية. -\nنظرا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن ل NewPipe الوصول إلى أي من مقاطع الفيديو الخاصة بها وبالتالي يتعذر تشغيلها. +\nنظرا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن ل NewPipe الوصول إلى أي من مقاطع الفيديو الخاصة بها وبالتالي لا يمكن تشغيلها. إذاعة المميزة حل @@ -675,10 +674,10 @@ \nهل تريد إلغاء الاشتراك من هذه القناة؟ تعذر تحميل تغذية ل \'%s\'. خطأ في تحميل الخلاصة - بدءًا من Android 10 ، يتم دعم \"Storage Access Framework\" فقط + بدءًا من Android 10، يتم دعم \"Storage Access Framework\" فقط لا يتم دعم \"Storage Access Framework\" على Android KitKat والإصدارات الأقدم سيتم سؤالك عن مكان حفظ كل تنزيل - لم يتم تعيين مجلد التحميل ، الرجاء اختيار مجلد التحميل الافتراضي الآن + لم يتم تعيين مجلد التحميل، الرجاء اختيار مجلد التحميل الافتراضي الآن إيقاف تشغيل وضع الجهاز اللوحي @@ -722,9 +721,19 @@ التحقق يدويا من وجود إصدارات جديدة جاري التحقق من وجود تحديثات… عناصر تغذية جديدة - الإبلاغ عن أخطاء المشغل إظهار خيار تعطل عند استخدام المشغل إظهار \"تعطل المشغل\" تحطيم المشغل - رفع تقرير لأخطاء المشغل بالتفصيل الكامل بدلا من إظهار رسالة اشعار قصيرة الأجل (مفيدة لتشخيص المشاكل) + إشعار الإبلاغ عن الأخطاء + التنبيهات المتعلقة بالإبلاغ عن الأخطاء + واجه NewPipe خطأ، اضغط للتقرير + حدث خطأ، انظر للإشعار + قم بإنشاء تنبيه بالخطأ + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. +\nالرجاء تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل. + إظهار خطأ snackbar + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. +\nالرجاء تثبيت مدير ملفات متوافق مع Storage Access Framework. + يتم تشغيله في الخلفية + تعليق مثبت \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 19ed896f0..aab0a83bb 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -458,7 +458,6 @@ Arrastra pa reordenar Avatar del xubidor Reproducción d\'un videu, duración: - Miniatura del videu Un comentariu (n\'inglés): Qué pasó: Informar 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 4d4602daa..f984fbea9 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -289,7 +289,6 @@ Layklar Yuklovchining avatar eskizi Videoni ijro etish muddati, davomiyligi: - Videoni oldindan ko\'rish uchun eskiz Detallar: Sizning sharhingiz (ingliz tilida): Nima: \\n So\'rov: \\nTarkib tili: \\nTarkib mamlakati: \\nIlova tili: \\ nXizmat: \\ nGMT vaqti: \\ nPaket: \\ nVersion: \\ nOS versiyasi: diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index 4e9511d8c..10777db8f 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -33,7 +33,7 @@ %s 个视频 - 停用 + 已停用 后台播放 显示搜索建议 订阅 @@ -58,7 +58,7 @@ 更新 文件已删除 无法得知订阅人数 - 发布新版本时,通知我升级应用 + 有新版本时,显示通知提示更新应用 网格 NewPipe 可更新! 服务器不接受多线程下载, 使用 @string/msg_threads = 1 重试 @@ -148,14 +148,13 @@ App/UI 崩溃 抱歉, 这本不该发生。 使用电子邮件反馈错误 - 抱歉, 发生了一些错误。 + 抱歉,发生了一些错误。 反馈 信息: 发生了什么: 详情:\\n请求:\\n内容语言:\\n内容国家:\\n客户端语言:\\n服务:\\nGMT时间:\\n包名:\\n版本:\\n操作系统版本: 您的附加说明(请用英文): 详细信息: - 视频预览缩略图 播放视频,时长: 视频上传者的头像缩略图 十亿 @@ -175,7 +174,7 @@ 部分分辨率下没有音频 选择搜索时显示的建议 最佳分辨率 - 开源且小巧的 Android 媒体播放器。 + 自由且小巧的 Android 媒体播放器。 在 GitHub 上查看 NewPipe 的许可证 你是否想过要翻译、设计、清理或重构代码——我们始终欢迎你来贡献! @@ -195,7 +194,7 @@ 历史记录 历史记录 NewPipe 通知 - NewPipe 在后台播放和悬浮窗播放时在通知栏中显示通知 + NewPipe 播放器的通知 默认视频格式 行为 空空如也 @@ -250,7 +249,7 @@ 导入成功 没有有效的 ZIP 文件 警告:无法导入所有文件。 - 此操作会覆盖当前设置 + 此操作会覆盖当前设置。 显示信息 收藏 最近观看 @@ -273,8 +272,8 @@ 缩放画面 调试 自动生成 - 『内存泄漏监视』可能导致应用在『核心转储』时无响应 - 报告『提前结束Android生命周期』错误 + 内存泄漏监测可能会导致应用在堆转储时无响应 + 报告超出生命周期的错误 强制报告处理后的未送达的 Activity 或 Fragment 生命周期之外的 Rx 异常 使用快速寻址(不精确) 快速寻址定位允许播放器以较低精确度为代价换取更快的寻址定位速度。此功能不适用于以 5、15 或 25 秒为隔的寻址定位 @@ -301,8 +300,8 @@ \n3. 单击“包含所有数据”,然后单击“取消全选”,然后仅选择“订阅”并单击“确定” \n4. 点击“下一步”,然后点击“创建导出作业” \n5. 出现“下载”按钮后点击它 -\n6. 单击下面的导入文件并选择下载的 zip 文件 -\n7.【如果 zip 导入失败】解压 .csv文件(通常在“YouTube和YouTube Music/subscriptions/subscriptions.csv”下),点击下方的导入文件,选择解压出来的 csv 文件 +\n6. 单击下面的导入文件并选择下载的 .zip 文件 +\n7.(如果 .zip 导入失败)解压 .csv文件(通常在“YouTube和YouTube Music/subscriptions/subscriptions.csv”下),点击下方的导入文件,选择解压出来的 csv 文件
通过输入网址或你的 ID 导入 SoundCloud 配置文件: \n \n1. 在浏览器中启用“电脑模式“(该网站未适配移动设备); @@ -333,7 +332,7 @@ 清空搜索历史关键词 是否删除全部搜索历史? 搜索历史已删除 - NewPipe 是版权自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证 GPLv3 或(由您选择的)任何更高版本的许可证重新分发或修改该许可证。 + NewPipe 是 Copyleft 的自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证 GPLv3 或(由您选择的)任何更高版本的许可证重新分发或修改该许可证。 是否要导入设置? NewPipe 隐私政策 NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。 @@ -359,7 +358,7 @@ 使用手势控制播放器的亮度 视频默认语言 应用更新通知 - 当 NewPipe 有新版本时发送通知 + NewPipe 新版本的通知 外置存储不可用 无法下载到外部 SD 卡,修改下载文件夹位置? 读取已保存标签时发生错误,因此使用默认标签 @@ -522,7 +521,7 @@ 移除看过的视频? 移除看过的视频 来自服务的原始文本将在串流项目中可见 - 显示原始时间 + 在项目上显示原始时间 启用 YouTube“受限模式” 仅显示未分组订阅 播放列表页 @@ -662,9 +661,19 @@ 检查更新中… 检查更新 新订阅源条目 - 完整报告播放器错误,而不是弹出一个临时Toast(对诊断应用很有用) 显示\"使播放器崩溃\" 在使用播放器时显示一个崩溃选项 使播放器崩溃 - 报告播放器错误 + 错误报告通知 + 提示报告错误的通知 + 发生错误,详见通知 + 显示错误警示SnackBar + 创建一条错误通知 + 找不到适合此操作的文件管理器。 +\n请安装一文件管理器或尝试在下载设置中禁用“%s”。 + 找不到适合此操作的文件管理器。 +\n请安装与存储访问框架(SAF)兼容的文件管理器。 + NewPipe 遇到了一个错误,点击此处报告此错误 + 已经在后台播放 + 置顶评论 \ 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 4b185b301..249b8ca38 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -153,7 +153,6 @@ Што:\\nЗапыт:\\nМова кантэнту:\\nСэрвіс:\\nЧас па Грынвічы:\\nПакет:\\nВерсія:\\nВерсія АС: Ваш каментар (English): Падрабязнасці: - Мініяцюра відэа-прэв\'ю Мініяцюра відэа-прэв\'ю Мініяцюра аватара карыстальніка Спадабалася diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 065a8fbce..5aac01afb 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -213,7 +213,6 @@ Не са намерени видео стриймове Не са намерени аудио стриймове Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nУслуга:\\nВреме по GMT:\\nПакет:\\nВерсия:\\nОС версия: - Миниатюра на видео Пренареди чрез плъзгане Начало Преименувай diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index d561d52e8..8a014cdf8 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -77,7 +77,6 @@ তোমার মন্তব্য (ইংরেজিতে): বর্ণনা: - ভিডিও প্রাকদর্শন থাম্বনেইল ভিডিও প্রাকদর্শন, সময়ঃ আপলোডারের ইউজারপিক থাম্বনেইল পছন্দ হয়েছে diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 831364013..d087905a4 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -31,7 +31,6 @@ পছন্দ হয়েছে আপলোডারের ইউজারপিক থাম্বনেইল ভিডিও প্রাকদর্শন, সময়ঃ - ভিডিও প্রাকদর্শন থাম্বনেইল বর্ণনা: আপনার মন্তব্য (ইংরেজিতে): কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর: diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 83ffd9c64..89a95c6fb 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -116,7 +116,6 @@ পছন্দ আপলোডারের অবয়বের প্রতিচ্ছবি ভিডিও চালাও, সময়ঃ - ভিডিও প্রাকদর্শন প্রতিচ্ছবি বর্ণনা: তোমার মন্তব্য (ইংরেজিতে): কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর: diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 353ef532c..327175f1c 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -126,7 +126,7 @@ S\'ha eliminat la memòria cau d\'imatges Elimina les metadades de la memòria cau S\'ha esborrat la memòria cau de metadades - Afegeix vídeos relacionats a la cua + Posa a la cua el següent flux Suggeriments de cerca Mostra suggeriments durant la cerca Historial de cerca @@ -136,8 +136,8 @@ Llengua per defecte dels continguts S\'està reproduint en rerefons S\'està reproduint en mode emergent - Notificació del NewPipe - Notificacions dels reproductors en rerefons o emergents del NewPipe + Notificació de NewPipe + Notificacions per al reproductor de NewPipe No s\'han pogut carregar totes les miniatures No s\'ha pogut desxifrar la signatura de l\'URL del vídeo No s\'ha pogut processar el lloc web @@ -161,7 +161,6 @@ Què ha passat: Comentari (en anglès): Detalls: - Miniatura de previsualització del vídeo Reprodueix el vídeo, duració: Miniatura de l\'avatar del propietari M\'agrada @@ -271,7 +270,7 @@ Desvincula (pot causar deformació) Elimina totes les dades de llocs web de la memòria cau Acaba de reproduir la cua (sense repetició) quan s\'hi afegeixi un vídeo relacionat - Mostra els missatges d\'ajuda + Mostra l\'indicador «Mantenir per posar a la cua» Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo Què ha passat:\\nPetició:\\nIdioma del contingut:\\nPaís del contingut:\\nLlengua de l\'aplicació:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO: Acció d\'obertura preferida @@ -560,7 +559,7 @@ Mostra contingut que podria ser inadequat pels infants Notificació No s\'ha pogut reconèixer l\'adreça URL. Obrir-la amb una altra aplicació\? - Cua automàtica + Posa a la cua automàticament Desactiveu-ho per deixar de mostrar les metadades, que contenen informació addicional sobre el creador del directe, el contingut o una sol·licitud de cerca Mostra les metadades La cua de reproducció activa serà sobreescrita @@ -653,4 +652,39 @@ Inicia el reproductor principal en pantalla completa Llisqueu els elements per eliminar-los Si la rotació automàtica està bloquejada, no inicieu vídeos al mini reproductor, sinó que aneu directament al mode de pantalla completa. Podeu accedir igualment al mini reproductor sortint de pantalla completa + Ja s\'està reproduint en segon pla + Notificació d\'informe d\'error + Tancar abruptament el reproductor + Comprovar si hi ha actualitzacions + Comprovar manualment si hi ha noves versions + + Baixada finalitzada + %s baixades finalitzades + + Vista prèvia de les miniatures de la barra de cerca + No s\'ha trobat cap gestor de fitxers adequat per a aquesta acció. +\nInstal·leu un gestor de fitxers compatible amb l\'entorn d\'accés d\'emmagatzematge. + No s\'ha trobat cap gestor de fitxers adequat per a aquesta acció. +\nInstal·leu un gestor de fitxers o intenteu desactivar «%s» als paràmetres de baixada. + S\'ha produït un error, consulteu la notificació + Afegit el següent vídeo a la cua + NewPipe ha trobat un error, toca per informar + Posa a la cua el següent vídeo + Crear una notificació d\'error + Error en mostrar els detalls del canal + Notificacions per informar d\'errors + Mostra una barra d\'errors + S\'estan comprovant les actualitzacions… + + S\'ha suprimit %1$s baixada + S\'han suprimit %1$s baixades + + El \"Sistema d\'Accés a l\'Emmagatzematge\" no està implementat a Android KitKat i a versions anteriors + A partir de l\'Android 10 només s\'admet el \"Sistema d\'Accés a l\'Emmagatzematge\" + Elements de feed nous + El mode d\'alimentació ràpida no proporciona més informació sobre això. + Comentari fixat + Mostrar \"tancar de forma violenta el reproductor\" + Mostra una opció de fallada quan s\'utilitza el reproductor + Mostra les cintes de color Picasso a la part superior de les imatges que indiquen la seva font: vermell per a la xarxa, blau per al disc i verd per a la memòria \ No newline at end of file diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index e524f9f7d..36de64297 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -45,7 +45,7 @@ سڕینەوەی مێژووی گەڕان هەڵە ئەمە لەسەر ڕێکخستنەکانی ئێستات جێگیر دەبێت. - ئاگانامەکانی نیوپایپ + پەیامەکانی نیوپایپ نیوپایپ لەلایەن چەند خۆبەخشێکەوە دروستکراوە کە کاته‌كانی خۆیان پێ بەخشیووە تاکو باشترین خزمەتگوزاریت پێشکەش بکەن. هیچ نەبێت بە کڕینی کوپێک قاوە یارمەتی گەشەپێدەرەکانمان بدە بۆ ئەوەی کاتی زیاتر تەرخان بکەین بۆ بەرەوپێشبردنی نیوپایپ. ملیار گەڕانی پێشنیارکراوەکان @@ -177,7 +177,6 @@ خستنه‌ نۆبه‌تی-خۆكاری په‌خشی دواتر لێده‌ره‌ دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن کردار ڕەتکرایەوە لەلایەن سیستەمەوە - زووبینینی وێنۆچکەی ڤیدیۆ په‌نجه‌ره‌ ڕه‌ش قه‌باره‌ی بنەڕەتی په‌نجه‌ره‌ @@ -238,9 +237,9 @@ كردنه‌وه‌ له‌ وێبگه‌ر ڕاژەکە هیچ داتایەک نانێرێت شوێنی کارپێکراوەکان سڕانەوە - ئاگانامەکانی وەشانی نوێی نیوپایپ + پەیامەکانی وەشانە نوێیەکانی نیوپایپ تەنها چەند مۆبایلێک پشتگیری لێدانی ڤیدیۆی 2K/4K دەکەن - ئاگانامەکانی پاشبنەمای نیوپایپ و لێدانه‌كانی پەنجەرە + پەیامەکانی لێدەری نیوپایپ لەهەندێ خزمەتگوزاریدا بەردەستە، بەزۆری خێراترینە بەڵام ڕەنگە هەندێک لە بابەتەکان زانیارییەکانیان ناتەواو بێت (وەک نەبوونی ماوە، جۆری بابەت ، نەبوونی پەخش) %d چرکە @@ -276,7 +275,7 @@ هیچ پەخشێکی ڤیدیۆیی نەدۆزرایەوە هاوردە لە كرتە بکە لەسەر ”كرا” کاتێك کە چارەسەرکرا - ئاگانامەی نوێکاری بەرنامە + پەیامی نوێکردنەوەی بەرنامە ناتوانرێت هەموو وێنۆچکەکان باربکرێن هەناردەی پێشووتر فایلی ZIP دروست نییە @@ -395,7 +394,7 @@ نیشانه‌كردنی خشته‌لێدان ناوی فایل ناکرێت بەتاڵ بێت ناتوانرێت واژووی بەستەری ڤیدیۆ بخوێنرێتەوە - پیشاندانی ئاگانامەیەک بۆ ئامادەبوونی به‌رنامه‌ لەکاتی بەردەست بوونی وەشانی نوێ + پیشاندانی پەیامێک بۆ ئامادەبوونی به‌رنامه‌ لەکاتی بەردەست بوونی وەشانی نوێ مێژووی سەیرکردن سکاڵا لەسەر کێشەکان خۆکار-دانراو (هیچ بەرزکەرەوەیەک نەدۆزرایەوە) @@ -543,7 +542,7 @@ تكایه‌ پشكنینێك بكه‌ كه‌ ئاخۆ كێشه‌یه‌ك هه‌یه‌ باسی كڕاشه‌كه‌ت بكات. له‌كاتی سازدانی پلیتی لێكچوو ، كات له‌ ئێمه‌ ده‌گریت كه‌ ئێمه‌ سه‌رقاڵی چاره‌سه‌ركردنی هه‌مان كێشه‌ ده‌كه‌یت. سكاڵا لەسەر GitHub له‌به‌رگرتنه‌وه‌ی سكاڵای جۆركراو - ئاگانامە + پەیام ناتوانرێت به‌سته‌ره‌كه‌ بناسرێتەوە. بە بەرنامەیەکی دیكه‌ بکرێتەوە؟ خستنه‌ نۆبه‌تی-خۆكاری نۆبه‌ته‌كه‌ لە لێدەری چالاکەوە جێگۆڕکێی دەکرێت @@ -553,14 +552,14 @@ نێوانگری تێکەڵکردن دووبارە - دەتوانیت تا سێ كردار دیار بكه‌یت تا پیشان بدرێن له‌ ئاگانامه‌كه‌دا! - ده‌ستكاری هه‌ر یه‌كێك له‌م كردارانه‌ی خواره‌وه‌ بكه‌ له‌ڕێگه‌ی كرته‌ له‌سه‌ریان. ده‌توانیت تا زیاتر له‌ سێ دانه‌یان هه‌ڵبژێریت له‌ ڕێگای چوارگۆشه‌كانی لای ڕاسته‌وه‌یان، تا پیشان بدرێن له‌ ئاگانامه‌كاندا + دەتوانیت تا سێ كردار دیار بكه‌یت تا پیشان بدرێن له‌ پەیامەکەدا! + ده‌ستكاری هه‌ر یه‌كێك له‌م كردارانه‌ی خواره‌وه‌ بكه‌ له‌ڕێگه‌ی كرته‌ له‌سه‌ریان. ده‌توانیت تا زیاتر له‌ سێ دانه‌یان هه‌ڵبژێریت له‌ ڕێگای چوارگۆشه‌كانی لای ڕاسته‌وه‌یان، تا پیشان بدرێن له‌ پەیامەکاندا پێنجه‌م كرداری دوگمه‌ چواره‌م كرداری دوگمه‌ سێیه‌م كرداری دوگمه‌ دووه‌م كرداری دوگمه‌ یه‌كه‌م كرداری دوگمه‌ - وێنۆچكه‌ی ڤیدیۆ پێوانه‌ ده‌كرێته‌وه‌ له‌ ئاگانامه‌كاندا له‌ ڕه‌هه‌ندی 16:9 ه‌وه‌ بۆ ڕه‌هه‌ندی 1:1 + وێنۆچكه‌ی ڤیدیۆ پێوانه‌ ده‌كرێته‌وه‌ له‌ پەیامەکاندا له‌ ڕه‌هه‌ندی 16:9 ه‌وه‌ بۆ ڕه‌هه‌ندی 1:1 پێوانەكردنی وێنۆچكه‌ بۆ ڕه‌هه‌ندی 1:1 پیشاندانی ئەنجامەکانی: %s كردنه‌وه‌ له‌ @@ -569,8 +568,8 @@ ناكارایبكه‌ بۆ شاردنه‌وه‌ی دیسکریپشن له‌سه‌ر ڤیدیۆ و زانیاری زیاتر پیشاندانی دیسکریپشن ڕووكاری شه‌و - ئه‌ندرۆید ڕه‌نگی ئاگانامه‌ دڵخواز ده‌كات به‌پێی ڕه‌نگی سه‌ره‌كی وێنۆچكه‌كه‌ ( ڕه‌چاوی ئه‌وه‌ بكه‌ كه‌ ئه‌م تایبه‌تمه‌ندییه‌ هه‌موو ئامێرێك ناگرێته‌وه‌ ) - ڕه‌نگكردنی ئاگانامه‌ + ئه‌ندرۆید ڕه‌نگی پەیام دڵخواز ده‌كات به‌پێی ڕه‌نگی سه‌ره‌كی وێنۆچكه‌كه‌ ( ڕه‌چاوی ئه‌وه‌ بكه‌ كه‌ ئه‌م تایبه‌تمه‌ندییه‌ هه‌موو ئامێرێك ناگرێته‌وه‌ ) + ڕه‌نگكردنی پەیام یوتوب ”دۆخی قه‌ده‌غه‌كراو” پێشكه‌ش ده‌كات كه‌ بابەتە نه‌شیاوه‌كان ده‌شارێته‌وه‌ ئه‌ژماركردنی هاش لێدوانه‌كان ناكاراكراون @@ -582,8 +581,8 @@ خاوێنكردنه‌وی ئه‌و شه‌كرۆكانه‌ی كه‌ له‌ نیوپایپ كۆگاكراون ، ئه‌مه‌ش له‌دوای شیكار كردنی reCAPTCHA شه‌كرۆكه‌كانی reCAPTCHA خاوێنكرانه‌وه‌ سڕینه‌وه‌ی شه‌كرۆكه‌كانی reCAPTCHA - ئاگانامه‌كانی ئه‌نجامدانی هاشكردنی ڤیدیۆ - ئاگانامه‌ی هاشی ڤیدیۆ + پەیامەکانی ئه‌نجامدانی هاش كردنی ڤیدیۆ + پەیامی هاش ڤیدیۆ ناکاراکردنی دیار کردنی نوسینی نێو دیسکریبشن کاراکردنی دیار کردنی نوسینی نێو دیسکریبشن لە ئێستادا دەتوانیت نوسینی نێو دیسکریپشن دیار بکەیت. بەڵام ڕەچاوی ئەوە بکە کە ئەو پەڕەیە ڕەنگە تێکبچێت و لینکەکان کرتەیان لەسەر نەکرێت لە دۆخی دیار کردندا. @@ -622,7 +621,7 @@ هیچ به‌رنامه‌یه‌كی نێو مۆبایله‌كه‌ت ناتوانێت ئه‌مه‌ بكاته‌وه‌ به‌شه‌كان دواین - وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و ئاگانامه‌كان به‌كاربهێنرێن + وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و پەیامەکان به‌كاردەهێنرێن پیشاندانی وێنۆچكه‌ تەماشاکراوەکان پیشان بدرێن بۆ دابه‌زاندنی هه‌ر بابه‌تێك پرست پێ ده‌كرێت له‌باره‌ی شوێنی دابه‌زاندنیان @@ -669,4 +668,18 @@ لە نۆبەت دانان بۆ دواتر لە نۆبەت دانرا بۆ دواتر جێبەجێ دەکرێت... ڕەنگە ساتێک بخایەنێت + دەپشکنرێت بۆ نوێکردنەوە… + پشکنینی خۆیی بۆ وەشانی نوێ + بژاردەی کڕاش کردن پیشان دەدات لەکاتی بەکارهێنانی لێدەرەکە + کێشەیەک ڕوویدا ، پەیامەکە ببینە + نیوپایپ تووشی کێشەیەک بوو ، کرتە بکە بۆ سکاڵاکردن + پیشاندانی ”کڕاش کردنی لێدەرەکە“ + سازاندنی پەیامی کێشەیەک + پشکنین بۆ نوێکردنەوە + وا لە پاشبنەمادا لێدەدرێت + کێشە لە سکاڵا کردنی پەیام + پەیامەکانی سکاڵاکردن لە کێشەکان + بابەتە نوێیەکانی فیید + لێدوانی هەڵواسراو + کڕاش کردنی لێدەر \ 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 e62de53bb..f65a350fe 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -42,7 +42,6 @@ Nebylo možné dekódovat URL videa Nebylo možné analyzovat stránku Obsah není k dispozici - Náhled videa Přehrát video, délka: Náhled avataru uploadera To se mi líbí @@ -124,7 +123,7 @@ Nejlepší rozlišení Vrátit Oznámení NewPipe - Oznámení pro NewPipe přehrávače v pozadí a v okně + Oznámení pro NewPipe přehrávač Žádné výsledky Je tu sranda jak v márnici mld. @@ -165,7 +164,7 @@ Podílet se Historie Historie - Zobrazovat tip \"Podržet pro přidání\" + Zobrazit tip \"Podržet pro vložení do fronty\" Ukázat tip po stisku na pozadí nebo na popup tlačítko v \"Podrobnostech\" o videu Přehrát vše Tento stream nelze přehrát @@ -259,7 +258,7 @@ Vymazat metadata v mezipaměti Odebrat všechna data uložená v mezipaměti Mezipaměť metadat vymazána - Automatická fronta dalšího streamu + Další stream automaticky vložit do fronty Pokračovat konečnou (neopakující se) frontu playbacku připojením souvisejícího streamu Soubor Neexistující složka @@ -276,15 +275,15 @@ Předchozí export Odběry nelze importovat Odběry nelze exportovat - Importovat YouTube odběry stáhnutím exportního souboru: + Importovat YouTube odběry z Google: \n \n1. Přejděte na tuto URL adresu: %1$s \n2. Na vyžádání se přihlašte -\n3. Klikněte na \"Jsou zahrnuta všechna data z YouTube\" pak na \"Zrušit výběr všech\" a pak vyberte jen \"odběry\" a klikněte na OK +\n3. Klikněte na \"Jsou zahrnuta všechna data\", \"Zrušit výběr všech\" a pak vyberte jen \"odběry\" a klikněte na OK \n4. Klikněte na \"Další krok\" a pak na \"Vytvořit export\" \n5. Vyčkejte než se objeví tlačítko \"Stáhnout\" a klikněte na něj \n6. Klikněte IMPORTOVAT SOUBOR a vyberte stažený .zip soubor z předchozího kroku -\n7. [Pokud se import .zip souboru nezdaří] Rozbalte soubor subscriptions.csv (měl by se nacházet v adresáři \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), stiskněte IMPORTOVAT SOUBOR níže a vyberte rozbalený soubor subscriptions.csv +\n7. [Pokud se import .zip souboru nezdaří] Rozbalte soubor .csv (měl by to být soubor \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), stiskněte IMPORTOVAT SOUBOR níže a vyberte rozbalený csv soubor Importovat SoundCloud profil zadáním URL adresy nebo vašeho ID: \n \n1. Ve svém prohlížeči povolte \"režim pro PC\" (pro mobilní zařízení není stránka dostupná) @@ -347,7 +346,7 @@ Aktualizace Soubor smazán Oznámení o aktualizaci aplikace - Oznámení o nové verzi NewPipe + Oznámení o nových verzích NewPipe Externí úložiště není k dispozici Nelze načíst uložené karty, takže se použijí výchozí karty Obnovit do výchozího nastavení @@ -682,4 +681,23 @@ Tažením položky odstraníte Spustit hlavní přehrávač na celé obrazovce Zpracovávám... může trvat moment + Ručně zkontrolovat zda je k dispozici nová verze + Kontrola aktualizací + NewPipe narazil na problém, klikněte pro nahlášení + Došlo k chybě, více v oznámení + Vytvořit oznámení o chybě + Kontrola aktualizací… + Ukázat \"Zřícení přehávače\" + Hraje již v pozadí + Nové položky feedů + Pro tuto akci nebyl nalezen žádný vhodný správce souborů. +\nProsím, nainstalujte správce souborů kompatibilní se Storage Access Framework. + Oznámení o hlášení chyb + Oznámení za účelem hlášení chyb + Pro tuto akci nebyl nalezen žádný vhodný správce souborů. +\nProsím, nainstalujte správce souborů nebo zkuste vypnout %s v nastaveních stahování. + Ukáže volbu pro zřícení během používání přehrávače + Ukázat krátké oznámení o chybě + Připnutý komentář + Zřícení přehrávače \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index d59c35edb..23abdc2da 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,8 +1,8 @@ - Tryk søg for at komme i gang + Tryk på forstørrelsesglasset for at komme i gang. Udgivet %1$s - Ingen streamafspiller blev fundet. Vil du installere VLC\? + Ingen streamafspiller blev fundet. Installer VLC\? Ingen streamafspiller fundet (du kan installere VLC for at afspille den). Installer Annuller @@ -171,7 +171,6 @@ Hvad skete der: Din kommentar (på engelsk): Detaljer: - Videominiaturebillede Videominiaturebillede Uploaders profilbillede Synes godt om diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index feb7e85c3..a4c622087 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -26,7 +26,6 @@ Nicht unterstützte URL Video und Audio Bevorzugte Sprache des Inhalts - Video-Vorschaubild Video abspielen, Dauer: Avatarbild des Benutzers Gefällt mir nicht @@ -140,7 +139,7 @@ Abonnement konnte nicht aktualisiert werden Nach Unterbrechungen (z.B. Telefonaten) Wiedergabe fortsetzen NewPipe-Benachrichtigung - Benachrichtigungen für NewPipe-Hintergrund- und Pop-up Wiedergabe + Benachrichtigungen für den NewPipe-Player Verhalten Verlauf und Cache Rückgängig machen @@ -345,8 +344,8 @@ Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Datei gelöscht - Aktualisierungsbenachrichtigung - Benachrichtigung bei neuer NewPipe-Version + Benachrichtigung über App-Update + Benachrichtigungen über neue NewPipe-Versionen Kein externer Speicher verfügbar Herunterladen auf externe SD-Karte ist nicht möglich. Downloadordner zurücksetzen\? Konnte gespeicherte Tabs nicht lesen, daher werden die Voreinstellungen genutzt @@ -371,7 +370,7 @@ pausiert eingereiht Nachbearbeitung - Warteschlange + In Wiedergabe einreihen System verweigert den Zugriff Herunterladen fehlgeschlagen Eindeutigen Namen erzeugen @@ -583,8 +582,8 @@ Vorschaubild für Sperrbildschirmhintergrund und Benachrichtigungen verwenden Vorschaubild anzeigen Hash wird berechnet - Benachrichtigungen für den Video-hashing Fortschritt - Video Hash Benachrichtigung + Benachrichtigungen über den Hashing-Fortschritt von Videos + Video-Hash Benachrichtigung Letzte Metadaten anzeigen Deaktiviere diese Option, um Meta-Infofelder mit zusätzlichen Informationen zum Stream-Ersteller, zum Stream-Inhalt oder zu einer Suchanforderung auszublenden @@ -676,7 +675,17 @@ Neue Feed-Elemente \"Absturz des Players\" anzeigen Absturz des Players - Meldet Playerfehler mit allen Details, anstatt eine kurzlebige Popupmeldung anzuzeigen (nützlich für die Diagnose von Problemen) Zeigt eine Absturzoption an, wenn der Player verwendet wird - Playerfehler melden + Benachrichtigung über Fehlerberichte + Benachrichtigungen zur Meldung von Fehlern + Bei NewPipe ist ein Fehler aufgetreten. Zum Melden antippen + Ein Fehler ist aufgetreten, siehe die Benachrichtigung + Eine Fehlermeldung erstellen + Fehler-Kurzmeldung anzeigen + Es wurde kein geeigneter Dateimanager für diese Aktion gefunden. +\nBitte installiere einen Dateimanager oder versuche, \'%s\' in den Downloadeinstellungen zu deaktivieren. + Es wurde kein geeigneter Dateimanager für diese Aktion gefunden. +\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager. + Wird bereits im Hintergrund abgespielt + Angehefteter Kommentar \ 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 bff4dea91..804cbc5bc 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -37,7 +37,6 @@ Εμφάνιση Αναπαραγωγή στο παρασκήνιο Σφάλμα δικτύου - Μικρογραφία προεπισκόπησης βίντεο Αναπαραγωγή βίντεο, διάρκεια: Μικρογραφία εικόνας προφίλ του χρήστη Like @@ -131,7 +130,7 @@ Μόνο μία φορά Αρχείο Ειδοποίηση NewPipe - Ειδοποιήσεις αναπαραγωγής παρασκηνίου και αναδυόμενου παραθύρου + Ειδοποιήσεις του αναπαραγωγέα του NewPipe [Άγνωστο] Αλλαγή σε Παρασκήνιο Αλλαγή σε Αναδυόμενο Παράθυρο @@ -344,7 +343,7 @@ Ενημερώσεις Συμβάντα Το αρχείο διαγράφηκε - Ειδοποίηση Ενημέρωσης Εφαρμογής + Ειδοποίηση ενημέρωσης εφαρμογής Ειδοποίηση για νεότερη έκδοση του NewPipe Εξωτερική μνήμη αποθήκευσης μη διαθέσιμη Η αποθήκευση στην SD κάρτα δεν είναι δυνατή. Επαναφορά στην αρχική τοποθεσία λήψης; @@ -367,7 +366,7 @@ σε παύση σε ουρά σε μετεπεξεργασία - Ουρά + Προσθήκη σε ουρά Η ενέργεια απορρίφθηκε από το σύστημα Η λήψη απέτυχε Δημιουργία μοναδικού ονόματος @@ -676,7 +675,17 @@ Νέα αντικείμενα τροφοδοσίας Εμφάνιση «κατάρρευσης αναπαραγωγέα» Εμφανίζει μια επιλογή κατάρρευσης κατά τη χρήση του αναπαραγωγέα - Αναφορά σφαλμάτων αναπαραγωγέα - Αναφορά σφαλμάτων αναπαραγωγέα με λεπτομέρειες αντί για ένα σύντομο μήνυμα (χρήσιμο για διάγνωση προβλημάτων) Κατάρρευση αναπαραγωγέα + Ειδοποίηση αναφοράς σφάλματος + Ειδοποιήσεις για την αναφορά σφαλμάτων + Συνέβη ένα σφάλμα. Δείτε την ειδοποίηση + Δημιουργία ειδοποίησης σφάλματος + Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. +\nΕγκαταστήστε έναν ή δοκιμάστε να απενεργοποιήσετε το \'%s\' στις ρυθμίσεις λήψεων. + Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. +\nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης. + Το NewPipe παρουσίασε ένα σφάλμα. Πατήστε για αναφορά + Εμφάνιση μιας snackbar σφάλματος + Αναπαράγεται ήδη στο παρασκήνιο + Καρφιτσωμένο σχόλιο \ No newline at end of file diff --git a/app/src/main/res/values-enm/strings.xml b/app/src/main/res/values-enm/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-enm/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index bdf1aa6c2..43798f344 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -38,7 +38,6 @@ Ĉiuj bildetoj ne ŝargeblas La subskribo de la ligilo de la filmeto ne malĉifreblas La retejo ne analizeblas - Bildeto de la antaŭrigardo de la filmeto Ludi filmeton, daŭro: Bildeto de la alŝutinto Elŝutujo por filmetoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ffdf60d7e..442bfeb24 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -42,7 +42,6 @@ No se pudo analizar el sitio web Mostrar vídeos \'Siguientes\' y \'Similares\' Idioma predefinido del contenido - Miniatura de previsualización del vídeo Reproducir vídeo; duración: Me gusta No me gusta @@ -140,7 +139,7 @@ Historial Historial Notificación de NewPipe - Notificaciones para reproductores en segundo plano y emergentes de NewPipe + Notificaciones para el reproductor de NewPipe Reproductor Funcionamiento Historial y caché @@ -397,7 +396,7 @@ Actualizaciones Eventos Notificación de actualización de la aplicación - Notificaciones de versiones nuevas de NewPipe + Notificaciones de nuevas versiones de NewPipe Almacenamiento externo no disponible No es posible descargar a una tarjeta SD externa. \¿Restablecer la ubicación de la carpeta de descarga\? No se pudo leer las pestañas guardadas, se usarán las pestañas predefinidas @@ -590,7 +589,7 @@ Transmisiones relacionadas Comentarios Notificaciones sobre el progreso del hashing del vídeo - Notificación del hash de vídeo + Notificación de hash de vídeo Mostrar metainformación Mostrar descripción Abrir con @@ -678,8 +677,18 @@ Buscando actualizaciones… Nuevos elementos en el muro Cerrar abruptamente el reproductor - Informar de errores del reproductor Muestra una opción de cierre abrupto al usar el reproductor - Informar de errores del reproductor con detalle en lugar de mostrar un mensaje emergente efímero (útil para diagnosticar problemas) Mostrar \"Cerrar abruptamente el reproductor\" + Notificaciones para informar errores + Notificación de informe de errores + NewPipe ha detectado un error, pulse aquí para informar + Se produjo un error, vea la notificación + Crear una notificación de error + Mostrar un snackbar de error + No se encontró ningún gestor de archivos adecuado para esta acción. +\nPor favor instale un gestor de archivos o intente deshabilitar \"%s\" en lo ajustes de descargas. + No se encontró ningún gestor de archivos adecuado para esta acción. +\nPor favor instale un gestor de archivos compatible con \"Sistema de Acceso al Almacenamiento\". + Comentario fijado + Ya se reproduce en segundo plano \ 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 ecf5faa6e..e7f75ea09 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -103,7 +103,7 @@ Üks kord Fail NewPipe teavitus - Teavitused NewPipe tausta- ja hüpikpleierile + Teavitused NewPipe pleierile [Tundmatu] Lülita taustale Lülita hüpikpleierile @@ -148,7 +148,6 @@ Mis:\\nPäring:\\nSisu keel:\\nSisu maa:\\nRakenduse keel:\\nTeenus:\\nGMT aeg:\\nPakett:\\nVersioon:\\nOS versioon: Oma kommentaar (inglise keeles): Üksikasjad: - Video eelvaate pisipilt Esita video, kestus: Üleslaadiaja avatari pisipilt Meeldib @@ -288,8 +287,8 @@ \n3. Klõpsa \"Kõigi andmetega\", vali \"Tühista kõik\", vali ainult \"Tellimused\" ja klõpsa \"OK\". \n4. Klõpsa \"Järgmine samm\" ja seejärel \"Loo eksport\". \n5. Klõpsa nupul \"Laadi alla\" siis, kui ta ilmub. -\n6. Klõpsi siitsamast \"Impordi fail\" linki ning vali allalaaditud zip fail. -\n7. Kui zip faili importimine ei toimi, siis paki .csv fail lahti (tavaliselt on see fail \"YouTube ja YouTube Muusika/tellimused/tellimused\" või \"YouTube and YouTube Music/subscriptions/subscriptions\") ja klõpsi siitsamast \"Impordi fail\" linki ning vali lahtipakitud csv fail. +\n6. Klõpsi siitsamast \"Impordi fail\" linki ning vali allalaaditud .zip fail. +\n7. Kui .zip faili importimine ei toimi, siis paki .csv fail lahti (tavaliselt on see fail \"YouTube ja YouTube Muusika/tellimused/tellimused\" või \"YouTube and YouTube Music/subscriptions/subscriptions\") ja klõpsi siitsamast \"Impordi fail\" linki ning vali lahtipakitud csv fail. See toiming võib põhjustada suurt võrguliiklust. \n \nKas jätkata? @@ -317,7 +316,7 @@ Teavita elutsüklist väljas vigadest Impordi SoundCloudi profiil trükkides URL või oma ID: \n -\n1. Luba \"töölaua režiim\" veebilehitsejas (lmobiilsete seadmete jaoks leht pole kättesaadav) +\n1. Luba \"töölaua režiim\" veebilehitsejas (mobiilsete seadmete jaoks leht pole kättesaadav) \n2. Ava URL: %1$s \n3. Logi sisse \n4. Kopeeri suunatud profiili URL. @@ -344,8 +343,8 @@ Uuendused Sündmused Fail kustutati - Rakenduse värskenduse teatis - NewPipe uuest versioonist teavitamine + Rakenduse värskenduse teavitus + Teavitus NewPipe uuetest versioonidest Väline andmekandja pole saadaval Allalaadimine välisele SD-kaardile ei ole võimalik. Kas lähtestada allalaadimiste kataloogi asukoht\? Tõrge salvestatud vahekaaride lugemisel; kasutatakse vaikeväärtusi @@ -367,7 +366,7 @@ peatatud järjekorras järeltöötlus - Esitusjärjekord + Lisa esitusjärjekorda Tegevus keelati süsteemi poolt Allalaadimine nurjus Loo kordumatu nimi @@ -674,4 +673,19 @@ Kontrolli uuendusi Kontrolli uuendusi käsitsi Uued andmevoo kirjed + Näita „jooksuta meediamängija kokku“ nupukest + Näitab valikut meediamängija kokkujooksutamiseks + NewPipe töös tekkis viga, sellest teavitamiseks klõpsi + Jooksuta meediamängija kokku + Näita veateate akent + Meedia esitamine taustal toimib juba + Teavitus vigadest + Teavitused vigadest informeerimiseks + Tekkis viga, vaata vastavat teadet + Koosta veateade + Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. +\nPalun paigalda nutiseadmesse failihaldur või proovi allalaadimiste seadistustest „%s“ välja lülitada. + Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. +\nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku. + Esiletõstetud kommentaar \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5b8161bf2..88b8d90f9 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -24,7 +24,6 @@ URLak ez du euskarririk Edukiaren hizkuntz lehenetsia Bideoa eta audioa - Bideoaren aurreikuspen argazkitxoa Erreproduzitu bideoa, iraupena: Igotzailearen abatarraren iruditxoa Ez dute gustoko @@ -142,7 +141,7 @@ Portaera Historia eta cache-a Desegin - Atzeko planoko eta laster-leihoko NewPipe erreproduzigailuen jakinarazpenak + NewPipe erreproduzigailuaren jakinarazpenak Emaitzarik ez Kilkerrak besterik ez daude hemen Harpidedunik ez @@ -218,7 +217,7 @@ Ezabatu cacheko metadatuak Kendu cachetik webguneen datu guztiak Metadatuen cachea ezabatuta - Gehitu ilarara hurrengo jarioa + Gehitu hurrengo jarioa ilarara Jarraitu bukaerako (errepikapenik gabe) ilara erlazionatutako jario bat gehituz Arazketa Fitxategia @@ -293,7 +292,7 @@ \n4. Egin klik \"Hurrengo pausua\"-n eta \"Sortu esportazioa\" \n5. Egin klik \"Deskargatu\" botoian agertzen denean \n6. Egin klik INPORTATU FITXATEGIA botoian eta hautatu deskargatutako zip fitxategia -\n6. [Zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean \"Youtube eta Youtube Music/harpidetzak/harpidetzak.csv\"), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia +\n7. [.zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean \"Youtube eta Youtube Music/harpidetzak/harpidetzak.csv\"), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia
Inportatu SoundCloud profila URL-a edo zure ID-a idatziz: \n \n1. Gaitu \"mahaigain modua\" web nabigatzailean (gunea ez dabil mugikorretan) @@ -344,7 +343,7 @@ Eguneraketak Gertaerak Fitxategia ezabatu da - Aplikazioaren eguneraketaren jakinarazpena + Aplikazioaren eguneraketen jakinarazpena NewPipe aplikazioaren bertsio berrien jakinarazpena Kanpo biltegiratzea ez dago eskuragarri Ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri nahi duzu\? @@ -367,7 +366,7 @@ pausatuta ilaran post-prozesua - Gehitu ilarara + Enkargatu Ekintza sistemak ukatu du Deskargak huts egin du Sortu izen bakana @@ -669,4 +668,24 @@ Hasi erreproduzitzaile nagusia pantaila osoan Isatsari bideo hau erantsita Gehitu bideo hau isatsari + Erakutsi \"itxi erreproduzigailua\" + Prozesatzen... Itxoin mesedez + Atzeko planoan erreproduzitzen dagoeneko + Erroreen txostenen jakinarazpena + Jakinarazpenak erroreen berri emateko + NewPipe-k errore bat aurkitu du, sakatu berri emateko + Errore bat gertatu da, ikusi jakinarazpena + Bilatu eguneraketak + Bilatu bertsio berriak eskuz + Elementu berriak jarioan + Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. +\nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat. + Ainguratutako iruzkina + Itxi erreproduzigailua + Eguneraketak bilatzen… + Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. +\nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \'%s\' desgaitzen deskarga ezarpenetan. + Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du + Erakutsi errore barra bat + Sortu errore jakinarazpen bat \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 027f593d2..20494637d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -14,12 +14,12 @@ هم‌رسانی با استفاده از پخش‌کنندهٔ ویدیوی خارجی استفاده از پخش‌کنندهٔ صدای خارجی - پوشه بارگیری ویدیو - ویدیوهای بارگیری شده اینجا ذخیره می‌شوند - پوشه بارگیری ویدیوها را انتخاب کنید - پوشه بارگیری صدا - صداهای بارگیری شده در این‌جا ذخیره می‌شوند - پوشه بارگیری صداها را انتخاب کنید + شاخهٔ بارگیری ویدیو + پرونده‌های ویدیویی بارگرفته این‌جا ذخیره می‌شوند + گزینش شاخه برای بارگیری پرونده‌های ویدیویی + شاخهٔ بارگیری صدا + پرونده‌های صوتی بارگرفته این‌جا ذخیره می‌شوند + گزینش شاخهٔ بارگیری برای پرونده‌های صوتی وضوح پیش‌گزیده پخش با کودی کارهٔ کُره (Kore) پیدا نشد. نصب شود؟ @@ -58,7 +58,6 @@ چه روی داد: توضیح شما (به انگلیسی): جزییات: - بندانگشتی پیش‌نمایش ویدیو پخش ویدیو، مدت زمان: بندانگشتی کاربر بارگذاری کننده پسندها @@ -79,9 +78,9 @@ لطفاً صبر کنید… در حافظه رونوشت شد پوشه بارگیری را بعدا در تنظیمات مشخص کنید - هیچ پخش کننده جریانی پیدا نشد (شما می‌توانید برنامه وی‌ال‌سی را برای پخش آن نصب کنید). - بارگیری پرونده جریان - حذف صدا در برخی کیفیت‌ها + هیچ پخش کنندهٔ جریانی پیدا نشد (می‌توانید برای پخشش وی‌ال‌سی را نصب کنید). + بارگیری پروندهٔ جریان + صدا را در برخی وضوح‌ها برمی‌دارد اشتراک مشترک شده اشتراک کانال لغو شد @@ -89,11 +88,11 @@ ناتوانی در به‌روزرسانی اشتراک نمایش اطلاعات اشتراک‌ها - فهرست‌های پخش دارای نشانک + سیاههٔ پخش‌های نشان شده موارد جدید - پس زمینه + پس‌زمینه افزودن به - نمایش کیفیت بالاتر + نمایش وضوح‌های بالاتر تنها برخی دستگاه‌ها توانایی پخش ویدیوهای 2K و 4K را دارند قالب ویدیویی پیش‌گزیده سیاه @@ -117,7 +116,7 @@ همیشه فقط یک‌بار پرونده - اعلان نیوپایپ + آگاهی نیوپایپ [ناشناخته] وارد کردن پایگاه‌داده صادرکردن @@ -226,14 +225,14 @@ بدون توضیحات توضحیات لغو اشتراک - انتخاب زبانه + گزینش زبانه تاریخچه تماشا تاریخچه و حافظه نهان اشکال‌زدایی به‌روزرسانی‌ها - گشودن در حالت تصویر در تصویر - دقّت پیش‌گزیدهٔ تصویر در تصویر - تصویر در تصویر + گشودن در حالت تصویردرتصویر + وضوح پیش‌گزیدهٔ تصویردرتصویر + تصویردرتصویر به یاد داشتن ویژگی‌های تصویر در تصویر به یاد داشتن آخرین اندازه و موقعیت تصویر در تصویر زمان فعلی پخش کننده را به صورت تقریبی و سریع جلو ببر @@ -247,8 +246,8 @@ می‌خواهید تنظیمات را نیز وارد کنید؟ گام پرونده پاک شد - اعلان به‌روزرسانی کاره - اعلان‌ها برای نسخه جدید نیوپایپ + آگاهی به‌روزرسانی کاره + آگاهی‌ها برای نگارش‌های جدید نیوپایپ بازنشانی پیش‌فرض‌ها می‌خواهید پیش‌فرض‌ها را بازنشانی کنید؟ به‌روزرسانی‌ها @@ -260,7 +259,7 @@ برای بارگیری، لمس کنید تمام در انتظار - صف + صف‌گذاری بارگیری ناموفق بود یافت نشد شکست در پساپردازش @@ -281,7 +280,7 @@ نمایش شاخص موقعیت پخش در فهرست‌ها پاک کردن داده‌ها پخش بعد از قطع ناگهانی (مثل برقراری تماس) ادامه یابد - نمایش نکته «برای افزودن، نگه‌دارید» + نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید کنترل اشاره ای صدا @@ -298,7 +297,7 @@ پروانه‌های شخص سوم © %1$s توسط %2$s تحت %3$s اگر ایده‌ای برای ترجمه، تغییر طراحی، پاک‌سازی کد و یا تغییرات واقعا سنگین کدنویسی دارید، از کمک‌تان همواره استقبال می‌کنیم. هر چه بیشتر کار کنیم، نتایج بهتری می‌گیریم! - آگاهی‌ها برای پخش‌کنندهٔ پس‌زمینه و تصویر در تصویر نیوپایپ + آگاهی‌ها برای پخش‌کنندهٔ نیوپایپ چیزی جز کریکت اینجا نیست فاقد مشترک خطای عدم احیای پخش‌کننده رخ داد @@ -371,7 +370,7 @@ متوقف در صف در حال پساپردازش - این کنش توسط سیستم متوقف شد + کنش به دست سامانه متوقف شد تولید نام یگانه بازنویسی یک بارگیری دیگر با همین نام در جریان است @@ -440,8 +439,8 @@ جدید می‌خواهید این گروه را پاک کنید؟ - %d مورد انتخاب شده - %d مورد انتخاب شده + %d مورد گزیده + %d مورد گزیده پردازش خوراک… بارگیری خوراک… @@ -551,9 +550,9 @@ تغییر پخش کننده می‌تواند باعث جایگزین شدن صف شود پیش از پاک کردن صف، سوال شود هیچ - برزنی + بُرزنی تکرار - حداکثر تا سه کنش را می‌توانید برای نمایش در اعلان فشرده انتخاب کنید! + می‌توانید تا سه کنش را برای نمایش در آگاهی فشرده برگزینید! هر کنش آگاهی را با لمس کردنش ویرایش کنید. با استفاده از جعبه‌های تیک، تا سه کنش را برای نمایش در آگاهی فشرده بگزینید پنجمین دکمه کنشی چهارمین دکمه کنشی @@ -611,7 +610,7 @@ زمینهٔ شب رنگی کردن آگاهی گشودن با - نشانه به عنوان دیده‌شده + نشانه به عنوان دیده شده نمایش روبان‌های رنگی پیکاسو در بالای تصویرها کهنشانگر منبعشان است: قرمز برای شبکه ، آبی برای دیسک و سبز برای حافظه درخواست از اندروید برای سفارشی‌سازی رنگ آگاهی براساس رنگ اصلی در بندانگشتی (توجّه داشته باشید که روی همهٔ افزاره‌ها در دسترس نیست) این ویدیو محدود به سن است. @@ -675,8 +674,18 @@ بررسی کردن به‌روز رسانی‌ها… موارد خوراک جدید فروپاشی پخش‌کننده - گزارش خطاهای پخش کننده نمایش یک گزینهٔ فروپاشی هنگام استفاده از پخش کننده - گزارش خطاهای پخش کننده با جزییات کامل به جای نشان دادن پیامی با عمر کوتاه (مناسب برای تشخیص مشکلات) نمایش «فروپاشی پخش کننده» + مدیر پروندهٔ مناسبی برای این کنش یافت نشد. +\nلطفاً مدیر پرونده‌ای نصب کرده یا در تنظیمات بارگیری، «%s» را خاموش کنید. + آگاهی گزارش خطا + آگاهی برای گزارش‌خطاها + نمایش یک نوار خطا + ایجاد یک آگاهی خطا + مدیر پروندهٔ مناسبی برای این کنش یافت نشد. +\nلطفاً مدیر پرونده‌ای سازگار با چارچوب‌دسترسی ذخیره‌ساز نصب کنید. + نیوپایپ به خطایی برخورد. برای گزارش، بزنید + خطایی رخ داد. آگاهی را ببینید + نظر سنجاق شده + در حال پخش در پس‌زمینه \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 713cdb38d..581ba1eb9 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -95,7 +95,6 @@ Mitä tapahtui: Sinun viesti (englanniksi): Yksityiskohdat: - Videon esikatselukuva Toista video, kesto: Lataajan hahmokuvake Tykkäykset diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 44d43ce83..d4946f545 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -25,7 +25,6 @@ Afficher les vidéos « Suivantes » et « Similaires » URL non pris en charge Vidéo et audio - Miniature d’aperçu vidéo Lecture vidéo, durée : Je n’aime pas J’aime @@ -143,7 +142,7 @@ Lecteur Comportement Historique et cache - Notifications pour les lecteurs en arrière-plan et flottant de NewPipe + Notifications pour le lecteur de NewPipe Aucun résultat Aucun contenu Aucun abonné @@ -344,7 +343,7 @@ Mises à jour Fichier supprimé Notification de mise à jour de l’application - Notifications pour une nouvelle version de NewPipe + Notifications pour des nouvelles versions de NewPipe Stockage externe indisponible Restaurer les valeurs par défaut Voulez-vous restaurer les valeurs par défaut \? @@ -676,9 +675,19 @@ Vérification des mises à jour… Vérifier les mises à jours Nouveaux éléments du flux - Reporter les erreurs du lecteur en détail au lieu de montrer un bref message éphémère (utile pour diagnostiquer les problèmes) - Reporter des erreurs du lecteur - Couper le lecteur - Montrer \"Couper le lecteur\" - Montrer une option couper lors de l\'utilisation du lecteur + Faire planter le lecteur + Afficher « Faire planter le lecteur » + Montrer une option de plantage lors de l\'utilisation du lecteur + Notification de rapport d\'erreur + Notifications pour signaler les erreurs + NewPipe a rencontré une erreur, appuyez pour la signaler + Une erreur s\'est produite, voir la notification + Créer une notification d\'erreur + Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. +\nVeuillez installer un gestionnaire de fichiers compatible avec l\'Infrastructure d\'accès au stockage. + Montrer une erreur en bas de l\'écran + Aucun gestionnaire de fichier approprié n\'a été trouvé pour cette action. +\nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver \'%s\' dans les paramètres de téléchargement. + Commentaire épinglé + Une lecture est déjà en arrière-plan \ 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 a8c9f0419..39d49f7e2 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -152,7 +152,6 @@ Que: \\n Solicitar: \\n Idioma de contido: \\n País de contido: \\n Idioma do aplicativo: \\nServicio: \\n Tempo GMT: \\n Paquete: \\n Versión: \\n versión de nOS: O teu comentario (en inglés): Detalles: - Miniatura do vídeo Reproducir o vídeo, duración: Miniatura do avatar do autor Gosto diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index fe2911168..dfbca0e4a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -98,14 +98,13 @@ ביטול לנגן הכול התראה מ־NewPipe - התראות עבור נגן הרקע והנגן הצף של NewPipe + התראות עבור הנגן של NewPipe [לא ידוע] נגינת התזרים לא הצליחה אירעה תקלה בנגן ממנה לא ניתן להשתקם מתבצעת החלמה משגיאת נגן ההערה שלך (באנגלית): פרטים: - תמונה ממוזערת לתצוגה המקדימה של הסרטון נגינת סרטון, משך: תמונה ייצוגית של המפרסם אהבו @@ -145,7 +144,7 @@ גיבוב לאימות אישור שם קובץ - תת־דיונים + תהליכי משנה שגיאה NewPipe בהורדה יש לגעת לפרטים נוספים @@ -266,8 +265,8 @@ \n3. ללחוץ על „All data included”, ואז על „Deselect all”, לאחר מכן לבחור רק את „subscriptions” וללחוץ על „OK” \n4. ללחוץ על „Next step” ואז על „Create export” \n5. ללחוץ על כפתור ה־„Download” כשהוא מופיע -\n6. ללחוץ על „ייבוא קובץ” להלן ולבחור בקובץ ה־zip שהורדת -\n7. (אם ייבוא ה־zip נכשל) יש לחלץ את קובץ ה־‎.csv (בדרך כלל תחת „YouTube and YouTube Music/subscriptions/subscriptions.csv”), ללחוץ על „ייבוא קובץ” להלן וללחוץ על קובץ ה־csv שחולץ +\n6. ללחוץ על „ייבוא קובץ” להלן ולבחור בקובץ ה־‎.zip שהורדת +\n7. (אם ייבוא ה־‎.zip נכשל) יש לחלץ את קובץ ה־‎.csv (בדרך כלל תחת „YouTube and YouTube Music/subscriptions/subscriptions.csv”), ללחוץ על „ייבוא קובץ” להלן וללחוץ על קובץ ה־csv שחולץ קצב שימוש בחיפוש מהיר ולא מדויק חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת @@ -337,7 +336,7 @@ עדכונים קובץ נמחק התראת עדכון יישומון - התראות על גרסה חדשה של NewPipe + התראות על גרסאות חדשות של NewPipe האחסון החיצוני אינו זמין אין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה\? לא ניתן לקרוא לשוניות שמורות, לכן נעשה שימוש באלו של ברירת המחדל @@ -372,7 +371,7 @@ מושהה בתור עיבוד מאוחר - תור + הוספה לתור הפעולה נדחתה על ידי המערכת ההורדה נכשלה יצירת שם ייחודי @@ -567,7 +566,7 @@ להתחיל לנגן אוטומטית — %s לנגן את התור לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? - תור אוטומטי + הוספה אוטומטית לתור התור מהנגן הפעיל יוחלף מעבר מנגן אחד למשנהו עלול להחליף את התור שלך לבקש אישור לפני מחיקת התור @@ -700,7 +699,17 @@ פריטים חדשים בהזנה להקריס את הנגן הצגת „להקריס את הנגן” - דיווח על שגיאות בנגן - מדווח על שגיאות בנגן בפירוט מלא במקום להציג הודעה שקופצת למסך לזמן קצר (יעיל לניתוח תקלות) הצגת אפשרות קריסה בעת שימוש בנגן + התראות לדיווח על שגיאות + הצגת חלונית בזק עם שגיאה + יצירת התראת שגיאה + NewPipe נתקל בשגיאה, לחיצה תדווח על כך + אירעה שגיאה, נא לקרוא את ההתראה + לא נמצא מנהל קבצים מתאים לפעולה זו. +\nנא להתקין מנהל קבצים או לנסות להשבית את ‚%s’ בהגדרות ההורדה. + התראת דיווח שגיאה + לא נמצאו מנהלי קבצים שמתאימים לפעולה הזאת. +\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 0e30cf4dd..d9e9c83d2 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -119,7 +119,6 @@ क्या:\\nमांग:\\nविषयवस्तु की भाषा:\\nसेवा:\\nजीएमटी समय:\\nपैकेज:\\nसंस्करण:\\nOS संस्करण: आपकी टिप्पणी: विवरण: - विडियो के thumbnail के पूर्व दर्शन वीडियो चलाये, समय : अपलोडर के thumbnail वाले फोटो पसंद diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 3f72baa92..09c85052c 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -92,7 +92,6 @@ Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik programa:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: Vaš komentar (na engleskom): Detalji: - Sličica pregleda videozapisa Pokreni video, trajanje: Profilna slika prenositelja Goreglasovi @@ -140,7 +139,7 @@ Povijest Povijest NewPipe obavijest - Obavijesti za NewPipe pozadinske i skočne reproduktore + Obavijesti za NewPipe reproduktore Reproduktor Ponašanje Povijest i predmemorija @@ -281,8 +280,8 @@ \n3. Pritisni „Uključeni svi podaci”, zatim „Poništi odabir svih”, a zatim odaberi samo „pretplate” i pritisni „U redu” \n4. Pritisni na „Nastavi”, a zatim „Stvori izvoz” \n5. Pritisni na „Preuzmi” -\n6. Dolje pritisni na UVEZI DATOEKU i odaberi zip datoteku za peuzimanje -\n7. [Ako uvoz zip datoteke ne uspije] Izdvoji .csv datoteku (pod \"YouTube and YouTube Music/subscriptions/subscriptions.json\"). Dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku
+\n6. Dolje pritisni na UVEZI DATOEKU i odaberi .zip datoteku za peuzimanje +\n7. [Ako uvoz .zip datoteke ne uspije] Izdvoji .csv datoteku (pod \"YouTube and YouTube Music/subscriptions/subscriptions.json\"). Dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku
vašID, soundcloud.com/vašID Uzmite u obzir da ova operacija može uzrokovat veliku potrošnju prometa. \n @@ -305,7 +304,7 @@ Ažuriranja Događaji Datoteka obrisana - Obavijest za novu verziju NewPipe-a + Obavijest za nove NewPipe verzije Briše povijest ključnih riječi pretraživanja Vanjska pohrana nije dostupna Ažuriranja @@ -685,4 +684,11 @@ Prijedlozi lokalne pretrage Traži nove verzije Nemoj pokretati videa u mini reproduktoru, već se izravno pokreni cjeloekranski prikaz, ako je automatsko okretanje zaključano. Mini reproduktoru i dalje možeš pristupiti izlaskom iz cjeloekranskog prikaza + Novi feedovi + Obavijest o prijavi greške + Obavijesti za prijavu grešaka + Stvori obavijest o grešci + NewPipe je naišao na grešku, dodirni za prijavu + Došlo je do greške, pogledaj obavijest + Prekini rad playera \ 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 e5c9c1bb3..cc398b4d9 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ Közzétéve: %1$s - Nem megfelelő médialejátszó. Szeretné telepíti a VLC médialejátszót\? + Nem található megfelelő médialejátszó. Telepíti a VLC-t\? Telepítés Mégse Megnyitás böngészőben @@ -9,76 +9,75 @@ Letöltés Keresés Beállítások - Erre gondoltál: %1$s\? + Erre gondolt: „%1$s”\? Megosztás ezzel Videofájlok letöltési mappája - A letöltött videók itt lesznek tárolva + A letöltött videófájlok itt lesznek tárolva Válasszon letöltési mappát a videófájloknak Alapértelmezett felbontás - Lejátszás Kodi-val - Telepíted a Kore lejátszót\? - \"Lejátszás Kodi-val\" opció mutatása - Opció mutatása a videók Kodi médiaközponttal való lejátszására + Lejátszás Kodival + Telepíti a hiányzó Kore alkalmazást\? + A „Lejátszás Kodival” lehetőség megjelenítése + A videók Kodi médiaközponttal történő lejátszásának megjelenítése Hang - Alapértelmezett hang formátum + Alapértelmezett hangformátum Letöltés - Nem támogatott webcím + Nem támogatott URL Külső videólejátszó használata Külső hanglejátszó használata - Válaszd ki a hangfájlok letöltési helyét + Válassza ki a hangfájlok letöltési helyét Hálózati hiba - Lejátszás háttérben + Lejátszás a háttérben Videó és hang Megjelenés - Tartalom preferált nyelve - \'Következő\' és \'Hasonló\' videók mutatása + Tartalom alapértelmezett nyelve + „Következő” és „Hasonló” videók megjelenítése Sötét Világos Téma Hangfájlok letöltési mappája - A letöltött hangfájlok itt találhatóak + A letöltött hangfájlok itt lesznek tárolva Tetszik Nem tetszik - Előnézeti kép Videó lejátszása, hossz: - Fetöltő profilképe + Fetöltő profilképének bélyegképe Tartalom Korhatáros tartalom megjelenítése Hiba - A tartalom nem elérhető + A tartalom nem érhető el Élő Jelentés Információ: Ez történt: - Megjegyzésed (angolul): + Az Ön megjegyzése (angolul): Részletek: - Sajnos hiba történt. + Elnézet, valami balul sült el. Elnézést, ennek nem kellett volna megtörténnie. Hiba bejelentése e-mailben - Nem sikerült a letöltés menü beállítása - Nem sikerült a videó URL aláírás azonosítása + 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 Videó - Audio - A kezdéshez koppints a \"Keresés\"-re. - Nem sikerült az összes előnézeti kép betöltése - Nem sikerült a weblap betöltése + Hang + A kezdéshez koppintson a nagyítóra. + Nem sikerült az összes bélyegkép betöltése + Nem sikerült a weblap feldolgozása Letöltések Letöltések - Hibabejelentés - Indít - Szünet + Hibajelentés + Indítás + Szüneteltetés Törlés - Ellenőrző összeg + Ellenőrzőösszeg Rendben Fájlnév - Threadek + Szálak Hiba NewPipe letöltés folyamatban - Katt a részletekért - Kérlek várj… + Koppintson a részletekért + Kis türelmet… Vágólapra másolva - Kérlek, válassz egy létező könyvtárat a letöltésekhez + Adjon meg később egy letöltési mappát a beállításokban Csatornáról leiratkozva Nem sikerült megváltoztatni a feliratkozást Nem sikerült frissíteni a feliratkozást @@ -87,25 +86,25 @@ Újdonságok Háttér Felugró ablak - Nem található stream lejátszó alkalmazás (feltelepítheted a VLC-t a lejátszáshoz). + Nem található lejátszó a közvetítéshez (feltelepítheti a VLC-t a lejátszáshoz). Megnyitás felugró módban Néhány felbontásnál eltávolítja a hangot Feliratkozás Feliratkozva - Több infó - Alapértelmezett felugró ablak felbontása - Mutassa a magasabb felbontásokat - Csak néhány eszköz tud lejátszani 2K/4K videókat - Alapértelmezett videó formátum + További infó + Felugró ablak alapértelmezett felbontása + Magasabb felbontások megjelenítése + Csak bizonyos eszközök tudnak 2K/4K-s videókat lejátszani + Alapértelmezett videoformátum Fekete - Jegyezze meg a felugró ablak helyét és méretét - Jegyezze meg a felugró ablak előző helyét és méretét + Felugró ablak tulajdonságainak megjegyzése + A felugró ablak előző helyének és méretének megjegyzése Keresési javaslatok - Mutasson javaslatokat keresés közben + Válassza ki a keresési javaslatokat keresés közben Keresési előzmények - Előzmények - Megnézett videók nyomon követése - Lejátszás folytatása félbeszakítás után (pl.: telefonhívás) + Megtekintési előzmények + Megtekintett videók nyomon követése + Lejátszás folytatása félbeszakítások után (például telefonhívás) Lejátszó Működés Előzmények és gyorsítótár @@ -120,32 +119,32 @@ Összes lejátszása Mindig Csak egyszer - NewPipe Értesítés - Értesítések a NewPipe háttér- és felugró ablak lejátszójához + NewPipe értesítés + Értesítések a NewPipe lejátszójához [Ismeretlen] Adatbázis importálása Adatbázis exportálása - Felülírja a jelenlegi előzményeket, feliratkozásokat, lejátszási listákat és (választható) beállításokat + Felülírja a jelenlegi előzményeket, feliratkozásokat, lejátszási listákat és (választhatóan) a beállításokat Előzmények, feliratkozások, lejátszási listák és beállítások exportálása - Alkalmazás/Kezelő felület összeomlott - Videó lejátszása sikertelen - A külső lejátszó nem támogatja az ilyen típusú linkeket - Nem található videó formátum - Nem található hang csatorna + Az alkalmazás/kezelőfelület összeomlott + Nem sikerült a videó lejátszása + A külső lejátszó nem támogatja az ilyen típusú hivatkozásokat + Nem található videó adatfolyam + Nem található hang adatfolyam Mi:\\nKérés:\\nTartalom nyelve:\\nTartalom származási országa:\\nAlkalmazás nyelve:\\nSzolgáltatás:\\nGMT idő:\\nCsomag:\\nVerzió:\\nOperációs rendszer verzió: Nincs találat - Adatfolyam fájl letöltése + Közvetítési fájl letöltése Hozzáadás ehhez Gyorsabb, de pontatlan tekerés használata - A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kevesebb pontossággal. Az 5, 15, vagy 25 másodperces tekerés nem működik ebben a módban. + A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kisebb pontossággal. Az 5, 15, vagy 25 másodperces tekerés nem működik ebben a módban. Bélyegképek betöltése - Kapcsold ki, hogy a megelőzzed bélyegképek betöltését, így csökkentve az adat és memória használatot. Ennek az értéknek a megváltoztatása törli a memóriában és a meghajtón lévő bélyegkép gyorsítótárat. + Kapcsolja ki, hogy a megelőzze a bélyegképek betöltését, így csökkentve az adat- és memóriahasználatot. A megváltoztatása törli a memóriában és a meghajtón lévő képgyorsítótárat. A bélyegkép gyorsítótár törölve - Gyorsítótárazott metaadat törlése - Minden gyorsítótárazott weboldal adat törlése - A metaadat gyorsítótár törölve lett - Következő videó automatikus lejátszása - Keresési előzmények tárolása az eszközön + Gyorsítótárazott metaadatok törlése + Minden gyorsítótárazott weboldaladat törlése + A metaadatok gyorsítótára törölve lett + Következő videó automatikus sorba állítása + Keresési előzmények helyi tárolása Csatornák Lejátszási listák Zeneszámok @@ -154,26 +153,26 @@ Folytatás a háttérben Folytatás felugró ablakban Megtekintési előzmények törlése - Eltávolítja a megtekintési előzményeket és a lejátszási pozíciókat - Törlöd az összes megtekintési előzményt\? - Megtekintési előzmények törölve. + Törli a megtekintési előzményeket és a lejátszási pozíciókat + Törli az összes megtekintési előzményt\? + Megtekintési előzmények törölve Keresési előzmények törlése - Eltávolítja a kereséshez használt kifejezéseket az előzményekből - Törlöd az összes keresési előzményt\? - Keresési előzmények törölve. - Lejátszási hiba történt - Lejátszási hiba helyreállítása + Eltávolítja a keresési kulcsszavakat az előzményekből + Törli az összes keresési előzményt\? + Keresési előzmények törölve + Helyreállíthatatlan lejátszóhiba történt + Lejátszóhiba helyreállítása Nincs ilyen mappa - Nincs ilyen fájl vagy tartalom forrás - A fájl nem létezik vagy jogosultság az olvasáshoz és íráshoz hiányzik - A fájl neve nem lehet üres + Nincs ilyen fájl- vagy tartalomforrás + A fájl nem létezik, vagy hiányzik az olvasási vagy írási jogosultság + A fájlnév nem lehet üres Hiba történt: %1$s - Nincs letölthető adatforrás + Nincs letölthető adatfolyam Nincs itt semmi pár tücskön kívül Húzza az átrendezéshez e - M - Mrd + m + M Nincs feliratkozó %s feliratkozó @@ -187,7 +186,7 @@ Nincs videó %s videó - %s videók + %s videó Létrehozás Átnevezés @@ -195,107 +194,108 @@ \na felugró ablakban történő megnyitáshoz 1 elem törölve. reCAPTCHA rejtvény - reCAPTCHA rejtvény igényelve + reCAPTCHA rejtvény kérve Letöltés Fájlnevekben engedélyezett karakterek - Érvénytelen karakterek ezzel az értékkel kerülnek helyettesítésre + Az érvénytelen karakterek erre az értékre lesznek lecserélve Csere karakter Betűk és számok Legtöbb speciális karakter Nincs a fájl lejátszásához szükséges alkalmazás telepítve - A NewPipe alkalmazásról - Az alkalmazásról - Engedélyek - Ingyenes, egyszerű streamelés Androidon. + A NewPipe névjegye + Névjegy + Licencek + Szabad, egyszerű közvetítésnézés Androidon. Közreműködés - Legyen ötleted a fordítással, a megjelenéssel, a forrás kód tisztításával vagy komolyabb átszervezésével kapcsolatban, bármilyen segítséget szívesen fogadunk. Járulj hozzá az alkalmazás fejlesztéséhez! - Megtekintés GitHubon + Legyen ötleted a fordítással, a dizájnnal, a forráskód tisztításával vagy egy komolyabb átszervezésével kapcsolatban, bármilyen segítséget szívesen fogadunk. Minél több minden készül el, annál jobb lesz! + Megtekintés a GitHubon Adományozás - A NewPipe alkalmazást önkéntesek fejlesztik az ő szabadidejükben, hogy a lehető legjobb felhasználói élményt hozzák el neked. Járulj hozzá, hogy segítsd a fejlesztőket amíg ők egy csésze kávét szürcsölnek, hogy még jobbá tehessük a NewPipe-ot. + A NewPipe alkalmazást önkéntesek fejlesztik a szabadidejükben, hogy a lehető legjobb felhasználói élményt nyújtsák. Járuljon hozzá, hogy a fejlesztők még jobbá tegyék alkalmazást, miközben egy csésze kávét szürcsölnek. Hozzájárulás Honlap - Látogasd meg a NewPipe honlapját további információkért és hírekért! + Látogassa meg a NewPipe honlapját további információkért és hírekért. A NewPipe adatvédelmi irányelvei - A NewPipe projekt komolyan veszi az adataid védelmét. Az alkalmazás nem gyűjt semmilyen adatot a beleegyezésed nélkül. + A NewPipe projekt komolyan veszi az adatvédelmét. Az alkalmazás nem gyűjt semmilyen adatot a beleegyezése nélkül. \nA NewPipe adatvédelmi irányelve részletesen elmagyarázza, mely adatok kerülnek elküldésre és tárolásra az alkalmazás összeomlásának jelentésekor. - Az adatvédelmi irányelvek elolvasása + Adatvédelmi irányelvek elolvasása A NewPipe licence Licenc elolvasása Előzmények Előzmények - Törölni kívánja ezt az elemet a keresési előzmények közül\? + Törli ezt az elemet a keresési előzmények közül\? Utoljára lejátszott Legtöbbet lejátszott Főoldal tartalma Üres oldal Újságárus oldal - Csatorna oldal - Csatorna választása - Még nincs csatorna feliratkozás - Újságárus választása + Csatornaoldal + Válasszon egy csatornát + Még nincs csatornafeliratkozás + Válasszon egy újságárust Exportálva Importálva - Nem érvényes ZIP fájl + Nem érvényes ZIP-fájl Figyelmeztetés: nem sikerült az összes fájl importálása. Ez felül fogja írni a jelenlegi beállításokat. - A beállításokat is importálni kívánja\? + A beállításokat is importálja\? Felkapott Top 50 - Új és friss + Új és népszerű Eltávolítás Részletek - Hang beállítások + Hangbeállítások Alapértelmezett tevékenység „%s” típusú tartalom megnyitásakor Videólejátszó Lejátszás háttérben Felugró ablakos lejátszás - Mindig kérdezz rá + Mindig kérdezzen Információk gyűjtése… Kért tartalom betöltése Új lejátszási lista Átnevezés Név Lejátszási listához adás - Beállítás lejátszási lista indexképeként - Könyvjelző törlése - Törlődjön ez a lejátszási lista\? - Lejátszási listsa létrehozva - Hozzáadva lejátszási listához - Lejátszási lista előképe megváltozott. - Felirat kikapcsolva - Illeszkedés + Beállítás a lejátszási lista bélyegképeként + Könyvjelző eltávolítása + Törli ezt a lejátszási listát\? + Lejátszási lista létrehozva + Lejátszási listához adva + A lejátszási lista bélyegképe megváltozott. + Nincs felirat + Igazítás Kitöltés - Közelítés + Nagyítás Automatikusan létrehozott Feliratok - Feliratok méretének és hátterének stílusbeli módosítása. A módosítások életbelépésehez az alkalmazás újraindítása szükséges. - Import + Feliratok méretének és hátterének stílusbeli módosítása. A módosítások életbe lépésehez az alkalmazás újraindítása szükséges. + Importálás Importálás a következőből Exportálás a következőbe Importálás… Exportálás… Fájl importálása Előző exportálás - Sikertelen a feliratkozások importálása - Sikertelen a feliratkozások exportálása - YouTube feliratkozások importálása Google takeout-ból: + A feliratkozások importálása nem sikerült + A feliratkozások exportálása nem sikerült + YouTube feliratkozások importálása a Google Takeoutból: \n -\n1. Navigálj erre az oldalra: %1$s -\n2. Jelentkezz be -\n3. Kattints a \"All data included/Minden adat\"-ra, majd a \"Deselect all/MInden kijelölés megszüntetése\" gombra, majd válaszd ki a \"subscriptions/feliratkozások\" és kattints az \"OK\"-ra -\n4. Kattints a \"Next step/Következő lépés\", majd az \"Create export/Export létrehozása\" gombra -\n5. Kattints a \"Download/Letöltés\" gombra, mikor megjelenik, majd -\n6. A letöltött zip fájlból csomagold ki a .json fájlt (általában: \"YouTube and YouTube Music/subscriptions/subscriptions.json\"), majd importáld itt. - Importálja SoundCloud profilját az URL vagy az azonosítójának begépelésével: +\n1. Navigáljon erre az oldalra: %1$s +\n2. Jelentkezzen be, ha kérik +\n3. Kattintson „Az összes adatot tartalmazza” gombra, majd a „Kijelölések megszüntetése” gombra, majd válassza ki a „feliratkozások” lehetőséget és kattintson az „OK” gombra +\n4. Kattintson a „Következő lépés”, majd az \"Exportálás indítása” gombra +\n5. Kattintson a „Letöltés” gombra, amikor megjelenik, +\n6. Kattintson a lenti FÁJL IMPORTÁLÁSA gombra, és válassza ki a letöltött ZIP-fájlt +\n7. [Ha a ZIP-fájl importálása nem sikerül] Bontsa ki a .csv fájlt (általában: „YouTube és YouTube Music/feliratkozások/feliratkozások.csv\"), majd kattintson lent a FÁJL IMPORTÁLÁSA gombra, és válassza az exportált CSV-fájlt + SoundCloud-profil importálása az URL vagy az azonosítójának begépelésével: \n -\n1. Az oldal mobileszközökön nem elérhető, így „asztali böngésző mód” szükséges -\n2. Navigáljon erre az oldalra: %1$s -\n3. Jelentkezzen be +\n1. A webböngészőben engedélyezze az „asztali módot” (az oldal nem érhető el mobileszközökön) +\n2. Navigáljon erre az URL-re: %1$s +\n3. Jelentkezzen be, ha kéri \n4. Másolja ki a profil URL-t, ahova át lett irányítva. - azonosítód, soundcloud.com/azonosítód - Ez a művelet adatforgalom igényes lehet. + saját azonosítója, soundcloud.com/azonosító + Ez a művelet adatforgalom-igényes lehet. \n -\nFolytatni kívánja\? +\nBiztos, hogy folytatja\? Ütem Hangmagasság Előrepörgetés csend alatt @@ -304,142 +304,143 @@ Elfogadás Elutasítás Nincs korlát - Felbontás korlátozása mobilinternet használata esetén - Művelet alkalmazás váltásakor a fő videólejátszóról — %s + Felbontás korlátozása mobil adatkapcsolat használata esetén + A fő videólejátszóról más alkalmazásra történő váltáskor teendő művelet — %s Ne tegyen semmit Lejátszás folytatása a háttérben Lejátszás folytatása felugró ablakban Lejátszás folytatása - Mutassa a \"Tartsa lenyomva a hozzáadáshoz\" tippet + A „Tartsa lenyomva a sorba állításhoz\" tipp megjelenítése Leiratkozás - Válassz fület - Kommentek mutatása - Kapcsold ki a kommentek elrejtéséhez - Alapértelmezett ország tartalom + Válasszon lapot + Megjegyzések megjelenítése + Kapcsolja ki a megjegyzések elrejtéséhez + Tartalom alapértelmezett országa Folytatás főnézetben - Figyelmen kívül hagy - Lejátszási lista könyvjelzők közé - Hasonló videó beadása az utolsó videó után egy nem ismétlődő sorban + Eltüntetés + Lejátszási lista könyvjelzőzése + Egy hasonló videó hozzáadása a befejeződő (nem ismétlődő) lejátszási sorhoz Sor a fájl nem írható felül Az előre- és visszatekerés időtartama Utolsó lejátszási pozíció visszaállítása Lejátszás folytatása - Jelentés új NewPipe verzióról - Alkalmazás-frissítés jelzése - File törölve + Értesítések az új NewPipe verziókról + Alkalmazásfrissítés értesítése + Fájl törölve Frissítések - Tipp mutatása háttér vagy felbukkanó gomb megnyomásakor a videó részletei oldalon + Tipp megjelenítése, ha megnyomja a hátteret vagy a felugró gombot a videó részleteinél Automatikus lejátszás Adatok törlése - Lejátszási pozíciók mutatása a listákban + Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban - Gesztusvezérlés használata fényerő szabályzásra + Gesztusok használata a fényerő szabályozásához Fényerő gesztus - Gesztusvezérlés használata hangerő szabályzásra + Gesztusok használata a lejátszó hangerejének szabályzásához Hangerő gesztus - A rendszer megkérdezi, hogy hova mentse el az egyes letöltéseket + 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 Letöltések szüneteltetése Letöltések indítása - Egyszerre egy letöltés fog futni ugyanabban az időben - Korlátozza a letöltési sort - Bezár - Hasznos, amikor átvált a mobil adatokra, bár néhány letöltést nem lehet felfüggeszteni - Megszakítás a mért hálózatokon - A letöltés megszakítása előtti kísérletek maximális száma - Maximális próbálkozások - Állj + Egyszerre csak egy letöltés fog futni + Letöltési sor korlátozása + Bezárás + Hasznos, ha mobil adatkapcsolatra vált, bár néhány letöltést nem lehet felfüggeszteni + Félbehagyás a forgalomkorlátos hálózatokon + A letöltés megszakítása előtti kísérletek legnagyobb száma + Próbálkozások legnagyobb száma + Leállítás Letöltött fájlok törlése Törli a letöltési előzményeket, vagy törli az összes letöltött fájlt\? Letöltési előzmények törlése - A letöltést nem lehet visszaállítani - Kapcsolat időtúllépés - A folyamat elveszett, mert a fájlt törölték + A letöltést nem lehet helyrehozni + Kapcsolati időtúllépés + Az előrehaladás elveszett, mert a fájlt törölték Nincs hely az eszközön - NewPipe leállt a fájl feldolgozása közben + A NewPipe leállt a fájl feldolgozása közben Utófeldolgozás sikertelen Nincs talalat - A szerver nem fogad többszálú letöltést, próbálkozzon újra @ string / msg_threads = 1 - A szerver nem küld adatokat - Nem lehet csatlakozni a szerverhez - A szerver nem talalható + A kiszolgáló nem fogad többszálú letöltést, próbálkozzon újra ezzel: @string/msg_threads = 1 + A kiszolgáló nem küld adatokat + Nem lehet csatlakozni a kiszolgálóhoz + A kiszolgáló nem található Nem sikerült biztonságos kapcsolatot létesíteni A célmappa nem hozható létre A fájlt nem lehet létrehozni Hiba megjelenítése - Ezzel a névvel egy letötés már várakozás alatt áll + Ezzel a névvel egy letöltés már várakozik Ezzel a névvel egy letöltés már folyamatban van - Az ilyen névvel letöltött fájl már létezik - Az ilyen névű fájl már létezik - Átír - Generáljon egyedi nevet + Ilyen névű letöltött fájl már létezik + Ilyen névű fájl már létezik + Felülírás + Egyedi név előállítása Letöltés sikertelen - Helyrehozás - Utófeldolgozás - Sorban álló - Szünet + helyrehozás + utófeldolgozás + sorba állítva + szüneteltetve Függőben lévő Befejezett - Kattints a letöltéshez - NewPipe frissítés elérhető! - Auto + Kattintson a letöltéshez + NewPipe frissítés érhető el! + Automatikus Rács Lista Lista nézet - File áthelyezve vagy törölve - Külső SD-kártyára mentés nem lehetséges. Visszaállítsuk a letöltési mappa helyét\? - Külső tárhely nem elérhető - Lejátszási pozíciók törölve. - Összes lejátszási pozíció törlése\? + A fájl áthelyezve vagy törölve + A külső SD-kártyára történő mentés nem lehetséges. Visszaállítja a letöltési mappa helyét\? + A külső tárhely nem érhető el + Lejátszási pozíciók törölve + Törli az összes lejátszási pozíciót\? Összes lejátszási pozíció törlése Lejátszási pozíciók törlése Találatok a következőre: %s - Bélyegkép méretezése 1:1 arányra + Bélyegkép méretezése 1:1-es arányra Értesítés színezése Semmi Keverés Ismétlés Leírás megjelenítése - Bufferelés + Pufferelés Megnyitás ezzel - Az URL-t nem lehetett felismerni. Megnyitás másik alkalmazással\? + Az URL-t nem lehetett felismerni. Megnyitja másik alkalmazással\? Automatikus sorba állítás - "Kikapcsolása elrejti a videó leírását és a kapcsolódó információt" - Vissza akarod állítani az alapértelmezéseket\? + Kapcsolja ki, hogy elrejtse a videó leírását és a további információkat + Visszaállítja az alapértelmezéseket\? Ez a videó korhatáros. -\nÚj, korhatáros videókkal kapcsolatos YouTube irányelvek miatt a NewPipe nem férhet hozzá a videóhoz, így nem tudja lejátszani. +\nAz új, korhatáros videókkal kapcsolatos YouTube irányelvek miatt a NewPipe nem férhet hozzá a videóhoz, így nem tudja lejátszani. Leírás Megjegyzések - Formázott jelentése másolása - Adj engedélyt a más alkalmazások feletti megjelenéshez - Még nincsenek lejátszási lista könyvjelzők + Formázott jelentés másolása + Adjon engedélyt a más alkalmazások feletti megjelenéshez + Még nincs könyvjelző lejátszási listához Némítás megszüntetése Némítás Nincs betöltve: %d Üres csoportnév - Törölni szeretnéd ezt a csoportot\? + Törli ezt a csoportot\? Mindig frissítsen Készítette: %s - Lejátszási listák oldala + Lejátszási lista oldal Bélyegkép használata a zárképernyőn és az értesítéseken is Rádió - Válaszd ki kedvenc éjszakai témád — %s - Kiválaszthatod a kedvenc éjszakai témádat lentebb + Válassza ki a kedvenc éjszakai témáját — %s + Lent kiválaszthatja a kedvenc éjszakai témáját Nemrég hozzáadott Az ExoPlayer korlátai miatt az előre- és visszatekerés időtartama %d másodpercre lett állítva - Csatorna csoportok - Rendszer által alapértelmezett - Az Általános adatvédelmi rendeletnek (GDPR) való megfelelés érdekében felhívjuk figyelmed a NewPipe adatvédelmi nyilatkozatára. Kérjük olvasd el figyelmesen. -\nEl kell fogadnod, ha jelenteni szeretnél programhibákat. + Csatornacsoportok + Rendszer alapértelmezése + Az Általános adatvédelmi rendeletnek (GDPR) való megfelelés érdekében felhívjuk figyelmét a NewPipe adatvédelmi nyilatkozatára. Olvassa el figyelmesen. +\nEl kell fogadnia, ha hibajelentést szeretne küldeni. Alkalmazás összeomlasztása - Memóriaszivárgások mutatása - A memóriaszivárgás-monitorozás az alkalmazás megállását okozhatja amíg a dinamikus memória mentése folyik + Memóriaszivárgások megjelenítése + A memóriaszivárgás-monitorozás az alkalmazás megállását okozhatja, amíg a dinamikus memória mentése folyik Automatikusan létrehozott (feltöltő nem található) Lejátszási sor Konferenciák - Legtöbbet lájkolt - Mely oldalak kerülnek a főoldalon megjelenítésre + Legkedveltebb + Mely oldalak jelennek meg a főoldalon %s hallgató %s hallgató @@ -450,58 +451,57 @@ %s néző Senki sem nézi - Feliratkozók száma nem érhető el + A feliratkozók száma nem érhető el Helyi - A nyelv meg fog változni amint az alkalmazás újra lesz indítva. + A nyelv az alkalmazás újraindításakor fog megváltozni Megjegyzések betöltése sikertelen - Lejátszási lista kiválasztása + Válasszon egy lejátszási listát Lejátszás automatikus indítása — %s Lejátszás sebességének beállítása - Lejátszó váltása törölheti a lejátszási sort + Az egyik lejátszóról a másikra váltás törölheti a lejátszási sort Csak Wi-Fi-hálózaton - SAF használata - A \'Storage Access Framework\' lehetővé teszi a letöltések külső SD-kártyára történő mentését. -\nBizonyos eszközökön nem támogatott - A műveletet letiltotta a rendszer + Rendszermappa-választó (SAF) használata + A „Storage Access Framework” lehetővé teszi a letöltések külső SD-kártyára történő mentését + A rendszer megtagadta a műveletet Soha Feliratkozások kiválasztása © %1$s %2$s, %3$s licenc alatt Harmadik féltől származó licencek Kész - Nincsenek megjegyzések + Nincs megjegyzés ∞ videó 100+ videó - Jelentés GitHub-on - Alapértékek visszaállítása - Segítség - Sütik törlése, amelyeket a NewPipe akkor ment, amikor megoldasz egy reCAPTCHA-t + Jelentés a GitHubon + Alapértelmezések visszaállítása + Súgó + Sütik törlése, amelyeket a NewPipe akkor ment, amikor megold egy reCAPTCHA-t reCAPTCHA sütik törölve reCAPTCHA sütik törlése Előadók Albumok - Dalok + Számok Események Videók Ez a videó korhatáros. \n -\nEngedélyezd a(z) \"%1$s\" beállítást ha meg szeretnéd tekinteni. - Gyermekek számára potenciálisan nem megfelelő, korhatáros tartalom mutatása (pl. 18+) +\nEngedélyezze a(z) „%1$s” beállítást, ha meg szeretné tekinteni. + Gyermekek számára esetlegesen nem megfelelő, korhatáros tartalom megjelenítése (például 18+) Értesítés - Csak HTTPS URL-ek támogatottak - Metaadatok mutatása + Csak a HTTPS URL-ek támogatottak + Metainformációk megjelenítése A jelenleg aktív lejátszási sor le lesz cserélve - Kérjen megerősítést a lejátszási sor törlése előtt + Megerősítés kérése a lejátszási sor törlése előtt Éjszakai téma - Értesítés az alkalmazás frissítéséhez, amikor egy új verzió érhető el + Frissítési értesítés megjelenítése, amikor egy új verzió érhető el Frissítések - Az Android igazítsa az értesítés színét a bélyegkép meghatározó színéhez (nem minden eszközön elérhető) - Legfeljebb három választható művelet jeleníthető meg a kompakt értesítésben! - Szabd személyre, hogy az értesítésben megjelenő akciógombok mit csinálnak. Válassz ki legfeljebb hármat a jobb oldali jelölőnégyzetekkel, amelyek a kompakt értesítésben is megjelennek. - Ötödik akciógomb - Negyedik akciógomb - Harmadik akciógomb - Második akciógomb - Első akciógomb + Az Android igazítsa az értesítés színét a bélyegkép meghatározó színéhez (nem minden eszközön érhető el) + Legfeljebb három művelet jeleníthető meg a kompakt értesítésben. + Koppintással szerkesztheti az egyes értesítéseken megjelenő műveleteket. Válasszon ki legfeljebb hármat a jobb oldali jelölőnégyzetekkel, amelyek a kompakt értesítéseken is megjelennek. + Ötödik műveletgomb + Negyedik műveletgomb + Harmadik műveletgomb + Második műveletgomb + Első műveletgomb Alkalmazás nyelve %d másodperc @@ -525,47 +525,167 @@ %d kiválasztva Új - Ez a tartalmat még nem támogatja a NewPipe. + Ezt a tartalmat még nem támogatja a NewPipe. \n \nRemélhetőleg egy következő verzióban már támogatott lesz. - Nincs a készülékeden olyan alkalmazás, amely meg tudja nyitni ezt - Ez a videó csak YouTube Music Prémium előfizetők számára érhető el, így nem megtekinthető és nem letölthető NewPipe segítségével. + Nincs a készülékén olyan alkalmazás, amely meg tudja ezt nyitni + Ez a videó csak YouTube Music Prémium előfizetők számára érhető el, így nem tekinthető meg és nem tölthető le a NewPipe-pal. Automatikus (rendszertéma) - Ez a tartalom csak előfizetőknek érhető el, nem megtekinthető és nem letölthető a NewPipe segítségével. - Ez a tartalom nem érhető el az országodban. - Ez a tartalom privát, így nem megtekinthető és nem letölthető a NewPipe segítségével. + Ez a tartalom csak előfizetőknek érhető el, nem tekinthető meg és nem tölthető le a NewPipe-pal. + Ez a tartalom nem érhető el az országában. + Ez a tartalom privát, így nem tekinthető meg és nem tölthető le a NewPipe-pal. A letöltés elkezdődött - Értesítésben megjelenő bélyegkép átméretezése 16:9 helyett 1:1 arányra (torzítással járhat) + Értesítésben megjelenő bélyegkép átméretezése 16:9-es helyett 1:1-es arányra (torzítással járhat) Fejezetek - Bélyegkép mutatása - Lejátszás felugró ablakban - Lejátszás a háttérben - Sorhoz hozzáadva - Sorhoz adás - Mentett fülek olvasása sikertelen, alapértelmezettek használata - Értesítések a videó hashelési folyamathoz - Videó hash értesítés - YouTube biztosít egy \"Korlátozott Módot\" ami elrejti a lehetséges felnőtteknek szóló tartalmat - YouTube \"Korlátozott Mód\"-jának bekapcsolása + Bélyegkép megjelenítése + Lejátszás indítása felugró ablakban + Lejátszás indítása a háttérben + Sorba állítva + Sorba állítás + Nem sikerült a mentett lapok olvasása, alapértelmezettek használata + Értesítések a videók ujjlenyomatkészítési folyamatához + Videó ujjlenyomat-készítési értesítése + A YouTube biztosít egy „Korlátozott módot”, amely elrejti a lehetséges felnőtteknek szóló tartalmat + A YouTube „Korlátozott módjának” bekapcsolása A példány már létezik - Pédány érvényesítése nem sikerült - Példány URL megadása + A példány érvényesítése nem sikerült + Adja meg a példány URL-ét Példány hozzáadása - A neked tetsző példányokat megtalálhatod itt: %s - Válaszd ki a kedvenc PeerTube példányaidat + Találjon önnek tetsző példányokat itt: %s + Válassza ki a kedvenc PeerTube példányait PeerTube példányok Életciklusából kifutott hibák jelentése - Preferált \'nyitási\' cselekedet + Előnyben részesített „megnyitási” művelet Fiók bezárása Fiók megnyitása Csatorna részleteinek megjelenítése - Tartsd hogy sorba állítsd - Alap Kiosk - A NewPipe egy copyleft szabad szoftver: Felhasználhatod, tanulmányozhatod, megoszthatod és fejlesztheted akaratod szerint. Konkrétan továbbadhatod és/vagy módosíthatod a GNU General Public License feltételei alatt ami a Free Software Foundation álltal lett publikálva, vagy a 3. verzióját a licensznek, vagy (a saját opciód szerint), bármelyik későbbi verzióját. + Tartsa a sorba állításhoz + Alapértelmezett újságárus + A NewPipe egy copyleft szabad szoftver: tetszése szerint felhasználhatja, tanulmányozhatja, megoszthatja és fejlesztheti. Egész pontosan a Free Software Foundation által kiadott GNU General Public License 3-as, vagy (választható módon) újabb verziójának feltételei szerint módosíthatja vagy adhatja tovább. Megoldás - Nyomj a \"Kész\"-re amikor meg van oldva - Hash számítása - Összefüggő elemek - Kérlek ellenőrizd, hogy egy hiba, ami az összeomlásodat írja le, létezik-e már. Ha duplikált jegyet adsz be, időt veszel el tőlünk amit arra tudnánk fordítani, hogy kijavítsuk magát a bugot. - Lekicsinyítés alkalmazás váltáskor + Nyomja meg a „Kész” gombot, ha megoldotta + Ujjlenyomat számítása + Kapcsolódó elemek + Ellenőrizze, hogy létezik-e már olyan jegy, amely az összeomlásával foglalkozik. Ha duplikált jegyet ad fel, akkor olyan időt vesz el tőlünk, amelyet a hiba javítására tudnánk fordítani. + Minimalizálás alkalmazásváltáskor + A(z) %s ezt az okot adta meg: + Helyi keresési javaslatok + Távoli keresési javaslatok + A fő lejátszó teljes képernyős indítása + A videókat ne a kis lejátszóban indítsa el, hanem kapcsolja be a teljes képernyős módot, ha az automatikus forgatás zárolva van. Továbbra is elérheti a kis lejátszót, ha kilép a teljes képernyőből. + Szolgáltatás be/ki, jelenleg kiválasztott: + A megjegyzések ki vannak kapcsolva + Húzza oldalra az elemeket az eltávolításukhoz + A következő sorba állítása + A következő sorba állítva + Feldolgozás… Ez eltarthat egy ideig. + Az eltávolítás utáni, fragment vagy activity életcikluson kívüli, nem kézbesíthető Rx kivételek jelentésének kényszerítése + Eredeti „ennyi ideje” megjelenítése az elemeken + Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor + Picasso színes szalagok megjelenítése a képek fölött, megjelölve a forrásukat: piros a hálózathoz, kék a lemezhez, zöld a memóriához + Minden letöltésnél meg fogja kérdezni, hogy hova mentse el + A „Storage Access Framework” nem támogatott Android KitKaten vagy régebbin + Válasszon egy példányt + Lista legutóbbi frissítése: %s + Lista betöltése… + Csak a nem csoportosított feliratkozások megjelenítése + Lista + Lista frissítési küszöb + A legutóbbi frissítés óta eltelt idő, ami után a feliratkozás elavultnak számít – %s + A szerző fiókját eltávolították. +\nA NewPipe nem fogja tudni betölteni ezt a listát a jövőben. +\nLeiratkozik erről a csatornáról\? + A gyors listamód nem ad ennél több információt. + Lekérés egy dedikált listából, ha lehetséges + Gyors mód engedélyezése + Úgy gondolja, hogy a lista betöltése lassú\? Ha így van, akkor próbálja engedélyezni a gyors betöltést (ezt a beállításokban változtathatja meg, vagy a lenti gomb megnyomásával). +\n +\nA NewPipe két listabetöltési stratégiát kínál: +\n• A teljes feliratkozott csatorna lekérése, amely lassú, de teljes. +\n• Egy dedikált szolgáltatási végpont, amely gyors, de általában nem teljes. +\n +\nA különbség a kettő között az, hogy a gyorsból általában hiányoznak egyes információk, mint az elem hossza vagy a típusa (nem lehet megkülönböztetni az élő videókat a normálaktól), valamint kevesebb elemet adhat vissza. +\n +\nA YouTube például egy olyan szolgáltatás, amely ezt a gyors módot RSS hírcsatornával kínálja. +\n +\nÍgy a választása azon múlik, hogy melyiket tartja fontosabbnak: a sebességet vagy a pontos információkat. + Csatorna profilképének bélyegképe + Legutóbbi + Kiemelt + Most már kijelölheti a leírásban lévő szöveg. Vegye figyelembe, hogy kijelölési módban az oldal villoghat, és a hivatkozások nem biztos, hogy kattinthatók lesznek. + Szöveg kijelölésének letiltása a leírásban + Licenc + Korhatár + Kiszolgáló + Bélyegkép URL + Nyilvános + Nem listázott + Ki + Csatornarészletek betöltése… + Nem található megfelelő fájlkezelő ehhez a művelethez. +\nTelepítsen egy fájlkezelőt, vagy próbálja meg letiltani a következőt a letöltési beállításokban: „%s”. + + Letöltés befejezve + %s letöltés befejezve + + 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 + 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) + Hiba a lista betöltésekor + Megnézett elemek megjelenítése + Nyelv + Támogatás + Weboldal megnyitása + Táblagép mód + Az Android 10-től kezdve, csak a „Storage Access Framework” támogatott + Új listaelemek + Privát + Belső + Készítő által szívecskézve + Be + A(z) „%s” listája nem tölthető be. + Ez egy SoundCloud Go+ szám, legalábbis az Ön országában, így nem játszható le vagy tölthető le a NewPipe-pal. + Kapcsolja ki, hogy elrejtse a metainformációs dobozokat, melyek további információkat tartalmaznak a közvetítés létrehozójáról, annak tartalmáról vagy egy keresési kérésről + Hibajelentési értesítés + Értesítések a hibák jelentéséhez + A NewPipe hibát észlelt, koppintson a jelentéséhez + Hiba történt, lásd az értesítést + Médiacsatornázás letiltása + Hiba üzenetsávjának megjelenítése + Hibaértesítés létrehozása + Új verziók kézi keresése + Alacsony minőségű (kisebb) + Frissítések keresése… + Készítette: %s + Nem található megfelelő fájlkezelő ehhez a művelethez. +\nTelepítsen egy olyan fájlkezelőt, amely kompatibilis a Storage Access Frameworkkel. + Szöveg kijelölésének engedélyezése a leírásban + Kategória + Címkék + Adatvédelem + Hiba a csatornarészletek megjelenítésekor + Gyors mód letiltása + Igen, és távolítsa el a részben megnézett videókat is + A videók, melyeket már megnézett miután a lejátszási listához adta őket, el lesznek távolítva. +\nBiztos benne\? Ez nem vonható vissza. + A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken + Lejátszó összeomlasztása + Képjelölők megjelenítése + A „lejátszó összeomlasztása” lehetőség megjelenítése + Megjeleníti az összeomlasztási lehetőséget a lejátszó használatakor + Hangmagasság megtartása (torzítást okozhat) + Frissítések keresése + Ne jelenítse meg + Megnézettek eltávolítása + Eltávolítja a megnézett videókat\? + + %1$s letöltés törölve + %1$s letöltés törölve + + Rögzített megjegyzés + Már megy a lejátszás a háttérben \ 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 b420c56d1..bed00bfe5 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -55,7 +55,6 @@ Yang terjadi: Komentar Anda (dalam bahasa Inggris): Detail: - Thumbnail pratinjau video Putar video, durasi: Suka Thumbnail avatar pengunggah @@ -154,7 +153,7 @@ Selalu Hanya Sekali Berkas - Notifikasi untuk pemutar latar belakang dan popup NewPipe + Notifikasi untuk pemutar NewPipe [Tidak diketahui] Alihkan ke Latar Belakang Alihkan ke Popup @@ -286,11 +285,12 @@ Impor langganan YouTube dari Google takeout: \n \n1. Kunjungi URL ini: %1$s -\n2. Masuk ketika ditanya +\n2. Masuk ketika ditanyakan \n3. Klik \"Semua data disertakan\", lalu \"Batalkan semua pilihan\", lalu hanya pilih \"langganan\" dan klik \"OKE\" \n4. Klik \"Langkah berikutnya\" dan kemudian \"Buat ekspor\" -\n5. Klik tombol \"Unduh\" dan -\n6. Dari unduhan zip takeout ekstrak berkas .json (biasanya di bawah \"YouTube and YouTube Music/subscriptions/subscriptions.json\") dan impor di sini +\n5. Klik tombol \"Unduh\" +\n6. Klik IMPOR FILE di bawah dan pilih file .zip yang terunduh +\n7. [Jika impor .zip gagal] Ekstrak file .csv (biasanya di \"YouTube dan YouTube Music/langganan/langganan.csv\"), klik IMPOR FILE di bawah dan pilih file csv yang diekstrak Impor profil SoundCloud dengan mengetik URL atau ID Anda: \n \n1. Aktifkan \"mode desktop\" di peramban web (situs tidak tersedia untuk perangkat seluler) @@ -337,8 +337,8 @@ Pembaruan Acara Berkas dihapus - Notifikasi Pembaruan Apl - Notifikasi untuk versi NewPipe baru + Notifikasi pembaruan apl + Notifikasi untuk versi-versi NewPipe baru Penyimpanan eksternal tidak tersedia Tidak bisa mengunduh ke kartu SD eksternal. Atur ulang lokasi folder unduhan\? Tidak bisa membaca tab yang disimpan, beralih menggunakan tab bawaan @@ -571,7 +571,7 @@ Nonaktifkan untuk menyembunyikan kotak info dengan informasi tambahan tentang kreator, konten stream atau pencarian Tampilkan info meta Notifikasi untuk laju pemrosesan hash video - Notifikasi Hash Video + Notifikasi hash video Tidak ada apl di perangkat Anda yang bisa membuka ini Chapter Deskripsi @@ -581,8 +581,8 @@ Tampilkan deskripsi Buka dengan Konten ini hanya tersedia untuk pengguna yang telah membayar, sehingga tidak bisa diputar atau diunduh oleh NewPipe. - Video ini hanya tersedia untuk anggota Premium YouTube Music, sehingga tidak bisa diputar atau diunduh oleh NewPipe. - Konten ini bersifat pribadi, jadi tidak bisa diputar ataupun diunduh oleh NewPipe. + Video ini hanya tersedia untuk anggota YouTube Music Premium, sehingga tidak bisa diputar atau diunduh oleh NewPipe. + Konten ini privat, sehingga tidak bisa diputar atau diunduh oleh NewPipe. Ini adalah sebuah trek SoundCloud Go +, setidaknya di negara Anda, sehingga tidak bisa diputar atau diunduh oleh NewPipe. Konten ini tidak tersedia di negara Anda. Hentikan aplikasi @@ -663,7 +663,17 @@ Item feed baru Tampilkan \"hentikan pemain video\" Menampilkan opsi penghentian ketika menggunakan pemain video - Melaporkan kesalahan pemain video dalam detail yang penuh daripada menampilkan pesan toast yang muncul sebentar (berguna untuk memeriksa masalah) - Laporkan kesalahan pemain video Hentikan pemain video + Notifikasi untuk melaporkan kegalatan + Notifikasi laporan kegalatan + Sebuah kegalatan terjadi, lihat notifikasinya + Menampilkan sebuah snackbar kegalatan + Buat sebuah notifikasi kegalatan + Tidak ada manajer file yang ditemukan untuk tindakan ini. +\nMohon instal sebuah manajer file atau coba menonaktifkan \'%s\' di pengaturan unduhan. + NewPipe mengalami sebuah kegalatan, ketuk untuk melaporkan + Tidak ada manajer file yang ditemukan untuk tindakan ini. +\nMohon instal sebuah manajer file yang kompatibel dengan Storage Access Framework. + Komentar dipin + Sudah diputar di latar belakang \ 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 fc55ba69d..66932597e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -26,7 +26,6 @@ URL non supportato Lingua predefinita per i contenuti Video e audio - Copertina di anteprima video Riproduci video, durata: Immagine dell\'utente Non mi piace @@ -143,8 +142,8 @@ Comportamento Cronologia e cache Annulla - Notifiche NewPipe - Notifiche per lettore in sottofondo e popup + Notifica NewPipe + Notifiche per il lettore multimediale di NewPipe Nessun risultato Nessun iscritto @@ -343,8 +342,8 @@ Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato - Notifiche di aggiornamenti dell\'applicazione - Notifiche per una nuova versione di NewPipe + Notifiche per aggiornamenti dell\'app + Notifiche per le nuove versioni di NewPipe Archiviazione esterna non disponibile Impossibile scaricare sulla scheda SD esterna. Ripristinare la posizione della cartella dei download\? Impossibile leggere le schede salvate, verranno usate quelle predefinite @@ -578,7 +577,7 @@ Utilizza le copertine come sfondo della schermata di blocco e per le notifiche Mostra copertina Calcolo dell\'hash - Notifica Hash Video + Notifica hash video Notifiche per lo stato di avanzamento dell\'hashing video Recente Disattiva per nascondere i riquadri con informazioni aggiuntive sul contenuto, sul suo autore o su una richiesta di ricerca @@ -674,9 +673,19 @@ Verifica manualmente la presenza di nuove versioni Controllo aggiornamenti… Nuovi elementi feed - Segnala errori del lettore multimediale Quando il lettore multimediale è in uso, mostra un\'opzione per farlo crashare - Invece di mostrare un messaggio popup di breve durata, gli errori del lettore multimediale saranno visualizzati in modo dettagliato (utile per diagnosticare i problemi) Mostra \"Fai crashare il lettore\" Fai crashare il lettore + NewPipe ha riscontrato un errore, tocca per segnalarlo + Mostra un messaggio di errore + Non è stato trovato alcun gestore di file appropriato per questa azione. +\nInstallane uno prova a disattivare \"%s\" nelle impostazioni di download. + Notifica per segnalazione errori + Notifiche per segnalare errori + Si è verificato un errore, vedi la notifica + Crea una notifica di errore + Non è stato trovato alcun gestore di file appropriato per questa azione. +\nInstallane uno compatibile con Storage Access Framework. + Commento in primo piano + Già in riproduzione in sottofondo \ 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 6cedc2566..1b191c994 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -26,7 +26,6 @@ 対応していないURLです デフォルトの言語 動画と音声 - 動画 プレビュー サムネイル ビデオ再生、時間: 投稿者アイコンのサムネイル 低評価 @@ -278,9 +277,9 @@ 最も再生された動画 拡大 プレイリスト - 「長押しして追加」のヒントを表示 + 「長押ししてキュー」のヒントを表示 トラック - NewPipe のバックグラウンドおよびポップアッププレイヤーの通知 + NewPipe のプレイヤーの通知 新着と人気 長押ししてキューに追加 ポップアップで連続再生を開始 @@ -661,8 +660,20 @@ 次をキューに追加 次をキューに追加しました クリエイターの心をこめて - プレーヤーのエラーを、短時間のトーストメッセージではなく、詳細に報告する(問題の診断に役立ちます) - プレイヤーのエラーを報告 \"プレイヤーがクラッシュ\"を表示 プレイヤーがクラッシュ + 新しいフィードアイテム + エラー報告通知 + エラーが発生しました。通知をご覧ください + NewPipe はエラーに遭遇しました。タップして報告 + スナックバーにエラーを表示 + 既にバックグラウンドで再生されています + 固定されたコメント + この動作に適切なファイルマネージャが見つかりませんでした。 +\nStorage Access Frameworkと互換性のあるファイルマネージャをインストールしてください。 + この動作に適切なファイルマネージャが見つかりませんでした。 +\nファイルマネージャをインストールするか、ダウンロード設定で\'%s\'を無効にすることをお試しください。 + プレイヤー使用時にクラッシュオプションを表示 + エラー通知を作成 + エラーを報告する通知 \ No newline at end of file diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 35f5b075e..6b518b2e2 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -72,5 +72,5 @@ Ra ono pamuter (Sampeyan iso masang VLC kanggo muter iku). Pamuter ora ditemokke. Pasang VLC\? Diterbitake ing %1$s - Pencet suryakanta kanggo nglekasi + Pencet lup kanggo nglekasi \ No newline at end of file diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index d7ac85dd1..f4af24f36 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -65,7 +65,6 @@ Evîn Nîgariya avatar ya barkêşker Vîdeo, demdirêj bilîze: - Pêşniyara vîdyoyê wêneyê piçûk Hûrî: Şîroveya we (bi Îngilîzî): Çi:\\nRequest:\\nContent Language:\\nContent Welat:\\nApp Language:\\nService:\\nGMT Dem:\\nPackage:\\nVersion:\\nOS version: diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 880c45aee..3c9158753 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -26,7 +26,6 @@ 지원하지 않는 URL입니다 기본 컨텐츠 언어 비디오 & 오디오 - 비디오 미리보기 썸네일 비디오 재생, 구간: 업로더 썸네일 싫어요 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index be2a8086f..59c2df022 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -127,7 +127,6 @@ چی ڕوویدا: لێدوانەکەت (بە ئینگلیزی): وردەکارییەکان: - پێشبینین ی وێنۆچکەی ڤیدیۆ کارپێکردنی ڤیدیۆ، ماوەی: وێنۆچکەی کەسی بەرزکەرەوە بەدڵبوون diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml index 91617fe63..a6cdcc7df 100644 --- a/app/src/main/res/values-land/dimens.xml +++ b/app/src/main/res/values-land/dimens.xml @@ -38,6 +38,7 @@ 90dp 45dp + 8dp 8dp 4dp diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 2b84f6a01..e5bfd4506 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -79,7 +79,6 @@ Kas:\\nUžklausa:\\nTurinio Kalba:\\nTurinio Šalis:\\nProgramėlės Kalba:\\nPaslauga:\\nGMT Laikas:\\nPaketas:\\nVersija:\\nOS versija: Jūsų komentaras (anglų kalba): Išsami informacija: - Vaizdo įrašo peržiūros miniatiūra Paleisti vaizdo įrašą, trukmė: Įkėlėjo naudotojo paveikslėlio miniatiūra Pamėgimai diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 5e337648c..6a311be05 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -153,7 +153,6 @@ Patīk Autora avatāra attēls Atskaņot video, ilgums: - Video priekšskatījuma attēls Detaļas: Jūsu komentārs (Angliski): Kas:\\nRequest:\\nContent Valoda:\\nContent Valsts:\\nApp Valoda:\\nService:\\nGMT Laiks:\\nPackage:\\nVersion:\\nOS versija: diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index d925e2970..392bc39d2 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -140,7 +140,6 @@ Што:\\nБарање:\\nЈазик на Содрж.:\\nУслуга:\\nGMT Час:\\nПакет:\\nВерзија:\\nВерз. на ОС: Ваш коментар (на Англиски): Детали: - Сликичка за преглед на видеото Сликичка за преглед на видеото Икона од аватарот на објавителот Допаѓања diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index a536ccd4d..26b4158c4 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -198,7 +198,6 @@ ലൈക്കുകൾ അപ്‌ലോഡറുടെ ലഘുചിത്രം പ്ലേ വീഡിയോ, ദൈർഘ്യം: - വീഡിയോ ലഘുചിത്രം വിശദാംശങ്ങൾ: നിങ്ങളുടെ അഭിപ്രായം (ഇംഗ്ലീഷിൽ): എന്ത് സംഭവിച്ചു: diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 76aef646f..8a4691219 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -169,7 +169,6 @@ Apa:\\nPermintaan:\\nBahasa Kandungan:\\nNegara Kandungan:\\nBahasa Aplikasi:\\nPerkhidmatan:\\nWaktu GMT:\\nPakej:\\nVersi:\\nVersi OS: Ulasan anda (dalam bahasa Inggeris): Butiran: - Thumbnail pratonton video Main video, tempoh masa: Thumbnail avatar pemuatnaik Suka diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index b0ed47b71..92b3a30ed 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -37,7 +37,6 @@ Utseende Spiller i bakgrunnen Nettverksfeil - Video-forhåndsvisning i miniatyrbilde Spill av video, varighet: Opplasterens avatar Nikk @@ -670,10 +669,19 @@ Se etter oppdateringer Behandler … Kan ta sin tid Krasj avspilleren - Rapporter avspillerfeil - Sirlig rapportering av feil, istedenfor å kun vise et lite oppsprett en stund (nyttig i avlusningsøyemed) Vis «Krasj spilleren» Se etter nye versjoner manuelt Nye informasjonskanalelementer Ser etter oppdateringer … + Viser et krasjalternativ ved bruk av avspilleren + Det oppstod en feil. Sjekk merknaden. + Festet kommentar + Spilles allerede i bakgrunnen + Feilrapport-merknad + Merknader for innrapportering av feil + NewPipe-feil. Trykk for å rapportere. + Opprett en feilmerknad + Vis et feil-alternativsfelt + Installer en filbehandler først, eller skru av «%s» i nedlastingsinnstillingene. + Installer en filbehandler som støtter lagringstilgangsrammeverk først. \ No newline at end of file diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 71c9e107f..d9abdfefd 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -174,7 +174,6 @@ के:\\nअनुरोध:\\nसामग्री भाषा: \\nसेवा:\\nGMT समय:\\nप्याकेज:\\nसंस्करण: \\nOS संस्करण: तपाईंको टिप्पणी (अंग्रेजी मा): विवरण: - सामग्री वर्णन (राम्रो पहुँच लागि) प्ले भिडियो, अवधि: अपलोडरको अवतार थम्बनेल मनपर्दो diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 56b53d814..336c654de 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -141,7 +141,6 @@ Wat:\\nVerzoek:\\nTaal van inhoud:\\nLand:\\nTaal van applicatie:\\nDienst:\\nGMT tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: Uw opmerking (in het Engels): Details: - Videovoorbeeldminiatuur Speel video, tijd: Avatarminiatuur van uploader Duimen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 9fef6b795..f3837ef7d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -28,7 +28,6 @@ Externe videospeler gebruiken Externe audiospeler gebruiken Video en audio - Videovoorbeeldminiatuur Speel video, tijd: Gebruikersafbeelding van uploader Vind-ik-niet-leuks @@ -67,7 +66,7 @@ Downloads Foutrapport App/UI gecrasht - Wat:\\nVerzoek:\\nTaal van inhoud:\\nTaal van land:\\nTaal van Applicatie:\\nDienst:\\nTijd in GMT:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: + Wat:\\nVerzoek:\\nTaal van inhoud:\\nTaal van land:\\nTaal van Toepassing:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: Begin Pauzeren Verwijderen @@ -138,7 +137,7 @@ Hervat afspelen Ga verder met afspelen na onderbrekingen (b.v. telefoongesprekken) NewPipe Melding - Meldingen voor NewPipe-achtergrond- en pop-upspelers + Meldingen voor NewPipe speler Geschiedenis Geschiedenis Speler @@ -293,7 +292,7 @@ Alle gecachete webpagina-gegevens wissen Metagegevens-cache gewist Afspeelsnelheidbesturing - Tempo + Snelheid Toon Ontlinken (kan ruis veroorzaken) Voorkeursactie voor openen @@ -341,10 +340,10 @@ 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 - Updates + Bijwerken Bestand verwijderd - App Update Melding - Meldingen voor nieuwe versies van NewPipe + App update melding + Meldingen voor nieuwe New Pipe versies Externe opslag niet beschikbaar Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\? Fout bij het lezen van de opgeslagen tabbladen, waardoor standaardtabbladen worden gebruikt @@ -352,7 +351,7 @@ Wil je de standaardinstellingen herstellen\? Aantal abonnees niet beschikbaar Welke tabbladen worden weergegeven op de hoofdpagina - Updates + Bijwerken Toon een melding om de applicatie te updaten wanneer er een nieuwe versie beschikbaar is Lijstweergavemodus Lijst @@ -485,7 +484,7 @@ Geen abonnement geselecteerd %d geselecteerd - %d geselecteerd + %d geselecteerde Lege groepsnaam Wilt u deze groep verwijderen\? @@ -553,7 +552,7 @@ Vraag bevestiging alvorens de wachtrij te wissen Niets Aan het bufferen - Shuffle + Willekeurig afspelen Herhaal Je kan maximaal drie acties selecteren om te tonen in de compacte notificatie! Pas elke notificatieactie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte notificatie door gebruik te maken van de selectievakjes aan de rechterkant @@ -580,7 +579,7 @@ Recente Hash berekenen Meldingen over de voortgang van video hashing - Video Hash Melding + Video hash melding Schakel dit uit om meta-informatie vakken te verbergen met aanvullende informatie over de maker van de stream, streaminhoud of een zoekopdracht Laat meta informatie zien Beschrijving @@ -628,7 +627,7 @@ Media tunneling uitschakelen Uit Aan - Tablet mode + Tablet modus Open website %s geeft de volgende reden: Account getermineerd @@ -669,14 +668,24 @@ Veeg items om ze te verwijderen Start geen video\'s in de minispeler, maar ga direct naar de volledige schermmodus, als automatisch draaien is vergrendeld. Je hebt nog steeds toegang tot de minispeler door de volledige schermmodus af te sluiten Start hoofdspeler als volledig scherm - Rapporteer fouten van de speler in volledig detail in plaats van een kortstondige toastmelding te tonen (handig voor het diagnosticeren van problemen) Verwerken... Dit kan even duren Crash de speler - Rapporteer fouten van de speler Toon \"crash de speler\" Toon een crash overzicht bij gebruik van de speler Controleer handmatig op nieuwe versies Controleer op updates Bezig met controleren op updates… Nieuwe feed items + Foutmelding + Beschrijving van foutmeldingen + NewPipe meldt fout, tik voor bericht + Foutmelding + Maak een foutmelding + Speelt al op de achtergrond + Korte foutmelding weergeven + Er is geen geschikte bestandsbeheerder gevonden voor deze actie. +\nInstalleer een bestandsbeheerder of probeer \'%s\' uit te schakelen in de download instellingen. + Er is geen geschikte bestandsbeheerder gevonden voor deze actie. +\nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework. + Vastgemaakt commentaar \ 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 219440faa..005b30a89 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -147,7 +147,6 @@ ਕੀ:\\nRequest:\\nContent ਭਾਸ਼ਾ/ਬੋਲੀ:\\nContent Country:\\nApp ਭਾਸ਼ਾ/ਬੋਲੀ:\\nService:\\nGMT ਸਮਾਂ:\\nPackage:\\nVersion:\\nOS version: ਤੁਹਾਡੀ ਟਿੱਪਣੀ (ਅੰਗਰੇਜ਼ੀ ਵਿਚ): ਵੇਰਵੇ: - ਵੀਡੀਓ preview thumbnail ਵਿਡੀਉ ਚਲਾਓ, ਮਿਆਦ: ਅਪਲੋਡਰ ਦਾ ਅਵਤਾਰ thumbnail ਪਸੰਦ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7a776d862..0577f2f5d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -59,7 +59,6 @@ Co:\\nŻądanie:\\nJęzyk treści:\\nKraj treści:\\nJęzyk aplikacji:\\nUsługa:\\nCzas GMT:\\nPakiet:\\nWersja:\\nWersja systemu: Twój komentarz (po angielsku): Szczegóły: - Miniatura podglądu wideo Odtwarzane wideo, czas trwania: Miniatura awatara przesyłającego Polubienia @@ -136,8 +135,8 @@ Śledź obejrzane wideo Wznawiaj odtwarzanie Kontynuuj odtwarzanie po przerwaniu (np. po rozmowie telefonicznej) - Powiadomienia NewPipe - Powiadomienia dla NewPipe przy odtwarzaniu w tle i w trybie okienkowym + Powiadomienie NewPipe + Powiadomienia dla odtwarzacza NewPipe Historia Historia Odtwarzacz @@ -348,9 +347,9 @@ Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje - Plik usunięty + Usunięto plik Powiadomienie o aktualizacji aplikacji - Powiadomienia o nowej wersji NewPipe + Powiadomienia o nowych wersjach NewPipe Pamięć zewnętrzna niedostępna Pobieranie na kartę SD nie jest możliwe. Zresetować lokalizację folderu zapisywania\? Nie udało się odczytać zapisanych kart, więc będą używane domyślne @@ -406,7 +405,7 @@ Pozycje odtwarzania na listach Pokazuj wskaźniki pozycji odtwarzania na listach Wyczyść dane - Pozycje odtwarzania usunięte + Usunięto pozycje odtwarzania Plik usunięty albo przeniesiony Plik z tą nazwą już istnieje nie można nadpisać pliku @@ -414,7 +413,7 @@ NewPipe został zamknięty podczas pracy nad plikiem Brak miejsca na urządzeniu Utracono postęp, ponieważ plik został usunięty - Czy chcesz wyczyścić historię pobierania lub usunąć wszystkie pobrane pliki\? + Czy chcesz wyczyścić historię pobierania, czy usunąć wszystkie pobrane pliki\? Ogranicz kolejkę pobierania Tylko jedno pobieranie zostanie uruchomione w tym samym czasie Rozpocznij pobieranie @@ -693,9 +692,19 @@ Ręcznie sprawdź dostępność nowych wersji Sprawdź dostępność aktualizacji Nowe pozycje kanału - Zgłaszaj błędy odtwarzacza Pokazuje opcję psucia podczas korzystania z odtwarzacza Zepsuj odtwarzacz Pokazuj „zepsuj odtwarzacz” - Zgłasza szczegółowo błędy odtwarzacza zamiast pokazywać krótkotrwałą wiadomość toast (przydatne do diagnozowania problemów) + Powiadomienie raportu o błędach + Powiadomienia do zgłaszania błędów + NewPipe napotkał błąd. Naciśnij, aby zgłosić + Wystąpił błąd. Zobacz powiadomienie. + Pokaż snackbar z błędem + Utwórz powiadomienie o błędzie + Nie znaleziono odpowiedniego menedżera plików dla tej akcji. +\nZainstaluj menedżer plików lub spróbuj wyłączyć „%s” w ustawieniach pobierania. + Nie znaleziono odpowiedniego menedżera plików dla tej akcji. +\nZainstaluj menedżer plików zgodny z Storage Access Framework. + Już jest odtwarzane w tle + Przypięty komentarz \ 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 434993d2b..a77d38f97 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -3,7 +3,7 @@ Áudio Não foi possível decodificar assinatura da URL do vídeo Seu comentário (em inglês): - O que ocorreu: + O que aconteceu: Informação: Vídeo Preto (AMOLED) @@ -16,7 +16,7 @@ Formato de áudio padrão Resolução padrão Excluir - Não curtidas + Não gostei Curtidas Baixar Baixar @@ -70,7 +70,6 @@ Vídeos baixados são salvos aqui Pasta para vídeos baixados Instalar o aplicativo Kore\? - Miniatura de visualização do vídeo Toque na lupa para começar. Threads Por favor, defina uma pasta de download depois nas configurações @@ -83,7 +82,7 @@ Usar player de áudio externo Usar player de vídeo externo Mostrar opção \"Reproduzir com Kodi\" - Ocorrido:\\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: + 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 Resolução padrão do popup Mostrar resoluções mais altas @@ -131,7 +130,7 @@ Não foi possível atualizar inscrição Inscrições Novidades - Retomar vídeo + Continuar reprodução Continua vídeo após interrupções (ex: ligações) Histórico de pesquisa Armazena histórico de pesquisa localmente @@ -139,8 +138,8 @@ Armazena histórico de vídeos assistidos Histórico Histórico - Notificações do NewPipe - Notificações para players popup e em segundo plano do NewPipe + Notificação do NewPipe + Notificações para o player do NewPipe Comportamento Histórico e cache Desfazer @@ -268,17 +267,17 @@ \n \n1. Acesse este link: %1$s \n2. Faça login quando solicitado -\n3. Clique em \"Todos os dados incluídos\", em seguida, em \"Desmarque todos\", em seguida, selecione apenas \"assinaturas\" e clique em \"OK\" +\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", em seguida, selecione apenas \"assinaturas\" e clique em \"OK\" \n4. Clique em \"Próximo passo\" e em seguida, em \"Criar exportação\" \n5. Clique no botão \"Baixar\" quando ele aparecer -\n6. Clique em Importar Arquivo abaixo e selecione o arquivo zip baixado -\n7. Caso a importação do arquivo zip falhe: Extraia o arquivo .csv (normalmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\", clique em Importar Arquivo abaixo e selecione o arquivo cvs extraído +\n6. Clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo .zip baixado +\n7. Caso a importação do arquivo .zip falhe: Extraia o arquivo .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\", clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo csv extraído
Importe um perfil do SoundCloud digitando o URL ou seu ID: \n -\n1. Ative o \"modo desktop\" no navegador (o site não está disponível em aparelhos celulares) +\n1. Ative o \"modo desktop\" em um navegador (o site não está disponível em aparelhos celulares) \n2. Acesse este URL: %1$s \n3. Faça login quando solicitado -\n4. Copie o URL do perfil que voçê foi redirecionado. +\n4. Copie o URL do perfil que você foi redirecionado.
seuID, soundcloud.com/seuid Tenha em mente que esta operação poderá consumir muitos dados. \n @@ -289,9 +288,9 @@ Remove todos os dados de páginas em cache Cache de metadados limpo Controles de velocidade de reprodução - Ritmo + Velocidade Desative para não carregar miniaturas e economizar no uso de dados e memória. A alteração limpa todo o cache de imagens em memória e em disco - Altura + Afinação Desvincular (pode causar distorção) Ação de \'abrir\' preferida Ação padrão ao abrir conteúdo — %s @@ -327,7 +326,7 @@ Nenhum Minimizar para segundo plano Minimizar para player popup - Avanço rápido durante silêncio + Avançar durante o silêncio Passo Redefinir Canais @@ -344,8 +343,8 @@ Atualizações Eventos Arquivo excluído - Notificação de atualização - Notificação de novas versões do NewPipe + Notificação de atualização do aplicativo + Notificações para novas versões do NewPipe Armazenamento externo indisponível Não é possível baixar para o cartão SD externo. Redefinir o local da pasta de download\? Não foi possível carregar as abas salvas, carregando as abas padrão @@ -411,7 +410,7 @@ Tempo limite de conexão Excluir todo o histórico de downloads ou excluir todos os arquivos baixados\? Limitar fila de downloads - Um download será feito ao mesmo tempo + Um download será feito por vez Iniciar downloads Pausar downloads Perguntar onde salvar o arquivo @@ -438,7 +437,7 @@ Duração do salto para avançar/retroceder Instâncias do PeerTube Escolha suas instâncias do PeerTube favoritas - Procure instâncias que gosta em %s + Encontre as instâncias que gosta em %s Adicionar instância Insira o link da instância Erro ao validar a instância @@ -507,7 +506,7 @@ \n• Buscar todo o conteúdo do canal inscrito, que é lento mas completo. \n• Usar um endpoint de serviço dedicado, que é rápido mas geralmente incompleto. \n -\nA diferença entre os dois é que o rápido geralmente falta alguma informação, como a duração ou tipo do item (não consegue distinguir entre as lives e os vídeos normais) e pode retornar menos itens. +\nA diferença entre os dois é que no rápido geralmente falta alguma informação, como a duração ou tipo do item (não consegue distinguir entre as lives e os vídeos normais) e pode retornar menos itens. \n \nO YouTube é um exemplo de serviço que oferece o modo rápido com seu feed RSS. \n @@ -579,7 +578,7 @@ Mostrar miniatura Calculando hash Notificações para o progresso do hash do vídeo - Notificação de Hash do Vídeo + Notificação de hash do vídeo Desative para ocultar as caixas de informações de metadados com informações adicionais sobre o criador, conteúdo do stream ou uma solicitação de pesquisa Mostrar informação de metadados Recentes @@ -593,12 +592,12 @@ Nenhum aplicativo em seu dispositivo pode abrir isso O aplicativo parou Este conteúdo está disponível apenas para usuários que pagaram, portanto não pode ser transmitido ou baixado pelo NewPipe. - Este vídeo está disponível apenas para assinantes do YouTube Music Premium, portanto não pode ser transmitido ou baixado por NewPipe. + Este vídeo está disponível apenas para assinantes do YouTube Music Premium, portanto não pode ser transmitido ou baixado pelo NewPipe. Este conteúdo é privado, portanto não pode ser transmitido ou baixado pelo NewPipe. Esta é uma faixa do SoundCloud Go+, pelo menos no seu país, portanto não pode ser transmitida ou baixada pelo NewPipe. Este conteúdo não está disponível em seu país. Este vídeo tem restrição de idade. -\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar nenhuma de suas streams de vídeo e assim ele não pode ser exibido. +\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar nenhum de seus streams de vídeo e assim ele não pode ser exibido. Rádio Destaque Resolvido @@ -615,7 +614,7 @@ Não Listado Público Limite de Idade - URL da Capa + URL da Miniatura Hospedado em Suporte Idioma @@ -647,10 +646,10 @@ Baixa qualidade (menor) Alta qualidade (maior) Pré visualização da miniatura da barra de busca - Comentários estão desabilitados + Os comentários estão desabilitados Marcar como visto Curtido pelo criador - Exibir fitas coloridas de Picasso no topo das imagens indicando sua fonte: vermelho para rede, azul para disco e verde para memória + Exibir fitas coloridas no topo das imagens indicando sua fonte: vermelho para rede, azul para disco e verde para memória Carregando detalhes do canal… Erro ao exibir detalhes do canal @@ -665,7 +664,7 @@ Adicionado na próxima posição da fila Adicionar a próxima posição da fila Deslize items para remove-los - Não inicia os vídeos no player reduzido, mas muda direto para o modo de tela cheia, se a rotação automatica estiver travada. Você ainda consegue acessar o player reduzido saindo da tela cheia + Não inicia os vídeos no player reduzido, mas muda direto para o modo de tela cheia, se a rotação automática estiver travada. Você ainda consegue acessar o player reduzido saindo da tela cheia Iniciar o player principal em tela cheia Sugestões de busca remotas Sugestões de busca locais @@ -674,9 +673,19 @@ Procurar manualmente por novas versões Procurando por atualizações… Travar o player - Reporta os erros do player em detalhes completos, em vez de mostrar uma mensagem de notificação de curta duração (útil para diagnosticar problemas) Mostrar \"travar o player\" - Reportar erros do player Mostra uma opção de travamento ao usar o player Novos itens do feed + Notificação de relatório de erro + Notificações para reportar erros + O NewPipe encontrou um erro, toque para reportar + Crie uma notificação de erro + Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. +\nInstale um gerenciador de arquivos compatível com o Storage Access Framework. + Ocorreu um erro, consulte a notificação + Mostrar um snackbar de erro + Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. +\nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download. + Já está tocando em segundo plano + Comentário fixado \ 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 446c79486..85fe30ca1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -25,7 +25,7 @@ Canal não subscrito Nome do ficheiro Mostrar indicadores de posição de reprodução nas listas - Notificações para NewPipe e para os reprodutores popup + Notificações para o reprodutor do NewPipe Desvincular (pode causar distorção) Escolha as sugestões a mostrar ao pesquisar Ficheiro ZIP inválido @@ -139,7 +139,7 @@ Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória Será que queria dizer \"%1$s\"\? Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão - Fila + Enfileirar Ninguém está a ver Remover ficheiros descarregados Idioma da aplicação @@ -176,8 +176,8 @@ \n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\". \n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\". \n5. Clique no botão \"Descarregar\" após aparecer -\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro zip descarregado -\n7. [Se a importação do zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído
+\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado +\n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído Ativar reprodutor em segundo plano Desafio reCAPTCHA solicitado Reprodução automática @@ -281,7 +281,7 @@ pós-processamento não é possível sobrescrever o ficheiro Fonte de conteúdo/ficheiro inexistente - Notificações para uma nova versão do NewPipe + Notificações para novas versões do NewPipe Histórico Lista Remover vídeos visualizados\? @@ -444,7 +444,6 @@ Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s Pesquisar Atualizações - Miniatura do vídeo Atualizações Iniciar transferências Guardar termos de pesquisa localmente @@ -665,7 +664,7 @@ %s descargas concluídas Deslizar itens para removê-los - Não iniciar vídeos no reprodutor mini, mas ir diretamente para ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo. + 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 @@ -675,8 +674,18 @@ A procurar atualizações… Novos itens Travar o reprodutor - Relata os erros do reprodutor com todos os detalhes em vez de mostrar uma mensagem de notificação por pouco tempo (útil para diagnosticar problemas) - Relatar erros do 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 + NewPipe encontrou um erro, toque para relatar + Ocorreu um erro, veja a notificação + Mostrar um snackbar de erro + Criar uma notificação de erro + Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. +\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar. + Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. +\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework. + Comentário fixado + Já está a reproduzir em segundo plano \ 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 9e36e1928..326bab03b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -28,7 +28,6 @@ URL não suportado Idioma padrão para conteúdo Vídeo e áudio - Miniatura do vídeo Reproduzir vídeo, duração: Miniatura do avatar do canal Não gosto @@ -136,7 +135,7 @@ Histórico e cache Anular Notificação NewPipe - Notificações para NewPipe e para os reprodutores popup + Notificações para o reprodutor do NewPipe Sem resultados Aqui não há nada para ver Sem subscritores @@ -269,8 +268,8 @@ \n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\". \n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\". \n5. Clique no botão \"Descarregar\" após aparecer -\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro zip descarregado -\n7. [Se a importação do zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído +\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado +\n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n \n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) @@ -344,7 +343,7 @@ Atualizações Ficheiro eliminado Notificação de nova versão - Notificações para uma nova versão do NewPipe + Notificações para novas versões do NewPipe Armazenamento externo indisponível Não é possível guardar no cartão SD. Repor pasta de descargas\? Não foi possível ler as guias gravadas, portanto usando as guias predefinidas @@ -364,7 +363,7 @@ em pausa na fila pós-processamento - Fila + Enfileirar Ação recusada pelo sistema Falha ao descarregar Gerar nome único @@ -665,7 +664,7 @@ %s descargas concluídas Deslizar itens para removê-los - Não iniciar vídeos no reprodutor mini, mas ir diretamente para ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo. + 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 @@ -675,8 +674,18 @@ A procurar atualizações… Novos itens Travar o reprodutor - Relata os erros do reprodutor com todos os detalhes em vez de mostrar uma mensagem de notificação por pouco tempo (útil para diagnosticar problemas) - Relatar erros do 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 + NewPipe encontrou um erro, toque para relatar + Ocorreu um erro, veja a notificação + Mostrar um snackbar de erro + Criar uma notificação de erro + Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. +\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar. + Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. +\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework. + Já está a reproduzir em segundo plano + Comentário fixado \ 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 83f2a2a78..802b2ab69 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -45,7 +45,6 @@ Nu s-a putut analiza site-ul web Conținut indisponibil Nu s-a putut configura meniul de descărcare - Miniatura de previzualizare video Redare video, durata: Miniatura avatarului autorului Au apreciat @@ -682,4 +681,18 @@ Afișați indicatorii de imagine Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video Procesarea.. Poate dura un moment + Verifică dacă există actualizări + Verifică manual dacă există versiuni noi + Se redă deja pe fundal + Comentariu lipit + Notificare cu raport de eroare + Afișează opțiunea de a întrerupe atunci când utilizați playerul + A apărut o eroare, verifică notificarea + NewPipe a întămpinat o eroare, apăsați ca să raportați + Se verifică actualizări… + Notificări pentru a raporta erori + Crează o notificare de eroare + Arată \"închiderea bruscă a player-ului video\" + Arată o eroare de tip snackbar + Elemente de flux noi \ 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 4710777f9..6c357fa13 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -27,7 +27,6 @@ Язык контента по умолчанию Видео и аудио Внешний вид - Миниатюра видео-превью Воспроизвести видео, длительность: Миниатюра аватара пользователя Не понравилось @@ -135,7 +134,7 @@ Возобновить при фокусе Возобновлять воспроизведение после перерывов (например, телефонных звонков) Уведомление NewPipe - Уведомление для NewPipe в фоне и во всплывающем окне + Уведомления для плеера NewPipe Загрузки Допустимые символы имён файлов Заменяет недопустимые символы> @@ -363,8 +362,8 @@ Жест громкости Обновления Файл удалён - Уведомление об обновлении - Уведомления о новой версии NewPipe + Уведомление об обновлении приложения + Уведомления о новых версиях NewPipe Обновления Показать уведомление при наличии новой версии Доступно обновление NewPipe! @@ -372,7 +371,7 @@ Завершено приостановлено в очереди - Очередь + Добавить в очередь Действие запрещено системой Ошибка загрузки Перезаписать @@ -590,7 +589,7 @@ Использовать миниатюру для фона уведомлений и экрана блокировки Показать миниатюру Показать уведомление при хэшировании видео - Уведомление о хэшировании + Уведомление о хэшировании видео Вычисляется хэш Недавнее Отключите, чтобы скрыть поля метаданных (автор потока, содержимое потока или поисковый запрос) @@ -690,9 +689,19 @@ Проверить обновления Проверка обновлений… Новое на канале - Отчёт об ошибках плеера - Подробные отчёты об ошибках плеера вместо коротких всплывающих сообщений (полезно при диагностике проблем) Показать \"Вызвать сбой плеера\" Показать функцию вызова сбоя при работе плеера Вызвать сбой плеера + Уведомление отчёта об ошибке + Уведомления для отчётов об ошибках + NewPipe столкнулся с ошибкой, нажмите для отчёта + Произошла ошибка, подробнее в уведомлении + Показать ошибку снекбара + Создать уведомление об ошибке + Для этого действия не найдено подходящего файлового менеджера. +\nПожалуйста, установите файловый менеджер, или попробуйте отключить \'%s\' в настройках загрузок. + Для этого действия не найдено подходящего файлового менеджера. +\nПожалуйста, установите файловый менеджер, совместимый со Storage Access Framework (SAF). + Уже проигрывается в фоне + Закреплённый комментарий \ No newline at end of file diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 817aacd9a..a5c59c700 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -60,4 +60,8 @@ ᱫᱚᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ ᱢᱟᱲᱟᱝ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ ᱛᱷᱟᱹᱢᱵᱽᱱᱮᱞ ᱫᱚ ᱑:᱑ ᱮᱥᱯᱮᱠᱼᱴ ᱨᱮᱥᱤᱭᱚ ᱨᱮ ᱢᱟᱯ ᱢᱮ + ᱴᱷᱤᱠ + ᱥᱟᱰᱮ + ᱧᱮᱞ ᱠᱟᱱ ᱞᱮᱠᱷᱟ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ + ᱯᱞᱮᱭᱚᱨ ᱠᱨᱟᱥ ᱠᱟᱜ ᱢᱮ \ 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 daecc4f6c..3ca5ae972 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -7,7 +7,7 @@ \n3. Incarca in \"Totu sos datos incluidos\", a pustis in \"Boga sa seletzione a totus\" e a pustis galu ischerta petzi \"iscritziones\" e incarca \"AB\" \n4. Incarca in \"Passu imbeniente\" e a pustis in \"Crea un\'esportatzione\" \n5. Cando aparit, incarca in su butone \"Iscarrigamentu\" -\n6. Incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu zip iscarrigadu +\n6. Incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu .zip iscarrigadu \n6. [Si s\'importatzione fallit] Estrae su documentu .csv (de sòlitu tenet su nùmene\"\"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu csv estratu Esportatzione de s\'iscritzione fallida Importatzione de s\'iscritzione fallida @@ -180,7 +180,6 @@ Agradessimentos Miniadura de s\'avatar de su carrigadore Riprodui su vìdeu, longària: - Miniadura de anteprima de su vìdeu Detàllios: Su cummentu tuo (in inglesu): Ite est acontèssidu: @@ -255,7 +254,7 @@ A disponimentu in unos cantos servìtzios, de sòlitu est meda prus lestru ma diat pòdere frunire unu nùmeru limitadu de elementos e, fatu-fatu, informatziones no intreas (es. peruna longària, casta de elementu, indicadore de istadu in direta) Recùperu dae una fonte de cuntenutos dedicada, cando est a disponimentu Agiorna semper - Tempus chi depet colare a pustis de s\'ùrtimu agiornamentu, in antis chi un\'abbonamebèngiat cunsiderada tropu betza — %s + Tempus chi depet colare a pustis de s\'ùrtimu agiornamentu, in antis chi un\'abbonamentu bèngiat cunsideradu tropu betzu — %s Lìmite de agiornamentu de sa fonte de cuntenutos Fonte de cuntenutos Nou @@ -339,7 +338,7 @@ Ingendra unu nùmene ùnivocu Iscarrigamentu fallidu Atzione vietada dae su sistema - Elencu + Pone in lista recuperende post-protzessamentu in pàusa @@ -403,9 +402,9 @@ Cola a sa ventanedda Cola a s\'isfundu [Disconnotu] - Notìficas pro una versione noa de NewPipe + Notìficas pro sas versiones noas de NewPipe Notìfica de agiornamentu de s\'aplicatzione - Notìficas pro sos riproduidores in s\'isfundu e a ventanedda de NewPipe + Notìficas pro su riproduidore de NewPipe Notìficas de NewPipe Documentu Una borta ebbia @@ -455,7 +454,7 @@ Istadu predefinidu pro sos cuntenutos URL non suportadu Ammustra un\'impòsitu cando incarcas in su butone de isfundu o de sa ventanedda in sa pàgina de sos detàllios de unu vìdeu - Ammustra s\'impòsitu \"Mantene incarcadu pro pònnere in elencu\" + Ammustra s\'impòsitu \"Mantene incarcadu pro pònnere in lista\" Ammustra sos vìdeos imbenientes e simigiantes Riprodutzione automàtica Iscàrriga @@ -477,7 +476,7 @@ 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 automaticamente unu cuntenutu a sa lista + Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada Boga totu sos datos de sa pàgina web in sa memòria temporànea Iscantzella sos metadatos in sa memòria temporànea @@ -546,7 +545,7 @@ Incumintza cun sa riprodutzione automaticamente — %s Lista de riprodutzione Reconnoschimentu de s\'URL fallidu. Lu cheres abèrrere cun un\'àtera aplicatzione\? - Annanghe a sa lista automaticamente + Annanghidura automàtica a sa lista Sa lista dae su riproduidore ativu at a èssere remplasada Colende dae unu riproduidore a s\'àteru dias pòdere remplasare sa lista tua Pedi una cunfirma in antis de iscantzellare una lista @@ -673,4 +672,20 @@ Chirca agiornamentos Verìfica in manera manuale pro versiones noas Controllende sos agiornamentos… + NewPipe at rilevadu un\'errore, toca pro lu sinnalare + B\'at àpidu un\'errore, pòmpia sa notìfica + Ammustra una barra de errore + Notìficas pro sinnalare errores + Notìfica de sinnalatzione de errores + Ammustra un\'optzione pro fàghere serrare de repente su riproduidore cando l\'impreas + Crea una notìfica de errore + Elementos noos de su flussu + No est istadu agatadu perunu gestore de documentos pro custa atzione. +\nPro praghere installa·nde unu o proa a inabilitare \'%s\' in sas impostatziones de iscarrigamentu. + Ammustra \"faghe serrare su riproduidore\" + No est istadu agatadu perunu gestore de documentos pro custa atzione. +\nPro praghere installa unu gestore de documentos cumpatìbile cun su \"Sistema de Atzessu a s\'Archiviatzione\". + Faghe serrare su riproduidore + Cummentu apicadu + Giai in riprodutzione in s\'isfundu \ 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 4d0f904ba..09f6e484a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -42,7 +42,6 @@ Nepodarilo sa dekódovať URL videa Nemožno analyzovať webovú stránku Obsah nie je dostupný - Náhľad videa Prehrať video, dĺžka: Náhľad avataru uploadera Lajky diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index dbfef543d..8d13d5f62 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -27,7 +27,6 @@ Nepodprt URL Privzeti jezik vsebine Video in zvok - Sličica predogleda videa Predvajaj video, dolžina: Sličica objavitelja Pokaži možnost predvajanja videa preko predstavnega središča Kodi diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index bf9e7a768..3de28220a 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -259,7 +259,6 @@ Sawirka u saaran soosaareha Daar muuqaalka, intuu socdo: Shayga:\\nCodsiga:\\nLuuqada Shayga:\\nWadanka Shayga:\\nLuuqada Appka:\\nAdeega:\\nWakhtiga oo GMT ah:\\nXidhmada:\\nTirsiga Appka:\\nTirsiga Nooca Barnaamijka: - Galka muuqaal tusaha Faahfaahin: Faalladaada (oo Ingiriis ah): Waxa dhacay: diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 10ab40e69..26ab1997f 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -313,7 +313,6 @@ Pëlqimet Pamja statike e fotos së ngarkuesit Luaje videon, kohëzgjatja: - Pamjet statike të parapamjes së videove Detajet: Komenti juaj (në Anglisht): Çfarë:\\nKërkesa:\\nGjuha e përmbajtjes:\\nShteti i pëmbajtjes:\\nGjuha e aplikacionit:\\nShërbimi:\\nKoha në GMT:\\nPaketa:\\nVersioni:\\nVersioni i sistemit operativ: diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 66258db25..82e8eb953 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -26,7 +26,6 @@ Прикажи „следећи“ и „слични“ видео Подразумевани језик садржаја Видео и аудио - Сличица видео прегледа Пусти видео, трајање: Аватар пошиљаоца Несвиђања @@ -661,6 +660,5 @@ Обрађујем… Може потрајати пар тренутака Приказуј указиваче слике Не покрећи видео у малом прозору, већ пређи одмах у пун приказ заслона, уколико је обртање приказа закључано. И даље можете приступити малом приказу извођача изласком из пуног приказа - Пријави грешке програма извођача видеа Покрени пуни главни приказ извођача \ 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 d36248f55..59d7e9b75 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -79,7 +79,7 @@ Gillar Ogillar Prenumerera - Prenumererad + Prenumererar Prenumeration avslutad Kunde inte ändra prenumeration Kunde inte uppdatera prenumeration @@ -98,8 +98,8 @@ Historik och cacheminne Ångra Spela alla - NewPipe-avisering - Aviseringar för NewPipes bakgrunds- och popup-spelare + NewPipe avisering + Aviseringar för NewPipes spelare [Okänd] Kunde inte dekryptera video URL signatur Misslyckades med att spela denna ström @@ -107,7 +107,6 @@ Återhämtar sig från spelarfel Rapportera detta fel via e-post Vad:\\nBegäran:\\nInnehållsspråk:\\nInnehållsland:\\nApp-språk:\\nTjänst:\\nGMT-tid:\\nPaket:\\nVersion:\\nOS-version: - Videons miniatyrbild Spela video, längd: Uppladdarens avatar-miniatyrbild Inga resultat @@ -344,7 +343,7 @@ Uppdateringar Fil raderad Avisering för appuppdatering - Aviseringar för nya NewPipe-versioner + Aviseringar för nya NewPipe versioner Extern lagring otillgänglig Fel vid läsning av sparade flikar, använder standardflikar Återställ standardvärden @@ -363,7 +362,7 @@ pausad köad efterbehandling - + Köa Åtgärden nekas av systemet Hämtningen misslyckades Generera unikt namn @@ -494,7 +493,7 @@ \nÄr du säker\? Detta kan inte ångras! Ta bort tittade videor\? Ta bort tittade - Systems standard + Systemstandard Appspråk Välj en instans \"Storage Access Framework\" möjliggör hämtningar till ett externt SD-kort @@ -675,8 +674,18 @@ Söker efter uppdateringar… Nya flödes objekt Visa \"krascha spelaren\" - Rapportera spelarfel Krascha spelaren Visar ett kraschalternativ vid användning av spelaren - Rapporterar spelarfel i detalj i stället för att visa ett kortvarigt popup-meddelande (användbart för att diagnostisera problem) + Felrapport-avisering + Avisering för att rapportera fel + NewPipe stötte på ett fel, tryck för att rapportera + Ett fel uppstod, se aviseringen + Visa en fel snackbar + Skapa en fel avisering + Ingen lämplig filhanterare hittades för denna åtgärd. +\nInstallera en filhanterare eller testa att inaktivera \'%s\' i nedladdningsinställningarna. + Ingen lämplig filhanterare hittades för denna åtgärd. +\nInstallera en filhanterare som är kompatibel med Storage Access Framework. + Spelas redan i bakgrunden + Fäst kommentar \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml index da00b0c22..85ed7b5a9 100644 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ b/app/src/main/res/values-sw600dp/dimens.xml @@ -18,6 +18,7 @@ 18sp 18sp + 10dp 10dp 14sp diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index d1ae9ee8a..5c1e38214 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -135,7 +135,6 @@ மின்னஞ்சல் மூலம் பிழையை தெரிவிக்கவும் என்ன நடந்தது: உங்கள் கருத்து: - காணொளி முன்தோற்றம் வெறுப்புகள் பின் தொடர்பவர்கள் இல்லை diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 5c93dec4b..157ad1729 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -71,7 +71,6 @@ ఏం జరిగింది: మీ వ్యాఖ్య(ఆంగ్లం లో): వివరములు: - వీడియో ప్రివ్యూ సూక్ష్మచిత్రం వీడియోని ప్లే చేయండి, వ్యవధి: ఇష్టాలు మంది ఇష్టపడలేదు @@ -79,9 +78,9 @@ వీడియో ఆడియో మళ్ళీ ప్రయత్నించు - కె + కి ఎం - బి + బిలియన్ సభ్యులు లేరు %s సభ్యుడు @@ -108,7 +107,7 @@ వివరాల కోసం నొక్కండి దయచేసి వేచి ఉండండి… క్లిప్బోర్డ్కు కాపీ చేయబడింది - దయచేసి అందుబాటులో ఉన్న డౌన్లోడ్ ఫోల్డర్ను ఎంచుకోండి + డౌన్లోడ్ ఫోల్డర్ను అమరికలలో తరువాత ఎంచుకోండి డౌన్లోడ్ ఫైల్ పేర్లలో అనుమతించిన అక్షరాలు చెల్లని అక్షరాలు ఈ విలువతో భర్తీ చేయబడతాయి @@ -130,7 +129,7 @@ ఖాళీ పేజీ ఛానెల్ పేజీ ఛానెల్ని ఎంచుకోండి - ఇంకా ఛానెల్ ఏదీ చందా చేయలేదు + ఇంకా ఏ ఛానెల్ సభ్యత్వం లేదు ట్రెండింగ్ టాప్ 50 క్రొత్తది మరియు వేడి @@ -199,9 +198,7 @@ HTTPS URLలకు మాత్రమే మద్దతు ఉంది రెండవ చర్య బటన్ నాల్గవ చర్య బటన్ - స్వల్పకాలిక టోస్ట్ సందేశాన్ని చూపించే బదులు పూర్తి వివరాలతో ప్లేయర్ లోపాలను నివేదిస్తుంది (సమస్యలను నిర్ధారించడానికి ఉపయోగపడుతుంది) ప్లేయర్ క్రాష్ చేయండి - ప్లేయర్ లోపాలను నివేదించండి మొదటి చర్య బటన్ ఐదవ చర్య బటన్ మీరు కాంపాక్ట్ నోటిఫికేషన్‌లో చూపడానికి గరిష్టంగా మూడు చర్యలను ఎంచుకోవచ్చు! @@ -234,4 +231,194 @@ ఉదాహరణను ధృవీకరించడం సాధ్యపడలేదు ఉదాహరణ ఇప్పటికే ఉంది నోటిఫికేషన్ + వినియోగదారులు + ఈవెంట్స్ + కొత్త NewPipe వెర్షన్ కోసం నోటిఫికేషన్‌లు + కంటెంట్‌కి వయస్సు పరిమితి (18+ వంటివి) ఉన్నందున పిల్లలకు అనుచితమైన కంటెంట్‌ను చూపండి + ఈ వీడియో వయో పరిమితి విధించబడింది. +\nవయో-నియంత్రిత వీడియోలతో కూడిన కొత్త YouTube విధానాల కారణంగా, NewPipe దాని వీడియో స్ట్రీమ్‌లలో దేనినీ యాక్సెస్ చేయదు మరియు దానిని ప్లే చేయడం సాధ్యం కాదు. + ఈ వీడియోకు వయో పరిమితి ఉంది. +\n +\nమీరు దీన్ని చూడాలనుకుంటే సెట్టింగ్‌లలో \"%1$s\"ని ఆన్ చేయండి. + ట్రాక్స్ + పాటలు + వెనుకగా మార్చు + ఫైల్ తొలగించబడింది + ఎల్లప్పుడూ + ఒక్కసారి మాత్రమే + ఫైల్ + థంబ్‌నెయిల్‌లోని ప్రధాన రంగు ప్రకారం నోటిఫికేషన్ రంగును Android అనుకూలీకరించండి (ఇది అన్ని పరికరాల్లో అందుబాటులో లేదని గమనించండి) + వీడియో హాష్ నోటిఫికేషన్ + వీడియో హ్యాషింగ్ పురోగతి కోసం నోటిఫికేషన్‌లు + ప్లేజాబితాలు + NewPipe ప్లేయర్‌ నోటిఫికేషన్‌లు + ప్రత్యక్ష (ప్రసారం) + వయో పరిమితి ఉన్న కంటెంట్‌ని చూపండి + YouTube యొక్క \"పరిమితం చేయబడిన మోడ్\"ని ఆన్ చేయండి + YouTube \"పరిమితం చేయబడిన మోడ్\"ని అందిస్తుంది, ఇది పరిణతి చెందిన కంటెంట్‌ను దాచిపెడుతుంది + ఛానెల్లు + వీడియోలు + ఆల్బమ్‌లు + కళాకారులు + నిలిపివేయబడినది + శుభ్రపరచు + ఉత్తమ స్పష్టత + యాప్‌ నవీకరణ నోటిఫికేషన్ + [తెలియదు] + ఫైల్ పేరు ఖాళీగా ఉండకూడదు + సేవ్ చేసిన ట్యాబ్‌లను చదవడం సాధ్యం కాలేదు, కాబట్టి డిఫాల్ట్ వాటిని ఉపయోగిస్తోంది + మీరు డిఫాల్ట్‌లను పునరుద్ధరించాలనుకుంటున్నారా\? + ప్లేబ్యాక్ స్థానాలు తొలగించబడ్డాయి + బాహ్య ప్లేయర్‌లు ఈ రకమైన లింక్‌లకు మద్దతు ఇవ్వవు + చెక్సమ్ + వీడియో URL సంతకాన్ని డీఓబ్‌ఫస్కేట్ చేయడం సాధ్యపడలేదు + GitHubపై నివేదించు + ఇక్కడ క్రికెట్‌లు తప్ప మరేమీ లేదు + ఎవరూ వినడం లేదు + ఎవరూ చూడటం లేదు + వ్యాఖ్యలు లేవు + బాహ్య SD కార్డ్‌కి డౌన్‌లోడ్ చేయడం సాధ్యం కాదు. డౌన్‌లోడ్ ఫోల్డర్ స్థానాన్ని రీసెట్ చేయాలా\? + సృష్టించు + సహాయం + డౌన్‌లోడ్ చేయడానికి స్ట్రీమ్‌లు ఏవీ అందుబాటులో లేవు + డిఫాల్ట్‌ విలువలకు మార్చు + క్రమాన్ని మార్చడానికి లాగండి + వీక్షణ చరిత్రను శుభ్రపరచుము + మొత్తం వీక్షణ చరిత్రను తొలగించాలా\? + ప్లేబ్యాక్ స్థానాలను తొలగించండి + బాహ్య నిల్వ అందుబాటులో లేదు + యాప్/UI విఫలమైనది + ఆడియో స్ట్రీమ్‌లు ఏవీ కనుగొనబడలేదు + అటువంటి ఫోల్డర్ లేదు + ఇతర యాప్‌లలో ప్రదర్శించడానికి అనుమతి ఇవ్వండి + ఫార్మాట్ చేసిన నివేదికను కాపీ చేయండి + వివరణ + టోగుల్ సేవ, ప్రస్తుతం ఎంపిక చేయబడింది: + + %s శ్రోత + %s శ్రోతలు + + 100+ వీడియోలు + ∞ వీడియోలు + వ్యాఖ్యలు నిలిపివేయబడ్డాయి + మీరు reCAPTCHAని పరిష్కరించినప్పుడు NewPipe స్టోర్ చేసే కుక్కీలను క్లియర్ చేయండి + అన్ని ప్లేబ్యాక్ స్థానాలను తొలగించాలా\? + వీక్షణ చరిత్ర తొలగించబడింది + శోధన చరిత్ర తొలగించబడింది + శోధన చరిత్రను శుభ్రపరచు + శోధన కీలకపదాల చరిత్రను తొలగిస్తుంది + మొత్తం శోధన చరిత్రను తొలగించాలా\? + అన్ని ప్లేబ్యాక్ స్థానాలను తొలగిస్తుంది + ప్లే చేసిన స్ట్రీమ్‌ల చరిత్ర మరియు ప్లేబ్యాక్ స్థానాలను తొలగిస్తుంది + అటువంటి ఫైల్/కంటెంట్ సోర్స్ లేదు + దయచేసి మీ క్రాష్‌ను చర్చిస్తున్న సమస్య ఇప్పటికే ఉందో లేదో తనిఖీ చేయండి. డూప్లికేట్ టిక్కెట్‌లను క్రియేట్ చేస్తున్నప్పుడు, అసలు బగ్‌ని పరిష్కరించడానికి మేము వెచ్చించే సమయాన్ని మీరు మా నుండి తీసుకుంటారు. + వ్యాఖ్యలు + సంబంధిత అంశాలు + సభ్యుల సంఖ్య అందుబాటులో లేదు + ప్లేయర్లో కోలుకోలేని లోపం సంభవించింది + వీడియో స్ట్రీమ్‌లు ఏవీ కనుగొనబడలేదు + ఫైల్ తరలించబడింది లేదా తొలగించబడింది + ఫైల్ ఉనికిలో లేదు లేదా దానిని చదవడానికి లేదా వ్రాయడానికి అనుమతి లేదు + లోపం సంభవించింది: %1$s + + %s చూస్తున్నాడు + %s చూస్తున్నారు + + లోపాలు నివేదించడానికి నోటిఫికేషన్‌లు + లోపనివేదన నోటిఫికేషన్ + చెరుపు + వాటిని తీసివేయడానికి వాటిని స్వైప్ చేయండి + ఈ ఫైల్‌ని ప్లే చేయడానికి యాప్ ఏదీ ఇన్‌స్టాల్ చేయబడలేదు + మరింత సమాచారం మరియు వార్తల కోసం NewPipe వెబ్‌సైట్‌ని సందర్శించండి. + NewPipe ప్రాజెక్ట్ మీ గోప్యతను చాలా తీవ్రంగా పరిగణిస్తుంది. కాబట్టి, మీ సమ్మతి లేకుండా యాప్ ఎలాంటి డేటాను సేకరించదు. +\nNewPipe యొక్క గోప్యతా విధానం మీరు క్రాష్ నివేదికను పంపినప్పుడు ఏ డేటా పంపబడుతుందో మరియు నిల్వ చేయబడుతుందో వివరంగా వివరిస్తుంది. + NewPipe అనేది కాపీ లెఫ్ట్ లిబ్రే సాఫ్ట్‌వేర్: మీరు దీన్ని ఇష్టానుసారంగా ఉపయోగించవచ్చు, అధ్యయనం చేయవచ్చు మరియు మెరుగుపరచవచ్చు. ప్రత్యేకంగా మీరు ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ ద్వారా ప్రచురించబడిన GNU జనరల్ పబ్లిక్ లైసెన్స్ నిబంధనల ప్రకారం, లైసెన్స్ యొక్క వెర్షన్ 3 లేదా (మీ ఐచ్ఛికం ప్రకారం) ఏదైనా తర్వాతి సంస్కరణలో దాన్ని పునఃపంపిణీ చేయవచ్చు మరియు/లేదా సవరించవచ్చు. + ప్లేజాబితా బుక్‌మార్క్‌లు ఇంకా లేవు + గోప్యతా విధానాన్ని చదవండి + అప్‌లోడర్ అవతార్ థంబ్‌నెయిల్ + విరాళం ఇవ్వండి + కియోస్క్‌ని ఎంచుకోండి + reCAPTCHA కుక్కీలను క్లియర్ చేయండి + దీనికి ఈ అనుమతి అవసరం +\nతేలియాడే పద్ధతిలో తెరవండి + © %3$s కింద %2$s ద్వారా %1$s + చివరిగా ఆడింది + చరిత్ర, సభ్యత్వాలు, ప్లేజాబితాలు మరియు అమరికలను ఎగుమతిచేయుము + మీ ప్రస్తుత చరిత్ర, సభ్యత్వాలు, ప్లేజాబితాలు మరియు (ఐచ్ఛికంగా) సెట్టింగ్‌లను భర్తీ చేస్తుంది + డాటాబేసుని దిగుమతిచేయుము + reCAPTCHA కుక్కీలను క్లియర్ చేయండి + NewPipe లోపాన్ని ఎదుర్కొంది, నివేదించడానికి నొక్కండి + లోపం సంభవించింది, నోటిఫికేషన్ చూడండి + రద్దుచేయుము + పేరు మార్చండి + హాష్‌ని లెక్కిస్తోంది + ఇంకా డౌన్‌లోడ్ ఫోల్డర్ సెట్ చేయబడలేదు, ఇప్పుడే డిఫాల్ట్ డౌన్‌లోడ్ ఫోల్డర్‌ను ఎంచుకోండి + 1 అంశం తొలగించబడింది. + పరిష్కరించబడినప్పుడు \"పూర్తయింది\" నొక్కండి + పరిష్కరించండి + పూర్తి + చాలా ప్రత్యేక పాత్రలు + ఆండ్రాయిడ్‌లో లిబ్రే తేలికపాటి స్ట్రీమింగ్. + వాలంటీర్లు తమ ఖాళీ సమయాన్ని వెచ్చిస్తూ మీకు ఉత్తమ వినియోగదారు అనుభవాన్ని అందించడం ద్వారా NewPipe అభివృద్ధి చేయబడింది. డెవలపర్‌లు ఒక కప్పు కాఫీని ఆస్వాదిస్తున్నప్పుడు న్యూపైప్‌ని మరింత మెరుగ్గా చేయడంలో సహాయపడటానికి తిరిగి ఇవ్వండి. + తిరిగి ఇవ్వండి + వెబ్సైట్ + NewPipe యొక్క గోప్యతా విధానం + ఎక్కువగా ఆడినవి + ప్రధాన పేజీలో ఏ ట్యాబ్‌లు చూపబడతాయి + కియోస్క్ పేజీ + డిఫాల్ట్ కియోస్క్ + ఎగుమతి చేయబడింది + దిగుమతి చేయబడింది + చెల్లుబాటు అయ్యే జిప్ ఫైల్ లేదు + reCAPTCHA సవాలు + reCAPTCHA సవాలు అభ్యర్థించబడింది + ప్లేజాబితాను ఎంచుకోండి + ఇప్పటికే వెనుకగా ప్లే అవుతోంది + డాటాబేసుని ఎగుమతిచేయుము + యాప్ పునఃప్రారంభించబడిన తర్వాత భాష మారుతుంది + ఛానెల్ వివరాలను చూపు + కంటెంట్‌ని తెరిచేటప్పుడు డిఫాల్ట్ చర్య — %s + ప్రాధాన్య \'తెరవండి\' చర్య + తదుపరి ఎన్క్యూ + తదుపరి క్యూలో ఉంచారు + సమాచారాన్ని పొందుతోంది… + తేలియాడే విధంగా ప్లే చేయడం ప్రారంభించండి + స్థానిక + అభ్యర్థించిన కంటెంట్ లోడ్ అవుతోంది + కొత్త ప్లేజాబితా + పేరు మార్చండి + పేరు + తేలియాడే ప్లేయర్ + ప్రతిసారీ అడుగు + ప్లేజాబితాకు చేర్చు + మూగ + హెచ్చరిక: అన్ని ఫైల్‌లను దిగుమతి చేయడం సాధ్యపడలేదు. + ఇది మీ ప్రస్తుత సెటప్‌ను భర్తీ చేస్తుంది. + మీరు అమరికలను కూడా దిగుమతి చేయాలనుకుంటున్నారా\? + వ్యాఖ్యలను లోడ్ చేయడం సాధ్యపడలేదు + ఇటీవల జోడించినవి + చాలా నచ్చింది + సమావేశాలు + ప్లే క్యూ + ఎన్క్యూ + క్యూలో ఉంచారు + వెనుకగా ప్లే చేయడం ప్రారంభించండి + డ్రాయర్ తెరవండి + డ్రాయర్‌ని మూసివేయండి + చలనచిత్ర ప్లేయర్ + తేలియాడే ప్లేయర్ + ప్రాసెస్ చేస్తోంది... కొంత సమయం పట్టవచ్చు + వినోదజాబితా సూక్ష్మచిత్రం మార్చబడింది. + శీర్షికలు లేవు + వినోదజాబితా రూపొందించబడింది + వినోదజాబితా చేయబడింది + అన్‌మ్యూట్ చేయండి + వినోదజాబితాకు సూక్ష్మచిత్రంగా మార్చుము + వినోదజాబితాను ఇష్టంశంగా మార్చుము + ఇష్టంశాన్ని తొలగించండి + ఇష్టంశాన్ని నాశనం చేయాలా\? + తగినది + పూరించండి + పరివీక్షణ + తేలియాడే విధంగా మార్చు \ No newline at end of file diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 01946c321..bf8e56d75 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -163,7 +163,6 @@ เกิดอะไรขึ้น: ความคิดเห็นของคุณ (เป็นภาษาอังกฤษ): รายละเอียด: - ภาพขนาดย่อของตัวอย่างวิดีโอ ภาพของตัวอย่างวิดีโอขนาดย่อ รูปขนาดย่อของผู้อัปโหลด ชอบ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 3712b2355..c96034a9c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -20,19 +20,19 @@ Ses indirme klasörü İndirilen ses dosyaları burada depolanır Ses dosyaları için indirme klasörünü seç - Varsayılan çözünürlük + Öntanımlı çözünürlük Kodi ile oynat Eksik Kore uygulaması yüklensin mi\? \"Kodi ile oynat\" seçeneğini göster Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster - Varsayılan ses biçimi + Öntanımlı ses biçimi Tema Koyu Açık İndir \'Sonraki\' ve \'Benzer\' videoları göster Desteklenmeyen URL - Varsayılan içerik dili + Öntanımlı içerik dili Ses Video ve ses Görünüm @@ -79,10 +79,10 @@ Lütfen daha sonra ayarlardan uygun indirme klasörü belirleyin İndirme menüsü ayarlanamadı Açılır pencere kipinde aç - Varsayılan açılır pencere çözünürlüğü + Öntanımlı açılır pencere çözünürlüğü Yüksek çözünürlükleri göster Yalnızca bazı aygıtlar 2K/4K videoları oynatabilir - Varsayılan video biçimi + Öntanımlı video biçimi Siyah Açılır pencere kipinde oynatılıyor Tümü @@ -90,7 +90,6 @@ Devre dışı Yorumunuz (İngilizce): Ayrıntılar: - Video ön izleme küçük resmi b M B @@ -105,7 +104,7 @@ Açılan pencerenin son boyutunu ve konumunu hatırla Bazı çözünürlüklerde sesi kaldırır Arama önerileri - Ararken gösterilecek önerileri seçin + Ararken gösterilecek önerileri seç En iyi çözünürlük NewPipe Hakkında Üçüncü Taraf Lisansları @@ -141,8 +140,8 @@ Davranış Geçmiş ve önbellek Geri al - NewPipe Bildirimi - NewPipe arka plan ve açılır pencere oynatıcıları için bildirimler + NewPipe bildirimi + NewPipe oynatıcısı için bildirimler Sonuç yok Burada cırcır böceklerinden başka bir şey yok Abone yok @@ -152,14 +151,14 @@ Görüntüleme yok - %s görüntüleme - %s görüntüleme + %s görüntülenme + %s görüntülenme Video yok Geçmiş Geçmiş Bu ögeyi arama geçmişinden silmek istiyor musunuz\? - \"Eklemek için basılı tutun\" ipucunu göster + \"Basılı tutarak kuyruğa ekle\" ipucunu göster Video \"Ayrıntılar:\" sayfasında arka plan veya açılır pencere düğmesine basıldığında ipucu göster Tümünü Oynat [Bilinmeyen] @@ -179,7 +178,7 @@ Kaldır Ayrıntılar Ses Ayarları - Kuyruğa eklemek için basılı tutun + Basılı tutarak kuyruğa ekle Arka planda oynatmayı başlat Açılır pencerede oynatmayı başlat Bağışta bulunun @@ -187,7 +186,7 @@ Bağışta bulunun Web sitesi Daha çok bilgi ve haber için NewPipe web sitesini ziyaret edin. - Varsayılan içerik ülkesi + Öntanımlı içerik ülkesi Arka Plana Geç Açılır Pencereye Geç Ana Görünüme Geç @@ -246,7 +245,7 @@ Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsündeki teslim edilemeyen Rx beklentilerinin bildirimini zorla Hızlı isabetsiz konumlama kullan İsabetsiz konumlama, oynatıcının daha düşük hassasiyetle daha hızlı konumlamasını sağlar. 5, 15 veya 25 saniyeye konumlama bununla birlikte çalışmamaktadır - Sonraki akışı kuyruğa kendiliğinden ekle + Sonraki akışı kendiliğinden kuyruğa ekle İlgili bir akış ekleyerek sonlanacak (yinelemeyen) oynatma sırasını sürdür Dosya Böylesi klasör yok @@ -270,8 +269,8 @@ \n3. \"Tüm veriler dahil\"e ve sonrasında \"Hiçbirini seçme\"ye tıklayın, ardından yalnızca \"abonelikler\"i seçin ve \"Tamam\"a tıklayın \n4. \"Sonraki adım\"a ve ardından \"Dışa aktar\"a tıklayın \n5. Göründüğünde \"İndir\" düğmesini tıklayın -\n6. Aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve indirilen zip dosyasını seçin -\n7. [Zip içe aktarma işlemi başarısız olursa] .csv dosyasını çıkarın (genellikle \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve çıkarılan csv dosyasını seçin +\n6. Aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve indirilen .zip dosyasını seçin +\n7. [.zip içe aktarma işlemi başarısız olursa] .csv dosyasını çıkarın (genellikle \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve çıkarılan csv dosyasını seçin URL\'yi veya ID\'nizi yazarak SoundCloud profilini içe aktarın: \n \n1. Web tarayıcısında \"masaüstü kipi\" etkinleştirin (site, mobil aygıtlar için uygun değildir) @@ -294,7 +293,7 @@ Ayır (bozulmaya neden olabilir) İndirilebilecek akış yok Yeğlenen \'aç\' eylemi - İçerik açılırken varsayılan eylem — %s + İçerik açılırken öntanımlı eylem — %s Alt yazılar Oynatıcı alt yazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir Bu dosyayı oynatmak için herhangi bir uygulama yüklü değil @@ -339,13 +338,13 @@ Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler Dosya silindi - Uygulama Güncelleme Bildirimi - Yeni NewPipe sürümü için bildirimler + Uygulama güncelleme bildirimi + Yeni NewPipe sürümleri için bildirimler Dış depolama kullanılamıyor Dış SD karta indirilemiyor. İndirme klasörü konumu sıfırlansın mı\? - Kayıtlı sekmeler okunamadı, bu nedenle varsayılanlar kullanılıyor - Varsayılanları geri yükle - Varsayılanları geri yüklemek istiyor musunuz\? + Kayıtlı sekmeler okunamadı, bu nedenle öntanımlılar kullanılıyor + Öntanımlıları geri yükle + Öntanımlıları geri yüklemek istiyor musunuz\? Abone sayısı mevcut değil Ana sayfada hangi sekmeler gösterilir Güncellemeler @@ -423,7 +422,7 @@ %s video %s video - Varsayılan Kiosk + Öntanımlı Kiosk Kimse izlemiyor %s izliyor @@ -455,7 +454,7 @@ İndirilen dosyaları sil Diğer uygulamaların üzerinde görüntüleme izni ver Uygulama dili - Sistem varsayılanı + Sistem öntanımlısı Çözüldüğünde \"Bitti\" düğmesine basın Bitti Videolar @@ -547,7 +546,7 @@ Oynatmayı kendiliğinden başlat — %s Oynatma kuyruğu URL tanınamadı. Başka bir uygulamayla açılsın mı\? - Kendiliğinden kuyruğa ekle + Kendiliğinden kuyrukla Etkin oynatıcının kuyruğu değiştirilecek Bir oynatıcıdan diğerine geçmek kuyruğunuzu değiştirebilir Bir kuyruğu temizlemeden önce onay iste @@ -579,7 +578,7 @@ Bildirimi renklendir Hash hesaplanıyor Video dosya özetleme süreci için bildirimler - Video Dosya Özeti Bildirimi + Video dosya özeti bildirimi En Son Akış oluşturucu, akış içeriği veya bir arama isteği hakkında ek bilgiler içeren meta bilgi kutularını gizlemek için kapatın Üst bilgiyi göster @@ -674,4 +673,19 @@ Yeni sürümleri el ile denetleyin Güncellemeler denetleniyor… Yeni akış ögeleri + Hata raporlama bildirimi + NewPipe hatayla karşılaştı, bildirmek için dokun + Hata oluştu, bildirime bakın + \"Oynatıcıyı çöktür\"ü göster + Hata bildirimi oluştur + Hata balonu göster + Bu eyleme uygun dosya yönetici yok. +\nLütfen dosya yönetici kurun veya indirme ayarlarında \'%s\' devre dışı bırakın. + Bu eyleme uygun dosya yönetici bulunamadı. +\nLütfen Depolama Erişimi Çerçevesi uyumlu dosya yönetici kurun. + Hata raporları için bildirimler + Oynatıcı kullanırken çöktürme seçeneği gösterir + Oynatıcıyı çöktür + Zaten arka planda oynuyor + Sabitlenmiş yorum \ 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 ebb0bccb1..9c8e57b81 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -11,8 +11,8 @@ Налаштування Ви мали на увазі: «%1$s»\? Поширити через - Викор. зовнішній відеопрогравач - Викор. зовнішній аудіопрогравач + Зовнішній відеопрогравач + Зовнішній аудіопрогравач Тека для завантаження відео Виберіть теку для завантаження відеофайлів Виберіть теку для завантаження аудіофайлів @@ -35,7 +35,7 @@ Переважна мова вмісту Відео та звук Зовнішній вигляд - Відтворення на тлі + Відтворення у фоновому режимі Вміст Вміст із віковими обмеженнями Наживо @@ -63,7 +63,6 @@ Збій застосунку/інтерфейсу Ваш коментар (англійською): Деталі: - Зображення відео перед його переглядом Відтворити відео, тривалість: Відео Аудіо @@ -86,7 +85,7 @@ Вкажіть теку для завантажень пізніше в налаштуваннях Програвач потокового відео не знайдений (ви можете встановити VLC для програвання). Відкрити у віконному режимі - Прибирає звук при певних роздільних здатностях + Прибирає звук за певної роздільності Підписатися Ви підписалися Ви відписалися від каналу @@ -94,7 +93,7 @@ Не вдалося оновити підписку Підписки Новинки - На тлі + У фоновому режимі У вікні Типова роздільність вікна Не всі пристрої можуть відтворювати 2K/4K-відео @@ -128,14 +127,14 @@ Завжди Лише раз Сповіщення NewPipe - Сповіщення для програвачів NewPipe на тлі й у вікні + Сповіщення для програвачів NewPipe [Невідомо] Перейти у фоновий режим Перемкнути у вікно Перемкнути на головну Імпортувати базу даних Експортувати базу даних - Поточні підписки, списки відтворення, історія і (за бажанням) налаштування буде замінено + Поточні підписки, добірки, історія і (за бажанням) налаштування буде замінено Експорт підписок, списків відтворення, історії та налаштувань Не вдалося відтворити цей потік Відновлення після помилки програвача @@ -256,8 +255,8 @@ Моніторинг втрат пам\'яті може призвести до нереагування застосунку під час запису дампу Звітувати про помилки життєвого циклу застосунку Примусове звітування про неможливість доставлення Rx-винятків, які відбуваються за межами фрагменту або діяльності життєвого циклу після усунення - Викор. швидкий неточний пошук - Неточний пошук дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю + Швидкий неточний пошук + Швидше, але не точне перемотування. Перехід на 5, 15 або 25 секунд не працюватиме Автододавання в чергу наступної трансляції Продовжити при завершені (не повторюваної) черги, додавши повʼязаний запис Файл @@ -334,13 +333,13 @@ Пропускати тихі проміжки Крок Скинути - Зменшити при перемиканні програм - Дія при перемиканні до інших програм від головного відеопрогравача — %s + Зменшити при перемиканні застосунку + Дія при перемиканні до інших застосунків з основного відеопрогравача — %s Нічого - Зменшити до програвача на тлі + Зменшити до програвача у фоновому режимі Зменшити до програвача у вікні Канали - Списки відтворення + Добірки Доріжки Користувачі Режим перегляду списком @@ -356,7 +355,7 @@ Події Файл видалено Сповіщення про оновлення застосунку - Сповіщення про нову версію NewPipe + Сповіщення про нові версії NewPipe Зовнішнє сховище недоступне Відновити типові налаштування Відновити типові значення\? @@ -371,7 +370,7 @@ призупинено додано в чергу пост-обробка - Черга + Додати у чергу Дію заборонено системою Помилка завантаження Згенерувати унікальну назву @@ -380,8 +379,8 @@ Завантажений файл з такою назвою вже існує Файл з такою назвою вже завантажується Показати помилку - Цільову теку не можливо створити - Файл не можливо створити + Неможливо створити цільову теку + Неможливо створити файл Захищене з\'єднання не встановлено Сервер не знайдено Не вдалося з\'єднатися із сервером @@ -397,10 +396,10 @@ Помилка зчитування збережених вкладок. Використовуються типові вкладки Вкладки, показані на головній сторінці Показувати сповіщення з пропозицією оновити застосунок за наявності нової версії - Корисно під час перемикання на мобільні дані, хоча деякі завантаження не можливо призупинити + Корисно під час перемикання на мобільні дані, хоча деякі завантаження неможливо призупинити Показувати коментарі Вимкніть, щоб сховати коментарі - Самовідтворення + Автовідтворення Коментарі відсутні Не вдалося завантажити коментарі Закрити @@ -597,15 +596,15 @@ Рекомендовані Збій застосунку Початковий час оприлюднення - Додано в чергу - Додати в чергу + Додано у чергу + Додати у чергу Розв\'язати Обчислення гешу Очистити збережені під час вирішення reCAPTCHA реп\'яшки (cookies) Реп\'яшки (cookies) reCAPTCHA видалено Очистити реп\'яшки (cookies) reCAPTCHA Сповіщення про перебіг відеогешування - Сповіщення про відеогешування + Сповіщення про відеохешування Це відео має вікові обмеження. \nЗгідно з новою політикою YouTube щодо відео з віковими обмеженнями NewPipe не може мати доступ до жодного потоку цього відео і, таким чином, не має можливості відтворити його. Показувати вміст, який, можливо, не підходить для дітей, бо має вікове обмеження (наприклад, 18+) @@ -643,7 +642,7 @@ Дозволити виділяти текст в описі Тепер можна виділяти текст в описі. Зауважте, що сторінка може мигати і посилання можуть не працювати в режимі виділення. %s подає таку причину: - Не можливо завантажити стрічку для «%s». + Неможливо завантажити стрічку для «%s». Помилка завантаження стрічки Обліковий запис автора припинено. \nNewPipe не зможе завантажити цей канал у майбутньому. @@ -691,7 +690,17 @@ Нові записи стрічки Показати «збій програвача» Показує параметр збою під час використання програвача - Повідомити про помилки програвача Збій програвача - Повне повідомлення про помилки програвача замість, короткого звіту (корисно для діагностики проблем) + Сповіщення про звіт про помилку + Сповіщення для звітів про помилки + Сталася помилка NewPipe, торкніться, щоб звітувати + Сталася помилка. Перегляньте сповіщення + Для цієї дії не знайдено відповідного файлового менеджера. +\nУстановіть файловий менеджер або спробуйте вимкнути «%s» у налаштуваннях завантажень. + Для цієї дії не знайдено відповідного файлового менеджера. +\nУстановіть файловий менеджер, сумісний зі Storage Access Framework. + Показати панель помилок + Створити сповіщення про помилку + Уже відтворюється у фоновому режимі + Закріплений коментар \ No newline at end of file diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 1f427504b..f2c5afc33 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -140,7 +140,6 @@ کیا ہوا:\\nدرخواست:\\nمواد کی زبان:\\nملک:\\nایپ کی زبان:\\nسروس:\\nجی ایم ٹٰ:\\nوقت:\\nپیکیج:\\nورژن:\\nآپریٹنگ سسٹم ورزن: آپ کا تبصرہ (انگریزی میں): تفصیلات: - ویڈیو پیش منظر انگشتی ویڈیو چلائیں، دورانیہ: اپ لوڈر کا اوتار نظرِ انگشتی پسندیدگی diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 341562a62..fc923dc3d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -77,7 +77,6 @@ Cái gì:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành: Nhận xét của bạn (bằng tiếng Anh): Chi tiết: - Hình thu nhỏ xem trước video Xem video, thời lượng: Hình thu nhỏ của avatar người tải lên Lượt thích @@ -148,7 +147,7 @@ Theo dõi các video đã xem Tiếp tục phát Tiếp tục phát sau khi bị gián đoạn (ví dụ: cuộc gọi điện thoại) - Hiển thị mẹo \"Giữ để nối thêm\" + Hiển thị mẹo \"Giữ để thêm vào hàng đợi\" Hiển thị mẹo khi nhấn nút phát trong nền hoặc phát trên popup trong trang \"Chi tiết\" Quốc gia nội dung mặc định Phát @@ -164,7 +163,7 @@ Chỉ một lần Tập tin Thông báo NewPipe - Thông báo cho trình phát popup và trình phát nền + Thông báo cho trình phát của NewPipe [Không xác định] Chuyển sang nền Chuyển sang Popup @@ -657,4 +656,21 @@ Đã cho mục tiếp vào hàng đợi Cho mục tiếp vào hàng đợi Đang thực hiện...Có thể mất một lúc + Thông báo báo cáo lỗi + Thông báo để báo cáo lỗi + NewPipe đã gặp lỗi, nhấn để báo cáo + Có lỗi xảy ra, hãy xem thông báo + Hiện \"làm trình phát dừng\" + Hiện tùy chọn dừng đột ngột khi sử dụng trình phát + Hiện thanh báo lỗi + Tạo thông báo lỗi + Kiểm tra cập nhật + Kiểm tra phiên bản mới theo cách thủ công + Đang kiểm tra cập nhật… + Mục feed 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. + 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. \ 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 f6318df0b..9fec7c065 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -155,7 +155,6 @@ 详情:\\n请求:\\n内容语言:\\n服务:\\nGMT时间:\\n包:\\n版本:\\n操作系统版本: 您的注释(请用英文): 详细信息: - 视频预览缩略图 播放视频,时长: 视频上传者的头像缩略图 字节 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index f69a42dbd..306cd17e2 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -31,7 +31,6 @@ 外觀 背景播放 網絡問題 - 影片預覽縮圖 影片預覽縮圖 上載者的個人頭像縮圖 讚好 @@ -113,7 +112,7 @@ 特許 在 Android 上運作自由輕便的 Youtube 前端。 檢視我們的 GitHub - NewPipe 的特許 + NewPipe 嘅授權協議 無論您僅想分享您對 NewPipe 的一些構思,還是願意設計和翻譯程式介面,甚至想幫我們整理或重新編寫原始碼,我們都無任歡迎。貢獻更多,應用程式便會變得更好! 檢閱特許 貢獻 @@ -244,4 +243,159 @@ 您係咪要還原返做預設嗰個樣? 複製執咗格式嘅報告 乜都搵唔到 + 名稱 + 接受 + 關閉 + 下載失敗 + + 完成咗 %s 個下載 + + 產生獨一無二嘅名稱 + 匯入檔案 + 匯出緊… + 先前嘅匯出 + 惟請注意:呢項操作可能相當消耗網絡數據。 +\n +\n您係咪要繼續? + 幾時都唔使 + 自動 + 低畫質 (較細) + 唔顯示 + 撳一下去下載 + 無觀看次數 + + %s 個人聽緊 + + 明白 + 排緊隊 + 後期處理緊 + 暫停咗 + 無限制 + 自動產生 (搵唔到上載者) + 代替字元 + 個 ZIP 檔無效 + 最多讚 + 匯出咗 + + %s 次觀看 + + 無人睇緊 + + %s 部影片 + + 無留言 + 計算緊雜湊 + 檔名准用啲咩字元 + 無效嘅字元會用呢一楷嚟代替 + 去 NewPipe 網站睇更多資訊同最新消息。 + 閱讀私隱政策 + 匯入咗 + 攞緊資訊… + 填滿 + 縮放 + 匯入唔到訂閱 + 節奏 + 播放速度控掣 + 系統預設噉樣 + 檢查有冇更新 + 個 App 用咩文 + 睇咗嗰啲剷咗佢 + 係咪要剷走睇咗嘅影片? + 網站 + NewPipe 嘅私隱政策 + 改過個名 + 音高 + 完成咗 + 無影片 + 影片播放器 + 僅限用 Wi-Fi 嘅時候 + 高畫質 (較大) + 無訂閱者 + + %s 位訂閱者 + + 訂閱者人數不詳 + + %s 個人睇緊 + + 無人聽緊 + 100+ 部影片 + ∞ 部影片 + 未開放留言 + 建立 + 未設定下載資料夾,請立即揀選預設嘅下載資料 + 刪除咗 1 個項目。 + 執執佢 + 未裝 app 嚟播放呢個檔案 + 搞掂 + NewPipe 專案非常認真看待您嘅私隱。因此,呢個 app 未徵得您嘅同意係唔會收集任何資料。 +\nNewPipe 嘅私隱政策,詳加解釋當您傳送彈 app 報告嘅時候有咩資料會傳送同保存。 + 最近播放 + 最常播放 + 頭版內容 + 頭版要擺放邊啲分頁 + 滑走啲項目去剷走佢 + 空白頁 + 重新開過個 app 之後就會轉新語言 + 時興 + 頭位 50 + 最新同大熱 + 警告:未能匯入晒全部檔案。 + 噉樣做會冚咗您而家嘅設定個囉噃。 + 您想唔想匯入埋啲設定? + 載入唔到留言 + 最近新加 + 剷咗佢 + 詳細資料 + 唔使靜音 + 背景播放器 + 浮面播放器 + 幾時都問 + 載入緊請求嘅內容 + 字幕 + 無字幕 + 自動產生 + 貼合 + 匯入 + 由邊處匯入: + 匯出去邊處: + 匯入緊… + 無聲嘅時候快轉 + 重設 + 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請您注意 NewPipe 嘅私隱政策。請仔細閱讀。 +\n您必須接受先可以傳送錯誤報告畀我哋。 + 拒絕 + 用流動數據嘅時候限制解像度 + 更新 + 出咗新版本嘅時候,顯示通知提示升級個 app + 手動檢查下有冇新版本 + NewPipe 出咗更新! + 仲等緊 + 恢復緊 + 動作被系統拒絕咗 + 檢查緊有冇更新… + 覆寫 + + %d 個鐘 + + + %d 日 + + 有咩新嘢 + + %d 秒 + + + %d 分鐘 + + 改過個名 + 字母同數目字 + 大部份特殊字元 + 下載 + 課金 + 匯出唔到訂閱 + 修改播放器字幕啲字嘅大細同背景款式。要重新開過個 app 先會生效 + 執好就撳一下「搞掂」 + 靜音 + 處理緊… 可能要等等 \ 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 4ef11b8c7..2696962de 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -34,7 +34,6 @@ 外觀 背景播放中 網路錯誤 - 影片預覽縮圖 播放影片,持續時間: 發佈者的個人頭像縮圖 喜歡 @@ -125,7 +124,7 @@ 歷史記錄與快取 復原 NewPipe 通知 - NewPipe 背景播放與懸浮模式播放器的通知 + NewPipe 播放器的通知 沒有結果 這裡空空如也 無訂閱者 @@ -359,7 +358,7 @@ 已暫停 已排入佇列 正在後處理 - 佇列 + 排入佇列 動作被系統拒絕 下載失敗 生成獨特的名稱 @@ -662,9 +661,19 @@ 手動檢查新版本 正在檢查更新…… 新 feed 項目 - 回報播放器錯誤 播放器當機 - 完整回報播放器錯誤,而非顯示短暫的 toast 訊息(用於診斷問題) 顯示「播放器當機」 使用播放器時顯示當機選項 + 錯誤回報通知 + 回報錯誤的通知 + 顯示錯誤 SnackBar + 建立錯誤通知 + 找不到適合此動作的檔案管理程式。 +\n請安裝相容於儲存空間存取框架的檔案管理員。 + 找不到適合此動作的檔案管理程式。 +\n請安裝檔案管理程式或在下載設定嘗試停用「%s」。 + NewPipe 遇到錯誤,點擊以回報 + 發生錯誤,請檢視通知 + 釘選留言 + 已經在背景播放 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 5c1d8aa70..f3d29b605 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -71,6 +71,8 @@ 12sp 32dp + 18sp + 18sp 16dp 18sp 18sp @@ -79,6 +81,7 @@ 35dp 60dp + 5dp 5dp 5dp 50dp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml new file mode 100644 index 000000000..92fd5f397 --- /dev/null +++ b/app/src/main/res/values/donottranslate.xml @@ -0,0 +1,28 @@ + + + https://f-droid.org/packages/org.videolan.vlc/ + RSS + org.xbmc.kore + https://joinpeertube.org/instances#instances-list + newpipe + newpipeAppUpdate + newpipeHash + newpipeErrorReport + Guru Meditation. + @string/no_videos + @string/no_comments + 100+ + + MD5 + SHA-1 + reCAPTCHA + https://github.com/TeamNewPipe/NewPipe + https://newpipe.net/donate/ + https://newpipe.net/ + https://newpipe.net/legal/privacy/ + %1$s/%2$s + YouTube + SoundCloud + @string/app_name + LeakCanary + diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index a0f03a5b6..ddceec2f1 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1,42 +1,42 @@ - last_used_preferences_version + last_used_preferences_version - + @string/youtube @string/soundcloud - service - @string/youtube + service + @string/youtube - saved_tabs_key + saved_tabs_key - download_path - download_path_audio + download_path + download_path_audio - use_external_video_player - use_external_audio_player + use_external_video_player + use_external_audio_player - volume_gesture_control - brightness_gesture_control - resume_on_audio_focus_gain - popup_remember_size_pos_key - use_inexact_seek_key - auto_queue_key - screen_brightness_key - screen_brightness_timestamp_key - clear_queue_confirmation_key + volume_gesture_control + brightness_gesture_control + resume_on_audio_focus_gain + popup_remember_size_pos_key + use_inexact_seek_key + auto_queue_key + screen_brightness_key + screen_brightness_timestamp_key + clear_queue_confirmation_key - popup_saved_width - popup_saved_x - popup_saved_y + popup_saved_width + popup_saved_x + popup_saved_y - seek_duration - 10000 - + seek_duration + 10000 + 5 seconds @@ -46,7 +46,7 @@ 25 seconds 30 seconds - + 5000 10000 15000 @@ -55,63 +55,63 @@ 30000 - minimize_on_exit_key - @string/minimize_on_exit_background_key - minimize_on_exit_none_key - minimize_on_exit_background_key - minimize_on_exit_popup_key - + minimize_on_exit_key + @string/minimize_on_exit_background_key + minimize_on_exit_none_key + minimize_on_exit_background_key + minimize_on_exit_popup_key + @string/minimize_on_exit_none_key @string/minimize_on_exit_background_key @string/minimize_on_exit_popup_key - + @string/minimize_on_exit_none_description @string/minimize_on_exit_background_description @string/minimize_on_exit_popup_description - start_main_player_fullscreen_key + start_main_player_fullscreen_key - autoplay_key - @string/autoplay_wifi_key - autoplay_always_key - autoplay_wifi_key - autoplay_never_key - + autoplay_key + @string/autoplay_wifi_key + autoplay_always_key + autoplay_wifi_key + autoplay_never_key + @string/autoplay_always_key @string/autoplay_wifi_key @string/autoplay_never_key - + @string/always @string/wifi_only @string/never - seekbar_preview_thumbnail_key - seekbar_preview_thumbnail_high_quality - seekbar_preview_thumbnail_low_quality - seekbar_preview_thumbnail_none - + seekbar_preview_thumbnail_key + seekbar_preview_thumbnail_high_quality + seekbar_preview_thumbnail_low_quality + seekbar_preview_thumbnail_none + @string/seekbar_preview_thumbnail_high_quality @string/seekbar_preview_thumbnail_low_quality @string/seekbar_preview_thumbnail_none - + @string/high_quality_larger @string/low_quality_smaller @string/dont_show - default_resolution - 720p60 - show_higher_resolutions - default_popup_resolution - 480p - best_resolution + default_resolution + 720p60 + show_higher_resolutions + default_popup_resolution + 480p + best_resolution - + @string/best_resolution_key 1080p60 1080p @@ -122,7 +122,7 @@ 240p 144p - + @string/best_resolution 1080p60 1080p @@ -134,145 +134,145 @@ 144p - scale_to_square_image_in_notifications + scale_to_square_image_in_notifications - notification_slot_0_key - notification_slot_1_key - notification_slot_2_key - notification_slot_3_key - notification_slot_4_key + notification_slot_0_key + notification_slot_1_key + notification_slot_2_key + notification_slot_3_key + notification_slot_4_key - notification_slot_compact_0_key - notification_slot_compact_1_key - notification_slot_compact_2_key + notification_slot_compact_0_key + notification_slot_compact_1_key + notification_slot_compact_2_key - notification_colorize_key + notification_colorize_key - video_mp4 - video_webm - video_3gp - default_video_format - @string/video_mp4_key - + video_mp4 + video_webm + video_3gp + default_video_format + @string/video_mp4_key + MPEG-4 WebM 3GP - + @string/video_mp4_key @string/video_webm_key @string/video_3gp_key - default_audio_format - @string/audio_m4a_key - audio_m4a - audio_webm - + default_audio_format + @string/audio_m4a_key + audio_m4a + audio_webm + M4A WebM - + @string/audio_m4a_key @string/audio_webm_key - last_resize_mode + last_resize_mode - debug_pref_screen_key - allow_heap_dumping_key - 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 - crash_the_app_key - show_error_snackbar_key - create_error_notification_key + debug_pref_screen_key + allow_heap_dumping_key + 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 + crash_the_app_key + show_error_snackbar_key + create_error_notification_key - theme - night_theme - light_theme - dark_theme - black_theme - auto_device_theme - @string/auto_device_theme_key - @string/dark_theme_key - + theme + night_theme + light_theme + dark_theme + black_theme + auto_device_theme + @string/auto_device_theme_key + @string/dark_theme_key + @string/light_theme_key @string/dark_theme_key @string/black_theme_key @string/auto_device_theme_key - + @string/light_theme_title @string/dark_theme_title @string/black_theme_title @string/auto_device_theme_title - + @string/dark_theme_key @string/black_theme_key - + @string/dark_theme_title @string/black_theme_title - caption_settings_key - caption_user_set_key + caption_settings_key + caption_user_set_key - show_search_suggestions - show_local_search_suggestions - show_remote_search_suggestions - + show_search_suggestions + show_local_search_suggestions + show_remote_search_suggestions + @string/show_local_search_suggestions_key @string/show_remote_search_suggestions_key - + @string/local_search_suggestions @string/remote_search_suggestions - show_play_with_kodi - show_comments - show_next_video - show_description - show_meta_info - stream_info_selected_tab - show_hold_to_append - content_language - peertube_instance_setup - peertube_selected_instance - peertube_instance_list - content_country - show_age_restricted_content - youtube_restricted_mode_enabled - enable_search_history - enable_watch_history - main_page_content - enable_playback_resume - enable_playback_state_lists - playback_unhook_key - playback_adjust_by_semitones_key - playback_speed_key - playback_pitch_key - playback_skip_silence_key + playback_adjust_by_semitones_key + show_play_with_kodi + show_comments + show_next_video + show_description + show_meta_info + stream_info_selected_tab + show_hold_to_append + content_language + peertube_instance_setup + peertube_selected_instance + peertube_instance_list + content_country + show_age_restricted_content + youtube_restricted_mode_enabled + enable_search_history + enable_watch_history + main_page_content + enable_playback_resume + enable_playback_state_lists + playback_unhook_key + playback_speed_key + playback_pitch_key + playback_skip_silence_key - app_language_key + app_language_key - feed_update_threshold_key - 300 - feed_show_played_items + feed_update_threshold_key + 300 + feed_show_played_items - show_thumbnail_key + show_thumbnail_key - + @string/feed_update_threshold_option_always_update 5 minutes 15 minutes @@ -282,7 +282,7 @@ 1 day - + 0 300 900 @@ -291,53 +291,53 @@ 43200 86400 - feed_use_dedicated_fetch_method + feed_use_dedicated_fetch_method - import_export_data_path - import_data - export_data + import_export_data_path + import_data + export_data - clear_cookie + clear_cookie - download_thumbnail_key + download_thumbnail_key - cache_wipe_key - clear_play_history - clear_playback_states - clear_search_history + cache_wipe_key + clear_play_history + clear_playback_states + clear_search_history - @string/last_download_type_video_key - last_dl_type_video - last_dl_type_audio - last_dl_type_subtitle + @string/last_download_type_video_key + last_dl_type_video + last_dl_type_audio + last_dl_type_subtitle - downloads_storage_ask - storage_use_saf + downloads_storage_ask + storage_use_saf - file_rename_charset - file_replacement_character - _ + file_rename_charset + file_replacement_character + _ - CHARSET_LETTERS_AND_DIGITS - CHARSET_MOST_SPECIAL + CHARSET_LETTERS_AND_DIGITS + CHARSET_MOST_SPECIAL - + @string/charset_letters_and_digits_value @string/charset_most_special_value - + @string/charset_letters_and_digits @string/charset_most_special_characters - @string/charset_most_special_value + @string/charset_most_special_value - downloads_max_retry - 3 - + downloads_max_retry + 3 + @string/minimize_on_exit_none_description 1 2 @@ -349,25 +349,25 @@ 15 - cross_network_downloads - downloads_queue_limit + cross_network_downloads + downloads_queue_limit - default_download_threads + default_download_threads - preferred_open_action_key - @string/always_ask_open_action_key - preferred_open_action_last_selected + preferred_open_action_key + @string/always_ask_open_action_key + preferred_open_action_last_selected - show_info - video_player - background_player - popup_player - download - add_to_playlist - always_ask_player + show_info + video_player + background_player + popup_player + download + add_to_playlist + always_ask_player - + @string/show_info @string/video_player @string/background_player @@ -376,7 +376,7 @@ @string/add_to_playlist @string/always_ask_open_action - + @string/show_info_key @string/video_player_key @string/background_player_key @@ -387,15 +387,15 @@ - update_app_key + update_app_key manual_update_key - update_pref_screen_key - update_expiry_key + update_pref_screen_key + update_expiry_key - system + system - + @string/default_localization_key af az @@ -474,7 +474,7 @@ ja ko - + @string/systems_language Afrikaans Azərbaycan @@ -555,7 +555,7 @@ - + @string/systems_language Afghanistan Aland Islands @@ -806,7 +806,7 @@ Zimbabwe - + @string/default_localization_key AF AX @@ -1058,7 +1058,7 @@ - + @string/default_localization_key ace ar @@ -1137,7 +1137,7 @@ zh-hk zh-tw - + @string/systems_language Basa Acèh العربية @@ -1218,9 +1218,9 @@ - limit_mobile_data_usage - limit_data_usage_none - + limit_mobile_data_usage + limit_data_usage_none + @string/limit_data_usage_none_key @string/limit_data_usage_none_key 1080p60 @@ -1233,40 +1233,40 @@ 144p - list_view_mode - @string/list_view_mode_auto_key + list_view_mode + @string/list_view_mode_auto_key - auto - list - grid + auto + list + grid - + @string/list_view_mode_auto_key @string/list_view_mode_list_key @string/list_view_mode_grid_key - + @string/auto @string/list @string/grid - tablet_mode + tablet_mode - auto - on - off - + auto + on + off + @string/tablet_mode_auto_key @string/tablet_mode_on_key @string/tablet_mode_off_key - + @string/auto @string/on @string/off - recaptcha_cookies_key + recaptcha_cookies_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f297006e..7ca438c52 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,7 +7,6 @@ Install Cancel OK - https://f-droid.org/repository/browse/?fdfilter=vlc&fdid=org.videolan.vlc Open in browser Mark as watched Open in popup mode @@ -23,7 +22,6 @@ Use external video player Removes audio at some resolutions Use external audio player - RSS Subscribe Subscribed Unsubscribe @@ -49,7 +47,6 @@ Only some devices can play 2K/4K videos Play with Kodi Install missing Kore app? - org.xbmc.kore Show \"Play with Kodi\" option Display an option to play a video via Kodi media center Crash the player @@ -132,7 +129,6 @@ PeerTube instances Select your favorite PeerTube instances Find the instances you like on %s - https://joinpeertube.org/instances#instances-list Add instance Enter instance URL Could not validate instance @@ -179,16 +175,12 @@ Always Just Once File - newpipe NewPipe notification Notifications for NewPipe\'s player - newpipeAppUpdate App update notification Notifications for new NewPipe versions - newpipeHash Video hash notification Notifications for video hashing progress - newpipeErrorReport Error report notification Notifications to report errors [Unknown] @@ -247,7 +239,6 @@ NewPipe encountered an error, tap to report An error occurred, see the notification Sorry, that should not have happened. - Guru Meditation. Report this error via e-mail Copy formatted report Report on GitHub @@ -260,7 +251,6 @@ Your comment (in English): Details: - Video preview thumbnail Play video, duration: Uploader\'s avatar thumbnail Likes @@ -269,8 +259,6 @@ Related items Description No results - @string/no_videos - @string/no_comments Nothing here but crickets Drag to reorder Video @@ -305,8 +293,6 @@ No videos 100+ videos ∞ videos - 100+ - %s video %s videos @@ -334,11 +320,7 @@ No download folder set yet, choose the default download folder now This permission is needed to\nopen in popup mode 1 item deleted. - - MD5 - SHA-1 - reCAPTCHA reCAPTCHA challenge Press \"Done\" when solved reCAPTCHA challenge requested @@ -361,18 +343,14 @@ Libre lightweight streaming on Android. Contribute Whether you have ideas of; translation, design changes, code cleaning, or real heavy code changes—help is always welcome. The more is done the better it gets! - https://github.com/TeamNewPipe/NewPipe View on GitHub Donate NewPipe is developed by volunteers spending their free time bringing you the best user experience. Give back to help developers make NewPipe even better while they enjoy a cup of coffee. - https://newpipe.net/donate Give back Website Visit the NewPipe Website for more info and news. - https://newpipe.net/ NewPipe\'s Privacy Policy The NewPipe project takes your privacy very seriously. Therefore, the app does not collect any data without your consent.\nNewPipe\'s privacy policy explains in detail what data is sent and stored when you send a crash report. - https://newpipe.net/legal/privacy/ Read privacy policy NewPipe\'s License NewPipe is copyleft libre software: You can use, study share and improve it at will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. @@ -412,7 +390,6 @@ Recently added Most liked Conferences - %1$s/%2$s Play queue Remove @@ -429,10 +406,7 @@ Open Drawer Close Drawer - YouTube - SoundCloud - @string/app_name Preferred \'open\' action Default action when opening content — %s Video player @@ -467,7 +441,7 @@ Captions Modify player caption text scale and background styles. Requires app restart to take effect - LeakCanary + LeakCanary is not available Memory leak monitoring may cause the app to become unresponsive when heap dumping Show memory leaks Report out-of-lifecycle errors @@ -493,7 +467,15 @@ Previous export Could not import subscriptions Could not export subscriptions - Import YouTube subscriptions from Google takeout:\n\n1. Go to this URL: %1$s\n2. Log in when asked\n3. Click on \"All data included\", then on \"Deselect all\", then select only \"subscriptions\" and click \"OK\"\n4. Click on \"Next step\" and then on \"Create export\"\n5. Click on the \"Download\" button after it appears\n6. Click on IMPORT FILE below and select the downloaded zip file\n7. [If the zip import fails] Extract the .csv file (usually under \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), click on IMPORT FILE below and select the extracted csv file + Import YouTube subscriptions from Google takeout: +\n +\n1. Go to this URL: %1$s +\n2. Log in when asked +\n3. Click on \"All data included\", then on \"Deselect all\", then select only \"subscriptions\" and click \"OK\" +\n4. Click on \"Next step\" and then on \"Create export\" +\n5. Click on the \"Download\" button after it appears +\n6. Click on IMPORT FILE below and select the downloaded .zip file +\n7. [If the .zip import fails] Extract the .csv file (usually under \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), click on IMPORT FILE below and select the extracted csv file Import a SoundCloud profile by typing either the URL or your ID:\n\n1. Enable \"desktop mode\" in a web-browser (the site is not available for mobile devices)\n2. Go to this URL: %1$s\n3. Log in when asked\n4. Copy the profile URL you were redirected to. yourID, soundcloud.com/yourid Keep in mind this operation can be network expensive.\n\nDo you want to continue? @@ -514,7 +496,6 @@ No limit Limit resolution when using mobile data - @string/limit_data_usage_none_key @string/limit_data_usage_none_description 1080p60 @@ -559,7 +540,7 @@ queued post-processing recovering - Queue + Enqueue Action denied by the system Checking for updates… @@ -714,6 +695,7 @@ Unlisted Private Internal + Pinned comment Hearted by creator Open website Tablet mode diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 23b782ffd..e754b3a30 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -128,13 +128,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + diff --git a/app/src/debug/res/xml/main_settings.xml b/app/src/main/res/xml/main_settings.xml similarity index 100% rename from app/src/debug/res/xml/main_settings.xml rename to app/src/main/res/xml/main_settings.xml diff --git a/app/src/main/res/xml/update_settings.xml b/app/src/main/res/xml/update_settings.xml index ef121ec4e..a44555edf 100644 --- a/app/src/main/res/xml/update_settings.xml +++ b/app/src/main/res/xml/update_settings.xml @@ -1,7 +1,6 @@ - - - - - - - - - - - - - - - - diff --git a/assets/android-tv-banner.svg b/assets/android-tv-banner.svg new file mode 100644 index 000000000..bead122f4 --- /dev/null +++ b/assets/android-tv-banner.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.es.md b/doc/README.es.md similarity index 75% rename from README.es.md rename to doc/README.es.md index 72fcc236c..58e9742bf 100644 --- a/README.es.md +++ b/doc/README.es.md @@ -1,4 +1,4 @@ -

+

NewPipe

Una interfaz de streaming ligera y libre para Android.

@@ -18,7 +18,7 @@

Sitio WebBlogPreguntas FrecuentesPrensa


-*Lea esto en otros idiomas: [English](README.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Lea esto en otros idiomas: [English](../README.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. @@ -26,18 +26,18 @@ ## Capturas de Pantalla -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) ## Descripción @@ -105,7 +105,7 @@ Además, si quiere cambiar el método de instalación por alguna razón (por eje Si tiene ideas, traducciones, cambios de diseño, limpieza de código o cambios grandes de código, su ayuda es siempre bienvenida. ¡Cuanto más hagamos, NewPipe será mucho mejor! -Si quiere involucrarse, fíjese en nuestras [notas de contribución](.github/CONTRIBUTING.md). +Si quiere involucrarse, fíjese en nuestras [notas de contribución](../.github/CONTRIBUTING.md). Estado de la Traducción @@ -117,17 +117,17 @@ Si te gusta NewPipe, estaremos felices con una donación. Puede enviar bitcoin o - + - - + + - +
BitcoinCódigo QR del BitcoinCódigo QR del Bitcoin 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisita NewPipe en liberapay.comDona vía LiberapayVisita NewPipe en liberapay.comDona vía Liberapay
BountysourceVisita NewPipe en bountysource.comVisita NewPipe en bountysource.com Revisa cuántas recompensas puedes obtener.
diff --git a/README.ja.md b/doc/README.ja.md similarity index 76% rename from README.ja.md rename to doc/README.ja.md index 2deab555c..37a7add44 100644 --- a/README.ja.md +++ b/doc/README.ja.md @@ -1,149 +1,149 @@ -

-

NewPipe

-

自由で軽量な Android 向けストリーミングフロントエンド

- -

Get it on F-Droid

- -

- - - - - - -

-
-

スクリーンショット説明機能インストールと更新貢献寄付ライセンス

-

ウェブサイトブログFAQニュース

-
- -*他の言語で読む: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md)。* - -注意: これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。 - -NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。 - - -## スクリーンショット - -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) - - -## 説明 - -自由なコピーレフトソフトウェアの NewPipe は一切の Google フレームワークライブラリ及び、YouTube API を使用しません。ウェブサイトは必要な情報のためだけに読み込まれるため、このアプリは Google のサービスがインストールされていない端末で使用ができます。また、NewPipe の使用に YouTube アカウントは必要となりません。 - - -### 機能 - -* 動画の検索 -* 動画の基本情報の表示 -* YouTube の動画の視聴 -* YouTube の動画のバックグラウンド再生 -* ポップアップモード (フローティングプレイヤー) -* 動画を視聴するストリーミングプレイヤーの選択 -* 動画のダウンロード -* 音声のみのダウンロード -* Kodi での動画再生 -* 次の動画/関連動画の表示 -* 特定の言語の YouTube の検索 -* 年齢制限のあるコンテンツの視聴/ブロック -* チャンネルの基本情報の表示 -* チャンネルの検索 -* チャンネルからの動画の視聴 -* Orbot/Tor 対応 (直接的なものは未実装) -* 1080p/2K/4K 対応 -* 履歴の表示 -* チャンネルの登録 -* 履歴の検索 -* 再生リストの検索/視聴 -* 再生リストをキューに追加して再生 -* 動画のキューへの追加 -* 端末内の再生リスト -* 字幕 -* ライブ配信の対応 -* コメントの表示 - -### 対応しているサービス - -NewPipe は複数のサービスに対応しています。[ドキュメント](https://teamnewpipe.github.io/documentation/)は、どのようにしてアプリと NewPipe Extractor にサービスを追加できるかについて詳細な情報を提供しています。もし、新しいサービスを追加するならば、是非私たちに連絡をお願いします。現在対応しているサービスは: - -* YouTube -* SoundCloud \[ベータ\] -* media.ccc.de \[ベータ\] -* PeerTube インスタンス \[ベータ\] -* Bandcamp \[ベータ\] - - - - - -## インストールと更新 -以下の方法のいずれかに従うことによって NewPipe をインストールできます。 -1. カスタムリポジトリを F-Droid に追加してリリースが公開され次第インストールする。この方法の説明はこちら: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ -2. リリースが公開され次第[GitHub のリリース](https://github.com/TeamNewPipe/NewPipe/releases)から APK をダウンロードしてインストールする。 -3. F-Droid から更新する。これは更新を手にする上で最も遅い方法です。F-Droid が変更を検知して、APK をビルドし、署名、そしてユーザーに更新を届ける必要があるためです。 -4. 自分でデバッグ APK をビルドする。これは新しい機能を使用する上で最も早い方法ですが、他と比べてとても複雑なので、他の方法の使用を推奨します。 - -私たちはほとんどのユーザーに方法1を推奨します。方法1と2でインストールされた APK は互換性がありますが、方法3でインストールされたものにはありません。これは方法1と2では、同じ署名鍵 (私たちが使用するもの)が使用されますが、方法3では異なった署名鍵 (F-Droidが使用するもの)が使用されるためです。方法4を使ったデバッグ APK のビルドは根本的に署名鍵の問題を除きます。署名鍵はユーザーが騙されて悪意のある更新がアプリにインストールされないことを助けるためにあります。 - -もし、何かしらの理由によりソースを切り替えたい場合 (例: NewPipe のコア機能が壊れてしまったが F-Droid はまだ更新をしていない) は、この手順を推奨します。 -1. 履歴や登録チャンネル、再生リストを保つために 設定 > コンテンツ > データベースをエクスポート からデータをバックアップ -2. NewPipe をアンインストール -3. 新しいソースから APK をダウンロードしてインストール -4. 設定 > コンテンツ > データベースをインポート からステップ1で作ったデータベースをインポート - - -## 貢献 -翻訳、デザインの変更、コードの整理、大規模なコードの変更などの助けはいつでも歓迎します。 -より良いものを一緒に作り上げましょう! - -もし貢献をしたい場合、[貢献ノート](.github/CONTRIBUTING.md)をご確認ください。 - - -翻訳状態 - - - -## 寄付 -もし、NewPipe を気に入っていただけたら、寄付をしていただけると嬉しいです。Bitcoin または Bountysource, Liberapay から寄付をすることができます。NewPipe への寄付については、[ウェブサイト](https://newpipe.net/donate)からお願いします。 - - - - - - - - - - - - - - - - - -
BitcoinBitcoin QR コード16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapayliberapay.com で NewPipe を訪れるLiberapay で寄付
Bountysourcebountysource.com で NewPipe を訪れるあなたがどれほどの寄付を得られるのか確認しましょう。
- -## プライバシーポリシー -NewPipe プロジェクトはメディアウェブサービスを使用する上でのプライベートで匿名の体験を提供することを目的としています。 -そのため、アプリはあなたの同意なしで一切のデータを収集しません。NewPipe のプライバシーポリシーはあなたがクラッシュレポートまたは、私たちのブログでコメントを送信した場合にどのようなデータが送信され、保存されるのかを詳細に説明しています。そのドキュメントは[こちら](https://newpipe.net/legal/privacy/)から見つけることができます。 - - -## ライセンス -[![GNU GPLv3 のロゴ](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) - -NewPipe はフリーソフトウェアなので、あなたはあなたの望むように使用、習得、共有、改善を行えます。 -具体的には、フリーソフトウェア財団により公開された [GNU General Public License](https://www.gnu.org/licenses/gpl.html) のバージョン3のライセンスもしくは、(あなたの選択で) いずれかの後継バージョンの規約の元で配布または改変を行うことができます。 +

+

NewPipe

+

自由で軽量な Android 向けストリーミングフロントエンド

+ +

Get it on F-Droid

+ +

+ + + + + + +

+
+

スクリーンショット説明機能インストールと更新貢献寄付ライセンス

+

ウェブサイトブログFAQニュース

+
+ +*他の言語で読む: [English](../README.md), [Español](README.es.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 を開いてください。 + +NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。 + + +## スクリーンショット + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) + + +## 説明 + +自由なコピーレフトソフトウェアの NewPipe は一切の Google フレームワークライブラリ及び、YouTube API を使用しません。ウェブサイトは必要な情報のためだけに読み込まれるため、このアプリは Google のサービスがインストールされていない端末で使用ができます。また、NewPipe の使用に YouTube アカウントは必要となりません。 + + +### 機能 + +* 動画の検索 +* 動画の基本情報の表示 +* YouTube の動画の視聴 +* YouTube の動画のバックグラウンド再生 +* ポップアップモード (フローティングプレイヤー) +* 動画を視聴するストリーミングプレイヤーの選択 +* 動画のダウンロード +* 音声のみのダウンロード +* Kodi での動画再生 +* 次の動画/関連動画の表示 +* 特定の言語の YouTube の検索 +* 年齢制限のあるコンテンツの視聴/ブロック +* チャンネルの基本情報の表示 +* チャンネルの検索 +* チャンネルからの動画の視聴 +* Orbot/Tor 対応 (直接的なものは未実装) +* 1080p/2K/4K 対応 +* 履歴の表示 +* チャンネルの登録 +* 履歴の検索 +* 再生リストの検索/視聴 +* 再生リストをキューに追加して再生 +* 動画のキューへの追加 +* 端末内の再生リスト +* 字幕 +* ライブ配信の対応 +* コメントの表示 + +### 対応しているサービス + +NewPipe は複数のサービスに対応しています。[ドキュメント](https://teamnewpipe.github.io/documentation/)は、どのようにしてアプリと NewPipe Extractor にサービスを追加できるかについて詳細な情報を提供しています。もし、新しいサービスを追加するならば、是非私たちに連絡をお願いします。現在対応しているサービスは: + +* YouTube +* SoundCloud \[ベータ\] +* media.ccc.de \[ベータ\] +* PeerTube インスタンス \[ベータ\] +* Bandcamp \[ベータ\] + + + + + +## インストールと更新 +以下の方法のいずれかに従うことによって NewPipe をインストールできます。 +1. カスタムリポジトリを F-Droid に追加してリリースが公開され次第インストールする。この方法の説明はこちら: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ +2. リリースが公開され次第[GitHub のリリース](https://github.com/TeamNewPipe/NewPipe/releases)から APK をダウンロードしてインストールする。 +3. F-Droid から更新する。これは更新を手にする上で最も遅い方法です。F-Droid が変更を検知して、APK をビルドし、署名、そしてユーザーに更新を届ける必要があるためです。 +4. 自分でデバッグ APK をビルドする。これは新しい機能を使用する上で最も早い方法ですが、他と比べてとても複雑なので、他の方法の使用を推奨します。 + +私たちはほとんどのユーザーに方法1を推奨します。方法1と2でインストールされた APK は互換性がありますが、方法3でインストールされたものにはありません。これは方法1と2では、同じ署名鍵 (私たちが使用するもの)が使用されますが、方法3では異なった署名鍵 (F-Droidが使用するもの)が使用されるためです。方法4を使ったデバッグ APK のビルドは根本的に署名鍵の問題を除きます。署名鍵はユーザーが騙されて悪意のある更新がアプリにインストールされないことを助けるためにあります。 + +もし、何かしらの理由によりソースを切り替えたい場合 (例: NewPipe のコア機能が壊れてしまったが F-Droid はまだ更新をしていない) は、この手順を推奨します。 +1. 履歴や登録チャンネル、再生リストを保つために 設定 > コンテンツ > データベースをエクスポート からデータをバックアップ +2. NewPipe をアンインストール +3. 新しいソースから APK をダウンロードしてインストール +4. 設定 > コンテンツ > データベースをインポート からステップ1で作ったデータベースをインポート + + +## 貢献 +翻訳、デザインの変更、コードの整理、大規模なコードの変更などの助けはいつでも歓迎します。 +より良いものを一緒に作り上げましょう! + +もし貢献をしたい場合、[貢献ノート](../.github/CONTRIBUTING.md)をご確認ください。 + + +翻訳状態 + + + +## 寄付 +もし、NewPipe を気に入っていただけたら、寄付をしていただけると嬉しいです。Bitcoin または Bountysource, Liberapay から寄付をすることができます。NewPipe への寄付については、[ウェブサイト](https://newpipe.net/donate)からお願いします。 + + + + + + + + + + + + + + + + + +
BitcoinBitcoin QR コード16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapayliberapay.com で NewPipe を訪れるLiberapay で寄付
Bountysourcebountysource.com で NewPipe を訪れるあなたがどれほどの寄付を得られるのか確認しましょう。
+ +## プライバシーポリシー +NewPipe プロジェクトはメディアウェブサービスを使用する上でのプライベートで匿名の体験を提供することを目的としています。 +そのため、アプリはあなたの同意なしで一切のデータを収集しません。NewPipe のプライバシーポリシーはあなたがクラッシュレポートまたは、私たちのブログでコメントを送信した場合にどのようなデータが送信され、保存されるのかを詳細に説明しています。そのドキュメントは[こちら](https://newpipe.net/legal/privacy/)から見つけることができます。 + + +## ライセンス +[![GNU GPLv3 のロゴ](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe はフリーソフトウェアなので、あなたはあなたの望むように使用、習得、共有、改善を行えます。 +具体的には、フリーソフトウェア財団により公開された [GNU General Public License](https://www.gnu.org/licenses/gpl.html) のバージョン3のライセンスもしくは、(あなたの選択で) いずれかの後継バージョンの規約の元で配布または改変を行うことができます。 diff --git a/README.ko.md b/doc/README.ko.md similarity index 75% rename from README.ko.md rename to doc/README.ko.md index 47ecd12bd..08e340388 100644 --- a/README.ko.md +++ b/doc/README.ko.md @@ -1,4 +1,4 @@ -

+

NewPipe

A libre lightweight streaming frontend for Android.

@@ -17,7 +17,7 @@

WebsiteBlogFAQPress


-*Read this in other languages: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Read this in other languages: [English](../README.md), [Español](README.es.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를 열람하여 주십시오. @@ -25,18 +25,18 @@ ## Screenshots -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) ## Description @@ -106,7 +106,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다. 더 많이 수행될수록 더 많이 발전할 수 있습니다! -만약 참여하고 싶다면, 우리의 [컨트리뷰션 공지](.github/CONTRIBUTING.md)를 참고하십시오. +만약 참여하고 싶다면, 우리의 [컨트리뷰션 공지](../.github/CONTRIBUTING.md)를 참고하십시오. Translation status @@ -118,17 +118,17 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 - + - - + + - +
BitcoinBitcoin QR codeBitcoin QR code 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comVisit NewPipe at bountysource.com Check out how many bounties you can earn.
diff --git a/doc/README.pl.md b/doc/README.pl.md new file mode 100644 index 000000000..91c06fbd6 --- /dev/null +++ b/doc/README.pl.md @@ -0,0 +1,144 @@ +

+

NewPipe

+

Wolny, lekki streamingowy frontend na Androida.

+ +

Pobierz z F-Droid

+ +

+ + + + + + +

+
+

ScreenshotyOpisFunkcjeInstalacja i aktualizacjeWkładWesprzyjLicencja

+

StronaBlogFAQPress

+
+ +*Przeczytaj w innych językach: [English](../README.md), [Español](README.es.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).* + +UWAGA: TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. + +PUBLIKOWANIE NEWPIPE LUB JAKIEGOKOLWIEK JEGO FORKU W SKLEPIE PLAY NARUSZA ICH WARUNKI UŻYTKOWANIA. + +## Screenshoty + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) + +## Opis + +NewPipe nie używa żadnych bibliotek Google ani API YouTube. Strony są jedynie analizowane aby zdobyć wymagane informacje, dzięki czemu ta aplikacja może zostać zainstalowana na urządzeniach bez Usług Google Play. Konto YouTube nie jest wymagane aby używać NewPipe, które jest wolnym oprogramowaniem copyleft. + +### Funkcje + +* Wyszukiwanie filmów +* Brak wymogu konta Google/YouTube +* Wyświetlanie generalnych informacji o filmach +* Oglądanie filmów na YouTube +* Słuchanie filmów na YouTube +* Tryb okienkowy (Pływające okno) +* Wybieranie odtwarzacza przez który możemy oglądać film +* Pobieranie filmów +* Pobieranie audio +* Otwieranie filmów w Kodi +* Pokazanie następnych/podobnych filmów +* Wyszukiwanie w YouTube w konkretnym języku +* Oglądanie/Blokowanie materiałów zablokowanych wiekowo. +* Wyświetlanie generalnych informacji o kanałach +* Wyszukiwanie kanałów +* Oglądanie filmów ze strony kanału +* Wsparcie dla Orbot/Tor (Jeszcze nie bezpośrednio) +* Wsparcie dla 1080p/2K/4K +* Historia oglądania +* Subskrybowanie kanałów +* Historia wyszukiwania +* Wyszukiwanie/Oglądanie playlist +* Oglądanie playlist w kolejce +* Dodawnaie filmów do kolejki +* Lokalne playlisty +* Napisy +* Wsparcie dla livestream'ów +* Wyświetlanie komentarzy + +### Wspierane usługi + +NewPipe wspiera wiele usług. Nasza [dokumentacja](https://teamnewpipe.github.io/documentation/) dostarcza więcej informacji o tym jak nowe usługi mogą zostać dodane do aplikacji i extractora. Proszę skontaktuj się z nami jeśli masz zamiar dodać jakąś nową usługę. Obecnie wspierane usługi to: + +* YouTube +* SoundCloud \[beta\] +* media.ccc.de \[beta\] +* Instancje PeerTube \[beta\] +* Bandcamp \[beta\] + +## Instalacja i aktualizacje +Możesz zainstalować NewPipe za pomocą jednej z tych metod: + 1. Dodaj nasze repozytorium do F-Droid i z tamtąd pobierz NewPipe. Instrukcje znajdują się tutaj: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Pobierz APK z [Wydań na GitHubie](https://github.com/TeamNewPipe/NewPipe/releases) i zainstaluj go. + 3. Zaktualizuj poprzez F-Droid. Jest to najwolniejsza metoda aktualizacji, ponieważ F-Droid musi rozpoznać zmiany, zbudować APK, podpisać go i dopiero wypuścić aktualizację do użytkowników. + 4. Zbuduj debug APK samemu. Jest to najszybszy sposób na zdobycie najnowszych funkcji, ale jest to o wiele, wiele bardziej skomplikowane, dlatego rekomendujemy używania jednej z powyższych metod. + +Dla większości użytkowników rekomendujemy metodę 1. Pliki APK zainstalowane za pomocą metod 1 lub 2 są ze sobą kompatybilne, lecz nie są kompatybilne z tymi zainstalowanymi metodą 3. Dzieje się tak ponieważ ten sam (nasz) klucz jest używany do podpisania APK z metod 1 i 2, ale APK z metody 3 podpisany jest innym kluczem (F-Droida). Budowanie debug APK z metody 4 w ogóle nie uwzględnia klucza. Klucze podpisu zapewniają, że użytkownik omylnie nie zainstaluje złośliwej aktualizacji żadnej aplikacji. + +W międzyczasie, jeśli z jakiegoś powodu chcesz zmienić źródło (np. rdzenna funkcjonalność NewPipe psuje się a F-Droid nie ma jeszcze najnowszej aktualizacji), rekomendujemy użyć następującej procedury: +1. Zrób kopię danych wchodząc w Ustawienia > Zawartość > Eksportuj dane, dzięki czemu zachowasz swoją historię, subskrypcje i playlisty +2. Odinstaluj NewPipe +3. Pobierz APK z nowego źródła i zainstaluj go +4. Przywróć dane z kroku 1 wchodząc w Ustawienia > Zawartość > Importuj dane + +## Wkład +Jeśli masz jakieś pomysły, tłumaczenia, zmiany designu, oczyszczony kod, lub wielkie zmiany w kodzie, pomoc jest zawsze mile widziana. +Im więcej jest zrobione, tym lepsza staje się aplikacja! + +Jeśli chcesz pomóc, przeczytaj [Notkę o wkładzie](../.github/CONTRIBUTING.md). + + +Translation status + + +## Wesprzyj +Jeśli podoba Ci się NewPipe, bardzo ucieszylibyśmy się z dotacji. Możesz wysłać bitcoin lub przekazać darowiznę przez Bountysource lub Liberapay. Po więcej informacji o darowiznach dla NewPipe, proszę zobacz naszą [stronę](https://newpipe.net/donate). + + + + + + + + + + + + + + + + + +
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
+ +## Polityka prywatności + +Założeniem projektu NewPipe jest dostarczanie prywatnego, anonimowego dostępu do zasobów i usług internetowych. +Dlatego też, ta aplikacja nie zbiera żadnych informacji bez twojej zgody. Polityka prywatności NewPipe dokładnie wyjaśnia jakie dane są wysyłane i przechowywane, gdy wyślesz raport awarii lub komentarz na naszym blogu. Możesz znaleźć ten dokument [tutaj](https://newpipe.net/legal/privacy/). + +## Licencja +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe to wolne oprogramowanie: Możesz używać, uczyć się, udostępniać i ulepszać je do woli. +Możesz udostępniać i/lub modyfikować je na zasadach licencji +[GNU General Public License](https://www.gnu.org/licenses/gpl.html) +publikowaną przez Free Software Foundation, wersję 3 Licencji, lub +(twój wybór) każdną nowszą wersję. diff --git a/README.pt_BR.md b/doc/README.pt_BR.md similarity index 74% rename from README.pt_BR.md rename to doc/README.pt_BR.md index b1b70bcd6..4afe51996 100644 --- a/README.pt_BR.md +++ b/doc/README.pt_BR.md @@ -1,4 +1,4 @@ -

+

NewPipe

Uma interface de streaming leve e gratuita para Android.

@@ -18,7 +18,7 @@

SiteBlogFAQPress


-*Read this in other languages: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Read this in other languages: [English](../README.md), [Español](README.es.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 É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB. @@ -26,18 +26,18 @@ ## Screenshots -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) ## Descrição @@ -102,7 +102,7 @@ Enquanto isso, se você quiser trocar de fontes por algum motivo (por exemplo, a Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor fica! -Se você quiser se envolver, verifique nossa [notas de contribuição](.github/CONTRIBUTING.md). +Se você quiser se envolver, verifique nossa [notas de contribuição](../.github/CONTRIBUTING.md). Translation status @@ -114,17 +114,17 @@ Se você gosta de NewPipe, ficaríamos felizes com uma doação. Você pode envi - + - - + + - +
BitcoinBitcoin QR codeBitcoin QR code 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comVisit NewPipe at bountysource.com Check out how many bounties you can earn.
diff --git a/README.ro.md b/doc/README.ro.md similarity index 75% rename from README.ro.md rename to doc/README.ro.md index b40015a11..32ab8126e 100644 --- a/README.ro.md +++ b/doc/README.ro.md @@ -1,4 +1,4 @@ -

+

NewPipe

Un front-end de streaming „uşor” liber, pentru Android.

@@ -17,7 +17,7 @@

WebsiteBlogFAQPresă


-*Citiţi în alte limbi: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Citiţi în alte limbi: [English](../README.md), [Español](README.es.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).* Atenţionare: ACEASTA ESTE O VERSIUNE BETA, AŞA CĂ S-AR PUTE SĂ ÎNTÂLNIŢI ERORI. DACĂ SE ÎNTÂMPLĂ ACEST LUCRU, DESCHIDEŢI UN ISSUE PRIN REPSITORY-UL NOSTRU GITHUB. @@ -25,18 +25,18 @@ ## Capturi de ecran -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) ## Descriere @@ -105,7 +105,7 @@ Recomandăm metoda 1 pentru majoritatea utilizatorilor. APK-urile din metodele 1 Dacă aveţi idei, traduceri, schimbări de design, curaţarea codului, sau schimbări majore ale codului, ajutorul este întotdeauna binevenit. Cu cât se face mai mult cu atât mai bună devine aplicaţia! -Dacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](.github/CONTRIBUTING.md). +Dacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](../.github/CONTRIBUTING.md). Translation status @@ -117,17 +117,17 @@ Dacă vă place NewPipe, am fi bucuroşi să primim o donaţie. Puteţi să ne t - + - - + + - +
BitcoinBitcoin QR codeBitcoin QR code 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comVisit NewPipe at bountysource.com Check out how many bounties you can earn.
diff --git a/README.so.md b/doc/README.so.md similarity index 75% rename from README.so.md rename to doc/README.so.md index 78cd65075..2b8ab020a 100644 --- a/README.so.md +++ b/doc/README.so.md @@ -1,4 +1,4 @@ -

+

NewPipe

App bilaash ah oo fudud looguna talagalay in Android-ka wax loogu daawado.

@@ -17,7 +17,7 @@

Website-kaMaqaaladaSu'aalaha Aalaa La-iswaydiiyoWarbaahinta


-*Ku akhri luuqad kale: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Ku akhri luuqad kale: [English](../README.md), [Español](README.es.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).* DIGNIIN: MIDKAN, NOOCA APP-KA EE HADDA WALI TIJAABO AYUU KU JIRAA, SIDAA DARTEED CILLADO AYAAD LA KULMI KARTAA. HADAAD LA KULANTO, KA FUR ARIN SHARAXAYA QAYBTANADA ARRIMAHA EE GITHUB-KA. @@ -25,18 +25,18 @@ ## Sawir-shaashadeed -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) ## Faahfaahin @@ -100,7 +100,7 @@ Waxaa kale, hadaad rabto inaad tixraacayada kala badasho sabab jirta awgeed (tus ## Kusoo Kordhin Hadaad hayso fikrado; rogid, qaab badal, nadiifin koodh, ama koodhka ood si wayn wax oga badashaa—caawinta marwalba waa lasoo dhawaynayaa. Waxbadan hadii la qabto waxbadan ayaa fiicnaan! -Hadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](.github/CONTRIBUTING.md). +Hadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](../.github/CONTRIBUTING.md). Heerka turjimaada @@ -112,17 +112,17 @@ Hadaad jeceshahay NewPipe waan ku faraxsanaan lahayn deeq. Waxaad soo diri karta - + - - + + - +
BitcoinBitcoin QR codeBitcoin QR code 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comVisit NewPipe at bountysource.com Check out how many bounties you can earn.
diff --git a/README.tr.md b/doc/README.tr.md similarity index 74% rename from README.tr.md rename to doc/README.tr.md index 1fa39d600..6b3169bdb 100644 --- a/README.tr.md +++ b/doc/README.tr.md @@ -1,4 +1,4 @@ -

+

NewPipe

Android için hafif ve özgür bir akış arayüzü.

@@ -17,7 +17,7 @@

Web sitesiBlogSSSBasın


-*Bu sayfayı diğer dillerde okuyun: [English](README.md), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).* +*Bu sayfayı diğer dillerde okuyun: [English](../README.md), [Español](README.es.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).* UYARI: BU SÜRÜM BETA SÜRÜMÜDÜR, BU NEDENLE HATALARLA KARŞILAŞABİLİRSİNİZ. HATA BULURSANIZ BU GITHUB DEPOSUNDA BUNU BİLDİRİN. @@ -25,18 +25,18 @@ ## Ekran görüntüleri -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) ## Açıklama @@ -104,7 +104,7 @@ Bu arada, herhangi bir nedenle kaynakları değiştirmek istiyorsanız (örneği Fikirleriniz, çevirileriniz, tasarım değişiklikleriniz, kod temizlemeniz veya ağır kod değişiklikleriniz olsun, yardımınıza her zaman açığız. Yapılan her değişiklikle NewPipe daha da iyi bir konuma geliyor! -Eğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız notları](.github/CONTRIBUTING.md) kontrol edin. +Eğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız notları](../.github/CONTRIBUTING.md) kontrol edin. Çeviri istatistikleri @@ -116,17 +116,17 @@ NewPipe'ı beğendiyseniz, yapacağınız bağışlar bizi motive eder. Bitcoin - + - - + + - +
BitcoinBitcoin QR koduBitcoin QR kodu 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapayliberapay.com üzerinde NewPipe'ı ziyaret edinLiberapay aracılığıyla bağış yapınliberapay.com üzerinde NewPipe'ı ziyaret edinLiberapay aracılığıyla bağış yapın
Bountysourcebountysource.com üzerinde NewPipe'ı ziyaret edinbountysource.com üzerinde NewPipe'ı ziyaret edin Ne kadar ödül kazanabileceğinizi kontrol edin.
diff --git a/doc/README.zh_TW.md b/doc/README.zh_TW.md new file mode 100644 index 000000000..6be8d0fc4 --- /dev/null +++ b/doc/README.zh_TW.md @@ -0,0 +1,149 @@ +

+

NewPipe

+

輕巧的 Android 串流前端

+ +

Get it on F-Droid

+ +

+ + + + + + +

+
+

截圖說明功能安裝與更新貢獻捐款授權憑證

+

網站部落格FAQ媒體

+
+ +*其他語言: [English](../README.md), [Español](README.es.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 REPO 開 ISSUE 回報。 + +將 NEWPIPE 或其任何分支上傳至 GOOGLE PLAY 商店違反了他們的使用者合約。 + + +## 截圖 + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) + + +## 說明 + +NewPipe 不使用任何 Google 架構的函式庫或 Youtube API。因為只解析網站來取得必要資訊,此軟體可以在沒有安裝 Google 服務的裝置上使用。此外,使用 NewPipe 不需要 YouTube 帳號。NewPipe 是個 copyleft 自由軟體。 + + +### 功能 + +* 搜索影片 +* 無須登入 +* 顯示影片的基本資訊 +* 播放 Youtube 影片 +* 收聽 Youtube 影片 +* 彈出模式(懸浮模式) +* 選擇串流播放器來播放影片 +* 下載影片 +* 只下載音訊 +* 在 Kodi 開啟影片 +* 顯示上/下一部影片 +* 搜尋特定語言的影片 +* 播放/屏蔽有年齡限的制內容 +* 顯示頻道資訊 +* 搜索頻道 +* 觀看頻道影片 +* 支援 Orbot/Tor (目前未直接實裝) +* 支援 1080p/2K/4K +* 觀看歷史 +* 訂閱頻道 +* 搜尋歷史 +* 搜索/播放播放清單 +* 將播放清單加入待播清單 +* 將影片加入待播清單 +* 末端播放清單 +* 字幕 +* 支援直播 +* 顯示評論 + +### 支援的網站 + +NewPipe 支援多種服務。我們的[使用文件](https://teamnewpipe.github.io/documentation/)有如何增加新服務與下載器的說明。想新增服務的話,請聯絡我們。目前支援的服務有: + +* YouTube +* SoundCloud \[測試\] +* media.ccc.de \[測試\] +* PeerTube instances \[測試\] +* Bandcamp \[測試\] + + + + + +## 安裝與更新 +你可以用以下的任何方法安裝 NewPipe: +1. 將我們的 repo 加至 F-Droid 再從那邊安裝。詳細的說明在此:https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ +2. 從 [Github 發布](https://github.com/TeamNewPipe/NewPipe/releases) 下載 APK 再安裝。 +3. 自 F-Droid 更新。這是取得更新最慢的方式,因為 F-Droid 要檢測到更新、建置 APK 、簽署後才會將更新推送給使用者。 +4. 自己建置 APK。這是取得更新最快的方法,但因為這也比較複雜,所以我們推薦使用其他方法。 + +對一般的使用者我們推薦方法一。使用方法一或二安裝的 APK 互相相容,但都不相容於方法三。因為前兩者的簽章使用相同的(我們的)金鑰,與後者(使用 F-Droid 的金鑰)的不同。使用方法四建置除錯 APK 完全避免了金鑰的問題。簽章金鑰能幫助使用者避免安裝惡意的更新。 + +若你想更換安裝來源(如果 NewPipe 的核心機能壞掉而 F-Droid 又還沒有最新的更新),我們推薦以下的步驟: +1. 在 設定 > 內容 > 匯出資料庫 備份資料以保留歷史、訂閱與播放清單 +2. 移除 NewPipe +3. 從新的來源下載 APK 並安裝 +4. 在 設定 > 內容 > 匯入資料庫 匯入在步驟 1 備份的資料 + + +## 貢獻 +若你有任何想法、翻譯、設計、整理原始碼或大範圍的原始碼改動,我們歡迎任何幫助。 + +若你想參與,請閱讀[貢獻須知(英文)](../.github/CONTRIBUTING.md)。 + + +Translation status + + + +## 捐款 +若你喜歡 NewPipe 我們歡迎捐款。你可以使用 bitcoin ,也能在 Bountysource 或 Liberapay 上捐款。 更多關於捐款資訊,請見我們的[網站](https://newpipe.net/donate)。 + + + + + + + + + + + + + + + + + +
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
+ +## 隱私權政策 +NewPipe 專案旨在提供私人與匿名的網路媒體使用體驗。 +因此,此軟體不在沒有你的同意下收集任何資料。NewPipe 的隱私權政策說明了送出錯誤報告與在我們的部落格上留言時何種資料會被傳輸或儲存。你可以在[這裡](https://newpipe.net/legal/privacy/)找到此文件。 + + +## 授權條款 +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe 是自由軟體:可以任意使用、研究、分享或更改。在自由軟體基金會發布的[ GPL 通用公眾授權條款](第三或更新的版本)下可以重新散佈與/或修改。 + diff --git a/fastlane/metadata/android/en-US/changelogs/982.txt b/fastlane/metadata/android/en-US/changelogs/982.txt new file mode 100644 index 000000000..954c6a818 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/982.txt @@ -0,0 +1 @@ +Fixed YouTube not playing any stream. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 000000000..611b8291c Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/fastlane/metadata/android/es/changelogs/981.txt b/fastlane/metadata/android/es/changelogs/981.txt new file mode 100644 index 000000000..d78d60488 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/981.txt @@ -0,0 +1,2 @@ +Eliminada la compatibilidad con MediaParser para poder solucionar problemas de reanudación de la reproducción tras el almacenamiento en búfer en Android 11+. +Deshabilitado el túnel de medios en Philips QM16XE para poder solucionar problemas de reproducción. diff --git a/fastlane/metadata/android/fa/changelogs/981.txt b/fastlane/metadata/android/fa/changelogs/981.txt new file mode 100644 index 000000000..fce4da4ad --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/981.txt @@ -0,0 +1,2 @@ +برداشتن پشتیبانی MediaParser برای تعمیر شکست از سر گیری پخش پس از میانگیری روی اندروید ۱۱+. +تونل‌زنی رسانهٔ از کارافتاده روی QM16XE فیلیپس برای تعمیر مشکلات پخش. diff --git a/fastlane/metadata/android/he/changelogs/981.txt b/fastlane/metadata/android/he/changelogs/981.txt new file mode 100644 index 000000000..8a5f0d04a --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/981.txt @@ -0,0 +1,2 @@ +הוסרה תמיכה ב־MediaParser כדי לתקן המשך נגינה שנכשל לאחר אגירה ב־Android 11+‎. +הושבת תיעול מדיה ב־Philips QM16XE כדי לתקן בעיות נגינה. diff --git a/fastlane/metadata/android/hi/changelogs/63.txt b/fastlane/metadata/android/hi/changelogs/63.txt new file mode 100644 index 000000000..557b8c29b --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/63.txt @@ -0,0 +1,8 @@ +### सुधार +- आयात/निर्यात सेटिंग्स #1333 +- ओवरड्रॉ को कम करें (प्रदर्शन सुधार) #1371 +- कोड में कुछ छोटे सुधार #1375 +- जीडीपीआर के बारे में सब कुछ जोड़ें #1420 + +### ठीक किए गए +- डाउनलोडर: .गीगा फाइलों से अधूरे डाउनलोड लोड करने पर क्रैश को ठीक करें #1407 diff --git a/fastlane/metadata/android/hi/full_description.txt b/fastlane/metadata/android/hi/full_description.txt index 9ab5b312b..47c8826d7 100644 --- a/fastlane/metadata/android/hi/full_description.txt +++ b/fastlane/metadata/android/hi/full_description.txt @@ -1 +1 @@ -न्यूपाइप किसी भी गुगल फ्रेमवर्क लाइब्रेरी, या यूट्यूब एपीआई का उपयोग नहीं करता है। यह केवल वेबसाइट को पार्स करता है ताकि इसकी आवश्यकता वाली जानकारी हासिल की जा सके। इसलिए इस ऐप का उपयोग गुगल सेवाओं के स्थापित किए बिना उपकरणों पर किया जा सकता है। इसके अलावा, आपको न्यूपाइप का उपयोग करने के लिए युट्युब खाते की आवश्यकता नहीं है, और यह मुक्त और खुला है। +न्यूपाइप किसी भी गुगल फ्रेमवर्क लाइब्रेरी, या यूट्यूब एपीआई का उपयोग नहीं करता है। यह केवल वेबसाइट को पार्स करता है ताकि इसकी आवश्यकता वाली जानकारी हासिल की जा सके। इसलिए इस ऐप का उपयोग गुगल सेवाओं के स्थापित किए बिना उपकरणों पर किया जा सकता है। इसके अलावा, आपको न्यूपाइप का उपयोग करने के लिए युट्युब खाते की आवश्यकता नहीं है, और यह मुक्त और खुला है। diff --git a/fastlane/metadata/android/hu/changelogs/64.txt b/fastlane/metadata/android/hu/changelogs/64.txt new file mode 100644 index 000000000..4ba4191a9 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/64.txt @@ -0,0 +1,8 @@ +### Fejlesztések +- Lehetőség a videó minőségének korlátozására mobiladat-kapcsolaton #1339 +- Az alkalmazás bezárásáig megjegyzi a fényerő-beállítást #1442 +- Jobb letöltési teljesítmény gyengébb CPU-kon #1431 +- médiamunkamenet (működő) támogatásának hozzáadása #1433 + +### Javítások +- A letöltések megnyitásánál történő összeomlás javítása (a javítás mostantól érhető el a kiadási verziókban is) #1441 diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt index df1f8cb77..772992ee4 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 kö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ü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. diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt new file mode 100644 index 000000000..0a96f5e90 --- /dev/null +++ b/fastlane/metadata/android/hu/short_description.txt @@ -0,0 +1 @@ +Egy ingyenes és könnyű YouTube előtétprogram Androidra. diff --git a/fastlane/metadata/android/nl/changelogs/957.txt b/fastlane/metadata/android/nl/changelogs/957.txt index f8e495930..ce334f310 100644 --- a/fastlane/metadata/android/nl/changelogs/957.txt +++ b/fastlane/metadata/android/nl/changelogs/957.txt @@ -1,4 +1,4 @@ -• Voeg specifieke enqeue-acties samen +• Voeg specifieke wachtrij-acties samen • 2-vinger-beweging om de speler te sluiten • Wis reCAPTHA-cookies • Optie om meldingen niet te kleuren diff --git a/fastlane/metadata/android/nl/full_description.txt b/fastlane/metadata/android/nl/full_description.txt index 290373183..2fa0ff5d0 100644 --- a/fastlane/metadata/android/nl/full_description.txt +++ b/fastlane/metadata/android/nl/full_description.txt @@ -1 +1 @@ -NewPipe gebruikt geen enkele Google framework library, of de YouTube API. Het parseert alleen de website om informatie die het nodig heeft te krijgen. Daardoor kan deze app gebruikt worden zonder Google Services geïnstalleerd te hebben. Daarnaast heb je geen YouTube-account nodig om NewPipe te gebruiken, en is het FLOSS. +NewPipe gebruikt geen enkele Google framework library, noch de YouTube API. Het analyseert de website alleen op zoek naar informatie die het nodig heeft. Daardoor kan deze app gebruikt worden zonder Google Services installatie. Daarnaast heb je geen YouTube-account nodig om NewPipe te gebruiken en is het FLOSS. diff --git a/fastlane/metadata/android/pt-PT/changelogs/968.txt b/fastlane/metadata/android/pt-PT/changelogs/968.txt new file mode 100644 index 000000000..96f3d0fba --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/968.txt @@ -0,0 +1,7 @@ +Adicionada a opção de detalhes do canal ao menu de pressão prolongada. +Adicionada funcionalidade para renomear o nome da lista de reprodução da interface da lista de reprodução. +Permitir que o utilizador faça uma pausa enquanto um vídeo está a ser gravado no buffer. +Polido o tema branco. +Corrigida a sobreposição de fontes quando se utiliza uma fonte de tamanho maior. +Corrigido nenhum vídeo em dispositivos Formuler e Zephier. +Corrigidas várias falhas. diff --git a/fastlane/metadata/android/pt-PT/changelogs/970.txt b/fastlane/metadata/android/pt-PT/changelogs/970.txt new file mode 100644 index 000000000..8d43bb9db --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/970.txt @@ -0,0 +1,11 @@ +Novo +- Mostrar metadados de conteúdo (marcações, categorias, licença, ...) abaixo da descrição +- Adicionado "Mostrar detalhes do canal" opção em listas de reprodução remotas (não locais) +- Adicionado "Abrir no browser" opção para o menu de pressão longa + +Fixo +- Fixação da falha de rotação na página de detalhes do vídeo +- Fixo botão "Reproduzir com Kodi" no reprodutor sempre pede instalar Kore +- Caminhos de importação e exportação fixos e melhorados +- [YouTube] Fixo comentário e contagem +... diff --git a/fastlane/metadata/android/pt-PT/changelogs/977.txt b/fastlane/metadata/android/pt-PT/changelogs/977.txt new file mode 100644 index 000000000..340ab4d4f --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/977.txt @@ -0,0 +1,10 @@ +• Adicionado botão "reproduzir seguinte" ao menu de toque longo +• Adicionado prefixo do caminho curto do YouTube ao filtro +• Importação de configurações corrigida +• Trocada a posição da barra de pesquisa com os botões do reprodutor no ecrã da fila +• Várias correções de MediasessionManager +• Barra de pesquisa corrigida após o final do vídeo +• Tunelamento de mídia desativado no RealtekATV +• Expandida a área clicável dos botões minimizados + +Ver também o registo de alterações e o blogue abaixo. diff --git a/fastlane/metadata/android/pt-PT/changelogs/978.txt b/fastlane/metadata/android/pt-PT/changelogs/978.txt new file mode 100644 index 000000000..be505a16c --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/978.txt @@ -0,0 +1 @@ +Corrigida a verificação se existe uma nova versão do NewPipe. Esta verificação era muitas vezes executada demasiado cedo, o que levava a uma falha da aplicação. Agora isto deve estar corrigido. diff --git a/fastlane/metadata/android/pt-PT/changelogs/979.txt b/fastlane/metadata/android/pt-PT/changelogs/979.txt new file mode 100644 index 000000000..52b1baaff --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/979.txt @@ -0,0 +1,2 @@ +- Problema ao retomar a reprodução corrigido +- Melhorias para garantir que o serviço que determina se o NewPipe deve verificar se existe uma nova versão não seja iniciado em segundo plano diff --git a/fastlane/metadata/android/pt-PT/changelogs/980.txt b/fastlane/metadata/android/pt-PT/changelogs/980.txt new file mode 100644 index 000000000..2def4bc5a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/980.txt @@ -0,0 +1,13 @@ +Novo +- Adicionado "Adicionar à lista de reprodução" opção para o menu compartilhar +- Adicionado suporte para ligações curtos y2u.be e PeerTube + +Melhorado +- Controles de Velocidade de Reprodução mais compactos +- Feed destaca novos itens agora +- A opção "Mostrar itens observados" no feed está agora gravada + +Fixo +- Fixo a extração de likes e dislikes da YouTube +- Repetição automática fixa após retornar do fundo +... diff --git a/fastlane/metadata/android/pt-PT/changelogs/981.txt b/fastlane/metadata/android/pt-PT/changelogs/981.txt new file mode 100644 index 000000000..1e7c23f50 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/981.txt @@ -0,0 +1,2 @@ +Removido o suporte ao MediaParser para corrigir falha de reprodução após buffer no Android 11+. +Tunelamento de mídia desativado no Philips QM16XE para corrigir problemas de reprodução. diff --git a/fastlane/metadata/android/pt/changelogs/965.txt b/fastlane/metadata/android/pt/changelogs/965.txt new file mode 100644 index 000000000..de54cf139 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/965.txt @@ -0,0 +1,6 @@ +Corrigido o crash que ocorria ao reordenar grupos de canais. +Corrigida a obtenção de mais vídeos do YouTube a partir de canais e listas de reprodução. +Corrigida a obtenção de comentários do YouTube. +Adicionado suporte a /watch/, /v/ e /w/ subpaths nas URLs do YouTube. +Corrigida a extração de id de cliente SoundCloud e conteúdo geo-restrito. +Adicionada a localização Curda do Norte. diff --git a/fastlane/metadata/android/pt/changelogs/968.txt b/fastlane/metadata/android/pt/changelogs/968.txt new file mode 100644 index 000000000..96f3d0fba --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/968.txt @@ -0,0 +1,7 @@ +Adicionada a opção de detalhes do canal ao menu de pressão prolongada. +Adicionada funcionalidade para renomear o nome da lista de reprodução da interface da lista de reprodução. +Permitir que o utilizador faça uma pausa enquanto um vídeo está a ser gravado no buffer. +Polido o tema branco. +Corrigida a sobreposição de fontes quando se utiliza uma fonte de tamanho maior. +Corrigido nenhum vídeo em dispositivos Formuler e Zephier. +Corrigidas várias falhas. diff --git a/fastlane/metadata/android/pt/changelogs/970.txt b/fastlane/metadata/android/pt/changelogs/970.txt new file mode 100644 index 000000000..8d43bb9db --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/970.txt @@ -0,0 +1,11 @@ +Novo +- Mostrar metadados de conteúdo (marcações, categorias, licença, ...) abaixo da descrição +- Adicionado "Mostrar detalhes do canal" opção em listas de reprodução remotas (não locais) +- Adicionado "Abrir no browser" opção para o menu de pressão longa + +Fixo +- Fixação da falha de rotação na página de detalhes do vídeo +- Fixo botão "Reproduzir com Kodi" no reprodutor sempre pede instalar Kore +- Caminhos de importação e exportação fixos e melhorados +- [YouTube] Fixo comentário e contagem +... diff --git a/fastlane/metadata/android/pt/changelogs/980.txt b/fastlane/metadata/android/pt/changelogs/980.txt new file mode 100644 index 000000000..2def4bc5a --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/980.txt @@ -0,0 +1,13 @@ +Novo +- Adicionado "Adicionar à lista de reprodução" opção para o menu compartilhar +- Adicionado suporte para ligações curtos y2u.be e PeerTube + +Melhorado +- Controles de Velocidade de Reprodução mais compactos +- Feed destaca novos itens agora +- A opção "Mostrar itens observados" no feed está agora gravada + +Fixo +- Fixo a extração de likes e dislikes da YouTube +- Repetição automática fixa após retornar do fundo +... diff --git a/fastlane/metadata/android/pt/changelogs/981.txt b/fastlane/metadata/android/pt/changelogs/981.txt new file mode 100644 index 000000000..1e7c23f50 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/981.txt @@ -0,0 +1,2 @@ +Removido o suporte ao MediaParser para corrigir falha de reprodução após buffer no Android 11+. +Tunelamento de mídia desativado no Philips QM16XE para corrigir problemas de reprodução. diff --git a/fastlane/metadata/android/sv/changelogs/980.txt b/fastlane/metadata/android/sv/changelogs/980.txt new file mode 100644 index 000000000..dd81569d7 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/980.txt @@ -0,0 +1,13 @@ +Nytt +• La till "Lägg till i spellista" alternativ i delningsmenyn +• La till stöd för y2u.be och PeerTube kort länkar + +Förbättrat +• Gjorde uppspelningshastighetskontrollerna mer kompakta +• Flödet markerar nya objekt nu +• "Visa bevakade objekt" alternativet i flödet sparas nu + +Fixat +• Fixade YouTube tumme upp och tumme ner extraktion +• Fixade automatisk uppspelning efter återkomst från bakgrunden +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/981.txt b/fastlane/metadata/android/sv/changelogs/981.txt new file mode 100644 index 000000000..edb8c1779 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/981.txt @@ -0,0 +1,2 @@ +Tog bort stödet för MediaParser för att åtgärda fel i återupptagningen av uppspelning efter buffring på Android 11+. +Inaktiverade media tunneling på Philips QM16XE för att åtgärda uppspelningsproblem. diff --git a/fastlane/metadata/android/uk/changelogs/930.txt b/fastlane/metadata/android/uk/changelogs/930.txt new file mode 100644 index 000000000..0adf7b847 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/930.txt @@ -0,0 +1,19 @@ +Нове +• Пошук на YouTube Music +• Підтримка Android TV + +Поліпш. +• Можна вилуч. всі переглянуті відео з локальної добірки +• Сповіщення про непідтрим. вміст +• Покращено жести зміни розміру програвача щипанням +• Вилучення трансляцій з черги натиском на тло +• Краща обробка розміру заголовка панелі + +Випр. +• Роботу налаштув. вікового обмеж. вмісту +• Деякі види reCAPTCHA +• Збої під час відкр. закладок, якщо добірка `null` +• Виявлення винятків, пов'язаних з мережею +• Кнопку сорт. груп у підписках + +та інше diff --git a/fastlane/metadata/android/uk/changelogs/951.txt b/fastlane/metadata/android/uk/changelogs/951.txt index fa7c0f526..1cd68b0b8 100644 --- a/fastlane/metadata/android/uk/changelogs/951.txt +++ b/fastlane/metadata/android/uk/changelogs/951.txt @@ -2,8 +2,8 @@ •Дод.пошук для збир.підписок у вікні груп. стрічок •Дод.фільтр до вікна груп.стрічок для показу лише незгруп.підписок •Дод.вкладку добірок на осн.стор. -•Швид.перемот.вперед/назад на тлі/вікні програв.черги -•Відобр.поради пошуку: мали на увазі і показ результ. для +•Швид.перемот.вперед/назад у фоні/вікні програв.черги +•Показ порад пошуку: мали на увазі й показ результ. для Покр. •Вил.запис метадан.програми в зміш.файли •Не вилуч.невдалі потоки з черги diff --git a/fastlane/metadata/android/uk/changelogs/958.txt b/fastlane/metadata/android/uk/changelogs/958.txt index 18b22eedf..8f88562e5 100644 --- a/fastlane/metadata/android/uk/changelogs/958.txt +++ b/fastlane/metadata/android/uk/changelogs/958.txt @@ -7,7 +7,7 @@ • Збої запуску NewPipe після його видалення з оперативної пам’яті • Збої запуску, коли немає з'єднання з інтернетом • Дотримання параметрів яскравості та жестів -• [YouTube] Виправлені довгі списки відтворення +• [YouTube] Виправлені довгі добірки Інше: • Очищення коду та кілька внутрішніх удосконалень diff --git a/fastlane/metadata/android/uk/changelogs/981.txt b/fastlane/metadata/android/uk/changelogs/981.txt new file mode 100644 index 000000000..fb358f995 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/981.txt @@ -0,0 +1,2 @@ +Вилучено підтримку MediaParser, щоб виправити помилку відновлення відтворення після буферизації на Android 11+. +Вимкнено медіатунелювання на Philips QM16XE, щоб розв'язати проблеми відтворення. diff --git a/fastlane/metadata/android/zh-Hans/changelogs/981.txt b/fastlane/metadata/android/zh-Hans/changelogs/981.txt new file mode 100644 index 000000000..be941ae71 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/981.txt @@ -0,0 +1,2 @@ +移除了对MediaParser的支持,以解决在Android 11+上缓冲后恢复播放失败的问题。 +在Philips QM16XE上禁用了媒体隧道,以解决播放问题。 diff --git a/fastlane/metadata/android/zh-Hans/full_description.txt b/fastlane/metadata/android/zh-Hans/full_description.txt index 5382a813b..c168ee934 100644 --- a/fastlane/metadata/android/zh-Hans/full_description.txt +++ b/fastlane/metadata/android/zh-Hans/full_description.txt @@ -1 +1 @@ -Newpipe不使用任何Google框架库组件,或YouTube API。Newpipe仅仅通过解析YouTube网页版来获取所需信息。因此该应用可工作在无GMS服务的设备上。此外,你也不需要任何YouTube账号,Newpipe是自由开源软件(FLOSS)。 +NewPipe 不使用任何 Google 框架库组件,或 YouTube API。NewPipe 仅仅通过解析 YouTube 网页版来获取所需信息。因此该应用可工作在无 Google 服务的设备上。此外,你也不需要 YouTube 账号,NewPipe是自由开源软件(FLOSS)。 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/981.txt b/fastlane/metadata/android/zh-Hant/changelogs/981.txt new file mode 100644 index 000000000..cf0bd8588 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/981.txt @@ -0,0 +1,2 @@ +移除了對MediaParser的支持,以解決在Android 11+上緩衝後恢復播放失敗的問題。 +在Philips QM16XE上禁用了媒體隧道,以解決播放問題。 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d8da6971..3bb947249 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.3.1-all.zip -distributionSha256Sum=b75392c5625a88bccd58a574552a5a323edca82dab5942d2d41097f809c6bcce +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip +distributionSha256Sum=c9490e938b221daf0094982288e4038deed954a3f12fb54cbf270ddf4e37d879 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists