diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d5fdc97e0a7..088707b6ee2 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,3 +1,5 @@ +### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! + NewPipe contribution guidelines =============================== diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/questions.yml similarity index 81% rename from .github/ISSUE_TEMPLATE/question.yml rename to .github/DISCUSSION_TEMPLATE/questions.yml index 134f171f767..befb6280e74 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/DISCUSSION_TEMPLATE/questions.yml @@ -1,11 +1,11 @@ name: Question description: Ask about anything NewPipe-related -labels: [question, needs triage] +labels: [question] body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this issue! :hugs: + Thanks for taking the time to fill out this form! :hugs: Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe). @@ -14,7 +14,7 @@ body: attributes: label: "Checklist" options: - - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." + - label: "I made sure that there are *no existing issues or discussions* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my question isn't listed." required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b0fdb56db70..4721637bf6e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ blank_issues_enabled: false contact_links: + - name: ❓ Question + url: https://github.com/TeamNewPipe/NewPipe/discussions/new?category=questions + about: Ask about anything NewPipe-related - name: 💬 IRC url: https://web.libera.chat/#newpipe about: Chat with us via IRC for quick Q/A diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index abc1665eb8c..407c00a39b7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -28,7 +28,7 @@ #### APK testing -The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR. +The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR. You can find more info and a video demonstration [on this wiki page](https://github.com/TeamNewPipe/NewPipe/wiki/Download-APK-for-PR). #### Due diligence - [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d12c5a7cc5..03b04b7c4d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,12 +42,14 @@ jobs: - name: create and checkout branch # push events already checked out the branch if: github.event_name == 'pull_request' - run: git checkout -B ${{ github.head_ref }} + env: + BRANCH: ${{ github.head_ref }} + run: git checkout -B "$BRANCH" - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: "temurin" cache: 'gradle' @@ -66,8 +68,13 @@ jobs: timeout-minutes: 20 strategy: matrix: - # api-level 19 is min sdk, but throws errors related to desugaring - api-level: [ 21, 29 ] + include: + - api-level: 21 + target: default + arch: x86 + - api-level: 33 + target: google_apis # emulator API 33 only exists with Google APIs + arch: x86_64 permissions: contents: read @@ -75,10 +82,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: "temurin" cache: 'gradle' @@ -86,8 +93,8 @@ jobs: uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} - # workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160 - emulator-build: 7425822 + target: ${{ matrix.target }} + arch: ${{ matrix.arch }} script: ./gradlew connectedCheck --stacktrace - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553 @@ -108,10 +115,10 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 # Sonar requires JDK 11 + java-version: 17 distribution: "temurin" cache: 'gradle' diff --git a/.github/workflows/image-minimizer.js b/.github/workflows/image-minimizer.js index df1a30f9b14..d3532ad83d2 100644 --- a/.github/workflows/image-minimizer.js +++ b/.github/workflows/image-minimizer.js @@ -17,6 +17,8 @@ module.exports = async ({github, context}) => { initialBody = context.payload.comment.body; } else if (context.eventName == 'issues') { initialBody = context.payload.issue.body; + } else if (context.eventName == 'pull_request') { + initialBody = context.payload.pull_request.body; } else { console.log('Aborting: No body found'); return; @@ -30,10 +32,12 @@ module.exports = async ({github, context}) => { } // Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com//.) - const REGEX_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; + const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; + const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm; // Check if we found something - let foundSimpleImages = REGEX_IMAGE_LOOKUP.test(initialBody); + let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody) + || REGEX_ASSETS_IMAGE_LOCKUP.test(initialBody); if (!foundSimpleImages) { console.log('Found no simple images to process'); return; @@ -47,53 +51,8 @@ module.exports = async ({github, context}) => { var wasMatchModified = false; // Try to find and replace the images with minimized ones - let newBody = await replaceAsync(initialBody, REGEX_IMAGE_LOOKUP, async (match, g1, g2) => { - console.log(`Found match '${match}'`); - - if (g1.endsWith(IGNORE_ALT_NAME_END)) { - console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`); - return match; - } - - let probeAspectRatio = 0; - let shouldModify = false; - try { - console.log(`Probing ${g2}`); - let probeResult = await probe(g2); - if (probeResult == null) { - throw 'No probeResult'; - } - if (probeResult.hUnits != 'px') { - throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`; - } - if (probeResult.height <= 0) { - throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`; - } - if (probeResult.wUnits != 'px') { - throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`; - } - if (probeResult.width <= 0) { - throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`; - } - console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`); - - probeAspectRatio = probeResult.width / probeResult.height; - shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO; - } catch(e) { - console.log('Probing failed:', e); - // Immediately abort - return match; - } - - if (shouldModify) { - wasMatchModified = true; - console.log(`Modifying match '${match}'`); - return `${g1}`; - } - - console.log(`Match '${match}' is ok/will not be modified`); - return match; - }); + let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync); + newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOCKUP, minimizeAsync); if (!wasMatchModified) { console.log('Nothing was modified. Skipping update'); @@ -117,6 +76,14 @@ module.exports = async ({github, context}) => { repo: context.repo.repo, body: newBody }); + } else if (context.eventName == 'pull_request') { + console.log('Updating pull request', context.payload.pull_request.number); + await github.rest.pulls.update({ + pull_number: context.payload.pull_request.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: newBody + }); } // Asnyc replace function from https://stackoverflow.com/a/48032528 @@ -129,4 +96,52 @@ module.exports = async ({github, context}) => { const data = await Promise.all(promises); return str.replace(regex, () => data.shift()); } + + async function minimizeAsync(match, g1, g2) { + console.log(`Found match '${match}'`); + + if (g1.endsWith(IGNORE_ALT_NAME_END)) { + console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`); + return match; + } + + let probeAspectRatio = 0; + let shouldModify = false; + try { + console.log(`Probing ${g2}`); + let probeResult = await probe(g2); + if (probeResult == null) { + throw 'No probeResult'; + } + if (probeResult.hUnits != 'px') { + throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`; + } + if (probeResult.height <= 0) { + throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`; + } + if (probeResult.wUnits != 'px') { + throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`; + } + if (probeResult.width <= 0) { + throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`; + } + console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`); + + probeAspectRatio = probeResult.width / probeResult.height; + shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO; + } catch(e) { + console.log('Probing failed:', e); + // Immediately abort + return match; + } + + if (shouldModify) { + wasMatchModified = true; + console.log(`Modifying match '${match}'`); + return `${g1}`; + } + + console.log(`Match '${match}' is ok/will not be modified`); + return match; + } } diff --git a/.github/workflows/image-minimizer.yml b/.github/workflows/image-minimizer.yml index b8bf9e1d296..56c6eb37f26 100644 --- a/.github/workflows/image-minimizer.yml +++ b/.github/workflows/image-minimizer.yml @@ -5,6 +5,8 @@ on: types: [created, edited] issues: types: [opened, edited] + pull_request: + types: [opened, edited] permissions: issues: write diff --git a/app/build.gradle b/app/build.gradle index 1c7a57f8b56..64800e2eec9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ plugins { id "kotlin-kapt" id "kotlin-parcelize" id "checkstyle" - id "org.sonarqube" version "3.5.0.2730" + id "org.sonarqube" version "4.0.0.2929" } android { @@ -20,8 +20,8 @@ android { resValue "string", "app_name", "NewPipe SponsorBlock" minSdk 21 targetSdk 33 - versionCode 993 - versionName "0.25.1" + versionCode 994 + versionName "0.25.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -80,13 +80,13 @@ android { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 encoding 'utf-8' } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11 + jvmTarget = JavaVersion.VERSION_17 } sourceSets { @@ -96,25 +96,32 @@ android { buildFeatures { viewBinding true } + + packagingOptions { + resources { + // remove two files which belong to jsoup + // no idea how they ended up in the META-INF dir... + excludes += ['META-INF/README.md', 'META-INF/CHANGES'] + } + } } ext { - checkstyleVersion = '10.3.1' + checkstyleVersion = '10.12.1' androidxLifecycleVersion = '2.5.1' - androidxRoomVersion = '2.4.3' + androidxRoomVersion = '2.5.2' androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.5' + exoPlayerVersion = '2.18.7' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' - leakCanaryVersion = '2.9.1' + leakCanaryVersion = '2.12' stethoVersion = '1.6.0' mockitoVersion = '4.0.0' - assertJVersion = '3.23.1' } configurations { @@ -156,6 +163,7 @@ task runKtlint(type: JavaExec) { getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } task formatKtlint(type: JavaExec) { @@ -164,6 +172,7 @@ task formatKtlint(type: JavaExec) { getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "-F", "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } afterEvaluate { @@ -183,7 +192,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle @@ -191,7 +200,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.22.6' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.22.7' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ @@ -205,7 +214,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.documentfile:documentfile:1.0.1' implementation 'androidx.fragment:fragment-ktx:1.4.1' implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}" @@ -231,10 +240,13 @@ dependencies { kapt "frankiesardo:icepick-processor:${icepickVersion}" // HTML parser - implementation "org.jsoup:jsoup:1.15.3" + implementation "org.jsoup:jsoup:1.16.1" // HTTP client - implementation "com.squareup.okhttp3:okhttp:4.10.0" + implementation "com.squareup.okhttp3:okhttp:4.11.0" + // okhttp3:4.11.0 introduces a vulnerability from com.squareup.okio:okio@3.3.0, + // remove com.squareup.okio:okio when updating okhttp + implementation "com.squareup.okio:okio:3.4.0" // Media player implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}" @@ -263,13 +275,13 @@ dependencies { implementation "io.noties.markwon:linkify:${markwonVersion}" // Crash reporting - implementation "ch.acra:acra-core:5.9.7" + implementation "ch.acra:acra-core:5.10.1" // Properly restarting implementation 'com.jakewharton:process-phoenix:2.1.2' // Reactive extensions for Java VM - implementation "io.reactivex.rxjava3:rxjava:3.1.5" + implementation "io.reactivex.rxjava3:rxjava:3.1.6" implementation "io.reactivex.rxjava3:rxandroid:3.0.2" // RxJava binding APIs for Android UI widgets implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" @@ -279,9 +291,9 @@ dependencies { /** Debugging **/ // Memory leak detection - implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" - implementation "com.squareup.leakcanary:plumber-android:${leakCanaryVersion}" - debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}" + debugImplementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" + debugImplementation "com.squareup.leakcanary:plumber-android:${leakCanaryVersion}" + debugImplementation "com.squareup.leakcanary:leakcanary-android-core:${leakCanaryVersion}" // Debug bridge for Android debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" @@ -291,10 +303,10 @@ dependencies { testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "org.mockito:mockito-inline:${mockitoVersion}" - androidTestImplementation "androidx.test.ext:junit:1.1.3" - androidTestImplementation "androidx.test:runner:1.4.0" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test:runner:1.5.2" androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" - androidTestImplementation "org.assertj:assertj-core:${assertJVersion}" + androidTestImplementation "org.assertj:assertj-core:3.23.1" } static String getGitWorkingBranch() { @@ -313,6 +325,7 @@ static String getGitWorkingBranch() { } } +// fix reproducible builds project.afterEvaluate { tasks.compileReleaseArtProfile.doLast { outputs.files.each { file -> diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5e10d3916ab..d21f33e1f11 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,32 +1,18 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /home/the-scrabi/bin/Android/Sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} +# https://developer.android.com/build/shrink-code +## Helps debug release versions -dontobfuscate --keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } +## Rules for NewPipeExtractor +-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } -keep class org.mozilla.javascript.** { *; } - -keep class org.mozilla.classfile.ClassFileWriter --keep class com.google.android.exoplayer2.** { *; } - -dontwarn org.mozilla.javascript.tools.** -# Rules for icepick. Copy paste from https://github.com/frankiesardo/icepick +## Rules for ExoPlayer +-keep class com.google.android.exoplayer2.** { *; } + +## Rules for Icepick. Copy pasted from https://github.com/frankiesardo/icepick -dontwarn icepick.** -keep class icepick.** { *; } -keep class **$$Icepick { *; } @@ -35,11 +21,11 @@ } -keepnames class * { @icepick.State *;} -## Rules for OkHttp. Copy paste from https://github.com/square/okhttp +## Rules for OkHttp. Copy pasted from https://github.com/square/okhttp -dontwarn okhttp3.** -dontwarn okio.** -## +## See https://github.com/TeamNewPipe/NewPipe/pull/1441 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; !static !transient ; @@ -47,5 +33,5 @@ private void readObject(java.io.ObjectInputStream); } -# for some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) +## For some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) -keep class org.schabi.newpipe.settings.notifications.** { *; } diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 5e9fc6d9e31..88e7372051b 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -4,7 +4,6 @@ import android.content.ContentValues import android.database.sqlite.SQLiteDatabase import androidx.room.Room import androidx.room.testing.MigrationTestHelper -import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry @@ -33,8 +32,7 @@ class DatabaseMigrationTest { @get:Rule val testHelper = MigrationTestHelper( InstrumentationRegistry.getInstrumentation(), - AppDatabase::class.java.canonicalName, - FrameworkSQLiteOpenHelperFactory() + AppDatabase::class.java ) @Test diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java b/app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java new file mode 100644 index 00000000000..e71083d2cc6 --- /dev/null +++ b/app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java @@ -0,0 +1,119 @@ +package org.schabi.newpipe.local.subscription; + +import static org.junit.Assert.assertEquals; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.schabi.newpipe.database.AppDatabase; +import org.schabi.newpipe.database.feed.model.FeedGroupEntity; +import org.schabi.newpipe.database.stream.model.StreamEntity; +import org.schabi.newpipe.database.subscription.SubscriptionEntity; +import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.localization.DateWrapper; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamType; +import org.schabi.newpipe.testUtil.TestDatabase; +import org.schabi.newpipe.testUtil.TrampolineSchedulerRule; + +import java.io.IOException; +import java.time.OffsetDateTime; +import java.util.Comparator; +import java.util.List; + +public class SubscriptionManagerTest { + private AppDatabase database; + private SubscriptionManager manager; + + @Rule + public TrampolineSchedulerRule trampolineScheduler = new TrampolineSchedulerRule(); + + + private SubscriptionEntity getAssertOneSubscriptionEntity() { + final List entities = manager + .getSubscriptions(FeedGroupEntity.GROUP_ALL_ID, "", false) + .blockingFirst(); + assertEquals(1, entities.size()); + return entities.get(0); + } + + + @Before + public void setup() { + database = TestDatabase.Companion.createReplacingNewPipeDatabase(); + manager = new SubscriptionManager(ApplicationProvider.getApplicationContext()); + } + + @After + public void cleanUp() { + database.close(); + } + + @Test + public void testInsert() throws ExtractionException, IOException { + final ChannelInfo info = ChannelInfo.getInfo("https://www.youtube.com/c/3blue1brown"); + final SubscriptionEntity subscription = SubscriptionEntity.from(info); + + manager.insertSubscription(subscription, info); + final SubscriptionEntity readSubscription = getAssertOneSubscriptionEntity(); + + // the uid has changed, since the uid is chosen upon inserting, but the rest should match + assertEquals(subscription.getServiceId(), readSubscription.getServiceId()); + assertEquals(subscription.getUrl(), readSubscription.getUrl()); + assertEquals(subscription.getName(), readSubscription.getName()); + assertEquals(subscription.getAvatarUrl(), readSubscription.getAvatarUrl()); + assertEquals(subscription.getSubscriberCount(), readSubscription.getSubscriberCount()); + assertEquals(subscription.getDescription(), readSubscription.getDescription()); + } + + @Test + public void testUpdateNotificationMode() throws ExtractionException, IOException { + final ChannelInfo info = ChannelInfo.getInfo("https://www.youtube.com/c/veritasium"); + final SubscriptionEntity subscription = SubscriptionEntity.from(info); + subscription.setNotificationMode(0); + + manager.insertSubscription(subscription, info); + manager.updateNotificationMode(subscription.getServiceId(), subscription.getUrl(), 1) + .blockingAwait(); + final SubscriptionEntity anotherSubscription = getAssertOneSubscriptionEntity(); + + assertEquals(0, subscription.getNotificationMode()); + assertEquals(subscription.getUrl(), anotherSubscription.getUrl()); + assertEquals(1, anotherSubscription.getNotificationMode()); + } + + @Test + public void testRememberRecentStreams() throws ExtractionException, IOException { + final ChannelInfo info = ChannelInfo.getInfo("https://www.youtube.com/c/Polyphia"); + final List relatedItems = List.of( + new StreamInfoItem(0, "a", "b", StreamType.VIDEO_STREAM), + new StreamInfoItem(1, "c", "d", StreamType.AUDIO_STREAM), + new StreamInfoItem(2, "e", "f", StreamType.AUDIO_LIVE_STREAM), + new StreamInfoItem(3, "g", "h", StreamType.LIVE_STREAM)); + relatedItems.forEach(item -> { + // these two fields must be non-null for the insert to succeed + item.setUploaderUrl(info.getUrl()); + item.setUploaderName(info.getName()); + // the upload date must not be too much in the past for the item to actually be inserted + item.setUploadDate(new DateWrapper(OffsetDateTime.now())); + }); + info.setRelatedItems(relatedItems); + final SubscriptionEntity subscription = SubscriptionEntity.from(info); + + manager.insertSubscription(subscription, info); + final List streams = database.streamDAO().getAll().blockingFirst(); + + assertEquals(4, streams.size()); + streams.sort(Comparator.comparing(StreamEntity::getServiceId)); + for (int i = 0; i < 4; i++) { + assertEquals(relatedItems.get(0).getServiceId(), streams.get(0).getServiceId()); + assertEquals(relatedItems.get(0).getUrl(), streams.get(0).getUrl()); + assertEquals(relatedItems.get(0).getName(), streams.get(0).getTitle()); + assertEquals(relatedItems.get(0).getStreamType(), streams.get(0).getStreamType()); + } + } +} diff --git a/app/src/debug/java/org/schabi/newpipe/DebugApp.kt b/app/src/debug/java/org/schabi/newpipe/DebugApp.kt index 600851c8113..70b9ec2807b 100644 --- a/app/src/debug/java/org/schabi/newpipe/DebugApp.kt +++ b/app/src/debug/java/org/schabi/newpipe/DebugApp.kt @@ -3,7 +3,6 @@ package org.schabi.newpipe import androidx.preference.PreferenceManager import com.facebook.stetho.Stetho import com.facebook.stetho.okhttp3.StethoInterceptor -import leakcanary.AppWatcher import leakcanary.LeakCanary import okhttp3.OkHttpClient import org.schabi.newpipe.extractor.downloader.Downloader @@ -13,8 +12,6 @@ class DebugApp : App() { super.onCreate() initStetho() - // Give each object 10 seconds to be GC'ed, before LeakCanary gets nosy on it - AppWatcher.config = AppWatcher.config.copy(watchDurationMillis = 10000) LeakCanary.config = LeakCanary.config.copy( dumpHeap = PreferenceManager .getDefaultSharedPreferences(this).getBoolean( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 68f7515acf1..0a74281e4b0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -354,15 +354,16 @@ + - + + + - - - + diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java index 16ddb83766e..19a99009bd8 100644 --- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java @@ -12,7 +12,6 @@ import icepick.Icepick; import icepick.State; -import leakcanary.AppWatcher; public abstract class BaseFragment extends Fragment { protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()); @@ -77,13 +76,6 @@ public void onSaveInstanceState(@NonNull final Bundle outState) { protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) { } - @Override - public void onDestroy() { - super.onDestroy(); - - AppWatcher.INSTANCE.getObjectWatcher().watch(this); - } - /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index 03a7d295dc9..53ac85fac1a 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -6,6 +6,7 @@ import android.util.Log import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.net.toUri @@ -19,7 +20,6 @@ import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.exceptions.ReCaptchaException -import org.schabi.newpipe.util.PendingIntentCompat import org.schabi.newpipe.util.ReleaseVersionUtil.coerceUpdateCheckExpiry import org.schabi.newpipe.util.ReleaseVersionUtil.isLastUpdateCheckExpired import org.schabi.newpipe.util.ReleaseVersionUtil.isReleaseApk @@ -62,7 +62,7 @@ class NewVersionWorker( val intent = Intent(Intent.ACTION_VIEW, apkLocationUrl?.toUri()) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val pendingIntent = PendingIntentCompat.getActivity( - applicationContext, 0, intent, 0 + applicationContext, 0, intent, 0, false ) val channelId = applicationContext.getString(R.string.app_update_notification_channel_id) val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt index 40f7d203bd4..b114a734c5c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt @@ -3,7 +3,6 @@ package org.schabi.newpipe.database.feed.model import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey -import androidx.room.ForeignKey.CASCADE import androidx.room.Index import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.FEED_GROUP_SUBSCRIPTION_TABLE import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.GROUP_ID @@ -19,14 +18,14 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity entity = FeedGroupEntity::class, parentColumns = [FeedGroupEntity.ID], childColumns = [GROUP_ID], - onDelete = CASCADE, onUpdate = CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true ), ForeignKey( entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = CASCADE, onUpdate = CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true ) ] ) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index e38ac7d39ab..a8484c491a5 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -70,6 +70,8 @@ import org.schabi.newpipe.util.SponsorBlockUtils; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; +import org.schabi.newpipe.util.AudioTrackAdapter; +import org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.VideoSegment; @@ -101,12 +103,14 @@ public class DownloadDialog extends DialogFragment @State StreamInfo currentInfo; @State - StreamSizeWrapper wrappedAudioStreams; - @State StreamSizeWrapper wrappedVideoStreams; @State StreamSizeWrapper wrappedSubtitleStreams; @State + AudioTracksWrapper wrappedAudioTracks; + @State + int selectedAudioTrackIndex; + @State int selectedVideoIndex; // set in the constructor @State int selectedAudioIndex = 0; // default to the first item @@ -123,6 +127,7 @@ public class DownloadDialog extends DialogFragment private Context context; private boolean askForSavePath; + private AudioTrackAdapter audioTrackAdapter; private StreamItemAdapter audioStreamsAdapter; private StreamItemAdapter videoStreamsAdapter; private StreamItemAdapter subtitleStreamsAdapter; @@ -171,18 +176,26 @@ public DownloadDialog() { public DownloadDialog(@NonNull final Context context, @NonNull final StreamInfo info) { this.currentInfo = info; + final List audioStreams = + getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP); + final List> groupedAudioStreams = + ListHelper.getGroupedAudioStreams(context, audioStreams); + this.wrappedAudioTracks = new AudioTracksWrapper(groupedAudioStreams, context); + this.selectedAudioTrackIndex = + ListHelper.getDefaultAudioTrackGroup(context, groupedAudioStreams); + // TODO: Adapt this code when the downloader support other types of stream deliveries final List videoStreams = ListHelper.getSortedStreamVideosList( context, getStreamsOfSpecifiedDelivery(info.getVideoStreams(), PROGRESSIVE_HTTP), getStreamsOfSpecifiedDelivery(info.getVideoOnlyStreams(), PROGRESSIVE_HTTP), false, - false + // If there are multiple languages available, prefer streams without audio + // to allow language selection + wrappedAudioTracks.size() > 1 ); this.wrappedVideoStreams = new StreamSizeWrapper<>(videoStreams, context); - this.wrappedAudioStreams = new StreamSizeWrapper<>( - getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP), context); this.wrappedSubtitleStreams = new StreamSizeWrapper<>( getStreamsOfSpecifiedDelivery(info.getSubtitles(), PROGRESSIVE_HTTP), context); @@ -224,33 +237,9 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context)); Icepick.restoreInstanceState(this, savedInstanceState); - final var secondaryStreams = new SparseArrayCompat>(4); - final List videoStreams = wrappedVideoStreams.getStreamsList(); - - for (int i = 0; i < videoStreams.size(); i++) { - if (!videoStreams.get(i).isVideoOnly()) { - continue; - } - final AudioStream audioStream = SecondaryStreamHelper - .getAudioStreamFor(wrappedAudioStreams.getStreamsList(), videoStreams.get(i)); - - if (audioStream != null) { - secondaryStreams.append(i, new SecondaryStreamHelper<>(wrappedAudioStreams, - audioStream)); - } else if (DEBUG) { - final MediaFormat mediaFormat = videoStreams.get(i).getFormat(); - if (mediaFormat != null) { - Log.w(TAG, "No audio stream candidates for video format " - + mediaFormat.name()); - } else { - Log.w(TAG, "No audio stream candidates for unknown video format"); - } - } - } - - this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); - this.audioStreamsAdapter = new StreamItemAdapter<>(wrappedAudioStreams); + this.audioTrackAdapter = new AudioTrackAdapter(wrappedAudioTracks); this.subtitleStreamsAdapter = new StreamItemAdapter<>(wrappedSubtitleStreams); + updateSecondaryStreams(); final Intent intent = new Intent(context, DownloadManagerService.class); context.startService(intent); @@ -277,6 +266,39 @@ public void onServiceDisconnected(final ComponentName name) { }, Context.BIND_AUTO_CREATE); } + /** + * Update the displayed video streams based on the selected audio track. + */ + private void updateSecondaryStreams() { + final StreamSizeWrapper audioStreams = getWrappedAudioStreams(); + final var secondaryStreams = new SparseArrayCompat>(4); + final List videoStreams = wrappedVideoStreams.getStreamsList(); + wrappedVideoStreams.resetSizes(); + + for (int i = 0; i < videoStreams.size(); i++) { + if (!videoStreams.get(i).isVideoOnly()) { + continue; + } + final AudioStream audioStream = SecondaryStreamHelper + .getAudioStreamFor(audioStreams.getStreamsList(), videoStreams.get(i)); + + if (audioStream != null) { + secondaryStreams.append(i, new SecondaryStreamHelper<>(audioStreams, audioStream)); + } else if (DEBUG) { + final MediaFormat mediaFormat = videoStreams.get(i).getFormat(); + if (mediaFormat != null) { + Log.w(TAG, "No audio stream candidates for video format " + + mediaFormat.name()); + } else { + Log.w(TAG, "No audio stream candidates for unknown video format"); + } + } + } + + this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); + this.audioStreamsAdapter = new StreamItemAdapter<>(audioStreams); + } + @Override public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, @@ -297,13 +319,14 @@ public void onViewCreated(@NonNull final View view, dialogBinding.fileName.setText(FilenameUtils.createFilename(getContext(), currentInfo.getName())); - selectedAudioIndex = ListHelper - .getDefaultAudioFormat(getContext(), wrappedAudioStreams.getStreamsList()); + selectedAudioIndex = ListHelper.getDefaultAudioFormat(getContext(), + getWrappedAudioStreams().getStreamsList()); selectedSubtitleIndex = getSubtitleIndexBy(subtitleStreamsAdapter.getAll()); dialogBinding.qualitySpinner.setOnItemSelectedListener(this); - + dialogBinding.audioStreamSpinner.setOnItemSelectedListener(this); + dialogBinding.audioTrackSpinner.setOnItemSelectedListener(this); dialogBinding.videoAudioGroup.setOnCheckedChangeListener(this); showLoading(); @@ -397,7 +420,7 @@ private void fetchStreamsSize() { new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG, "Downloading video stream size", currentInfo.getServiceId())))); - disposables.add(StreamSizeWrapper.fetchSizeForWrapper(wrappedAudioStreams) + disposables.add(StreamSizeWrapper.fetchSizeForWrapper(getWrappedAudioStreams()) .subscribe(result -> { if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button) { @@ -419,14 +442,28 @@ private void fetchStreamsSize() { currentInfo.getServiceId())))); } + private void setupAudioTrackSpinner() { + if (getContext() == null) { + return; + } + + dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); + dialogBinding.audioTrackSpinner.setSelection(selectedAudioTrackIndex); + } + private void setupAudioSpinner() { if (getContext() == null) { return; } - dialogBinding.qualitySpinner.setAdapter(audioStreamsAdapter); - dialogBinding.qualitySpinner.setSelection(selectedAudioIndex); + dialogBinding.qualitySpinner.setVisibility(View.GONE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); + dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); + dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); + dialogBinding.audioTrackSpinner.setVisibility( + wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE); } private void setupVideoSpinner() { @@ -436,7 +473,19 @@ private void setupVideoSpinner() { dialogBinding.qualitySpinner.setAdapter(videoStreamsAdapter); dialogBinding.qualitySpinner.setSelection(selectedVideoIndex); + dialogBinding.qualitySpinner.setVisibility(View.VISIBLE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.GONE); + onVideoStreamSelected(); + } + + private void onVideoStreamSelected() { + final boolean isVideoOnly = videoStreamsAdapter.getItem(selectedVideoIndex).isVideoOnly(); + + dialogBinding.audioTrackSpinner.setVisibility( + isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility( + !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); } private void setupSubtitleSpinner() { @@ -446,7 +495,11 @@ private void setupSubtitleSpinner() { dialogBinding.qualitySpinner.setAdapter(subtitleStreamsAdapter); dialogBinding.qualitySpinner.setSelection(selectedSubtitleIndex); + dialogBinding.qualitySpinner.setVisibility(View.VISIBLE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.GONE); + dialogBinding.audioTrackSpinner.setVisibility(View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE); } @@ -564,18 +617,31 @@ public void onItemSelected(final AdapterView parent, + "parent = [" + parent + "], view = [" + view + "], " + "position = [" + position + "], id = [" + id + "]"); } - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.audio_button: - selectedAudioIndex = position; - break; - case R.id.video_button: - selectedVideoIndex = position; + + switch (parent.getId()) { + case R.id.quality_spinner: + switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { + case R.id.video_button: + selectedVideoIndex = position; + onVideoStreamSelected(); + break; + case R.id.subtitle_button: + selectedSubtitleIndex = position; + break; + } + onItemSelectedSetFileName(); break; - case R.id.subtitle_button: - selectedSubtitleIndex = position; + case R.id.audio_track_spinner: + final boolean trackChanged = selectedAudioTrackIndex != position; + selectedAudioTrackIndex = position; + if (trackChanged) { + updateSecondaryStreams(); + fetchStreamsSize(); + } break; + case R.id.audio_stream_spinner: + selectedAudioIndex = position; } - onItemSelectedSetFileName(); } private void onItemSelectedSetFileName() { @@ -621,6 +687,7 @@ public void onNothingSelected(final AdapterView parent) { protected void setupDownloadOptions() { setRadioButtonsState(false); + setupAudioTrackSpinner(); final boolean isVideoStreamsAvailable = videoStreamsAdapter.getCount() > 0; final boolean isAudioStreamsAvailable = audioStreamsAdapter.getCount() > 0; @@ -671,6 +738,13 @@ private void setRadioButtonsState(final boolean enabled) { dialogBinding.subtitleButton.setEnabled(enabled); } + private StreamSizeWrapper getWrappedAudioStreams() { + if (selectedAudioTrackIndex < 0 || selectedAudioTrackIndex > wrappedAudioTracks.size()) { + return StreamSizeWrapper.empty(); + } + return wrappedAudioTracks.getTracksList().get(selectedAudioTrackIndex); + } + private int getSubtitleIndexBy(@NonNull final List streams) { final Localization preferredLocalization = NewPipe.getPreferredLocalization(); @@ -711,7 +785,6 @@ private void showFailedDialog(@StringRes final int msg) { .setTitle(R.string.general_error) .setMessage(msg) .setNegativeButton(getString(R.string.ok), null) - .create() .show(); } @@ -924,7 +997,7 @@ private void checkSelectedDownload(final StoredDirectoryHelper mainStorage, break; } - askDialog.create().show(); + askDialog.show(); return; } @@ -968,7 +1041,7 @@ private void checkSelectedDownload(final StoredDirectoryHelper mainStorage, } }); - askDialog.create().show(); + askDialog.show(); } private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { @@ -1027,7 +1100,6 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { psName = Postprocessing.ALGORITHM_WEBM_MUXER; } - psArgs = null; final long videoSize = wrappedVideoStreams.getSizeInBytes( (VideoStream) selectedStream); diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java index 11ec55548c1..8e02179ce65 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java @@ -176,9 +176,7 @@ private void openPrivacyPolicyDialog(final Context context, final String action) ShareUtils.openUrlInApp(this, ERROR_GITHUB_ISSUE_URL); } }) - .setNegativeButton(R.string.decline, (dialog, which) -> { - // do nothing - }) + .setNegativeButton(R.string.decline, null) .show(); } diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index 9672f1cf4c2..2f21a843aba 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -10,11 +10,11 @@ import android.view.View import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.fragment.app.Fragment import androidx.preference.PreferenceManager import com.google.android.material.snackbar.Snackbar import org.schabi.newpipe.R -import org.schabi.newpipe.util.PendingIntentCompat /** * This class contains all of the methods that should be used to let the user know that an error has @@ -133,7 +133,8 @@ class ErrorUtil { context, 0, getErrorActivityIntent(context, errorInfo), - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT, + false ) ) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index de68269e954..e1b61ea7c14 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,6 +1,16 @@ package org.schabi.newpipe.fragments; +import static android.widget.RelativeLayout.ABOVE; +import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM; +import static android.widget.RelativeLayout.ALIGN_PARENT_TOP; +import static android.widget.RelativeLayout.BELOW; +import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_BOTTOM; +import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_TOP; + import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -9,7 +19,9 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.RelativeLayout; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -17,6 +29,7 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; import androidx.preference.PreferenceManager; +import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; @@ -29,6 +42,8 @@ import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.ThemeHelper; +import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; import java.util.List; @@ -42,8 +57,11 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private boolean hasTabsChanged = false; - private boolean previousYoutubeRestrictedModeEnabled; + private SharedPreferences prefs; + private boolean youtubeRestrictedModeEnabled; private String youtubeRestrictedModeEnabledKey; + private boolean mainTabsPositionBottom; + private String mainTabsPositionKey; /*////////////////////////////////////////////////////////////////////////// // Fragment's LifeCycle @@ -66,10 +84,11 @@ public void onCreate(final Bundle savedInstanceState) { } }); + prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled); - previousYoutubeRestrictedModeEnabled = - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(youtubeRestrictedModeEnabledKey, false); + youtubeRestrictedModeEnabled = prefs.getBoolean(youtubeRestrictedModeEnabledKey, false); + mainTabsPositionKey = getString(R.string.main_tabs_position_key); + mainTabsPositionBottom = prefs.getBoolean(mainTabsPositionKey, false); } @Override @@ -87,25 +106,27 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { binding.mainTabLayout.setupWithViewPager(binding.pager); binding.mainTabLayout.addOnTabSelectedListener(this); - binding.mainTabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor() - .withAlpha(32)); setupTabs(); + updateTabLayoutPosition(); } @Override public void onResume() { super.onResume(); - final boolean youtubeRestrictedModeEnabled = - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(youtubeRestrictedModeEnabledKey, false); - if (previousYoutubeRestrictedModeEnabled != youtubeRestrictedModeEnabled) { - previousYoutubeRestrictedModeEnabled = youtubeRestrictedModeEnabled; - setupTabs(); - } else if (hasTabsChanged) { + final boolean newYoutubeRestrictedModeEnabled = + prefs.getBoolean(youtubeRestrictedModeEnabledKey, false); + if (youtubeRestrictedModeEnabled != newYoutubeRestrictedModeEnabled || hasTabsChanged) { + youtubeRestrictedModeEnabled = newYoutubeRestrictedModeEnabled; setupTabs(); } + + final boolean newMainTabsPosition = prefs.getBoolean(mainTabsPositionKey, false); + if (mainTabsPositionBottom != newMainTabsPosition) { + mainTabsPositionBottom = newMainTabsPosition; + updateTabLayoutPosition(); + } } @Override @@ -190,6 +211,38 @@ private void updateTitleForTab(final int tabPosition) { setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } + private void updateTabLayoutPosition() { + final ScrollableTabLayout tabLayout = binding.mainTabLayout; + final ViewPager viewPager = binding.pager; + final boolean bottom = mainTabsPositionBottom; + + // change layout params to make the tab layout appear either at the top or at the bottom + final var tabParams = (RelativeLayout.LayoutParams) tabLayout.getLayoutParams(); + final var pagerParams = (RelativeLayout.LayoutParams) viewPager.getLayoutParams(); + + tabParams.removeRule(bottom ? ALIGN_PARENT_TOP : ALIGN_PARENT_BOTTOM); + tabParams.addRule(bottom ? ALIGN_PARENT_BOTTOM : ALIGN_PARENT_TOP); + pagerParams.removeRule(bottom ? BELOW : ABOVE); + pagerParams.addRule(bottom ? ABOVE : BELOW, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity( + bottom ? INDICATOR_GRAVITY_TOP : INDICATOR_GRAVITY_BOTTOM); + + tabLayout.setLayoutParams(tabParams); + viewPager.setLayoutParams(pagerParams); + + // change the background and icon color of the tab layout: + // service-colored at the top, app-background-colored at the bottom + tabLayout.setBackgroundColor(ThemeHelper.resolveColorFromAttr(requireContext(), + bottom ? R.attr.colorSecondary : R.attr.colorPrimary)); + + @ColorInt final int iconColor = bottom + ? ThemeHelper.resolveColorFromAttr(requireContext(), R.attr.colorAccent) + : Color.WHITE; + tabLayout.setTabRippleColor(ColorStateList.valueOf(iconColor).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf(iconColor)); + tabLayout.setSelectedTabIndicatorColor(iconColor); + } + @Override public void onTabSelected(final TabLayout.Tab selectedTab) { if (DEBUG) { 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 4f2695099c4..625c5a6936d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -61,7 +61,6 @@ import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.tabs.TabLayout; -import com.squareup.picasso.Callback; import org.schabi.newpipe.App; import org.schabi.newpipe.R; @@ -163,8 +162,12 @@ public final class VideoDetailFragment private boolean showRelatedItems; private boolean showDescription; private String selectedTabTag; - @AttrRes @NonNull final List tabIcons = new ArrayList<>(); - @StringRes @NonNull final List tabContentDescriptions = new ArrayList<>(); + @AttrRes + @NonNull + final List tabIcons = new ArrayList<>(); + @StringRes + @NonNull + final List tabContentDescriptions = new ArrayList<>(); private boolean tabSettingsChanged = false; private int lastAppBarVerticalOffset = Integer.MAX_VALUE; // prevents useless updates @@ -646,27 +649,6 @@ protected void initListeners() { } } - private void initThumbnailViews(@NonNull final StreamInfo info) { - PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailThumbnailImageView, new Callback() { - @Override - public void onSuccess() { - // nothing to do, the image was loaded correctly into the thumbnail - } - - @Override - public void onError(final Exception e) { - showSnackBarError(new ErrorInfo(e, UserAction.LOAD_IMAGE, - info.getThumbnailUrl(), info)); - } - }); - - PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailSubChannelThumbnailView); - PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailUploaderThumbnailView); - } - /*////////////////////////////////////////////////////////////////////////// // OwnStack //////////////////////////////////////////////////////////////////////////*/ @@ -1041,20 +1023,10 @@ private void openBackgroundPlayer(final boolean append) { player.setRecovery(); } - if (!useExternalAudioPlayer) { - openNormalBackgroundPlayer(append); + if (useExternalAudioPlayer) { + showExternalAudioPlaybackDialog(); } else { - final List audioStreams = getUrlAndNonTorrentStreams( - currentInfo.getAudioStreams()); - final int index = ListHelper.getDefaultAudioFormat(activity, audioStreams); - - if (index == -1) { - Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, - Toast.LENGTH_SHORT).show(); - return; - } - - startOnExternalPlayer(activity, currentInfo, audioStreams.get(index)); + openNormalBackgroundPlayer(append); } } @@ -1107,7 +1079,7 @@ public void openVideoPlayer(final boolean directlyFullscreenIfApplicable) { if (PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(this.getString(R.string.use_external_video_player_key), false)) { - showExternalPlaybackDialog(); + showExternalVideoPlaybackDialog(); } else { replaceQueueIfUserConfirms(this::openMainPlayer); } @@ -1487,12 +1459,9 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailSubChannelThumbnailView.setVisibility(View.GONE); if (!isEmpty(info.getSubChannelName())) { - displayBothUploaderAndSubChannel(info, activity); - } else if (!isEmpty(info.getUploaderName())) { - displayUploaderAsSubChannel(info, activity); + displayBothUploaderAndSubChannel(info); } else { - binding.detailUploaderTextView.setVisibility(View.GONE); - binding.detailUploaderThumbnailView.setVisibility(View.GONE); + displayUploaderAsSubChannel(info); } final Drawable buddyDrawable = @@ -1586,7 +1555,8 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailSecondaryControlPanel.setVisibility(View.GONE); checkUpdateProgressInfo(info); - initThumbnailViews(info); + PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailThumbnailImageView); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); @@ -1623,27 +1593,30 @@ public void handleResult(@NonNull final StreamInfo info) { noVideoStreams ? R.drawable.ic_headset_shadow : R.drawable.ic_play_arrow_shadow); } - private void displayUploaderAsSubChannel(final StreamInfo info, final Context context) { + private void displayUploaderAsSubChannel(final StreamInfo info) { binding.detailSubChannelTextView.setText(info.getUploaderName()); binding.detailSubChannelTextView.setVisibility(View.VISIBLE); binding.detailSubChannelTextView.setSelected(true); if (info.getUploaderSubscriberCount() > -1) { binding.detailUploaderTextView.setText( - Localization.shortSubscriberCount(context, info.getUploaderSubscriberCount())); + Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount())); binding.detailUploaderTextView.setVisibility(View.VISIBLE); } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + binding.detailUploaderThumbnailView.setVisibility(View.GONE); } - private void displayBothUploaderAndSubChannel(final StreamInfo info, final Context context) { + private void displayBothUploaderAndSubChannel(final StreamInfo info) { binding.detailSubChannelTextView.setText(info.getSubChannelName()); binding.detailSubChannelTextView.setVisibility(View.VISIBLE); binding.detailSubChannelTextView.setSelected(true); - binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); - final StringBuilder subText = new StringBuilder(); if (!isEmpty(info.getUploaderName())) { subText.append( @@ -1654,7 +1627,7 @@ private void displayBothUploaderAndSubChannel(final StreamInfo info, final Conte subText.append(Localization.DOT_SEPARATOR); } subText.append( - Localization.shortSubscriberCount(context, info.getUploaderSubscriberCount())); + Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount())); } if (subText.length() > 0) { @@ -1664,6 +1637,13 @@ private void displayBothUploaderAndSubChannel(final StreamInfo info, final Conte } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailUploaderThumbnailView); + binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE); } public void openDownloadDialog() { @@ -2034,7 +2014,10 @@ private void setupBrightness() { restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (!PlayerHelper.isBrightnessGestureEnabled(activity)) { + if (!PlayerHelper.getActionForRightGestureSide(activity) + .equals(getString(R.string.brightness_control_key)) + && !PlayerHelper.getActionForLeftGestureSide(activity) + .equals(getString(R.string.brightness_control_key))) { return; } // Restore already saved brightness level @@ -2127,10 +2110,11 @@ private void showClearingQueueConfirmation(final Runnable onAllow) { .setPositiveButton(R.string.ok, (dialog, which) -> { onAllow.run(); dialog.dismiss(); - }).show(); + }) + .show(); } - private void showExternalPlaybackDialog() { + private void showExternalVideoPlaybackDialog() { if (currentInfo == null) { return; } @@ -2177,6 +2161,43 @@ private void showExternalPlaybackDialog() { builder.show(); } + private void showExternalAudioPlaybackDialog() { + if (currentInfo == null) { + return; + } + + final List audioStreams = getUrlAndNonTorrentStreams( + currentInfo.getAudioStreams()); + final List audioTracks = + ListHelper.getFilteredAudioStreams(activity, audioStreams); + + if (audioTracks.isEmpty()) { + Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, + Toast.LENGTH_SHORT).show(); + } else if (audioTracks.size() == 1) { + startOnExternalPlayer(activity, currentInfo, audioTracks.get(0)); + } else { + final int selectedAudioStream = + ListHelper.getDefaultAudioFormat(activity, audioTracks); + final CharSequence[] trackNames = audioTracks.stream() + .map(audioStream -> Localization.audioTrackName(activity, audioStream)) + .toArray(CharSequence[]::new); + + new AlertDialog.Builder(activity) + .setTitle(R.string.select_audio_track_external_players) + .setNeutralButton(R.string.open_in_browser, (dialog, i) -> + ShareUtils.openUrlInBrowser(requireActivity(), url)) + .setSingleChoiceItems(trackNames, selectedAudioStream, null) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.ok, (dialog, i) -> { + final int index = ((AlertDialog) dialog).getListView() + .getCheckedItemPosition(); + startOnExternalPlayer(activity, currentInfo, audioTracks.get(index)); + }) + .show(); + } + } + /* * Remove unneeded information while waiting for a next task * */ diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 0969dbfcc18..0df84d6c013 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -264,8 +264,6 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { final boolean isThumbnailPermanent = localPlaylistManager .getIsPlaylistThumbnailPermanent(selectedItem.uid); - final AlertDialog.Builder builder = new AlertDialog.Builder(activity); - final ArrayList items = new ArrayList<>(); items.add(rename); items.add(delete); @@ -289,7 +287,9 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { } }; - builder.setItems(items.toArray(new String[0]), action).create().show(); + new AlertDialog.Builder(activity) + .setItems(items.toArray(new String[0]), action) + .show(); } private void showRenameDialog(final PlaylistMetadataEntry selectedItem) { @@ -299,14 +299,13 @@ private void showRenameDialog(final PlaylistMetadataEntry selectedItem) { dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT); dialogBinding.dialogEditText.setText(selectedItem.name); - final AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setView(dialogBinding.getRoot()) + new AlertDialog.Builder(activity) + .setView(dialogBinding.getRoot()) .setPositiveButton(R.string.rename_playlist, (dialog, which) -> changeLocalPlaylistName( selectedItem.uid, dialogBinding.dialogEditText.getText().toString())) .setNegativeButton(R.string.cancel, null) - .create() .show(); } 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 9fe90969f1c..ea9a3f36e31 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 @@ -231,7 +231,6 @@ class FeedFragment : BaseStateFragment() { } } .setPositiveButton(resources.getString(R.string.ok), null) - .create() .show() return true } else if (item.itemId == R.id.menu_item_feed_toggle_played_items) { @@ -254,22 +253,18 @@ class FeedFragment : BaseStateFragment() { viewModel.getShowFutureItemsFromPreferences() ) - val builder = AlertDialog.Builder(context!!) - builder.setTitle(R.string.feed_hide_streams_title) - builder.setMultiChoiceItems(dialogItems, checkedDialogItems) { _, which, isChecked -> - checkedDialogItems[which] = isChecked - } - - builder.setPositiveButton(R.string.ok) { _, _ -> - viewModel.setSaveShowPlayedItems(checkedDialogItems[0]) - - viewModel.setSaveShowPartiallyPlayedItems(checkedDialogItems[1]) - - viewModel.setSaveShowFutureItems(checkedDialogItems[2]) - } - builder.setNegativeButton(R.string.cancel, null) - - builder.create().show() + AlertDialog.Builder(context!!) + .setTitle(R.string.feed_hide_streams_title) + .setMultiChoiceItems(dialogItems, checkedDialogItems) { _, which, isChecked -> + checkedDialogItems[which] = isChecked + } + .setPositiveButton(R.string.ok) { _, _ -> + viewModel.setSaveShowPlayedItems(checkedDialogItems[0]) + viewModel.setSaveShowPartiallyPlayedItems(checkedDialogItems[1]) + viewModel.setSaveShowFutureItems(checkedDialogItems[2]) + } + .setNegativeButton(R.string.cancel, null) + .show() } override fun onDestroyOptionsMenu() { @@ -490,15 +485,13 @@ class FeedFragment : BaseStateFragment() { val builder = AlertDialog.Builder(requireContext()) .setTitle(R.string.feed_load_error) - .setPositiveButton( - R.string.unsubscribe - ) { _, _ -> - SubscriptionManager(requireContext()).deleteSubscription( - subscriptionEntity.serviceId, subscriptionEntity.url - ).subscribe() + .setPositiveButton(R.string.unsubscribe) { _, _ -> + SubscriptionManager(requireContext()) + .deleteSubscription(subscriptionEntity.serviceId, subscriptionEntity.url) + .subscribe() handleItemsErrors(nextItemsErrors) } - .setNegativeButton(R.string.cancel) { _, _ -> } + .setNegativeButton(R.string.cancel, null) var message = getString(R.string.feed_load_error_account_info, subscriptionEntity.name) if (cause is AccountTerminatedException) { @@ -515,7 +508,8 @@ class FeedFragment : BaseStateFragment() { message += "\n" + cause.message } } - builder.setMessage(message).create().show() + builder.setMessage(message) + .show() } private fun updateRelativeTimeViews() { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 61a4936c8c7..5aca3ad26a3 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -1,6 +1,8 @@ package org.schabi.newpipe.local.feed.notifications +import android.app.Notification import android.app.NotificationManager +import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.Bitmap @@ -10,48 +12,43 @@ import android.os.Build import android.provider.Settings import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService import androidx.preference.PreferenceManager import com.squareup.picasso.Picasso import com.squareup.picasso.Target import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedUpdateInfo -import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NavigationHelper -import org.schabi.newpipe.util.PendingIntentCompat import org.schabi.newpipe.util.PicassoHelper /** * Helper for everything related to show notifications about new streams to the user. */ class NotificationHelper(val context: Context) { - - private val manager = context.getSystemService( - Context.NOTIFICATION_SERVICE - ) as NotificationManager - + private val manager = NotificationManagerCompat.from(context) private val iconLoadingTargets = ArrayList() /** - * Show a notification about new streams from a single channel. - * Opening the notification will open the corresponding channel page. + * Show notifications for new streams from a single channel. The individual notifications are + * expandable on Android 7.0 and later. + * + * Opening the summary notification will open the corresponding channel page. Opening the + * individual notifications will open the corresponding video. */ - fun displayNewStreamsNotification(data: FeedUpdateInfo) { - val newStreams: List = data.newStreams + fun displayNewStreamsNotifications(data: FeedUpdateInfo) { + val newStreams = data.newStreams val summary = context.resources.getQuantityString( R.plurals.new_streams, newStreams.size, newStreams.size ) - val builder = NotificationCompat.Builder( + val summaryBuilder = NotificationCompat.Builder( context, context.getString(R.string.streams_notification_channel_id) ) - .setContentTitle(Localization.concatenateStrings(data.name, summary)) - .setContentText( - data.listInfo.relatedItems.joinToString( - context.getString(R.string.enumeration_comma) - ) { x -> x.name } - ) + .setContentTitle(data.name) + .setContentText(summary) .setNumber(newStreams.size) .setBadgeIconType(NotificationCompat.BADGE_ICON_LARGE) .setPriority(NotificationCompat.PRIORITY_DEFAULT) @@ -60,36 +57,49 @@ class NotificationHelper(val context: Context) { .setColorized(true) .setAutoCancel(true) .setCategory(NotificationCompat.CATEGORY_SOCIAL) + .setGroupSummary(true) + .setGroup(data.listInfo.url) + .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) - // Build style + // Build a summary notification for Android versions < 7.0 val style = NotificationCompat.InboxStyle() + .setBigContentTitle(data.name) newStreams.forEach { style.addLine(it.name) } - style.setSummaryText(summary) - style.setBigContentTitle(data.name) - builder.setStyle(style) + summaryBuilder.setStyle(style) - // open the channel page when clicking on the notification - builder.setContentIntent( + // open the channel page when clicking on the summary notification + summaryBuilder.setContentIntent( PendingIntentCompat.getActivity( context, data.pseudoId, NavigationHelper .getChannelIntent(context, data.listInfo.serviceId, data.listInfo.url) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), - 0 + 0, + false ) ) // a Target is like a listener for image loading events val target = object : Target { override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) { - builder.setLargeIcon(bitmap) // set only if there is actually one - manager.notify(data.pseudoId, builder.build()) + // set channel icon only if there is actually one (for Android versions < 7.0) + summaryBuilder.setLargeIcon(bitmap) + + // Show individual stream notifications, set channel icon only if there is actually + // one + showStreamNotifications(newStreams, data.listInfo.serviceId, bitmap) + // Show summary notification + manager.notify(data.pseudoId, summaryBuilder.build()) + iconLoadingTargets.remove(this) // allow it to be garbage-collected } override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) { - manager.notify(data.pseudoId, builder.build()) + // Show individual stream notifications + showStreamNotifications(newStreams, data.listInfo.serviceId, null) + // Show summary notification + manager.notify(data.pseudoId, summaryBuilder.build()) iconLoadingTargets.remove(this) // allow it to be garbage-collected } @@ -105,6 +115,49 @@ class NotificationHelper(val context: Context) { PicassoHelper.loadNotificationIcon(data.avatarUrl).into(target) } + private fun showStreamNotifications( + newStreams: List, + serviceId: Int, + channelIcon: Bitmap? + ) { + for (stream in newStreams) { + val notification = createStreamNotification(stream, serviceId, channelIcon) + manager.notify(stream.url.hashCode(), notification) + } + } + + private fun createStreamNotification( + item: StreamInfoItem, + serviceId: Int, + channelIcon: Bitmap? + ): Notification { + return NotificationCompat.Builder( + context, + context.getString(R.string.streams_notification_channel_id) + ) + .setSmallIcon(R.drawable.ic_newpipe_triangle_white) + .setLargeIcon(channelIcon) + .setContentTitle(item.name) + .setContentText(item.uploaderName) + .setGroup(item.uploaderUrl) + .setColor(ContextCompat.getColor(context, R.color.ic_launcher_background)) + .setColorized(true) + .setAutoCancel(true) + .setCategory(NotificationCompat.CATEGORY_SOCIAL) + .setContentIntent( + // Open the stream link in the player when clicking on the notification. + PendingIntentCompat.getActivity( + context, + item.url.hashCode(), + NavigationHelper.getStreamIntent(context, serviceId, item.url, item.name), + PendingIntent.FLAG_UPDATE_CURRENT, + false + ) + ) + .setSilent(true) // Avoid creating noise for individual stream notifications. + .build() + } + companion object { /** * Check whether notifications are enabled on the device. @@ -123,9 +176,7 @@ class NotificationHelper(val context: Context) { fun areNotificationsEnabledOnDevice(context: Context): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channelId = context.getString(R.string.streams_notification_channel_id) - val manager = context.getSystemService( - Context.NOTIFICATION_SERVICE - ) as NotificationManager + val manager = context.getSystemService()!! val enabled = manager.areNotificationsEnabled() val channel = manager.getNotificationChannel(channelId) val importance = channel?.importance diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt index 6b9580802ec..de640dbbbe1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt @@ -55,7 +55,7 @@ class NotificationWorker( .map { feedUpdateInfoList -> // display notifications for each feedUpdateInfo (i.e. channel) feedUpdateInfoList.forEach { feedUpdateInfo -> - notificationHelper.displayNewStreamsNotification(feedUpdateInfo) + notificationHelper.displayNewStreamsNotifications(feedUpdateInfo) } return@map Result.success() } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index 0850fef8c9a..bde301b9224 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -29,6 +29,7 @@ import android.os.IBinder import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.app.ServiceCompat import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable @@ -42,7 +43,6 @@ import org.schabi.newpipe.extractor.ListInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent -import org.schabi.newpipe.util.PendingIntentCompat import java.util.concurrent.TimeUnit class FeedLoadService : Service() { @@ -95,13 +95,7 @@ class FeedLoadService : Service() { .doOnSubscribe { startForeground(NOTIFICATION_ID, notificationBuilder.build()) } - .subscribe { _, error -> - // There seems to be a bug in the kotlin plugin as it tells you when - // building that this can't be null: - // "Condition 'error != null' is always 'true'" - // However it can indeed be null - // The suppression may be removed in further versions - @Suppress("SENSELESS_COMPARISON") + .subscribe { _, error: Throwable? -> // explicitly mark error as nullable if (error != null) { Log.e(TAG, "Error while storing result", error) handleError(error) @@ -152,8 +146,8 @@ class FeedLoadService : Service() { private lateinit var notificationBuilder: NotificationCompat.Builder private fun createNotification(): NotificationCompat.Builder { - val cancelActionIntent = - PendingIntentCompat.getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0) + val cancelActionIntent = PendingIntentCompat + .getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0, false) return NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) .setOngoing(true) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 08e43df95d0..2a639a69f0d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -5,7 +5,6 @@ import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout; import android.content.Context; -import android.content.DialogInterface; import android.os.Bundle; import android.os.Parcelable; import android.text.InputType; @@ -358,14 +357,13 @@ public boolean onOptionsItemSelected(final MenuItem item) { new AlertDialog.Builder(requireContext()) .setMessage(R.string.remove_watched_popup_warning) .setTitle(R.string.remove_watched_popup_title) - .setPositiveButton(R.string.ok, - (DialogInterface d, int id) -> removeWatchedStreams(false)) + .setPositiveButton(R.string.ok, (d, id) -> + removeWatchedStreams(false)) .setNeutralButton( R.string.remove_watched_popup_yes_and_partially_watched_videos, - (DialogInterface d, int id) -> removeWatchedStreams(true)) + (d, id) -> removeWatchedStreams(true)) .setNegativeButton(R.string.cancel, - (DialogInterface d, int id) -> d.cancel()) - .create() + (d, id) -> d.cancel()) .show(); } } else if (item.getItemId() == R.id.menu_item_remove_duplicates) { @@ -560,15 +558,14 @@ private void createRenameDialog() { dialogBinding.dialogEditText.setSelection(dialogBinding.dialogEditText.getText().length()); dialogBinding.dialogEditText.setText(name); - final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext()) + new AlertDialog.Builder(getContext()) .setTitle(R.string.rename_playlist) .setView(dialogBinding.getRoot()) .setCancelable(true) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.rename, (dialogInterface, i) -> - changePlaylistName(dialogBinding.dialogEditText.getText().toString())); - - dialogBuilder.show(); + changePlaylistName(dialogBinding.dialogEditText.getText().toString())) + .show(); } private void changePlaylistName(final String title) { @@ -634,15 +631,13 @@ private void updateThumbnailUrl() { } private void openRemoveDuplicatesDialog() { - final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); - - builder.setTitle(R.string.remove_duplicates_title) + new AlertDialog.Builder(this.getActivity()) + .setTitle(R.string.remove_duplicates_title) .setMessage(R.string.remove_duplicates_message) - .setPositiveButton(R.string.ok, - (dialog, i) -> removeDuplicatesInPlaylist()) - .setNeutralButton(R.string.cancel, null); - - builder.create().show(); + .setPositiveButton(R.string.ok, (dialog, i) -> + removeDuplicatesInPlaylist()) + .setNeutralButton(R.string.cancel, null) + .show(); } private void removeDuplicatesInPlaylist() { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index bc2f96f7375..da1eba225d5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -352,7 +352,6 @@ class SubscriptionFragment : BaseStateFragment() { AlertDialog.Builder(requireContext()) .setCustomTitle(dialogTitleBinding.root) .setItems(commands, actions) - .create() .show() } diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index d206c1d224a..2cf5c96d064 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -15,6 +15,7 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; @@ -30,11 +31,13 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.helper.PlaybackParameterDialog; +import org.schabi.newpipe.player.mediaitem.MediaItemTag; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueAdapter; import org.schabi.newpipe.player.playqueue.PlayQueueItem; @@ -47,6 +50,9 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.util.List; +import java.util.Optional; + import static org.schabi.newpipe.util.SponsorBlockUtils.markSegments; public final class PlayQueueActivity extends AppCompatActivity @@ -57,6 +63,8 @@ public final class PlayQueueActivity extends AppCompatActivity private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80; + private static final int MENU_ID_AUDIO_TRACK = 71; + private Player player; private boolean serviceBound; @@ -102,6 +110,7 @@ public boolean onCreateOptionsMenu(final Menu m) { this.menu = m; getMenuInflater().inflate(R.menu.menu_play_queue, m); getMenuInflater().inflate(R.menu.menu_play_queue_bg, m); + buildAudioTrackMenu(); onMaybeMuteChanged(); // to avoid null reference if (player != null) { @@ -158,6 +167,12 @@ public boolean onOptionsItemSelected(final MenuItem item) { NavigationHelper.playOnBackgroundPlayer(this, player.getPlayQueue(), true); return true; } + + if (item.getGroupId() == MENU_ID_AUDIO_TRACK) { + onAudioTrackClick(item.getItemId()); + return true; + } + return super.onOptionsItemSelected(item); } @@ -602,4 +617,69 @@ private void onMaybeMuteChanged() { item.setIcon(player.isMuted() ? R.drawable.ic_volume_off : R.drawable.ic_volume_up); } } + + @Override + public void onAudioTrackUpdate() { + buildAudioTrackMenu(); + } + + private void buildAudioTrackMenu() { + if (menu == null) { + return; + } + + final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); + final List availableStreams = + Optional.ofNullable(player.getCurrentMetadata()) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) + .orElse(null); + final Optional selectedAudioStream = player.getSelectedAudioStream(); + + if (availableStreams == null || availableStreams.size() < 2 + || selectedAudioStream.isEmpty()) { + audioTrackSelector.setVisible(false); + } else { + final SubMenu audioTrackMenu = audioTrackSelector.getSubMenu(); + audioTrackMenu.clear(); + + for (int i = 0; i < availableStreams.size(); i++) { + final AudioStream audioStream = availableStreams.get(i); + audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, + Localization.audioTrackName(this, audioStream)); + } + + final AudioStream s = selectedAudioStream.get(); + final String trackName = Localization.audioTrackName(this, s); + audioTrackSelector.setTitle( + getString(R.string.play_queue_audio_track, trackName)); + + final String shortName = s.getAudioLocale() != null + ? s.getAudioLocale().getLanguage() : trackName; + audioTrackSelector.setTitleCondensed( + shortName.substring(0, Math.min(shortName.length(), 2))); + audioTrackSelector.setVisible(true); + } + } + + /** + * Called when an item from the audio track selector is selected. + * + * @param itemId index of the selected item + */ + private void onAudioTrackClick(final int itemId) { + if (player.getCurrentMetadata() == null) { + return; + } + player.getCurrentMetadata().getMaybeAudioTrack().ifPresent(audioTrack -> { + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { + return; + } + + final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); + player.setAudioTrack(newAudioTrack); + }); + } } 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 ecbed197d79..07a80c7bc41 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -70,7 +70,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player.PositionInfo; -import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Tracks; @@ -79,7 +78,6 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; @@ -90,6 +88,7 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -98,6 +97,7 @@ import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.event.PlayerServiceEventListener; import org.schabi.newpipe.player.helper.AudioReactor; +import org.schabi.newpipe.player.helper.CustomRenderersFactory; import org.schabi.newpipe.player.helper.LoadController; import org.schabi.newpipe.player.helper.PlayerDataSource; import org.schabi.newpipe.player.helper.PlayerHelper; @@ -117,7 +117,6 @@ import org.schabi.newpipe.player.ui.PopupPlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.DependentPreferenceHelper; -import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PicassoHelper; @@ -186,13 +185,18 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ // play queue might be null e.g. while player is starting - @Nullable private PlayQueue playQueue; + @Nullable + private PlayQueue playQueue; - @Nullable private MediaSourceManager playQueueManager; + @Nullable + private MediaSourceManager playQueueManager; - @Nullable private PlayQueueItem currentItem; - @Nullable private MediaItemTag currentMetadata; - @Nullable private Bitmap currentThumbnail; + @Nullable + private PlayQueueItem currentItem; + @Nullable + private MediaItemTag currentMetadata; + @Nullable + private Bitmap currentThumbnail; /*////////////////////////////////////////////////////////////////////////// // Player @@ -201,12 +205,17 @@ public final class Player implements PlaybackListener, Listener { private ExoPlayer simpleExoPlayer; private AudioReactor audioReactor; - @NonNull private final DefaultTrackSelector trackSelector; - @NonNull private final LoadController loadController; - @NonNull private final RenderersFactory renderFactory; + @NonNull + private final DefaultTrackSelector trackSelector; + @NonNull + private final LoadController loadController; + @NonNull + private final DefaultRenderersFactory renderFactory; - @NonNull private final VideoPlaybackResolver videoResolver; - @NonNull private final AudioPlaybackResolver audioResolver; + @NonNull + private final VideoPlaybackResolver videoResolver; + @NonNull + private final AudioPlaybackResolver audioResolver; private final PlayerService service; //TODO try to remove and replace everything with context @@ -231,24 +240,32 @@ public final class Player implements PlaybackListener, Listener { private BroadcastReceiver broadcastReceiver; private IntentFilter intentFilter; - @Nullable private PlayerServiceEventListener fragmentListener = null; - @Nullable private PlayerEventListener activityListener = null; + @Nullable + private PlayerServiceEventListener fragmentListener = null; + @Nullable + private PlayerEventListener activityListener = null; - @NonNull private final SerialDisposable progressUpdateDisposable = new SerialDisposable(); - @NonNull private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable(); + @NonNull + private final SerialDisposable progressUpdateDisposable = new SerialDisposable(); + @NonNull + private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable(); // This is the only listener we need for thumbnail loading, since there is always at most only // one thumbnail being loaded at a time. This field is also here to maintain a strong reference, // which would otherwise be garbage collected since Picasso holds weak references to targets. - @NonNull private final Target currentThumbnailTarget; + @NonNull + private final Target currentThumbnailTarget; /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ - @NonNull private final Context context; - @NonNull private final SharedPreferences prefs; - @NonNull private final HistoryRecordManager recordManager; + @NonNull + private final Context context; + @NonNull + private final SharedPreferences prefs; + @NonNull + private final HistoryRecordManager recordManager; /*////////////////////////////////////////////////////////////////////////// // SponsorBlock @@ -274,7 +291,16 @@ public Player(@NonNull final PlayerService service) { final PlayerDataSource dataSource = new PlayerDataSource(context, new DefaultBandwidthMeter.Builder(context).build()); loadController = new LoadController(); - renderFactory = new DefaultRenderersFactory(context); + + renderFactory = prefs.getBoolean( + context.getString( + R.string.always_use_exoplayer_set_output_surface_workaround_key), false) + ? new CustomRenderersFactory(context) : new DefaultRenderersFactory(context); + + renderFactory.setEnableDecoderFallback( + prefs.getBoolean( + context.getString( + R.string.use_exoplayer_decoder_fallback_key), false)); videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); @@ -337,7 +363,7 @@ public void handleIntent(@NonNull final Intent intent) { isAudioOnly = audioPlayerSelected(); if (intent.hasExtra(PLAYBACK_QUALITY)) { - setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY)); + videoResolver.setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY)); } // Resolve enqueue intents @@ -345,7 +371,7 @@ public void handleIntent(@NonNull final Intent intent) { playQueue.append(newQueue.getStreams()); return; - // Resolve enqueue next intents + // Resolve enqueue next intents } else if (intent.getBooleanExtra(ENQUEUE_NEXT, false) && playQueue != null) { final int currentIndex = playQueue.getIndex(); playQueue.append(newQueue.getStreams()); @@ -533,16 +559,11 @@ private void initPlayer(final boolean playOnReady) { // Setup UIs UIs.call(PlayerUi::initPlayer); - // enable media tunneling - if (DEBUG && PreferenceManager.getDefaultSharedPreferences(context) + // Disable media tunneling if requested by the user from ExoPlayer settings + if (!PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.disable_media_tunneling_key), false)) { - Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] " - + "media tunneling disabled in debug preferences"); - } else if (DeviceUtils.shouldSupportMediaTunneling()) { trackSelector.setParameters(trackSelector.buildUponParameters() .setTunnelingEnabled(true)); - } else if (DEBUG) { - Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] does not support media tunneling"); } } //endregion @@ -1009,7 +1030,7 @@ private void triggerProgressUpdate(final boolean isRewind) { private Disposable getProgressUpdateDisposable() { return Observable.interval(PROGRESS_LOOP_INTERVAL_MILLIS, MILLISECONDS, - AndroidSchedulers.mainThread()) + AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> triggerProgressUpdate(), error -> Log.e(TAG, "Progress update failure: ", error)); @@ -1018,7 +1039,6 @@ private Disposable getProgressUpdateDisposable() { //endregion - /*////////////////////////////////////////////////////////////////////////// // Playback states //////////////////////////////////////////////////////////////////////////*/ @@ -1340,6 +1360,9 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player, } final StreamInfo previousInfo = Optional.ofNullable(currentMetadata) .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null); + final MediaItemTag.AudioTrack previousAudioTrack = + Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); currentMetadata = tag; if (!currentMetadata.getErrors().isEmpty()) { @@ -1360,6 +1383,12 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player, if (previousInfo == null || !previousInfo.getUrl().equals(info.getUrl())) { // only update with the new stream info if it has actually changed updateMetadataWith(info); + } else if (previousAudioTrack == null + || tag.getMaybeAudioTrack() + .map(t -> t.getSelectedAudioStreamIndex() + != previousAudioTrack.getSelectedAudioStreamIndex()) + .orElse(false)) { + notifyAudioTrackUpdateToListeners(); } }); }); @@ -1447,6 +1476,7 @@ public void onCues(@NonNull final CueGroup cueGroup) { // Errors //////////////////////////////////////////////////////////////////////////*/ //region Errors + /** * Process exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}. *

There are multiple types of errors:

@@ -1473,8 +1503,9 @@ public void onCues(@NonNull final CueGroup cueGroup) { * For any error above that is not explicitly catchable, the player will * create a notification so users are aware. * + * * @see com.google.android.exoplayer2.Player.Listener#onPlayerError(PlaybackException) - * */ + */ // Any error code not explicitly covered here are either unrelated to NewPipe use case // (e.g. DRM) or not recoverable (e.g. Decoder error). In both cases, the player should // shutdown. @@ -1856,6 +1887,7 @@ private void updateMetadataWith(@NonNull final StreamInfo info) { registerStreamViewed(); notifyMetadataUpdateToListeners(); + notifyAudioTrackUpdateToListeners(); UIs.call(playerUi -> playerUi.onMetadataChanged(info)); } @@ -1984,6 +2016,12 @@ public Optional getSelectedVideoStream() { .map(quality -> quality.getSortedVideoStreams() .get(quality.getSelectedVideoStreamIndex())); } + + public Optional getSelectedAudioStream() { + return Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getSelectedAudioStream); + } //endregion @@ -2115,44 +2153,46 @@ private void notifyProgressUpdateToListeners(final int currentProgress, } } + private void notifyAudioTrackUpdateToListeners() { + if (fragmentListener != null) { + fragmentListener.onAudioTrackUpdate(); + } + if (activityListener != null) { + activityListener.onAudioTrackUpdate(); + } + } + public void useVideoSource(final boolean videoEnabled) { - if (playQueue == null || isAudioOnly == !videoEnabled || audioPlayerSelected()) { + if (playQueue == null || audioPlayerSelected()) { return; } isAudioOnly = !videoEnabled; - // The current metadata may be null sometimes (for e.g. when using an unstable connection - // in livestreams) so we will be not able to execute the block below. - // Reload the play queue manager in this case, which is the behavior when we don't know the - // index of the video renderer or playQueueManagerReloadingNeeded returns true. getCurrentStreamInfo().ifPresentOrElse(info -> { - // In the case we don't know the source type, fallback to the one with video with audio - // or audio-only source. + // In case we don't know the source type, fall back to either video-with-audio, or + // audio-only source type final SourceType sourceType = videoResolver.getStreamSourceType() .orElse(SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY); if (playQueueManagerReloadingNeeded(sourceType, info, getVideoRendererIndex())) { reloadPlayQueueManager(); - } else { - if (StreamTypeUtil.isAudio(info.getStreamType())) { - // Nothing to do more than setting the recovery position - setRecovery(); - return; - } - - final var parametersBuilder = trackSelector.buildUponParameters(); - - // Enable/disable the video track and the ability to select subtitles - parametersBuilder.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoEnabled); - parametersBuilder.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoEnabled); - - trackSelector.setParameters(parametersBuilder); } setRecovery(); + + // Disable or enable video and subtitles renderers depending of the videoEnabled value + trackSelector.setParameters(trackSelector.buildUponParameters() + .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoEnabled) + .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoEnabled)); }, () -> { - // This is executed when the current stream info is not available. + /* + The current metadata may be null sometimes (for e.g. when using an unstable connection + in livestreams) so we will be not able to execute the block below + + Reload the play queue manager in this case, which is the behavior when we don't know the + index of the video renderer or playQueueManagerReloadingNeeded returns true + */ reloadPlayQueueManager(); setRecovery(); }); @@ -2211,7 +2251,7 @@ private boolean playQueueManagerReloadingNeeded(final SourceType sourceType, // because the stream source will be probably the same as the current played if (sourceType == SourceType.VIDEO_WITH_SEPARATED_AUDIO || (sourceType == SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY - && isNullOrEmpty(streamInfo.getAudioStreams()))) { + && isNullOrEmpty(streamInfo.getAudioStreams()))) { // It's not needed to reload the play queue manager only if the content's stream type // is a video stream, a live stream or an ended live stream return !StreamTypeUtil.isVideo(streamType); @@ -2273,7 +2313,18 @@ private boolean isLive() { } public void setPlaybackQuality(@Nullable final String quality) { + saveStreamProgressState(); + setRecovery(); videoResolver.setPlaybackQuality(quality); + reloadPlayQueueManager(); + } + + public void setAudioTrack(@Nullable final String audioTrackId) { + saveStreamProgressState(); + setRecovery(); + videoResolver.setAudioTrack(audioTrackId); + audioResolver.setAudioTrack(audioTrackId); + reloadPlayQueueManager(); } @@ -2394,7 +2445,7 @@ public PlayerUiList UIs() { /** * Get the video renderer index of the current playing stream. - * + *

* This method returns the video renderer index of the current * {@link MappingTrackSelector.MappedTrackInfo} or {@link #RENDERER_UNAVAILABLE} if the current * {@link MappingTrackSelector.MappedTrackInfo} is null or if there is no video renderer index. diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java index d813012056e..ad6c9405dd0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java @@ -31,6 +31,8 @@ import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.util.ThemeHelper; +import java.lang.ref.WeakReference; + /** * One service for all players. @@ -41,7 +43,7 @@ public final class PlayerService extends Service { private Player player; - private final IBinder mBinder = new PlayerService.LocalBinder(); + private final IBinder mBinder = new PlayerService.LocalBinder(this); /*////////////////////////////////////////////////////////////////////////// @@ -134,14 +136,19 @@ public IBinder onBind(final Intent intent) { return mBinder; } - public class LocalBinder extends Binder { + public static class LocalBinder extends Binder { + private final WeakReference playerService; + + LocalBinder(final PlayerService playerService) { + this.playerService = new WeakReference<>(playerService); + } public PlayerService getService() { - return PlayerService.this; + return playerService.get(); } public Player getPlayer() { - return PlayerService.this.player; + return playerService.get().player; } } } diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java index 84bd9d277b3..2cca259c2f3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java @@ -11,5 +11,6 @@ void onPlaybackUpdate(int state, int repeatMode, boolean shuffled, PlaybackParameters parameters); void onProgressUpdate(int currentProgress, int duration, int bufferPercent); void onMetadataUpdate(StreamInfo info, PlayQueue queue); + default void onAudioTrackUpdate() { } void onServiceStopped(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index a6dba0dd597..0d28f2f585b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -193,18 +193,20 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) - if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === DisplayPortion.LEFT_HALF) { - onScrollBrightness(distanceY) - } else /* DisplayPortion.RIGHT_HALF */ { - onScrollVolume(distanceY) + if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { + when (PlayerHelper.getActionForRightGestureSide(player.context)) { + player.context.getString(R.string.volume_control_key) -> + onScrollVolume(distanceY) + player.context.getString(R.string.brightness_control_key) -> + onScrollBrightness(distanceY) + } + } else { + when (PlayerHelper.getActionForLeftGestureSide(player.context)) { + player.context.getString(R.string.volume_control_key) -> + onScrollVolume(distanceY) + player.context.getString(R.string.brightness_control_key) -> + onScrollBrightness(distanceY) } - } else if (isBrightnessGestureEnabled) { - onScrollBrightness(distanceY) - } else if (isVolumeGestureEnabled) { - onScrollVolume(distanceY) } return true diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java b/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java new file mode 100644 index 00000000000..66ac6d50bc1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java @@ -0,0 +1,54 @@ +package org.schabi.newpipe.player.helper; + +import android.content.Context; +import android.os.Handler; + +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter; +import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; +import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; +import com.google.android.exoplayer2.video.VideoRendererEventListener; + +/** + * A {@link MediaCodecVideoRenderer} which always enable the output surface workaround that + * ExoPlayer enables on several devices which are known to implement + * {@link android.media.MediaCodec#setOutputSurface(android.view.Surface) + * MediaCodec.setOutputSurface(Surface)} incorrectly. + * + *

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

+ * + *

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

+ * + *

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

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

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

+ */ +public final class CustomRenderersFactory extends DefaultRenderersFactory { + + public CustomRenderersFactory(final Context context) { + super(context); + } + + @SuppressWarnings("checkstyle:ParameterNumber") + @Override + protected void buildVideoRenderers(final Context context, + @ExtensionRendererMode final int extensionRendererMode, + final MediaCodecSelector mediaCodecSelector, + final boolean enableDecoderFallback, + final Handler eventHandler, + final VideoRendererEventListener eventListener, + final long allowedVideoJoiningTimeMs, + final ArrayList out) { + out.add(new CustomMediaCodecVideoRenderer(context, getCodecAdapterFactory(), + mediaCodecSelector, allowedVideoJoiningTimeMs, enableDecoderFallback, eventHandler, + eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 1bc6f41a1cd..a110a80d676 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -228,14 +228,16 @@ public static boolean isResumeAfterAudioFocusGain(@NonNull final Context context .getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), false); } - public static boolean isVolumeGestureEnabled(@NonNull final Context context) { + public static String getActionForRightGestureSide(@NonNull final Context context) { return getPreferences(context) - .getBoolean(context.getString(R.string.volume_gesture_control_key), true); + .getString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.default_right_gesture_control_value)); } - public static boolean isBrightnessGestureEnabled(@NonNull final Context context) { + public static String getActionForLeftGestureSide(@NonNull final Context context) { return getPreferences(context) - .getBoolean(context.getString(R.string.brightness_gesture_control_key), true); + .getString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.default_left_gesture_control_value)); } public static boolean isStartMainPlayerFullscreenEnabled(@NonNull final Context context) { diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java index f08086287f5..1119fb903f0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java @@ -7,6 +7,7 @@ import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.Player; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -55,6 +56,11 @@ default Optional getMaybeQuality() { return Optional.empty(); } + @NonNull + default Optional getMaybeAudioTrack() { + return Optional.empty(); + } + Optional getMaybeExtras(@NonNull Class type); MediaItemTag withExtras(@NonNull T extra); @@ -128,4 +134,37 @@ public VideoStream getSelectedVideoStream() { ? null : sortedVideoStreams.get(selectedVideoStreamIndex); } } + + final class AudioTrack { + @NonNull + private final List audioStreams; + private final int selectedAudioStreamIndex; + + private AudioTrack(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + this.audioStreams = audioStreams; + this.selectedAudioStreamIndex = selectedAudioStreamIndex; + } + + static AudioTrack of(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + return new AudioTrack(audioStreams, selectedAudioStreamIndex); + } + + @NonNull + public List getAudioStreams() { + return audioStreams; + } + + public int getSelectedAudioStreamIndex() { + return selectedAudioStreamIndex; + } + + @Nullable + public AudioStream getSelectedAudioStream() { + return selectedAudioStreamIndex < 0 + || selectedAudioStreamIndex >= audioStreams.size() + ? null : audioStreams.get(selectedAudioStreamIndex); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java index 4095f2bc888..689f5c72bc6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java @@ -2,6 +2,7 @@ import com.google.android.exoplayer2.MediaItem; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -25,25 +26,41 @@ public final class StreamInfoTag implements MediaItemTag { @Nullable private final MediaItemTag.Quality quality; @Nullable + private final MediaItemTag.AudioTrack audioTrack; + @Nullable private final Object extras; private StreamInfoTag(@NonNull final StreamInfo streamInfo, @Nullable final MediaItemTag.Quality quality, + @Nullable final MediaItemTag.AudioTrack audioTrack, @Nullable final Object extras) { this.streamInfo = streamInfo; this.quality = quality; + this.audioTrack = audioTrack; this.extras = extras; } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, @NonNull final List sortedVideoStreams, - final int selectedVideoStreamIndex) { + final int selectedVideoStreamIndex, + @NonNull final List audioStreams, + final int selectedAudioStreamIndex) { final Quality quality = Quality.of(sortedVideoStreams, selectedVideoStreamIndex); - return new StreamInfoTag(streamInfo, quality, null); + final AudioTrack audioTrack = + AudioTrack.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, quality, audioTrack, null); + } + + public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, + @NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + final AudioTrack audioTrack = + AudioTrack.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, null, audioTrack, null); } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) { - return new StreamInfoTag(streamInfo, null, null); + return new StreamInfoTag(streamInfo, null, null, null); } @Override @@ -103,6 +120,12 @@ public Optional getMaybeQuality() { return Optional.ofNullable(quality); } + @NonNull + @Override + public Optional getMaybeAudioTrack() { + return Optional.ofNullable(audioTrack); + } + @Override public Optional getMaybeExtras(@NonNull final Class type) { return Optional.ofNullable(extras).map(type::cast); @@ -110,6 +133,6 @@ public Optional getMaybeExtras(@NonNull final Class type) { @Override public StreamInfoTag withExtras(@NonNull final Object extra) { - return new StreamInfoTag(streamInfo, quality, extra); + return new StreamInfoTag(streamInfo, quality, audioTrack, extra); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 6e50dda7d74..05c2e3af6dd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -13,6 +13,7 @@ import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; @@ -21,7 +22,6 @@ import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PendingIntentCompat; import java.util.List; import java.util.Objects; @@ -134,7 +134,7 @@ private synchronized NotificationCompat.Builder createNotification() { .setColorized(player.getPrefs().getBoolean( player.getContext().getString(R.string.notification_colorize_key), true)) .setDeleteIntent(PendingIntentCompat.getBroadcast(player.getContext(), - NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT)); + NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT, false)); // set the initial value for the video thumbnail, updatable with updateNotificationThumbnail setLargeIcon(builder); @@ -152,7 +152,7 @@ private synchronized void updateNotification() { // also update content intent, in case the user switched players notificationBuilder.setContentIntent(PendingIntentCompat.getActivity(player.getContext(), - NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT)); + NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT, false)); notificationBuilder.setContentTitle(player.getVideoTitle()); notificationBuilder.setContentText(player.getUploaderName()); notificationBuilder.setTicker(player.getVideoTitle()); @@ -335,7 +335,7 @@ private NotificationCompat.Action getAction(@DrawableRes final int drawable, final String intentAction) { return new NotificationCompat.Action(drawable, player.getContext().getString(title), PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, - new Intent(intentAction), FLAG_UPDATE_CURRENT)); + new Intent(intentAction), FLAG_UPDATE_CURRENT, false)); } private Intent getIntentForNotification() { diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e87c9311497..2d4404b2aba 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.player.resolver; -import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; +import static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams; +import static org.schabi.newpipe.util.ListHelper.getPlayableStreams; import android.content.Context; import android.util.Log; @@ -28,6 +29,8 @@ public class AudioPlaybackResolver implements PlaybackResolver { private final Context context; @NonNull private final PlayerDataSource dataSource; + @Nullable + private String audioTrack; public AudioPlaybackResolver(@NonNull final Context context, @NonNull final PlayerDataSource dataSource) { @@ -35,6 +38,13 @@ public AudioPlaybackResolver(@NonNull final Context context, this.dataSource = dataSource; } + /** + * Get a media source providing audio. If a service has no separate {@link AudioStream}s we + * use a video stream as audio source to support audio background playback. + * + * @param info of the stream + * @return the audio source to use or null if none could be found + */ @Override @Nullable public MediaSource resolve(@NonNull final StreamInfo info) { @@ -43,12 +53,27 @@ public MediaSource resolve(@NonNull final StreamInfo info) { return liveSource; } - final Stream stream = getAudioSource(info); - if (stream == null) { - return null; - } + final List audioStreams = + getFilteredAudioStreams(context, info.getAudioStreams()); + final Stream stream; + final MediaItemTag tag; - final MediaItemTag tag = StreamInfoTag.of(info); + if (!audioStreams.isEmpty()) { + final int audioIndex = + ListHelper.getAudioFormatIndex(context, audioStreams, audioTrack); + stream = getStreamForIndex(audioIndex, audioStreams); + tag = StreamInfoTag.of(info, audioStreams, audioIndex); + } else { + final List videoStreams = + getPlayableStreams(info.getVideoStreams(), info.getServiceId()); + if (!videoStreams.isEmpty()) { + final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); + stream = getStreamForIndex(index, videoStreams); + tag = StreamInfoTag.of(info); + } else { + return null; + } + } try { return PlaybackResolver.buildMediaSource( @@ -59,29 +84,6 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } } - /** - * Get a stream to be played as audio. If a service has no separate {@link AudioStream}s we - * use a video stream as audio source to support audio background playback. - * - * @param info of the stream - * @return the audio source to use or null if none could be found - */ - @Nullable - private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); - if (!audioStreams.isEmpty()) { - final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); - return getStreamForIndex(index, audioStreams); - } else { - final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); - if (!videoStreams.isEmpty()) { - final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); - return getStreamForIndex(index, videoStreams); - } - } - return null; - } - @Nullable Stream getStreamForIndex(final int index, @NonNull final List streams) { if (index >= 0 && index < streams.size()) { @@ -89,4 +91,13 @@ Stream getStreamForIndex(final int index, @NonNull final List } return null; } + + @Nullable + public String getAudioTrack() { + return audioTrack; + } + + public void setAudioTrack(@Nullable final String audioLanguage) { + this.audioTrack = audioLanguage; + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index 9c8cbb8f6f9..e204b8372a7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -156,6 +156,16 @@ static String cacheKeyOf(final StreamInfo info, final AudioStream audioStream) { cacheKey.append(audioStream.getAverageBitrate()); } + if (audioStream.getAudioTrackId() != null) { + cacheKey.append(" "); + cacheKey.append(audioStream.getAudioTrackId()); + } + + if (audioStream.getAudioLocale() != null) { + cacheKey.append(" "); + cacheKey.append(audioStream.getAudioLocale().getISO3Language()); + } + return cacheKey.toString(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index cf7d7355817..670c13934df 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -28,8 +28,9 @@ import java.util.Optional; import static com.google.android.exoplayer2.C.TIME_UNSET; +import static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; -import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; +import static org.schabi.newpipe.util.ListHelper.getPlayableStreams; public class VideoPlaybackResolver implements PlaybackResolver { private static final String TAG = VideoPlaybackResolver.class.getSimpleName(); @@ -44,6 +45,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { @Nullable private String playbackQuality; + @Nullable + private String audioTrack; public enum SourceType { LIVE_STREAM, @@ -72,21 +75,31 @@ public MediaSource resolve(@NonNull final StreamInfo info) { // Create video stream source final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, - getNonTorrentStreams(info.getVideoStreams()), - getNonTorrentStreams(info.getVideoOnlyStreams()), false, true); - final int index; + getPlayableStreams(info.getVideoStreams(), info.getServiceId()), + getPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId()), false, true); + final List audioStreamsList = + getFilteredAudioStreams(context, info.getAudioStreams()); + + final int videoIndex; if (videoStreamsList.isEmpty()) { - index = -1; + videoIndex = -1; } else if (playbackQuality == null) { - index = qualityResolver.getDefaultResolutionIndex(videoStreamsList); + videoIndex = qualityResolver.getDefaultResolutionIndex(videoStreamsList); } else { - index = qualityResolver.getOverrideResolutionIndex(videoStreamsList, + videoIndex = qualityResolver.getOverrideResolutionIndex(videoStreamsList, getPlaybackQuality()); } - final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, index); + + final int audioIndex = + ListHelper.getAudioFormatIndex(context, audioStreamsList, audioTrack); + final MediaItemTag tag = + StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex); @Nullable final VideoStream video = tag.getMaybeQuality() .map(MediaItemTag.Quality::getSelectedVideoStream) .orElse(null); + @Nullable final AudioStream audio = tag.getMaybeAudioTrack() + .map(MediaItemTag.AudioTrack::getSelectedAudioStream) + .orElse(null); if (video != null) { try { @@ -99,14 +112,9 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } } - // Create optional audio stream source - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); - final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( - ListHelper.getDefaultAudioFormat(context, audioStreams)); - // Use the audio stream if there is no video stream, or // merge with audio stream in case if video does not contain audio - if (audio != null && (video == null || video.isVideoOnly())) { + if (audio != null && (video == null || video.isVideoOnly() || audioTrack != null)) { try { final MediaSource audioSource = PlaybackResolver.buildMediaSource( dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag); @@ -179,6 +187,15 @@ public void setPlaybackQuality(@Nullable final String playbackQuality) { this.playbackQuality = playbackQuality; } + @Nullable + public String getAudioTrack() { + return audioTrack; + } + + public void setAudioTrack(@Nullable final String audioLanguage) { + this.audioTrack = audioLanguage; + } + public interface QualityResolver { int getDefaultResolutionIndex(List sortedVideos); diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 0ff1fb08e80..75ee407846b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -66,6 +66,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.PlayerBinding; import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; @@ -81,6 +82,7 @@ import org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper; import org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHolder; import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.SponsorBlockMode; import org.schabi.newpipe.util.external_communication.KoreUtils; @@ -114,7 +116,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected PlayerBinding binding; private final Handler controlsVisibilityHandler = new Handler(Looper.getMainLooper()); - @Nullable private SurfaceHolderCallback surfaceHolderCallback; + @Nullable + private SurfaceHolderCallback surfaceHolderCallback; boolean surfaceIsSetup = false; @@ -123,11 +126,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //////////////////////////////////////////////////////////////////////////*/ private static final int POPUP_MENU_ID_QUALITY = 69; + private static final int POPUP_MENU_ID_AUDIO_TRACK = 70; private static final int POPUP_MENU_ID_PLAYBACK_SPEED = 79; private static final int POPUP_MENU_ID_CAPTION = 89; protected boolean isSomePopupMenuVisible = false; private PopupMenu qualityPopupMenu; + private PopupMenu audioTrackPopupMenu; protected PopupMenu playbackSpeedPopupMenu; private PopupMenu captionPopupMenu; @@ -151,7 +156,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //region Constructor, setup, destroy protected VideoPlayerUi(@NonNull final Player player, - @NonNull final PlayerBinding playerBinding) { + @NonNull final PlayerBinding playerBinding) { super(player); binding = playerBinding; setupFromView(); @@ -178,6 +183,7 @@ private void initViews() { R.style.DarkPopupMenu); qualityPopupMenu = new PopupMenu(themeWrapper, binding.qualityTextView); + audioTrackPopupMenu = new PopupMenu(themeWrapper, binding.audioTrackTextView); playbackSpeedPopupMenu = new PopupMenu(context, binding.playbackSpeed); captionPopupMenu = new PopupMenu(themeWrapper, binding.captionTextView); @@ -195,6 +201,8 @@ private void initViews() { protected void initListeners() { binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked)); + binding.audioTrackTextView.setOnClickListener( + makeOnClickListener(this::onAudioTracksClicked)); binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked)); binding.playbackSeekBar.setOnSeekBarChangeListener(this); @@ -276,6 +284,7 @@ protected void initListeners() { protected void deinitListeners() { binding.qualityTextView.setOnClickListener(null); + binding.audioTrackTextView.setOnClickListener(null); binding.playbackSpeed.setOnClickListener(null); binding.playbackSeekBar.setOnSeekBarChangeListener(null); binding.captionTextView.setOnClickListener(null); @@ -436,6 +445,7 @@ protected void setupElementsSize(final int buttonsMinWidth, binding.topControls.setPaddingRelative(controlsPad, playerTopPad, controlsPad, 0); binding.bottomControls.setPaddingRelative(controlsPad, 0, controlsPad, 0); binding.qualityTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); + binding.audioTrackTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setMinimumWidth(buttonsMinWidth); binding.captionTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); @@ -541,6 +551,7 @@ public void onUpdateProgress(final int currentProgress, /** * Sets the current duration into the corresponding elements. + * * @param currentProgress the current progress, in milliseconds */ private void updatePlayBackElementsCurrentDuration(final int currentProgress) { @@ -553,6 +564,7 @@ private void updatePlayBackElementsCurrentDuration(final int currentProgress) { /** * Sets the video duration time into all control components (e.g. seekbar). + * * @param duration the video duration, in milliseconds */ private void setVideoDurationToControls(final int duration) { @@ -1017,6 +1029,7 @@ public void onMetadataChanged(@NonNull final StreamInfo info) { private void updateStreamRelatedViews() { player.getCurrentStreamInfo().ifPresent(info -> { binding.qualityTextView.setVisibility(View.GONE); + binding.audioTrackTextView.setVisibility(View.GONE); binding.playbackSpeed.setVisibility(View.GONE); binding.playbackEndTime.setVisibility(View.GONE); @@ -1052,6 +1065,7 @@ private void updateStreamRelatedViews() { } buildQualityMenu(); + buildAudioTrackMenu(); binding.qualityTextView.setVisibility(View.VISIBLE); binding.surfaceView.setVisibility(View.VISIBLE); @@ -1100,6 +1114,34 @@ private void buildQualityMenu() { .ifPresent(s -> binding.qualityTextView.setText(s.getResolution())); } + private void buildAudioTrackMenu() { + if (audioTrackPopupMenu == null) { + return; + } + audioTrackPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_AUDIO_TRACK); + + final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) + .orElse(null); + if (availableStreams == null || availableStreams.size() < 2) { + return; + } + + for (int i = 0; i < availableStreams.size(); i++) { + final AudioStream audioStream = availableStreams.get(i); + audioTrackPopupMenu.getMenu().add(POPUP_MENU_ID_AUDIO_TRACK, i, Menu.NONE, + Localization.audioTrackName(context, audioStream)); + } + + player.getSelectedAudioStream() + .ifPresent(s -> binding.audioTrackTextView.setText( + Localization.audioTrackName(context, s))); + binding.audioTrackTextView.setVisibility(View.VISIBLE); + audioTrackPopupMenu.setOnMenuItemClickListener(this); + audioTrackPopupMenu.setOnDismissListener(this); + } + private void buildPlaybackSpeedMenu() { if (playbackSpeedPopupMenu == null) { return; @@ -1208,6 +1250,11 @@ private void onQualityClicked() { .ifPresent(binding.qualityTextView::setText); } + private void onAudioTracksClicked() { + audioTrackPopupMenu.show(); + isSomePopupMenuVisible = true; + } + /** * Called when an item of the quality selector or the playback speed selector is selected. */ @@ -1220,26 +1267,10 @@ public boolean onMenuItemClick(@NonNull final MenuItem menuItem) { } if (menuItem.getGroupId() == POPUP_MENU_ID_QUALITY) { - final int menuItemIndex = menuItem.getItemId(); - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) { - return true; - } - - final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get(); - final List availableStreams = quality.getSortedVideoStreams(); - final int selectedStreamIndex = quality.getSelectedVideoStreamIndex(); - if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { - return true; - } - - player.saveStreamProgressState(); //TODO added, check if good - final String newResolution = availableStreams.get(menuItemIndex).getResolution(); - player.setRecovery(); - player.setPlaybackQuality(newResolution); - player.reloadPlayQueueManager(); - - binding.qualityTextView.setText(menuItem.getTitle()); + onQualityItemClick(menuItem); + return true; + } else if (menuItem.getGroupId() == POPUP_MENU_ID_AUDIO_TRACK) { + onAudioTrackItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); @@ -1252,6 +1283,47 @@ public boolean onMenuItemClick(@NonNull final MenuItem menuItem) { return false; } + private void onQualityItemClick(@NonNull final MenuItem menuItem) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) { + return; + } + + final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get(); + final List availableStreams = quality.getSortedVideoStreams(); + final int selectedStreamIndex = quality.getSelectedVideoStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return; + } + + final String newResolution = availableStreams.get(menuItemIndex).getResolution(); + player.setPlaybackQuality(newResolution); + + binding.qualityTextView.setText(menuItem.getTitle()); + } + + private void onAudioTrackItemClick(@NonNull final MenuItem menuItem) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { + return; + } + + final MediaItemTag.AudioTrack audioTrack = + currentMetadata.getMaybeAudioTrack().get(); + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return; + } + + final String newAudioTrack = availableStreams.get(menuItemIndex).getAudioTrackId(); + player.setAudioTrack(newAudioTrack); + + binding.audioTrackTextView.setText(menuItem.getTitle()); + } + /** * Called when some popup menu is dismissed. */ 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 37f83057bfd..ee34f01dd32 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -15,6 +15,7 @@ import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; import androidx.preference.Preference; @@ -182,7 +183,6 @@ private void requestImportPathResult(final ActivityResult result) { importDatabase(file, lastImportDataUri)) .setNegativeButton(R.string.cancel, (d, id) -> d.cancel()) - .create() .show(); } } @@ -223,20 +223,22 @@ private void importDatabase(final StoredFileHelper file, final Uri importDataUri // if settings file exist, ask if it should be imported. if (manager.extractSettings(file)) { - final AlertDialog.Builder alert = new AlertDialog.Builder(requireContext()); - alert.setTitle(R.string.import_settings); - - alert.setNegativeButton(R.string.cancel, (dialog, which) -> { - dialog.dismiss(); - finishImport(importDataUri); - }); - alert.setPositiveButton(R.string.ok, (dialog, which) -> { - dialog.dismiss(); - manager.loadSharedPreferences(PreferenceManager - .getDefaultSharedPreferences(requireContext())); - finishImport(importDataUri); - }); - alert.show(); + new AlertDialog.Builder(requireContext()) + .setTitle(R.string.import_settings) + .setNegativeButton(R.string.cancel, (dialog, which) -> { + dialog.dismiss(); + finishImport(importDataUri); + }) + .setPositiveButton(R.string.ok, (dialog, which) -> { + dialog.dismiss(); + final Context context = requireContext(); + final SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(context); + manager.loadSharedPreferences(prefs); + cleanImport(context, prefs); + finishImport(importDataUri); + }) + .show(); } else { finishImport(importDataUri); } @@ -245,6 +247,38 @@ private void importDatabase(final StoredFileHelper file, final Uri importDataUri } } + /** + * Remove settings that are not supposed to be imported on different devices + * and reset them to default values. + * @param context the context used for the import + * @param prefs the preferences used while running the import + */ + private void cleanImport(@NonNull final Context context, + @NonNull final SharedPreferences prefs) { + // Check if media tunnelling needs to be disabled automatically, + // if it was disabled automatically in the imported preferences. + final String tunnelingKey = context.getString(R.string.disable_media_tunneling_key); + final String automaticTunnelingKey = + context.getString(R.string.disabled_media_tunneling_automatically_key); + // R.string.disable_media_tunneling_key should always be true + // if R.string.disabled_media_tunneling_automatically_key equals 1, + // but we double check here just to be sure and to avoid regressions + // caused by possible later modification of the media tunneling functionality. + // R.string.disabled_media_tunneling_automatically_key == 0: + // automatic value overridden by user in settings + // R.string.disabled_media_tunneling_automatically_key == -1: not set + final boolean wasMediaTunnelingDisabledAutomatically = + prefs.getInt(automaticTunnelingKey, -1) == 1 + && prefs.getBoolean(tunnelingKey, false); + if (wasMediaTunnelingDisabledAutomatically) { + prefs.edit() + .putInt(automaticTunnelingKey, -1) + .putBoolean(tunnelingKey, false) + .apply(); + NewPipeSettings.setMediaTunneling(context); + } + } + /** * Save import path and restart system. * diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt index 8adf6a64909..92be93a294c 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt @@ -67,6 +67,9 @@ class ContentSettingsManager(private val fileLocator: NewPipeFileLocator) { return ZipHelper.extractFileFromZip(file, fileLocator.settings.path, "newpipe.settings") } + /** + * Remove all shared preferences from the app and load the preferences supplied to the manager. + */ fun loadSharedPreferences(preferences: SharedPreferences) { try { val preferenceEditor = preferences.edit() 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 782b7b906c6..472db6afe6f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -170,11 +170,11 @@ private void forgetSAFTree(final Context context, final String oldPath) { } private void showMessageDialog(@StringRes final int title, @StringRes final int message) { - final AlertDialog.Builder msg = new AlertDialog.Builder(ctx); - msg.setTitle(title); - msg.setMessage(message); - msg.setPositiveButton(getString(R.string.ok), null); - msg.show(); + new AlertDialog.Builder(ctx) + .setTitle(title) + .setMessage(message) + .setPositiveButton(getString(R.string.ok), null) + .show(); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java new file mode 100644 index 00000000000..14dd0c4093b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java @@ -0,0 +1,45 @@ +package org.schabi.newpipe.settings; + +import android.content.SharedPreferences; +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceManager; +import androidx.preference.SwitchPreferenceCompat; + +import org.schabi.newpipe.R; + +public class ExoPlayerSettingsFragment extends BasePreferenceFragment { + + @Override + public void onCreatePreferences(@Nullable final Bundle savedInstanceState, + @Nullable final String rootKey) { + addPreferencesFromResourceRegistry(); + + final String disabledMediaTunnelingAutomaticallyKey = + getString(R.string.disabled_media_tunneling_automatically_key); + final SwitchPreferenceCompat disableMediaTunnelingPref = + (SwitchPreferenceCompat) requirePreference(R.string.disable_media_tunneling_key); + final SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(requireContext()); + final boolean mediaTunnelingAutomaticallyDisabled = + prefs.getInt(disabledMediaTunnelingAutomaticallyKey, -1) == 1; + final String summaryText = getString(R.string.disable_media_tunneling_summary); + disableMediaTunnelingPref.setSummary(mediaTunnelingAutomaticallyDisabled + ? summaryText + " " + getString(R.string.disable_media_tunneling_automatic_info) + : summaryText); + + disableMediaTunnelingPref.setOnPreferenceChangeListener((Preference p, Object enabled) -> { + if (Boolean.FALSE.equals(enabled)) { + PreferenceManager.getDefaultSharedPreferences(requireContext()) + .edit() + .putInt(disabledMediaTunnelingAutomaticallyKey, 0) + .apply(); + // the info text might have been shown before + p.setSummary(R.string.disable_media_tunneling_summary); + } + return true; + }); + } +} 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 86e651e2bd0..9bc9058c803 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java @@ -132,7 +132,6 @@ public static void openDeleteWatchHistoryDialog(@NonNull final Context context, disposables.add(getWholeStreamHistoryDisposable(context, recordManager)); disposables.add(getRemoveOrphanedRecordsDisposable(context, recordManager)); })) - .create() .show(); } @@ -144,7 +143,6 @@ public static void openDeletePlaybackStatesDialog(@NonNull final Context context .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss())) .setPositiveButton(R.string.delete, ((dialog, which) -> disposables.add(getDeletePlaybackStatesDisposable(context, recordManager)))) - .create() .show(); } @@ -156,7 +154,6 @@ public static void openDeleteSearchHistoryDialog(@NonNull final Context context, .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss())) .setPositiveButton(R.string.delete, ((dialog, which) -> disposables.add(getDeleteSearchHistoryDisposable(context, recordManager)))) - .create() .show(); } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 622daa08137..b8ccc8c1926 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.settings; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; + import android.content.Context; import android.content.SharedPreferences; import android.os.Build; @@ -15,8 +17,6 @@ import java.io.File; import java.util.Set; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; - /* * Created by k3b on 07.01.2016. * @@ -61,7 +61,7 @@ public static void initSettings(final Context context) { } // first run migrations, then setDefaultValues, since the latter requires the correct types - SettingMigrations.initMigrations(context, isFirstRun); + SettingMigrations.runMigrationsIfNeeded(context, isFirstRun); // readAgain is true so that if new settings are added their default value is set PreferenceManager.setDefaultValues(context, R.xml.main_settings, true); @@ -77,6 +77,8 @@ public static void initSettings(final Context context) { saveDefaultVideoDownloadDirectory(context); saveDefaultAudioDownloadDirectory(context); + + disableMediaTunnelingIfNecessary(context, isFirstRun); } static void saveDefaultVideoDownloadDirectory(final Context context) { @@ -153,4 +155,49 @@ public static boolean showRemoteSearchSuggestions(final Context context, return showSearchSuggestions(context, sharedPreferences, R.string.show_remote_search_suggestions_key); } + + private static void disableMediaTunnelingIfNecessary(@NonNull final Context context, + final boolean isFirstRun) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + final String disabledTunnelingKey = context.getString(R.string.disable_media_tunneling_key); + final String disabledTunnelingAutomaticallyKey = + context.getString(R.string.disabled_media_tunneling_automatically_key); + final String blacklistVersionKey = + context.getString(R.string.media_tunneling_device_blacklist_version); + + final int lastMediaTunnelingUpdate = prefs.getInt(blacklistVersionKey, 0); + final boolean wasDeviceBlacklistUpdated = + DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION != lastMediaTunnelingUpdate; + final boolean wasMediaTunnelingEnabledByUser = + prefs.getInt(disabledTunnelingAutomaticallyKey, -1) == 0 + && !prefs.getBoolean(disabledTunnelingKey, false); + + if (Boolean.TRUE.equals(isFirstRun) + || (wasDeviceBlacklistUpdated && !wasMediaTunnelingEnabledByUser)) { + setMediaTunneling(context); + } + } + + /** + * Check if device does not support media tunneling + * and disable that exoplayer feature if necessary. + * @see DeviceUtils#shouldSupportMediaTunneling() + * @param context + */ + public static void setMediaTunneling(@NonNull final Context context) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (!DeviceUtils.shouldSupportMediaTunneling()) { + prefs.edit() + .putBoolean(context.getString(R.string.disable_media_tunneling_key), true) + .putInt(context.getString( + R.string.disabled_media_tunneling_automatically_key), 1) + .putInt(context.getString(R.string.media_tunneling_device_blacklist_version), + DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION) + .apply(); + } else { + prefs.edit() + .putInt(context.getString(R.string.media_tunneling_device_blacklist_version), + DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION).apply(); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index b1e2c04ebf3..215caaa3894 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -4,6 +4,7 @@ import android.content.SharedPreferences; import android.util.Log; +import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; @@ -30,9 +31,9 @@ public final class SettingMigrations { private static final String TAG = SettingMigrations.class.toString(); private static SharedPreferences sp; - public static final Migration MIGRATION_0_1 = new Migration(0, 1) { + private static final Migration MIGRATION_0_1 = new Migration(0, 1) { @Override - public void migrate(final Context context) { + public void migrate(@NonNull final Context context) { // We changed the content of the dialog which opens when sharing a link to NewPipe // by removing the "open detail page" option. // Therefore, show the dialog once again to ensure users need to choose again and are @@ -44,9 +45,9 @@ public void migrate(final Context context) { } }; - public static final Migration MIGRATION_1_2 = new Migration(1, 2) { + private static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override - protected void migrate(final Context context) { + protected void migrate(@NonNull final Context context) { // The new application workflow introduced in #2907 allows minimizing videos // while playing to do other stuff within the app. // For an even better workflow, we minimize a stream when switching the app to play in @@ -63,9 +64,9 @@ protected void migrate(final Context context) { } }; - public static final Migration MIGRATION_2_3 = new Migration(2, 3) { + private static final Migration MIGRATION_2_3 = new Migration(2, 3) { @Override - protected void migrate(final Context context) { + protected void migrate(@NonNull final Context context) { // Storage Access Framework implementation was improved in #5415, allowing the modern // and standard way to access folders and files to be used consistently everywhere. // We reset the setting to its default value, i.e. "use SAF", since now there are no @@ -79,9 +80,9 @@ protected void migrate(final Context context) { } }; - public static final Migration MIGRATION_3_4 = new Migration(3, 4) { + private static final Migration MIGRATION_3_4 = new Migration(3, 4) { @Override - protected void migrate(final Context context) { + protected void migrate(@NonNull final Context context) { // Pull request #3546 added support for choosing the type of search suggestions to // show, replacing the on-off switch used before, so migrate the previous user choice @@ -108,6 +109,25 @@ protected void migrate(final Context context) { } }; + private static final Migration MIGRATION_4_5 = new Migration(4, 5) { + @Override + protected void migrate(@NonNull final Context context) { + final boolean brightness = sp.getBoolean("brightness_gesture_control", true); + final boolean volume = sp.getBoolean("volume_gesture_control", true); + + final SharedPreferences.Editor editor = sp.edit(); + + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(volume + ? R.string.volume_control_key : R.string.none_control_key)); + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(brightness + ? R.string.brightness_control_key : R.string.none_control_key)); + + editor.apply(); + } + }; + /** * List of all implemented migrations. *

@@ -119,15 +139,17 @@ protected void migrate(final Context context) { MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, + MIGRATION_4_5, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - public static final int VERSION = 4; + private static final int VERSION = 5; - public static void initMigrations(final Context context, final boolean isFirstRun) { + public static void runMigrationsIfNeeded(@NonNull final Context context, + final boolean isFirstRun) { // setup migrations and check if there is something to do sp = PreferenceManager.getDefaultSharedPreferences(context); final String lastPrefVersionKey = context.getString(R.string.last_used_preferences_version); @@ -192,7 +214,7 @@ private boolean shouldMigrate(final int currentVersion) { return oldVersion >= currentVersion; } - protected abstract void migrate(Context context); + protected abstract void migrate(@NonNull Context context); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java index f321a0918bf..7a61c1ace34 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java @@ -40,6 +40,7 @@ private SettingsResourceRegistry() { add(PlayerNotificationSettingsFragment.class, R.xml.player_notification_settings); add(UpdateSettingsFragment.class, R.xml.update_settings); add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings); + add(ExoPlayerSettingsFragment.class, R.xml.exoplayer_settings); add(SponsorBlockSettingsFragment.class, R.xml.sponsor_block_settings); add(SponsorBlockCategoriesSettingsFragment.class, R.xml.sponsor_block_category_settings); add(ExtraSettingsFragment.class, R.xml.extra_settings); diff --git a/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java b/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java new file mode 100644 index 00000000000..39a05acb313 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java @@ -0,0 +1,94 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * A list adapter for groups of {@link AudioStream}s (audio tracks). + */ +public class AudioTrackAdapter extends BaseAdapter { + private final AudioTracksWrapper tracksWrapper; + + public AudioTrackAdapter(final AudioTracksWrapper tracksWrapper) { + this.tracksWrapper = tracksWrapper; + } + + @Override + public int getCount() { + return tracksWrapper.size(); + } + + @Override + public List getItem(final int position) { + return tracksWrapper.getTracksList().get(position).getStreamsList(); + } + + @Override + public long getItemId(final int position) { + return position; + } + + @Override + public View getView(final int position, final View convertView, final ViewGroup parent) { + final var context = parent.getContext(); + final View view; + if (convertView == null) { + view = LayoutInflater.from(context).inflate( + R.layout.stream_quality_item, parent, false); + } else { + view = convertView; + } + + final ImageView woSoundIconView = view.findViewById(R.id.wo_sound_icon); + final TextView formatNameView = view.findViewById(R.id.stream_format_name); + final TextView qualityView = view.findViewById(R.id.stream_quality); + final TextView sizeView = view.findViewById(R.id.stream_size); + + final List streams = getItem(position); + final AudioStream stream = streams.get(0); + + woSoundIconView.setVisibility(View.GONE); + sizeView.setVisibility(View.VISIBLE); + + if (stream.getAudioTrackId() != null) { + formatNameView.setText(stream.getAudioTrackId()); + } + qualityView.setText(Localization.audioTrackName(context, stream)); + + return view; + } + + public static class AudioTracksWrapper implements Serializable { + private final List> tracksList; + + public AudioTracksWrapper(@NonNull final List> groupedAudioStreams, + @Nullable final Context context) { + this.tracksList = groupedAudioStreams.stream().map(streams -> + new StreamSizeWrapper<>(streams, context)).collect(Collectors.toList()); + } + + public List> getTracksList() { + return tracksList; + } + + public int size() { + return tracksList.size(); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 4b08cfcb501..e9678c2b009 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -36,21 +36,90 @@ public final class DeviceUtils { private static Boolean isTV = null; private static Boolean isFireTV = null; - /* - * Devices that do not support media tunneling + /** + *

The app version code that corresponds to the last update + * of the media tunneling device blacklist.

+ *

The value of this variable needs to be updated everytime a new device that does not + * support media tunneling to match the upcoming version code.

+ * @see #shouldSupportMediaTunneling() + */ + public static final int MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION = 994; + + // region: devices not supporting media tunneling / media tunneling blacklist + /** + *

Formuler Z8 Pro, Z8, CC, Z Alpha, Z+ Neo.

+ *

Blacklist reason: black screen

+ *

Board: HiSilicon Hi3798MV200

*/ - // Formuler Z8 Pro, Z8, CC, Z Alpha, Z+ Neo private static final boolean HI3798MV200 = Build.VERSION.SDK_INT == 24 && Build.DEVICE.equals("Hi3798MV200"); - // Zephir TS43UHD-2 + /** + *

Zephir TS43UHD-2.

+ *

Blacklist reason: black screen

+ */ private static final boolean CVT_MT5886_EU_1G = Build.VERSION.SDK_INT == 24 && Build.DEVICE.equals("cvt_mt5886_eu_1g"); - // Hilife TV + /** + * Hilife TV. + *

Blacklist reason: black screen

+ */ private static final boolean REALTEKATV = Build.VERSION.SDK_INT == 25 && Build.DEVICE.equals("RealtekATV"); - // Philips QM16XE + /** + *

Phillips 4K (O)LED TV.

+ * Supports custom ROMs with different API levels + */ + private static final boolean PH7M_EU_5596 = Build.VERSION.SDK_INT >= 26 + && Build.DEVICE.equals("PH7M_EU_5596"); + /** + *

Philips QM16XE.

+ *

Blacklist reason: black screen

+ */ private static final boolean QM16XE_U = Build.VERSION.SDK_INT == 23 && Build.DEVICE.equals("QM16XE_U"); + /** + *

Sony Bravia VH1.

+ *

Processor: MT5895

+ *

Blacklist reason: fullscreen crash / stuttering

+ */ + private static final boolean BRAVIA_VH1 = Build.VERSION.SDK_INT == 29 + && Build.DEVICE.equals("BRAVIA_VH1"); + /** + *

Sony Bravia VH2.

+ *

Blacklist reason: fullscreen crash; this includes model A90J as reported in + * + * #9023

+ */ + private static final boolean BRAVIA_VH2 = Build.VERSION.SDK_INT == 29 + && Build.DEVICE.equals("BRAVIA_VH2"); + /** + *

Sony Bravia Android TV platform 2.

+ * Uses a MediaTek MT5891 (MT5596) SoC. + * @see + * https://github.com/CiNcH83/bravia_atv2 + */ + private static final boolean BRAVIA_ATV2 = Build.DEVICE.equals("BRAVIA_ATV2"); + /** + *

Sony Bravia Android TV platform 3 4K.

+ *

Uses ARM MT5891 and a {@link #BRAVIA_ATV2} motherboard.

+ * + * @see + * https://browser.geekbench.com/v4/cpu/9101105 + */ + private static final boolean BRAVIA_ATV3_4K = Build.DEVICE.equals("BRAVIA_ATV3_4K"); + /** + *

Panasonic 4KTV-JUP.

+ *

Blacklist reason: fullscreen crash

+ */ + private static final boolean TX_50JXW834 = Build.DEVICE.equals("TX_50JXW834"); + /** + *

Bouygtel4K / Bouygues Telecom Bbox 4K.

+ *

Blacklist reason: black screen; reported at + * + * #10122

+ */ + private static final boolean HMB9213NW = Build.DEVICE.equals("HMB9213NW"); + // endregion private DeviceUtils() { } @@ -211,18 +280,6 @@ public static int spToPx(@Dimension(unit = Dimension.SP) final int sp, context.getResources().getDisplayMetrics()); } - /** - * Some devices have broken tunneled video playback but claim to support it. - * See https://github.com/TeamNewPipe/NewPipe/issues/5911 - * @return false if affected device - */ - public static boolean shouldSupportMediaTunneling() { - return !HI3798MV200 - && !CVT_MT5886_EU_1G - && !REALTEKATV - && !QM16XE_U; - } - public static boolean isLandscape(final Context context) { return context.getResources().getDisplayMetrics().heightPixels < context.getResources() .getDisplayMetrics().widthPixels; @@ -252,4 +309,30 @@ public static int getWindowHeight(@NonNull final WindowManager windowManager) { return point.y; } } + + /** + *

Some devices have broken tunneled video playback but claim to support it.

+ *

This can cause a black video player surface while attempting to play a video or + * crashes while entering or exiting the full screen player. + * The issue effects Android TVs most commonly. + * See #5911 and + * #9023 for more info.

+ * @Note Update {@link #MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION} + * when adding a new device to the method. + * @return {@code false} if affected device; {@code true} otherwise + */ + public static boolean shouldSupportMediaTunneling() { + // Maintainers note: update MEDIA_TUNNELING_DEVICES_UPDATE_APP_VERSION_CODE + return !HI3798MV200 + && !CVT_MT5886_EU_1G + && !REALTEKATV + && !QM16XE_U + && !BRAVIA_VH1 + && !BRAVIA_VH2 + && !BRAVIA_ATV2 + && !BRAVIA_ATV3_4K + && !PH7M_EU_5596 + && !TX_50JXW834 + && !HMB9213NW; + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index b3b7c1792db..f45f3786da9 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.extractor.ServiceList.YouTube; + import android.content.Context; import android.content.SharedPreferences; import android.net.ConnectivityManager; @@ -13,6 +15,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import org.schabi.newpipe.extractor.stream.DeliveryMethod; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -23,6 +26,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -36,19 +40,40 @@ public final class ListHelper { // Audio format in order of quality. 0=lowest quality, n=highest quality private static final List AUDIO_FORMAT_QUALITY_RANKING = List.of(MediaFormat.MP3, MediaFormat.WEBMA, MediaFormat.M4A); - // Audio format in order of efficiency. 0=most efficient, n=least efficient + // Audio format in order of efficiency. 0=least efficient, n=most efficient private static final List AUDIO_FORMAT_EFFICIENCY_RANKING = - List.of(MediaFormat.WEBMA, MediaFormat.M4A, MediaFormat.MP3); + List.of(MediaFormat.MP3, MediaFormat.M4A, MediaFormat.WEBMA); // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); + // Audio track types in order of priotity. 0=lowest, n=highest + private static final List AUDIO_TRACK_TYPE_RANKING = + List.of(AudioTrackType.DESCRIPTIVE, AudioTrackType.DUBBED, AudioTrackType.ORIGINAL); + // Audio track types in order of priotity when descriptive audio is preferred. + private static final List AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE = + List.of(AudioTrackType.ORIGINAL, AudioTrackType.DUBBED, AudioTrackType.DESCRIPTIVE); + + /** + * List of supported YouTube Itag ids. + * The original order is kept. + * @see {@link org.schabi.newpipe.extractor.services.youtube.ItagItem#ITAG_LIST} + */ + private static final List SUPPORTED_ITAG_IDS = + List.of( + 17, 36, // video v3GPP + 18, 34, 35, 59, 78, 22, 37, 38, // video MPEG4 + 43, 44, 45, 46, // video webm + 171, 172, 139, 140, 141, 249, 250, 251, // audio + 160, 133, 134, 135, 212, 136, 298, 137, 299, 266, // video only + 278, 242, 243, 244, 245, 246, 247, 248, 271, 272, 302, 303, 308, 313, 315 + ); private ListHelper() { } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getDefaultResolutionIndex(final Context context, final List videoStreams) { @@ -58,11 +83,11 @@ public static int getDefaultResolutionIndex(final Context context, } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @param defaultResolution the default resolution to look for * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getResolutionIndex(final Context context, final List videoStreams, @@ -71,10 +96,10 @@ public static int getResolutionIndex(final Context context, } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) - * @param context Android app context - * @param videoStreams list of the video streams to check + * @param context Android app context + * @param videoStreams list of the video streams to check * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getPopupDefaultResolutionIndex(final Context context, final List videoStreams) { @@ -84,11 +109,11 @@ public static int getPopupDefaultResolutionIndex(final Context context, } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @param defaultResolution the default resolution to look for * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getPopupResolutionIndex(final Context context, final List videoStreams, @@ -98,16 +123,36 @@ public static int getPopupResolutionIndex(final Context context, public static int getDefaultAudioFormat(final Context context, final List audioStreams) { - final MediaFormat defaultFormat = getDefaultFormat(context, - R.string.default_audio_format_key, R.string.default_audio_format_value); + return getAudioIndexByHighestRank(audioStreams, + getAudioTrackComparator(context).thenComparing(getAudioFormatComparator(context))); + } + + public static int getDefaultAudioTrackGroup(final Context context, + final List> groupedAudioStreams) { + if (groupedAudioStreams == null || groupedAudioStreams.isEmpty()) { + return -1; + } - // If the user has chosen to limit resolution to conserve mobile data - // usage then we should also limit our audio usage. - if (isLimitingDataUsage(context)) { - return getMostCompactAudioIndex(defaultFormat, audioStreams); - } else { - return getHighestQualityAudioIndex(defaultFormat, audioStreams); + final Comparator cmp = getAudioTrackComparator(context); + final List highestRanked = groupedAudioStreams.stream() + .max((o1, o2) -> cmp.compare(o1.get(0), o2.get(0))) + .orElse(null); + return groupedAudioStreams.indexOf(highestRanked); + } + + public static int getAudioFormatIndex(final Context context, + final List audioStreams, + @Nullable final String trackId) { + if (trackId != null) { + for (int i = 0; i < audioStreams.size(); i++) { + final AudioStream s = audioStreams.get(i); + if (s.getAudioTrackId() != null + && s.getAudioTrackId().equals(trackId)) { + return i; + } + } } + return getDefaultAudioFormat(context, audioStreams); } /** @@ -121,7 +166,7 @@ public static int getDefaultAudioFormat(final Context context, */ @NonNull public static List getStreamsOfSpecifiedDelivery( - final List streamList, + @Nullable final List streamList, final DeliveryMethod deliveryMethod) { return getFilteredStreamList(streamList, stream -> stream.getDeliveryMethod() == deliveryMethod); @@ -136,23 +181,31 @@ public static List getStreamsOfSpecifiedDelivery( */ @NonNull public static List getUrlAndNonTorrentStreams( - final List streamList) { + @Nullable final List streamList) { return getFilteredStreamList(streamList, stream -> stream.isUrl() && stream.getDeliveryMethod() != DeliveryMethod.TORRENT); } /** - * Return a {@link Stream} list which only contains non-torrent streams. + * Return a {@link Stream} list which only contains streams which can be played by the player. + *
+ * Some formats are not supported. For more info, see {@link #SUPPORTED_ITAG_IDS}. + * Torrent streams are also removed, because they cannot be retrieved. * - * @param streamList the original stream list * @param the item type's class that extends {@link Stream} - * @return a stream list which only contains non-torrent streams + * @param streamList the original stream list + * @param serviceId + * @return a stream list which only contains streams that can be played the player */ @NonNull - public static List getNonTorrentStreams( - final List streamList) { + public static List getPlayableStreams( + @Nullable final List streamList, final int serviceId) { + final int youtubeServiceId = YouTube.getServiceId(); return getFilteredStreamList(streamList, - stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT); + stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT + && (serviceId != youtubeServiceId + || stream.getItagItem() == null + || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); } /** @@ -186,6 +239,90 @@ public static List getSortedStreamVideosList( videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + /** + * Filter the list of audio streams and return a list with the preferred stream for + * each audio track. Streams are sorted with the preferred language in the first position. + * + * @param context the context to search for the track to give preference + * @param audioStreams the list of audio streams + * @return the sorted, filtered list + */ + public static List getFilteredAudioStreams( + @NonNull final Context context, + @Nullable final List audioStreams) { + if (audioStreams == null) { + return Collections.emptyList(); + } + + final HashMap collectedStreams = new HashMap<>(); + + final Comparator cmp = getAudioFormatComparator(context); + + for (final AudioStream stream : audioStreams) { + if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { + continue; + } + + final String trackId = Objects.toString(stream.getAudioTrackId(), ""); + + final AudioStream presentStream = collectedStreams.get(trackId); + if (presentStream == null || cmp.compare(stream, presentStream) > 0) { + collectedStreams.put(trackId, stream); + } + } + + // Filter unknown audio tracks if there are multiple tracks + if (collectedStreams.size() > 1) { + collectedStreams.remove(""); + } + + // Sort collected streams by name + return collectedStreams.values().stream().sorted(getAudioTrackNameComparator(context)) + .collect(Collectors.toList()); + } + + /** + * Group the list of audioStreams by their track ID and sort the resulting list by track name. + * + * @param context app context to get track names for sorting + * @param audioStreams list of audio streams + * @return list of audio streams lists representing individual tracks + */ + public static List> getGroupedAudioStreams( + @NonNull final Context context, + @Nullable final List audioStreams) { + if (audioStreams == null) { + return Collections.emptyList(); + } + + final HashMap> collectedStreams = new HashMap<>(); + + for (final AudioStream stream : audioStreams) { + final String trackId = Objects.toString(stream.getAudioTrackId(), ""); + if (collectedStreams.containsKey(trackId)) { + collectedStreams.get(trackId).add(stream); + } else { + final List list = new ArrayList<>(); + list.add(stream); + collectedStreams.put(trackId, list); + } + } + + // Filter unknown audio tracks if there are multiple tracks + if (collectedStreams.size() > 1) { + collectedStreams.remove(""); + } + + // Sort tracks alphabetically, sort track streams by quality + final Comparator nameCmp = getAudioTrackNameComparator(context); + final Comparator formatCmp = getAudioFormatComparator(context); + + return collectedStreams.values().stream() + .sorted((o1, o2) -> nameCmp.compare(o1.get(0), o2.get(0))) + .map(streams -> streams.stream().sorted(formatCmp).collect(Collectors.toList())) + .collect(Collectors.toList()); + } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -199,7 +336,7 @@ public static List getSortedStreamVideosList( * @return a new stream list filtered using the given predicate */ private static List getFilteredStreamList( - final List streamList, + @Nullable final List streamList, final Predicate streamListPredicate) { if (streamList == null) { return Collections.emptyList(); @@ -210,7 +347,7 @@ private static List getFilteredStreamList( .collect(Collectors.toList()); } - private static String computeDefaultResolution(final Context context, final int key, + private static String computeDefaultResolution(@NonNull final Context context, final int key, final int value) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); @@ -300,8 +437,8 @@ static List getSortedStreamVideosList( // Filter out higher resolutions (or not if high resolutions should always be shown) .filter(stream -> showHigherResolutions || !HIGH_RESOLUTION_LIST.contains(stream.getResolution() - // Replace any frame rate with nothing - .replaceAll("p\\d+$", "p"))) + // Replace any frame rate with nothing + .replaceAll("p\\d+$", "p"))) .collect(Collectors.toList()); final HashMap hashMap = new HashMap<>(); @@ -351,72 +488,22 @@ private static List sortStreamList(final List videoStr return videoStreams; } - /** - * Get the audio from the list with the highest quality. - * Format will be ignored if it yields no results. - * - * @param format The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @return Index of audio stream that produces the most compact results or -1 if not found - */ - static int getHighestQualityAudioIndex(@Nullable final MediaFormat format, - @Nullable final List audioStreams) { - return getAudioIndexByHighestRank(format, audioStreams, - // Compares descending (last = highest rank) - getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING)); - } - - /** - * Get the audio from the list with the lowest bitrate and most efficient format. - * Format will be ignored if it yields no results. - * - * @param format The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @return Index of audio stream that produces the most compact results or -1 if not found - */ - static int getMostCompactAudioIndex(@Nullable final MediaFormat format, - @Nullable final List audioStreams) { - return getAudioIndexByHighestRank(format, audioStreams, - // The "reversed()" is important -> Compares ascending (first = highest rank) - getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING).reversed()); - } - - private static Comparator getAudioStreamComparator( - final List formatRanking) { - return Comparator.nullsLast(Comparator.comparingInt(AudioStream::getAverageBitrate)) - .thenComparingInt(stream -> formatRanking.indexOf(stream.getFormat())); - } - /** * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. * - * @param targetedFormat The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @param comparator The comparator used for determining the max/best/highest ranked value + * @param audioStreams List of audio streams + * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ - private static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, - @Nullable final List audioStreams, - final Comparator comparator) { + static int getAudioIndexByHighestRank(@Nullable final List audioStreams, + final Comparator comparator) { if (audioStreams == null || audioStreams.isEmpty()) { return -1; } final AudioStream highestRankedAudioStream = audioStreams.stream() - .filter(audioStream -> targetedFormat == null - || audioStream.getFormat() == targetedFormat) - .max(comparator) - .orElse(null); - - if (highestRankedAudioStream == null) { - // Fallback: Ignore targetedFormat if not null - if (targetedFormat != null) { - return getAudioIndexByHighestRank(null, audioStreams, comparator); - } - // targetedFormat is already null -> return -1 - return -1; - } + .max(comparator).orElse(null); return audioStreams.indexOf(highestRankedAudioStream); } @@ -604,4 +691,149 @@ public static boolean isMeteredNetwork(@NonNull final Context context) { return manager.isActiveNetworkMetered(); } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * + *

The prefered stream will be ordered last.

+ * + * @param context app context + * @return Comparator + */ + private static Comparator getAudioFormatComparator( + final @NonNull Context context) { + final MediaFormat defaultFormat = getDefaultFormat(context, + R.string.default_audio_format_key, R.string.default_audio_format_value); + return getAudioFormatComparator(defaultFormat, isLimitingDataUsage(context)); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * + *

The prefered stream will be ordered last.

+ * + * @param defaultFormat the default format to look for + * @param limitDataUsage choose low bitrate audio stream + * @return Comparator + */ + static Comparator getAudioFormatComparator( + @Nullable final MediaFormat defaultFormat, final boolean limitDataUsage) { + final List formatRanking = limitDataUsage + ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; + + Comparator bitrateComparator = + Comparator.comparingInt(AudioStream::getAverageBitrate); + if (limitDataUsage) { + bitrateComparator = bitrateComparator.reversed(); + } + + return Comparator.comparing(AudioStream::getFormat, (o1, o2) -> { + if (defaultFormat != null) { + return Boolean.compare(o1 == defaultFormat, o2 == defaultFormat); + } + return 0; + }).thenComparing(bitrateComparator).thenComparingInt( + stream -> formatRanking.indexOf(stream.getFormat())); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. + * + *

Tracks will be compared this order:

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

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

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

The prefered track will be ordered last.

+ * + * @param context App context + * @return Comparator + */ + private static Comparator getAudioTrackComparator( + @NonNull final Context context) { + final SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(context); + final Locale preferredLanguage = Localization.getPreferredLocale(context); + final boolean preferOriginalAudio = + preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), + false); + final boolean preferDescriptiveAudio = + preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), + false); + + return getAudioTrackComparator(preferredLanguage, preferOriginalAudio, + preferDescriptiveAudio); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. + * + *

Tracks will be compared this order:

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

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

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

The prefered track will be ordered last.

+ * + * @param preferredLanguage Preferred audio stream language + * @param preferOriginalAudio Get the original audio track regardless of its language + * @param preferDescriptiveAudio Prefer the descriptive audio track if available + * @return Comparator + */ + static Comparator getAudioTrackComparator( + final Locale preferredLanguage, + final boolean preferOriginalAudio, + final boolean preferDescriptiveAudio) { + final String langCode = preferredLanguage.getISO3Language(); + final List trackTypeRanking = preferDescriptiveAudio + ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; + + return Comparator.comparing(AudioStream::getAudioTrackType, (o1, o2) -> { + if (preferOriginalAudio) { + return Boolean.compare( + o1 == AudioTrackType.ORIGINAL, o2 == AudioTrackType.ORIGINAL); + } + return 0; + }).thenComparing(AudioStream::getAudioLocale, + Comparator.nullsFirst(Comparator.comparing( + locale -> locale.getISO3Language().equals(langCode)))) + .thenComparing(AudioStream::getAudioTrackType, + Comparator.nullsFirst(Comparator.comparingInt(trackTypeRanking::indexOf))) + .thenComparing(AudioStream::getAudioLocale, + Comparator.nullsFirst(Comparator.comparing( + locale -> locale.getISO3Language().equals( + Locale.ENGLISH.getISO3Language())))); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their languages and track types + * for alphabetical sorting. + * + * @param context app context for localization + * @return Comparator + */ + private static Comparator getAudioTrackNameComparator( + @NonNull final Context context) { + final Locale appLoc = Localization.getAppLocale(context); + + return Comparator.comparing(AudioStream::getAudioLocale, Comparator.nullsLast( + Comparator.comparing(locale -> locale.getDisplayName(appLoc)))) + .thenComparing(AudioStream::getAudioTrackType); + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 916b902f0ba..c4034252de3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -11,6 +11,7 @@ import android.util.DisplayMetrics; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.PluralsRes; import androidx.annotation.StringRes; import androidx.core.math.MathUtils; @@ -21,6 +22,8 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import java.math.BigDecimal; import java.math.RoundingMode; @@ -261,6 +264,52 @@ public static String localizeDuration(final Context context, final int durationI } } + /** + * Get the localized name of an audio track. + * + *

Examples of results returned by this method:

+ *
    + *
  • English (original)
  • + *
  • English (descriptive)
  • + *
  • Spanish (dubbed)
  • + *
+ * + * @param context the context used to get the app language + * @param track an {@link AudioStream} of the track + * @return the localized name of the audio track + */ + public static String audioTrackName(final Context context, final AudioStream track) { + final String name; + if (track.getAudioLocale() != null) { + name = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); + } else if (track.getAudioTrackName() != null) { + name = track.getAudioTrackName(); + } else { + name = context.getString(R.string.unknown_audio_track); + } + + if (track.getAudioTrackType() != null) { + final String trackType = audioTrackType(context, track.getAudioTrackType()); + if (trackType != null) { + return context.getString(R.string.audio_track_name, name, trackType); + } + } + return name; + } + + @Nullable + private static String audioTrackType(final Context context, final AudioTrackType trackType) { + switch (trackType) { + case ORIGINAL: + return context.getString(R.string.audio_track_type_original); + case DUBBED: + return context.getString(R.string.audio_track_type_dubbed); + case DESCRIPTIVE: + return context.getString(R.string.audio_track_type_descriptive); + } + return null; + } + /*////////////////////////////////////////////////////////////////////////// // Pretty Time //////////////////////////////////////////////////////////////////////////*/ 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 2c8db77e0a2..b0d7dcf735a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -325,11 +325,11 @@ public static void resolveActivityOrAskToInstall(@NonNull final Context context, if (context instanceof Activity) { new AlertDialog.Builder(context) .setMessage(R.string.no_player_found) - .setPositiveButton(R.string.install, - (dialog, which) -> ShareUtils.installApp(context, + .setPositiveButton(R.string.install, (dialog, which) -> + ShareUtils.installApp(context, context.getString(R.string.vlc_package))) - .setNegativeButton(R.string.cancel, (dialog, which) - -> Log.i("NavigationHelper", "You unlocked a secret unicorn.")) + .setNegativeButton(R.string.cancel, (dialog, which) -> + Log.i("NavigationHelper", "You unlocked a secret unicorn.")) .show(); } else { Toast.makeText(context, R.string.no_player_found_toast, Toast.LENGTH_LONG).show(); @@ -563,11 +563,8 @@ public static void openVideoDetail(final Context context, @Nullable final PlayQueue playQueue, final boolean switchingPlayers) { - final Intent intent = getOpenIntent(context, url, serviceId, - StreamingService.LinkType.STREAM); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra(Constants.KEY_TITLE, title); - intent.putExtra(VideoDetailFragment.KEY_SWITCHING_PLAYERS, switchingPlayers); + final Intent intent = getStreamIntent(context, serviceId, url, title) + .putExtra(VideoDetailFragment.KEY_SWITCHING_PLAYERS, switchingPlayers); if (playQueue != null) { final String cacheKey = SerializedCache.getInstance().put(playQueue, PlayQueue.class); @@ -680,6 +677,15 @@ public static Intent getChannelIntent(final Context context, return getOpenIntent(context, url, serviceId, StreamingService.LinkType.CHANNEL); } + public static Intent getStreamIntent(final Context context, + final int serviceId, + final String url, + @Nullable final String title) { + return getOpenIntent(context, url, serviceId, StreamingService.LinkType.STREAM) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(Constants.KEY_TITLE, title); + } + /** * Finish this Activity as well as all Activities running below it * and then start MainActivity. diff --git a/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java b/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java deleted file mode 100644 index 6b9c36eab56..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.schabi.newpipe.util; - -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.Build; - -import androidx.annotation.NonNull; - -public final class PendingIntentCompat { - private PendingIntentCompat() { - } - - private static int addImmutableFlag(final int flags) { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - ? flags | PendingIntent.FLAG_IMMUTABLE : flags; - } - - /** - * Creates a {@link PendingIntent} to start an activity. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the activity should be started. - * @param requestCode The request code - * @param intent The Intent of the activity to be launched. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getActivity(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getActivity(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getActivity(context, requestCode, intent, addImmutableFlag(flags)); - } - - /** - * Creates a {@link PendingIntent} to start a service. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the service should be started. - * @param requestCode The request code - * @param intent The Intent of the service to be launched. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getService(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getService(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getService(context, requestCode, intent, addImmutableFlag(flags)); - } - - /** - * Creates a {@link PendingIntent} to perform a broadcast. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the broadcast should be performed. - * @param requestCode The request code - * @param intent The Intent to be broadcast. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getBroadcast(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getBroadcast(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getBroadcast(context, requestCode, intent, addImmutableFlag(flags)); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java index 74de4572027..2eb63ff41c8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -224,6 +224,8 @@ private boolean checkHasAnyVideoOnlyStreamWithNoSecondaryStream() { public static class StreamSizeWrapper implements Serializable { private static final StreamSizeWrapper EMPTY = new StreamSizeWrapper<>(Collections.emptyList(), null); + private static final int SIZE_UNSET = -2; + private final List streamsList; private final long[] streamSizes; private final String unknownSize; @@ -235,7 +237,7 @@ public StreamSizeWrapper(@NonNull final List streamList, this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content); - Arrays.fill(streamSizes, -2); + resetSizes(); } /** @@ -251,7 +253,7 @@ public static Single fetchSizeForWrapper( final Callable fetchAndSet = () -> { boolean hasChanged = false; for (final X stream : streamsWrapper.getStreamsList()) { - if (streamsWrapper.getSizeInBytes(stream) > -2) { + if (streamsWrapper.getSizeInBytes(stream) > SIZE_UNSET) { continue; } @@ -269,6 +271,10 @@ public static Single fetchSizeForWrapper( .onErrorReturnItem(true); } + public void resetSizes() { + Arrays.fill(streamSizes, SIZE_UNSET); + } + public static StreamSizeWrapper empty() { //noinspection unchecked return (StreamSizeWrapper) EMPTY; diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java index 4dc9c7c078b..6a605e9820a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java @@ -61,11 +61,12 @@ public static void playWithKore(final Context context, final Uri streamUrl) { .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (!tryOpenIntentInApp(context, intent)) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setMessage(R.string.kore_not_found) - .setPositiveButton(R.string.install, (dialog, which) -> installKore(context)) - .setNegativeButton(R.string.cancel, (dialog, which) -> { }); - builder.create().show(); + new AlertDialog.Builder(context) + .setMessage(R.string.kore_not_found) + .setPositiveButton(R.string.install, (dialog, which) -> + installKore(context)) + .setNegativeButton(R.string.cancel, null) + .show(); } } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java b/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java index b87618922a3..066515d6b96 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java @@ -169,7 +169,7 @@ public static boolean playOnPopup(final Context context, .setTitle(R.string.player_stream_failure) .setMessage( ErrorPanelHelper.Companion.getExceptionDescription(throwable)) - .setPositiveButton(R.string.ok, (v, b) -> { }) + .setPositiveButton(R.string.ok, null) .show(); })); return true; diff --git a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java index 7c0fa90124f..1d5a9358884 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java @@ -54,12 +54,12 @@ public void run() { long lowestSize = Long.MAX_VALUE; for (int i = 0; i < mMission.urls.length && mMission.running; i++) { - mConn = mMission.openConnection(mMission.urls[i], true, -1, -1); + mConn = mMission.openConnection(mMission.urls[i], true, 0, 0); mMission.establishConnection(mId, mConn); dispose(); if (Thread.interrupted()) return; - long length = Utility.getContentLength(mConn); + long length = Utility.getTotalContentLength(mConn); if (i == 0) { httpCode = mConn.getResponseCode(); @@ -84,14 +84,14 @@ public void run() { } } else { // ask for the current resource length - mConn = mMission.openConnection(true, -1, -1); + mConn = mMission.openConnection(true, 0, 0); mMission.establishConnection(mId, mConn); dispose(); if (!mMission.running || Thread.interrupted()) return; httpCode = mConn.getResponseCode(); - mMission.length = Utility.getContentLength(mConn); + mMission.length = Utility.getTotalContentLength(mConn); } if (mMission.length == 0 || httpCode == 204) { diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index 5f507277617..dbef73f7059 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -33,6 +33,7 @@ import androidx.collection.SparseArrayCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat.Builder; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; @@ -46,7 +47,6 @@ import org.schabi.newpipe.streams.io.StoredDirectoryHelper; import org.schabi.newpipe.streams.io.StoredFileHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PendingIntentCompat; import org.schabi.newpipe.util.VideoSegment; import java.io.File; @@ -151,7 +151,7 @@ public void onCreate() { mOpenDownloadList = PendingIntentCompat.getActivity(this, 0, openDownloadListIntent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT, false); icLauncher = BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher); @@ -514,7 +514,7 @@ public void notifyFailedDownload(DownloadMission mission) { private PendingIntent makePendingIntent(String action) { Intent intent = new Intent(this, DownloadManagerService.class).setAction(action); return PendingIntentCompat.getService(this, intent.hashCode(), intent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT, false); } private void manageLock(boolean acquire) { diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 639a2329c58..90c29d6738c 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -565,7 +565,6 @@ private void showError(@NonNull DownloadMission mission) { builder.setNegativeButton(R.string.ok, (dialog, which) -> dialog.cancel()) .setTitle(mission.storage.getName()) - .create() .show(); } diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index b5fc0297cf8..690ed4a9735 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -211,12 +211,11 @@ public void showClearDownloadHistoryPrompt() { .setTitle(R.string.clear_download_history) .setMessage(R.string.confirm_prompt) // Intentionally misusing buttons' purpose in order to achieve good order - .setNegativeButton(R.string.clear_download_history, - (dialog, which) -> mAdapter.clearFinishedDownloads(false)) + .setNegativeButton(R.string.clear_download_history, (dialog, which) -> + mAdapter.clearFinishedDownloads(false)) .setNeutralButton(R.string.cancel, null) - .setPositiveButton(R.string.delete_downloaded_files, - (dialog, which) -> showDeleteDownloadedFilesConfirmationPrompt()) - .create() + .setPositiveButton(R.string.delete_downloaded_files, (dialog, which) -> + showDeleteDownloadedFilesConfirmationPrompt()) .show(); } @@ -225,9 +224,8 @@ public void showDeleteDownloadedFilesConfirmationPrompt() { new AlertDialog.Builder(mContext) .setTitle(R.string.delete_downloaded_files_confirm) .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.ok, - (dialog, which) -> mAdapter.clearFinishedDownloads(true)) - .create() + .setPositiveButton(R.string.ok, (dialog, which) -> + mAdapter.clearFinishedDownloads(true)) .show(); } diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index ecce6639e97..3cfa22bd9f6 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -1,11 +1,8 @@ package us.shandian.giga.util; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; import android.os.Build; import android.util.Log; -import android.widget.Toast; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; @@ -29,8 +26,10 @@ import java.io.Serializable; import java.net.HttpURLConnection; import java.util.Locale; +import java.util.Random; import okio.ByteString; +import us.shandian.giga.get.DownloadMission; public class Utility { @@ -232,6 +231,28 @@ public static long getContentLength(HttpURLConnection connection) { return -1; } + /** + * Get the content length of the entire file even if the HTTP response is partial + * (response code 206). + * @param connection http connection + * @return content length + */ + public static long getTotalContentLength(final HttpURLConnection connection) { + try { + if (connection.getResponseCode() == 206) { + final String rangeStr = connection.getHeaderField("Content-Range"); + final String bytesStr = rangeStr.split("/", 2)[1]; + return Long.parseLong(bytesStr); + } else { + return getContentLength(connection); + } + } catch (Exception err) { + // nothing to do + } + + return -1; + } + private static String pad(int number) { return number < 10 ? ("0" + number) : String.valueOf(number); } diff --git a/app/src/main/res/drawable-hdpi/ic_close_white.png b/app/src/main/res/drawable-hdpi/ic_close_white.png deleted file mode 100644 index 5546fb0ff3d..00000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_close_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png deleted file mode 100644 index 1f1f9046c8c..00000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png index cd3b6d182b9..dd36385796e 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_replay_white.png b/app/src/main/res/drawable-hdpi/ic_replay_white.png deleted file mode 100644 index c706f809780..00000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_replay_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_close_white.png b/app/src/main/res/drawable-mdpi/ic_close_white.png deleted file mode 100644 index 1037ea613ad..00000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_close_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png deleted file mode 100644 index 734e8eca309..00000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png index f967011b048..e5d102eda0a 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_replay_white.png b/app/src/main/res/drawable-mdpi/ic_replay_white.png deleted file mode 100644 index 24558a42301..00000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_replay_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png b/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png deleted file mode 100644 index 49c12af83fa..00000000000 Binary files a/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white.png b/app/src/main/res/drawable-xhdpi/ic_close_white.png deleted file mode 100644 index 568663ed0b3..00000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_close_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png deleted file mode 100644 index e53c699dbf8..00000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png index 5fe229a9623..a875fac86f2 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_replay_white.png b/app/src/main/res/drawable-xhdpi/ic_replay_white.png deleted file mode 100644 index 47b75ceb9b7..00000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_replay_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white.png b/app/src/main/res/drawable-xxhdpi/ic_close_white.png deleted file mode 100644 index 99089514312..00000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_close_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png deleted file mode 100644 index b8b98737f49..00000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png index 595d5ab11d9..e6e661b415d 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_replay_white.png b/app/src/main/res/drawable-xxhdpi/ic_replay_white.png deleted file mode 100644 index 9a8e1507d1b..00000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_replay_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white.png deleted file mode 100644 index 06854ca49c6..00000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_close_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png deleted file mode 100644 index a0d5ba81e29..00000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png index 699e0c158f1..2185943990b 100644 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_replay_white.png b/app/src/main/res/drawable-xxxhdpi/ic_replay_white.png deleted file mode 100644 index 6a909276198..00000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_replay_white.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_fast_forward.xml b/app/src/main/res/drawable/ic_fast_forward.xml deleted file mode 100644 index 4edc96a9b33..00000000000 --- a/app/src/main/res/drawable/ic_fast_forward.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_fast_rewind.xml b/app/src/main/res/drawable/ic_fast_rewind.xml deleted file mode 100644 index 33d9f56ef8b..00000000000 --- a/app/src/main/res/drawable/ic_fast_rewind.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_history_future.xml b/app/src/main/res/drawable/ic_history_future.xml deleted file mode 100644 index db6f2acbf9d..00000000000 --- a/app/src/main/res/drawable/ic_history_future.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml deleted file mode 100644 index f833d5e0622..00000000000 --- a/app/src/main/res/drawable/ic_visibility_off.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - 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 9fdede902f3..d18681056f1 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -267,23 +267,21 @@ android:layout_height="wrap_content"> + app:shapeAppearance="@style/CircularImageView" /> diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml index 705b11f5f6f..7b4cca5e031 100644 --- a/app/src/main/res/layout/download_dialog.xml +++ b/app/src/main/res/layout/download_dialog.xml @@ -83,11 +83,45 @@ android:minWidth="150dp" tools:listitem="@layout/stream_quality_item" /> + + + + + + + tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 67958e96e37..ec072ebef61 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -157,6 +157,22 @@ tools:text="The Video Artist LONG very LONG very Long" /> + + + + + + فاتح خطأ في الشبكة لم يتم العثور على مشغل بث. تثبيت VLC؟ - فتح في متصفح الويب + فتح في المتصفح الصوت تشغيل بواسطة كودي البحث @@ -46,7 +46,7 @@ خطأ تعذر تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو - اضغط على العدسة المكبرة للبدء. + اضغط على \"العدسة المكبرة\" للبدء. اشتراك مشترك الاشتراكات @@ -91,7 +91,7 @@ محتوى مقيد للبالغين بث مباشر تقرير عن المشكلة - متوقف + معطل تنظيف أفضل دقة تراجع @@ -133,7 +133,7 @@ لاتوجد فيديوهات ابدأ إيقاف مؤقت - حذف + احذف التوقيع حسناً اسم الملف @@ -158,9 +158,9 @@ ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! عرض على GitHub - تبرع + تبرَّع يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. - تبرع + رد الجميل موقع الويب قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات. تراخيص NewPipe @@ -174,7 +174,7 @@ الشائعة أفضل ٥٠ جديد وساخن - حذف + أحذف التفاصيل إعدادات الصوت بدأ التشغيل في نافذة منبثقة @@ -346,13 +346,9 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - استخدم إيماءات التحكم في صوت المشغّل - التحكم بإيماءات السطوع - استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف تنبيه تحديث التطبيق - إيماء التحكم بالصوت الأحداث إشعارات لإصدار NewPipe الجديد وحدة التخزين الخارجية غير متوفرة @@ -642,7 +638,7 @@ تلقائي (سمة الجهاز) الثيم الليلي إظهار تفاصيل القناة - تعطيل نفق الوسائط إذا واجهت شاشة سوداء أو التقطيع في تشغيل الفيديو + قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو. تعطيل نفق الوسائط داخلي خاص @@ -675,7 +671,6 @@ إيقاف تشغيل وضع الجهاز اللوحي - إظهار العناصر التي تمت مشاهدتها تم تعطيل التعليقات لا تظهر جودة منخفضة (أصغر) @@ -729,7 +724,6 @@ تعليق مثبت LeakCanary غير متوفر الافتراضي ExoPlayer - تغيير حجم الفاصل الزمني للتحميل (حاليا %s). قد تؤدي القيمة الأقل إلى تسريع تحميل الفيديو الأولي. تتطلب التغييرات إعادة تشغيل المشغل تكوين إشعار مشغل البث الحالي الإشعارات تحميل تفاصيل البث… @@ -766,9 +760,6 @@ تنسيق غير معروف جودة غير معروفة حجم الفاصل الزمني لتحميل التشغيل - عرض العناصر المستقبلية - إخفاء العناصر المستقبلية - إخفاء العناصر التي تمت مشاهدتها أسئلة مكررة إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! مشاهدة على الموقع @@ -793,4 +784,36 @@ إزالة التكرارات؟ إظهار التدفقات التالية شاهدت بالكامل + إجراء الإيماءة اليسرى + اجراء الإيماءة اليمنى + السطوع + بدون + اختر إيماءة للنصف الأيسر من شاشة المشغل + اختر إيماءة للنصف الأيمن من شاشة المشغل + مستوى الصوت + قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي + تفضل الصوت الوصفي + الصوت : %s + المسار الصوتي + يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث + حدد مسار الصوت للمشغلات الخارجية + غير معروف + إعدادات ExoPlayer + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول + استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + %1s %2s + الافتراضي + مدبلجة + وصفي + حدد المسار الصوتي الأصلي بغض النظر عن اللغة + تفضيل الصوت الأصلي + حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا + استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer + قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث +\n +\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة + انقل محدد علامة التبويب الرئيسي إلى الأسفل + موضع علامات التبويب الرئيسية + تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 8779fb8670e..a238758af66 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -4,35 +4,35 @@ %1$s tarixində yayımlanıb Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz). - Yüklə + Quraşdır Ləğv et Brauzerdə aç Paylaş - Endir - Yayım faylını endir + Yüklə + Yayım faylın yüklə Axtarış Tənzimləmələr - Bunu demək istəyirdiniz: \"%1$s\"\? + \"%1$s\" nəzərdə tuturdunuz\? ilə paylaş Xarici video oynadıcı istifadə et - Bəzi ayırdetmələrdə səsi silir + Bəzi formatlarda səsi silir Xarici səs oynadıcı istifadə et Abunə Ol Abunə olundu Kanal abunəliyi ləğv edildi Məlumat göstər - Abunələr - Əlfəcinlənmiş Pleylistlər + Abunəliklər + Əlfəcinlənmiş Oynatma Siyahıları Yeniliklər Fon - Video endirmə qovluğu - Endirilmiş video fayllar burada saxlanılır - Video fayllar üçün endirmə qovluğu seç - Səs endirmə qovluğu - Endirilmiş səs faylları burada saxlanılır - Səs faylları üçün endirmə qovluğu seç - Standart ayırdetmə - Daha böyük ayırdetmələr göstər + Video yükləmə qovluğu + Yüklənilmiş video fayllar burada saxlanılır + Video fayllar üçün yükləmə qovluğu seç + Səs yükləmə qovluğu + Yüklənilmiş səs faylları burada saxlanılır + Səs faylları üçün yükləmə qovluğu seç + Standart format + Daha böyük formatlar göstər \"Kodi\" ilə Oynat Çatışmayan \"Kore\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər @@ -61,10 +61,6 @@ Axtarış tarixçəsi Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri - Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et - Parlaqlıq jesti idarəetməsi - Oynadıcı səsini nizamlamaq üçün jestlər istifadə et - Səs səviyyəsi jesti idarəetməsi Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi @@ -89,13 +85,13 @@ İkinci fəaliyyət düyməsi Birinci fəaliyyət düyməsi Yalnız bəzi cihazlar 2K/4K videoları oynada bilir - Standart ani görüntü ayırdetməsi + Standart ani görüntü formatı Əlavə Et Ani Görüntü Paneli Seç Abunəliyi yeniləmək alınmadı Abunəliyi dəyişmək alınmadı - Nəticələr göstərilir: %s + %s üçün nəticələr göstərilir Kanallar %s tərəfindən YouTube\'un \"Məhdud Rejimi\"ni aç @@ -429,21 +425,21 @@ Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et Ən Yeni Bu məzmun ölkənizdə mövcud deyil. - Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlana və ya endirilə bilməz. + Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, beləliklə, NewPipe tərəfindən yayımlana və ya yüklənilə bilməz. Avtomatik (cihaz teması) Sevimli gecə temanızı seçin — %s - Sabitlənmiş şərh - Bildirişlər deaktiv edilib + Sancaqlanmış şərh + Bildirişlər qeyri-aktivdir Bildiriş al Artıq bu kanala abunə oldunuz , - Hamısını dəyişdir + Hamısın dəyişdir Fayl adı Həll et Abunəlikləri ixrac etmək mümkün olmadı - %s izləyici - %s izləyici + %s baxıcı + %s baxıcı Yeni versiyaları əl ilə yoxla @@ -489,14 +485,12 @@ Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. \nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? - Baxılan elementləri göstər - Seçilmiş + Seçilən Çəkməcəni Bağla Video oynadıcı Video fayl xülasəsi prosesi üçün bildirişlər Miniatürü 1:1 görünüş nisbətinə kəs - Yükləmə intervalı həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcını yenidən başlatmağı tələb edir Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndür Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir Kənar axtarış təklifləri @@ -524,8 +518,8 @@ Eyni vaxtda ancaq bir endirmə həyata keçiriləcək Hesab ləğv edildi %s bu səbəbi təmin edir: - Endirmə başladı - Açıqlamadakı mətni seçməyi deaktiv et + Yükləmə başladı + Açıqlamadakı mətni seçməyi qeyri-aktiv et Kateqoriya Daxili Açıqlamadakı mətni seçməyi aktivləşdir @@ -550,7 +544,7 @@ Endirmə tamamlandı %s endirmə tamamlandı - Standart ExoPlayer + ExoPlayer standartı Mövcud olduqda xüsusi axından al Baxılmış videolar silinsin\? İzləniləni sil @@ -622,7 +616,7 @@ Bura ixrac et Faylı idxal et Abunəlikləri idxal etmək mümkün olmadı - Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatın bizə göndərmək üçün qəbul etməlisiniz. + Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta məlumatın bizə göndərmək üçün qəbul etməlisiniz. Bu adda fayl artıq mövcuddur Bu adla gözlənilən bir endirmə var Təyinat qovluğu yaradıla bilməz @@ -673,16 +667,16 @@ Yayım təfərrüatları yüklənir… Media tunelini deaktiv et Tətbiq çökdü - YouTube abunəliklərini Google takeout\'dan -\nidxal edin: + YouTube abunəliklərin Google Takeout-dan +\nidxal et: \n -\n1. Bu URL\'ə keçin: %1$s -\n2. Soruşulduqda daxil olun -\n3.\"Bütün Məlumatlar Daxildir\",sonra \"Heçbirini Seçmə\", yalnız \"abunəliklər\"i seçin və \"Oldu\" kliklə -\n4. \"Növbəti addım\"üzərinə klikləyin, sonra isə \"İxrac Yarat\" üzərinə klikləyin -\n5. Görünəndən sonra \"Endir\"düyməsini basın -\n6. Aşağıdakı FAYLI İDXAL ET düyməsinə klikləyin və endirilmiş .zip faylını seçin -\n7. [Əgər .zip faylı idxalı uğursuz olsa] .csv faylını çıxarın(adətən\"YouTubevəYouTubeMusic/subscriptions/subscriptions.csv\" altında),aşağıda İDXAL EDİLƏN FAYL-ı klikləyin və çıxarılmış csv faylını seçin +\n1. %1$s URL\'ə keçin: +\n2. Soruşulduqda daxil ol +\n3. \"Bütün Məlumatlar Daxildir\",sonra \"Hamısın Seçmə\", yalnız \"abunəlikləri\" seç və \"Oldu\" kliklə +\n4. \"Növbəti addım\"üzərinə kliklə, sonra isə \"İxrac Yarat\" üzərinə kliklə +\n5. Görünəndən sonra, \"Endirin\"düyməsin bas +\n6. Aşağıda FAYLI İDXAL ET düyməsin kliklə və yüklənilmiş (.zip) faylın seç +\n7. [Əgər .zip faylı idxalı uğursuz olsa] .csv faylın çıxar(adətən\"YouTubeandYouTubeMusic/subscriptions/subscriptions.csv\" altında),aşağıda FAYLI İDXAL ET-ə kliklə və çıxarılan csv faylın seç Oynatma Sürəti Nizamlamaları Ayır (pozuntuya səbəb ola bilər) Xətanı göstər @@ -702,21 +696,18 @@ Bu əməliyyat üçün uyğun fayl meneceri tapılmadı. \nZəhmət olmasa ,Yaddaş Giriş Çərçivəsinə uyğun fayl menecerini quraşdırın Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil. - İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və keçidlər kliklənməyə bilər. + İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və linklər kliklənməyə bilər. Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç Belə fayl/məzmun mənbəyi yoxdur - Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir + Seçilən yayım xarici oynadıcılar tərəfindən dəstəklənmir Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir - Xarici oynadıcılar üçün heç bir səs yayımı yoxdur - Xarici oynadıcılar üçün heç bir video yayımı yoxdur + Xarici oynadıcılar üçün mövcud səs yayımı yoxdur + Xarici oynadıcılar üçün mövcud video yayımı yoxdur Xarici oynadıcılar üçün keyfiyyət seç Naməlum format Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi - Gələcək elementləri göstər - Baxılan elementləri gizlət - Gələcək elementləri gizlət Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun! Tez-tez soruşulan suallar Veb Saytında bax @@ -741,4 +732,32 @@ Qismən baxılıb Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\? Yaxınlaşan + Sol jest hərəkəti + Oynadıcı ekranının sağ yarısı üçün jest seç + Sağ jest hərəkəti + Parlaqlıq + Səs səviyyəsi + Heç biri + Oynadıcı ekranının sol yarısı üçün jest seç + Orijinal səsə üstünlük ver + Dildən asılı olmayaraq orijinal səs axını seç + Təsviri səsə üstünlük ver + Varsa, görmə qabiliyyəti zəifləyən insanlar üçün təsviri olan səs axını seçin + Səs: %s + Səs axını + Səs axını bu yayımda olmalıdır + Xarici oynadıcılar üçün səs axını seç + Naməlum + ExoPlayer tənzimləmələri + Bəzi ExoPlayer tənzimləmələrin idarə et. Bu dəyişiklikləri təsirli etmək üçün oynadıcını yenidən başlatmaq tələb olunur + ExoPlayer-in çözücü xüsusiyyətin istifadə et + Əsas çözücüləri işlətmə uğursuz olarsa, çözücü işlətmək probleminiz varsa (daha aşağı prioritetli çözücülərə düşür), bu seçimi aktiv edin. Bu, əsas çözücülərdən istifadə ilə müqayisədə zəif oynatma performansı ilə nəticələnə bilər + Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer tərəfindən bu problemi olan bəzi cihazlarda istifadə olunur, bu tənzimləmənin təsiri yalnız Android 6 və daha yüksəkdə var. +\n +\nBu seçimi aktivləşdirmə cari video oynadıcı dəyişdiriləndə və ya tam ekrana keçəndə oynatma xətalarının qarşısını ala bilər + orijinal + dublyaj edilib + təsviri + Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et + Qabaqcıl məzmunda yükləmə aralığı həcmin dəyişdir (hazırda %s). Daha aşağı dəyər onların ilkin yüklənilməsin sürətləndirə bilər \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 15beb49bb08..f9c6109e6b5 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -150,8 +150,6 @@ Llistes de reproducción Pistes Usuarios - Usa xestos pa controlar el volume del reproductor - Usa xestos pa controlar el brillu del reproductor Reafitamientu de valores El númberu de soscriptores nun ta disponible Anovamientos @@ -226,8 +224,6 @@ Cargando\'l conteníu solicitáu Política de privacidá de NewPipe - Control per xestos del volume - Control per xestos del brillu El ficheru nun pue crease El sirvidor nun unvia datos La llingua va camudar namás que se reanicie l\'aplicación. diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index a4101a9be38..affa805e6d2 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -17,10 +17,6 @@ Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\? %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing - Player tovushini boshqarish uchun imo-ishoralardan foydalanish - Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning - Yorqinlik ishoralarini boshqarish - Ovoz balandligini ishoralarni boshqarish Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7bbe49ebd26..22a3eb03ac5 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -3,7 +3,7 @@ Націсніце «Пошук», каб пачаць. Апублікавана %1$s Патокавы прайгравальнік не знойдзены. Усталяваць VLC\? - Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). + Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC каб прайграць). Усталяваць Скасаваць Адкрыць у браўзеры @@ -338,10 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Жэст гучнасці - Мяняць гучнасць плэера жэстамі - Жэст яркасці - Мяняць яркасць плэера жэстамі Абнаўленні Файл выдалены Апавяшчэнне аб абнаўленні праграмы @@ -503,8 +499,6 @@ Падпіскі не выбраны Апошняе абнаўленне: %s - Паказаць прагледжаныя матэрыялы - Схаваць прагледжаныя матэрыялы Аўтаматычна (тэма прылады) Выберыце ўлюбёную начную тэму - %s Дазвол вылучэння тэксту ў апісанні @@ -521,8 +515,6 @@ Выберыце якасць для знешніх плэераў Невядомая якасць Невядомы фармат - Паказаць наступны матэрыял - Схаваць наступныя матэрыялы Сартаваць З-за абмежаванняў ExoPlayer працягласць пошуку была ўсталявана на %d сякундаў Раздзелы @@ -592,7 +584,7 @@ %d хвілінаў %d хвілінаў - Змяніць памер інтэрвалу загрузкі (зараз %s). Меншае значэнне можа паскорыць пачатковую загрузку відэа. Змены патрабуюць перазапуск плэера + Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (у цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю Прапановы лакальнага пошуку Наладзіць апавяшчэнне аб бягучым прайграванні патоку @@ -765,4 +757,32 @@ Прыватнасць Мова Падтрымка + Дзеянне левага жэсту + Дзеянне правага жэсту + Яркасць + Нічога + Выбраць жэст для левай часткі экрана прайгравання + Гук + Выбраць жэст для правай часткі экрана прайгравання + Выбіраць зыходную гукавую дарожку незалежна ад мовы + Аддаць перавагу арыгінальнаму гуку + Аддаць перавагу апісальнаму гуку + Выберыце гукавую дарожку з апісаннем для людзей са слабым зрокам, калі яна ёсць + Аўдыё: %s + Гукавая дарожка + Выберыце гукавую дарожку для знешніх прайгравальнікаў + Невядомая + Налады ExoPlayer + Выкарыстоўваць функцыю рэзервовага дэкодэра ExoPlayer + Заўсёды выкарыстоўваць спосаб абыходу налад паверхні відэавываду ExoPlayer + %1s %2s + арыгінальны + дубляваны + апісальны + Гукавая дарожка ўжо павінна прысутнічаць у гэтай плыні + Уключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў + Кіраванне некаторымі наладамі ExoPlayer. Каб гэтыя змены ўступілі ў сілу, патрабуецца перазапуск гульца + Гэты абыходны шлях вызваляе і паўторна стварае відэакодэкі, калі адбываецца змяненне паверхні, замест таго, каб усталёўваць паверхню непасрэдна для кодэка. ExoPlayer ужо выкарыстоўваецца на некаторых прыладах з гэтай праблемай, гэты параметр мае ўплыў толькі на прыладах з Android 6 і вышэй +\n +\nУключэнне гэтай опцыі можа прадухіліць памылкі прайгравання пры пераключэнні бягучага відэаплэера або пераключэнні ў поўнаэкранны рэжым \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index d1cb10fd74b..24bf7a76463 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,10 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Контрол на звука с жестове - Използвай жестове за контрол на звука - Контрол на яркостта с жестове - Използвай жестове за контрол на яркостта Файлът е изтрит Събития Показвай коментари @@ -550,7 +546,6 @@ Показвай цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) Автоматична (тази на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) - Покажи гледани Избете плейлист Известия Изчистване на бисквитките от reCAPTCHA @@ -563,4 +558,5 @@ Неизвестен формат Наскоро добавено Буфериране + Разбийте плейъра \ No newline at end of file diff --git a/app/src/main/res/values-bm/strings.xml b/app/src/main/res/values-bm/strings.xml new file mode 100644 index 00000000000..62f8281ab08 --- /dev/null +++ b/app/src/main/res/values-bm/strings.xml @@ -0,0 +1,4 @@ + + + ߥߊߘߏ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. + \ No newline at end of file diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index f37711eb0ae..4e6655e4525 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -147,10 +147,6 @@ ক্যাশ করা মেটাডেটা মোছ মেটাডেটা ক্যাশ মোছা হয়েছে পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 53d99fb5fdb..162dfde396a 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -74,10 +74,6 @@ ডাউনলোড ইতিহাস খোজ ইতিহাস - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 6bfe27af86d..6c3cca7a1cf 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -220,10 +220,6 @@ খোজ ইতিহাস সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো @@ -570,7 +566,6 @@ মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে। \n \nচালিয়ে যাবে\? - দেখা ভুক্তি দেখাও ট্যাবলেট অবস্থা বন্ধ চালু @@ -636,12 +631,9 @@ %1$sটি ডাউনলোড মুছা হয়েছে \"চালক বন্ধ করো\" দেখাও - দেখা ভুক্তি লুকাও বিজ্ঞপ্তি নিষ্ক্রিয় - ভবিষ্যৎ ভুক্তি লুকাও ত্রুটি বিজ্ঞপ্তি বানাও ভুক্তি মুছতে ডানে-বামে সরাও সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত… - ভবিষ্যৎ ভুক্তি দেখাও প্লেব্যাক লোড বিরতির আকার \ No newline at end of file diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 855c577a62c..50dcf839cb6 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -70,7 +70,6 @@ Zapamtite posljednju veličinu i položaj iskočnog prozora Koristite brzo neprecizno premotavanje Neprecizno premotavanje dozvoljava pokretaču brže premotavanje s gorom preciznošću. Premotavanje za 5, 15 ili 25 sekundi ne radi s ovim - Promijenite veličinu intervala za učitavanje (trenutačno %s). Niža vrijednost bi vam moglo ubrzat učitavanje videa. Trebate te ponovno učitati pokretač za promjenu. Prebacivanje sa jednog pokretača na drugi bi van moglo zamijeniti pokretni red Isključite da sakrijete komentare Pitajte za potvrdu prije isčišćavanja reda @@ -89,13 +88,9 @@ Nijedan medijski prijenosnik nije nađen na vašem uređaju (možete VLC instalisati da bi ste ga pokrenili). Uklonite sve keširane podatke web stranica Automatski sljedeći prijenos u red stavite - Pokretna kontrola zvučne glasnine Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje - Koristite pokrete za kontrolu jačine zvuka pokretača - Kontrola osvetljenja sa pokretima Prijedlozi za pretragu - Koristite pokrete za kontrolu svjetline pokretača Odaberite prijedloge koje želite prikazati prilikom pretrage Lokalni prijedlozi za pretraživanje Razdaljeni prijedlozi za pretraživanje diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ac25b29923a..010823e4333 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -114,7 +114,7 @@ Mostra resolucions superiors Només alguns dispositius poden reproduir vídeos en 2K/4K Reprodueix amb el Kodi - No s\'ha trobat l\'aplicació Kode. Voleu instal·lar-la\? + No s\'ha trobat l\'aplicació Kore. Voleu instal·lar-la\? Mostra «Reprodueix amb el Kodi» Mostra una opció per reproduir un vídeo amb el centre multimèdia Kodi Reproductor emergent intel·ligent @@ -333,10 +333,6 @@ Pistes Usuaris Trieu una pestanya - Control de volum per gestos - Fes servir gestos per controlar el volum del reproductor - Control de brillantor per gestos - Fes servir gestos per controlar la brillantor del reproductor Actualitzacions S\'ha eliminat el fitxer L\'emmagatzematge extern no està disponible @@ -574,8 +570,8 @@ Tercer botó d\'acció Segon botó d\'acció Primer botó d\'acció - Escala la miniatura del vídeo mostrat a la notificació de 16:9 a raó d\'1:1 (pot causar deformacions) - Escala a raó d\'1:1 + Retalla la miniatura del vídeo mostrat a la notificació de 16:9 a 1:1 + Retalla la miniatura amb una relació d\'aspecte 1:1 Mostrant resultats per a: %s Capítols Descripció @@ -624,7 +620,6 @@ Automàtic (tema del dispositiu) %s dóna aquesta raó: Usuari suspes - Mostra contingut visualitzat El compte de l\'autor ha estat esborrat. \nNewPipe no serà capaç de carregar aquest fil en el futur. \nUs voleu desubscriure d\'aquest canal\? @@ -702,4 +697,8 @@ Ordenar Configura la notificació de reproducció actual. Canvia la mida de l\'interval de càrrega (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. Els canvis requereixen un reinici del jugador. + Ignora els esdeveniments dels botons de reproducció físics + Útil, per exemple, si feu servir uns auriculars amb els botons físicament trencats + Trieu un gest per la part esquerra de la pantalla + Mida de l\'interval de càrrega de reproducció \ No newline at end of file diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 53d32cd93ce..f761323f9b5 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -148,7 +148,6 @@ پیشاندانی کێشە هەرده‌م نوێ بكرێته‌وه‌ ناتوانرێت بەژدارییەکان هاورده‌ بكرێنه‌وه‌ - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە دیمه‌ن هاوردە كردنی داتابه‌یس مێژووی گه‌ڕان @@ -172,7 +171,6 @@ دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن دابه‌زاندن ژێرنووسەکان - کۆنترۆڵی دەنگ بەجوڵەی پەنجە خستنه‌ نۆبه‌تی-خۆكاری په‌خشی دواتر لێده‌ره‌ دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن کردار ڕەتکرایەوە لەلایەن سیستەمەوە @@ -329,7 +327,6 @@ ناتوانیت گۆڕانكاری له‌م به‌ژدارییه‌دا بكه‌یت قه‌باره‌ی بنەڕەتی بچووککردنەوە بۆ پەنجەرە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما گۆرانییەکان دابه‌زاندنی فایلی پەخش شێوازی پیشاندانی خشتە @@ -344,7 +341,6 @@ فایل نەدۆزرایەوە چارەسەردەکرێت - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ بابەتی پەڕەی سەرەکی دیار کردنی بەژدارییەکان هاورده‌كردنی فایل @@ -618,7 +614,6 @@ دواین وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و پەیامەکان به‌كاردەهێنرێن پیشاندانی وێنۆچكه‌ - تەماشاکراوەکان پیشان بدرێن بۆ دابه‌زاندنی هه‌ر بابه‌تێك پرست پێ ده‌كرێت له‌باره‌ی شوێنی دابه‌زاندنیان ناكاراكردنی تونێلكردنی میدیا ئه‌و بابه‌تانه‌ی نه‌گونجاون بۆ منداڵان پیشان بدرێن كه‌ سنووری ته‌مه‌ن ده‌یانگرێته‌وه‌ (وه‌ك +18) @@ -700,7 +695,6 @@ هەموو فایلە دابەزێنراوەکان لە دیسک بسڕدرێتەوە؟ پەیامەکان ناکاراکراون پەیامم بکە - "قەبارەی نێوان بارکردنەکە بگۆڕە (لە ئێستادا %s) . بەهایەکی کەمتر لەوانەیە بارکردنی ڤیدیۆی سەرەتایی خێراتر بکات. گۆڕانکارییەکان پێویستیان بە داگیرساندنەوەی لێدەر هەیە" لەسەدا نیمچەتەن بنەڕەتی ExoPlayer diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index eda30eb11bf..742d4da544b 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -117,7 +117,7 @@ Chování Historie a mezipaměť Přehrávání v okně - Vypnuto + Zakázáno Vyčistit Nejlepší rozlišení Vrátit @@ -153,7 +153,7 @@ O NewPipe Licence třetích stran © %1$s od %2$s pod %3$s - O aplikaci a ČKD + O aplikaci a FAQ Licence Svobodné a nenáročné streamování v Androidu. Zobraz na GitHubu @@ -337,10 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Ovládání hlasitosti gesty - Používat gesta pro ovládání hlasitosti přehrávače - Ovládání jasu gesty - Používat gesta pro ovládání jasu přehrávače Aktualizace Soubor smazán Oznámení o aktualizaci aplikace @@ -360,8 +356,8 @@ Mřížka Automaticky Aktualizace NewPipe je k dispozici! - Hotovo - Vyčkávání + Dokončeno + Čekání Pozastaveno ve frontě zpracování @@ -370,7 +366,7 @@ Stahování se nezdařilo Vytvořit jedinečný název Přepsat - Stažený soubor s tímto názvem již existuje + Soubor s tímto názvem již existuje Stažený soubor s tímto názvem již existuje Stahování s tímto názvem již probíhá Zobrazit chybu @@ -550,7 +546,7 @@ Nikdy Pouze na Wi-Fi Automaticky zahájit přehrávání — %s - Přehrát frontu + Fronta přehravání Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\? Automatické přehravání Fronta aktivního přehrávače bude smazána @@ -645,7 +641,6 @@ Vypnuto Zapnuto Režim tabletu - Zobrazit zhlédnuté položky Nezobrazovat Nízká kvalita (menší) Vysoká kvalita (větší) @@ -691,7 +686,6 @@ Zobrazit krátké oznámení o chybě Připnutý komentář Shodit přehrávač - Změnit interval načítání (aktuálně %s). Menší hodnota může zrychlit počáteční načítání videa. Změna vyžaduje restart přehrávače LeakCanary není dostupné Výchozí ExoPlayer Nastavit oznámení o právě přehrávaném streamu @@ -724,12 +718,9 @@ U externích přehrávačů nejsou dostupné žádné zvukové streamy Neznámý formát Neznámá kvalita - Zobrazit nadcházející položky Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny Vyberte kvalitu pro externí přehrávače U externích přehrávačů nejsou k dispozici žádné videostreamy - Skrýt zhlédnuté položky - Skrýt nadcházející položky Často kladené dotazy Pokud máte potíže s používáním aplikace, přečtěte si tyto odpovědi na časté otázky! Zobrazit na webu @@ -754,4 +745,35 @@ Nadcházející Odstranit duplicity Chcete odstranit všechny duplicitní streamy v tomto playlistu\? + Akce levého gesta + Akce pravého gesta + Hlasitost + Žádné + Vyberte gesto pro levou polovinu obrazovky přehrávače + Jas + Vyberte gesto pro pravou polovinu obrazovky přehrávače + Změna velikosti intervalu načítání progresivního obsahu (aktuálně %s). Nižší hodnota může urychlit jejich počáteční načítání + Upřednostňovat původní zvuk + Vybrat původní zvukovou stopu bez ohledu na jazyk + Upřednostňovat popisný zvuk + Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je k dispozici + Neznámá + Nastavení přehrávače ExoPlayer + Správa některých nastavení přehrávače ExoPlayer. Tyto změny vyžadují restartování přehrávače, aby se projevily + Použít funkci náhradního dekodéru přehrávače ExoPlayer + Tuto možnost povolte, pokud máte problémy s inicializací dekodéru. V případě selhání inicializace primárních dekodérů se přehrávač vrátí zpět k dekodérům s nižší prioritou. To může mít za následek nižší výkon přehrávání než při použití primárních dekodérů + Vždy použít nastavení povrchu výstupu videa v přehrávači ExoPlayer + %1s %2s + původní + dabovaná + popisná + Zvuková stopa + V tomto streamu by již měla být přítomna zvuková stopa + Vyberte zvukovou stopu pro externí přehrávače + Toto obejití uvolní a znovu nainstaluje kodeky videa, když dojde ke změně povrchu, místo aby se povrch nastavil přímo na kodek. Toto nastavení, které již bylo použito v přehrávači ExoPlayer na některých zařízeních s tímto problémem, má vliv pouze na Android 6 a vyšší. +\n +\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí na celou obrazovku + Zvuk: %s + Pozice hlavních karet + Přesunout výběr hlavní karty dolů \ 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 6b16e6eae4e..0bd7e9875cb 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,10 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Juster lydstyrke ved hjælp af fingerbevægelser - Brug fingerbevægelser til at kontrollere afspillerens lydstyrke - Styr lysstyrken med fingerbevægelser - Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag Vælg forslagene, der vises, når der søges Søgehistorik @@ -462,7 +458,6 @@ Download fuldført %s downloads fuldført - Ændr indlæsningsintervallets størrelse (som nu er på %s). En lavere værdi kan øge videoindlæsningshastigheden. Ændringer kræver en genstart af afspiller Den aktive spilleliste bliver udskiftet Hvis du skifter fra en spiller til en anden, kan din kø blive erstattet Vis metainformation @@ -551,7 +546,6 @@ Tid siden sidste opdatering for at et abonnoment bliver forældet - %s Altid opdater Vælg abonnementer - Vis sete elementer Dette indhold er ikke tilgængeligt i dit land. Af %s Videoer, der er blevet set før og efter, at de er blevet tilføjet til spillelisten, vil blive fjernet. @@ -680,7 +674,6 @@ URL til miniaturebillede Fra Tablet-tilstand - Skjul fremtidige elementer Denne video er kun tilgængelig for YouTube Music Premium-medlemmer, så den kan ikke streames eller downloades af NewPipe. \"Storage Access Framework\" gør det muligt at downloade til et eksternt SD-kort Fremtving indberetning af ikke-leverbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse @@ -710,7 +703,6 @@ Du kører den nyeste version af NewPipe På grund af ExoPlayer-begrænsninger blev søgetiden sat til %d sekunder Vis kun ikke-grupperede abonnementer - Skjul sete elementer Side med spillelister Du kan vælge dit foretrukne nattema nedenfor Vælg dit foretrukne nattema - %s @@ -724,11 +716,10 @@ Skift alle Ingen lydstreams er tilgængelige for eksterne afspillere Vælg kvalitet til eksterne afspillere - Vis fremtidige elementer Sortér Ignorer hardware medie knapper Brugbart f.eks. hvis du bruger et headset med ødelagte fysiske knapper Playlists der er grået ud, indeholder allerede dette objekt. Inaktiver permanent thumbnail Fejlede at kopiere til udklipsholderen - \ No newline at end of file + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 36941050804..2fee618fd89 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -318,7 +318,7 @@ Datenschutzbestimmungen lesen Akzeptieren Ablehnen - Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipe\'s Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. + Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. \nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen @@ -336,10 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gestensteuerung für Lautstärke - Gesten verwenden, um die Lautstärke einzustellen - Gestensteuerung für Helligkeit - Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Wiedergabebenachrichtigung Konfiguriert die Benachrichtigung zum aktuell abgespielten Stream @@ -609,7 +605,7 @@ Automatisch (Gerätedesign) Nachtdesign Kanal-Details anzeigen - Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt + Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt. Media-Tunneling deaktivieren Intern Privat @@ -642,7 +638,6 @@ An Tablet-Modus Aus - Angesehene Elemente anzeigen Als gesehen markieren Vom Ersteller mit Herz versehen Farbige Picasso-Bänder über den Bildern anzeigen, die deren Quelle angeben: rot für Netzwerk, blau für Festplatte und grün für Speicher @@ -682,7 +677,6 @@ \nBitte installiere einen Storage Access Framework kompatiblen Dateimanager Angehefteter Kommentar LeakCanary ist nicht verfügbar - Ändern der Größe des Ladeintervalls (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden des Videos beschleunigen. Änderungen erfordern einen Neustart des Players ExoPlayer Standard Benachrichtigungen Benachrichtigen über neue abonnierbare Streams @@ -714,9 +708,6 @@ Streams, die der Downloader noch nicht unterstützt, werden nicht angezeigt Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe - Zukünftige Elemente anzeigen - Angesehene Elemente ausblenden - Zukünftige Elemente ausblenden Auf der Webseite ansehen Häufig gestellte Fragen Wenn du Probleme bei der Verwendung der App hast, lies bitte die Antworten auf häufig gestellte Fragen! @@ -741,4 +732,36 @@ Demnächst Vollständig angeschaut Teilweise angeschaut + Geste für die linke Hälfte des Player-Bildschirms auswählen + Geste für die rechte Hälfte des Player-Bildschirms auswählen + Keine + Rechte Gestenaktion + Linke Gestenaktion + Helligkeit + Lautstärke + Ändere die Größe des Ladeintervalls für progressive Inhalte (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden der Inhalte beschleunigen. + Originalton bevorzugen + Wähle die Originaltonspur unabhängig von der Sprache + Beschreibendes Audio bevorzugen + Wähle eine Audiospur mit Beschreibungen für sehbehinderte Menschen, falls verfügbar + Audio: %s + Audiospur + Verwalte einige ExoPlayer-Einstellungen. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden + Verwende die Decoder-Fallback-Funktion von ExoPlayer + Verwende immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung + Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher +\n +\nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern + Original + Synchronisiert + Beschreibend + Audiospur für externe Player auswählen + In diesem Stream sollte bereits eine Audiospur vorhanden sein + Aktiviere diese Option, wenn du Probleme mit der Decoderinitialisierung hast, die auf Decoder mit niedrigerer Priorität zurückgreift, wenn die Initialisierung des primären Decoders fehlschlägt. Dies kann zu einer schlechteren Wiedergabeleistung führen als bei der Verwendung von Primärdecodern + Unbekannt + ExoPlayer-Einstellungen + %1s %2s + Hauptauswahltab nach unten verschieben + Position des Haupttabs + Das Media-Tunneling wurde auf dem Gerät standardmäßig deaktiviert, da das Gerätemodell diese Funktion bekanntermaßen nicht unterstützt. \ 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 0a42d5d0fbe..113f4f3dad2 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -96,7 +96,7 @@ Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε - Αυτόματη πρόσθεση της επόμενης ροής στην ουρά + Αυτόματη προσθήκη της επόμενης ροής στην ουρά Συνέχεια της τρέχουσας (μη επαναλαμβανόμενης) ουράς μετά τη λήξη της, με την προσθήκη μιας σχετικής ροής Επιλογή των προτάσεων που εμφανίζονται κατά την αναζήτηση Αποθήκευση αναζητήσεων στη συσκευή @@ -334,10 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Έλεγχος ήχου με χειρονομιές - Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου - Έλεγχος φωτεινότητας με χειρονομίες - Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις Συμβάντα Το αρχείο διαγράφηκε @@ -635,7 +631,6 @@ Ανενεργό Ενεργό Κατάσταση tablet - Εμφάνιση αναπαραχθέντων Τα σχόλια είναι απενεργοποιημένα Απόκρυψη Χαμηλή ποιότητα (μικρότερο) @@ -681,7 +676,6 @@ Καρφιτσωμένο σχόλιο Το LeakCanary δεν είναι διαθέσιμο Εξ\' ορισμού ExoPlayer - Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής Ειδοποιήσεις %s νέα ροή @@ -714,9 +708,6 @@ Άγνωστος τύπος αρχείου Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής - Εμφάνιση μελλοντικών αντικειμένων - Απόκρυψη θεαθέντων - Απόκρυψη μελλοντικών αντικειμένων Συχνές ερωτήσεις Προβολή στην ιστοσελίδα Εάν αντιμετωπίζετε προβλήματα με τη χρήση της εφαρμογής, φροντίστε να ελέγξετε αυτές τις απαντήσεις σε συνήθεις ερωτήσεις! @@ -741,4 +732,36 @@ Θέλετε να καταργήσετε όλες τις διπλότυπες ροές σε αυτήν τη λίστα αναπαραγωγής; Αφαίρεση διπλοτύπων Θεαθέντα μερικώς + Επιλέξτε χειρονομία για το αριστερό μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια αριστερής χειρονομίας + Επιλέξτε χειρονομία για το δεξί μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια δεξιάς χειρονομίας + Φωτεινότητα + Ένταση + Καμία + Προτίμηση πρωτότυπου ήχου + Επιλογή του πρωτότυπου κομματιού ήχου ανεξάρτητα από τη γλώσσα + Προτίμηση του περιγραφικού ήχου + Ήχος: %s + Κομμάτι ήχου + Ένα κομμάτι ήχου θα πρέπει να υπάρχει ήδη σε αυτήν τη ροή + Επιλογή ήχου για εξωτερικές συσκευές αναπαραγωγής + Άγνωστο + Ρυθμίσεις ExoPlayer + Διαχειριστείτε ορισμένες ρυθμίσεις του ExoPlayer. Αυτές οι αλλαγές απαιτούν επανεκκίνηση του προγράμματος αναπαραγωγής για να τεθεί σε ισχύ + Χρησιμοποιήστε την δυνατότητα εναλλακτικού αποκωδικοποιητή του ExoPlayer + Ενεργοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με την προετοιμασία του αποκωδικοποιητή, η οποία επιστρέφει σε αποκωδικοποιητές χαμηλότερης προτεραιότητας εάν αποτύχει η προετοιμασία του πρωτεύοντος αποκωδικοποιητή. Αυτό μπορεί να έχει ως αποτέλεσμα κακή απόδοση αναπαραγωγής από ότι όταν χρησιμοποιείτε κύριους αποκωδικοποιητές + Χρησιμοποιείτε πάντα τον εναλλακτικό τρόπο ρύθμισης της επιφάνειας εξόδου βίντεο του ExoPlayer + Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση. +\n +\nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη + %1s %2s + αρχικό + μεταγλωττισμένο + περιγραφικό + Αλλάξτε το μέγεθος του διαστήματος φόρτωσης σε προοδευτικά περιεχόμενα (προς το παρόν %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική τους φόρτωση + Επιλογή ήχου με περιγραφές για άτομα με προβλήματα όρασης, εάν είναι διαθέσιμος + Μετακινήστε τον επιλογέα κύριας καρτέλας στο κάτω μέρος + Θέση κύριων καρτελών + Το media tunneling απενεργοποιήθηκε από προεπιλογή στη συσκευή σας, επειδή το μοντέλο της συσκευής σας είναι γνωστό ότι δεν το υποστηρίζει. \ No newline at end of file diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index b1c3d0187fe..c8cc728b527 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -80,4 +80,9 @@ Published on %1$s Report this error via e-mail Select your favorite night theme – %s + No stream player found. Install VLC\? + Install + Okay + Open in browser + No stream player found (you can install VLC to play it). \ 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 b52cfe99f61..a3a7a6af430 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,10 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Kontrolo de volumena gesto - Uzi gestojn por kontroli la volumon - Kontrolo de gesto de brilo - Uzi gestojn por kontroli la brilon Ĝisdatigoj Dosiero forviŝita Sciigo por ĝisdatigi apon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 4d078500af6..7f65c87d76b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,10 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Control de volumen por gestos - Usar gestos para controlar el volumen del reproductor - Control de brillo por gestos - Usar gestos para controlar el brillo del reproductor Actualizaciones Eventos Notificación de actualización de la aplicación @@ -641,14 +637,13 @@ Error al cargar el muro Desde Android 10 solo el \'Sistema de Acceso al Almacenamiento\' es soportado Se le preguntará dónde guardar cada descarga - Deshabilitar el túnel de medios si experimenta una pantalla negra o interrupciones en la reproduccción de videos + Desactiva la tunelización de los medios si experimentas una pantalla negra durante la reproducción o si la visualización de la imagen es intermitente. Deshabilitar el túnel de medios Aún no se ha seleccionado ninguna carpeta de descargas, elija la carpeta de descargas por defecto ahora Anfitrión Apagado Encendido Modo tableta - Mostrar elementos ya vistos No mostrar Baja calidad (más pequeño) Alta calidad (más grande) @@ -696,7 +691,6 @@ Comentario fijado LeakCanary no está disponible ExoPlayer valor por defecto - Cambie el tamaño del intervalo de carga (actualmente %s). Un valor más bajo puede acelerar la carga inicial de video. Los cambios requieren un reinicio del reproductor Notificaciones Nuevos streams Notificación del reproductor @@ -747,10 +741,7 @@ Elija la calidad para reproductores externos Formato desconocido Calidad desconocida - Mostrar elementos futuros Tamaño del intervalo de carga de reproducción - Ocultar los elementos mirados - Ocultar elementos futuros Ver en la página web Preguntas frecuentes Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes! @@ -775,6 +766,38 @@ Eliminar los duplicados Completamente visto Parcialmente visto + Acción del gesto en la izquierda + Acción del gesto a la derecha + Brillo + Volumen + Ninguno + Elige un gesto para la mitad izquierda de la pantalla del reproductor + Elige un gesto para la mitad derecha de la pantalla del reproductor + Prefiero el audio original + Selecciona la pista de audio original independientemente del idioma + Prefiero un audio descriptivo + Selecciona una pista de audio con descripciones para personas con discapacidad visual, si está disponible + Audio: %s + Pista de audio + Ya debería existir una pista de audio en esta transmisión + Selecciona una pista de audio para reproductores externos + Desconocido + Utilice la función de respaldo del decodificador de ExoPlayer + Utiliza siempre la configuración de ExoPlayer para la interfaz de salida del video como una solución alternativa + %1s %2s + original + doblado + descriptivo + Cambia el tamaño del intervalo de carga en contenidos progresivos (actualmente %s). Un valor más bajo puede acelerar la carga inicial + Ajustes para ExoPlayer + Gestiona algunos ajustes de ExoPlayer. Estos cambios requieren reiniciar el reproductor para que surtan efecto + Habilite esta opción si tiene problemas con la inicialización del decodificador recurriendo a decodificadores de menor prioridad si el decodificador principal no se inicializa. Esto puede dar como resultado un rendimiento de reproducción más bajo que cuando se usan decodificadores primarios + Esta solución alternativa libera los códecs de video y los vuelve a instanciar cuando cambia la máscara, en lugar de configurar la máscara directamente en el códec. ExoPlayer ya usa esta configuración en algunos dispositivos con este problema y solo afecta a Android 6 y versiones posteriores +\n +\nHabilitar esta opción puede evitar errores de reproducción al cambiar el reproductor de video actual o cambiar al modo de pantalla completa + Posición de las pestañas principales + Mover el selector de la pestaña principal a la parte inferior + Como se sabe que este dispositivo no es compatible con la tunelización de medios, esta función está desactivada de forma predeterminada. SponsorBlock Ver Sitio Web diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 9ec65ce9984..dc2f7015828 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,10 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Helitugevuse juhtimine viibetega - Kasuta viipeid helitugevuse reguleerimiseks - Ereduse reguleerimine viibetega - Kasuta viipeid heleduse reguleerimiseks Uuendused Sündmused Fail kustutati @@ -564,7 +560,7 @@ Piira allalaadimiste järjekorda Faili kustutamisega läks ka tööjärg kautsi Faili töötlemisel NewPipe lõpetas töö - Lülita meedia tunneldamine välja juhul, kui esitamisel tekib must ekraan või pildi kuvamine on katkendlik + Lülita meedia tunneldamine välja juhul, kui esitamisel tekib must ekraan või pildi kuvamine on katkendlik. Lülita meedia tunneldamine välja Vaheta teenust, hetkel on kasutusel: NewPipe hetkel sellist võimaluist ei toeta. @@ -613,7 +609,6 @@ Saadaval mõnedes teenustes. See on tavaliselt palju kiirem, kuid võib tagastada piiratud koguse elemente ja sageli osalise informatsiooni (nt. puudub kestus, elemendi tüüp, laiv olek) Sa saad nüüd valida kirjelduse tekstist. Pane tähele, et valikurežiimis võib leht vilkuda ja lingid ei pruugi olla klõpsatavd. Autor: %s - Kuva vaadatud üksused Keela kiire režiim Luba kiire režiim Hangi võimalusel spetsiaalsest voost @@ -681,7 +676,6 @@ Esiletõstetud kommentaar LeakCanary pole saadaval ExoPlayer\'i vaikimisi väärtused - Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem. Muudatuste jõustamine eeldab rakenduse uuesti käivitamist Meediamängija teavitused Teavitused pole kasutusel Kontrollimise sagedus @@ -714,9 +708,6 @@ Protsent Pooltoon Taasesituseks vajalike andmete laadimise samm - Näita tulevasi üksuseid - Peida tulevased üksused - Peida vaadatud üksused Korduma kippuvad küsimused Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas! Edasi loe veebisaidist @@ -741,4 +732,36 @@ Tulemas Lõpuni vaadatud Osaliselt vaadatud + Toiming viipel vasakul poolel + Helitugevus + Määratlemata + Vali viibe meediamängija ekraani vasaku poole jaoks + Eredus + Vali viibe meediamängija ekraani parema poole jaoks + Toiming viipel paremal poolel + Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem + Eelista algset heliriba + Sõltumata keelevalikutest eelista esmaseks määratud heliriba + Eelista kirjeldavat heliriba + Eelista nägemispuudega inimeste jaoks koostatud heliriba, kui selline on olemas + Heli: %s + Selles meediavoos peaks heliriba juba olemas olema + Kasuta ExoPlayer\'i alternatiivset dekooderit + Kasuta alati ExoPlayer\'i video väljundpinna seadistamise lahendust + %1s %2s + algne + dubleeritud + kirjeldav + Heliriba + Vali heliriba väliste meediamängijate jaoks + Teadmata + ExoPlayer\'i seadistused + Järgnevas saad hallata mõningaid ExoPlayer\'i seadistusi. Need muudatused vajavad jõustumiseks meediamängija uuesti käivitamist + Kasuta seda võimalust, kui põhidekooder ei käivitu korralikult. Selle asemel laaditakse alternatiivne dekooder, kuid tulemuseks võib olla kehvem taasesituse kvaliteet + Video väljundpinna muutumisel see alternatiivne lahendus eemaldab videokodekid kasutusest ja laadib nad uuesti ega ürita videokodeke uue väljundpinnaga sobitada. See seadistus toimib vaid Android 6 ja uuemates versioonides ning mõne seadme puhul on juba automaatselt kasutusel +\n +\nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel + Tõsta põhiline vahekaartide valija alla äärde + Vahekaartide põhiline asukoht + Kuna on teada, et see seade ei toeta meedia tunneldamist, siis on see funktsionaalsus vaikimisi välja lülitatud. \ 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 946de5363bb..c8d16b698da 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,10 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Keinuen bidezko bolumenaren kontrola - Erabili keinuak erreproduzigailuaren bolumena kontrolatzeko - Keinuen bidezko distiraren kontrola - Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak Gertaerak Fitxategia ezabatu da @@ -628,7 +624,6 @@ Pribatutasuna %s arrazoi hau ematen du: Kontua ezabatu da - Bistako elementuak erakustea Jario azkarrak ez du honi buruz informazio gehiagorik ematen. Adin muga Miniaturaren URL-a @@ -690,7 +685,6 @@ Kanal honetara harpidetu zara , Txandakatu denak - Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiaraztea behar du Harpidetzen jario berriei buruz jakinarazi Ezabatu deskargatutako fitxategi guztiak biltegitik\? Harpidetzentzako jario berrien jakinarazpenak @@ -713,10 +707,7 @@ Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik Formatu ezezaguna Kalitate ezezaguna - Erakutsi etorkizuneko elementuak Hautatu kanpoko erreproduzigailuen kalitatea - Ezkutatu etorkizuneko elementuak - Ezkutatu ikusitako elementuak Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. Webgunean ikusi Akatsa arbelera kopiatzean diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index fe5750dd962..3d8e8da9b29 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,10 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - کنترل اشاره ای صدا - از اشارات برای کنترل حجم صدا استفاده شود - کنترل روشنایی اشاره ای - از اشارات برای کنترل روشنایی استفاده شود بازگردانی چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: چالش ری‌کپچا @@ -559,7 +555,6 @@ کیفیت پایین (کوچک‌تر) کیفیت بالا (بزرگ‌تر) نظرها از کار افتاده‌اند - نمایش موارد دیده‌شده خطا در بار کردن خوراک از کار انداختن تونل‌زنی رسانه نمایش جزییات کانال @@ -680,7 +675,6 @@ خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده لیک‌کاناری موجود نیست - تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند پیش‌گزیدهٔ اگزوپلیر آگاهی‌ها بار کردن جزییات جریان… @@ -714,9 +708,6 @@ قالب ناشناخته کیفیت ناشناخته اندازهٔ دورهٔ بار کردن پخش - نمایش موارد آینده - نهفتن موارد آینده - نهفتن موارد دیده شده سوالات متداول اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید! نمایش در وبسایت diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index fcd0cb609e8..ef84871e22a 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -391,10 +391,6 @@ Tietojen tyhjennys Jatka toistoa Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä - Käytä eleitä ohjataksesi soittimen kirkkautta - Kirkkauden eleohjaus - Käytä eleitä ohjataksesi soittimen äänenvoimakkuutta - Äänenvoimakkuuden eleohjaus Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? @@ -629,7 +625,6 @@ Kategoria Salli tekstin valinta kuvauksessa Tili suljettu - Näytä katsotut kohteet Tekijän käyttäjätili on suljettu. \nNewPipe ei pysty lataamaan tätä syötettä tulevaisuudessa. \nHaluatko poistaa kanavan tilauksesta\? @@ -681,4 +676,9 @@ Näytä virheen ponnahdusilmoitus Uudet syötteet Ilmoitukset + Käytä aina ExoPlayerin videolähtöpinnan asetusta + kuvaileva + dubattu + %1s %2s + alkuperäinen \ No newline at end of file diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index c66d1db759f..4cafaff85bd 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -48,7 +48,6 @@ Pangalawang action button Pangatlong action button Pinapayagan ng di-saktong seek ang player na mag-seek sa mga posisyon nang mabilis ngunit na may pinababang kasaktuhan. Di ito gagana sa pag-seek nang 5, 15, o 25 segundo. - Baguhin ang laki ng pagitan na ilo-load (kasalukuyang %s). Maaaring mapabilis ang unang pag-load sa video kung mababa ito. Kailangang i-restart ang player para gumana ang pagbabago. Patayin para mapigilan ang pag-load sa mga thumbnail, para makatipid ng data at paggamit sa memory. Lilinisin ang parehong image cache na nasa memory at nasa disk Piliin ang mga mungkahing ipapakita habang naghahanap Patayin para itago ang paglalarawan ng video at karagdagang impormasyon @@ -79,7 +78,6 @@ Nalinis na ang cache ng metadata Kusang ipila ang susunod na stream Ipagpatuloy na tapusin (di umuulit) ang pila sa pamamagitan ng pagdagdag ng isang katulad na stream - Gumamit ng gesture para kontrolin ang volume ng player Mga mungkahi sa paghahanap Itago ang mga hinanap nang lokal Kasaysayan ng napanood @@ -90,9 +88,6 @@ Ipakita ang pananda ng posisyon ng pag-play sa mga listahan Mga posisyon sa listahan Kasaysayan ng mga hinanap - Gumamit ng gesture para kontrolin ang liwanag ng player - Kontrolin ang liwanag gamit gesture - Kontrolin ang volume gamit gesture Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ea891723b96..6a129cc9878 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -257,7 +257,7 @@ Le nom du fichier ne peut pas être vide Une erreur est survenue : %1$s Télécharger le flux - Ajout automatique du flux suivant à la file + Ajout automatique du flux suivant à la file de lecture Continue la file de lecture (non répétitive) en ajoutant un flux lié Débogage Remplir @@ -337,10 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Contrôle gestuel du volume - Utiliser des gestes pour contrôler le volume du lecteur - Contrôle gestuel de la luminosité - Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour Fichier supprimé Notification de mise à jour de l’application @@ -556,7 +552,7 @@ Démarrer la lecture automatiquement — %s Liste de lecture Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \? - Ajout automatique à la file + Ajout auto. à la file La file de lecture du lecteur actif sera remplacée Confirmer avant de supprimer une file de lecture Rien @@ -607,7 +603,7 @@ Cette vidéo est soumise à une limite d’âge. \nEn raison des nouvelles politiques de YouTube concernant les vidéos soumises à une limite d’âge, NewPipe ne peut accéder à aucun de ses flux vidéo et ne peut donc pas les lire. Radio - Tendances + Présentés Résoudre Automatique (thème de l’appareil) Sélectionne votre thème de nuit favori — %s @@ -642,7 +638,6 @@ Inactif Actif Mode tablette - Afficher les éléments visionnés Le compte de l’auteur a été résilié. \nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. \nSouhaitez-vous vous désabonner de cette chaîne \? @@ -666,18 +661,18 @@ Téléchargement terminé - %s Téléchargements terminés - %s Téléchargements terminés + %s téléchargements terminés + %s téléchargements terminés Balayez un élément pour le supprimer Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran Lancer le lecteur principal en plein écran - Placer en suivant dans la file - Placé en suivant dans la file + Ajouter à la file de lecture + Ajouté à la file de lecture Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… - Vérifier les mises à jours + Vérifier les mises à jour Nouveaux éléments du flux Faire planter le lecteur Afficher « Faire planter le lecteur » @@ -694,7 +689,6 @@ \nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement Commentaire épinglé LeakCanary n\'est pas disponible - Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos. Changer cette valeur nécessite de redémarrer le lecteur Valeur par défaut d’ExoPlayer Nouveaux flux Configurer la notification du flux en cours de lecture @@ -721,17 +715,14 @@ Tout basculer Pourcent Demi-ton - Les flux qui ne sont pas encore supportés ne sont pas montrés - Aucun flux audio n\'est disponible pour les lecteurs externes + Les flux qui ne sont pas encore pris en charge ne sont pas montrés + Aucun flux audio n’est disponible pour les lecteurs externes Sélectionner la qualité pour les lecteurs externes Format inconnu Qualité inconnue - Le flux séléctionné n\'est pas supporté par les lecteurs externes - Aucun flux vidéo n\'est disponible pour les lecteurs externes + Le flux sélectionné n’est pas pris en charge par les lecteurs externes + Aucun flux vidéo n’est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture - Afficher les éléments à venir - Masquer les éléments visionnés - Masquer les éléments à venir Foire aux questions Voir sur le site web Si vous avez des difficultés à utiliser l\'application, consultez les réponses aux questions les plus fréquentes ! @@ -744,16 +735,47 @@ Cette option est disponible seulement si %s est sélectionné pour le thème Les listes de lecture grisées contiennent déjà cet élément. Carte - Utile si vous utilisez un casque avec des boutons dysfonctionnels, par exemple + Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels Effacer les doublons - Effacer les doublons \? - Voulez-vous retirer tous les doublons de cette liste \? + Effacer les doublons \? + Voulez-vous retirer tous les doublons de cette liste \? Afficher les flux suivants Entièrement vu Partiellement vu À venir - Ignorer les évènements des boutons média des périphériques + Ignorer les évènements des boutons média physiques Doublon ajouté %d fois Afficher/Cacher les flux Enlever la miniature permanente + Choisir le geste pour la moitié gauche de l’écran du lecteur + Action du geste vers la gauche + Choisir le geste pour la moitié droite de l’écran du lecteur + Volume + Aucune + Action du geste vers la droite + Luminosité + Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos + Préférence pour l\'audio original + Sélectionner la piste audio originale quelle que soit la langue + Préférer l\'audio descriptif + Audio : %s + Piste audio + Une piste audio doit déjà être présente dans ce flux + Inconnue + Paramètres d’ExoPlayer + Gérez certains paramètres d\'ExoPlayer. Ces modifications nécessitent un redémarrage du lecteur pour être prises en compte + Utiliser la fonctionnalité de repli du décodeur d\'ExoPlayer + Toujours utiliser la solution de contournement de définition de surface de sortie vidéo d\'ExoPlayer + %1s %2s + original + doublée + descriptif + Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. +\n +\nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran + Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible + Sélectionner la piste audio pour les lecteurs externes + Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires + Déplacer le sélecteur d\'onglet principal en bas + Position des onglets principaux \ 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 7aafe4e7e8d..e2ab9596bad 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -41,7 +41,7 @@ Mostrar resolucións máis altas Só algúns dispositivos poden reproducir vídeos en 2K/4K Reproducir co Kodi - Quere instalar o aplicativo Kode que falta\? + Quere instalar o aplicativo Kore que falta\? Mostrar a opción «Reproducir co Kodi» Mostrar unha opción para reproducir o vídeo co Kodi Media Center Audio @@ -333,7 +333,6 @@ Minimizar o reprodutor popup Limitado Só son compatibles os URLs HTTPS - Control por xestos do volume Desactiva para agochalos comentarios Retomar a reprodución Páxina das listas de reprodución @@ -454,7 +453,6 @@ A actualización de NewPipe está dispoñible! Automático Mostra os indicadores de posición de reprodución nas listas - Use xestos para controlar o brillo do reprodutor Rede Lista Modo de visualización da lista @@ -530,8 +528,6 @@ Eliminar datos Posicións nas listas Restaurar a última posición de reprodución - Control do xesto de brillo - Use xestos para controlalo volume do reprodutor Ensinalos comentarios Duración da busca rápida cara a adiante / cara atrás Elixir lapela @@ -606,7 +602,6 @@ Este contido é privado, polo que non pode ser transmitido nin descarregado polo NewPipe. Non posúe ningunha aplicación para abrir isto Usar miniaturas para a pantalla de bloqueo e para as notificacións - Mostrar elementos vistos Os comentarios están desactivados Mostrar contido potencialmente non apto para menores porque ten unha limitación de idade (como +18) Definir cor da notificación @@ -671,7 +666,6 @@ Procurar manualmente novas versións A procurar actualizacións… A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado - Cambial dimensión do intervalo de carga (actualmente %s). Un valor máis baixo pode alixeirala carga inicial do vídeo. Os cambios requiren un reinicio da aplicacion Procesando... Pode devagar un momento Crear unha notificación de erro Amosar fitas coloridas de Picasso na cima das imaxes que indican a súa fonte: vermello para a rede, azul para o disco e verde para a memoria @@ -713,10 +707,7 @@ Tamaño do intervalo de carregamento da reprodución As emisións seleccionadas non son soportadas polos reprodutores externos Non hai emisións de vídeo dispoñíbeis para reprodutores externos - Mostrar elementos próximos Non hai emisións de audio dispoñíbeis para reprodutores externos - Ocultar elementos próximos - Ocultalos elementos xa ollados Ver na páxina web Preguntas máis frecuentes Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! @@ -741,4 +732,30 @@ Completamente visto Parcialmente visto Proximamente + Escolla o xesto para a metade dereita da pantalla do reprodutor + Acción do xesto para a dereita + Acción do xesto na esquerda + Brillo + Volume + Ningún + Audio: %s + Faixa de audio + Xa debe existir unha faixa de audio nesta emisión + Selecione a faixa de áudio para reprodutores externos + Descoñecida + Configuracións ExoPlayer + Xestione algunhas configuracións de ExoPlayer. É necesario reiniciar o reprodutor para aplicar os cambios + Use a función fallback do decodificador do ExoPlayer + Habilite esta opción se ten problemas na inciciación do decodificador. Usaranse decodificadores de menor prioridade se os primarios fallan. Isto pode resultar nun menor rendemento comparado co dos primarios + Usar sempre Explayer como alternativa de saída de vídeo + %1s %2s + orixinal + dobrado + descritivo + Altera o tamaño do intervalo de carregamento progresivo (o actual é %s). Un valor menor pode acelerar o carregamento inicial do vídeo + Preferir o audio orixinal + Seleccionar o audio orixinal independentemente do idioma + Seleciona o audio con descrición para persoas con dificuldades de visión, se estar dispoñíbel + Prefirir o audio descritivo + Escolla o xesto para a metade esquerda da pantalla do reprodutor \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index ffd65b736c6..89b2fe48412 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,10 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - מחוות בקרת עצמת שמע - שימוש במחוות כדי לשלוט בעצמת השמע של הנגן - מחוות בקרת בהירות - שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים קובץ נמחק התראת עדכון יישומון @@ -560,7 +556,7 @@ אף פעם לא רק עם רשת אלחוטית להתחיל לנגן אוטומטית — %s - לנגן את התור + תור נגינה לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? סידור אוטומטי בתור התור מהנגן הפעיל יוחלף @@ -622,7 +618,7 @@ לפתור ערכת עיצוב לילית להציג את פרטי הערוץ - כדאי להשבית תיעול מדיה אם הופיעה תופעה של מסך שחור או גמגום בנגינת וידאו + כדאי להשבית תיעול מדיה אם הופיעה תופעה של מסך שחור או גמגום בנגינת וידאו. השבתת תיעול מדיה פנימי פרטי @@ -655,7 +651,6 @@ כבוי פעיל מצב מחשב לוח - הצגת פריטים שנצפו תגובות מושבתות לא להציג איכות נמוכה (קטן יותר) @@ -705,7 +700,6 @@ הערה ננעצה LeakCanary אינה זמינה ברירת מחדל של ExoPlayer - שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית. שינויים דורשים את הפעלת הנגן מחדש התראות על תזרימים חדשים להרשמה תדירות בדיקה נדרש חיבור לרשת @@ -740,9 +734,6 @@ בחירת איכות לנגנים חיצוניים תצורה לא מוכרת גודל משך טעינת נגינה - הצגת פריטים עתידיים - הסתרת פריטים במעקב - הסתרת פריטים עתידיים מיון הצגה באתר תשובות לשאלות נפוצות @@ -759,4 +750,44 @@ הכפיל נוסף %d פעמים התעלמות מאירועי כפתורי מדיה חומרתיים שימושי, למשל, אם יש לך אוזניות עם כפתורי חומרה מקולקלים + פעולת מחווה שמאלית + פעולת מחווה ימנית + עוצמת שמע + בלי + להסיר את כל השידורים הכפולים ברשימת הנגינה\? + נצפו חלקית + בקרוב + בהירות + נא לבחור מחווה לחצי השמאלי של מסך הנגן + נא לבחור מחווה לחצי הימני של מסך הנגן + הסרת כפילויות + להסיר כפילויות\? + נצפו במלואם + להציג את השידורים הבאים + להציג/להסתיר שידורים + להעדיף שמע מקורי + לבחור את רצועת השמע המקורית ללא תלות בשפה + להעדיף שמע מפורט + לבחור רצועת שמע עם תיאורים לכבדי ראייה אם ניתן + שמע: %s + רצועת שמע + רצועת שמע כבר אמורה להיות כחלק מהתזרים + לא ידועה + הגדרות ExoPlayer + להשתמש ביכולת הגיבוי של המפענח של ExoPlayer + מקורי + מדובב + בחירת רצועת שמע לנגנים חיצוניים + מפורט + ניהול חלק מהגדרות של ה־ExoPlayer שלך. השינויים האלו דורשים את הפעלת הנגן מחדש כדי להיכנס לתוקף + שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית + יש להפעיל את האפשרות הזאת אם נתקלת בבעיות עם אתחול מפענח, מה שגורם להנחתה למפענחים עם עדיפות נמוכה יותר אם אתחול המפענחים העיקריים נכשל. עלול לגרום לביצועי נגינה נחותים לעומת מפענחים ראשיים + תמיד להשתמש במעקף הגדרות משטח פלט הווידאו של ExoPlayer + המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד +\n +\nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא + מקום לשוניות ראשיות + להעביר את בורר הלשוניות הראשי לתחתית + %1s %2s + תיעול מדיה הושבת כברירת מחדל במכשיר שלך כיוון שדגם המכשיר ידוע בכך שאינו תומך בזה. \ 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 86e7a98d078..230c730d826 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -23,7 +23,7 @@ वीडियो और ऑडियो इतिहास और कैश बैकग्राउंड में चल रहा है - कोई दर्शक नहीं + कोई विऊ नहीं कोई वीडियो नहीं है न्यूपाइप के बारे में जाने तृतीय-पक्ष लाइसेंस @@ -58,7 +58,7 @@ उच्च गुणवत्ता स्तर दिखाएं केवल कुछ ही डिवाईस 2के/4के मे वीडियो चला सकते हैं कोडी मे चलाए - लापता Kode ऐप स्थापित करें\? + गैर- मौजूदा Kore ऐप स्थापित करें\? \"कोडी मे चलाएं\" वाला विकल्प दिखाएँ कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें प्रथम स्थापित ध्वनि फॉर्मेट @@ -123,7 +123,7 @@ पसंद नापसंद कोई परिणाम नहीं मिला - यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें + यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें और प्लेलिसट बनाकर उसमें वीडियो जोड़े वीडियो ऑडियो फिर से कोशिश करे @@ -136,8 +136,8 @@ %s सब्सक्राइबर्स - %s दर्शक - %s दर्शके + %s विऊ + %s विऊज़ %s वीडियो @@ -248,7 +248,7 @@ थंमनेल लोड करें तेज और अनिश्चित तलाश का प्रयोग करें अनिश्चित खोज से प्लेयर में कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता हैं। 5, 15 या 25 सेकंड की तलाश में यह काम नहीं करता - थंमनेल लोड करने, डेटा और मेमोरी उपयोग को रोकने के लिए बंद करें। इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को बदलता है + डेटा खपत, मेमोरी उपयोग की बचत और थंमनेल लोड होने से रोकने के लिए बंद करें। इस बदलाव से इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों मिट जाते हैं चित्र कैश मिटाया गया कैश मेटाडेटा मिटाएं कैश किए गए सभी वेबपेज का डेटा हटाएं @@ -280,7 +280,7 @@ \nन्यूपाइप की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। गोपनीयता नीति पढ़े क्या आप सेटिंग्स भी आयात करना चाहते है? - पसंदीदा \'खोलने\' की प्रक्रिया + तरजीही \'open\' एक्शन सामग्री खोलते समय डिफ़ॉल्ट कारवाही — %s अनुशीर्षक प्लेयर अनुशीर्षक के शब्दों का परिमाण और पृष्ठभूमि शैलियों को बदले। लागू करने के लिए ऐप को पुनः प्रारम्भ करना जरूरी है @@ -325,11 +325,7 @@ न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। अनसब्सक्राईब करें टैब चुने - ध्वनि नियंत्रण इशारा कतारबद्ध करें - वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे - रोशनी स्तर नियंत्रण के इशारे - वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट फाइल मिटा दी गयी ऐप अपडेट अधिसूचना @@ -420,10 +416,10 @@ \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है सेवा चुने, वर्तमान चुनाव : सामान्य कीओस्क - कोई नहीं देख रहा है + कोई दर्शक नहीं - %s आदमी देख रहा है - %s आदमी देख रहे है + %s दर्शक है + %s दर्शक हैं कोई नहीं सुन रहा है @@ -622,7 +618,6 @@ ऐप को क्रैश करें श्रेणी आपसे पूछा जाएगा कि प्रत्येक डाउनलोड को कहां सहेजना है - देखे गए आइटम दिखाएं थंमनेल यूआरएल ऑफ़ हमेशा अपडेट करें @@ -637,7 +632,7 @@ सैमीटोन डाउनलोड समाप्त - %s डाउनलोड समाप्त + %s डाउनलोडस समाप्त %d दिन @@ -654,7 +649,6 @@ क्या आप इस समूह को हटाना चाहते हैं\? नया फ़ीड - भविष्य आइटम दिखाएं नई फ़ीड आइटम फ़ीड संसाधित हो रही है … वेबसाइट खोलें @@ -663,8 +657,6 @@ ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - देखे गए आइटम छुपाएं - भविष्य आइटम छुपाएं कई बार पूछे प्रश्न वेबसाइट पर देखें आइटम हटाने के लिए स्वाइप करें @@ -676,10 +668,10 @@ लाइसेंस यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें! कतार में आगे जोड़ें - लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान आरंभिक वीडियो लोडिंग को गति दे सकता है। परिवर्तन के लिए प्लेयर को पुनः आरंभ करने की आवश्यकता होती है + प्रगतिशील सामग्री पर लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान उनकी आरंभिक लोडिंग को गति दे सकता है लीककैनरी उपलब्ध नहीं है एक त्रुटी हुई है, अधिसूचना देखें - यदि आप काली स्क्रीन या वीडियो प्लेबैक खड़खड़ाते हुए चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें + यदि वीडियो प्लेबैक पर आप काली स्क्रीन या रुक-रुक कर वीडियो चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें। छवियों के शीर्ष पर पिकासो रंगीन रिबन दिखाएँ जो उनके स्रोत को दर्शाता है: नेटवर्क के लिए लाल, डिस्क के लिए नीला और मेमोरी के लिए हरा गड़बड़ी की सूचना बनाएं इस डाउनलोड को पुनर्प्राप्त नहीं किया जा सकता @@ -741,4 +733,35 @@ स्ट्रीम दिखाएँ / छिपाएँ पूरा देखा आंशिक रूप से देखा गया + बाएँ इशारा क्रिया + चमक + आवाज + कोई नहीं + प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें + प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें + दाएँ इशारा क्रिया + मूल ऑडियो को प्राथमिकता दें + यदि उपलब्ध हो तो दृष्टिबाधित लोगों के लिए विवरण के साथ एक ऑडियो ट्रैक का चयन करें + वर्णनात्मक ऑडियो को प्राथमिकता दें + भाषा की परवाह किए बिना मूल ऑडियो ट्रैक का चयन करें + ऑडियो: %s + ऑडियो ट्रैक + बाहरी प्लेयर्स के लिए ऑडियो ट्रैक का चयन करें + अज्ञात + ExoPlayer सेटिंग्स + एक्सोप्लेयर के डिकोडर फॉलबैक फीचर का उपयोग करें + हमेशा ExoPlayer के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें + मूल + डब + वर्णनात्मक + एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए + इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती हैं। प्राथमिक डिकोडर का उपयोग करते समय इसके परिणामस्वरूप खराब प्लेबैक प्रदर्शन हो सकता है + कुछ ExoPlayer सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए किसी प्लेयर को पुनरारंभ करने की आवश्यकता होती है + सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है +\n +\nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है + मुख्य टैब की स्थिति + मुख्य टैब सिलेक्टर को नीचे ले जाएँ + %1s %2s + आपके डिवाइस पर मीडिया टनलिंग डिफ़ॉल्ट रूप से अक्षम कर दी गई थी क्योंकि यह ज्ञात है कि आपका डिवाइस मॉडल इसका समर्थन नहीं करता। \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index fa350501112..11ad99b933b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,10 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Kontrola glasnoće pomoću gesti - Koristi geste za upravljanje glasnoćom playera - Kontrola svjetline pomoću gesti - Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja Otkrivanje grešaka Obavijest o novoj verziji programa @@ -633,7 +629,6 @@ Onemogući biranje teksta u opisu Omogući biranje teksta u opisu Račun ukinut - Prikaži pogledane stavke Autorov račun je ukinut. \nNewPipe ubuduće neće moći učitavati ovaj feed. \nŽeliš li otkazati pretplatu na ovaj kanal\? @@ -725,9 +720,6 @@ Nijedan stream audiosnimaka nije dostupan za vanjske playere Nijedan video stream nije dostupan za vanjske playere Odaberi kvalitetu za vanjske playere - Prikaži buduće stavke Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka - Sakrij buduće stavke - Sakrij pogledane stavke \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6327aba2d99..90507786be0 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -51,9 +51,9 @@ Ez történt: Az Ön megjegyzése (angolul): Részletek: - Elnézet, valami balul sült el. + Elnézést, valami balul sült el. Elnézést, ennek nem kellett volna megtörténnie. - Hiba bejelentése e-mailben + Jelentés e-mailben Nem sikerült a letöltési menü beállítása Nem sikerült a videó URL aláírásának feloldása Újra @@ -332,10 +332,6 @@ Adatok törlése Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban - Gesztusok használata a fényerő szabályozásához - Fényerő gesztus - Gesztusok használata a lejátszó hangerejének szabályzásához - Hangerő gesztus Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le @@ -624,12 +620,11 @@ Lista feldolgozása… Egyes szolgáltatásoknál érhető el, általában sokkal gyorsabb, és korlátozott számú elemet adhat vissza, gyakran hiányos információkkal (például nincs hossz, elemtípus, vagy élő videó állapot) Fiók eltávolítva - Megjelölés megtekintettként + Megjelölés megnézettként Még nincs letöltési mappa beállítva, válassza ki az alapértelmezett letöltési mappát most Tekerősáv bélyegkép-előnézete Magas minőségű (nagyobb) Hiba a lista betöltésekor - Megnézett elemek megjelenítése Nyelv Támogatás Weboldal megnyitása @@ -681,7 +676,7 @@ Rögzített megjegyzés LeakCanary nem elérhető Lejátszó értesítés - Módosítsa a betöltési intervallum méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a videó kezdeti betöltését. A változtatásokhoz a lejátszó újraindítása szükséges + Módosítsa a progresszív tartalmak betöltési intervallumának méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a kezdeti betöltésüket. Az aktuális lejátszás konfigurálása értesítés Értesítések Új élő közvetítések @@ -714,15 +709,56 @@ Ismeretlen formátum Ismeretlen minőség Félhang - Jövőbeli elemek megjelenítése - Jövőbeli elemek elrejtése Gyakran ismételt kérdések Megtekintés a weboldalon Rendezés Ha problémája van az alkalmazás használatával, akkor nézze meg az ezekre a gyakori kérdésekre adott válaszokat! - Megnézett elemek elrejtése Gyors mód Feliratkozások importálása vagy exportálása a 3 pontos menüből Ön a Newpipe legfrissebb verzióját futtatja Nyomjon a %s letöltéséhez + Bal gesztus művelete + Jobb gesztus művelete + Fényerő + Hangerő + Egyik sem + A kiszürkített lejátszólisták már tartalmazzák ezt az elemet. + Állandó bélyegkép feloldása + Ismétlődések eltávolítása + Végignézve + Részben megnézve + Kártya + Ez a beállítás csak a(z) %s téma esetén érhető el + Hardveresmédiagomb-események figyelmen kívül hagyása + A következő közvetítések megjelenítése + Az eredeti hangsáv választása, a nyelvtől függetlenül + A látássérülteknek szóló leírást tartalmazó hangsáv választása, ha van ilyen + Válasszon gesztust a lejátszóképernyő bal feléhez + Nem sikerült a vágólapra másolás + Ismételt elem %d alkalommal hozzáadva + Közvetítések be/ki + Egy hangsáv már jelen van ebben a közvetítésben + Hangsáv kiválasztása a külső lejátszók számára + Ismeretlen + Közelgő + ExoPlayer beállítások + Az ExoPlayer néhány beállításának kezelése. A változások életbe lépéséhez újra kell indítani a lejátszót. + Az ExoPlayer dekódoló tartalék funkciójának használata + Engedélyezze ezt a beállítást, ha dekóder előkészítési problémái vannak, ami alacsonyabb prioritású dekóderekre váltást okoz, ha az elsődleges dekóderek előkészítése sikertelen. Ez rosszabb lejátszási teljesítményt eredményezhet, mint az elsődleges dekóderek használata. + Kerülőmegoldás: mindig az ExoPlayer videokimeneti felületének használata + Ez a kerülőmegoldás elengedi és újból előkészíti a videokodekeket, ha felületváltozás történik, ahelyett, hogy közvetlenül a kodeknél állítaná be a felületet. Ez már alapból használatban van egyes, az ezzel a problémával érintett eszközöknél, a beállításnak Android 6 vagy újabb esetén van hatása. +\n +\nA beállítás bekapcsolása megakadályozhatja a lejátszási hibákat, ha átváltja a jelenlegi videolejátszót, vagy teljes képernyőre vált. + %1s %2s + szinkronizált + leíró + Hasznos, ha olyan fülhallgatót használ, melyen meghibásodtak a fizikai gombok + Eredeti hang előnyben részesítése + Leíró hanganyag előnyben részesítése + Válasszon gesztust a lejátszóképernyő jobb feléhez + Hang: %s + Hangsáv + Eltávolítja az ismétlődéseket\? + Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? + eredeti \ No newline at end of file diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index aa847b2a472..d4ae5b45576 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -241,7 +241,6 @@ Private Aperir le sito web Per %s - Monstrar le videos futur Radio Create per %s \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 1c8c3f5bd4d..5c480e0a86a 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,10 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Kontrol gestur volume - Gunakan gestur untuk mengontrol volume pemutar - Kontrol gestur kecerahan - Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan Acara Berkas dihapus @@ -625,7 +621,6 @@ Nonaktif Aktif Mode tablet - Tampilkan item yang sudah ditonton Jangan tampilkan Kualitas rendah (lebih kecil) Kualitas tinggi (lebih besar) @@ -717,7 +712,6 @@ Gunakan API ReturnYouTubeDislike untuk menampilkan jumlah dislike untuk video. Ini hanya bekerja untuk video YouTube.\nPERHATIAN: Alamat IP Anda akan terlihat oleh API. Gunakan dengan risiko Anda sendiri! Langkah tempo Default ExoPlayer - Ubah ukuran interval pemuatan (saat ini %s). Nilai yang rendah mungkin dapat membuat pemuatan video awal lebih cepat. Perubahan membutuhkan pemutar dimulai ulang Memuat detail stream… Frekuensi pemeriksaan Dibutuhkan koneksi jaringan @@ -749,9 +743,6 @@ Pilih kualitas untuk pemain eksternal Format tidak diketahui Ukuran interval pemuatan playback - Tampilkan item mendatang - Sembunyikan item yang telah ditonton - Sembunyikan item mendatang Pertanyaan yang sering diajukan Jika Anda mengalami masalah menggunakan aplikasi, pastikan untuk melihat jawaban untuk pertanyaan yang umum! Tampilkan di situs web @@ -776,4 +767,35 @@ Hapus duplikat\? Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\? Tampilkan saluran berikut + Pilih gestur untuk bagian kiri dari layar pemutar + Tindakan gestur kiri + Tidak ada + Pilih gestur untuk bagian kanan dari layar pemutar + Tindakan gestur kanan + Kecerahan + Volume + Kelola beberapa pengaturan ExoPlayer. Perubahan ini mengharuskan pemain memulai ulang agar diterapkan + Aktifkan opsi ini jika Anda mengalami masalah inisialisasi dekoder, yang akan kembali ke dekoder dengan prioritas lebih rendah jika inisialisasi dekoder primer gagal. Hal ini dapat mengakibatkan performa pemutaran yang buruk dibandingkan saat menggunakan dekoder primer + Solusi ini melepaskan dan memasang kembali codec video ketika terjadi perubahan permukaan, alih-alih mengatur permukaan ke codec secara langsung. Sudah digunakan oleh ExoPlayer pada beberapa perangkat dengan masalah ini, pengaturan ini hanya berpengaruh pada Android 6 dan yang lebih tinggi +\n +\nMengaktifkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh + Ubah ukuran interval pemuatan pada konten progresif (saat ini %s). Nilai yang lebih rendah dapat mempercepat pemuatan awalnya + Lebih suka audio asli + Pilih trek audio asli apa pun bahasanya + Lebih suka audio deskriptif + Pilih trek audio dengan deskripsi untuk orang tunanetra jika tersedia + Suara: %s + Trek audio + Trek audio harus sudah ada dalam aliran ini + Pilih trek audio untuk pemutar eksternal + Tidak diketahui + Pengaturan ExoPlayer + Gunakan fitur fallback dekoder ExoPlayer + Selalu gunakan solusi pengaturan permukaan keluaran video ExoPlayer + asli + disulih suara + deskriptif + Pindahkan pemilih tab utama ke bawah + Posisi tab utama + %1s %2s \ No newline at end of file diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 0129ead5bab..e2721797128 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -580,8 +580,6 @@ Hraðstraumshamurinn veitir ekki frekari upplýsingar um þetta. Virkja hraðstraumsham Afvirkja hraðstraumsham - Sýna spiluð atriði - Fela spiluð atriði NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. @@ -610,7 +608,6 @@ Eyða sóttum skrám Viltu hreinsa niðurhalsferilinn eða eyða öllum sóttum skrám\? Engir myndstraumar eru í boði fyrir ytri spilara - Fela framtíðaratriði Eyða vefkökum reCAPTCHA Vefkökum reCAPTCHA eytt Stærð forhleðslu @@ -620,10 +617,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Hljóðstyrksbending - Nota bendingar til að stjórna hljóðstyrk spilara - Birtustigsbending - Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er Endurheimta síðustu spilunarstöðu Spilunarstöður í listum @@ -712,7 +705,6 @@ Valinn straumur er ekki studdur af ytri spilurum Engir hljóðstraumar eru í boði fyrir ytri spilara Veldu gæði fyrir ytri spilara - Sýna framtíðaratriði Ef þú átt í vandræðum með að nota forritið vertu viss um að skoða þessi svör við algengum spurningum! Algengar spurningar Skoða á vefsíðu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 820dcc2db72..645d4f44e44 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,10 +337,6 @@ Utenti Disiscriviti Scegli scheda - Gesti controllo volume - Utilizza i gesti per controllare il volume del lettore multimediale - Gesti controllo luminosità - Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato Notifiche per aggiornamenti dell\'app @@ -612,7 +608,7 @@ Automatico (tema del dispositivo) Tema notturno Mostra dettagli canale - Disattiva il tunneling multimediale se durante la riproduzione dei video si verificano schermate nere o irregolarità nell\'audio + Disattiva il tunneling multimediale se durante la riproduzione dei video si verificano schermate nere o irregolarità nell\'audio. Disattiva tunneling multimediale Interno Privato @@ -645,7 +641,6 @@ Disattivata Attiva Modalità tablet - Mostra elementi visti Non mostrare Qualità bassa (più piccola) Qualità alta (più grande) @@ -753,7 +748,6 @@ Più tardi Colore non valido Predefinito ExoPlayer - Cambia la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video. La modifica richiede il riavvio del lettore Notifiche di nuovi contenuti dalle iscrizioni Frequenza controllo Connessione di rete richiesta @@ -787,9 +781,6 @@ Qualità sconosciuta Formato sconosciuto Dimensione intervallo di caricamento della riproduzione - Mostra elementi futuri - Nascondi elementi visti - Nascondi elementi futuri Domande frequenti Se riscontri problemi nell\'utilizzo dell\'app, dai un\'occhiata alle risposte delle domande più comuni! Ordina @@ -811,9 +802,41 @@ Rimuovere tutti gli elementi doppi di questa playlist\? Mostra gli elementi seguenti Mostra/Nascondi elementi - Visto parzialmente - Visto completamente - Prossimamente + Visti parzialmente + Visti completamente + Elementi futuri + Azione gesto sinistro + Azione gesto destro + Luminosità + Volume + Scegli il gesto per la metà sinistra del riproduttore + Nessuno + Scegli il gesto per la metà destra del riproduttore + Modifica la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video + Preferisci audio originale + Seleziona la traccia audio originale indipendentemente dalla lingua + Preferisci audio descrittivo + Se disponibile, seleziona una traccia audio con descrizioni per ipovedenti + Audio: %s + Traccia audio + Seleziona traccia audio per lettori esterni + Gestisci alcune impostazioni di ExoPlayer. È necessario riavviare il riproduttore per applicarle + Sconosciuta + Impostazioni ExoPlayer + Usa la funzione di fallback del decoder di ExoPlayer + Usa sempre la soluzione alternativa per impostare la superficie di uscita video di ExoPlayer + %1s %2s + originale + doppiato + descrittivo + Per questo elemento dovrebbe già essere presente una traccia audio + Attivare questa opzione in caso di problemi di inizializzazione del decodificatore. Verranno usati decodificatori di priorità inferiore se l\'inizializzazione di quelli primari fallisce. Le prestazioni di riproduzione potrebbero essere inferiori rispetto all\'uso di quelli primari + Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive +\n +\nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero + Posizione delle schede principali + Sposta in fondo il selettore della scheda principale + Il tunneling multimediale è stato disabilitato per impostazione predefinita sul dispositivo in uso, poiché è noto che il modello del dispositivo non lo supporta. Riempitivi irrilevanti/battute Le scene riempitive sono aggiunte solo per riempire o per umorismo e non sono richieste per comprendere il contenuto principale del video. Anteprima/riepilogo diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e9b0798bbc1..66dc541f720 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,7 +16,7 @@ 動画ファイルをダウンロードするフォルダーを選択して下さい デフォルトの画質 Kodi で再生 - Kode をインストールしますか? + インストールされてない Kore アプリをインストールしますか? 「Kodi で再生」オプションを表示 Kodi メディアセンター経由で動画を再生するための設定を表示します 音声 @@ -170,7 +170,7 @@ バックグラウンド再生を開始 ポップアップ再生を開始 メイン再生に切り替え - 動画プレイヤーが見つかりません (VLCをインストールして再生できます)。 + 動画プレイヤーが見つかりませんでした(VLCをインストールすることで再生できます)。 デフォルトの地域設定 常に 一度だけ @@ -368,10 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - 音量のジェスチャー制御 - ジェスチャーを使用して、プレイヤーの音量を制御します - 明るさのジェスチャー制御 - ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました アプリの更新通知 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? @@ -437,7 +433,7 @@ インスタンスはすでに存在しています ローカル 最近追加された - 高評価 + 最も評価された 修復中 ダウンロードが修復できません インスタンスを選択 @@ -625,7 +621,6 @@ オン タブレットモード %s がこの理由を提示: - 視聴したアイテムを表示 表示しない 低品質 (小) 高品質 (大) @@ -688,7 +683,6 @@ 新しいストリーム 通知 現在再生しているストリームの通知を構成 - 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です 必要なネットワークの種類 パーセント 半音 @@ -701,9 +695,6 @@ 外部プレイヤーで利用可能な音声ストリームがありません 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 - 次のアイテムを表示する - 再生済みを隠す - 次のアイテムを隠す 並び替え ウェブサイトを表示 タップして%sをダウンロード @@ -728,4 +719,35 @@ 完全に視聴済み 一部視聴済み 今後 + 再生画面の左半分用にジェスチャーを選択 + 左のジェスチャー動作 + 再生画面の右半分用のジェスチャーを選択 + 右のジェスチャー動作 + 明るさ + 音量 + + ExoPlayer 設定 + ExoPlayer の設定を管理します。これらの変更を反映するにはプレイヤーの再起動が必要です + ExoPlayer のデコーダ フォールバック機能を使用する + 常に ExoPlayer の映像出力 サーフェス設定の解決策を使用する + 吹き替え + 音声解説 + 音声解説を優先する + 利用可能な場合に視覚障害者向けの音声解説トラックを選択する + オーディオ: %s + 不明 + 外部プレイヤー用のオーディオトラックを選択 + オリジナル + オリジナル音声を優先する + 言語に関係なくオリジナルのオーディオトラックを選択する + オーディオトラック + デコーダの初期化に問題がある場合は、このオプションを有効化してプライマリ デコーダ初期化失敗時に低い優先度のデコーダにフォールバックします。プライマリ デコーダ使用時よりパフォーマンスが悪化する可能性があります + この解決策は直接コーデックをサーフェスに設定する代わりに、サーフェスが変更された際に映像コーデックを開放し再インスタンス化します。すでにいくつかのデバイスでこの解決策が使用されていますが、Android 6 以降でのみ機能します +\n +\nこのオプションを有効化することでプレイヤーを切り替えたり、フルスクリーンに切り替えたりする際の再生エラーを防ぎます + 読み込み間隔を変更します。(現在 %s)この値を小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です + オーディオトラックは既にこのせせらぎに存在している必要があります + メインタブの場所 + メインタブセレクタを下に移動 + %1s %2s \ 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 6b518b2e207..2f68f9bc969 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -6,9 +6,6 @@ Riwayatmu biyen cuk Duduhke saran nalika nggoleki Goleki saran - Ngontrol kepadhangan ngaggo gesture - Kontrol kepadhangan nganggo gestur - Gunake gesture gawe ngontrol volum Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 9ba01e672f9..89c2193da63 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -1,7 +1,7 @@ ნაკადის პლეერი ვერ მოიძებნა (მის დასაკრავად შეგიძლიათ დააინსტალიროთ VLC). - "ნაკადის მოთამაშე ვერ მოიძებნა. დააინსტალირე VLC\?" + ნაკადის მოთამაშე ვერ მოიძებნა. დააყენეთ VLC\? გაუქმება გააზიარეთ როგორც გამოიყენეთ გარე ვიდეო დამკვრელი @@ -18,7 +18,7 @@ დაარტყა დამკვრელი ესკიზის ჩამოჭრა ასპექტის თანაფარდობაზე 1:1 თქვენ შეგიძლიათ აირჩიოთ მაქსიმუმ სამი მოქმედება კომპაქტურ შეტყობინებაში საჩვენებლად! - "შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით" + შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით დისტანციური ძიების შეთავაზებები გამორთეთ ვიდეოს აღწერილობისა და დამატებითი ინფორმაციის დასამალად თემა @@ -33,19 +33,18 @@ გააგრძელეთ დაკვრა გააგრძელეთ დაკვრა შეფერხებების შემდეგ (მაგ. სატელეფონო ზარები დაიწყეთ მთავარი მოთამაშე სრულ ეკრანზე - "URL-ის ამოცნობა ვერ მოხერხდა. სხვა აპით გახსნა\?" + URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით\? ნაგულისხმევი აუდიო ფორმატი აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები დაკვრის დატვირთვის ინტერვალის ზომა - "შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას" + შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას მოითხოვეთ დადასტურება რიგის გასუფთავებამდე - "არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს" + არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა ერთი მოთამაშიდან მეორეზე გადართვამ შესაძლოა შეცვალოს თქვენი რიგი გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება ძიების შეთავაზებები წაშალეთ ყველა ქეშირებული ვებგვერდის მონაცემები - გამოიყენეთ ჟესტები მოთამაშის ხმის გასაკონტროლებლად შემდეგი ნაკადის ავტომატური შეყვანა გააგრძელეთ დაკვრის რიგის (არაგანმეორებადი) დასრულება შესაბამისი ნაკადის დამატებით მეტამონაცემების ქეში წაშლილია @@ -84,12 +83,12 @@ გამოწერები ფონი ამომხტარი ფანჯარა - დამატება: + დამატება ვიდეოს ჩამოტვირთვის საქაღალდე გადმოწერილი ვიდეო ფაილები ინახება აქ აუდიოს ჩამოტვირთვის საქაღალდე უფრო მაღალი რეზოლუციის ჩვენება - დააინსტალიროთ დაკარგული Kode აპი\? + დავაყენო აუცილებელი Kore აპი\? აჩვენეთ \"დაუკარი კოდით\" ვარიანტი აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით @@ -116,15 +115,12 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - ხმის ჟესტების კონტროლი - სიკაშკაშის ჟესტების კონტროლი - გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად ნახვის ისტორია განაახლეთ დაკვრა აღადგინეთ დაკვრის ბოლო პოზიცია Ავტომატური ჩართვა - აჩვენეთ წვერი \"შეაჩერე რიგში\". + აჩვენეთ წვერი \"შეაჩერე რიგში\" რჩევის ჩვენება ფონზე ან ამომხტარ ღილაკზე დაჭერისას ვიდეოში \"დეტალები:\" URL მხარდაუჭერელია ნაგულისხმევი კონტენტის ქვეყანა @@ -223,7 +219,7 @@ NewPipe-ს შეექმნა შეცდომა, შეეხეთ შეტყობინებისთვის მოხდა შეცდომა, იხილეთ შეტყობინება უკაცრავად, ეს არ უნდა მომხდარიყო. - შეატყობინეთ ამ შეცდომის შესახებ ელფოსტით + ელფოსტით შეტყობინება დააკოპირეთ ფორმატირებული ანგარიში მოხსენება GitHub-ზე Ბოდიში, რაღაც არ არის რიგზე. @@ -292,7 +288,8 @@ ჰეშის გაანგარიშება გთხოვთ მოიცადოთ… კოპირებულია ბუფერში - ეს ნებართვა საჭიროა ამომხტარი ფანჯრის რეჟიმში გასახსნელად + ეს უფლება აუცილებელია +\nმხტუნარა რეჟიმში გასახსნელად 1 ელემენტი წაიშალა. reCAPTCHA გამოწვევა როდესაც მოგვარდება, დააჭირეთ შესრულებულია @@ -312,8 +309,8 @@ საიტი ეწვიეთ NewPipe ვებსაიტს დამატებითი ინფორმაციისა და სიახლეებისთვის. NewPipe-ის კონფიდენციალურობის პოლიტიკა - "NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. -\n NewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას." + NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. +\nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას. წაიკითხეთ კონფიდენციალურობის პოლიტიკა NewPipe-ის ლიცენზია წაიკითხეთ ლიცენზია @@ -539,8 +536,6 @@ მიიღეთ გამოყოფილი არხიდან, როცა ხელმისაწვდომია ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა - ნანახი ნივთების ჩვენება - ნანახი ნივთების დამალვა ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. @@ -557,7 +552,7 @@ ეს კონტენტი მიუწვდომელია თქვენს ქვეყანაში. ეს კონტენტი პირადია, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ანგარიში შეწყვეტილია - %s იძლევა ამ მიზეზს + %s იძლევა ამ მიზეზს: ეს კონტენტი ხელმისაწვდომია მხოლოდ მომხმარებლებისთვის, რომლებმაც გადაიხადეს, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. გამორჩეული რადიო @@ -595,14 +590,13 @@ აირჩიეთ ხარისხი გარე დამკვრელებისთვის უცნობი ფორმატი უცნობი ხარისხი - მომავალი ელემენტების ჩვენება - სამომავლო ნივთების დამალვა დალაგება ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა ჩართეთ YouTube-ის „შეზღუდული რეჟიმი“ - "ეს ვიდეო ასაკობრივი შეზღუდულია. -\n თუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში." + ეს ვიდეო ასაკობრივი შეზღუდულია. +\n +\nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში. ლაივი ეს ვიდეო ასაკობრივად შეზღუდულია. \n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას. @@ -619,7 +613,7 @@ გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები - რა:\\nმოითხოვეთ:\\შინაარსის ენა:\\nშინაარსის ქვეყანა:\\nაპლიკაციის ენა:\\nმომსახურება:\\nGMT დრო:\\პაკეტი:\\ვერსია:\\nOS ვერსია: + რა:\\nმოითხოვეთ:\\nშემცველობის ენა:\\nშემცველობის ქვეყანა:\\nაპლიკაციის ენა:\\nსერვისი:\\nGMT დრო:\\nპაკეტი:\\nვერსია:\\nOS ვერსია: ამტვირთველის ავატარის ესკიზი კომენტარები გამორთულია Შექმნა @@ -644,7 +638,7 @@ \n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“ \n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ \n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი -\n 7. [თუ .zip-ის იმპორტი ვერ მოხერხდა] ამოიღეთ. +\n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ მოედანი ახალი ნაკადების შეტყობინებები მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ. @@ -688,7 +682,7 @@ დამუშავება… შეიძლება რამდენიმე წუთი დასჭირდეს წაშალოთ ეს დასაკრავი სია\? მეხსიერების გაჟონვის ჩვენება - აღდგენა. + აღდგენა რიგი გამოწერების იმპორტი ვერ მოხერხდა შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს @@ -698,7 +692,7 @@ „%s“-ის არხის ჩატვირთვა ვერ მოხერხდა. ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი) გამოიყენეთ ესკიზი როგორც ჩაკეტილი ეკრანის ფონისთვის, ასევე შეტყობინებებისთვის - "როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). + როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). \n \n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას: \n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია. @@ -708,7 +702,7 @@ \n \n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით. \n -\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია." +\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია. ეს არის SoundCloud Go+ სიმღერა, ყოველ შემთხვევაში თქვენს ქვეყანაში, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \'%s\' ჩამოტვირთვის პარამეტრებში @@ -718,4 +712,32 @@ ახლა შეგიძლიათ აირჩიოთ ტექსტი აღწერილობაში. გაითვალისწინეთ, რომ გვერდი შეიძლება ციმციმდეს და ბმულები არ იყოს დაწკაპუნებული შერჩევის რეჟიმში. მხარდაჭერა აუდიო ნაკადები არ არის ხელმისაწვდომი გარე დამკვრელებისთვის + მარცხენა ჟესტის ქმედება + მარჯვენა ჟესტის ქმედება + სიკაშკაშე + ბუფერში კოპირების შეცდომა + ბარათი + გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან\? + ასლი დამატებულია %d-ჯერ + %s-ის გადმოსაწერად დაატყაპუნეთ + აპარატურული მედია ღილაკების მოვლენების გამოტოვება + ნაკადების ჩვენება/დამალვა + შემდეგი ნაკადების ჩვენება + სრულად ნანახი + ეს პარამეტრი ხელმისაწვდომია მხოლოდ როცა თემისთვის %s-ა მონიშნული + სასარგებლოა, მაგალითად, თუ იყენებთ ყურსაცვამდებს, რომლის ფიზიკური ღილაკებიც დაზიანებულია + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარცხენა ნახევრისთვის + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარჯვენა ნახევრისთვის + არაფერი + სწრაფი რეჟიმი + მომავალი + ხმა + ხელმისაწვდომია NewPipe-ის განახლება! + გამოწერების შეტანა/გამოტანა სამწერტილიანი მენიუდან + განაცრისფერებული დასაკრავი სიები ამ ელემენტს უკვე შეიცავენ. + თქვენი NewPipe-ის ვერსია უახლესია + დუბლიკატების წაშლა + მუდმივი მინიატურის მოხსნა + წავშალო დუბლიკატები\? + ნაწილობრივ ნანახი \ 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 c5c4ee46b21..41f2742ab27 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -228,10 +228,6 @@ Dîroka lêgerînê Dema ku lêgerînê pêşniyaran nîşan bidin Pêşniyarên lêgerînê - Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin - Kontrola tevgera ronahiyê - Tevgerên bikar bînin da ku hêjmara lîstikvan kontrol bikin - Kontrola tevgera deng Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml new file mode 100644 index 00000000000..a6b3daec935 --- /dev/null +++ b/app/src/main/res/values-kn/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 20ddac7762e..9ec68a23cff 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,7 +16,7 @@ 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 - 누락된 한국어 앱을 설치하시겠습니까\? + 누락된 Kore 앱을 설치하겠습니까\? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -73,9 +73,9 @@ 구독 구독중 구독 취소됨 - 구독을 변경할 수 없습니다 + 구독상태를 변경할 수 없었습니다. 구독을 업데이트할 수 없음 - 구독 + 구독목록 새로운 영상 백그라운드 팝업 @@ -189,7 +189,7 @@ 이곳에 추가 정확하지 않은 빠른 탐색 사용 정확하지 않은 탐색을 사용하면 정확도가 떨어지는 대신 더 빠르게 위치를 탐색할 수 있습니다. 5초, 15초 또는 25초 탐색 기능은 이 기능과 같이 동작하지 않습니다 - 다음 스트림을 자동 대기열에 추가 + 다음 스트림을 자동으로 대기열에 추가 이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생 기본 콘텐츠 국가 디버그 @@ -259,15 +259,15 @@ 이전 내보내기 구독 목록 가져오기 실패 구독 목록 내보내기 실패 - Google 테이크아웃에서 YouTube 구독 가져오기: + Google 테이크아웃에서 YouTube 구독목록 가져오기: \n \n1. 이 URL로 이동합니다: %1$s -\n2. 요청에 따라 로그인을 합니다 -\n3. \"모든 데이터 포함됨\"을 클릭한 다음 \"모두 선택 해제\"를 클릭한 후 \"구독정보\"만 선택하고 \"확인\"을 클릭합니다 +\n2. 요청에 따라 로그인 합니다 +\n3. \"모든 데이터 포함됨\"을 클릭한 뒤, \"모두 선택 해제\"를 클릭한 후 \"구독정보\"만 선택하고 \"확인\"을 클릭합니다 \n4. \"다음 단계\"를 클릭한 다음 \"내보내기 생성\"을 클릭합니다 \n5. \"다운로드\" 버튼이 나타나면 클릭합니다 \n6. 아래의 \"파일 가져오기\"를 클릭하고 다운로드한 .zip 파일을 선택합니다 -\n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/구독정보/구독정보.csv\")을 추출하고, 아래의 \"파일 가져오기\"를 클릭한 후 추출한 csv 파일을 선택합니다 +\n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/구독정보/구독정보.csv\")을 압축해제한 다음, 아래의 \"파일 가져오기\"를 클릭한 후 압축해제한 csv 파일을 선택합니다 URL 또는 ID를 입력하여 SoundCloud 프로필을 가져옵니다: \n \n1. 웹 브라우저에서 \"데스크톱 모드\"를 활성화합니다(모바일 장치에서는 사이트를 사용할 수 없습니다) @@ -318,10 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처 음량 조작 - 제스처를 사용하여 플레이어의 볼륨 제어 - 제스처 밝기 조작 - 제스처를 사용하여 플레이어의 밝기 제어 업데이트 트랙 사용자 @@ -339,8 +335,8 @@ 팝업 플레이어로 최소화 단계 초기화 - 저장된 탭을 읽을 수 없으므로, 기본 탭을 사용합니다 - 초기화 + 저장된 탭을 불러올 수 없었으므로, 기본 탭을 사용합니다 + 기본설정으로 되돌리기 초기 설정으로 복원하시겠습니까\? 구독자 수를 가져올 수 없습니다 메인 화면에 표시할 탭을 설정합니다 @@ -595,7 +591,6 @@ 해결 잠금 화면 배경과 알림 모두에 썸네일 사용 선택한 구독이 없습니다 - 시청 항목 표시 자동 대기열에 추가 %s 다운로드 완료 @@ -627,10 +622,10 @@ 지원 언어 연령 제한 - 개인 + 공개상태 라이센스 창작자의 마음 - 개인 + 비공개 비공개 썸네일 URL 호스트 @@ -663,12 +658,11 @@ 자동 (장치 테마) 고정된 댓글 추천 - 향후 항목 표시하기 알 수 없는 형식 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 스트림 작성자, 스트림 콘텐츠 또는 검색 요청에 대한 추가 정보가 있는 메타 정보 상자를 숨기려면 끄세요 - 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 비디오 로딩 속도가 빨라질 수 있습니다. 변경하려면 플레이어를 다시 시작해야 합니다 + 프로그레시브 콘텐츠의 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 로딩 속도가 빨라질 수 있음 충돌에 대해 논의하는 문제가 이미 존재하는지 확인하세요. 중복 티켓을 생성할 때 실제 버그를 수정하는 데 시간을 할애할 수 있습니다. 오류 알림 생성 구독 선택 @@ -702,8 +696,6 @@ 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. - 감시한 항목 숨기기 - 향후 항목 숨기기 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 웹사이트에서 보기 @@ -713,7 +705,7 @@ 최신 버전의 NewPipe를 실행 중입니다 %s를 다운로드하려면 탭하세요. 영구 썸네일 설정 해제 - 이 옵션은 테마로 %s을 선택한 경우에만 사용할 수 있습니다 + 이 옵션은 %s가 테마로 선택되었을 경우에만 사용할 수 있습니다 중복 추가 %d 번 회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다. 카드 @@ -728,4 +720,31 @@ 하드웨어 미디어 버튼 이벤트 무시 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 스트림 보이기/숨기기 + 플레이어 화면 왼쪽 절반에 대한 제스처 선택 + 원본 오디오 선호 + 언어에 관계없이 원본 오디오 트랙 선택 + 가능한 경우 시각 장애인을 위한 설명이 포함된 오디오 트랙 선택 + 설명이 포함된 오디오 선호 + 플레이어 화면 오른쪽 절반에 대한 제스처 선택 + 오른쪽 제스처 동작 + 밝기 + 왼쪽 제스처 동작 + 볼륨 + 없음 + 오디오: %s + 오디오 트랙 + 이 스트림에 오디오 트랙이 이미 존재해야 함 + 외부 플레이어용 오디오 트랙 선택 + 알 수 없음 + ExoPlayer 설정 + ExoPlayer 설정을 관리합니다. 이러한 변경 사항을 적용하려면 플레이어를 다시 시작해야 함 + ExoPlayer의 디코더 폴백 기능 사용 + 항상 ExoPlayer의 비디오 출력 표면 설정 해결 방법 사용 + 원본 + 더빙됨 + 설명 + 디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음 + 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 +\n +\n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 \ No newline at end of file diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 8867256243b..8d1ffbab84e 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,10 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - کۆنترۆڵی دەنگ بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان فایل سڕایەوە diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 64026f53c95..1c8ba59ae49 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -70,7 +70,7 @@ Negalima sutvarkyti atsisiuntimų meniu Programėlė/ vartotojo sąsaja nulūžo Atsiprašome, taip neturėjo įvykti. - Pranešti apie šią klaidą el. paštu + Pranešti el. paštu Atsiprašome, kažkas ne taip. Ataskaita Informacija: @@ -341,10 +341,6 @@ Išvalyti duomenis Sąraše rodyti atkūrimo vietos indikatorių Vietos sąraše - Naudoti gestus ryškumo valdymui - Ryškumo gesto valdymas - Naudoti gestus garsumo valdymui - Garsumo gesto valdymas Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę @@ -637,7 +633,6 @@ Dabar apraše galite pasirinkti tekstą aprašyme. Atminkite, kad puslapis gali mirgėti, o nuorodos gali būti nespustelėjamos, kai veikia pasirinkimo režimas. %s pateikia šią priežastį: Paskyra anuliuota - Rodyti peržiūrėtus elementus Greito srauto režimas nesuteikia daugiau informacijos apie tai. Autoriaus paskyra anuliuota. \n„NewPipe“ negalės įkelti šio kanalo ateityje. @@ -707,18 +702,16 @@ Gaukite pranešimą Dabar užsiprenumeravote šį kanalą - Rodyti būsimus elementus Reikalingas tinklo ryšys Transliacijos, kurių dar nepalaiko atsisiuntimo programa, nerodomos Nežinomas formatas - Slėpti būsimus elementus Bet koks tinklas Ištrinti visus atsisiųstus failus iš disko\? Grotuvo pranešimas Pranešimai apie naujas transliacijas prenumeratoms Naujos transliacijos Įkeliama išsami transliacijos informacija… - Pakeiskite pakrovimo intervalo dydį (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį vaizdo įrašo įkėlimą. Dėl pakeitimų reikia iš naujo paleisti grotuvą + Pakeiskite pakrovimo intervalo dydį progresiniam turiniui (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį įkėlimą Procentai Pustonis Atkūrimo pakrovimo intervalo dydis @@ -726,7 +719,6 @@ Pasirinktos transliacijos išoriniai grotuvai nepalaiko Išoriniams grotuvams garso transliacijos nepasiekiamos Pasirinkite kokybę skirtą išoriniams grotuvams - Slėpti peržiūrėtus elementus Pranešimai yra išjungti „ExoPlayer“ numatytasis Nežinoma kokybė @@ -738,4 +730,47 @@ Greitasis režimas Naudojate naujausią „NewPipe“ versiją Bakstelėkite, kad atsisiųstumėte %s + Ar norite pašalinti visus pasikartojančius srautus iš šio grojaraščio\? + Būsimas + Grojaraščiai jau turintys šį elementą išaktyvuoti. + Kartojasi pridėta %d kartus + Atjungti nuolatinę peržiūrą + Nepaisyti aparatinės įrangos media mygtukų įvykių + Naudinga naudojant ausines su sugedusiais fiziniais mygtukais + Pilnai peržiūrėta + Pageidaujama originalus garso takelis + Pasirinkti originalų audio takelį nepaisant kalbos nustatymo + Pageidaujama pasirinktinis garso takelis + Jei įmanoma, pasirinkti garso takelį su aprašymu žmonėms su klausos negalia + Pasirinkti gęstą kairei grotuvo ekrano pusei + Kairio gesto veiksmas + Pasirinkite gestą dešiniai grotuvo ekrano pusej + Garsas: %s + Audio takelis + Kortelė + Pašalinti besikartojančius + Pašalinti besikartojančius\? + Rodyti šiuos srautus + Iš dalies peržiūrėta + \"ExoPlayer\" nustatymai + Tvarkykite kai kuriuos \"ExoPlayer\" nustatymus. Kad šie pakeitimai įsigaliotų, grotuvą reikia paleisti iš naujo + Naudokite „ExoPlayer“ dekoderio atsarginę funkciją + Visada naudokite \"ExoPlayer\" vaizdo išvesties paviršiaus nustatymų apėjimą + Nepavyko nukopijuoti į iškarpinę + originalus + Dešinio gesto veiksmas + Ryškumas + Garsas + Nieko + Rodyti / slėpti srautus + Ši parinktis galima tik tada, kai %s pasirinkta kaip tema + Šiame sraute jau turėtų būti garso takelis + Pasirinkite garso takelį išoriniams grotuvams + Nežinomas + Šis apeinamasis sprendimas atlaisvina ir iš naujo nustato vaizdo kodekus, kai pasikeičia paviršius, užuot tiesiogiai nustatęs paviršių kodekui. Šis nustatymas jau naudojamas \"ExoPlayer\" kai kuriuose įrenginiuose, kuriuose buvo ši problema, šis nustatymas turi poveikį tik \"Android 6\" ir naujesniuose įrenginiuose. +\n +\nĮjungus šią parinktį gali būti išvengta atkūrimo klaidų, kai perjungiamas dabartinis vaizdo grotuvas arba pereinama į visą ekraną + dubliuotas + Įjunkite šią parinktį, jei kyla dekoderio inicializavimo problemų, o nepavykus inicializuoti pagrindinių dekoderių, grįžtama prie žemesnio prioriteto dekoderių. Dėl to atkūrimo našumas gali būti prastesnis nei naudojant pirminius dekoderius + aprašomasis \ No newline at end of file diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 5c5c7ba428c..c8d3221eba2 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -68,7 +68,7 @@ Atbalstiet Libre, viegla atskaņošana uz Android. Licences - Par + Par un BUJ Trešo pušu Licences Par NewPipe Lielākā daļa īpašo rakstzīmju @@ -155,8 +155,8 @@ Detaļas: Jūsu komentārs (Angliski): Kas:\\nRequest:\\nContent Valoda:\\nContent Valsts:\\nApp Valoda:\\nService:\\nGMT Laiks:\\nPackage:\\nVersion:\\nOS versija: - Notifikācijas video apstrādes progresam - Video haša notifikācija + Paziņojumi video apstrādes progresam + Video haša paziņojums Atcerēties pēdējo popup izmēru un pozīciju Atcerēties popup īpašības Noklusējuma popup izšķirtspēja @@ -169,7 +169,7 @@ Lūdzu, pārbaudiet, vai neviens cits jau nav iesniedzis jūsu kļūdu. Veidojot dublētas biļetes, jūs aizņemat laiku, ko mēs varētu izmantot, labojot citas kļūmes. Ziņot izmantojot GitHub Kopēt formatētu ziņojumu - Ziņojiet par šo kļūdu pa e-pastu + Ziņojiet pa e-pastu Piedotiet, tam nevajadzēja notikt. Dot atļauju rādīt pāri citām aplikācijām Vai jūs vēlaties atjaunot noklusējumus\? @@ -221,10 +221,10 @@ Pārslēgt uz Popup Pārslēgt uz Fonu [Nezināms] - Notifikācijas NewPipe versijām - Aplikācijas atjauninājuma notifikācija - Notifikācijas priekš NewPipe atskaņotāja - NewPipe Notifikācija + Paziņojumi par jaunām NewPipe versijām + Aplikācijas atjauninājuma paziņojums + Paziņojumi priekš NewPipe atskaņotāja + NewPipe paziņojums Fails Tikai Vienreiz Vienmēr @@ -243,7 +243,7 @@ Videoklipi Atskaņošanas saraksts Kanāli - Viss + Visi Kļūdas ziņojums Lejupielādes Lejupielādes @@ -306,7 +306,7 @@ Plūsmas atjaunināšanas biežuma slieksnis Straume Rādīt tikai nesagrupētus abonementus - Jauns + Jauna Vai vēlaties izdzēst šo grupu\? Tukšs grupas nosaukums @@ -441,7 +441,7 @@ Tendences © %1$s no %2$s zem %3$s Lejupielāde neizdevās - Rinda + Pievienot rindai Pausēts Gaida Pabeigts @@ -503,10 +503,6 @@ Meklēšanas vēsture Izvēlieties, kādus ieteikumus rādīt, rakstot meklēšanas joslā Meklēšanas ieteikumi - Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu - Spilgtuma kontrole, atskaņojot video - Velkot ar pirkstu, mainiet video atskaņošanas skaļumu - Skaļuma kontrole, atskaņojot video Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu @@ -536,7 +532,7 @@ Noklusējuma video formāts Noklusējuma audio formāts Audio - Ļaujiet Android pielāgot notifikācijas krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) + Ļaujiet Android pielāgot paziņojuma krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) Kopīgot Atvērt ar Atvērt pārlūkprogrammā @@ -546,20 +542,20 @@ Netika atrasts video atskaņotājs. Instalēt VLC\? Publicēts %1$s Nospiediet uz meklēšanas ikonas, lai sāktu. - Iekrāsot notifikāciju + Iekrāsot paziņojumu Nekas Ielādējas Sajaukt Atkārtot - Jūs varat izvēlēties tikai 3 darbības, kuras rādīs kompaktajā notifikācijā! - Rediģējiet katru notifikācijas darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā notifikācijā, izmantojot rūtiņas labajā pusē + Jūs varat izvēlēties tikai 3 darbības, kuras rādīs kompaktajā paziņojumā! + Rediģējiet katru paziņojuma darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā paziņojumā, izmantojot rūtiņas labajā pusē Piektā darbības poga Ceturtā darbības poga Trešā darbības poga Otrā darbības poga Pirmā darbības poga - Piemērot video attēlu, kuru rāda notifikācijā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) - Piemērot video attēlu 1:1 proporcijai + Apgriezt video attēlu, kuru rāda paziņojumā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) + Apgriezt video attēlu uz 1:1 proporciju Rādīt opciju atskaņot video ar Kodi mediju centru Rādīt \"Atskaņot ar Kodi\" opciju Instalēt trūkstošo Kode aplikāciju\? @@ -576,7 +572,7 @@ Pievienot Fons Izvēlieties Cilni - Saglabātie atskaņošanas saraksti + Saglabātie saraksti Abonementi Rādīt informāciju Nevarēja atjaunināt abonementu @@ -636,7 +632,6 @@ Ieslēgt teksta atlasīšanu video aprakstā Lejupielādes mape vēl nav iestatīta, izvēlieties noklusējuma lejupielādes mapi Pārvelciet objektus, lai tos noņemtu - Rādīt noskatītos video Lokālie meklēšanas ieteikumi Rādīt attēlu indikatorus Augstas kvalitātes (lielāks) @@ -676,11 +671,10 @@ Lejupielādes pabeigtas Tagad varat atlasīt tekstu video aprakstā. - Notifikācijas - Izmainīt ielādēšanas intervāla izmēru (pašlaik %s). Zemāka vērtība var paātrināt sākotnējo video ielādi. Izmainot vērtību, nepieciešams restartēt atskaņotāju. + Paziņojumi Avarēt atskaņotāju - Pielāgojiet pašlaik atskaņotās plūsmas notifikāciju - Atskaņotāja notifikācija + Pielāgojiet pašlaik atskaņotās plūsmas paziņojumu + Atskaņotāja paziņojums Jaunās tiešraides Radās kļūda, detalizētāku informāciju skatiet paziņojumā @@ -694,4 +688,49 @@ Kļūdas ziņojuma paziņojums Atskaņošanas ielādēšanas intervāla lielums NewPipe radās kļūdu, pieskarieties, lai ziņotu + Kreisā žesta darbība + Neizdevās kopēt starpliktuvē + Noņemt pastāvīgo sīktēlu + Pārbaudīt, vai nav jaunas tiešraides + Rāda avarēšanas iespēju, kad lietojat atskaņotāju + Dzēst dublikātus + Rādīt sekojošās tiešraides + Saraksti, kas atzīmēti pelēkā, jau satur šo objektu. + LeakCanary nav pieejams + Izveidot kļūdas paziņojumu + Jebkurš tīkls + Jums ir jaunākā NewPipe versija + Noderīgi, piemēram, lietojot austiņas ar bojātām pogām + Izvēlēties skaņu celiņu ar audio aprakstu cilvēkiem ar redzes traucējumiem, ja tāds ir pieejams + Ignorēt ierīces multimēdiju pogas + Izdzēst visus lejupielādētos failus\? + Jaunumi kanālā + Dot priekšroku oriģinālajai skaņai + Izvēlēties oriģinālo skaņu celiņu, neatkarīgi no valodas + Dot priekšroku skaņu celiņam ar audio aprakstu + Izvēlēties žestu kreisajai atskaņotāja ekrāna pusei + Izvēlēties žestu labajai atskaņotāja ekrāna pusei + Labējā žesta darbība + Spilgtums + Skaļums + Nekā + Importējiet vai eksportējiet abonementus 3-punktu izvēlnē + Ja Jums rodas problēmas ar lietotni, noteikti apskatiet šīs atbildes bieži uzdotiem jautājumiem! + Skatīt tīkla vietnē + Skaņa: %s + Skaņu celiņš + Ielādē straumes informāciju… + Dublikāts pievienots %d reizi(-es) + Rādīt \"avarēt atskaņotāju\" + Karte + Spiediet, lai lejupielādētu %s + Dzēst dublikātus\? + Vai vēlaties dzēst visus tiešraižu dublikātus šajā sarakstā\? + Rādīt/slēpt tiešraides + Ātrais režīms + Paziņot par jaunām tiešraidēm no abonementiem + Procenti + Pustonis + Paziņojumi par jaunām tiešraidēm + Pārbaužu biežums \ No newline at end of file diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 4039949c702..524c82aef81 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,10 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Гест за контрола на гласност - Користете гестови за подесување на гласноста - Гестови за контрола на осветленост - Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана Известување за ажурирање на апликација diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 2a61f4b0a49..29769acae37 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -325,10 +325,6 @@ അന്വേഷണ ചരിത്രം സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക സെർച്ച് നിർദ്ദേശങ്ങൾ - ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക - ആംഗ്യം ഉപയോഗിച്ച് വോള്യം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ വോള്യം നിയന്ത്രിക്കുക തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി @@ -627,7 +623,6 @@ താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ്‌ തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം. ഇതിന്റെ കാരണം %s നൽകും: അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു - കണ്ട ഐറ്റംസ് കാണിക്കുക ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല. സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു. \nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല. @@ -653,6 +648,7 @@ അറിയിപ്പുകൾ പ്ലേയർ അറിയിപ്പ് പുതിയ സ്ട്രീമുകൾ - ലോഡ് ഇടവേള മാറ്റുക (ഇപ്പൊൾ %s). കുറഞ്ഞ മൂല്യം വീഡിയോ വേഗത്തിൽ ലോഡ് ചെയ്യാൻ ഇടയാക്കാം. മാറ്റങ്ങൾ പ്രാഭല്യതിൽ വരുത്താൻ പ്ലേയർ പുനരാരംഭിക്കണം. പ്ലേയർ തകർക്കുക + യഥാർത്ഥ ശബ്ദത്തിന് പരിഗണന കൊടുക്കുക + ഭാഷ ഏതായാലും യഥാർത്ഥ ശബ്ദം തിരഞ്ഞെടുക്കുക \ No newline at end of file diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 24dcbfc867c..648849205ab 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,10 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Kontrol gestur volume - Gunakan gestur untuk melaraskan volume pemain - Kontrol gestur kecerahan - Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian Tunjukkan cadangan semasa mencari Sejarah carian diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d03ae7c5abb..da6193e9003 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -51,7 +51,7 @@ Innholdet er utilgjengelig Kunne ikke sette opp nedlastingsmeny Beklager, dette skal ikke skje. - Rapporter denne feilen via e-post + Rapporter via e-post Beklager, noe gikk galt. Rapporter Info: @@ -334,10 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Håndvendingskontroll for lydstyrke - Bruk håndvendinger for å kontrollere avspillerens lydstyrke - Håndvendingskontroll for lysstyrke - Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer Hendelser Fil slettet @@ -613,7 +609,6 @@ Skru på merking av tekst i beskrivelsen %s oppgav denne grunnen: Konto terminert - Vis avspilte elementer Kunne ikke laste inn informasjonskanal for «%s». Kunne ikke laste inn informasjonskanal Fra Android 10 er kun «lagringstilgangsrammeverk» støttet @@ -702,12 +697,9 @@ Du abonnerer nå på denne kanalen Strømmer som ennå ikke er støttet av nedlasteren, vises ikke Velg kvalitet for eksterne spillere - Vis fremtidige elementer - Skjul viste elementer Ingen videostrømmer er tilgjengelige for eksterne spillere Ukjent format Ukjent kvalitet - Skjul fremtidige elementer Ofte stilte spørsmål Vis på nettsiden Start sjekk etter nye strømmer @@ -731,4 +723,21 @@ Hurtigmodus Spillelistene som er utgrået inneholder allerede dette elementet. Duplikat lagt til %d gang(er) + Ignorer enhetens fysiske knapper + Lysstyrke + Velg håndvending for venstre halvdel av avspillerskjermen + Fullført + Velg håndvending for høyre halvdel av avspillerskjermen + Ingen + Fjern duplikater + Fjern alle duplikatstrømmer i denne spillelisten\? + Kommende + Venstre håndvendingshandling + Høyre håndvendingshandling + Lydstyrke + Fjern duplikater\? + Vis/skjul strømmer + Delvis sett + Nyttig hvis hodsettet ditt har knapper som fungerer dårlig + Vis følgende strømmer \ No newline at end of file diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 28207c58309..05c82808ee7 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,10 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - आवाज मात्रा नियन्त्रण गर्न इशाराको प्रयोग - प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग - चमक इशारा नियन्त्रण - प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू खोजी गर्दा सुझावहरू देखाउन खोज इतिहास diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 490b75bb8e2..bf77f9da317 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,10 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Veegbesturing voor volume - Gebruik gebaren om het volume van de speler aan te passen - Veegbesturing voor helderheid - Gebruik gebaren om de helderheid van de speler aan te passen Updates Gebeurtenissen Bestand verwijderd @@ -625,7 +621,6 @@ Nieuwe streams Meldingen over nieuwe streams voor abonnementen NewPipe meldt een fout, tik om te rapporteren - Verander het laadinterval (momenteel %s). Een lagere waarde kan het laden van video versnellen. Vereist een herstart van de speler. %s nieuwe stream %s nieuwe streams diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index bd901a26f06..5f111973b5e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kode-app niet gevonden. Deze installeren\? + Ontbrekende Kore-app installeren\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio @@ -50,7 +50,7 @@ Kan downloadmenu niet instellen Vind-ik-leuks Sorry, dit had niet mogen gebeuren. - Deze fout melden via e-mail + Melden via e-mail Sorry, er is iets fout gegaan. Melden Informatie: @@ -66,7 +66,7 @@ Downloads Foutrapport App/UI gecrasht - Wat:\\nVerzoek:\\nTaal van inhoud:\\nTaal van land:\\nTaal van Toepassing:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: + Wat:\\nVerzoek:\\nInhoudstaal:\\nInhoudsland:\\nApp-taal:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: Begin Pauzeren Verwijderen @@ -85,9 +85,9 @@ reCAPTCHA-uitdaging gevraagd Openen in pop-upmodus Alles - k - M - B + dznd. + mln. + mld. Deze machtiging is vereist om te \nopenen in pop-upmodus Speelt af in pop-upmodus @@ -135,8 +135,8 @@ Kijkgeschiedenis bijhouden Hervat afspelen Ga verder met afspelen na onderbrekingen (b.v. telefoongesprekken) - NewPipe Melding - Meldingen voor NewPipe speler + NewPipe + Meldingen voor de speler van NewPipe Geschiedenis Geschiedenis Speler @@ -144,7 +144,7 @@ Geschiedenis en cache Ongedaan maken Geen resultaten - Niets, maar dan ook niets te zien + Enkel krekels hier Geen abonnees %s abonnee @@ -181,7 +181,7 @@ Details Audio-instellingen Houd ingedrukt om toe te voegen aan wachtrij - [Onbekend] + [onbekend] Begin hier met afspelen in de achtergrond Begin met afspelen in pop-up Doneren @@ -197,7 +197,7 @@ Menu sluiten Geen speler met streamondersteuning gevonden (je kan VLC installeren om af te spelen). Altijd - Eenmalig + Eénmalig Externe spelers ondersteunen dit soort links niet Geen videostreams gevonden Geen audiostreams gevonden @@ -220,7 +220,7 @@ Bijgehouden afspeellijsten Toevoegen aan Versleep om de volgorde te wijzigen - Creëren + Aanmaken Sluiten Naam wijzigen Laatst afgespeeld @@ -334,13 +334,9 @@ Gebruikers Afmelden Kies tabblad - Gebaarbesturing voor volume - Gebruik gebaren om het volume van de speler aan te passen - Gebaarbesturing voor helderheid - Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken Bestand verwijderd - App update melding + App-updates Meldingen voor nieuwe New Pipe versies Externe opslag niet beschikbaar Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\? @@ -410,10 +406,10 @@ Er zal maximaal 1 bestand tegelijk worden gedownload Downloads starten Downloads pauzeren - Vraag waar bestanden gedownload worden + Vragen waar bestanden gedownload moeten worden U wordt gevraagd waar elk bestand wordt opgeslagen. \nSchakel de systeem map kiezer (SAF) in als u naar een externe SD-kaart wilt downloaden - Gebruik de systeem map kiezer (SAF) + Mapkiezer van systeem gebruiken (SAF) Verwijder afspeelposities Verwijdert alle afspeelposities Alle afspeelposities verwijderen\? @@ -447,8 +443,8 @@ Download geschiedenis verwijderen Verwijder gedownloade bestanden Geef toestemming voor weergave over andere apps - App taal - Systeem taal gebruiken + App-taal + Systeemtaal gebruiken Druk op \"Klaar\" zodra opgelost Klaar Video\'s @@ -465,7 +461,7 @@ %d uur - %d uren + %d uur %d dag @@ -504,7 +500,7 @@ \nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed. \n \nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie. - Toggle service, momenteel geselecteerd: + Service wisselen, momenteel geselecteerd: Meest geliked NewPipe werd gesloten terwijl het bezig was met het bestand Nummers @@ -516,17 +512,17 @@ Ja, en deels bekeken video\'s Video\'s die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \nWeet u dit zeker\? Deze actie kan niet ongedaan gemaakt worden! - Verwijder bekeken video\'s\? + Bekeken video\'s verwijderen\? ∞ video\'s 100+ video\'s Deze video heeft een leeftijdsbeperking. \n \nSchakel \"%1$s\" in bij de instellingen als u die wilt zien. - Verwijder bekeken + Bekeken verwijderen Originele teksten van services zijn zichtbaar in stream-items YouTube \"Beperkte modus\" aanzetten Laat originele tijd geleden zien - Kanaal avatar afbeelding + Avatarminiatuur van kanaal Door %s Gemaakt door %s Afspeellijst pagina @@ -568,13 +564,13 @@ YouTube biedt een \"Beperkte modes\" aan, dit verbergt mogelijk materiaal voor volwassenen Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+) Laat Android de kleur van de notificatie aanpassen, op basis van de meest voorkomende kleur in de thumbnail (let op: niet beschikbaar op elk apparaat) - Notificatie kleur aanpassen + Meldingkleur aanpassen Toon miniatuurafbeelding op het vergrendelscherm als achtergrond en in de notificaties Toon miniatuurafbeelding Recente Hash berekenen - Meldingen over de voortgang van video hashing - Video hash melding + Meldingen over de voortgang van video-hashing + Video-hashing 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 @@ -597,11 +593,11 @@ Deze video heeft een leeftijdsbeperking. \nVanwege nieuw YouTube-beleid over video\'s met leeftijdsbeperking, heeft NewPipe geen toegang tot zijn videostreams en kan deze dus niet afspelen. Downloaden is gestart - Je kan je favoriete nacht thema hier beneden selecteren - Selecteer uw favoriete nacht thema — %s - Automatisch (toestel thema) + U kunt uw favoriete nachtthema hieronder selecteren + Selecteer uw favoriete nachtthema — %s + Automatisch (systeemthema) Toon details van kanaal - Nacht Thema + Nachtthema Intern Privé Niet vermeld @@ -622,11 +618,10 @@ Media tunneling uitschakelen Uit Aan - Tablet modus - Open website + Tablet-modus + Website openen %s geeft de volgende reden: Account getermineerd - Toon bekeken items De snelle feed mode levert hierover niet meer informatie. De account van de auteur is getermineerd. \nNewPipe zal niet in staat zijn deze feed in de toekomst te laden. @@ -665,13 +660,13 @@ Toon \"crash de speler\" Toon een crash overzicht bij gebruik van de speler Controleer handmatig op nieuwe versies - Controleer op updates + Controleren op updates Bezig met controleren op updates… - Nieuwe feed items - Foutmelding + Nieuwe feeditems + Foutrapporten Beschrijving van foutmeldingen NewPipe meldt fout, tik voor bericht - Foutmelding + Er is een fout opgetreden, zie de melding Maak een foutmelding Korte foutmelding weergeven Er is geen geschikte bestandsbeheerder gevonden voor deze actie. @@ -680,22 +675,21 @@ \nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework Vastgemaakt commentaar LeakCanary is niet beschikbaar - Verander de laad interval tijd (nu %s). Een lagere waarde kan het initiële laden van de video versnellen. De wijziging vereist een herstart van de speler ExoPlayer standaard - Speler melding + Spelermelding Configureer meldingen van de huidige spelende stream Meldingen Nieuwe streams Meldingen over nieuwe streams van abonnementen Bezig met laden van stream details… - Controleer op nieuwe streams + Controleren op nieuwe streams Meldingen over nieuwe streams Melding over nieuwe streams van abonnementen Frequentie van controleren Vereiste netwerk connectie Elk netwerk Meldingen zijn uitgeschakeld - Ontvang een melding + Meldingen , Alles in-/uitschakelen Percentage @@ -714,21 +708,57 @@ Selecteer kwaliteit voor externe spelers Onbekend formaat Intervalgrootte tijdens afspelen - Toon toekomstige objecten - Verberg bekeken objecten - Verberg toekomstige objecten Veelgestelde vragen Als u problemen ondervindt bij het gebruik van de app, bekijk dan deze antwoorden op veelgestelde vragen! - Bekijk op de website + Bekijken op website Sorteer Snelle modus Importeer of exporteer abonnementen vanuit het 3-punten menu U heeft de laatste versie van NewPipe Klik om %s te downloaden Kon niet naar klembord kopiëren - Deze instelling is alleen beschikbaar als %s als Thema ingesteld is + Deze instelling is alleen beschikbaar als %s als thema ingesteld is Kaart Miniatuur niet ingesteld De afspeellijsten die grijs zijn, bevatten dit item al. Duplicaat is %d tijd(en) toegevoegd + Linker gebaaractie + Rechter gebaaractie + Geen + Duplicaten verwijderen + Duplicaten verwijderen\? + Wil je alle dubbele streams in deze afspeellijst verwijderen\? + Streams weergeven/verbergen + Volledig bekeken + Gedeeltelijk bekeken + Aanstaande + Kies een gebaar voor de rechterhelft van het spelersscherm + Fysieke knoppen voor mediabediening negeren + Helderheid + Volume + Handig, als je bijvoorbeeld een headset gebruikt met fysieke knoppen die stuk zijn + Kies een gebaar voor de linkerhelft van het spelersscherm + Laat de volgende streams zien + Selecteer een audiotrack met beschrijvingen voor slechtzienden, indien beschikbaar + Deze tijdelijke oplossing geeft videocodecs vrij en activeert ze opnieuw wanneer er een oppervlakteverandering optreedt, in plaats van de oppervlakte rechtstreeks op de codec in te stellen. Dit wordt al gebruikt door ExoPlayer op sommige apparaten met dit probleem; deze instelling heeft alleen effect op Android 6 en hoger +\n +\nAls je deze optie inschakelt, voorkom je mogelijk afspeelfouten bij het wisselen van de huidige videospeler of het overschakelen naar volledig scherm + Wijzig de grootte van het laadinterval voor progressieve inhoud (momenteel %s). Een lagere waarde kan het initiële laden versnellen + Geef de voorkeur aan originele audio + Selecteer de originele audiotrack, ongeacht de taal + Geef de voorkeur aan beschrijvende audio + Audio: %s + Audiotrack + Er zou al een audiotrack in deze stream aanwezig moeten zijn + Selecteer audiotrack voor externe spelers + Onbekend + ExoPlayer-instellingen + Beheer enkele ExoPlayer-instellingen. Deze wijzigingen vereisen een herstart van de speler om van kracht te worden + Gebruik de terugvalfunctie van de ExoPlayer-decoder + Schakel deze optie in als je problemen hebt met de initialisatie van de decoder, die terugvalt op decoders met een lagere prioriteit als de initialisatie van de primaire decoder mislukt. Dit kan leiden tot slechtere afspeelprestaties dan bij gebruik van primaire decoders + Gebruik altijd de tijdelijke oplossing voor het instellen van het video-uitvoeroppervlak van ExoPlayer + %1s %2s + origineel + nagesynchroniseerd + beschrijvend \ No newline at end of file diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index f7d4eec86ae..55c3cdc6212 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -2,29 +2,29 @@ Trykk på aukeglaset for å byrja. Gjeve ut den %1$s - Fann ingen straumspelar. Legg inn VLC\? - Ingen straumavspelar funne (du kan leggja inn VLC for å spela av straumen). + Fann ingen straumavspelarar. Legg inn VLC\? + Fann ingen straumavspelarar (du kan leggja inn VLC for å spela av straumen). Legg inn Avbryt Greitt - Opna i ein nettlesar + Opn i ein nettlesar Merk som sett Sprett opp i eit vindauga - Opna med + Opn med Del Søk Innstillingar Meinte du «%1$s»\? Del med - Nytta ytre videospelar + Nytt ytre videospelar Tek bort ljod ved somme oppløysingar - Nytta ein ytre ljodavspelar + Nytt ein ytre ljodavspelar Fylg Fylgjer Stogg å fylgja - Gjeve opp å fylgja kanalen + Stogga å fylgja kanalen Vis opplysingar - Fylgingar + Fylgde Gøymde spelelister Vel fane Sprett opp @@ -34,32 +34,30 @@ Vis høgare oppløysingar Berre somme einingar kan spela av 2K-/4K-videoar Spel av med Kodi - Syna \"Spela av med Kodi\"-val + Vis \"Spela av med Kodi\"-val Hent Hent straumfil Gøymer henta videofiler her Bakgrunn Videohentingsmappe - Henta ljodfiler vert gøymt her + Henta ljodfiler vert gøymde her Vel hentemappe for ljodfiler Legg inn saknande Kore-app\? Viser svar for: %s - Kunne ikkje brigde fylging - Nettbrettmodus + Greidde ikkje å brigde fylginga + Nettbrettvising Av Merknader er slått av , Slå av/på alle - Ingen ljodstraumar er tilgjengelege for ytre spelarar - Ingen videostraumar er tilgjengelege for ytre spelarar - Vel kvalitet for ytre spelarar - Vis framtidige ting - Skjul framtidige ting + Ingen ljodstraumar er tilgjengelege for ytre avspelarar + Ingen videostraumar er tilgjengelege for ytre avspelarar + Vel kvalitet for ytre avspelarar Skil ut - Opna nettstaden + Opn nettstaden Du fylgjer no denne kanalen - Vald straum er ikkje stødd av ytre spelarar + Vald straum er ikkje stødd av ytre avspelarar Straumar som ikkje enno er stødde av hentaren, er ikkje synlege Ukjend kvalitet Ukjend format @@ -70,4 +68,89 @@ Skjer videosmåbiletet som vert vist i varselet, ifrå storleikshøvet 16:9 til 1:1 Fyrste gjerdknapp Andre gjerdknapp + Ingenting + Ljod + Tredje gjerdknapp + Fjerde gjerdknapp + Femte gjerdknapp + Du kan berre velja opp til tre gjerder til å verta viste i det tette varselet. + Gjenta + Bland + Lét varsla + La Android velja léten til varsla ut ifrå hovudléten i småbiletet (merk at dette ikkje er tilgjengeleg på alle einingar) + Forvalt ljodformat + Forvalt videoformat + Ham + Nattham + Ljos + Mørk + Svart + Hugs oppsprettseigenskapar + Hugs den siste storleiken og staden til oppsprettsvindauga + Stadfest radtømming + Byte ifrå ein avspelar til ein annan kan skifta ut rada di + Den noverande avspelingsrada vil verta skift ut + Hent fram småbilete + Sjå bort ifrå mediaknappetrykk + Nyttig om du til dømes nyttar høyretelefonar med skadde knappar + Ingen + Søkjeframlegg + Søkjeframlegg på eininga + Søkjeframlegg på nettet + Vis søkjeframlegg ved søk + Visingshistorikk + Spel av der du slapp + Kjente ikkje att nettadressa. Opn med ein annan app\? + Forvalt innhaldsland + Avspelar + Krasj avspelaren + Trykk på ei varselgjerd under for å byta ho ut. Vel opptil tre av dei til å verta viste i det samantrengde varselet ved å merkja dei av på høgre side + Nytt kvikk slurvne spoling + Hopplengd (framover/bakover) + Slurvne spoling lar avspelaren spole kvikkare, men slurvnare. 5, 15 og 25-sekundshopping verkar ikkje med dette + Tøm data + Ustødd nettadresse + Vis «Hald for å rade»-råd + Vis «Neste» og «Liknande» videoar + Vis utsegner + Slå av for å skjula utsegner + Vis utgreiingar + Slå av for å skjula videoutgreiingar og ytterlegare opplysingar + Vis metadata + Slå av for å skjula medadataområde med tilleggsopplysingar om straumskaparen, strauminnhaldet eller eit søk + Vel det opphavlege ljodsporet utan omsyn til tungemålet + Helst utgreiande ljod + Sjølvverkande rad neste straum + Hald fram ei ugjentakande avspelingsrad ved å leggja til ein liknande straum + Rad sjølvverkande + Venstre handvendingsgjerd + Vel ei handvending for den høgre sida av avspelingsskjermen + Søkjehistorikk + Spar søk på eininga + Hald fram straumar der du sist slapp + Vis listeframgang + Vis avspelingsstadteikn i lister + Lag ei liste over avspelte straumar + Hald fram avspeling + Hald fram med å spela av etter avbrot (t.d. telefonsamtaler) + Hent + Byrj hovudavspelaren i fullskjerm + Om sjølvverkande snuing er slegen av, byrj videoar i fullskjerm i staden for i småavspelaren. Du kan framleis nytte småavspelaren ved å gå ut av fullskjermsvisinga + Spel av sjølvverkande + Vis eit råd ved trykk på «Bakgrunn» eller «Sprett opp»-knappane i videodetaljane + Forvalt tungemål for innhald + Stør berre HTTPS-nettadresser + Åtferd + Video og ljod + Utsjånaden + Avspelingsvarsel + Spelar av i bakgrunnen + Hopp over togner + Helst opphavleg ljod + Om tilgjengeleg, vel eit ljodspor med utgreiingar for blinde + Vel ei handvending for den venstre sida av avspelingsskjermen + Høgre handvendingsgjerd + Ljosstyrke + Ljodstyrke + Oppdateringar \ No newline at end of file diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml new file mode 100644 index 00000000000..e177035b2f6 --- /dev/null +++ b/app/src/main/res/values-nqo/strings.xml @@ -0,0 +1,739 @@ + + + ߞߊ߬ ߢߣߊߕߊߟߌ ߘߏ߫ ߦߌ߬ߘߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߕߏߟߏ߲߫ Kodi ߞߟߋߞߟߋ߫ ߕߊ߲ߓߊ߲ ߘߐ߫ + Kore ߟߥߊߟߌߟߊ߲ ߡߊ߫ ߛߐ߬ߘߐ߲߬߸ ߞߵߊ߬ ߡߊߗߍ߫؟ + ߦߋߡߍ߲ߕߊ ߞߏ߬ߋߞߏ߬ߋ߫ ߡߍ߲ ߦߌ߬ߘߊ߬ߕߐ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߘߐ߫߸ ߞߵߏ߬ ߟߊߕߍ߰ ߞߊ߬ ߓߐ߫ ߁߆:߉ ߞߊ߬ ߞߍ߫ ߁:߁ ߓߍ߲߬ߡߊ ߘߌ߫ + ߞߍߟߌ߫ ߝߌߟߊߣߊ߲ ߞߎ߬ߘߎ + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߍߟߌ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ ߡߊߝߊ߬ߟߋ߲߬ ߘߎ߰ߟߊ߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲ ߘߐ߫ ߊ߬ߟߎ߫ ߞߊ߲߬. ߘߏ߫ ߟߎ߫ ߓߊߕߐߡߐ߲߫ (ߞߣߊ߫ ߕߊ߬ߡߌ߲߬ ߃ ߟߊ߫) ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߜߘߋ ߘߐ߫߸ ߞߌߣߌ߲߫ ߛߐ߲߬ߞߌ߲ ߛߌߟߊ ߝߍ߬ ߘߋ߲߬ߞߊ߬ߣߍ߲߬ ߘߐߞߍߕߊ ߞߊ߲߬ + ߞߊ߬ \"ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫\" ߢߣߊߕߊߟߌ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߜߊߘߊ߲߫ + ߞߏ߬ߋߞߏ߬ߋ ߟߊ߬ߕߍ߰ ߁:߁ ߡߊ߬ + ߞߍߟߌ߫ ߝߟߐ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߛߓߊߣߊ߲ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߣߊ߯ߣߌ߲ߣߊ߲ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߟߏ߯ߟߎߣߊ߲ ߞߎ߬ߘߎ + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߬ ߜߘߋ ߘߐ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߍߟߌ߫ ߛߓߊ߬ ߔߋ߫ ߟߋ߬ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߫߹ + ߕߎ߬ߡߊ߬ ߘߐ߫߸ ߌ ߞߊ߲߫ ߦߋ߫ \"%1$s\" ߟߋ߫ ߡߊ߬؟ + ߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߘߊ߫ %1$s + ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬. ߞߊ߬ VLC ߡߊߗߍ߫؟ + ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ (ߌ ߘߌ߫ ߛߋ߫ VLC ߡߊߗߍ߫ ߞߵߊ߬ ߕߏߟߏ߲߫). + ߞߵߊ߬ ߟߊߞߊ߬ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ + ߞߵߊ߬ ߢߊߣߐ߯ߦߊ߫ ߦߏ߫ ߡߊߝߟߍߣߍ߲ + ߞߵߊ߬ ߡߊߗߍ߫ + ߞߵߊ߬ ߘߐߛߊ߬ + ߏ߬ߞߍ߫ + ߞߵߊ߬ ߘߐߕߟߊ߫ + ߞߴߊ߬ ߘߊߦߟߍ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߞߣߐ߫ + ߞߵߊ߬ ߘߊߦߍ߬ߟߍ߫ ߦߊ߲߬ + ߞߵߊ߬ ߟߊߖߌ߰ + ߞߊ߬ ߥߏ߬ߦߏ ߞߐߘߐ߮ ߟߊߖߌ߰ + ߢߊߓߐߟߌ ߟߎ߬ + ߢߌߣߌ߲ߠߌ߲ + ߡߊ߬ߝߘߎ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬ߞߏ ߡߊ߫ ߛߐ߲߬ + ߢߌߣߌ߲ߝߋ߲߫ ߞߐߝߟߌ ߟߎ߬: %s + ߞߵߊ߬ ߘߐߝߘߊ߫ + ߞߐߞߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫ + ߊ߬ ߦߋ߫ ߡߍ߲ߕߊ ߟߋ߫ ߖߐ߬ߛߌ߫ ߟߊ߫ ߓߍ߲߬ߡߊ ߘߏ߫ ߟߎ ߞߘߐ߫ + ߞߊ߬ ߞߐߞߊ߲߫ ߡߍ߲ߕߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫ + ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬ + ߊ߬ ߡߊߝߘߎ߫ + ߊ߬ ߡߊߝߘߎߣߍ߲߫ ߌ ߓߟߏ߫ + ߥߙߏߝߋ ߓߘߊ߫ ߟߊߓߌ߬ߟߊ߬ + ߡߊ߬ߝߘߎ߬ߟߌ߫ ߟߏ߲ߘߐߦߊߞߏ ߡߊ߫ ߛߐ߲߬ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ + ߞߊ߬ ߟߌ߬ߤߟߊ ߦߌ߬ߘߊ߬ + ߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ + ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ + ߞߵߊ߬ ߝߙߊ߬ + ߦߋߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬ + ߝߎ߲ߞߊ߲ߡߊ + ߛߏ߬ߙߌ߲߬ߘߐ ߛߎߥߊ߲ߘߌ߫ + ߦߋߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߦߋߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫ + ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ + ߓߍ߲߬ߡߊ߬ ߛߊ߲ߘߐߕߊ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲ + ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ߫ ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ + ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫ + ߕߙߏߞߏ߫ ߘߊ߲ߘߐ߫ߣߍ߲߫ ߠߋ߬ ߦߋ߫ ߛߋ߫ ߟߊ߫ 2K/4K ߦߋߡߍ߲ߕߊ ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫ + ߊ߬ ߛߐ߲߬ߞߌ߫ ߥߊߘߏ ߞߊ߲߬ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߟߐ߬ߡߊ + ߞߊ߬ ߊ߲ߘߙߏߌߘ ߟߐ߬ ߛߐ߬ߓߌ߲߬ߘߐ߬ߓߏ߲ ߞ߬ߟߐ ߟߊߖߘߍ߬ߕߦߊ߬ ߟߊ߫ ߞߵߊ߬ ߓߍ߲߬ ߞߏ߬ߋߞߏ߬ߋ߫ ߞߐ߬ߟߐ ߓߊߖߎ ߡߊ߬ (ߦߴߊ߬ ߟߐ߲߫ ߞߴߏ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߙߏߞߏ ߓߍ߯ ߟߊ߫) + ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߠߵߊ߬ ߞߍ߫ ߟߊ߫ ߕߏߟߏ߲ߟߊ߲ ߘߌ߫ ߘߌ߲߬ߞߌߙߊ ߟߎ߬ ߢߌߣߌ߲߫ ߞߊߟߌߦߊߓߟߏ ߡߊ߬ ߞߏ߬ߣߵߊ߬ ߕߋߟߋ߲ߣߍ߲߫ ߕߍ߫ ߖߋߞߎ߫. ߞߊ߬ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߝߌ߬ߟߊ߲߬ ߅، ߁߅، ߥߟߊ߫ ߂߅ ߞߘߐ߫߸ ߊ߬ ߣߴߏ߬ ߕߍ߫ ߛߋ߫ ߓߍ߲߬ ߠߊ߫ + ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߣߐߘߐ߫ ߢߍߕߊ߯ߡߊ ߞߊ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߊ߬ ߖߛߐߟߌ߫ ߝߟߐ ߟߞߊߟߌߦߊ߫ ߟߊ߫ + ߞߊ߬ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߡߊ߬ߣߌ߲߬ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߏ߫ ߝߌߘߊ߲߫ ߕߐ߫ + ߞߊ߬ ߓߐ߫ ߕߏߟߏ߲ߟߊ߲ ߘߏ߫ ߟߊ ߞߊ߬ ߥߊ߫ ߘߏ߫ ߜߘߍ߫ ߟߊ߫߸ ߏ߬ ߘߌ߫ ߛߋߴߌ ߟߊ߫ ߕߎ߲߰ߠߌ߲ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߟߊ߫ + ߡߊ߬ߛߊߦߌ + ߢߓߊߛߊ߲ + ߦߟߌߘߐߗߍ + ߝߏߛߌ߬ + ߡߍ߲ߕߊ + ߡߍ߲ߕߊ߫ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ + ߦߋߡߍ߲ߕߊ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ + ߛߊߛߊ + ߛߎߘߐ߫ ߛߊߛߊ + ߞߣߍߦߊߣߍ߲ + ߘߓߌ߬ߣߍ߲ + ߝߌ߲߬ߡߊ߲ + ߞߊ߬ ߖߊ߬ߕߏ߫ ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ ߟߊ߫ ߕߦߊ ߟߎ߬ ߞߐ߫ + ߞߊ߬ ߖߊ߲߬ߕߏ߫ ߝߎ߲ߞߊ߫ ߝߢߐߘߊ ߘߍ߲߬ߘߍ߲ ߣߴߊ߬ ߘߌ߲߬ߞߌߙߊ ߞߐ߫ + ߞߊ߬ ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߊߟߌ߲ ߠߊߓߊ߯ߙߊ߫ + ߢߍߝߍ߫/ߞߐߝߍ߫ ߢߌߣߌ߲ߠߌ߲߫ ߥߛߎ߬ ߞߊߟߌ߲ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ + ߛߋ߲߬ߠߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߊ߫ ߕߎ߲߰ߠߌ߲ ߘߌߣߊ߬ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ + ߞߊ߬ ߕߙߏߞߏ ߞߟߋߞߟߋ߫ ߞߘߎ ߟߊ߫ ߖߊ߲߬ߖߊ߲߬ ߠߎ߬ ߡߊߓߌ߬ߟߊ߬ + ߏ߬ ߢߊߕߣߐ ߞߊߓߏ߬߸ ߣߴߌ ߦߋ߫ ߕߟߏߡߊߘߏ߲ ߠߊߓߊ߯ߙߊ ߟߊ߫ ߡߍ߲ ߞߘߎ߬ ߜߎ ߟߎ߬ ߕߍ߫ ߛߐ߲߬ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߖߛߐ߫ + ߣߎߡߊ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ + ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߞߌߣߌ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ + ߞߌߣߌ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ + ߞߣߍߦߊ + ߡߊ߲߬ߞߊ߲ + ߝߏߛߌ߬ + ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ ߓߊߕߐߡߐ߲߫ ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߢߌߣߌ߲ߠߌ߲߫ ߕߎߡߊ + ߘߌ߲߬ߞߌ߬ߙߊ߬ߘߐ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߥߎߟߊߟߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߊ߬ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߟߊߓߊ߲ ߠߊ߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߡߊ߬ߛߙߋ ߟߎ߫ ߦߌ߬ߘߊ߬ ߛߙߍߘߍ ߟߎ߬ ߘߐ߫ + ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߡߊߝߍߣߍ߲ߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ߫ + ߞߵߊ߬ ߟߊߖߌ߰ + ߞߊ߬ ߕߏߟߏ߲ߟߊ߲߫ ߓߊߖߎ ߘߊߦߟߍ߬ ߥߊ߲߬ߥߊ߬ ߝߊ ߘߐ߫ + ߞߊ߬ ߞߍߞߌߦߊ \"ߊ߬ ߛߐ߲߬ߞߌ߲߬ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫\" ߦߌ߬ߘߊ߬ + ߛߘߌ߬ߜߋ߲߬ ߘߌߣߍ߲ ߡߊ߫ ߛߋ߫ ߡߊߟߐ߲߫ ߠߊ߫. ߞߵߊ߬ ߘߊߦߟߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫؟ + ߞߣߐߘߐ߫ ߖߡߊ߬ߣߊ߬ ߖߏߣߡߊ + ߌ ߘߌߦߊߣߍ߲߫ ߛߐߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߫ ߦߊ߲߬: %s + ߛߐߘߊ ߘߏ߫ ߝߙߊ߬ + ߛߐߘߊ߫ ߛߘߌ߬ߜߋ߲ + ߛߐߘߊ ߡߊ߫ ߛߋ߫ ߕߎ߬ߢߊ߬ߟߐ߲߬ ߠߊ߫ + HTTPS ߛߘߌߜߋ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߦߋ߫ ߕߊ߬ ߟߊ߫ + ߞߏߟߊߕߊ߯ߡߢߊ + ߦߋߡߍ߲ߕߊ ߣߌ߫ ߡߍ߲ߕߊ + ߘߝߐ߬ߦߊ ߣߌ߫ ߦߟߌߡߊߛߌ߮ + ߦߋߢߊ + ߞߊߘߊ߲ߓߐ + ߟߏ߲ߘߐߦߊߟߌ + ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߕߐ ߛߏ߬ߓߌ߬ߘߐߓߏ߲ ߢߊߓߐ߫ + ߝߊ߲߬ߝߘߊ߬ߞߘߐ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ + ߝߎ߲ߞߊ߲ߡߊ ߞߙߊ߬ߞߏ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ + ߞߣߐߘߐ + ߦߕߎߓߎ߫ \"ߜߍ߲߬ߘߍ߬ߣߍ߲߫ ߗߏ߯ߦߊ\" ߟߊߡߍߣߍ߲߫ + \"ߜߍ߲߬ߘߍ߬ߣߍ߲ ߗߏ߯ߦߊ\" ߘߏ߫ ߦߋ߫ ߦߕߎߓߎ ߓߟߏ߫߸ ߡߍ߲ ߦߋ߫ ߞߣߐߘߐ߫ ߘߋߣߍ߲ߞߏߓߊߦߋ ߟߎ߬ ߢߡߊߘߏ߲߰ ߠߊ߫ + ߝߊ߲ߞߢߊ + ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ + ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ + ߖߊ߲߬ߖߏ߲ ߠߎ߬ + ߘߐ߲߬ߞߟߌ ߟߎ߬ + ߢߊ߰ߙߊ ߟߎ߬ + ߟߊߛߊ߬ߣߍ߲ + ߞߵߊ߬ ߝߌߘߊ߲߫ + ߓߍ߲߬ߡߊ ߓߘߍ߬ߡߊ + ߞߵߊ߬ ߘߐߛߊ߬ + ߞߵߊ߬ ߓߍ߯ ߕߏߟߏ߲߫ + ߞߘߊߎ߫ + ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߣߌߎߔߌߔ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߓߊߖߎ ߘߐ߫ + ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߝߏ߬ߦߌ߬ + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫ + ߘߝߐ߬ߦߊ ߣߌ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߌ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߣߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ + ߦߟߌߘߏ߲ ߠߎ߬ ߖߏ߬ߛߌ߬߸ ߣߌߎߔߌߔ ߦߋ߫ ߡߍ߲ ߠߎ߬ ߟߊߡߊ߲߬ߘߌ߬ ߟߊ߫ ߡߐ߰ߦߊ߬ߟߐ߲ ߘߏ߫ ߝߎߟߋ߲߫ ߕߎߡߊ ߌ ߓߟߏ߫ + ߦߋߞߏ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫؟ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߎߡߊߘߋ߲ ߠߎ߫ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ + ߗߏ߯ߦߊ߫ ߞߊߟߌ߲ + ߝߎ߬ߕߎ߲߬ߕߌ + ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߕߍ߫ ߦߋ߲߬ + ߞߙߏ߬ߝߏ߫ ߝߎ߬ߕߎ߲߬ߕߌ + ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߞߟߊ߬ߣߐ߮ ߡߊ߫ ߝߙߍߕߍߓߐ߫ ߟߊ߫ + ߗߍߦߙߐ ߡߊ߫ ߛߋ߫ ߘߐߛߏ߯ߙߋ߫ ߟߊ߫ + ߞߣߐߘߐ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߟߥߊ߬ߟߌ߬ߟߊ߲ ߓߘߊ߫ ߜߊߘߊ߲߫ + ߞߐߕߐ߮ ߓߘߊ߫ ߡߊߘߏ߬ߣߌ߲߬ ߥߟߴߊ߬ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߎ߲ߓߍ߲ ߛߎߝߊ߫ ߏ߬ ߕߍ߫ ߦߋ߲߬ + ߞߎ߲ߓߍ߲ ߥߟߊ߫ ߞߣߐߘߐ߫ ߛߎߝߊ ߏ߬ ߕߍ߫ ߦߋ߲߬ + ߞߐߕߐ߮ ߕߍ߲߬ ߦߋ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߟߊߛߐ߬ߘߐ߲߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߥߟߊ߫ ߛߓߍߟߌ߫ ߓߟߏ ߡߊ߬ + ߞߐߕߐ߯ ߕߐ߮ ߘߐߞߏߟߏ߲ ߕߍ߫ ߛߋ߫ ߕߏ߫ ߟߊ߫ + ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫: %1$s + ߥߦߏ߬ ߟߊߖߌ߰ߕߊ߬ ߕߍ߫߫ ߦߋ߲߬ + ߛߏ߬ߙߌ߲߬ߘߐ߬ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲ ߠߎ߬ ߕߍ߫ ߞߊ߬ߙߊ߲߬ ߠߊ߫߸ ߛߏ߬ߙߏ߲߬ߘߐ߬ ߖߏߣߡߊ ߟߎ߬ ߟߋ߬ ߟߊߓߊ߯ߙߊ ߌߘߐ߫ + ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫߸ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊߝߍߣߍ߲߫ + ߘߌ߬ߢߍ߬߸ ߊ߬ ߡߊ߫ ߟߊߥߌ߬ߟߴߊ߬ ߡߊ߬. + ߘߌ߬ߢߍ߬߸ ߞߏ߫ ߘߏ߫ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߏߢߊ߬. + ߟߌ߬ߤߟߊ: + ߡߎ߲߬ ߞߍߣߍ߲߫: + ߡߎ߲߬:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ (ߊ߲߬ߞߌ߬ߟߍ߬ ߞߊ߲ ߘߐ߫): + ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬: + ߦߋߡߍ߲ߕߊ ߘߐߞߊ߬ߙߊ߲߸ ߥߎ߬ߛߎ: + ߟߊ߬ߦߟߍ߬ߓߊ߮ ߞߐߦߌߘߊ߫ ߖߌߦߊ ߞߏ߬ߋߞߏ߬ߋ + ߊ߬ ߘߎߡߊ߲߫ ߒߧߍ߫ + ߊ߬ ߡߊ߲ߘߌ߫ ߒߧߍ߫ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ + ߢߐ߲߰ߘߐ߬ ߥߦߏ ߟߎ߬ + ߞߐߝߟߌ߫ ߕߍ߫ ߦߋ߲߬ + ߡߍ߲ߕߊ + ߞߵߊ߬ ߡߊߛߊ߬ߦߌ߬ + ߥߊ߯ + ߞߋ߲߬ + ߥߟߡ + ߞߊ߬ ߥߏ߬ߦߏ߫ ߣߊ߬ߕߊ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ ߞߍ߲ߖߘߍߡߊߓߟߏ ߡߊ߬ + ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߐߞߊ߬ߙߊ߲ ߓߟߏߕߎ߰ (ߞߊߣߊ߬ ߡߊߛߊ߬ߦߌ߬) ߥߏ߬ߦߏ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߟߊ߫ + ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߣߎߡߊ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ + ߘߊ߲߬ߘߌߦߊ ߢߌߣߌ߲ߠߌ߲ ߘߐ߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ + ߞߊ߬ ߘߐ߲߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߓߟߏߕߍ߯ߟߌ ߞߐߝߍ߬ (ߟߊߒߡߊ߫ ߘߐ߫، ߜߋߟߋ߲ߜߋߟߋ߲ ߠߊ߫ ߞߟߌߟߌ ߟߎ߬) + ߞߊ߬ ߞߍߞߌߦߊ ߦߌ߬ߘߊ߬ ߦߋߡߍ߲ߕߊ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߞߐߜߍ ߞߊ߲߬ \"ߝߎ߲ߞߊ߲ߡߊ\" ߥߟߊ߫ \"ߞߘߐߝߊ߲ߝߘߊ\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߬ ߕߎߡߊ + ߕߏߟߏ߲ߟߊ߲߫ ߠߊ߫ ߛߐߓߌ߬ߘߐ߬ߓߏ߲ + ߞߊ߬ ߞߣߐߘߐ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߞߣߐߘߐ ߟߎ߬ ߦߌ߬ߘߊ߬ ߤߊߟߌ߬ ߘߋ߲ߣߍ߲ ߠߎ߬ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߡߍ߲ ߡߊߝߍߣߍ߲߫ (ߦߏ߫ +߁߈) + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߮ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. +\n +\n\"%1$s\" ߟߊߢߊ߯ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߝߟߍ߫. + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߯ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. +\nߦߕߎߓߎ߫ ߟߊ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߏߛߐ߲߬ ߞߊ߬ ߓߍ߲߬ ߖߌ߬ߦߊ߬ߖߟߎ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߠߊ߫ ߞߏ ߡߊ߬، ߣߌߎߔߌߔ ߕߍ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߥߦߏ ߣߌ߲߬ ߛߌ߫ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߏ߬ ߞߏߟߐ߲߬ ߊ߬ ߕߍ߫ ߛߴߊ߬ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫. + ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߛߣߍ߫ + ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ + ߣߌߎߔߌߔ ߕߏߟߏ߲ߟߊ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߌ ߟߊ߫ ߘߝߐ߬ߦߊ߸ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬߸ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߊ߬ߣߌ߫ (ߢߣߊߕߊߟߌ ߘߐ߫) ߢߊߓߐߟߌ ߟߎ߬ ߘߌ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫ + ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߞߊ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߕߍ߫ ߓߍ߲߬. ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߌ߲߬ߞߌߙߊ ߢߡߊߛߊ߬ߦߌ߬ ؟ + ߟߊ߬ߖߌ߰ߟߌ ߢߣߊߥߟߊ߫ ߕߍ߫ ߛߋ߫ ߘߐߛߌ߰ ߟߊ߫ + ߊ߬ ߟߊߛߊ߬ ߞߏߛߊ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߞߊߣߊ߬ ߖߛߐ߫߸ ߞߊ߬ ߟߐ߲ߕߊ ߣߌ߫ ߦߟߌߕߏߟߊ߲ ߡߊߞߐߙߐ߲ߞߐߙߐ߲߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߘߌ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߦߟߌߡߊߛߌ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߕߏߟߊ߲ ߣߌ߫ ߝߘߍ߬ߜߍߟߍ߲ ߞߊ߲߬ + ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߢߡߊߘߏ߲߰ + ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߣߊ߬ߕߊ ߟߎ߬ ߣߌ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߞߊ߲߬ߛߓߍ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ ߣߴߊ߬ ߟߌ߬ߤߟߊ߬ ߜߘߍ߫ ߟߎ߬ ߢߡߊߘߏ߲߰ + ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬߬ ߟߊߛߊ߬ ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߝߏ߬ߘߏ ߢߡߊߘߏ߲߰߸ ߣߴߊ߬ ߦߋ߫ ߥߏ߬ߦߏ ߛߌ߲ߘߌߓߊ߮ ߣߌ߫ ߥߏ߬ߦߏ ߞߣߐߘߐ ߟߥߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߡߊߢߌߣߌ߲߫ ߘߌ߫ + ߦߟߌߡߊߛߌ߯ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫ + ߞߊ߬ ߦߟߌߡߊߛߌ߯ ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߞߊ߬ ߓߟߐߟߐ߫ ߞߐߜߍ ߟߎ߬ ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߯ ߘߐ߫ + ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߓߘߊ߫ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߮ ߞߣߐ߫ + ߞߴߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߴߊ߬ ߖߍ߬ߘߍߡߊ߬ + ߦߋߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߞߊ߬ ߟߐ߲ߕߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߕߏߟߏ߲ߖߘߍ߬ߡߊ + ߛߘߌ߬ߜߋ߲߫ ߕߊ߬ߓߊߟߌ + ߦߋߡߍ߲ߕߊ ߟߎ߬ ߞߊߣߊ߬ ߘߊߦߟߍ߬ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߞߣߐ߫߸ ߞߏ߬ߣߌ߲߬ ߞߵߊ߬ ߟߊߞߊ߬ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߘߐ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߥߟߏߒߖߘߍ߬ߡߊ ߜߊߛߏ߲ߣߍ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߣߴߌ ߓߐ߫ ߘߊ߫ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߗߏ߯ߦߊ ߘߐ߫ + ߞߣߐߘߐ߫ ߞߊ߲߫ ߖߏߣߡߊ + PeerTube ߛߐߘߊ ߟߎ߬ + ߌ ߟߊ߫ PeerTube ߛߐߘߊ߫ ߤߍߣߍ߲ߣߊ߲ߕߊ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫ + ߛߐߘߊ ߏ߬ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫ + ߕߏߟߏ߲ߟߊ߲ + ߊ߬ߓߍ߯ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ + ߥߙߏߝߋ ߟߎ߬ + ߖߌ߬ߦߊ߬ߖߟߎ ߟߎ߬ + ߓߟߏ + ߕߣߐ߬ߓߐ߬ߟߊ ߟߎ߬ + ߕߌߛߐ߲ ߠߎ߬ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߣߌߎߔߌߔ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߛߎ߬ߢߊ߬ ߞߋߟߋ߲߫ ߔߋ߫ + ߞߐߕߐ߮ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߟߎ߬ ߞߐߡߌ߲ߦߊ߫ + [ߟߐ߲ߓߊߟߌ] + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫ + ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߋ߲߬ߕߊ߯ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߥߦߏ߬ ߞߎߘߊ ߟߎ߬ + ߡߊ߬ߝߘߎ߬ߟߌ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߞߊ߬ ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߝߌߘߊ߲߫ + ߥߦߏ߬ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ ߊ߬ߣߌ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߡߊ߬ߝߍ߬ߣߍ߲߬ߣߍ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟ + ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߛߋ߫ ߡߊ߫ ߞߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߓߍ߯ ߖߛߐ߫ ߟߋ߫ + ߝߎ߬ߕߎ߲߬ߕߌ߬ ߘߊߓߍ߲߬ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫ + ߟߛߊ߬ߦߌ߬ߟߌ ߞߊ߬ ߝߘߊ߫ ߕߏߟߏ߲ߠߊ ߝߎ߬ߕߎ߲߬ߕߌ ߟߊ߫ + ߞߐߞߊ߲߫ ߕߏߟߏ߲ߟߊ߲ ߠߎ߬ ߕߍ߫ ߛߘߌ߬ߜߋ߲߬ ߛߎ߯ߦߊ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ + ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ + ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ + ߥߏ߬ߦߏ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߕߏߟߏ߲߫ ߠߊ߫ + ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߊߘߌ߬ߢߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߟߎ߫ ߞߐߞߊ߲߬ + ߣߌߎߔߌߔ ߓߘߊ߫ ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߛߐ߬ߘߐ߲߬߸ ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊ߲߭ߕߍ߰ + ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ ؟ + ߞߵߊ߬ ߞߏߝߐ߫ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫ + ߘߊ߲߬ߕߍ߰ߟߌ߬ ߢߊ߲ߞߊ߲ߦߊߣߍ߲ ߓߊߓߌߟߊ߫ + ߊ߬ ߞߏߝߐ߫ GitHub ߞߊ߲߬ + ߊ߬ ߞߏߝߐ߫ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߥߟߊ߬ ߞߵߊ߬ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ ߢߣߊߥߟߊ ߘߐ߫ ߕߏ߲ߘߋߣߍ߲߫ ߃ߝߍ߬ + ߝߏߛߌ߬ ߕߍ߫ ߦߋ߲߬ + ߊ߬ ߕߣߍߣߍ߫ ߞߵߊ߬ ߘߊߕߏߡߦߊ߫ + ߦߋߡߍ߲ߕߊ + ߊ߬ ߡߊߝߍߣߍ߲߫ ߣߴߌ ߟߊ߫ ߝߙߋߞߋ߫ ߛߎ߮ ߣߌ߲߬ ߘߊ߲߭ߕߍ߰ߣߍ߲߫ ߞߘߐ߬ߡߊ߲߫. ߝߙߋߞߋ߫ ߞߋߟߋ߲ ߓߊ߫ ߞߏߝߐ߫ ߞߏ߫ ߝߌ߲߬߸ ߏ߬ ߦߋ߫ ߊ߲ ߠߊ߫ ߕߎ߬ߡߊ ߟߋ߬ ߘߐߕߌߢߍ߫ ߟߊ߫߸ ߞߊ߬ ߞߏ߫ ߜߘߍ߫ ߟߎ߫ ߞߍ ߘߐߛߊ߬ ߊ߲ ߡߊ߬. + ߞߊ߲߬ߛߓߍ + ߝߊ߬ߝߘߎ߬ߓߊ߯ ߖߊ߬ߕߋ ߡߊ߬ߛߐ߬ߘߐ߲߬ߣߍ߲߬ ߕߍ߫ + ߞߊ߬ ߗߋߢߊ߫ ߟߎ߬ ߟߊߦߟߍ߬ߡߊ߲߬߸ ߡߍ߲ ߠߎ߬ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߕߋ߲߬: + ߡߊ߬ߝߘߎ߬ߓߊ߰ ߝߏߛߌ߬ + + ߡߊ߬ߝߘߎ߬ߓߊ߰ %s + + ߦߋߟߌ߫ ߕߍ߫ ߦߋ߲߬ + + ߦߋߞߏ߫ %s + + ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߘߐߜߍ߫ ߠߊ߫ + + ߘߐߜߍߓߊ߯ %s + + ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߟߊߡߍ߲߫ ߠߊ߫ + + ߟߊ߬ߡߍ߲߬ߓߊ߰ %s + + ߦߋߡߍ߲ߕߊ߫ ߕߍ߫ ߦߋ߲߬ + ߦߋߡߍ߲ߕߊ߫ ߁߀߀+ + ߞߊ߲߬ߞߎ߬ߡߊ߬ ߕߍ߫ ߦߋ߲߬ + + ߥߦߏ߬ ߞߎߘߊ߫ %s + + ߞߵߊ߬ ߟߊߟߐ߬ + ߞߵߊ߬ ߛߌ߲ߘߌ߫ + ߜߋ߲߬ߟߎ߲߬ߠߌ߲߫ ߘߊ߬ߡߊ + ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬ + ߞߵߊ߬ ߕߐ߯ߟߊ߫ + ߞߐߕߐ߯ ߕߐ߮ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߢߐ߲߰ߝߍ + ߝߎ߬ߕߎ߲߬ߕߌ + ߣߌߎߔߌߔ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߟߊ߫ + ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߕߐ߬ߝߍ߬ߦߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߫ ߛߌ߫ ߡߊ߫ ߘߊ߬ߠߊߕߍ߰ ߡߎߣߎ߲߬߸ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߬ ߖߏߣߡߊ ߛߎߥߊ߲ߘߌ߫ ߛߌߛߍ߲߬ + ߞߵߊ߬ ߝߎߟߋ߲߫ + ߞߟߏߘߋ߲߫ ߞߙߍߞߙߍߣߍ߲ ߝߊ߲߬ߓߊ + ߣߌߎߔߌߔ ߞߊ߲߬ + © %1$s߸ %2$s ߓߟߏ߫ %3$s ߞߘߐ߫ + ߊ߬ ߞߊ߲߬ & ߢߞߛ + ߡߊ߬ߜߍ߲߬ߠߌ߲ ߞߍ߫ + ߣߌߎߔߌߔ ߟߊ߬ߘߌߜߍ + ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ + ߣߴߌ ߞߊ߬ ߜߟߍ߬ߦߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߟߥߊߟߌߟߊ߲ ߠߊߓߊ߯ߙߊ ߘߐ߫߸ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߡߊߝߍߣߍ߲߫ ߹ + ߘߝߐ߬ߦߊ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߝߌ߬ߛߌ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߘߐ߫؟ + ߦߋߡߍ߲ߕߊ߫ ߦߋߣߍ߲ߓߊ ߟߎ߬ + ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߣߐߘߐ + ߏ߬ ߘߴߌ ߟߊ߫ ߛߋ߲߬ߠߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߓߍ߯ ߝߌߘߊ߲߫. + ߛߎߥߊ߲ߘߟߌ ߞߍ߫ ߛߏ߬ߙߌ߲߬ߘߐ ߟߎ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߫ ߦߌ߬ߘߊ߬ߕߐ߫ ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߊ߲߬ + ߝߌ߬ߛߌ ߘߏ߫ ߕߣߍ߬ߣߍ߫ ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߞߐߜߍ߫ ߘߐߞߏߟߏ߲ + ߡߊ߬ߝߘߎ߬ߓߊ߰ ߕߍ߫ ߥߙߏߝߋ ߟߊ߫ ߝߟߐ߫ + ߥߙߏߝߋ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߝߍ߲߬ߛߍ߲߫ + ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߛߏ߬ߘߊ߲߬ߛߏ߬ ߅߀ + ߞߍߟߌ߫ ߖߏߣߡߊ ߞߣߐߘߐ߫ ߘߊߦߟߍ ߘߐ߫ — %s + ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ + ߝߎ߲ߞߊ߲ߡߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ + ߞߊ߬ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߞߍ߫ ߞߎߘߍߦߌ߫ + ߡߊ߲߬ߞߊ߲ ߕߍ߰ + ߡߊ߲߬ߞߊ߲ ߓߌ߬ߟߊ߬ + ߊ߬ ߞߍ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߘߌ߫ + ߞߏ߬ߋ߬ߞߏ߬ߋ߬ ߘߎ߲ߡߕߊ ߓߐ߫ ߦߋ߲߬ + ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊߞߎ߲߬ߘߎ߬ + ߟߌ߬ߥߟߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲… + ߞߣߐߘߐ߫ ߡߊߢߌߣߌ߲ߣߍ߲ ߖߛߐߟߌ + ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎߘߊ + ߞߵߊ߬ ߘߐߕߐ߯ߟߊ߫ + ߞߊ߬ ߜߡߊ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ؟ + ߕߏߟߏ߲߫ ߛߙߍߘߍ ߓߘߊ߫ ߛߌ߲ߘߌ߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫ + ߓߊߟߌߣߍ߲ ߓߘߊ߫ ߝߙߊ߬ ߛߎ߬ߢߊ߬ %d + ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ (ߟߊ߬ߦߟߍ߬ߓߊ߮ ߡߊ߫ ߛߐ߬ߘߐ߲߬) + ߞߘߐ߫ ߛߓߍ߫ ߛߌ߫ ߕߍ߫ ߦߋ߲߬ + ߞߵߊ߬ ߟߊߓߍ߲߬ + ߞߵߊ߬ ߟߝߊ߫ + ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ + ߞߘߐߛߓߍ ߟߎ߬ + ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߫ ߜߋ߬ߟߎ߲ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߜߊߘߊ߲߫ + ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߝߙߊߕߌ ߦߌ߬ߘߊ߬ + ߝߎ߬ߕߎ߲߬ߕߌ߬ ߛߐߓߌߘߐߓߏ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫ + ߞߵߊ߬ ߟߊߛߣߍ߫ + ߊ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߯ + ߞߵߊ߬ ߟߊߓߐ߫ ߞߊߕߘߍ߬ + ߟߊ߬ߛߣߍ߬ߟߌ ߦߴߌߘߐ߫… + ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫ + ߟߊ߬ߓߐ߬ߟߌ߫ ߕߊ߬ߡߌ߲߬ߣߍ߲ + ߦߋߡߍ߲ߕߊ߫ ߞߎߘߊ + ߦߋߡߍ߲ߕߊ߫ ∞ + + ߦߋߡߍ߲ߕߊ߫ %s + + ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߞߐ߬ߣߐ߲߬… + ߊ߬ ߓߘߊ߫ ߓߊߓߌߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ + ߊ߬ ߡߊ߫ ߛߋ߫ ߓߊߓߌߟߊ߫ ߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ + ߢߋߙߋ߲ߞߎ߲߫ ߖߊ߬ߕߋ߬ߓߐ + ߡߊ߬ߞߏ ߦߋ߫ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߣߌ߲߬ ߠߊ߫ ߞߊ߬ +\nߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߊߦߟߍ߬ + ߝߛߌ߬ ߞߋߟߋ߲߫ ߓߘߊ߫ ߖߏ߬ߛߌ߬. + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ ߡߊߢߌߣߌ߲ߣߍ߲߫ + ߌ ߓߴߊ߬ ߝߎߟߋ߲߫ ߦߋ߫ \"ߊ߬ ߓߘߊ߫ ߓߊ߲߫\" ߛߐ߲߬ߞߌ߲߫ + ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߣߍ߲ ߠߎ߬ ߞߐߕߐ߯ ߕߐ߮ ߘߐ߫ + ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߓߊߟߌ ߟߎ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ߕߐ߫ ߡߐ߬ߟߐ߲ ߣߌ߬ ߠߋ߬ ߟߊ߫ + ߣߘߐ߬ߓߌ߬ߟߊ߬ߟߌ߬ ߞߟߏߘߋ߲ + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ + ߟߊ߬ߘߌߢߍ ߟߎ߬ + ߊ߬ ߡߊߝߍߣߍ߲߫ GitHub ߞߊ߲߬ + ߊ߲ ߞߣߐߘߐߘߌߦߊ߫ + ߞߊ߬ ߓߟߏߢߐ߲߯ߠߊߛߊ߬ߦߌ߬ + ߊ߬ ߞߍ߫ ߘߊ߫ ߘߟߊߡߌߣߊߟߌ߫ ߡߙߌߦߊ߫ ߘߌ߫ ߓߊ߬߸ ߥߟߊ߫ ߡߊ߬ߞߙߍ߬ߟߌ߫߸ ߥߟߊ߫ ߘߏߝߙߍߕߍ߫ ߟߛߊߣߌ߲ߧߊ߫߸ ߤߊߡߊ߲ߕߍ߫ ߘߏߝߙߍߕߍ߫ ߡߝߊߟߋ߲. ߘߍ߬ߡߍ߲ ߞߍ߫ ߘߊ߫ ߢߊ߫ ߛߌ߫ ߡߊ߬߸ ߊ߬ ߞߊߢߌ߲߬. ߏ߬ ߟߋ ߦߴߊ߬ ߟߊߢߊ߬ ߟߊ߫ ߓߘߍߞߍ߹ + ߗߍߦߙߐ + ߣߌߎߔߌߔ ߟߊ߫ ߗߍߦߙߐ ߡߊߝߍߣߍ߲߫ ߞߊ߬ ߟߌ߬ߤߟߊ ߟߎ߬ ߣߌ߫ ߗߍߞߎߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. + ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ + ߞߊ߬ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߊ߬ߙߊ߲߬ + ߞߊ߬ ߟߊ߬ߘߌߢߍ ߞߊ߬ߙߊ߲߬ + ߊ߬ ߡߊߝߍߣߍ߲߫ ߗߍߦߙߐ ߟߊ߫ + ߘߝߐ߬ߦߊ + ߞߐߟߕߊ߫ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ + ߥߙߏߝߋ߫ ߞߐߜߍ + ߝߎ߲ߞߎ߲ߟߋ߲ + ߥߙߏߝߋ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߝߎ߲ߞߎ߲ߟߋ߲߫ ߖߏߣߡߊ + ߝߎ߲ߞߎ߲ߟߋ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߊ߬ ߓߘߊ߫ ߟߊߛߣߍ߫ + ZIP ߞߐߕߐ߮ ߕߍ߫ ߛߐ߲߬ + ߊ߬ ߓߘߊ߫ ߟߊߓߐ߫ + ߖߊ߲߬ߕߏ߬ߒߘߐ: ߞߐߕߐ߮ ߟߎ߬ ߓߍ߯ ߕߍ߫ ߛߋ߫ ߟߊߛߣߍ߫ ߟߊ߫. + ߕߏߟߏ߲߫ ߛߙߍߘߍ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߬ ߕߍ߫ ߝߟߐ߫ + ߞߊ߲ ߘߌߣߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߣߌ߫ ߟߥߊߟߌߟߊ߲ ߣߊ߬ ߘߊ߫ ߘߐߟߥߌ߬ + ߛߊ߲ߞߊߥߟߌ ߟߎ߬ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߖߛߐ߫ ߟߊ߫ + ߘߌ߲߬ߞߌ߬ߙߊ߬ߡߊ + ߘߌߦߊߢߍߣߍ߲ߓߊ ߟߎ߬ + ߜߊ߬ߙߊ ߟߎ߬ + ߕߏߟߏ߲߫ ߛߙߍߘߍ + ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߢߊߓߐߟߌ ߟߎ߬ + ߊ߬ ߘߌ߯ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߞߎߘߊ ߣߌ߫ ߞߟߊߡߊ߲ + ߞߎߘߊ߫ ߝߙߊ߬ߣߍ߲ ߠߎ߬ + ߞߵߊ߬ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߊ߬ ߓߘߊ߫ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫ + ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߥߏ߬ߦߏ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߖߛߐ ߦߴߌߘߐ߫… + ߢߣߊߥߟߊ ߘߊߦߟߍ߬ + ߢߣߊߥߟߊ ߘߊߕߎ߲߯ + ߟߞߊ߬ߟߌ߫ ߞߍߟߊ߲߫ ߛߊ߬ߥߏ߬ߣߍ߲ߕߊ + ߕߐ߮ + ߞߵߊ߬ ߝߙߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊ߫ + LeakCanary ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߞߊ߬ ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߬ ߦߌ߬ߘߊ߬ + ߞߊ߬ \"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\" ߦߌ߬ߘߊ߬ + ߞߊ߬ \"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\" ߦߌ߬ߘߊ߬ + ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߠߊߥߟߌ߬ + ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߠߊߜߊߛߊ߲߫ + ߗߋߢߊߟߌ ߟߎ߬ ߞߟߏߜߍ߫ ߓߐߛߎ߲ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߕߐ߫ ߟߋ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߘߐ߫ + ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ + ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߣߴߌ ߞߊ߬ ߥߊ߲߬ߊߥߊ߲߬ ߝߌ߲ ߦߋ߫ ߥߟߊ߫ ߜߊߘߊ߲ߜߊߘߊ߲ߠߌ߲ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߐߛߊߙߌ߫ ߕߎߡߊ + ߞߊ߬ ߖߌ߬ߦߊ߬ߓߍ߫ ߦߌ߬ߘߊ߬ߟߊ߲ ߠߎ߫ ߝߍ߲߬ߛߍ߲߫ + ߏ߬ ߦߋ߫ ߔߌߛߊߞߏ߫ ߟߊ߫ ߡߙߎߝߋ߫ ߞߟߐ߬ߡߊ ߟߎ߫ ߟߋ߬ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߫ ߞߎ߲߬ߘߐ߫ ߞߵߊ߬ߟߎ߬ ߓߐߛߎ߲ ߦߌ߬ߘߊ߬: ߥߎߟߋ߲߬ߡߊ߲ ߦߋ߫ ߞߙߏ߬ߝߏ ߕߊ ߘߌ߫߸ ߓߊ߯ߡߊ ߦߋ߫ ߝߘߍ߬ ߜߍߟߍ߲ ߕߊ ߘߌ߫ ߊ߬ߣߌ߫ ߝߙߌߛߌߡߊ ߦߋ߫ ߦߟߌߕߏߟߊ߲ ߕߊ ߘߌ߫ + ߟߊ߬ߓߐ߬ߟߌ ߦߴߌߘߐ߫… + ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߟߊߛߊ߬ߣߍ߲ ߠߋ߬ + ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߘߌ߬ߢߍ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߛߎߥߊ߲ߘߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߞߐߟߊ߫ + ߛߓߍߘߋ߲ ߣߋ߫ ߖߊ߬ߕߋ߬ߘߋ߲ ߠߎ߬ + ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߊ ߞߊߟߌ߲ ߣߌ߫ ߝߍ߯ߡߊ߲ ߊ߲ߘߙߏߦߌߘ ߞߊ߲߬. + ߣߌߎߔߌߔ ߟߊߥߙߌߞߌߣߍ߲߫ ߓߐߒߖߘߍߘߐߓߊ߮ ߟߎ߫ ߟߋ߬ ߓߟߏ߫ ߊ߬ߟߎ߬ ߟߊ߫ ߕߎ߬ߡߊ߬ ߘߐ߬ߞߏߟߏ߲ ߠߎ߬ ߘߐ߫߸ ߞߴߊ߬ ߟߊߢߊ߬ ߊ߬ߟߎ߬ ߛߋߞߏ߫ ߘߊ߬ߡߊ߬ߦߌߙߊ ߟߊ߫. ߌ ߘߌ߫ ߛߋ߫ ߝߌ߬ߙߋ߲߬ߕߎ߬ ߛߐ߲ߞߐ ߘߌ߫ ߟߴߊ߬ߟߎ߫ ߡߊ߬߸ ߞߴߊ߬ߟߎ߬ ߞߣߐߘߐߘߌߦߊ߫ ߟߢߊ߬ߟߌ ߟߊ߫ ߓߘߍߞߍ. + ߣߌߎߔߌߔ ߘߊߞߎ߲ ߦߴߊߟߎ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߕߊ߬ ߟߊ߫ ߛߍ߬ߓߍ ߖߍ߬ߘߍߖߍ߬ߘߍ ߟߋ߬ ߟߊ߫. ߏ߬ ߘߐ߫߸ ߟߥߊߟߌߟߊ߲ ߕߍ߫ ߟߐ߲ߕߊ߫ ߛߌ߫ ߟߥߊ߫ ߟߊ߫ ߣߴߊ߬ ߡߴߌ ߟߊ߫ ߘߌ߬ߢߍ ߢߌߣߌ߲߫. +\nߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߦߴߊ߬ ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߟߴߌ ߢߍ߫ ߟߋ߬ ߥߘߋ߬ߥߘߋ߬ߟߌ ߘߝߊߣߍ߲ ߘߐ߫߸ ߟߐ߲ߕߊ߫ ߢߌ߬ߡߊ߲߬ ߠߥߊߕߐ߫ ߊ߬ ߣߌ߫ ߢߌ߬ߡߊ߲߬ ߠߊߞߎ߲߬ߘߎ߲߬ߕߐ߫ ߌ ߓߊ߫ ߞߍ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߟߊ߫. + ߣߌߎߔߌߔ (NewPipe) ߦߋ߫ ߡߊ߬ߞߏ߬ߟߊ߬ߓߐ߬ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫: ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߵߊ߬ ߞߊ߬ߙߊ߲߬߸ ߞߵߊ߬ ߘߐߕߟߊ߫߸ ߊ߬ߣߌ߫ ߞߵߊ߬ ߟߊߢߊ߬ ߦߏ߫ ߊ߬ ߘߎߡߊ߲߫ ߌ ߢߍ߫ ߢߊ ߡߍ߲. ߊ߬ ߕߌ߯ߕߌ߮ ߘߐ߫߸ ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߠߊ߫ ߥߟߊ߫ ߞߊ߬ ߘߐ߬ߝߊ߬ߟߋ߲߬ߠߌ߲ ߞߍ߫ ߊ߬ ߘߐ߫ ߝߘߏ߬ߓߊ߬ ߟߊߘߌߢߍ߫ ߛߙߊߕߌ ߟߎ߬ ߞߘߐ߫ (GNU General Public License) ߦߏ߫ ߊ߬ ߟߊߖߍ߲ߛߍ߲ߣߍ߲߫ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߎ߬ ߛߌ߲ߘߌߘߊ ߓߟߏ߫ ߢߊ ߡߍ߲ (Free Software Foundation) ߊ߬ ߓߐߞߏ߫ ߃߲ ߘߐ߫߸ ߥߟߊ߫߸ ߌ ߛߊ߬ߥߏ߬ߣߍ߲߬ߕߊ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߊ߬ ߓߐߞߏ߫ ߞߘߐ߫ ߛߌ߫ ߡߊ߬. + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߝߊߣߊ߲߫ ߟߊߛߣߍ߫؟ + ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߊ߲߬ߝߘߊ ߞߘߐ߫ + ߦߙߍߞߍߟߌ ߦߴߌߘߐ߫... ߊ߬ ߘߌ߫ ߛߋ߫ ߥߛߎ߬ ߞߎߘߎ߲߬ߣߍ߲߫ ߕߊ߬ ߟߊ߫ + ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬. + ߞߵߊ߬ ߥߊߘߏ߫ + ߞߊ߬ Rx ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ߫ ߟߊߘߌߓߊߟߌ ߟߎ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߞߘߊߡߊ߫ ߞߎߘߎ߲ ߠߎ߬ ߞߐߞߊ߲߬ ߥߟߊ߫ ߥߊߟߌߦߊ ߛߌ߬ߡߊ߬ߦߊ ߞߎ߲߬ߕߊ߮ ߞߘߐ߫ ߦߙߍߞߍߟߌ߫ ߞߐߝߍ߬ + ߞߊ߬ ߕߎ߬ߡߘߊ߬ ߓߐߛߎ߲ߡߊ ߦߌ߬ߘߊ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߎ߫ ߞߊ߬ + ߜߘߍ ߟߊ߫ ߟߊ߬ߘߌߢߍ + ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ + ߝߌ߬ߛߌ ߣߌ߲߬ ߦߋ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߝߎߛߋߡߦߊߣߍ߲ ߠߎ߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫. + ߞߊ߬ ߞߟߏߜߍ߫ ߘߍ߲߬ߘߍ߲ ߣߌ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߫ ߞߘߐߛߓߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߝߙߋߞߟߊ ߟߎ߬ ߡߊߝߊ߬ߟߋ߲߬. ߡߊ߬ߞߏ ߦߋ߫ ߟߥߊߟߌߟߊ߲߫ ߘߐ߬ߥߌ߬ߟߌ ߟߊ߫ ߞߵߊ߬ ߓߟߏߦߊ߫ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߛߌ߬ ߓߊ߲ߣߍ߲ ߠߎ߬ ߞߏߐߝߐ߫ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߍ߫ ߟߊߛߣߍ߫ ߟߊ߫ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊߓߐ߫ ߟߊ߫ + ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮߸ soundcloud.com/ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮ + ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߗߋߥߊߟߌ ߣߌ߲߬ ߘߌߣߊ߬ ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߛߐ߫ ߞߏߛߓߍ߫. +\n +\nߞߵߊ߬ ߓߟߏߕߎ߲߰؟ + ߞߵߊ߬ ߢߡߊߛߊ߬ߦߌ߬ + ߞߊ߲ߡߊߛߙߋ߫-ߕߟߊ + ߞߊ߬ ߓߍ߲߬ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߝߘߏ߬ߓߊ߬ ߞߎߙߎ߲ߘߎ (GDPR) ߡߊߓߏ߲߬ߧߊ ߡߊ߬߸ ߊ߲ ߧߴߌ ߖߊ߲߭ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߐ߫. ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߘߐߞߊ߬ߙߊ߲߬ ߞߏߢߌ߲߬ߡߊ߬. +\nߌ ߞߊߞߊ߲߫ ߠߋ߬ ߞߵߌ ߛߐ߲߬ ߊ߬ ߡߊ߬ ߞߏ߫ ߛߴߌ ߘߌ߫ ߛߋ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߊ߲ ߡߊ߬. + ߌ ߛߐ߲߬ + ߌ ߓߊ߲߬ + ߘߊ߲߬ ߕߴߊ߬ ߟߊ߫ + ߞߊ߬ ߓߍ߲߬ߡߊ ߘߊ߲߬ߠߊߕߍ߬ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߕߎߡߊ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߣߊ߬ + ߞߙߏ߬ߝߏ߫ ߛߎ߮ ߓߍ߯ + ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ + ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ ߡߊߝߍߣߍ߲߫ + ߞߊ߬ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲߫ ߓߟߏ ߟߊ߫ + ߞߵߊ߬ ߡߊߖߌ߰ ߟߥߊߟߌߟߊ߲ ߘߐߦߟߍߡߊ߲߫ ߕߎߡߊ + ߝߏߛߌ߬ + ߞߵߊ߬ ߡߊߖߌ߰ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߊߦߟߍ߬ ߊ߬ ߖߍ߬ߘߍߡߊ߬ — %s + ߥߝߌ߫ ߘߐߙߐ߲߫ ߞߊ߲߬ + ߦߋߟߌ߫ ߗߏ߯ߦߊ߫ ߛߙߍߘߍ + ߢߊ߲ߛߊ߲ + ߔߊ߬ߔߘߊ + ߖߘߍ߬ߢߍ߫ + ߞߊ߬ ߢߍߕߊ߮ ߜߊߟߊ߲ߞߊ ߟߊߕߌ߲ ߦߌ߬ߘߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߞߊ߲߬ + ߓߘߍ߬ߦߊ߫ ߘߎ߰ߟߊ߬ߕߊ (ߘߐ߰ߡߊ߬ߣߍ߲) + ߊ߬ ߞߣߊ߫ ߦߌ߬ߘߊ߬ + ߌ ߦߋ߫ ߣߌߎߔߌߔ ߓߐߞߏ߫ ߟߊߓߊ߲ ߠߋ߬ ߟߊߓߊ߯ߙߊ ߟߊ߫ + ߊ߬ ߕߐߘߐ߲߫ ߞߵߊ߬ ߟߊߖߌ߰ %s + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߘߞߐ߬ߣߐ߲߬ߠߌ߲ + ߊ߬ ߟߊߟߐ߬ߣߍ߲߫ + ߞߐߝߍ߫-ߦߙߍߞߍߟߌ + ߟߛߊ߬ߦߌ߬ߟߌ + ߞߵߊ߬ ߟߊߕߎ߲߰ + ߓߊ߲߬ ߓߘߊ߫ ߞߍ߫ ߗߋߥߊߟߌ ߘߐ߫ ߞߊ߲ߞߋ ߓߟߏ߫ + ߟߏ߲ߘߐߦߊߟߌ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߦߴߌߘߐ߫… + ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ + ߞߐߕߐ߯ ߘߏ߫ ߓߘߊ߫ ߟߊߖߌ߰ ߕߐ߯ ߛߎ߯ ߞߋߟߋ߲ ߣߌ߲߬ ߘߌ߫ ߞߘߐ߬ߡߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߴߌߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫ + ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߦߌ߬ߘߊ߬ + ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߠߊߞߊ߲ߘߊߣߍ߲ ߕߍ߫ ߛߋ߫ ߓߌ߬ߟߊ߬ ߟߊ߫ ߛߋ߲߬ߠߊ߫ + ߛߐߘߊ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ + ߛߐߘߊ ߕߍ߫ ߟߐ߲ߕߊ߫ ߟߊߣߊ߬ ߟߊ߫ + ߊ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߞߐߝߍ߫-ߦߙߍߞߍߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ + ߣߌߎߔߌߔ ߘߊߕߎ߲߯ ߘߊ߫ ߟߋ߬ ߞߵߊ߬ ߕߘߍ߬ ߊ߬ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ ߞߐߕߐ߮ ߞߊ߲߬ + ߜߍߞߣߍ߫ ߛߌ߫ ߕߍ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߢߍߕߊ߮ ߓߘߊ߫ ߝߏ߫߸ ߓߊߏ߬ ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ + ߟߊ߬ߖߌ߰ߟߌ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫ + ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߫ + ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߝߍ߬ߘߍ ߞߊ߲߬ ؟ + ߟߥߊߟߌߟߊ߲߫ ߞߊ߲ + ߞߵߊ߬ ߟߞߊߟߌߦߊ߫ ߡߊ߬ߞߎ߲ ߕߎ߬ߡߊ ߟߎ߬ ߘߐ߫ + ߛߋ߲߬ߘߊ + ߗߡߍ߬ߘߐ߬ߦߊ + ߕߎ߬ߢߊ߬ߟߐ߲ ߡߊߛߊ߬ߦߌ + ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߛߎ߯ߦߊ + ߞߊ߬ ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߦߌ߬ߘߊ߬ ߣߌ߫ ߓߐߞߏ߫ ߞߎߘߊ߫ ߛߐ߬ߘߐ߲߬ ߘߊ߫ + ߞߵߊ߬ ߡߊߖߌ߰ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߐ߫ + ߤߓߊߘߊ߲߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߞߊ߬ ߕߐ߯ ߞߎ߲߬ߞߋߟߋ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫ + + ߟߊ߬ߖߌ߰ߟߌ߬ %s ߓߘߊ߫ ߓߊ߲߫ + + ߞߵߊ߬ ߞߊ߲߬ߟߊ߫ + ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߦߋ߫ ߞߐߕߐ߮ ߘߏ߫ ߟߊ߫ ߦߊ߲߬ ߞߘߐ߬ߡߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߋ߫ ߘߞߐ߬ߣߐ߲߬ߠߌ߲ ߠߊ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ ߖߊ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߘߐߛߊ߬ ߕߍ߫ + ߞߵߊ߬ ߓߟߏߕߍ߰ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߠߊ߫ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߟߊ߫ + ߊ߬ ߕߐ߬ߣߐ ߦߴߊ߬ ߟߊ߫ ߦߟߍ߬ߡߊ߲߬ ߕߎߡߊ ߜߋߟߋ߲ߜߋߟߋ߲ߠߊ߫ ߟߐ߲ߕߊ ߟߎ߫ ߞߊ߲߬߸ ߞߏ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߓߍ߯ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߘߎ߲߬ߠߌ߲ ߡߊ߬ + ߞߵߊ߬ ߘߊߕߎ߲߯ + + ߟߊ߬ߖߌ߰ߟߌ߬ %1$s ߓߘߊ߫ ߖߏ߬ߛߌ߬ + + ߞߵߊ߬ ߟߊߟߐ߬ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߡߌ߬ߣߊ߬ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߟߊߘߎ߲߫ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߥߊ߫ ߦߙߐ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߫ + ߌ ߣߊ߬ߕߐ߫ ߟߋ߬ ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߟߊߞߎ߲߬ߘߎ߲߬ ߦߙߐ ߡߊ߬. +\nߟߊ߬ߘߌߢߍ ߘߌ߫ ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߡߊ߬ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߟߊߖߌ߰ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߠߋ߫ ߞߊ߲߬ + ߞߊ߬ ߘߊ߲߭ߛߌ߰ ߟߊ߬ߖߌ߰ߟߌ߫ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߫ ߣߊ߬ߕߐ߬ ߞߍ߫ ߟߊ߫ ߕߎ߬ߡߊ߬ߣߍ߲߬ ߞߋߟߋ߲ ߠߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߓߍ߯ ߟߊߞߎ߲߬ߘߎ߬ ߦߙߐ ߘߌߣߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߵߌ ߟߊ߫ + ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߟߊߓߊ߯ߙߊ߫ + ߛߐߘߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ + ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ߛߙߍߘߍ ߣߌ߲߬ ߘߐ߫ ؟ + ߌ ߟߊ߫ ߦߕߎߓߎ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߫ Google Takeout: +\n +\n߁. ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߐߡߌ߬ߘߊ߬: %1$s +\n߂. ߌ ߜߊ߲߬ߞߎ߲߬ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ +\n߃. ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߦߴߊ߬ ߘߐ߫\"߸ ߏ߬ ߞߐ߫ ߦߋ߫ \"ߞߊ߬ ߓߍ߯ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߓߐ߫\"߸ ߏ߬ ߞߐ߫߸ ߌ ߦߋ߫ \"ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬\" ߘߐߙߐ߲߫ ߓߊߕߐߡߐ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߏ߬ߞߍ߫\" ߛߐ߲߬ߞߌ߲߫ +\n߄. ߌ ߦߋ߫ \"ߢߍߕߊ\" ߛߐ߲߬ߞߌ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߟߊ߬ߓߐߟߌ ߘߏ߫ ߛߌ߲ߘߌ߫\" ߛߐ߲߬ߞߌ߲߫ +\n߅. ߌ ߦߋ߫ \"ߞߊ߬ ߟߊߖߌ߰\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߟߊ߲ߞߣߍߡߊߣߍ߲ ߞߐ߫ +\n߆. ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫ ߦߊ߬߸ ߦߋ߫ .zip ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߛߎߥߊ߲ߘߌ߫ +\n߇. [ߣߌ߫ ߝߝߝ ߟߊߛߣߍ ߗߌߙߏ߲߫ ߘߊ߲߫] ߦߋ߫ ߝߝߝ ߞߐߕߐ߮ ߓߐ߬ߛߌ߬ ߊ߬ ߘߐ߫ (ߊ߬ ߛߌߦߊߡߊ߲ ߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߠߋ߬ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\")߸ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߐߕߐ߮ ߟߊߛߣߍ߲߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫߸ ߞߊ߬ csv ߞߐߕߐ߯ ߓߐ߬ߛߌ߬ߣߍ߲ ߛߎ߲ߥߊ߲ߘߌ߫ + ߌ ߟߊ߫ SoundCloud ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߠߊߘߏ߬ ߥߊߟߴߌߟߊ߫ ߜߊ߬ߞߎ߲߬ߕߐ߮ ߞߊ߬ SoundCloud ߢߊߞߙߍ߫ ߘߏ߫ ߟߊߛߣߍ߫: +\n +\n߁. \"ߛߓߍߘߊ߫ ߗߏ߯ߦߊ\" ߟߊߢߊ߯ ߌߟߊ߫ ߓߟߐߟߐ߫ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ (ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߏ߬ ߕߴߌߟߊ߫ ߕߙߏߞߏ߫ ߕߊ߬ߕߊ ߟߊ߫) +\n߂. ߥߊ߫ ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߊ߲߬: %1$s +\n߃. ߌ ߜߊ߲߬ߞߎ߲߬ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ +\n߄. ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߓߊߓߌߟߊ߫߸ ߌ ߟߊߛߌ߲߫ ߛߊ߲ ߦߋ߫ ߡߍ߲ ߡߊ߬ ߏ߬ ߘߌ߬. + ߘߐ߬ߛߊ߬ߙߌ߬ߟߌ߫ ߓߏ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ + ߞߍߛߋ߲ + ߞߊ߲ߡߊߛߙߋ + ߓߐߢߐ߲߯ߓߟߏ (ߊ߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߘߐ߬ߝߊ߰ߟߌ ߛߊߓߎ߫ ߘߌ߫) + ߞߍߥߟߌ߫ ߞߍߕߊ߸ ߌ ߓߊ߫ ߞߍ߫ ߦߟߍ߬ߡߊ߲߬ ߠߊ߫ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫ ߞߵߌ ߕߏ߫ ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߞߊ߲߬ — %s + ߛߙߍߘߍ + ߓߘߍ߬ߦߊ߫ ߛߊ߲ߘߐߕߊ (ߓߟߋ߬ߓߟߋ߬ߓߊ) + ߣߌߎߔߌߔ ߟߏ߲ߘߐߦߊߟߌ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ ߦߋ߫߹ + ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߞߊ߲߬ߟߊ߫ ߟߊ߫ + ߞߎ߲߬ߕߋߟߋ߲߫ ߞߎ߲ߓߍ߲ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ + ߛߐߘߊ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߥߙߍ ߟߎ߫ ߡߊ߬߸ ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߛߊ߬ߦߌ߬ @string/msg_threads = 1 ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߛߋ߬ ߟߊ߫ ߞߍ߫ ߟߊ߫ ߛߐߘߊ ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߛߕߊ ߓߘߊ߫ ߓߊ߲߫ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ ߥߟߊ߫ ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ؟ + \"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\" ߟߋ߬ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬ + ߞߵߊ߬ ߘߊߡߌ߲߬ߣߊ߬ ߊ߲ߘߙߏߌߘ 10 ߡߊ߬߸ \"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\" ߟߋ߬ ߘߐ߲߬ߙߐ߲߫ ߕߊ߬ ߟߊ߫ + ߞߊ߲ߞߋ ߟߊ߫ ߖߏߣߡߊ + ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ + ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ + ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. +\nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹ + ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫ + ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫ + + ߡߌ߬ߛߍ߲߬ %d + + + ߕߎ߬ߡߊ߬ߙߋ߲߬ %d + + ߖߛߐߓߊߟߌ ߟߎ߬: %d + ߥߏ߬ߦߏ ߖߛߐ… + ߥߏ߬ߦߏ ߦߙߍߞߍ… + ߥߏ߬ߦߏ߫ ߝߋ߲߫ ߞߎߘߊ ߟߎ߬ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫ + ߡߊ߬ߝߘߎ߬ߟߌ߬ ߛߌ߫ ߛߎߥߊ߲ߘߌߣߍ߲߫ ߕߍ߫ + + %d ߛߎߥߊ߲ߘߌߣߍ߲߫ + + ߞߙߎ ߕߐ߮ ߘߐߞߏߟߏ߲ ߠߋ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߞߙߎ ߣߌ߲߬ ߖߏ߬ߛߌ߫ ؟ + ߞߎߘߊ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ߬ ߞߙߎߝߓߊߟߌ ߟߎ߬ ߘߐߙߐ߲߫ ߦߌ߬ߘߊ߬ + ߥߏ߬ߦߏ + ߥߏ߬ߦߏ߫ ߟߊߞߎߘߦߊ ߟߎ߬ ߕߍߟߊ + ߕߎ߬ߡߊ ߡߍ߲ ߕߊ߬ߡߌ߲ ߞߐ ߘߐ߫߸ ߥߏ߬ߦߏ ߟߎ߬ ߞߊߞߊ߲߫ ߞߊ߬ ߖߊ߬ߕߋ߬ ߞߘߐ߬ߡߊ߲ ߘߌ߫ — %s + ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߢߊ߯ + ߞߊ߬ ߥߏ߬ߦߏ ߟߎ߫ ߦߌ߬ߘߊ߬/ߢߡߊߘߏ߲߰ + ߣߌߎߔߌߔ ߕߍ߫ ߞߣߐߘߐ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ ߡߎߣߎ߲߬. +\n +\nߕߎ߬ߡߊ߬ ߘߐ߫߸ ߊ߬ ߘߌ߫ ߛߴߊ߬ ߕߊ߬ ߟߊ߫ ߓߐߞߏ߫ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫. + ߥߙߏߝߋ߫ ߞߐߖߌߦߊ߫ ߞߏ߬ߋߞߏ߬ߋ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. +\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬ + ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. + %s ߦߋ߫ ߞߎ߲߭ ߣߌ߲߬ ߠߋ߬ ߝߐ߫ ߟߊ߫: + ߛߊ߲ߞߊߥߟߌ + ߥߎߢߊ߲ߓߍ߲ + ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ) + ߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ — %s + ߌ ߘߌ߫ ߛߴߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ ߟߊ߫ ߘߎ߰ߟߊ߫ ߦߊ߲߬ + ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߘߊߡߌ߲߬ߣߊ߬ + ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߛߊ߬ ߞߊ߲߬ߛߓߍ ߘߐ߫ + ߝߊ߬ߓߏ߲ + ߞߊ߲ + ߞߐߞߘߐߓߌ߲ߓߌ߲ + ߖߊ߬ߕߌ߮ + ߞߏ߬ߋߞߏ߬ߋ߫ ߛߘߌ߬ߜߋ߲ + ߝߘߏ߬ߓߊ + ߊ߬ ߛߙߍߘߍߦߊߣߍ߲߫ ߕߍ߫ + ߘߎ߲߬ߘߎ߬ߡߊ + ߞߣߐߕߊ + ߞߊ߲߬ߞߎ߬ߡߊ߬ ߜߊߘߊ߲ߣߍ߲ + ߡߍ߲ ߕߊ߲߬ߘߏ߬ߣߍ߲߫ ߛߌ߲ߘߌߓߊ߮ ߓߟߏ߫ + ߥߟߊ߬ߙߋ߲ ߗߏ߯ߦߊ + ߟߊߢߊ߯ߣߍ߲ + ߟߊߛߊ߬ߣߍ߲ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߛߊ߬ߣߍ߲߫ + ߞߊ߬ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߡߊߛߐ߬ߘߐ߲߬ + ߸ + ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߓߘߍ߬ߦߊ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߓߘߍ߬ߦߊ߬ ߟߐ߲ߓߊߟߌ + ߡߎ߰ߡߍ߬ ߡߊߝߍߣߍ߲ߣߍ߲ + ߝߊ߲߬ߞߋ߬ߟߋ߲߬ ߡߊߝߍߣߍ߲ߣߍ߲ + ߣߊ߬ߕߐ + ߞߵߊ߬ ߘߐߕߐ߬ߡߐ߲߬ + ߞߊ߲ߠߊߛߓߍ ߟߎ߬ + ߟߊ߬ߘߌߢߍ + ߜߎ߲߬ߘߎ߬ߞߏ + ߛߌ߬ߞߛߊߓߌ߫ ߘߊ߲߭ + ߥߦߏ߬ ߛߎߥߊ߲ߘߌߣߍ߲ ߕߍ߫ ߕߊ߬ ߟߊ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߓߟߏ߫ + ߞߵߊ߬ ߓߍ߯ ߟߊߢߊ߯ + ߥߦߏ߬ ߟߎ߬ ߕߍߣߊ߫ ߦߌ߬ߘߊ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߬ ߕߊ߬ߣߍ߲߬ ߕߍ߫ ߡߎߣߎ߲ + ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߢߊ߲ߞߊ߲߫ ߟߐ߲ߓߊߟߌ + + ߝߌ߬ߟߊ߲߬ %d + + ߞߎߘߊ ߟߎ߬ + ߥߙߏߝߋ߫ ߘߙߎ ߟߎ߬ + ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ ߞߍ߫ ߘߊ߫: %s + + ߕߟߋ߬ %d + + ߝߎ߬ߕߎ߲߬ߕߌ ߥߏ߬ߦߏ ߖߛߐ߫ ߕߎߡߊ + \'%s\' ߥߏ߬ߦߏ ߕߍ߫ ߛߋ߫ ߖߛߐ߫ ߟߊ߫. + ߛߌ߲ߘߌߓߊ߮ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߕߍ߰. +\nߣߌߎߔߌߔ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߖߛߐ߫ ߟߊ߫ ߡߎ߬ߕߎ߲߬. +\nߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߛߊ߬ ߥߙߏߝߋ ߣߌ߲߬ ߡߊ߬ ؟ + ߥߦߏ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߕߍ߫ ߟߌ߬ߤߟߊ߬ ߘߌߦߊߡߊ߲߫ ߘߌ߫ ߟߊ߫ ߝߐߡߊ ߣߌ߲߬ ߞߊ߲߬. + ߞߵߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߥߦߏ߬ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߝߍ߬ ߣߴߏ ߘߌ߫ ߓߍ߲߬ + ߞߵߊ߬ ߟߊߞߎߘߦߊ߫ ߞߘߊߎ߫ + ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߟߊ߬ + ߞߊ߬ ߥߦߏ߬ ߢߍߕߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߛߌ߲ߘߌߣߍ߲߫ %s ߟߋ߬ ߓߟߏ߫ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߞߐߜߍ + %s ߓߟߏ߫ + ߞߐߟߕߊ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߊߓߊ߯ߙߊ߫ ߣߍ߰ߟߌ߬ ߢߊߝߘߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߣߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊ߫ + ߛߌ߰ߘߊ ߟߎ߬ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߦߌ߬ߘߊ߬ + ߟߥߊߟߌߟߊ߲߫ ߛߌ߫ ߕߴߌ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߡߍ߲ ߘߌ߫ ߛߋ߫ ߣߌ߲߬ ߠߊߞߊ߬ ߟߊ߫ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. +\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߥߟߊ߫ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߞߊ߬ \'%s\' ߟߊߛߊ߬ ߟߊ߬ߖߌ߰ߟߌ߲߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ + ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߘߎ߲߬ߘߎ߬ߡߊ ߟߋ߬ ߘߌ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. + ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߓߍ߰ + ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߢߊ߯ ߞߊ߲߬ߛߓߍ ߘߐ߫ + ExoPlayer ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ + ߝߙߏߝߋ ߣߌ߲߬ ߡߊߝߘߎߣߌ߲߫ ߌ ߓߟߏ߫ ߡߎ߬ߕߎ߲߬ + ߞߊ߬ ߞߍߦߙߐ ߘߊߦߟߍ߬ + ߣߌ߲߬ ߦߋ߫ SoundCloud Go+ ߜߋ߬ߙߋ ߘߏ߫ ߟߋ߬ ߘߌ߫߸ ߡߍ߲ ߕߴߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. + ߊ߬ ߦߋ߫ ߗߋߢߊ ߘߏ߫ ߟߎ߫ ߘߐ߫߸ ߊ߬ߟߋ߬ ߞߊߟߌߡߊ߲ߓߊ ߟߋ߬ ߝߊߣߊ߲߫ ߦߋ߫߸ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߌ߫ ߛߋ߫ ߝߌ߬ߛߌ߫ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߠߥߊ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߟߌ߬ߤߟߊ߬ ߘߝߊߓߊߟߌ ߟߎ߬ (ߟߊߒߡߊ߫ ߘߐ߫߸ ߥߎ߬ߛߎ߸ ߝߌ߬ߛߌ ߛߎ߯ߦߊ ߥߟߊ߫ ߝߊ߲ߞߢߊ߫ ߟߌ߬ߤߟߊ) + ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߣߐ߬ߓߐ߬ߟߊ߫ ߛߙߊ߬ߓߐ߬ߟߊ ߟߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. + ߊ߬ ߦߴߌ ߢߣߊ߫ ߟߋ߬ ߞߏ߫ ߥߏ߬ߦߏ ߟߎ߬ ߖߛߐ ߟߊߛߎߡߊߡߊ߲߫ ߠߋ߬ ߞߏߖߎ߯ߦߊ߫؟ ߣߴߏ߬ ߟߋ߸ ߖߛߐߟߌ߫ ߞߊߟߌ߲ ߡߊߝߍߣߍ߲߫ (ߌ ߘߌ߫ ߛߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߥߟߊ߫ ߘߎ߰ߟߊ߬ߘߐ߬ ߞߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫). +\n +\nߣߌߎߔߌߔ ߘߌ߫ ߛߋ߫ ߥߏ߬ߦߏ ߟߎ߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߢߊ߫ ߝߌ߬ߟߊ߫ ߟߋ߫ ߡߊ߬: +\n• ߞߊ߬ ߝߙߏߝߋ߫ ߡߊߝߘߎߣߍ߲ ߠߎ߬ ߡߎ߰ߡߍ ߡߊߛߐ߲߬ߘߐ߲߬߸ ߏ߬ ߛߎߡߊߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫. +\n• ߞߊ߬ ߗߋߢߊ߫ ߓߟߏߡߞߊ߬ߣߍ߲ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߏ߬ ߟߞߊߟߌߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫ ߕߍ߫. +\n +\nߞߍߢߊ߫ ߝߌ߬ߟߊ ߏ߬ ߘߊ߲߬ߝߘߊ߬ߓߐ ߦߋ߫ ߟߋ߬߸ ߡߍ߲ ߞߊߟߌߡߊ߲߫ ߏ߬ ߕߍ߫ ߟߌ߬ߤߟߊ߫ ߓߍ߯ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߦߏ߫ ߝߌ߬ߛߌ ߥߎ߬ߛߎ ߣߴߊ߬ ߛߎ߯ߦߊ (ߢߟߊ߫ ߦߋߟߌ ߘߐ߫ ߘߊ߲߬ߝߘߊ߬ߓߐ߬ ߕߴߊ߬ ߝߊ߲ߞߢߊ߫ ߦߋߡߍ߲ߕߊ ߟߎ߬ ߣߌ߫ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߕߍ߫)߸ ߊ߬ ߘߏ߲߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߴߊ߬ ߡߊ߫ ߥߙߏߝߋ߫ ߝߌ߬ߛߌ ߟߎ߬ ߓߍ߯ ߡߊߛߐ߬ߘߐ߲߬. +\n +\nߟߊߒߡߊ߫ ߘߐ߫߸ ߦߕߎߓߎ ߦߋ߫ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ߬ ߞߊߟߌ߲ (RSS ߥߏ߬ߦߏ) ߕߊ߬ ߟߊ߫. +\n +\nߏ߬ ߘߐ߫߸ ߌߟߋ ߟߵߊ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߠߊ߫: ߣߴߌ ߦߋ߫ ߞߊߟߌߦߊ ߟߋ߫ ߝߍ߬ ߥߟߊ߫ ߟߌ߬ߤߟߊ߬ ߖߐ߲ߖߐ߲. + ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. + ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ + ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. + ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߢߟߊߝߌ߲ߓߊ߯ߕߐ ߟߎ߬ ߢߌ߫߸ ߣߴߏ߬ ߘߐ߫ ߞߍ߫ ߘߊ߫ ߦߋ߲߬ + ߡߍ߲ߘߊ: %s + ߡߍ߲ߕߊ߫ ߜߙߋ + ߡߍ߲ߕߊ߫ ߜߙߋ ߘߏ߫ ߞߊߞߊ߲߫ ߞߊ߬ ߞߍ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫ + ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + Exoplayer ߢߊߓߐߟߌ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎ߲ߞߎ߲ߡߊ ߛߎ߲ߥߊ߲ߘߌ߫߸ ߊ߬ ߞߍߘߊ߫ ߞߊ߲ ߛߎ߯-ߛߎ߯ ߘߌ߫ + ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߟߊߝߌ߬ߛߊ߬ߦߊ߫ + ߡߊߟߐ߲ߓߊߟߌ + \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index eacac40f163..f329fc44e45 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -73,7 +73,7 @@ ଉଦାହରଣ ବୈଧ କରିପାରିଲା ନାହିଁ ଭିଡିଓ ବର୍ଣ୍ଣନା ଏବଂ ଅତିରିକ୍ତ ସୂଚନା ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ଅଡିଓ - ବାହ୍ୟ ଅଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଅଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ଯୋଡ଼ନ୍ତୁ ସଦସ୍ୟତା ଅଦ୍ୟତନ କରିପାରିଲା ନାହିଁ ଟ୍ୟାବ୍ ବାଛନ୍ତୁ @@ -82,7 +82,7 @@ ଭିଡିଓ ଫାଇଲ୍ ପାଇଁ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ ଡିଫଲ୍ଟ ରେଜୋଲୁସନ କୋଡି ସହିତ ଖୋଲନ୍ତୁ - ଦ୍ୱିତୀୟ କ୍ରିୟା ବଟନ୍ + ଦ୍ୱିତୀୟ କୃତ୍ୟ ବଟନ୍ ପୁନରାବୃତ୍ତି କରନ୍ତୁ ବିଜ୍ଞପ୍ତିକୁ ରଙ୍ଗ କରନ୍ତୁ ପପ୍ଅପ୍ ର ଶେଷ ଆକାର ଏବଂ ସ୍ଥିତି ମନେରଖ @@ -106,8 +106,6 @@ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା - ଭଲ୍ୟୁମ୍ ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ - ପ୍ଲେୟାରର ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ପରାମର୍ଶ ଖୋଜ ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ ସୁଦୂର ସନ୍ଧାନ ପରାମର୍ଶ @@ -143,7 +141,6 @@ ଶେଷ ପ୍ଲେବେକ୍ ସ୍ଥିତିକୁ ପୁନଃ ସ୍ଥାପନ କରନ୍ତୁ ତାଲିକାରେ ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ସୂଚକ ଦେଖାନ୍ତୁ ସମସ୍ତ କ୍ୟାଚ୍ ହୋଇଥିବା ୱେବପୃଷ୍ଠା ତଥ୍ୟ ଅପସାରଣ କରନ୍ତୁ - ପ୍ଲେୟାର ଭଲ୍ୟୁମକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ସନ୍ଧାନ କରିବା ସମୟରେ ଦେଖାଇବାକୁ ପରାମର୍ଶଗୁଡିକ ବାଛନ୍ତୁ ବାଧା ପରେ ଖେଳିବା ଜାରି ରଖନ୍ତୁ (ଯଥା ଫୋନକଲ୍) ଭିଡିଓ \"ବିବରଣୀ:\" ରେ ପୃଷ୍ଠଭୂମି କିମ୍ବା ପପ୍ଅପ୍ ବଟନ୍ ଦବାଇବା ସମୟରେ ଟିପ୍ ଦେଖାନ୍ତୁ @@ -202,27 +199,26 @@ ଡିଫଲ୍ଟ ଅଡିଓ ଫର୍ମାଟ୍ ଅକ୍ଷୟ ସନ୍ଧାନ ପ୍ଲେୟାରକୁ ହ୍ରାସ ହୋଇଥିବା ସଠିକତା ସହିତ ଶୀଘ୍ର ପଦବୀ ଖୋଜିବାକୁ ଅନୁମତି ଦିଏ । 5, 15 କିମ୍ବା 25 ସେକେଣ୍ଡ ଖୋଜିବା ଏହା ସହିତ କାମ କରେ ନାହିଁ %s ପାଇଁ ଫଳାଫଳ ଦେଖାଉଛି - ବାହ୍ୟ ଭିଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଵିଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ସଦସ୍ୟତା ରଦ୍ଦ କରନ୍ତୁ ଚ୍ୟାନେଲ ସଦସ୍ୟତା ରଦ୍ଦ ହେଲା ସଦସ୍ୟତା ପରିବର୍ତ୍ତନ କରିପାରିଲା ନାହିଁ ସୂଚନା ଦେଖାନ୍ତୁ - ମିଶାଅ + ଏଥିରେ ଯୋଡ଼ିବା ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ\? ଥମ୍ୱନେଲ କୁ 1:1 ଅନୁପାତରେ କ୍ରୋପ୍ କରନ୍ତୁ - ପ୍ରଥମ କ୍ରିୟା ବଟନ୍ - ତୃତୀୟ କ୍ରିୟା ବଟନ୍ - ଚତୁର୍ଥ କ୍ରିୟା ବଟନ୍ - ପଞ୍ଚମ କ୍ରିୟା ବଟନ୍ + ପ୍ରଥମ କୃତ୍ୟ ବଟନ୍ + ତୃତୀୟ କୃତ୍ୟ ବଟନ୍ + ଚତୁର୍ଥ କୃତ୍ୟ ବଟନ୍ + ପଞ୍ଚମ କୃତ୍ୟ ବଟନ୍ ଶଫଲ୍ ବଫରିଂ କିଛି ନୁହେଁ ଡିଫଲ୍ଟ ଭିଡିଓ ଫର୍ମାଟ୍ ପପ୍ଅପ୍ ଗୁଣଗୁଡିକ ମନେରଖ - ଉଜ୍ଜ୍ୱଳତା ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ ପ୍ରକ୍ରିୟାକରଣ… କିଛି ସମୟ ନେଇପାରେ ପ୍ଲେୟାର କ୍ୟାପସନ୍ ଟେକ୍ସଟ୍ ସ୍କେଲ୍ ଏବଂ ପୃଷ୍ଠଭୂମି ଶୈଳୀକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । କାର୍ଯ୍ୟକାରୀ ହେବାକୁ ଆପ୍ ପୁନଃଆରମ୍ଭ ଆବଶ୍ୟକ କରେ LeakCanary ଉପଲବ୍ଧ ନାହିଁ @@ -253,7 +249,7 @@ ସମସ୍ତ ପ୍ଲେ କରନ୍ତୁ ସର୍ବଦା ଫାଇଲ୍ - ବିଜ୍ଞପ୍ତି ଗୁଡିକ + ଵିଜ୍ଞପ୍ତି ଆପ୍ ଅଦ୍ୟତନ ବିଜ୍ଞପ୍ତି ନୂତନ NewPipe ସଂସ୍କରଣ ପାଇଁ ବିଜ୍ଞପ୍ତି ଭିଡିଓ ହ୍ୟାସ୍ ବିଜ୍ଞପ୍ତି @@ -273,7 +269,7 @@ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରେ ସନ୍ଧାନ ଇତିହାସ ସଫା କରନ୍ତୁ ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି\? - ବାହ୍ୟ ସଂରକ୍ଷଣ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଷ୍ଟୋରେଜ୍ ଅନୁପଲବ୍ଧ ନେଟୱର୍କ ତ୍ରୁଟି ସମସ୍ତ ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରିପାରିଲା ନାହିଁ ୱେବସାଇଟ୍ ପାର୍ସ କରିପାରିଲା ନାହିଁ @@ -392,7 +388,7 @@ ବନ୍ଦ କର ଡାଉନଲୋଡ୍ ବିରତି କରନ୍ତୁ କେଉଁଠାରେ ଡାଉନଲୋଡ୍ କରିବେ ପଚାରନ୍ତୁ - \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ + \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ ଆଣ୍ଡ୍ରଏଡ୍ 10 ରୁ କେବଳ \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ସମର୍ଥିତ ଏକ ଉଦାହରଣ ବାଛନ୍ତୁ ExoPlayer ପ୍ରତିବନ୍ଧକ ହେତୁ ସନ୍ଧାନ ସମୟସୀମା %d ସେକେଣ୍ଡରେ ସେଟ୍ ହୋଇଥିଲା @@ -427,7 +423,7 @@ ଓଭର୍ ରାଇଟ୍ କରନ୍ତୁ ଥମ୍ବନେଲ୍ URL ହୋଷ୍ଟ - ଜନସାଧାରଣ + ସାର୍ଵଜନୀନ ତାଲିକାଭୁକ୍ତ ନୁହେଁ ବ୍ୟକ୍ତିଗତ ମନ୍ତବ୍ୟଗୁଡିକ ଅକ୍ଷମ ହୋଇଛି @@ -502,13 +498,12 @@ ExoPlayer ଡିଫଲ୍ଟ ବୟସ ସୀମା ଅଜ୍ଞାତ ଗୁଣବତ୍ତା - ଭବିଷ୍ୟତ ଆଇଟମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ । \n \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । ତ୍ରୁଟି ରିପୋର୍ଟ ଆଲବମ୍ ଗୁଡ଼ିକ - ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭବ ନୁହେଁ ।ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରନ୍ତୁ\? + ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି\? ଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଛି କେବଳ ଥରେ ନୂତନ ପାଇପ୍ ବିଜ୍ଞପ୍ତି @@ -525,7 +520,7 @@ ତ୍ରୁଟି ଭିଡିଓ URL ଦସ୍ତଖତକୁ ଡିବଫସ୍କେଟ୍ କରିପାରିଲା ନାହିଁ ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା - ବାହ୍ୟ ପ୍ଲେୟାରମାନେ ଏହି ପ୍ରକାର ଲିଙ୍କକୁ ସମର୍ଥନ କରନ୍ତି ନାହିଁ + ବହିଃ-ଚାଳକ ଏଭଳି ଲିଙ୍କ୍ ସମର୍ଥନ କରେନି ଫାଇଲ୍ ଘୁଞ୍ଚିଗଲା କିମ୍ବା ଡିଲିଟ୍ ହେଲା ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ପ୍ଲେଲିଷ୍ଟ ବୁକମାର୍କ ନାହିଁ ସେପରି କୌଣସି ଫାଇଲ / ବିଷୟବସ୍ତୁ ଉତ୍ସ ନାହିଁ @@ -589,15 +584,14 @@ ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି । \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଦେଖାନ୍ତୁ - ଆଭ୍ୟନ୍ତରୀଣ + ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ସୃଷ୍ଟିକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ହୃଦୟ ଷ୍ଟ୍ରିମ୍ ଯାହା ଏପର୍ଯ୍ୟନ୍ତ ଡାଉନଲୋଡର୍ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ ଅଜ୍ଞାତ ଫର୍ମାଟ୍ - ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍ କୁ କେଉଁଠାରେ ସେଭ୍ କରାଯିବ ତାହା ଆପଣଙ୍କୁ ପଚରାଯିବ । -\nଯଦି ଆପଣ ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) କୁ ସକ୍ଷମ କରନ୍ତୁ + ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\' ଆପଣଙ୍କୁ ପଚରାଯିବ। +\nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ ମେମୋରୀ ଲିକ୍ ଦେଖାନ୍ତୁ ଆଇଟମଗୁଡିକରେ ମୂଳ ସମୟ ପୂର୍ବରୁ ଦେଖାନ୍ତୁ ବିସର୍ଜନ ପରେ ଖଣ୍ଡ କିମ୍ବା କାର୍ଯ୍ୟକଳାପ ଜୀବନଚକ୍ର ବାହାରେ ଅଣସଂରକ୍ଷିତ Rx ବ୍ୟତିକ୍ରମଗୁଡିକର ଫୋର୍ସ ରିପୋର୍ଟିଂ @@ -616,10 +610,9 @@ ଗୋଟିଏ ଡାଉନଲୋଡ୍ ଏକ ସମୟରେ ଚାଲିବ ସମ୍ପ୍ରତି ଟାବଲେଟ୍ ମୋଡ୍ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଅଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ - ଭବିଷ୍ୟତର ଆଇଟମ୍ ଲୁଚାନ୍ତୁ ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ ହଜାର ସୂଚନା ପାଇବା… @@ -697,7 +690,6 @@ ଏକ ସଦସ୍ୟତା ପୂର୍ବରୁ ଶେଷ ଅଦ୍ୟତନ ପରେ ସମୟ ପୁରୁଣା ବୋଲି ବିବେଚନା କରାଯାଏ -%s ଫିଡ୍ ଲୋଡ୍ କରିବାରେ ତ୍ରୁଟି ଫାଷ୍ଟ ଫିଡ୍ ମୋଡ୍ ଏହା ଉପରେ ଅଧିକ ସୂଚନା ପ୍ରଦାନ କରେ ନାହିଁ । - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଲୁଚାନ୍ତୁ ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ । \n \nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି । @@ -706,7 +698,7 @@ ଟ୍ୟାଗ୍ସ ସୂଚିତ କର , - ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବାହ୍ୟ ଖେଳାଳିଙ୍କ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ + ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବହିଃ-ଚାଳକ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ %s ଜଣ ଶ୍ରୋତା ମୋଟ %s ଜଣ ଶ୍ରୋତା @@ -741,4 +733,11 @@ ପୁରା ଦେଖାଯାଇଛି ଆଂଶିକ ଦେଖାଯାଇଛି ଆଗାମୀ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ବାମ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ବାମ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ଡାହାଣ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ଡାହାଣ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ଉଜ୍ଜ୍ୱଳତା + ଭଲ୍ୟୁମ୍ + କିଛି ନୁହେଁ \ No newline at end of file diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 0cc27a0596d..534ac790f3f 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -48,8 +48,6 @@ تصویر دی کیش ہٹا دتی گئی اے کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو - آواز اشرہ کنٹرول - آواز کنٹرول کرن لئی شواواں دی ورتون کرو ڈاؤن‌لوڈ پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ پلےبیک دوبارہ شروع کرو diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index f5a38353bc1..4e67a98ae46 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -42,8 +42,8 @@ ਸਿਰਫ਼ ਕੁਝ ਹੀ ਡਿਵਾਈਸ 2K/4K ਵੀਡੀਓ ਨੂੰ ਚਲਾ ਸਕਦੇ ਹਨ Kodi ਵਿੱਚ ਚਲਾਓ Kodi ਐਪ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ\? - \"Kodi ਵਿੱਚ ਚਲਾਓ\" ਆਪਸ਼ਨ ਦਿਖਾਓ - Kodi ਮੀਡੀਆ ਸੈਂਟਰ ਰਾਹੀਂ ਵੀਡੀਓ ਚਲਾਉਣ ਦਾ ਵਿਕਲਪ ਦਿਖਾਓ + \"Kodi ਵਿੱਚ ਚਲਾਓ\" ਦਾ ਵਿਕਲਪ ਵਿਖਾਓ + Kodi ਮੀਡੀਆ ਸੈਂਟਰ ਰਾਹੀਂ ਵੀਡੀਓ ਚਲਾਉਣ ਦਾ ਵਿਕਲਪ ਵਿਖਾਓ ਆਡੀਓ ਡੀਫ਼ਾਲਟ ਆਡੀਓ ਫ਼ਾਰਮੈਟ ਡੀਫ਼ਾਲਟ ਵੀਡੀਓ ਫ਼ਾਰਮੈਟ @@ -56,15 +56,15 @@ ਤੇਜ਼ ਪਰ ਅਸਪੱਸ਼ਟ ਸੀਕ ਵਰਤੋ ਅਸਪੱਸ਼ਟ ਸੀਕ ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਪਰ ਅਣ-ਸਟੀਕ ਢੰਗ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ ਲਿਜਾਂਦਾ ਹੈ । ਇਸ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ 5,15 ਜਾਂ 25 ਸਕਿੰਟ ਜਾਣਾ ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ ਥੰਮਨੇਲ ਲੋਡ ਕਰੋ - ਥੰਮਨੇਲ ਲੋਡ, ਡਾਟਾ ਦੀ ਬੱਚਤ ਅਤੇ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਨੂੰ ਰੋਕਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ। ਇਸ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਨਾਲ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ cache ਦੋਵੇਂ ਮਿਟ ਜਾਣਗੇ + ਡਾਟਾ ਤੇ ਮੈਮੋਰੀ ਖਪਤ ਦੀ ਬੱਚਤ ਅਤੇ ਥੰਮਨੇਲ ਲੋਡ ਹੋਣ ਤੋਂ ਰੋਕਣ ਲਈ ਬੰਦ ਕਰੋ। ਇਸ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਨਾਲ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ ਕੈਸ਼ੇ ਦੋਵੇਂ ਮਿਟ ਜਾਣਗੇ ਚਿੱਤਰ cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ ਕੈਸ਼ ਕੀਤਾ ਮੈਟਾ-ਡਾਟਾ ਮਿਟਾਓ ਸਾਰੇ ਕੈਸ਼ ਕੀਤੇ ਵੈੱਬ-ਪੇਜਾਂ ਦਾ ਡਾਟਾ ਮਿਟਾਓ - ਮੈਟਾ-ਡਾਟਾ cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਮੈਟਾ-ਡਾਟਾ ਕੈਸ਼ੇ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਅਗਲੀ ਸਟ੍ਰੀਮ ਨੂੰ ਆਟੋ-ਕਤਾਰਬੱਧ ਕਰੋ ਇੱਕ ਮੁੱਕਣ ਵਾਲੀ ਪਰ ਨਾ-ਦੁਹਰਾਉਣ ਵਾਲੀ ਕਤਾਰ ਨੂੰ, ਸੰਬੰਧਤ ਸਟ੍ਰੀਮ ਜੋੜਦਿਆਂ, ਚਲਾਉਂਦੇ ਜਾਓ ਖੋਜ ਸੁਝਾਅ - ਖੋਜ ਕਰਨ ਵੇਲੇ ਦਿਖਾਏ ਜਾਂਦੇ ਸੁਝਾਵਾਂ ਦੀ ਚੋਣ ਕਰੋ + ਖੋਜ ਕਰਨ ਵੇਲੇ ਵਿਖਾਏ ਜਾਂਦੇ ਸੁਝਾਵਾਂ ਦੀ ਚੋਣ ਕਰੋ ਖੋਜ ਇਤਿਹਾਸ ਨੂੰ ਵੇਖੋ ਖੋਜ ਇਤਲਾਹਾਂ ਨੂੰ ਸਥਾਨਕ ਤੌਰ ਤੇ ਸਟੋਰ ਕਰੋ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ @@ -93,23 +93,23 @@ Error ਰਿਪੋਰਟ ਸਾਰੇ ਬੰਦ ਕੀਤਾ - ਮਿਟਾਓ + ਸਾਫ ਕਰੋ ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਵਾਪਿਸ ਸਾਰੇ ਚਲਾਓ - ਹਮੇਸ਼ਾ + ਹਮੇਸ਼ਾਂ ਸਿਰਫ਼ ਇਸ ਬਾਰ ਫਾਈਲ ਨਿਊਪਾਈਪ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਿਊਪਾਈਪ ਬੈਕਗ੍ਰਾਉਂਡ ਅਤੇ ਪੌਪ-ਅਪ ਪਲੇਅਰਾਂ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ [ਅਣਜਾਣ] - ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਚਲਾਓ + ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਚਲਾਓ ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਓ ਮੇਨ ਤੇ ਚਲਾਓ ਡਾਟਾਬੇਸ ਆਯਾਤ ਕਰੋ ਡਾਟਾਬੇਸ ਨਿਰਯਾਤ ਕਰੋ ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਇਤਿਹਾਸ, ਸਬਸਕ੍ਰਿਪਸ਼ਨਜ਼, ਪਲੇਸੂਚੀ ਅਤੇ (ਆਪਨਸ਼ਨਲੀ) ਸੈਟਿੰਗਾਂ ਨੂੰ ਨਵਿਆਂ ਨਾਲ਼ ਬਦਲ ਦਿੰਦਾ ਹੈ - ਇਤਿਹਾਸ, ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਜ਼, ਪਲੇ-ਸੂਚੀ ਅਤੇ ਸੈਟਿੰਗਾਂ ਦਰਾਮਦ ਕਰੋ + ਇਤਿਹਾਸ, ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਜ਼, ਪਲੇ-ਸੂਚੀ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨਿਰਯਾਤ ਕਰੋ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਮਿਟਾਓ ਚਲਾਏ ਗਏ ਵੀਡੀਓਜ਼ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਪਲੇ-ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾਉਂਦਾ ਹੈ ਕੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇ\? @@ -151,7 +151,7 @@ ਪਸੰਦਾਂ ਨਾਪਸੰਦਾਂ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ - ਇਥੇ ਦਾ ਖਾਲੀਪਣ ਦੂਰ ਕਰਨ ਲਈ ਕੁਝ ਸਰਚ ਕਰੋ ਜਾਂ ਕੋਈ ਚੈਨਲ ਸਬਸਕ੍ਰਾਇਬ ਕਰੋ + ਇਥੇ ਦਾ ਖਾਲੀਪਣ ਦੂਰ ਕਰਨ ਲਈ ਕੁਝ ਸਰਚ ਕਰੋ ਜਾਂ ਚੈਨਲ ਸਬਸਕ੍ਰਾਇਬ ਕਰੋ ਅਤੇ ਪਲੇਲਿਸਟ ਬਣਾ ਕੇ ਕੋਈ ਵੀਡੀਓ ਬੁੱਕਮਾਰਕ ਕਰੋ ਮੁੜ-ਕ੍ਰਮਬੱਧ ਕਰਨ ਲਈ ਡਰੈਗ ਕਰੋ ਵੀਡੀਓ ਆਡੀਓ @@ -162,7 +162,7 @@ ਕੋਈ ਸਬਸਕ੍ਰਾਈਬਰ ਨਹੀਂ %s ਸਬਸਕ੍ਰਾਈਬਰ - %s ਸਬਸਕ੍ਰਾਈਬਰਸ + %s ਸਬਸਕ੍ਰਾਈਬਰ ਕੋਈ ਵਿਊਜ਼ ਨਹੀਂ @@ -224,7 +224,7 @@ ਆਖਰੀ ਚਲਾਈ ਗਈ ਸਭ ਤੋਂ ਜਿਆਦਾ ਚਲਾਈ ਗਈ ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ - ਖ਼ਾਲੀ ਪੇਜ + ਖ਼ਾਲੀ ਪੰਨਾ ਕਿਓਸਕ ਪੰਨਾ ਚੈਨਲ ਪੰਨਾ ਚੈਨਲ ਚੁਣੋ @@ -271,7 +271,7 @@ ਜ਼ੂਮ ਆਪਣੇ-ਆਪ ਬਣੀ ਸਿਰਲੇਖ - ਪਲੇਅਰ ਸੁਰਖੀ, text ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਟਾਈਲ ਨੂੰ ਸੋਧੋ। ਪ੍ਰਭਾਵ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ + ਪਲੇਅਰ ਕੈਪਸ਼ਨ, ਟੈਕਸਟ ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਟਾਈਲ ਨੂੰ ਬਦਲੋ। ਪ੍ਰਭਾਵ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ ਮੈਮੋਰੀ ਲੀਕ ਨਿਗਰਾਨੀ, ਐਪ ਨੂੰ ਆਕ੍ਰਿਆਸ਼ੀਲ ਬਣਾ ਸਕਦੀ ਹੈ ਜਦੋਂ ਹੀਪ ਡੰਪਿੰਗ ਹੁੰਦੀ ਹੈ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਤਰੁੱਟੀਆਂ ਰਿਪੋਰਟ ਕਰੋ ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਫਰੈਗਮੈਂਟ ਜਾਂ ਐਕਟੀਵਿਟੀ ਦੇ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਨਾ ਪਹੁੰਚਾਉਣ ਯੋਗ ਆਰ-ਐਕਸ ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰਨਾ @@ -321,8 +321,8 @@ ਐਪ ਸਵਿੱਚ ਕਰਨ ਤੇ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਐਪ \'ਤੇ ਜਾਣ ਵੇਲ਼ੇ ਕਾਰਵਾਈ — %s ਕੋਈ ਨਹੀਂ - ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ Minimize ਕਰੋ - ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ minimize ਕਰੋ + ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ + ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ ਚੁੱਪ ਦੌਰਾਨ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ ਕਰੋ ਕਦਮ ਰੀਸੈੱਟ @@ -332,10 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਆਵਾਜ਼ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ - ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ - ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ - ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ ਅਪਡੇਟਾਂ ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ @@ -363,10 +359,10 @@ ਕਤਾਰ ਕਰੋ ਸਿਸਟਮ ਦੁਆਰਾ ਕਾਰਵਾਈ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਗਿਆ ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ - ਵਿਲੱਖਣ ਨਾਮ Generate ਕਰੋ + ਵਿਲੱਖਣ ਨਾਮ ਬਣਾਓ overwrite ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਕ ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਤੋਂ ਜਾਰੀ ਹੈ - ERROR ਵਿਖਾਓ + ਤਰੁੱਟੀ ਵਿਖਾਓ ਮੰਜ਼ਿਲ ਫੋਲਡਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ ਫਾਈਲ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਸਥਾਪਤ ਨਹੀਂ ਹੋ ਸਕਿਆ @@ -376,7 +372,7 @@ ਸਰਵਰ ਮਲਟੀ-Threaded ਡਾਊਨਲੋਡਸ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ, ਇਸ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ @string/msg_threads = 1 ਨਹੀਂ ਲਭਿਆ Post-processing ਫੇਲ੍ਹ - ਰੁੱਕੋ + ਰੁਕੋ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ ਡਾਉਨਲੋਡ ਰੱਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ ਮੀਟਰ ਕੀਤੇ ਨੈਟਵਰਕਸ ਤੇ ਰੁਕਾਵਟ @@ -389,7 +385,7 @@ ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਕੀਤੀ ਗਈ ਟਿੱਪਣੀਆਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ ਬੰਦ ਕਰੋ - ਪਲੇਅਬੈਕ ਦੋਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ + ਪਲੇਅਬੈਕ ਫਿਰ ਚਾਲੂ ਕਰੋ ਪਿਛਲੀ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਤੋਂ ਮੁੜ ਚਲਾਓ ਸੂਚੀਆਂ ਦੀ ਸਥਿਤੀ ਸੂਚੀਆਂ ਵਿੱਚ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸੂਚਕ ਦਿਖਾਓ @@ -422,7 +418,7 @@ ਐਕਸੋਪਲੇਅਰ ਦੀਆਂ ਬੰਦਿਸ਼ਾਂ ਕਰਕੇ ਲੱਭਣ ਮਿਆਦ %d ਸਕਿੰਟ ਸੈੱਟ ਕੀਤੀ ਗਈ ਸੀ ਇਹ ਡਾਊਨਲੋਡ ਮੁੜ-ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਮੁੜ-ਪ੍ਰਾਪਤੀ - ਜੇ ਤੁਹਾਨੂੰ ਕਾਲ਼ੀ ਸਕਰੀਨ ਮਿਲੇ ਜਾਂ ਵੀਡਿਓ ਰੁਕ-ਰੁਕ ਕੇ ਚੱਲੇ ਤਾਂ ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰ ਦਿਓ + ਜੇ ਤੁਹਾਨੂੰ ਕਾਲ਼ੀ ਸਕਰੀਨ ਮਿਲੇ ਜਾਂ ਵੀਡਿਓ ਰੁਕ-ਰੁਕ ਕੇ ਚੱਲੇ ਤਾਂ ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰ ਦਿਓ। ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰੋ ਸੇਵਾਵਾਂ ਵੱਲੋਂ ਆਈ ਅਸਲ ਲਿਖਤ ਸਟ੍ਰੀਮ ਨਗਾਂ ਵਿੱਚ ਵਿਖਾਈ ਦੇਵੇਗੀ ਨਗਾਂ ਦੇ ਆਉਣ ਦਾ ਅਸਲੀ ਸਮਾਂ ਵਿਖਾਓ @@ -437,10 +433,10 @@ reCAPTCHA ਹੱਲ ਕਰਦੇ ਵੇਲ਼ੇ ਨਿਊਪਾਈਪ ਵਿੱਚ ਜਮ੍ਹਾਂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਹੋ ਗਈਆਂ ਹਨ reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ - ਵੀਡਿਓ ਹੈਸ਼ਿੰਗ ਦੀ ਕਾਰਵਾਈ ਦੀ ਮੌਜੂਦਾ ਹਾਲਤ ਦੀਆਂ ਇਤਲਾਹਾਂ + ਵੀਡਿਓ ਹੈਸ਼ਿੰਗ ਦੀ ਕਾਰਵਾਈ ਦੀ ਮੌਜੂਦਾ ਹਾਲਤ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਇਹ ਵੀਡੀਓ ਉਮਰ-ਹੱਦ ਮੁਤਾਬਕ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। \nਯੂਟਿਊਬ ਦੀਆਂ ਉਮਰ-ਹੱਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਨੀਤੀਆਂ ਦੇ ਕਾਰਨ ਨਿਊ-ਪਾਈਪ ਇਸਦੀਆਂ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦੀ ਅਤੇ ਇਸੇ ਕਰਕੇ ਇਸਨੂੰ ਚਲਾ ਵੀ ਨਹੀਂ ਸਕਦੀ। - ਇਤਲਾਹਾਂ ਵਿੱਚ ਵੀਡਿਓ ਥੰਮਨੇਲ ਦੇ ਪੈਮਾਨੇ ਨੂੰ 16:9 ਤੋਂ ਘਟਾ ਕੇ 1:1 ਕਰੋ (ਤਸਵੀਰ ਵਿਗੜੀ ਹੋਈ ਦਿਸ ਸਕਦੀ ਹੈ) + ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵੀਡਿਓ ਥੰਮਨੇਲ ਦੇ ਪੈਮਾਨੇ ਨੂੰ 16:9 ਤੋਂ ਘਟਾ ਕੇ 1:1 ਕਰੋ (ਤਸਵੀਰ ਵਿਗੜੀ ਹੋਈ ਦਿਸ ਸਕਦੀ ਹੈ) ਇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ ਵੈਬਸਾਈਟ ਖੋਲ੍ਹੋ ਅੰਦਰੂਨੀ @@ -462,7 +458,7 @@ ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਗਿਐ ਤੁਸੀਂ ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਹੇਠਾਂ ਚੁਣ ਸਕਦੇ ਹੋ ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਚੁਣੋ — %s - ਆਪ-ਮੁਖ਼ਤਾਰ (ਡਿਵਾਈਸ ਦੀ ਥੀਮ) + ਆਟੋਮੈਟਿਕ (ਡਿਵਾਈਸ ਥੀਮ) ਰੇਡੀਓ ਉਚੇਚੀ ਪੇਸ਼ਕਸ਼ ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। @@ -474,7 +470,7 @@ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਦੀ ਕੋਈ ਵੀ ਐਪ ਇਸ ਨੂੰ ਖੋਲ੍ਹ ਨਹੀਂ ਸਕਦੀ ਚੈਪਟਰ ਹਾਲੀਆ - ਥੰਮਨੇਲ ਨੂੰ ਤਾਲਾਬੱਧ ਸਕਰੀਨ ਦੇ ਪਿਛੋਕੜ ਅਤੇ ਇਤਲਾਹਾਂ ਦੋਹਾਂ ਲਈ ਵਰਤੋ + ਥੰਮਨੇਲ ਨੂੰ ਤਾਲਾਬੱਧ ਸਕਰੀਨ ਦੇ ਪਿਛੋਕੜ ਅਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦੋਹਾਂ ਲਈ ਵਰਤੋ ਥੰਮਨੇਲ ਵਿਖਾਓ ਪਲੇ-ਸੂਚੀ ਪੰਨਾ %s ਦੁਆਰਾ @@ -575,7 +571,7 @@ ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਂਦਾ ਹੈ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਓ ਵੀਡੀਓ ਹੈਸ਼ ਇਤਲਾਹ - ਐਲਬਮਾਂ + ਐਲਬਮ ਕਲਾਕਾਰ ਗੀਤ ਵੀਡੀਓ @@ -586,7 +582,7 @@ ਯੂਟਿਊਬ ਦਾ ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ ਚਾਲੂ ਕਰੋ ਉਹ ਸਮੱਗਰੀ ਵੀ ਵਿਖਾਓ ਜੋ ਉਮਰ-ਸੀਮਾ ਕਰਕੇ ਬੱਚਿਆਂ ਲਈ ਸ਼ਾਇਦ ਸਹੀ ਨਾ ਹੋਵੇ (ਜਿਵੇਂ 18+) ਸਥਿਤੀ ਪਹਿਲਾਂ ਨੂੰ ਮੌਜੂਦ ਹੈ - ਸਿਰਫ਼ HTTP URLs ਹੀ ਮਾਣਨਯੋਗ ਹਨ + ਸਿਰਫ਼ HTTP URLs ਹੀ ਮੰਨਣਯੋਗ ਹਨ ਸਥਿਤੀ ਦੀ ਜਾਇਜ਼ਗੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ ਸਥਿਤੀ URL ਦਾਖ਼ਲ ਕਰੋ ਸਥਿਤੀਆਂ ਜੋੜੋ @@ -594,7 +590,7 @@ ਆਪਣੀ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਸਥਿਤੀਆਂ ਚੁਣੋ ਪੀਅਰਟਿਊਬ ਸਥਿਤੀਆਂ URL ਪਛਾਣ ਨਹੀਂ ਹੋਇਆ। ਕਿਸੇ ਹੋਰ ਐਪ ਨਾਲ਼ ਖੋਲ੍ਹਣਾ ਹੈ\? - ਆਪ-ਮੁਖ਼ਤਾਰ ਕਤਾਰ ਕਰੋ + ਆਟੋ ਕਤਾਰਬੱਧ ਕਰੋ ਸਟ੍ਰੀਮ ਦੇ ਕਰਤਾ, ਸਮੱਗਰੀ ਜਾਂ ਖੋਜ ਬੇਨਤੀ ਵਾਲੇ ਵਾਧੂ ਜਾਣਕਾਰੀ ਬਕਸਿਆਂ ਵਾਲ਼ੀ ਮੈਟਾ ਜਾਣਕਾਰੀ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰ ਦਿਓ ਮੈਟਾ ਜਾਣਕਾਰੀ ਦਿਖਾਓ ਵੀਡੀਓ ਵੇਰਵਾ ਅਤੇ ਵਾਧੂ ਜਾਣਕਾਰੀ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ @@ -605,13 +601,13 @@ ਅੱਗੇ ਲੰਘਾਉਣ/ਪਿੱਛੇ ਕਰਨ ਦੀ ਸਮਾਂ ਮਿਆਦ ਰਾਤ ਵਾਲੀ ਥੀਮ ਐਂਡਰਾਇਡ ਨੂੰ ਥੰਮਨੇਲ ਦੇ ਮੁੱਖ ਰੰਗ ਮੁਤਾਬਕ ਇਲਤਾਹ ਦਾ ਰੰਗ ਬਦਲਣ ਦਿਓ (ਧਿਆਨ ਦਿਓ ਕਿ ਇਹ ਹਰੇਕ ਡਿਵਾਈਸ \'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) - ਰੰਗਦਾਰ ਇਤਲਾਹਾਂ + ਰੰਗਦਾਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੁਝ ਵੀ ਨਹੀਂ ਬਫ਼ਰਿੰਗ ਸ਼ਫਲ ਦੁਹਰਾਓ - ਹੇਠਾਂ ਹਰੇਕ ਇਤਲਾਹ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਪਚੀੜੀਆਂ ਇਤਲਾਹਾਂ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ - ਤੁਸੀਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਪਚੀੜੀਆਂ ਇਤਲਾਹਾਂ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ! + ਹੇਠਾਂ ਹਰੇਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ + ਤੁਸੀਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ! ਪੰਜਵਾਂ ਕਾਰਵਾਈ ਬਟਨ ਚੌਥਾ ਕਾਰਵਾਈ ਬਟਨ ਤੀਜਾ ਕਾਰਵਾਈ ਬਟਨ @@ -621,10 +617,10 @@ ਚਾਲੂ ਕਰੋ , - ਡਾਉਨਲੋਡ ਕੀਤਾ - %s ਡਾਉਨਲੋਡ ਕੀਤੇ + ਡਾਉਨਲੋਡ ਮੁਕੰਮਲ + %s ਡਾਉਨਲੋਡ ਮੁਕੰਮਲ - ਬੰਦ ਕਰੋ + ਆਫ ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਸ਼ਾਮਿਲ ਕਰੋ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਮੋਜੂਦਾ ਚੱਲ ਰਹੀ ਸਟ੍ਰੀਮ ਦੀ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੰਰਚਨਾ ਕਰੋ @@ -643,11 +639,10 @@ ਸੀਕਬਾਰ ਥੰਮਨੇਲ ਦੀ ਝਲਕ ਸਮਾਂ-ਅਵਧੀ ਜਦ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਦੁਬਾਰਾ ਅੱਪਡੇਟ ਕੀਤੀ ਜਾ ਸਕੇ — %s ਰਚਨਾਕਾਰ ਨੇ ਦਿਲੋਂ ਪਸੰਦ ਕੀਤਾ - ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਵੀਡੀਓ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ। ਬਦਲਾਅ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਤੇ ਹੀ ਹੋਣਗੇ + ਪ੍ਰਗਤੀਸ਼ੀਲ ਸਮੱਗਰੀ ਉੱਤੇ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਉਸਨੂੰ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ ਮੁੱਖ ਪਲੇਅਰ ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਵਿਖਾਓ ਪਲੇਅਬੈਕ ਲੋਡ ਦਾ ਅੰਤਰਾਲ ਆਕਾਰ %s ਨਵੀਂ ਸਟਰੀਮ @@ -663,11 +658,8 @@ ਤਰੁੱਟੀ ਤੇ ਸਨੈਕਬਾਰ ਵਿਖਾਓ ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ) ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਲੁਕਾਓ ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਵਿਖਾਓ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਲੁਕਾਓ ਆਮ ਸਵਾਲ ਵੈੱਬਸਾਈਟ \'ਤੇ ਵੇਖੋ ਸਟਰੀਮ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… @@ -741,4 +733,35 @@ ਆਗਾਮੀ ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ ਸਟ੍ਰੀਮ ਵਿਖਾਓ/ਲੁਕਾਓ + ਸੱਜੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਖੱਬੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਚਮਕ + ਕੋਈ ਨਹੀਂ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਆਵਾਜ਼ + ਇਹ ਚੋਣ ਯੋਗ ਕਰੋ, ਜੇ ਤੁਹਾਨੂੰ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਸਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਜੋ ਕਿ ਘੱਟ-ਤਰਜੀਹ ਵਾਲੇ ਡੀਕੋਡਰਾਂ \'ਤੇ ਵਾਪਸ ਆ ਜਾਂਦੀਆਂ ਹਨ, ਜੇਕਰ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੋ ਜਾਂਦੇ ਹਨ। ਇਸ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲੋਂ ਮਾੜੀ ਪਲੇਬੈਕ ਕਾਰਗੁਜ਼ਾਰੀ ਹੋ ਸਕਦੀ ਹੈ + ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਜਦੋਂ ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੁੰਦੀ ਹੈ ਤਾਂ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਰਿਲੀਜ਼ ਕਰਦਾ ਹੈ ਅਤੇ ਮੁੜ-ਇੰਸਟੈਂਟ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \'ਤੇ ਐਕਸੋਪਲੇਅਰ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਚੁੱਕਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \'ਤੇ ਪ੍ਰਭਾਵ ਹੈ +\n +\nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਵਰਤਮਾਨ ਵੀਡੀਓ ਪਲੇਅਰ ਦੀ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਵੇਲੇ ਪਲੇਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰੋਕਿਆ ਜਾ ਸਕਦਾ ਹੈ + ਅਸਲੀ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਭਾਸ਼ਾ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਅਸਲੀ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਵਰਣਨਾਤਮਕ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਜੇ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਦ੍ਰਿਸ਼ਟੀ ਤੋਂ ਅਪੰਗ ਲੋਕਾਂ ਵਾਸਤੇ ਵਰਣਨਾਂ ਵਾਲਾ ਕੋਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਆਡੀਓ: %s + ਆਡੀਓ ਟਰੈਕ + ਇੱਕ ਆਡੀਓ ਟਰੈਕ ਇਸ ਸਟਰੀਮ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ + ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਅਗਿਆਤ + ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗ + ਕੁਝ ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। ਇਹਨਾਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ + ਐਕਸੋਪਲੇਅਰ ਦੀ ਡੀਕੋਡਰ ਫਾਲਬੈਕ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਹਮੇਸ਼ਾ ਐਕਸੋਪਲੇਅਰ ਦੀ ਵਿਡੀਓ ਆਉਟਪੁੱਟ ਸਤਹ ਸੈਟਿੰਗ ਵਰਕਰਾਊਂਡ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਅਸਲੀ + ਡੱਬ ਕੀਤਾ + ਵਰਣਨਾਤਮਕ + ਮੁੱਖ ਟੈਬਾਂ ਦੀ ਸਥਿਤੀ + ਮੁੱਖ ਟੈਬ ਸਿਲੈਕਟਰ ਨੂੰ ਹੇਠਾਂ ਲੈ ਜਾਓ + %1s %2s + ਮੀਡੀਆ ਟਨਲਿੰਗ ਤੁਹਾਡੀ ਡਿਵਾਈਸ \'ਤੇ ਡਿਫ਼ਾਲਟ ਤੌਰ \'ਤੇ ਅਸਮਰੱਥ ਕੀਤੀ ਗਈ ਸੀ ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਮਾਡਲ ਇਸਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਨ ਲਈ ਜਾਣਿਆ ਜਾਂਦਾ ਹੈ। \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 109accb820e..6c6b1bf3f2f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,10 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Kontrola głośności gestami - Używaj gestów do sterowania głośnością odtwarzacza - Kontrola jasności gestami - Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje Usunięto plik Powiadomienie o aktualizacji aplikacji @@ -420,7 +416,7 @@ \nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci Minął czas połączenia Używaj systemowego selektora folderów (SAF) - Systemowy selektor folderów (SAF) umożliwia pobieranie na kartę pamięci + Storage Access Framework umożliwia pobieranie na kartę pamięci Wyczyść pozycje odtwarzania Usuwa wszystkie pozycje odtwarzania Usunąć wszystkie pozycje odtwarzania\? @@ -529,7 +525,7 @@ 100+ wideo Artyści Albumy - Piosenki + Utwory To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. @@ -617,7 +613,7 @@ Automatyczny (motyw urządzenia) Motyw nocny Pokaż szczegóły kanału - Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś(-aś) czarny ekran bądź brak płynności odtwarzania wideo + Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś(-aś) czarny ekran bądź brak płynności odtwarzania wideo. Wyłącz tunelowanie multimediów Ograniczenie wiekowe Wyłącz zaznaczanie tekstu w opisie @@ -642,12 +638,11 @@ \nNewPipe nie będzie w stanie załadować tego kanału w przyszłości. \nCzy chcesz anulować subskrypcję tego kanału\? Nie udało się załadować kanału dla „%s”. - Począwszy od Androida 10 obsługiwany jest tylko systemowy selektor folderów (SAF) + Począwszy od Androida 10 obsługiwany jest tylko Storage Access Framework Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik Nie ustawiono jeszcze folderu zapisywania, wybierz domyślny teraz Błąd podczas ładowania kanału Niepubliczny - Pokaż obejrzane pozycje Wyłączony Włączony Tryb tabletu @@ -700,7 +695,6 @@ Przypięty komentarz LeakCanary jest niedostępne Rozmiar interwału ładowania odtwarzania - Zmień rozmiar interwału ładowania (aktualnie %s). Niższa wartość może przyspieszyć początkowe ładowanie wideo. Zmiany wymagają ponownego uruchomienia odtwarzacza domyślny ExoPlayera Powiadomienie odtwarzacza Skonfiguruj powiadomienie aktualnie odtwarzanego strumienia @@ -735,9 +729,6 @@ Wybierz jakość dla zewnętrznych odtwarzaczy Nieznany format Nieznana jakość - Pokaż przyszłe pozycje - Ukryj obejrzane pozycje - Ukryj przyszłe pozycje Często zadawane pytania Jeśli masz problemy podczas korzystania z aplikacji, koniecznie sprawdź odpowiedzi na najczęściej pojawiające się pytania! Zobacz na stronie internetowej @@ -762,4 +753,36 @@ W pełni obejrzane Częściowo obejrzane Nadchodzące + Wybierz gest dla lewej strony ekranu odtwarzacza + Akcja gestu z lewej + Wybierz gest dla prawej strony ekranu odtwarzacza + Jasność + Głośność + Brak + Akcja gestu z prawej + Zmień rozmiar interwału ładowania zawartości progresywnych (aktualnie %s). Niższa wartość może przyspieszyć ich początkowe ładowanie + Preferuj oryginalny dźwięk + Wybieraj oryginalną ścieżkę dźwiękową niezależnie od języka + Preferuj audiodeskrypcję + Dźwięk: %s + Ścieżka dźwiękowa + Ścieżka dźwiękowa powinna już się znajdować w tym strumieniu + Wybierz ścieżkę dźwiękową dla zewnętrznych odtwarzaczy + Nieznana + Ustawienia ExoPlayera + Zarządzaj niektórymi ustawieniami ExoPlayera. Zmiany te wymagają ponownego uruchomienia odtwarzacza, aby zostały uwzględnione + Używaj funkcji zapasowego dekodera ExoPlayera + Włącz tę opcję, jeśli masz problemy z inicjalizacją dekodera. Przywraca dekodery o niższym priorytecie, jeśli inicjalizacja podstawowych dekoderów się nie powiedzie. Może to spowodować słabszą wydajność odtwarzania niż podczas korzystania z podstawowych dekoderów + Zawsze używaj obejścia ustawienia powierzchni wyjścia wideo ExoPlayera + %1s %2s + oryginalna + dubbing + audiodeskrypcja + Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna + To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. +\n +\nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran + Przenieś selektor kart głównych na dół + Pozycja kart głównych + Tunelowanie multimediów zostało domyślnie wyłączone na Twoim urządzeniu, ponieważ wiadomo, że model Twojego urządzenia go nie obsługuje \ 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 20ba9e13b51..6d0c95bf79b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -79,8 +79,8 @@ Reproduzir com Kodi Pesquisar Mostra uma opção para ver vídeo pelo media center do Kodi - Usar player de áudio externo - Usar player de vídeo externo + Usar reprodutor de áudio externo + Usar reprodutor de vídeo externo Mostrar opção \"Reproduzir com Kodi\" O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do app:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do Sistema Operacional: Abrir no modo popup @@ -247,7 +247,7 @@ Reportar erros de out-of-lifecycle Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte Usar busca de posição rápida (inexata) - A busca inexata permite que o player ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos + A busca inexata permite que o reprodutor de vídeo ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos Pôr próximo vídeo na fila automaticamente Continua a reprodução da fila (sem repetição) adicionando mais vídeos similares Arquivo @@ -331,15 +331,11 @@ Passo Redefinir Canais - Playlists + Listas de reprodução Faixas Usuários Cancelar inscrição Selecionar aba - Gesto para volume - Use gestos para mudar volume do player - Gesto para brilho - Use gestos para mudar brilho do player Debug Atualizações Eventos @@ -446,7 +442,7 @@ Apenas links HTTPS são suportados A instância já existe Local - Recentes + Adicionado recentemente Mais curtidos Gerado automaticamente (nenhum uploader encontrado) recuperando @@ -554,7 +550,7 @@ Não foi possível reconhecer a URL. Abrir com outro aplicativo\? Pôr na fila automaticamente A fila do player ativo será substituída - Mudar de um player para outro pode substituir sua fila + Mudar de um reprodutor de vídeo para outro pode substituir sua fila Pedir confirmação antes de limpar uma fila Aleatório Carregando @@ -586,7 +582,7 @@ 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 + Recente Capítulos Descrição Ítens relacionados @@ -645,7 +641,6 @@ Desligado Ligado Modo tablet - Mostrar itens vistos Não mostrar Baixa qualidade (menor) Alta qualidade (maior) @@ -660,7 +655,7 @@ %1$s downloads apagados - Download concluído + %s download concluído %s downloads concluídos %s downloads concluídos @@ -676,7 +671,7 @@ Procurar por atualizações Procurar manualmente por novas versões Procurando por atualizações… - Travar o player + Travar o reprodutor de vídeo Mostrar \"Travar o player\" Mostra uma opção de travamento ao usar o player Novos itens do feed @@ -692,7 +687,6 @@ \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download Comentário fixado O LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado ExoPlayer padrão Notificação do reprodutor Configurar a notificação do fluxo da reprodução atual @@ -789,16 +783,13 @@ Por cento Semitom A transmissão selecionada não é compatível com players externos - Nenhum áudio de transmissão está disponível para players externos + Nenhum transmissão de áudio está disponível para players externos Transmissões que ainda não são suportadas pelo downloader não são exibidos Nenhum vídeo de transmissão está disponível para players externos Selecione a qualidade para players externos Formato desconhecido Qualidade desconhecida Tamanho do intervalo de carregamento da reprodução - Mostrar itens futuros - Ocultar itens futuros - Ocultar itens assistidos Visualizar no site Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns! Perguntas frequentes @@ -823,4 +814,35 @@ Parcialmente assistido Em breve Totalmente assistido + Escolha o gesto da mão esquerda da tela do jogador + Ação do gesto esquerdo + Escolha o gesto da mão direita da tela do jogador + Brilho + Volume + Nenhum + Ação do gesto direito + Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original e independentemente do idioma + Dar preferência ao áudio descritivo + Selecionar um áudio com descrição para pessoas com dificuldades de visão, se disponível + Áudio: %s + Faixa de áudio + Seleciona faixa de áudio para players externo + Desconhecido + Configurações de ExoPlayer + Gerenciar algumas configurações de ExoPlayer. É necessário reiniciar o player para aplicar as mudanças + %1s %2s + original + dublado + descritivo + Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície para o codec diretamente. Já usado pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior +\n +\nAtivar esta opção pode evitar erros de reprodução ao alternar o reprodutor de vídeo atual ou alternar para tela cheia + Uma faixa de áudio já deve estar presente neste stream + Utilizar a função de fallback do decodificador do ExoPlayer + Sempre utilizar o configuração de saída de vídeo alternativa do ExoPlayer + Habilite essa opção se você tiver problemas de inicialização do decodificador, que retorna codificadores de baixa prioridade se o decodificador primário falhar. Isso pode resultar em pior desempenho de reprodução + Mova o seletor da aba principal para a parte inferior + Posição das abas principais \ 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 9c3958ba3c0..57d1d2a449d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -44,8 +44,8 @@ Histórico de visualizações %s visualização - %s visualizações - %s visualizações + %s subscritores + %s subscritores Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? Histórico e cache @@ -71,7 +71,6 @@ Não foi possível importar as subscrições Transferências A processar… - Gestos para controlo de volume Este vídeo está restringido a idades. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. @@ -116,9 +115,9 @@ %d segundos - %d selecionada - %d selecionadas - %d selecionadas + %d selecionado + %d selecionados + %d selecionados Partilhar Ver política de privacidade @@ -157,10 +156,10 @@ Limpar Cancelar subscrição Conteúdo - Os textos originais dos serviços serão visíveis nos itens de fluxo + Os textos originais dos serviços serão visíveis nos itens do vídeo Publicado em %1$s Avanço rápido durante silêncio - Não foram encontradas emissões de áudio + Não foram encontrados áudios NewPipe foi fechado enquanto trabalhava no ficheiro Nova lista de reprodução © %1$s de %2$s nos termos da %3$s @@ -169,7 +168,7 @@ Miniatura da lista de reprodução alterada. Não foi possível carregar os comentários País padrão para conteúdo - Aplicação livre de reprodução de emissões para Android. + Aplicação livre de reprodução de transmissões para Android. Idioma padrão para conteúdo Importar subscrições do YouTube do Google Takeout: \n @@ -205,7 +204,7 @@ Gerar nome único Ação a executar ao trocar para outra aplicação a partir do menu principal - %s Utilizar reprodutor de vídeo externo - O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da app\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: + O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da aplicação\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nSO Versão: Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! Limpar dados Apenas uma vez @@ -242,7 +241,6 @@ Remover todo o histórico de pesquisas\? Reportar por e-mail Escolher separador - Utilizar gestos para controlar o volume do reprodutor Grelha Exportado Escolha a pasta para colocar os ficheiros de áudio @@ -257,7 +255,6 @@ A obter informação… Sugestões de pesquisa Definir como miniatura da lista de reprodução - Gestos para controlo de brilho Abrir menu %s subscritor @@ -295,7 +292,7 @@ Terminada Histórico de vídeos apagado - Não tem um reprodutor de vídeo. Instalar VLC\? + Não tem um reprodutor de vídeo. Instalar o VLC\? Desative para ocultar comentários Limitar resolução se em dados móveis Separadores mostrados na página principal @@ -351,14 +348,14 @@ Desafio reCAPTCHA Importar de 1 item eliminado. - Não foram encontradas emissões de vídeo + Não foram encontrados vídeos Página \'kiosk\' %d hora %d horas %d horas - Enfileirar o próximo stream automaticamente + Adicionar o próximo vídeo à fila automaticamente Defina as suas instâncias favoritas PeerTube Exportar histórico, subscrições, listas de reprodução e definições Melhor resolução @@ -383,7 +380,7 @@ Detalhes Erro de rede Histórico de pesquisa - Alternar serviço, agora selecionado: + Alternar serviço atualmente selecionado: Remover Comentários (em inglês): Reprodutor de vídeo @@ -466,7 +463,7 @@ Mostrar informação Limpar histórico de visualizações Não é possível guardar no cartão SD. Repor pasta de descargas\? - Checksum + Soma de controlo Restaurar última posição de reprodução Ativar reprodutor \'popup\' Se possível, obter de uma fonte dedicada @@ -477,7 +474,6 @@ Escolha uma instância Limpar todos os dados da página web Fechar menu - Utilizar gestos para controlar o brilho do reprodutor Remover visualizados Carácter de substituição Vídeo @@ -486,7 +482,7 @@ Vídeos Meta-dados em cache limpos Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup - Não foi encontrado um reprodutor (pode instalar VLC para reproduzir). + Não foi encontrado um reprodutor (pode instalar o VLC para reproduzir). Ser-lhe-á perguntado onde guardar cada transferência. \nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo Mostrar opção \"Reproduzir no Kodi\" @@ -567,7 +563,7 @@ Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Cortar a miniatura de vídeo mostrada na notificação de 16:9 a 1:1 + Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções) Cortar miniatura na proporção 1:1 Mostrar \'leaks\' de memória Colocado na fila @@ -602,7 +598,7 @@ Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe. Este conteúdo não está disponível no seu país. Este vídeo tem uma restrição de idade. -\nDevido às novas políticas do YouTube com vídeos com restrição de idade, o NewPipe não pode acessar nenhum dos seus fluxos de vídeo, portanto, é incapaz de reproduzi-lo. +\nDevido às novas políticas do YouTube quanto a vídeos com restrição de idade, o NewPipe não pode aceder as estes vídeos, por isso não consegue reproduzi-lo. Rádio Destaques Resolver @@ -637,7 +633,6 @@ Agora pode selecionar o texto na descrição. Note que a página pode cintilar e as ligações podem não ser clicáveis enquanto estiver no modo de seleção. %s fornece este motivo: Conta encerrada - Mostrar itens vistos O modo de feed rápido não fornece mais informações sobre isto. A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. @@ -658,27 +653,27 @@ Sugestões de pesquisa remotas Sugestões de pesquisa locais - %1$s descarga apagada - %1$s descargas apagadas - %1$s descargas apagadas + Transferência %1$s eliminada + Transferências %1$s eliminadas + Transferências %1$s eliminadas - Descarga concluída - %s descargas concluídas - %s descargas concluídas + Download concluído + %s Transferências concluídas + %s Transferências concluídas Deslizar itens para removê-los Não iniciar vídeos no reprodutor mini, mas ir diretamente ao ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo Iniciar reprodutor principal em ecrã completo Enfileirado o próximo - Enfileirar o próximo + Pôr na fila o próximo A processar… Pode demorar um momento Procurar atualizações Verificar manualmente se existe uma nova versão A procurar atualizações… Novos itens Travar o reprodutor - Mostrar \"travar o reprodutor\" + Mostrar \"Travar o reprodutor\" Mostra uma opção de travamento ao usar o reprodutor Notificação de relatório de erros Notificações para reportar erros @@ -692,31 +687,30 @@ \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário fixado LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado Predefinido do ExoPlayer Notificações - A carregar detalhes do fluxo… - Verificar se há novos fluxos - Notificações sobre novos fluxos + A carregar detalhes do vídeo… + Verificar se há novos vídeos + Notificações sobre novos vídeos Frequência da verificação Apagar todos os ficheiros descarregados do disco\? Notificações são desativadas - %s fluxo novo - %s fluxos novos - %s fluxos novos + %s vídeo novo + %s vídeos novos + %s vídeos novos - Notificar sobre novos fluxos de assinaturas + Notificar sobre novos vídeos nas assinaturas Conexão de rede necessária Qualquer rede Alternar tudo - Notificações sobre novos fluxos para assinaturas + Notificações sobre novos vídeos para assinaturas Notificação do reprodutor - Configurar a notificação da reprodução do fluxo atual + Configurar a notificação da reprodução do vídeo atual Seja notificado Agora assinou este canal , - Novos fluxos + Novos vídeos Por cento Semitom Não estão disponíveis transmissões de vídeo a reprodutores externos @@ -727,31 +721,59 @@ Qualidade desconhecida Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução - Mostrar artigos futuros - Ocultar itens reproduzidos - Ocultar artigos futuros Perguntas frequentes - Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! - Ver no sítio web + Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! + Ver no site Modo rápido Importar ou exportar subscrições do menu de 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s Ordenação - Esta opção só está disponível se %s for selecionado como tema + Esta opção só está disponível se estiver selecionado %s para o tema Desativar miniatura permanente Não foi possível copiar para a área de transferência Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) Ignorar eventos com botões físicos - Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos + Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados Remover duplicados - Mostrar os seguintes fluxos - Mostrar/ocultar fluxos + Mostrar os seguintes vídeos + Mostrar/ocultar vídeos Completamente visto Parcialmente visto Proximamente Remover duplicados\? - Quer remover todos os fluxos duplicados nesta lista de reprodução\? + Quer remover todos os vídeos duplicados nesta lista de reprodução\? + Ação do gesto para a esquerda + Ação do gesto para a direita + Brilho + Volume + Nenhum + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Áudio: %s + Faixa de áudio + Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução + Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior +\n +\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + original + dobrado + descritivo + Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original independentemente do idioma + Dar preferência ao áudio descritivo + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Já deve existir uma faixa de áudio nesta transmissão + Selecionar faixa de áudio para reprodutores externos + Desconhecida + Configurações ExoPlayer + Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações + Utilizar a função de fallback do descodificador do ExoPlayer + %1s %2s + Mova o seletor da guia principal para a parte inferior + Posição das guias principais \ 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 0d71e00b8e9..8340e25d661 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,10 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Gestos para controlo de volume - Utilizar gestos para controlar o volume do reprodutor - Gestos para controlo de brilho - Utilizar gestos para controlar o brilho do reprodutor Atualizações Ficheiro eliminado Notificação de nova versão @@ -618,7 +614,6 @@ Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão %s fornece este motivo: Conta encerrada - Mostrar itens vistos O modo de feed rápido não fornece mais informações sobre isto. A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. @@ -693,7 +688,6 @@ Comentário fixado LeakCanary não está disponível Predefinido do ExoPlayer - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. Se fizer alterações é necessário reiniciar Notificação do reprodutor Configurar a notificação da reprodução do vídeo atual Notificações @@ -726,10 +720,7 @@ Formato desconhecido Qualidade desconhecida A transmissão selecionada não é suportada por reprodutores externos - Mostrar artigos futuros Tamanho do intervalo de carregamento da reprodução - Ocultar itens reproduzidos - Ocultar artigos futuros Perguntas frequentes Ver no site Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! @@ -754,4 +745,35 @@ Completamente visto Mostrar os seguintes vídeos Parcialmente visto + Ação do gesto para a esquerda + Ação do gesto para a direita + Brilho + Volume + Nenhum + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior +\n +\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original independentemente do idioma + Dar preferência ao áudio descritivo + Áudio: %s + Faixa de áudio + Já deve existir uma faixa de áudio nesta transmissão + Selecionar faixa de áudio para reprodutores externos + Desconhecida + Configurações ExoPlayer + Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações + Utilizar a função de fallback do descodificador do ExoPlayer + Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução + Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + %1s %2s + original + dobrado + descritivo + Mova o seletor da guia principal para a parte inferior + Posição das guias principais \ 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 84eed26ecbb..ad379c5ca86 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -204,7 +204,7 @@ Importați baza de date Exportați baza de date Suprascrie istoricul, abonamentele, listele de redare și (opțional) setările curente - Exportează istoricul, abonamentele, playlist-urile și setările + Exportați istoricul, abonamentele, listele de redare și setările Nu a putut reda acest flux A apărut o eroare irecuperabilă a player-ului Se recuperează din eroarea player-ului @@ -277,10 +277,6 @@ Refuzați Dezabonare Alegeți fila - Controlul prin gesturi al volumului - Utilizați gesturi pentru a controla volumul - Controlul prin gesturi a luminozității - Utilizați gesturi pentru a controla luminozitatea Actualizări Evenimente Fișier șters @@ -630,7 +626,7 @@ Limbă Limita de vârstă Vizibilitate - Liciență + Licență Etichete Categorie Dezactivați selectarea textului în descriere @@ -638,7 +634,6 @@ Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar link-urile să nu poată fi accesate în modul de selecție. %s oferă acest motiv: Contul a fost închis - Afișați elementele vizionate Modul rapid nu furnizează mai multe informații în acest sens. Contul autorului a fost închis. \nNewPipe nu va mai putea încărca acest flux în viitor. @@ -705,7 +700,6 @@ Procent Semiton Implicit ExoPlayer - Modificați dimensiunea intervalului de încărcare (în prezent %s). O valoare mai mică poate accelera încărcarea inițială a videoclipului. Modificările necesită o repornire a playerului Dați crash player-ului LeakCanary nu este disponibil Notificări @@ -727,16 +721,13 @@ Format necunoscut Calitate necunoscută Dimensiunea intervalului de încărcare de redare - Afișați elementele din viitor - Ascunde elementele vizionate - Ascunde elementele din viitor - Vezi pe website + Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! Întrebări frecvente - Sortează + Sortare Modul rapid Importați sau exportați abonamente din meniul cu 3 puncte - Rulați cea mai recentă versiune NewPipe + Folosiți cea mai recentă versiune NewPipe Atingeți pentru a descărca %s Această opțiune este disponibilă numai dacă %s este selectată ca temă Cartelă @@ -744,11 +735,11 @@ Dezactivare miniatură permanentă Listele de redare care colorate în gri conțin deja acest element. Duplicat adăugat de %d ori - Ignoră evenimentele butonului media hardware - Util, de exemplu, dacă utilizezi o cască cu butoane fizice defecte - Dorești să elimini toate fluxurile dublate din această listă de redare\? + Ignorați evenimentele butonului media hardware + Util, de exemplu, dacă utilizați o cască cu butoane fizice defecte + Doriți să eliminați toate fluxurile dublate din această listă de redare\? Eliminare dubluri - Elimini dublurile\? + Eliminați dublurile\? Afișează următoarele fluxuri Afișare/Ascundere fluxuri Vizionat complet diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f9ca0f4e66..3cd056859d5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -68,7 +68,7 @@ Не удалось создать меню загрузки Приложение/UI завершило работу Никогда такого не было, и вот опять. - Отправить по электронной почте + Отправить по почте Извините, что-то пошло не так. Отчёт Информация: @@ -325,7 +325,7 @@ При открытии ссылки Хотите импортировать настройки? Конфиденциальность - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия. \nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. @@ -350,8 +350,6 @@ Список Сетка Автоматически - Менять яркость плеера жестом - Жест яркости Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? SD-карта недоступна Вкладки, видимые на главной странице @@ -361,8 +359,6 @@ Количество подписчиков недоступно Выберите вкладку Отписаться - Менять громкость плеера жестом - Жест громкости Обновления Файл удалён Уведомление об обновлении приложения @@ -653,7 +649,6 @@ Отключить Включить Режим планшета - Показать проигранные Комментарии отключены Не показывать Низкое качество (меньше) @@ -715,7 +710,6 @@ Закреплённый комментарий LeakCanary недоступна Стандартное значение ExoPlayer - Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера Загрузка сведений о трансляции… Проверить наличие новых трансляций Удалить все загруженные файлы\? @@ -731,9 +725,6 @@ Выберите качество для внешних плееров Неизвестное качество Размер предварительной загрузки - Показывать будущие элементы - Скрыть проигранные - Скрывать будущие видео Ответы на частые вопросы Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! Посмотреть на веб-сайте @@ -747,9 +738,9 @@ Доступно, когда Тема установлена в %s Убрать постоянную миниатюру Дубликат добавлен %d раз(а) - Плейлисты, выделенные серым уже содержат этот объект. - Игнорировать события аппаратной мультимедийной кнопки - Полезно, например, если вы используете гарнитуру со сломанными физическими кнопками + Плейлисты, выделенные серым, уже содержат этот объект. + Игнорировать события аппаратных кнопок + Полезно при использовании гарнитуры со сломанными кнопками Показать следующие стримы Показать/скрыть стримы Полностью просмотрено @@ -757,5 +748,34 @@ Удалить дубликаты Удалить дубликаты\? Частично просмотрено - Вы хотите удалить все повторяющиеся потоки в этом плейлисте\? + Удалить все дубликаты потоков в этом плейлисте\? + Жест для левой стороны экрана плеера + Действие жеста слева + Жест для правой стороны экрана плеера + Действие жеста справа + Яркость + Громкость + Ничего + Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера + Отдать предпочтение описательному звуку + Аудио: %s + Звуковая дорожка + Неизвестная + Настройки ExoPlayer + Управление некоторыми настройками ExoPlayer. Эти изменения требуют перезапуска плеера, чтобы они вступили в силу + Использовать резервную функцию декодера ExoPlayer + Всегда использовать обходной путь настройки поверхности видеовыхода ExoPlayer + %1s %2s + оригинальный + дублированный + описательный + Отдать предпочтение оригинальному звуку + Выбирать исходную звуковую дорожку независимо от языка + Выбирать звуковую дорожку с описаниями для слабовидящих, если они доступны + Звуковая дорожка уже должна присутствовать в этом потоке + Выберите звуковую дорожку для внешних проигрывателей + Включите этот параметр, если у вас есть проблемы с инициализацией декодера, который возвращается к декодерам с более низким приоритетом в случае сбоя инициализации основных декодеров. Это может привести к ухудшению качества воспроизведения по сравнению с использованием первичных декодеров + Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше +\n +\nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим \ No newline at end of file diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml new file mode 100644 index 00000000000..d39a5fabb87 --- /dev/null +++ b/app/src/main/res/values-ryu/strings.xml @@ -0,0 +1,739 @@ + + + %1$sんかいかんかい + ちゃーしがプレイヤーぬみちかやびらん。VLCインストールさびーが? + インストール + キャンセル + ブラウザっしふぃらちゅん + ちゅーゆーいん + ダウンロード + きんさく + しってい + むしかしてぃ: 「%1$s」\? + ちゅーゆーいん + ちゃーしがふずんするフォルダー + ダウンロードさどぅうがくまんかいふずんさびーん + ちゃーしがファイルダウンロードするフォルダーさんたくちくぃみそーれー + デフォルトふぃんがしち + Kodiっしさいせい + インストールさりてぃうぅらんKoreアプリインストールさびーが? + 「Kodiっしさいせい」オプションひょうじ + Kodiメディアセンターけいゆでいちゃーがさうぅいゆいするたみぬしっていひょうじさびーん + うんせい + デフォルトぬうんせいけいしき + ダウンロード + 「ちぎぬちゃーしが」とぅ「かんりんちゃーしが」ひょうじ + たいおうしうぅらんURLやいびーん + デフォルトぬぎんぐしってい + ちゃーしがとぅーいるゆい + ビデオさいせい、じかん: + とうこうしゃアイコンぬサムネイル + ていひょうが + かんひょうが + がうぅいぶちゃーしがプレイヤーしようすん + やしがいぶうんせいプレイヤーしようすん + バックグラウンドっしさいせいちゅう + テーマ + ダーク + ホワイト + やしがいかん + ネットワークエラー + うんせいふずんするフォルダー + ダウンロードさるうんがくファイルくまんかいふずんさびーん + うんがくファイルダウンロードするフォルダーさんたくちくぃみそーれー + エラー + まじりぬサムネイルゆみくみやびらんたん + ちゃーしがぬURLふくごうなやびらんたん + ウェブサイトこーいしちなやびらんたん + コンテンツがいようなやびらん + ふずんメニューしっていなやびらんたん + コンテンツ + されいゆいぎんぬあるコンテンツひょうじ + もうしわきあいびらん。そうていがいぬエラーぬはっせいさびたん。 + メールっしうくいん + もうしわきあいびらん、ふぐあいぬはっせいさびたん。 + ほうくーく + じょうほう: + はっせいさんねーんよう: + うんじゅがコメント(えいぐでぃ): + しょうさい: + ちゃーしが + うんせい + さいしこう + やーまほうあん + むしがんちょータップしかいしさびーん。 + かいし + いちじていし + さくじょ + チェックサム + OK + ファイルめい + どうじらしみーちずくすん + エラー + ダウンロードちゅう(NewPipe) + タップししーょうさいをひょうじ + うまちくぃみそーれー… + クリップボードんかいコピーさびたん + ぬちふどぅ、ダウンロードフォルダーしっていしみそーれー + ダウンロード + ダウンロード + ふぐあいほうくーく + アプリ(UI)やしがクラッシュさびたん + ちゃーるむんだい:\\nリクエスト:\\nコンテンツぬぎんぐ:\\nコンテンツぬくに:\\nアプリぬぎんぐ:\\nサービス:\\nGMTじかん:\\nパッケージ:\\nバージョン:\\nOSぬバージョン: + reCAPTCHAぬようきゅう + reCAPTCHAようきゅうさびたん + ブラック + まじり + k + M + B + ポップアップモードっしふぃらちゅん + ポップアップモードっしふぃらちゅんがー +\nきんぎんぬきょかがふぃちようでぃす + ポップアップモードっしさいせいちゅう + んーか + デフォルトぬちゃーがけいしき + デフォルトふぃんがしち(ポップアップひょうじ) + ゆりたかさしがしーちひょうじ + 2K/4Kちゃーがはいちぶぬデバイスっしぬみさいゆいなやびーん + バックグラウンド + ポップアップ + しーょうきょ + ポップアップぬずくせいちーうくすん + ポップアップぬサイズとぅいちちーうくすん + いちぶぬかいずうどぅっしうっちゃきーるゆいがあいびらん + きんさくくうふぬひょうじ + きーるさくじんかいふぃいょうじするこうふをしんたくさびーん + さいこう + NewPipeにちいてぃ + サードパーティーライセンス + © %1$s さくしゃ %2$s ライセンス %3$s + バージョンじょうほうとぅゆくあるしちむん + ライセンス + Androidんきーぬフリーっしけいりょうなストリーミング。 + GitHubっしひょうじ + NewPipeぬライセンス + ふんやちゅん、デザインぬへんかん、コードぬせいり、ちゃーさぬんぶさるコードぬへんかんんでー、アイデアうむちっしぇーあいびらに?ヘルポーいちやてぃんかんぎうぅいさびーん。ゆりじょーとぅーまじゅんちゅくいとぅらさびら! + ライセンスゆむん + かんきんすん + チャンネルとぅうるく + とうるくじみ + チャンネルとぅうるいちゅんこーいじょさました + チャンネルとぅうるいちゅんへいるかんなやびらん + チャンネルとぅうるいちゅんかんしでぃちゃびらん + とうるいちゅるチャンネル + しじちゃいちゅん + きんさくりりき + きんさくりりききうくさびーん + さいせいりりき + さいせいりりききうくさびーん + さいせいぬさいかい + でぃんわんでーにゆるちゅうだんぬあとぅ、さいせいさいかいさびーん + プレイヤー + ちゃーしがぬしょうさいページっし、「バックグラウンド」あらんでぃ「ポップアップ」ボタンぬうさったるとぅちにヒントひょうじすん + ちゃーさ + りりきとぅキャッシュ + むとぅんかいむどぅすん + まじりさいせい + NewPipeぬちうち + [ふめいうぅい] + ちゃーしがぬさいゆいがなやびらんたん + かいふくふのうなエラーぬはっせいさびたん + いっちするきっかーあいびらんたん + チャンネルとぅうるくしゃなし + ちゃーしががあいびらん + ふずん + ファイルめいなさなやーぬうなんじ + んーかやーんじぇーくまでぃしてぃいしたんじんかいうきけーららりやびーん + ファイルみいなじちゃーしゅうせい + むじんでぃすーいんじ + むじんでぃすーいんじんでぃ、おおくぬとぅくしゅむじ + ちーふ + NewPipeー、うんじゅんかいさいこうぬたいきんていきょうすんでぃ、ボランティアぬじぶんぬちゃーぬじかんちかてぃかいはちそーいびーん。かいはちしゃぬちゃーがコーヒーぬまがちーNewPipeけいずいちゅてぃちーにかいりょうないるよう、ぐさいんうにげーさびら。 + ウェブサイト + NewPipeぬくわしさんじょうほうやさいしんじょうほうにちいてぃは、ウェブサイトんーちくぃみそーれー。 + りりき + りりき + くぬアイテムきーるさくりりきからさくじょさびーが? + メインページぬコンテンツ + くゎいるはくページ + Kioskページ + チャンネルページ + チャンネルしんたく + とうるくさてぃうぅるチャンネルーあいびらん + Kioskしんたく + にいるき + トップ50 + さくじょ + しょうさい + うんせいぬしってい + バックグラウンドさいゆいかいし + ポップアップさいゆいかいし + メインさいゆいんかいきりけーい + ちゃーがプレイヤーぬみちかやびらん(VLCインストールしさいせいなやびーる)。 + デフォルトぬちいちしってい + ちゃー + いちどぅてーん + データベースインポート + データベースエクスポート + きすんぬいりき、んでぃうるいちゅるチャンネルいちらん、プレイリストうゆび (んかいんうぅい) しってえーうわがきさりやびーん + さいせいりりき、んでぃうるいちゅるチャンネルいちらん、プレイリストうゆびしっていエクスポートさびーん + エラーからがいふくちゅうでぃす + やしがいぶプレイヤーや、くりらぬタイプぬリンクサポートさびらん + エクスポートさびたん + インポートさびたん + ゆうこうなZIPファイルっしぇーあいびらん + けいくーく:まじりぬファイルインポートなやびらんたん。 + くりにゆり、ぎんじぇーぬしっていぬうわがきさりやびーん。 + バックグラウンドっしりんずくささるゆいかいし + ドロワーふぃらちゅん + ドロワーくーいん + ちゃーしがプレイヤー + バックグラウンドプレイヤー + ポップアッププレイヤー + じょうほうしーゅとぅくそーいびーん… + コンテンツゆみくどーいびーん + ちゃーしがダウンロード + じょうほうひょうじ + ブックマークさるプレイリスト + サムネイルゆみくむん + やしがぞうキャッシュしーょうきょさびたん + キャッシュしーょうきょ + アプリねーんぬキャッシュデータまじりさくじょさます + キャッシュぬしーょうきょさりやびたん + ちぎぬちゃーがじちゃーっしキューんかいちいかすいん + デバッグ + ファイル + ちゃーしががみちかやびらん + うんせいがみちかやびらん + フォルダーぬみちかやびらん + ファイルぬすんじぇーさんが、ゆみがきするきんぎんぬあいびらん + ファイルめえーくゎいるはくんかいなやびらん + エラーぬはっせいさびたん: %1$s + ダウンロードないんちゃーしがーあいびらん + ドラッグしならべいがい + さくせい + はき + やーめーへいるかん + ちゃーかくにん + しんきプレイリスト + へんかん + プレイリストめい + プレイリストんかいちちが + プレイリストぬサムネイルんかいしってい + プレイリストブックマーク + ブックマークさちゅるじょ + くぬプレイリストさちゅるじょさびーが? + プレイリストぬさくせいさりやびたん + プレイリストんかいちいからさびたん + プレイリストぬサムネイルへいるかんさびたん。 + じまちゅるひょうじなし + インポート + インポートむとぅ + エクスポートさき + インポートそーいびーん… + エクスポートそーいびーん… + ファイルからインポート + じんかいぬエクスポートさき + とうるいちゅるリストぬインポートなやびらんたん + とうるいちゅるリストぬエクスポートなやびらんたん + すくどぅ + うんてい + さいせいりりきしーょうきょ + さいせいちゃんちゃーがぬいりきとぅさいせいいちさちゅるじょさびーん + さいせいりりきさちゅるじょさびたん + きんさくりりきしーょうきょ + きんさくキーワードぬいりきさちゅるじょさびーん + きんさくりりきさちゅるじょさびたん + しっていんインポートさびーが? + じまちゅん + チャンネル + プレイリスト + ユーザー + NewPipeプライバシーポリシー + プライバシーポリシーかくにん + おおまかやるシーク + おおまかやるシークしようするくとぅっしさいどぅがさがいるかわりんかいこうすくんかいシークぬなやびーん。5びょう、15びょうあらんでぃ25びょうかんかくぬシークーなやびらん + サムネイルぬゆみくみとぅふずんんーかなやーさびーん。(くぬオプションきりけーいねーメモリとぅディスクじょうぬがぞうキャッシュぬしーょうきょさりやびーん) + キューんかいかんりんちゃーがちいからちさいせいちづきーん(くいけーしさんーあい) + まじりぬさいせいりりきさちゅるじょさびーが? + まじりどぅきらんさくりりきさちゅるじょさびーが? + くぬファイル/コンテンツーあいびらん + + チャンネルとぅうるくしゃすう %sんかいん + チャンネルとぅうるくしゃすう %sんかいん + + さいせいなし + + さいせいかいすん %sかい + さいせいかいすん %sかい + + てぃーちぬアイテムぬさちゅるじょさりやびたん。 + しーいんすん + NewPipeプロジェクトーうんじゅがプライバシーふぃじょうにてーしちなちょーいびーん。うんじゅがちゃーいがねーんかぎり、アプレーいかなるデータんしゅうしゅうさびらん。 +\nNewPipeぬプライバシー・ポリシーっしぇー、クラッシュリポートそうしんじんかいちゃぬぐとーるしゅるいぬデータぬあんしん・きるくされいがしーょうさいにしちめいそーいびーん。 + NewPipeーコピーレフトなソフトウェアやいびーん。うんじょーじゆうにうりさし、きんきゅうしー、きょうゆうし、あんしがいじんするくとぅがなやびーん。うんじょー、GNUフリーソフトウェアじぇーやんんがかんかいすん GNU General Publicライセンスバージョン3いかぬむとぅんかい、じゆうにさえーいーん・しゅうせいうくないるくとぅがなやびーん。 + さいしゅうさいせいにちじ + むっとぅむさいせいさったんちゃーしが + かくだい + プレイリスト + 「ながうしっしキューんかいちちが」ぬヒントひょうじ + トラック + NewPipeぬプレイヤーぬちうち + しんちゃくとぅにんき + ながうしっしキューんかいちちが + ポップアップっしりんずくささるゆいかいし + うくぬみぬ「ふぃらく」アクション + コンテンツふぃらちゅるとぅちぬデフォルトちゃーさ — %s + フィット + じんぬみん + じどうせいせい + プレーヤーぬキャプションテキストぬしーゅくしゃくとぅはいけいスタイルへいるかんさびーん。ゆうこうなすんがー、アプリぬさいきちゃーがふぃちようやいびーん + ぬーんあいびらん + Google takeoutからYouTubeぬとぅうるいちゅるリストインポート: +\n +\n1. くぬURLふぃらちゃびーん: %1$s +\n2. ログインしうぅらんだれーログインさびーん +\n3. \"まじりしんたく\" クリックしー、あんし \"しんたくまじりかいじょ\" クリック、あんし \"んでぃうるいちゅるチャンネル\" ぬみしんたくし、\"OK\" クリック +\n4. \"ちぎぬステップ\" クリックしー、あんし \"エクスポートさくせい\" クリック +\n5. ひょうじされいねー \"ダウンロード\" ボタンクリック +\n6. ファイルからインポートクリックしダウンロードさるzipファイルしんたく +\n7.(インポートぬしーやんじねー)csvファイル(たいてい、\"YouTubeとぅYouTube Music/とぅうるいちゅるチャンネル/とぅうるいちゅるチャンネル.csv\" んかいあん)ちゅうさゅちし、ファイルからインポートクリックしてぃちゅうしゅちしたcsvファイルしんたく + リセット + ちゃーいすん + きょふぃする + せいぎんなし + モバイルネットワークさじぬがしーち + アプリきりけーいじぬさいしょうか + プレイヤーからふかぬアプリんかいきりけーいじぬちゃーさ — %s + ぬーんさん + バックグラウンドんかいへいるかん + ポップアップんかいへいるかん + メモリリークぬかんしぇー、ヒープダンピングじんかいアプリぬむはんのうになるぎんいんとぅなやびーん + ライフサイクルエラーぬほうくーく + はきさったるフラグメントあらんでぃアクティビティぬ、ライフサイクルはんいぬいでぃのーいしんふぬうなRxれいがいちーょうせいてぃきにほうくくさびーん + URLあらんでぃIDんかいゅうりょくしてぃSoundCloudプロファイルインポートさびーん:: +\n +\n1. Webブラウザーっし \"デスクトップモード\" ゆうこうなさびーん(サイトーけいたいデバイスでぃりようなやびらん) +\n2. くぬURLんかいうぅいちゃーさびーん: %1$s +\n3. ふぃちぐとぅうぅーじてぃログインさびーん +\n4. リダイレクトさったるプロファイルURLコピーさびーん。 + うんじゅがID, soundcloud.com/うんじゅがid + くぬあしっさにゆりちうしんりょうきんがかじゅーいるくとぅがあいびーん。ぐちゅういください。 +\n +\nずっこうさびーが\? + とうるくさゃすう + すくどぅとぅうんていりんちゃーさじんかいへいるかん(ゆがむんかむしりやびらん) + むうんぬあいだにはやうくり + うんかい + とうるいちゅんかいじょ + タブしんたく + アプリぬこうしん + イベント + みーさるNewPipeバージョンぬちうち + がいぶちうちゅるすうちはりようなやびらん + っちいちんかいむどぅすん + きていぬしっていふちゅるぎんさびーが\? + とうるくさゃすうはりようでぃきましん + がいぎ + ヨーロッパぬいちぱんデータふぐきせい(GDPR)にじゅんきょしーんたみに、NewPipeぬくじんじょうほうふぐほうしんにぐちゅういください。ゆーゆでぃくぃみそーれー。 +\nわったーんかいふぐあいほうくーくうくいんでー、くりうけいりらんだれーなやびらん。 + アプリぬこうしん + リストビューモード + リスト + グリッド + じちゃー + NewPipeぬアップデートぬあいびーん! + かんりょう + じゅんばんにしょりちゅう + いちじていし + じゅんばんまちにちいかしました + ふずんさりそーいびーん + じゅんばんにしょりする + あしっさがシステムにゆってぃきょふぃさりました + ダウンロードんかいしっぺーさびたん + いちいぬやーめーせいせいさびーん + うわがき + くぬなめーぬファイルーしでぃにすんじぇーさびーん + くぬなめーぬダウンロードファイルーしでぃにすんじぇーさびーん + いぬなめーむちゅるダウンロードぬしでぃにしんこうちゅうやいびーん + エラーひょうじすん + あてぃさきぬフォルダーさくせいなやびらん + ファイルさくせいなやびらん + あんさんやーしちずくにしっぺーさびたん + サーバぬみちかやびらんたん + サーバなさちどーくなやびらん + サーバぬデータあんしんさびらん + サーバぬどうじらしみーちどーいちゅるダウンロードうきちきやびらん。さいしこうしみそーれー @string/msg_threads = 1 + みちかやびらん + ふずんしーょりにしっぺーしました + ていし + さちゃるいさいしこうかいすん + ダウンロードちゅうしするまでぃぬさちゃるいさいしこうかいすん + ファイルさちゅるじょさびたん + アプリぬこうしんちうち + やしがいぶSDカードんかいダウンロードなやびらん。ダウンロードフォルダーぬばしょリセットさびーが\? + ふずんさったるタブゆみくみらんたみ、デフォルトぬタブしーようさびーん + メインページんかいひょうじさりーるタブ + みーさるバージョンがいようかのうなとぅちにアプリぬこうしんかくにんすんちうちひょうじさびーん + じゅうりょうせいかきんネットワークぬわりくみ + モバイルデータちうしぬんかいきりけーいーあいにびんりやいびーしが、いちぶぬダウンロードーいちじていしなやびらん + コメントひょうじ + んーかなすんでぃコメントふぃふぃょうじなさびーん + じちゃーさいせい + コメントなし + コメントゆみくみやびらんたん + くーいん + しちずいちゅるタイムアウト + さいせいさいかい + さいぐなさうぅいせいちゃるいちふちゅるぎんさびーん + リストねーんぬいち + リストんかいさいせいいちインジケーターひょうじさびーん + データさちゅるじょ + さいせいいちさちゅるじょさびたん + ファイルぬうぅいちゃーあらんでぃさくじょさりやびたん + ファイルうわがきなやびらん + いぬファイルめいぬダウンロードぬしでぃにしんこうちゅうやいびーん + ファイルぬさぎょうちゅうにNewPipeぬくーららりやびたん + デバイスんかいにりらりょうぬあいびらん + ファイルぬさちゅるじょさったるたみ、しんこうじょうちゅーがうしならりやびたん + ダウンロードりりき、あらんでぃダウンロードさるファイルしーょうきょさびーが\? + ダウンロードキューぬせいぎん + どうじーがてぃーちぬダウンロードぬじっこうさりやびーん + ダウンロードぬかいし + ダウンロードぬいちじていし + ダウンロードさきたんにいん + ダウンロードぬたびにふずんすーしょたんにやびーん。 +\nSDカードんかいダウンロードさるいばあえーシステムフォルダピッカー(SAF)ゆーいるこうかさびーん + システムフォルダピッカー(SAF)しようすん + ストレージアクセスフレームワークー、がいぶSDカードんかいぬダウンロードぬかのうやいびーん + さいせいいちのさくじょ + まじりぬさいせいいちさちゅるじょさびーん + まじりぬさいせいいちさちゅるじょさびーが\? + サービスぬきりけーい、ぎんじぇーぬしんたく: + + %sふんぬちゃーしが + + デフォルトぬKiosk + たーんんーじゃびらん + + %sんかいんがしちょうちゅう + %sんかいんがしちょうちゅう + + たーんちちゃびらん + + %sんかいんがちょうしゅちゅう + + アプリさいきちゃーしーねー、ぎんぐがへいるかんさりやびーん + こうすくはやうくい/まきむどぅしかんかく + PeerTubeインスタンス + PeerTubeインスタンスさんたくすん + うんじゅんかいさちちーやーインスタンスかめーいん:%s + インスタンスちちが + インスタンスぬURLんかいゅうりょく + インスタンスきんしょうするくとぅがなやびらんたん + HTTPSぬURLぬみんかいたいおうそーいびーん + インスタンスーしでぃにすんじぇーそーいびーん + ローカル + さいきんちいからさったん + かんひょうが + しーゅうふくちゅう + ダウンロードぬしーゅうふくなやびらん + インスタンスしんたく + ダウンロードりりきしーょうきょ + ダウンロードさるファイルしーょうきょ + じちゃーせいせい(アップローダーぬみちかやびらん) + ふかぬアプリぬういにふぃいょうじしーんきんぎんをあてーてぃください + アプリぬぎんぐ + システムぬっちうぅい + とぅきーねー「かんりょう」うちくぃみそーれー + かんりょう + ちゃーしが + + %dびょう + + ExoPlayerぬゆいてぃがろーくぬたみシークかんかこー%dびょうんかいしっていさりやびたん + ミュート + ミュートかいじょ + + %dふん + + + %dじがん + + + %dんかいち + + チャンネルグループ + フィードぬさいしゅうこうしん:%s + ゆみくみしっぺー:%d + フィードゆみくみちゅう… + フィードしーょりちゅう… + チャンネルしんたく + チャンネルがせんたくされていません + + %dさんたくちゅう + + グループみいがからやいびーん + くぬグループさちゅるじょさびーが? + しんき + フィード + フィードぬこうしんかんかく + さいぐぬこうしんぐ、んでぃうるいちゅるチャンネルこうしんすんびきんでぃすかぬじがん ― %s + ちゃーこうしんすん + かのうやれーしんようフィードからしゅうとぅく + いくちがぬサービスっしりようかのう。ちうじーょうゆりむこうすくでぃすがせいぎんさりたじょうほうがしゅとぅくさり、たいていぬばあいふかんじんやいびーん(れい: さいせいじがん、しーゅるい、ライブステータスんでーがねーん) + こうすくモードゆーいんかんが + こうすくモードんーかなやー + フィードぬゆみくみがにーしじーんでぃうむやびーが?うぬばあい、こうすくゆみくみゆーいるこうかしんーちくぃみそーれー(しってい、あらんでぃしちゃぬボタンうしてぃへんかんするくとぅがなやびーん)。 +\n +\nNewPipeーたーちぬゆみくみほうほうていきょうさびーん: +\n・とうるいちゅるチャンネルじんたいしゅとぅくさびーん。くれーていすくやいびーしがかんじんやいびーん。 +\n・しんようぬサービスエンドポイントしーようさびーん。くれーこうすくやいびーしが、たいていぬばあいふかんじんやいびーん。 +\n +\nたーちぬちがいとぅしてぃ、こうすくなむのーちうじょう、さいせいじがんてぃがろーしーゅるい(ライブんでぃちうじーょうぬどうがをくびちでぃきない)んでーぬじょうほうがふすくしてぃ、ただしいーょうぬじょうほうゆりすくなくしゅとぅくするくとぅがあいびーん。 +\n +\nYouTubeー、くぬこうすくやーゆみくみほうほうRSSフィードっしていきょうするサービスぬてぃーちやいびーん。 +\n +\nちまり、ゆみくみほうほうぬしんたくはすくどぅあらんでぃゆいかくさぬどぅちらゆーいるしんすが、うんじゅがしちがゆやびーん。 + ∞ぬちゃーしが + 100いじょうぬちゃーしが + くぬコンテンツーなーらNewPipeっしサポートさりやびらん。 +\n +\nくんぐぬバージョンっしサポートさりーんかむしりやびらん。 + きょく + アーティスト + アルバム + くぬちゃーがんかいはにーるれいうぅいゆいぎんぬあいびーん。 +\n +\nいちらんさるいばあい、しっていから \"%1$s\" ゆーいるこうかしみそーれー。 + プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。 +\nゆたさいびーが?くぬあしっさーむとぅんかいむどぅしやびらん! + はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん + しちょうじみぬちゃーしがさちゅるじょさびーが? + しちょうじみさちゅるじょ + サービスぬオリジナルぬテキストぬやーまほうあぬんかいひょうじさりやびーん + アイテムんかいむとぅぬじがんひょうじ + YouTubeせいぎんちきモードゆーいんかんが + %sにゆる + %sにゆりさくせい + チャンネルぬサムネイル + グループがさりてぃうぅらんとぅうるいちゅるチャンネルぬみひょうじ + なーらプレイリストブックマークーあいびらん + クラッシュしちめいするむんだいぬしでぃにすんじぇーそーんがちゃーがかくにんしみそーれー。じゅうふくさるチケットさくせいすーあい、うんじょーわったーからじっさいぬバグしーゅうせいすんじがんぼーいるくとぅなやびーん。 + ちぎぬきんさくきっかひょうじちょーいびーん:%s + GitHubでぃほうくくすん + せいけいじみリポートコピー + プレイリストページ + プレイリストさんたくちくぃみそーれー + じちゃーてぃきなさうぅいゆいかいしさびーん — %s + じちゃーっしキューんかいちちが + アクティブやるプレイヤーぬキューぬいりちがーやびーん + プレイヤーびちぬプレイヤーんかいきりけーいねーキューぬうきかわいるかのうゆいがあいびーん + さん + Wi-Fiぬみ + キューさいせい + キューしーょうきょするめーんかいかくにんすん + URLにいるしちなやびらんたん。ふかぬアプリっしふぃらちゃびーが? + ちまーにひょうじさりーるサムネイル16:9からせいほうけいなさびーん + サムネイルせいほうけいなすん + いかタップしちうちぬアクションへんしゅうさびーん。みぎぬわんかいあんチェックボックスしーようしコンパクトやるちまーにひょうじすし3ちまっししんたくさびーん + コンパクトやるちまーにひょうじさりーるアクションー3ちまっしいらぶるくとぅがなやびーん! + 5ばんみぬアクションボタン + 4ばんみぬアクションボタン + 3ばんみぬアクションボタン + 2ばんみぬアクションボタン + 1ばんみぬアクションボタン + なし + くいけーし + シャッフル + バッファリング + YouTubeー、せいじんんきーぬかのうゆいやしがあんコンテンツじょがいすん「せいぎんちきモード」ていきょうそーいびーん + されいせいぎん(18+んでー)ぬいゆーいっし、わらびんかえーふていくしーちなかのうゆいぬあるコンテンツひょうじすん + キューんかいちちが + キューんかいちいからさびたん + reCAPTCHAとぅちゃるとぅちにNewPipeぬふずんさるCookieしーょうきょさびーん + reCAPTCHAぬCookieしーょうきょ + reCAPTCHAぬCookieぬしーょうきょさりやびたん + メモリリークひょうじ + ロックぬみんのーいけいとぅちうちぬりょうほうんかいサムネイルさすん + サムネイルひょうじすん + うぅれーちきぬちうち + サムネイルぬメインカラーむとぅんかい、ちうちカラーなさびーん(まじりぬデバイスっしちゃーさすいんでーかぎやびらん) + メタじょうほうひょうじ + ハッシュけいさんちゅう + ちゃーしがぬハッシュかちうち + ちゃーしがぬハッシュかしんこうじょうちゅーぬちうち + コメント + んーかなしねーちゃーがぬがいようらんとぅちいかじょうほうふぃふぃょうじなさびーん + がいようらんひょうじ + さいきん + ふぃらく + しちめい + かんりんちゃーしが + ちゃーしがさくせいしゃ、ちゃーしがコンテンツ、きんさくリクエストんかいかんすんちいかじょうほうくくむんメタじょうほうボックスふぃふぃょうじなすんがーオフなさびーん + うちかいぬデバイスじょうぬアプリっしぇー、くりふぃらちゅしぇーなやびらん + チャプター + くぬコンテンツーゆーいるりょうぬユーザーぬみがいようないるたみ、NewPipeっしぬストリーミングてぃがろーダウンロードーなやびらん。 + くぬちゃーしがーYouTubeミュージックプレミアムかいさるんぬみがいようないるようなとーくとぅ、NewPipeっしストリーミングてぃがろーダウンロードうくないしぇーなやびらん。 + くぬコンテンツーふぃかかいぬたみ、NewPipeっしストリーミングてぃがろーダウンロードすしぇーなやびらん。 + くれーSoundCloud Go+トラックやくとぅ、すくなくとぅむうんじゅがくにっしぇー、NewPipeっしぇーストリーミングてぃがろーダウンロードぬなやびらん。 + くぬコンテンツー、うすんまいぬくにっしぇーぐりよういただきやびらん。 + アプリぬクラッシュ + くぬちゃーがはにーるれいうぅいゆいぎんぬあいびーん。 +\nされいせいぎんちきちゃーがくくむんみーさるYouTubeポリシーにゆり、NewPipeーちゃーがストリームんかいアクセスならんたみさいせいうぅいなやびらん。 + いかからうくぬみぬやっくゎんテーマさんたくなやびーん + じちゃー(デバイスぬテーマ) + うくぬみぬやっくゎんテーマしんたく — %s + かいきち + やっくゎんテーマ + ダウンロードかいしさびたん + チャンネルぬしーょうさいひょうじ + ラジオ + うすすみ + ビデオさいゆいがとぅまたいでぃねーんばあえーメディアトンネリングんーかがしみそーれー + マルチメディアトンネリングんーかなすん + かんかい + ぎんてぃかんかい + ふぃかんかい + やーいぶ + カテゴリ + タグ + ライセンス + プライバシー + されいせいぎん + ぎんぐ + サポート + ホスト + サムネイルぬURL + ウェブサイトふぃらちゅん + ダウンロードぬかーじにふずんすーしょたんにやびーん + ダウンロードフォルダーぬなーらしっていさりやびらん。なまちゃーきデフォルトぬフォルダーさんたくちくぃみそーれー + Android10いこおー \'Storage Access Framework\' ぬみやしがサポートさりやびーん + こうすくモードっしくぬじょうほうぬしーょうさいーていきょうさりやびらん。 + \'%s\' ぬフィードゆみくみやびらんたん。 + フィードぬゆみくみエラー + しちめいぶんぬテキストぬしんたくんーかなすん + しちめいぶんぬテキストぬしんたくゆうこうなすん + なましちめいぶんぬテキストさんたくなやびーん。しんたくモードちゅおーページぬちらちちゃいリンクぬクリックならんなたいしーんくとぅんかいちゅういしみそーれー。 + ていしさったるアカウント + くぬとうこうしゃぬアカウントーていしさりとーいびーん。 +\nNewPipeーしーょうらいてぃきにくぬフィードゆみくみらんなやびーん。 +\nくぬチャンネルぬとぅうるいちゅんこーいじょさびーが? + オフ + オン + タブレットモード + %sやしがくぬりゆうていじ: + ひょうじさん + ていふぃんしち(しょう) + かんふぃんしち(だい) + シークバーぬサムネイルプレビュー + コメントーんーかなとーいびーん + しちょうじみとぅしてぃマーク + リモートきんさくかんふ + ローカルきんさくかんふ + アイテムスワイプしさちゅるじょ + ちょくしちフルスクリーンモードんかいきりけーてぃ、ミニプレイヤーっしちゃーがかいしさびらん。じどーでぃんうぅてぃんがロックさりとーーあいやてぃん、フルスクリーンしーゅうりょうするくとぅでぃミニプレイヤーんかいアクセスなやびーん + プレイヤーフルスクリーンっしかいし + + %1$sちぬダウンロードさちゅるじょさびたん + + + %sちぬダウンロードぬかんりょうさびたん + + ピカソー、がぞうぬういに、がぞうくとぅどぅくるしーきびちするしきさいきしーょうひょうじさびーん: あかーネットワーク、あおーディスク、みどぅれーメモリ + やしがぞうんかいふぃいょうしきひょうじ + しーょりちゅう… くーてーんじがんがかかいんかむしりやびらん + みーさるバージョンしーゅどうでぃかくにんさびーん + アップデートかくにんちゅう… + アップデートかくにん + ちぎキューんかいちちが + ちぎキューんかいちいからさびたん + クリエイターぬちむくみてぃ + \"プレイヤーぬクラッシュ\"ひょうじ + プレイヤーぬクラッシュ + みーさるフィードアイテム + エラーほうくーくちうち + エラーぬはっせいさびたん。ちうちんーちくぃみそーれー + エラーぬはっせいさびたん(タップしーねーほうくーくなやびーん) + スナックバーんかいエラーひょうじ + くていさったるコメント + くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん。 +\nStorage Access Frameworkとぅぐかんゆいぬあんファイルマネージャインストールしみそーれー + くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん +\nファイルマネージャインストールすが、ダウンロードしっていっし \'%s\' んーかなするくとぅうたみしくぃみそーれー + プレイヤーしようじんかいクラッシュオプションひょうじ + エラーちうちさくせい + エラーほうくーくすんちうち + LeakCanaryがりようふかのうやいびーん + プレイヤーちうち + ストリームぬしょうさいゆみくどーいびーん… + とうるいちゅるチャンネルぬみーさるストリームんかいちいていちうちすん + , + ちうちぇーんーかなやーさりとーいびーん + ExoPlayerぬデフォルト + ちうちうきとぅいん + くぬチャンネルかんどぅくさびたん + ディスクからダウンロードさるまじりぬファイルさちゅるじょさびーが? + まじりてーんがい + かくにんすんふぃんどぅ + みーさるストリームぬチェックじっこう + かんどぅちゅるチャンネルぬみーさるストリームんかいかんすんちうち + みーさるストリームぬちうち + + %sきんぬみーさるストリーム + + みーさるストリーム + ちうち + ぎんじぇーさいせいちょーるストリームぬちうちこうせい + ふぃちぐとーるネットワークぬしーゅるい + パーセント + はんうん + まじりぬネットワーク + データぬゆみくみかんかく + みちぬけいしき + みちぬふぃんしち + ダウンローダーにゆってぃサポートさりてぃうぅらんちゃーがーひょうじさりやびらん + しんたくさったんちゃーがーがいぶプレイヤーんかいゆってぃサポートさりやびらん + やしがいぶプレイヤーっしりようがのうのーいるゆいストリームぬあいびらん + やしがいぶプレイヤーっしりりようがのうやーちゃーがストリームぬあいびらん + やしがいぶプレイヤーっしぬふぃんしちしんたく + ならびがい + ウェブサイトひょうじ + タップし%sダウンロード + うんじょーNewPipeぬさいしんばんきどうそーいびーん + ゆーあしちまん + アアプリぬちかいかたんかいくまたるとぅちぇー、ゆーあんさちむぬんかいくてーとーいびーくとぅ、じふぃんーちくぃみそーれー! + %sぬテーマなさんたくさったーあいぬみ、くぬしんたくしがりようかのうやいびーん + こうすくモード + 3てぃんメニューからんでぃうるいちゅるチャンネルぬゆみくみあらんでぃかきだしがかのう + カード + クリップボードんかいぬコピーんかいしっぺーさびたん + はいーらでぃひょうじさっとーるプレイリストんかえー、しでぃにくぬアイテムぬくくまっとーいびーん。 + %dかいじゅうふくちいかさりやびたん + くていサムネイルぬしっていこーいじょ + じゅうふくさくじょさびーが\? + たとぅいねー、ぶちりボタンぬやんでぃたるヘッドセットしーようそーーあいにびんりやいびーん + くぬさいせいリストねーんぬじゅうふくさるストリームまじりさくじょさびーが\? + ハードウェアメディアボタンイベントむしすん + じゅうふくさちゅるじょ + ちぎぬストリームひょうじ + ストリームぬひょうじ/ふぃふぃょうじ + かんじぬんかいしちょうじみ + いちぶしはべるじみ + くんぐ + さいせいがみんぬふぃだりはんぶんぐとぅジェスチャーしんたく + ふぃだりぬジェスチャーちゃーさ + さいせいがみんぬみぎはんぶんようぬジェスチャーしんたく + みぎぬジェスチャーちゃーさ + あかるさ + うんりょう + + オリジナルうんゆいゆーいんしんすん + ぎんぐんかいかんきうぅらなくオリジナルぬオーディオトラックさんたくすん + うんせいかいしちゆーいんしんすん + メインタブセレクタさるにいちゃー + メインタブぬばしょ + ゆみくみかんかくへいるかんさびーん。(ぎんじぇー %s)くぬあたいくーくしーねーさいせいかいしまでぃぬじがんがいんちゃくなやびーん。へんかんてぃきようすんがーさいきちゃーがふぃちようやいびーん + りようかのうなばあいんかいしかくしょうがいしゃむきのおんせいかいしちトラックさんたくすん + \ 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 d2af2693057..a32d1658a6c 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -467,10 +467,6 @@ Cronologia de sas chircas Issèbera sos consìgios de ammustrare in sas chircas Cussìgios de chirca - Imprea sos gestos pro controllare sa luminosidade de su riproduidore - Gestos de controllu de sa luminosidade - Imprea sos gestos pro controllare su volume de su riproduidore - Gestos de controllu de su volume Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada @@ -635,7 +631,6 @@ Istudadu Allutu Modalidade tauledda - Ammustra sos elementos pompiados No ammustres Calidade bassa (prus minore) Calidade arta (prus manna) @@ -681,7 +676,6 @@ Cummentu apicadu LeakCanary no est a disponimentu Valore ExoPlayer predefinidu - Muda sa mannària de s\'intervallu de carrigamentu (in custu momentu %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu de incumintzu de su vìdeu. Sas modìficas tenent bisòngiu de torrare a allùghere su riproduidore Cunfigura sa notìfica de su flussu in cursu de riprodutzione Notìficas de flussos noos dae sas iscritziones @@ -714,9 +708,6 @@ Calidade disconnota Su flussu seletzionadu no est galu suportadu dae letores esternos Mannària de s\'intervallu de carrigamentu de sa riprodutzione - Ammustra sos elementos imbenientes - Cua sos elementos pompiados - Cua sos elementos imbenientes Preguntas fitianas Si ses tenende problemas impreende s\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas! Pòmpia in su situ web @@ -741,4 +732,33 @@ Bidu de su totu Bidu in parte Luego + Atzione de su gestu de manca + Atzione de su gestu de destra + Volume + Issèbera unu gestu pro sa metade de manca de s\'ischermu de su riproduidore + Issèbera unu gestu pro sa metade de destra de s\'ischermu de su riproduidore + Luminosidade + Perunu + Modìfica sa mannària de s\'intervallu de càrriga de cuntenutos consecutivos (como %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu initziale issoro + Preferi s\'àudio originale + Preferi un\'àudio descritivu + Seletziona una rasta àudio cun descritziones pro persones cun problemas de vista, si bi nd\'at a disponimentu + Àudio: %s + Rasta àudio + Disconnotu + Manìgia unas cantas impostatziones de ExoPlayer. Custas modìficas tenent bisòngiu de torrare a allùghere su riproduidore pro chi tèngiant efetu + Imprea sa funtzionalidade de riserva de su decodificadore de ExoPlayer + %1s %2s + originale + dopiadu + descritivu + Imprea semper sa solutzione alternativa de s\'impostatzione de superfìtzie de s\'essida vìdeu de ExoPlayer + Custa solutzione alternativa lìberat e torrat a istantziare sos codificadores de vìdeu cando acontesset unu càmbiu de superfìtzie, in càmbiu de impostare sa superfìtzie e su codificadore in manera direta. Giai impreada dae ExoPlayer in unos cantos dispositivos cun custu problema, custa impostatziones tenet un\'efetu petzi in Android 6 e versiones prus noas. +\n +\nS\'abilitatzione de custa optzione diat pòdere prevènnere faddinas de riprodutzione cando si càmbiat su riproduidore vìdeu atuale o si colat a s\'ischermu intreu + Seletziona una rasta àudio pro riproduidores esternos + Seletziona sa rasta sonora originale in manera indipendente dae sa limba + Una rasta àudio diat dèpere èssere giai presente in custu flussu + Impostatziones pro ExoPlayer + Abìlita custa optzione si tenes problemas de initzializatzione de su decodificadore, chi colat a decodificadores a prioridade prus bassa si s\'initzializatzione de sos decodificadores primàrios fallit. Custu diat pòdere causare unu rendimentu de riprodutzione bassu cunfronta a s\'impreu de decodificadores primàrios \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 05f9c70b9e0..55c8d3f9ba3 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -52,7 +52,7 @@ Naživo Nemožno nastaviť menu preberania Pardon, toto sa nemalo stať. - Nahlásiť túto chybu mejlom + Nahlásiť cez e-mail Pardon, niečo sa pokazilo. Správa Info: @@ -337,10 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Ovládanie hlasitosti gestom - Používať gestá pre ovládanie hlasitosti - Ovládanie jasu gestom - Použivať gestá pre ovládanie jasu Aktualizácie Udalosti Súbor vymazaný @@ -647,7 +643,6 @@ Zapnuté Režim tabletu Obľúbené autorom - Zobrazovať pozreté položky %1$s sťahovanie zmazané %1$s sťahovania zmazané @@ -693,7 +688,6 @@ Zobraziť krátke oznámenie chyby Oznámte chybu ExoPlayer preddefinovaný - Zmeniť interval načítania (aktuálne %s). Menšia hodnota môže zvýšiť rýchlosť prvotného načítania videa. Zmena vyžaduje reštart Upozornenia Frekvencia kontroly Vymazať všetky stiahnuté súbory z disku\? @@ -727,9 +721,6 @@ Streamy nepodporované sťahovačom sa nezobrazujú Žiadne video streamy nie sú k dispozícií pre externé prehrávače Neznáma kvalita - Zobraziť budúce položky - Skryť videné položky - Skryť nasledujúce položky Často kladené otázky Pozrieť na webovej stránke Usporiadať @@ -744,4 +735,43 @@ Táto možnosť je dostupná len pre motív %s Rýchly režim Import alebo export odberov z 3-bodkovej ponuky + Akcia gesta vľavo + Akcia pre gesto v pravej polovici obrazovky + Akcia gesta vpravo + Akcia pre gesto v ľavej polovici obrazovky + Jas + Hlasitosť + Nič + Odstrániť duplikáty + Odstrániť duplikáty\? + Rozpozerané + Dopozerané + Toto sa môže hodiť v prípade, že máte pokazené tlačidlo na slúchadlách + Ignorovať fyzické tlačidlá + Zmena veľkosti intervalu načítania pri progresívnom obsahu (v súčasnosti %s). Nižšia hodnota môže urýchliť ich počiatočné načítanie + Preferovať pôvodné audio + Vyberať pôvodnú zvukový stopu bez ohľadu na nastavený jazyk + Preferovať prehrávanie popisu + Zvuk: %s + Zvuková stopa + Chcete odstrániť všetky duplikátne streamy z tohoto zoznamu\? + Zobrazovať nasledovné streamy + V tomto streame by už mala byť prítomná zvuková stopa + Výber zvukovej stopy pre externé prehrávače + Neznáma + Nadchádzajúce + Úprava nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je nutné reštartovať ExoPlayer + Túto možnosť povoľte, ak máte problémy s inicializáciou dekodéra, ktorý sa v prípade zlyhania inicializácie primárnych dekodérov vráti k dekodérom s nižšou prioritou. To môže mať za následok nižší výkon prehrávania ako pri použití primárnych dekodérov + Používať funkciu záložného dekodéra prehrávača ExoPlayer + Vždy použiť nastavenia výstupu videa ExoPlayera + %1s %2s + povodná + dabovaná + Vyberať zvukovú stopu s popisom pre zrakovo postihnutých ak je k dispozicií + Zobrazovať/Skrývať streamy + Nastavenia ExoPlayer + Toto riešenie spôsobí to, že pri zmene textúry sa aktuálne používaný kodek uvoľní a potom znova použije, miesto toho aby sa textúra rovno použila na kodek. Toto nastavenie, ktoré už ExoPlayer používa na niektorých zariadeniach s týmto problémom, má vplyv len na Android 6 a vyšší +\n +\nPovolenie tejto možnosti môže zabrániť chybám pri prehrávaní pri prepínaní aktuálneho prehrávača videa alebo prepínaní na celú obrazovku + popisná \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index d46bd667aa9..7e89a1ed5e6 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -434,10 +434,6 @@ Pokaži nasvet, ko boste pritisnili na ozadje ali pojavno okno v \"Podrobnosti:\" Samodejno predvajanje Pokaži indikator položaja predvajalnika na seznamih - Uporabi poteze za nadzor svetlosti predvajalnika - Poteza za nadzor svetlosti - Uporabi poteze za nadzor glasnosti predvajalnika - Nadzor potez za glasnost Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 4f022b5ddfd..ecaa9991158 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -394,10 +394,6 @@ Wixii laraadiyay Dooro soojeedinada lasoo bandhigo marka wax la raadinayo Soojeedinada raadinta - Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka - Maamulista iftiinka (farta) - Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad umaamusho codka - Maamulista codka (farta) Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga @@ -622,7 +618,6 @@ Hadda waad dooran kartaa qoraalka ku dhexjira faahfaahinta. Ogow markaad caalamdinayso qoraalka boggu wuu boodboodi karaa tixraacyadana waxay noqon karaan kuwo aan lagu dhufan karin. %s wuxuu sheegayaa sababtan: Akoonka waa lajoojiyay - Tus kuwa ladaawaday Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan. Akoonka soosaaraha waa la joojiyay. \nNewPipe ma awoodi doono inuu soo kiciyo bandhiggan mustaqbalka. diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 5fbe1c01288..f9929ac8da3 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -482,10 +482,6 @@ Ruani frazat e kërkuara lokalisht Historia e kërkimit Shfaq sugjerime kur jeni duke kërkuar - Përdorni gjestet për të kontrolluar ndriçimin e luajtësit - Kontrolli i gjesteve të ndriçimit - Përdorni gjeste për të kontrolluar volumin e luajtësit - Kontrolli i gjesteve të volumit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis @@ -507,7 +503,7 @@ Formati i parazgjedhur audio Shfaq një opsion për të luajtur videot përmes Kodi Shfaq opsionin \"Luaj me Kodi\" - Instaloni aplikacionin Kode që mungon\? + Instaloni aplikacionin Kore që mungon\? Vetëm disa pajisje mund të luajnë video 2K/4K Shfaq rezolucione më të larta Rezolucioni i parazgjedhur i popup @@ -556,7 +552,7 @@ Butoni i tretë i veprimit Butoni i dytë i veprimit Butoni i parë i veprimit - Shkallëzoje pamjen miniaturë të videos së treguar në njoftim nga aspekti 16:9 në 1:1 (mund të shfaqë deformime) + Shkallëzoje pamjen miniaturë të videos së treguar në njoftim nga aspekti 16:9 në 1:1 Shkallëzoje pamjen miniaturë në aspektin 1:1 Shfaq rrjedhjet e memories Biskotat reCAPTCHA janë pastruar @@ -615,7 +611,6 @@ Kjo përmbajtje është private, kështu që nuk mund të luhet apo shkarkohet nga NewPipe. Kjo përmbajtje nuk është e disponueshme në shtetin tuaj. Përdor pamje statike për sfondin e ekranit të kyçur si dhe për njoftimet - Shfaq objektet e para Modaliteti i feed-it të shpejtë nuk mundëson më tepër informacion mbi këtë. Llogaria e autorit është bllokuar. \nNewPipe nuk do mund ta ngarkojë këtë feed në të ardhmen. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 142f179c913..208b7f6e948 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -497,10 +497,6 @@ Позиције на листама Вратите последњу позицију репродукције Наставак репродукције - Користите покрете за контролу осветљаја - Контрола осветљености потезом - Користите потезе за контролу јачине звука плејера - Контрола јачине звука потезом Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток @@ -644,7 +640,6 @@ искљ укљ Режим таблета - Прикажи пуштано Закажи следеће Заказано је следеће Местни предлози претраге diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 92a1d2294c7..27575d2a0c4 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -17,11 +17,11 @@ Tar bort ljud vid vissa upplösningar Använd extern ljudspelare Bakgrund - Extrafönster - Mapp för hämtning av video + Popup + Hämtningsmapp för video Hämtade videofiler lagras här - Välj hämtningsmappen för videofiler - Mapp för hämtning av ljud + Välj hämtningsmapp för videofiler + Hämtningsmapp för ljud Hämtade ljudfiler lagras här Välj hämtningsmapp för ljudfiler Standardupplösning @@ -39,7 +39,7 @@ Ljust Mörkt Svart - Kom ihåg popupstorlek och position + Kom ihåg popup inställningar Kom ihåg popup-rutans senaste storlek och position Sökförslag Välj förslag att visa i samband med sökning @@ -90,7 +90,7 @@ Håll koll på videor som du tittat på Återuppta uppspelning Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal) - Visa \"Håll för att placera i kön\"-tips + Visa \"Håll för att köa\"-tips Visa tips när bakgrunds- eller popup-knappen trycks på sidan för videodetaljer Spelare Beteende @@ -151,7 +151,7 @@ Hämta Tillåtna tecken i filnamn Ogiltiga tecken ersätts med detta värde - Ersättningstecknet + Ersättningstecken Bokstäver och siffror De flesta specialtecken Om NewPipe @@ -175,13 +175,13 @@ Välj en kanal Inga kanal prenumerationer ännu Välj en kiosk - Trendigt + Trendande Topp 50 Nytt och populärt Ta bort Detaljer Ljudinställningar - Håll för att placera i kön + Håll för att köa Börja spela i bakgrunden Börja spela i en popup Donera @@ -190,7 +190,7 @@ Webbplats För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats. Visa info - Bokmärkta spellistor + Bokmärkta Spellistor Lägg till i Använd snabb icke-exakt sökning Läs in miniatyrbilder @@ -214,7 +214,7 @@ Spår Användare Växla till Bakgrunden - Växla till popup + Växla till Popup Växla till main Importera databas Exportera databas @@ -280,9 +280,9 @@ Passa Fyll Zoom - Autogenererade + Automatiskt genererad Textning - Ändra spelarens textskala och bakgrundsstil. Kräver omstart av appen för att träda i kraft + Ändra spelarens textskala och bakgrundsstil. Kräver att appen startas om för att träda i kraft Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning Rapportera out-of-lifecycle fel Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning @@ -303,7 +303,7 @@ \n4. Klicka på \"Nästa steg\" och sen på \"Skapa export\" \n5. Klicka på \"Hämta\"-knappen när den kommer fram \n6. Klicka på IMPORTERA FIL nedan och välj den nedladdade zip-filen -\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/prenumerationer/prenumerationer.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen +\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/subscriptions/subscriptions.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen Importera en SoundCloud-profil genom att skriva in webbadressen eller ditt ID: \n \n1. Aktivera \"skrivbordsläge\" i en webbläsare (sidan är inte tillgänglig för mobila enheter) @@ -330,14 +330,10 @@ Minimera vid växling av applikationen Åtgärd när du växlar till andra applikationer från huvudvideospelare — %s Ingen - Minimera till bakgrunds-spelare + Minimera till bakgrundsspelare Minimera till popup-spelare Sluta prenumerera Välj flik - Gestkontroll för volym - Använd gester för att justera spelarens volym - Gestkontroll för ljusstyrka - Använd gester för att justera ljusstyrkan Uppdateringar Fil raderad Avisering för appuppdatering @@ -353,7 +349,7 @@ Listvy Lista Rutnät - Automatiskt + Automatisk En NewPipe-uppdatering är tillgänglig! Färdig pausad @@ -431,7 +427,7 @@ kan inte skriva över filen Det finns redan en hämtad fil med det här namnet En fil med det namnet finns redan - återställer + återhämtar Väntande Originaltexter från tjänster kommer att synas i streamobjekt Visa ursprungstid på objekt @@ -536,8 +532,8 @@ Femte åtgärdsknappen Fjärde åtgärdsknappen Tredje åtgärdsknappen - Andra händelseknapp - Första händelseknapp + Andra åtgärdsknappen + Första åtgärdsknappen Detta innehåll stöds ännu inte av NewPipe. \n \nDetta kommer förhoppningsvis ändras i en kommande version. @@ -574,7 +570,7 @@ Inaktivera för att dölja videobeskrivning och ytterligare information Visa meta-information Använd miniatyrbild som bakgrund till både låsskärm och aviseringar - Redigera varje aviseringshandling nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger + Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger Låt Android färglägga varje avisering individuellt utifrån miniatyrbildens huvudsakliga färg (notera att detta inte är tillgängligt på alla enheter) Färglägg avisering Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! @@ -627,7 +623,6 @@ Öppna med Visa miniatyrer Kanalens visningsminiatyr - Visa sedda objekt Det snabba flödesläget ger inte mer information om detta. Fel vid inläsning av flödet Markera som sedd @@ -637,7 +632,7 @@ Aviseringar för videohashningsframsteg Miniatyrbild-webbadress Inaktivera medietunnel om du upplever en svart skärm eller stamning vid videouppspelning - Inaktivera mediatunnel + Inaktivera medietunnel Hjärtmärkt av innehållsskaparen Du kan välja det natt-tema du föredrar nedan Välj det natt-tema du föredrar — %s @@ -659,7 +654,7 @@ Senaste Svep objekt för att ta bort dem Förslag via fjärrsökning - Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om auto-rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge + Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om automatisk rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge Visa Picasso färgade band ovanpå bilderna som anger deras källa: rött för nätverk, blått för disk och grönt för minne Sök efter uppdateringar Kolla manuellt efter nya versioner @@ -669,7 +664,7 @@ Krascha spelaren Visar ett kraschalternativ vid användning av spelaren Felrapport-avisering - Avisering för att rapportera fel + Aviseringar om att rapportera fel NewPipe stötte på ett fel, tryck för att rapportera Ett fel uppstod, se aviseringen Visa en fel snackbar @@ -681,7 +676,7 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard - Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver omstart av spelaren + Ändra storleken på laddningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första laddningen Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk @@ -689,7 +684,7 @@ Aviseringar är avstängda Bli meddelad Du har nu prenumenerat till denna kanalen - Avisering om nya strömmar för prenumenanter + Aviseringar om nya strömmar för prenumerationer %s Ny ström %s Nya strömmar @@ -700,7 +695,7 @@ Aviseringar Nya strömmar Laddar strömdetaljer… - Avisering om nya strömmar + Aviseringar om nya strömmar , Spelaravisering Växla alla @@ -713,10 +708,7 @@ Videoströmmar som ännu inte stöds av nedladdaren visas inte Inläsningsintervalls storlek Välj kvalitet för externa spelare - Visa framtida objekt Den valda videoströmmen stöds inte av externa spelare - Göm framtida objekt - Göm sedda objekt Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor! Vanligt ställda frågor Visa på webbplats @@ -741,4 +733,34 @@ Visa/Dölj strömmar Fullständigt sedd Kommande + Volym + Ingen + Välj en gest för den vänstra halvan av spelarskärmen + Ljusstyrka + Vänster gest åtgärd + Välj en gest för den högra halvan av spelarskärmen + Höger gest åtgärd + Ljud: %s + Ljudspår + Ett ljudspår bör redan finnas i denna ström + Välj ljudspår för externa spelare + Okänt + ExoPlayer inställningar + Hantera vissa ExoPlayer inställningar. Dessa ändringar kräver en omstart av spelaren för att träda i kraft + Använd alltid ExoPlayers lösning för inställning av videoutgångsyta + Föredra originalljud + Välj originalljudspåret oavsett språk + Föredra beskrivande ljud + Välj ett ljudspår med beskrivningar för synskadade personer om det finns tillgängligt + Använd ExoPlayers reservfunktion för avkodare + Aktivera det här alternativet om du har problem med initiering av avkodare, vilket faller tillbaka på avkodare med lägre prioritet om initieringen av primära avkodare misslyckas. Detta kan leda till sämre uppspelningsprestanda än vid användning av primära avkodare + Denna lösning frigör och återinstansierar videokodeker när en ytförändring inträffar, istället för att ställa in ytan direkt till kodeken. Används redan av ExoPlayer på vissa enheter med detta problem, denna inställning har endast effekt på Android 6 och senare +\n +\nOm du aktiverar det här alternativet kan det förhindra uppspelningsfel när du byter aktuell videospelare eller växlar till fullskärm + %1s %2s + original + beskrivande + dubbad + Flytta huvudflik väljaren till botten + Huvudflikarnas position \ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 3b8bff427ed..0a4f3067067 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,10 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - சத்தக் கட்டுப்பாடு செய்கை - இயக்கிச் சத்தத்தைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து - வெளிச்ச கட்டுப்பாடு செய்கை - இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் கோப்பு அழிக்கப்பட்டது செயலி புதுப்பித்தல் அறிவிப்பு diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index fd38b35d556..2351be26324 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -186,7 +186,6 @@ పాప్అప్ చివరి పరిమాణం మరియు స్థానాన్ని గుర్తుంచుకోండి వీడియో వివరణ మరియు అదనపు సమాచారాన్ని దాచడాన్ని ఆఫ్ చేయండి స్ట్రీమ్ సృష్టికర్త, స్ట్రీమ్ కంటెంట్ లేదా శోధన అభ్యర్థన గురించి అదనపు సమాచారంతో మెటా సమాచార పెట్టెలను దాచడానికి ఆఫ్ చేయండి - ప్లేయర్ ప్రకాశాన్ని నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి శోధిస్తున్నప్పుడు చూపాల్సిన సూచనలను ఎంచుకోండి చివరి ప్లేబ్యాక్ స్థానాన్ని పునరుద్ధరించండి మీకు ఇష్టమైన పీర్‌ట్యూబ్ సందర్భాలను ఎంచుకోండి @@ -214,9 +213,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - వాల్యూమ్ సంజ్ఞ నియంత్రణ - ప్లేయర్ వాల్యూమ్‌ను నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి - ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి శోధన చరిత్ర శోధన ప్రశ్నలను స్థానికంగా నిల్వ చేయండి @@ -417,7 +413,6 @@ పరివీక్షణ తేలియాడే విధంగా మార్చు తదుపరి స్ట్రీమ్‌ను స్వీయ-ఎన్క్యూ - లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ ప్రారంభ వీడియో లోడింగ్‌ని వేగవంతం చేయవచ్చు. మార్పులకు ప్లేయర్ రీస్టార్ట్ అవసరం. LeakCanary అందుబాటులో లేదు ప్లేయర్ శీర్షిక వచన స్థాయి మరియు నేపథ్య శైలులను సవరించండి. అమలులోకి రావడానికి యాప్ రీస్టార్ట్ అవసరం స్వయంచాలకంగా రూపొందించబడింది (ఎక్కించినవారు కనబడుటలేదు) diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 19297e8f387..2b31bb98815 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,10 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - การควบคุมระดับเสียงด้วยท่าทาง - ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น - การควบคุมความสว่างด้วยท่าทาง - ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา แสดงคำแนะนำเมื่อทำการค้นหา ประวัติการค้นหา diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml new file mode 100644 index 00000000000..dcd5df884ea --- /dev/null +++ b/app/src/main/res/values-ti/strings.xml @@ -0,0 +1,19 @@ + + + ሰረዝ + ኣብ ብሮውዘር ክፉት + ውጽኢት ምርኣዩ ን፦%s + መጀመርታ ምእንቲ ኽትጅምር ነቲ ዜጕልሕ መረጼን ጠውቆ። + ኣብ %1$s እተሓትመ + ዋላ ሓደ ወሓይዝ ዚጻወት ሰብ ኣይተረኽበን። VLC + ሐራይ + ምድላው + \"%1$s\" ማለቱ ድዩ፧ + ዚተሪየ ጋባራ + ክፉቴ ምሲ + ፋይል ውሕጅ ኣራግፍ + ድለ + ኣካፍሎም + ኣራግፍ + ኣካፍሎም ምሲ + \ No newline at end of file diff --git a/app/src/main/res/values-tok/strings.xml b/app/src/main/res/values-tok/strings.xml new file mode 100644 index 00000000000..9004a656d1a --- /dev/null +++ b/app/src/main/res/values-tok/strings.xml @@ -0,0 +1,51 @@ + + + ni li kama lon lon tenpo %1$s + sina jo ala e ilo pi lukin e sitelen tawa. sina wile kama jo e ilo VLC anu seme\? + o kama jo. + o weka. + pona. + open lon ilo linluwi + o sitelen la mi lukin + o open kepeken + o pana e ni tawa jan ante + o kepeken e ilo pi sitelen tawa ante + jan ni li pana e sitelen tawa la, mi toki tawa sina + jan ni li pana e sitelen tawa la, o toki ala tawa mi + o pana e sona + jan ni li pana e sitelen tawa la, o toki tawa mi + sitelen monsi + pana lon + poki lipu pi sitelen tawa lon ilo mi + o pana lon nasin nasa + mi kama jo e sitelen tawa + ala + pimeja + open la, o luka e ilo pi lukin suli + sina jo ala e ilo pi lukin e sitelen tawa. (sina wile lukin la, sina ken kama jo e ilo VLC). + o lukin sitelen + ante + sina wile toki e \"%1$s\" anu seme\? + mi lawa la sina wile toki e: %s + o pana e ni tawa + jan ni li pana e sitelen tawa la, o toki tawa mi + lukin pona lili pi sitelen tawa la, ni li weka e kalama + lukin pona pi sitelen tawa mute + ilo lili li ken oko e sitelen pona pi lukin pona 2K/4K + lukin + o kepeken e ilo kalama ante + o oko e sitelen tawa kepeken ilo Kosi (Kodi) + lukin pimeja + ante e ma pi poki lipu kalama lon ilo sina + sitelen tawa lon ilo sina li lon ma ni + poki lipu kalama lon ilo sina + poki lipu kalama lon ilo sina li lon ma ni + o oko e pona lukin pi sitelen tawa pi pona mute mute + sina wile kama jo e ilo Kole (Kore) anu seme\? + sin + pimeja + kalama + nasin lipu kalama mute + nasin lipu pi sitelen tawa mute + walo + \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7943e8adf1f..1271dee7243 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,9 +1,9 @@ - Başlamak için büyütece dokun. + Başlamak için büyütece dokunun. %1$s tarihinde yayınlandı Akış oynatıcısı bulunamadı. VLC kurulsun mu\? - Yükle + Kur İptal Tarayıcıda aç Paylaş @@ -330,10 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Hareketli ses denetimi - Oynatıcının sesini denetlemek için hareketleri kullan - Hareketli parlaklık denetimi - Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler Dosya silindi Uygulama güncelleme bildirimi @@ -421,8 +417,8 @@ Öntanımlı Kiosk Kimse izlemiyor - %s izleyen - %s izleyen + %s izleyici + %s izleyici Kimse dinlemiyor @@ -481,8 +477,8 @@ Abonelikleri seç Abonelik seçilmedi - %d seçildi - %d seçildi + %d öğe seçildi + "%d öğe seçildi" Boş grup adı Bu grubu silmek istiyor musunuz\? @@ -634,7 +630,6 @@ Kapat Tablet kipi - İzlenen ögeleri göster Konum çubuğu küçük resim ön izlemesi Gösterme Düşük nitelik (küçük) @@ -679,13 +674,12 @@ Oynatıcıyı çöktür Sabitlenmiş yorum LeakCanary yok - Yükleme ara boyutunu değiştir (şu anda %s). Düşük bir değer videonun ilk yüklenişini hızlandırabilir. Değişiklikler oynatıcının yeniden başlatılmasını gerektirir ExoPlayer öntanımlısı Yeni akış bildirimleri Bildirimler - %s yeni akış - %s yeni akış + %s yeni yayın + %s yeni yayın Yeni akışları denetlemeyi çalıştır Oynatıcı bildirimi @@ -713,9 +707,6 @@ Bilinmeyen biçim Bilinmeyen nitelik Oynatma yükleme aralığı boyutu - Gelecekteki ögeleri göster - Gelecekteki ögeleri gizle - İzlenen ögeleri gizle Sık Sorulan Sorular Web sitesinde görüntüle Uygulamayı kullanırken sorun yaşıyorsanız, sık sorulan sorulara verilen bu yanıtlara göz atmayı unutmayın! @@ -741,4 +732,23 @@ Tamamen izlendi Yaklaşan Kısmen izlendi + Parlaklık + Ses düzeyi + Hiçbiri + Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin + Varsa, görsel engelli kişiler için betimlemeli ses parçasını seç + Bilinmeyen + ExoPlayer ayarları + Kimi ExoPlayer ayarlarını yönet. Bu değişiklikler oynatıcının yeniden başlatılmasını gerektirir + özgün + dublaj + betimlemeli + %1s %2s + Dış oynatıcılar için ses parçası seç + Dil ne olursa olsun özgün ses parçasını seç + Ses: %s + Özgün sesi yeğle + Betimlemeli sesi yeğle + Ses parçası + Bu akışta halihazırda bir ses parçası bulunmalıdır \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6706396aed3..49eb5b70c27 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -197,7 +197,7 @@ Про застосунок і ЧаП Вільне та легке потокове програвання на Android. Які б не були ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг — будь-яка допомога завжди у пригоді. Що більше зроблено, то ліпшим стає NewPipe! - Зневадження + Налагодження Нічого немає… чути лише цвіркунів Немає переглядів @@ -345,10 +345,6 @@ Сiтка Відписатися Обрати вкладку - Жест керування гучністю - Змінювати гучність звуку жестами - Жест керування яскравістю - Змінювати яскравість програвача жестами Оновлення Події Файл видалено @@ -595,7 +591,7 @@ Додано у чергу Додати у чергу Розв\'язати - Обчислення гешу + Обчислення хешу Очистити збережені під час вирішення reCAPTCHA реп\'яшки (cookies) Реп\'яшки (cookies) reCAPTCHA видалено Очистити реп\'яшки (cookies) reCAPTCHA @@ -614,7 +610,7 @@ У компактному сповіщенні є не більше трьох дій! Дії можна змінити, натиснувши на них. Позначте не більше трьох для показу в компактному сповіщенні Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1 - Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео + Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео. Вимкнути тунелювання медіа «Фреймворк доступу до сховища» (SAF) підтримується лише починаючи з Android 10 Вас питатиме, куди зберігати кожне завантаження @@ -646,7 +642,6 @@ Увімкнути Режим планшета Обліковий запис припинено - Показувати переглянуті обʼєкти Режим швидкої підписки не надає багато інформації щодо цього. Коментарі вимкнено Не показувати @@ -697,7 +692,6 @@ Закріплений коментар LeakCanary недоступний Типовий ExoPlayer - Змінити розмір інтервалу завантаження (наразі %s). Менше значення може прискорити початкове завантаження відео. Зміни вимагають перезапуску програвача Ви підписалися на цей канал , Сповіщення про нові трансляції для підписок @@ -731,9 +725,6 @@ Виберіть якість для зовнішніх програвачів Невідома якість Розмір інтервалу завантаження відтворення - Показати наступні елементи - Сховати переглянуті елементи - Сховати майбутні елементи Переглянути на сайті Поширені запитання Якщо у вас виникли проблеми з використанням застосунку, обов\'язково ознайомтеся з відповідями на поширені запитання! @@ -758,4 +749,36 @@ Показати такі трансляції Повністю переглянуто Частково переглянуто + Яскравість + Нічого + Дія жестом ліворуч + Виберіть жест для лівої половини екрана програвача + Виберіть жест для правої половини екрана програвача + Дія жесту праворуч + Гучність + Змінити розмір інтервалу завантаження прогресивного вмісту (наразі %s). Нижче значення може прискорити його початкове завантаження + Надавати перевагу оригінальному аудіо + Вибирати оригінальну звукову доріжку незалежно від мови + Надавати перевагу описовому аудіо + Вибирати звукову доріжку з описом для людей із вадами зору, якщо вона є + Аудіо: %s + Звукова доріжка + Вибір звукової доріжки для зовнішніх програвачів + Невідомо + Налаштування ExoPlayer + Керування деякими налаштуваннями ExoPlayer. Щоб ці зміни набули чинності, потрібно перезапустити програвач + Використовувати запасну функцію декодера ExoPlayer + Завжди використовувати обхідний шлях налаштування поверхні відеовиходу ExoPlayer + %1s %2s + оригінальна + дубльована + описова + У цій трансляції вже має бути звукова доріжка + Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів + Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях +\n +\nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму + Перемістити селектор головної вкладки вниз + Розташування основних вкладок + Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує. \ 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 a49d7b301f9..29956f162ef 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -10,7 +10,7 @@ کیا آپ کا مطلب یہ ہے؟: %1$s براؤزر میں کھولیں ترتیبات - کوئی اسٹریم پلیئر نہیں ملا۔ VLC انسٹال کریں؟ + کوئی اسٹریم پلیئر نہیں ملا۔ کیا آپ VLC انسٹال کرنا چاہتے ہیں؟ کوئی اسٹریم پلیئر نہیں ملا (آپ VLC انسٹال کر سکتے ہیں)۔ پاپ اپ وضع میں کھولیں اسٹریم فائل ڈاؤن لوڈ کریں @@ -39,7 +39,7 @@ طے شدہ ریزولوشن طے شدہ پوپ اپ ریزولوشن اعلیٰ معیارات دکھائیں - صرف چند آلات 2K/4K ویڈیو چلانے میں معاون ہیں + صرف کچھ آلات 2K / 4K ویڈیوز چلانے کے قابل ہوتے ہیں. کوڈی کے ساتھ استعمال کریں لاپتہ کوری ایپ کو انسٹال کریں؟ \"کودی کے ساتھ چلائیں\" آپشن دکھائیں @@ -54,17 +54,17 @@ پاپ اپ جسامت اور مقام کو یاد رکھیں پچھلی جسامت اور پوپ اپ کا مقام یاد رکھیں بالواسطہ رسائی استعمال کریں - بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے۔ 5 ، 15 یا 25 سیکنڈ کی تلاش اس کے ساتھ کام نہیں کرتی ہے۔ + بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے۔ 5 ، 15 یا 25 سیکنڈ کی تلاش اس کے ساتھ کام نہیں کرتی ہے: نظرِ انگشتی لوڈ کریں ڈیٹا کی بچت اور میموری کے استعمال کو روکنے کیلئے نظرِ انگشتی کو بند کریں۔ تبدیلیاں میموری اور آن ڈسک عکس کے کیشے کو صاف کرتی ہیں۔ تصویری کیشے کی صفائی ہوئی کیشے میٹا ڈیٹا کو صاف کریں ویب پیج کے سبھی کیشے ڈیٹا کو ہٹا دیں میٹا ڈیٹا کیشے کی صفائی ہوئی - اگلا سلسلہ خود قطار + اگلی اسٹریم خود قطار متعلقہ سلسلے کو جوڑ کر پلے بیک کی قطار کو اختتام تک (نہ دہراتے ہوئے) جاری رکھیں تلاش کے اشارے - تلاش کرتے وقت اشارے دکھائیں + تلاش کے دوران دکھانے کے لئے تجاویز کا انتخاب کریں سرگزشت تلاش کریں تلاش کے استفسارات کو مقامی طور پر ذخیرہ کریں دیکھے جانے کی سرگزشت @@ -101,7 +101,7 @@ صرف ایک بار فائل نیو پائپ اطلاعات - نیو پائپ کے پس منظر اور پاپ اپ پلیئرز کیلئے اطلاعات + نیو پائپ پلیئرز کیلئے اطلاعات [نامعلوم] پس منظر پر جائیں پاپ اپ پر جائیں @@ -131,7 +131,7 @@ ایک خامی پیش آگئی: %1$s کوئی سلسلسہ ڈاؤن لوڈ کرنے کے لئے دستیاب نہیں معذرت، ایسا نہیں ہونا چاہئے تھا۔ - ای میل کے ذریعے غلطی کی اطلاع دیں + ای میل کے ذریعے اطلاع دیں معذرت، کچھ غلط ہوا۔ رپورٹ کریں معلومات: @@ -194,14 +194,14 @@ نیو پائپ کے بارے میں تیسری پارٹی کی لائسنس © %1$s بذریعہ %2$s %3$s کے تحت - کے بارے میں + کے بارے میں اور اکثر پوچھے گئے سوالات لائسنس اینڈروئیڈ پر لِبرے کی ہلکی اسٹریمنگ۔ تعاون کریں جو بھی آپ کے خیالات ہوں؛ ترجمہ، ڈیزائن میں تبدیلیاں، کوڈ کی درستی، یا حقیقتاً کوڈ میں بڑی تبدیلی—مدد کا ہمیشہ خیرمقدم ہے۔ جتنا زیادہ ہوگا اتنی ہی بہتری ہو گی! گٹ ہب پر دیکھیں عطیہ - نیو پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت صرف کرتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں مدد دینے کے لئے بہتر بدلہ دیں۔ + نیو پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت صرف کرتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں بہتر تعاون کریں بدلہ دیں ویب سائٹ مزید معلومات اور خبروں کے لئے نیو پائپ ویب سائٹ ملاحظہ کریں۔ @@ -232,7 +232,7 @@ آڈیو کی ترتیبات انقطار کو پکڑو پس منظر میں چلانا شروع کریں - نئے پاپ اپ میں چلانا شروع کریں + پوپ اپ میں چلانا شروع کریں دراز کھولیں دراز بند کریں پسندیدہ \'کھلی\' کارروائی @@ -247,7 +247,7 @@ نام تبدیل کریں نام پلے لسٹ میں شامل - بطور پلے لسٹ انگشتی طے کریں + بطور پلے لسٹ تھمبنیل طے کریں پلے لسٹ کو نشان زد کریں نشان زد حدف کریں کیا یہ پلے لسٹ حذف کریں؟ @@ -300,9 +300,9 @@ تلاش کی سرگزشت مٹائیں تلاش کے الفاظ کی سرگزشت حذف کی گئیں تلاش کی مکمل سرگزشت حذف کریں؟ - تلاش کی سرگزشت حذف ہوئی۔ + تلاش کی سرگزشت حذف ہوئی 1 شے حذف کر دی گئی۔ - نیو پائپ کاپلیفٹ فری سافٹ ویئر ہے: آپ استعمال کرسکتے ہیں، مطالعہ شیئر کرسکتے ہیں اور اپنی مرضی سے اسے بہتر کرسکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور / یا ترمیم کرسکتے ہیں، خواہ لائسنس کا ورژن 3، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن۔ + نیو پائپ کاپی لیفٹ فری سافٹ ویئر ہے: آپ استعمال، مطالعہ، شیئر اور اپنی مرضی سے اسے بہتر بنا سکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور/یا ترمیم کرسکتے ہیں، خواہ لائسنس کا ورژن 3، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن میں۔ کیا آپ ترتیبات بھی درآمد کرنا چاہتے ہیں؟ نیو پائپ کی رازداری کی پالیسی نیو پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا، ایپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا./nنیو پائپ کی رازداری پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کے کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔ @@ -327,15 +327,11 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - صوتی اشارہ کنٹرول - پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں - چمک کا متحرک کنٹرول - پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان تازہ کاریاں فائل حذف ہوگئی - ایپ کی تازہ کاری کی اطلاع - جدید نیو پائپ ورژن کیلئے اطلاعات + ایپ اَپ ڈیٹ کی اطلاع + جدید نیو پائپ ورژن کے لیے اطلاعات بیرونی ذخیرہ دستیاب نہیں بیرونی ایسڈی کارڈ پر ڈاؤن لوڈ ممکن نہیں۔ ڈاؤن لوڈ فولڈر کے مقام کو دوبارہ ترتیب دیں؟ محفوظ شدہ ٹیبز نہیں پڑھ سکے لہذا پہلے سے طے شدہ کا استعمال کر رہے ہیں @@ -389,8 +385,8 @@ فہرست میں مقامات فہرستوں میں پلے بیک مقامات کے اشارے دکھائیں کوائف صاف کریں - دیکھے جانے کی سرگزشت حذف ہوگئی۔ - پلے بیک پوزیشنس حذف ہوئیں۔ + دیکھے جانے کی سرگزشت حذف ہو گئی + پلے بیک پوزیشنس حذف ہوئیں فائل منتقل یا حذف ہوگئی اس نام والی فائل پہلے سے موجود ہے اس نام کی ڈاؤن لوڈ کی گئی فائل پہلے سے موجود ہے @@ -424,7 +420,7 @@ %s سننے والا %s سننے والے - جب ایپ دوبارہ شروع ہو گی تو زبان تبدیل ہو جائے گی۔ + جب ایپ دوبارہ شروع ہو گی تو زبان تبدیل ہو جائے گی طے شدہ کیوسک آگے بھگانے /- پیچھے کرنے کی مدت پیر ٹیوب واقعات @@ -450,7 +446,7 @@ ‪تفصیل متعلقہ سلسلے تبصرے - براہ کرم چیک کریں کہ آیا آپ کے کریش پر بحث کرنے والا مسئلہ پہلے سے موجود ہے۔ جعلی ٹکٹ تیار کرتے وقت، آپ ہم سے وقت نکالتے ہیں جو ہم اصل مسئلے کو ٹھیک کرنے میں گزار سکتے ہیں۔ + براہ کرم چیک کریں کہ آیا آپ کے کریش پر بحث کرنے والا مسئلہ پہلے سے موجود ہے۔ ڈپلیکیٹ ٹکٹ بناتے وقت آپ ہم سے وقت لیتے ہیں، جو ہم اصل مسئلے کو ٹھیک کرنے میں صرف کرتے ہیں۔ گِٹ ہب میں اطلاع دیں فارمیٹڈ رپورٹ کو کاپی کریں دوسرے ایپس پر نظر آنے کی اجازت دیں @@ -470,7 +466,7 @@ یوٹیوب کا \"پابندی والا وضع\" چالو کریں وہ مواد دکھائیں جو بچوں کے لیے ممکنہ طور پر نا مناسب ہیں کیوں کہ اس میں عمر کی حد ہے (جیسے 18+) URL کو نہیں پہچان سکے۔ کسی اور ایپ کے ساتھ کھولیں؟ - ازخود قطار + خود کار قطار اسٹریم کے موجد، اسٹریم مواد یا تلاش کی درخواست کے بارے میں اضافی معلومات والے میٹا انفارمیشن بکسوں کو چھپانے کیلئے بند کریں۔ میٹا معلومات دکھائیں ویڈیو کی تفصیل اور اضافی معلومات کو چھپانے کیلئے بند کریں @@ -485,26 +481,78 @@ شفل دوہرائیں آپ کومپیکٹ نوٹیفکیشن میں زیادہ سے زیادہ تین ایکشن منتخب کرسکتے ہیں! - ذیل میں ہر اطلاع کی کارروائی پر ٹیپ کرکے اس میں ترمیم کریں۔ دائیں طرف کے چیک باکسز کا استعمال کرکے کمپیکٹ نوٹیفکیشن میں دکھائے جانے والے ان میں سے تین تک کا انتخاب کریں۔ + ذیل میں ہر اطلاع کی کارروائی پر ٹیپ کرکے اس میں ترمیم کریں۔ دائیں طرف کے چیک باکسز کا استعمال کرکے کمپیکٹ نوٹیفکیشن میں دکھائے جانے والے ان میں سے تین تک کا انتخاب کریں: پانچواں ایکشن بٹن چوتھا ایکشن بٹن تیسرا ایکشن بٹن دوسرا ایکشن بٹن پہلا ایکشن بٹن نوٹیفیکیشن میں دکھائے جانے والے ویڈیو تھمب نیل کو 16: 9 سے 1:1 پہلو تناسب میں اسکیل کریں - تھمب نیل کو 1:1 کی تناسب میں رکھیں + تھمب نیل کو 1:1 کی تناسب میں تراشیں %s کے لئے نتائج دکھا رہا ہے کے ساتھ کھولیں ویڈیو پلیئر کو کریش کریں دیکھے ہوئے کو نشان لگائیں مقامی تلاش کی سفارشات اطلاعات - مین پلیئر کو مکمل سکرین سے شروع کریں - غلطی کی دستاویزات کی اطلاع - غلطی کی حبر کی اطلاعات + فل اسکرین میں مین پلیئر شروع کریں + خرابی کی اطلاع کا نوٹیفکیشن + خرابیوں کی اطلاع کی نوٹیفیکیشنس جب ٹھیک ہو جائے تو \"Done\" دبائیں حل کریں زیادہ تر پوچھے گئے سوالات اگر آپ کو یہ ایپ استعمال کرنے میں دشواری آ رہی ہو تو ان عام سوالات کے جوابات کو ضرور دیکھیں! ویب سائٹ پر دیکھیں + NewPipe کو ایک خرابی کا سامنا کرنا پڑا، رپورٹ کرنے کے لیے ٹیپ کریں + موجودہ پلیئنگ اسٹریم نوٹیفکیشن کو ترتیب دیں + آئٹمز کو ہٹانے کے لیے سوائپ کریں + نائٹ تھیم + مین ٹیب سلیکٹر کو نیچے منتقل کریں + مین ٹیب کی پوزیشن + ایک خرابی پیش آگئی، نوٹیفکیشن دیکھیں + تبصرے غیر فعال ہیں + + %s نئی اسٹریم + %s نئی اسٹریمز + + ابھی تک کوئی ڈاؤن لوڈ فولڈر سیٹ نہیں ہے، ابھی ڈیفالٹ ڈاؤن لوڈ فولڈر کا انتخاب کریں + Done + قطار چلائیں + آڈیو: %s + آڈیو ٹریک + چینل کی تفصیلات دکھائیں + قطار میں + قطار میں شامل ہوا + اگلے کو قطار میں کریں + اگلا قطار میں کیا گیا + جو پلے لسٹس سُرمئی ہو چکے ہیں ان میں یہ آئٹم پہلے سے موجود ہے۔ + غیر خاموش + خاموش + کارروائی ہو رہی ہے… کچھ وقت لگ سکتا ہے + یہ ویڈیو اٹھارہ سال سے بڑے لوگوں کے لیے ہے۔ +\nیو ٹیوب کی نئی پالیسیوں کی وجہ سے نیوپائپ ان ویڈیوز تک رسائی حاصل نہیں کر سکتا لہٰذا اس ویڈیو کو چلانے سے قاصر ہے۔ + اصل آڈیو کو ترجیح دیں + زبان سے قطع نظر اصل آڈیو ٹریک منتخب کریں + وضاحتی آڈیو کو ترجیح دیں + پلیئر اسکرین کے بائیں نصف حصے کے لئے اشارے کا انتخاب کریں + پلیئر اسکرین کے دائیں نصف حصے کے لئے اشارے کا انتخاب کریں + دائیں اشارے کا عمل + چمک + والیوم + کچھ نہیں + ریموٹ تلاش کی تجاویز + پلیئر کی نوٹیفکیشن + نئی اسٹریم + ایک پلے لسٹ منتخب کریں + ابھی تک کوئی پلے لسٹ بک مارکس نہیں ہے + فاسٹ موڈ + 3-ڈاٹ مینو سے سبسکرپشن درآمد یا برآمد کریں + کلپ بورڈ میں کاپی کرنے میں ناکام + اسٹریم کی تفصیلات لوڈ کر رہے ہیں… + منی پلیئر میں ویڈیوز شروع نہ کریں، بلکہ اگر آٹو روٹیشن لاک ہے تو براہ راست فل اسکرین موڈ کا رخ کریں۔ آپ اب بھی فل اسکرین سے باہر نکل کر منی پلیئر تک رسائی حاصل کرسکتے ہیں۔ + سبسکرپشن کے لئے نئی اسٹریمز کے بارے میں اطلاعات + ری کیپچا چیلینج + ترتیب کے لیے عنوان۔ ترتیب کی تفصیل یہاں محفوظ ہے: https://hosted.weblate.org/translate/newpipe/strings/en/\?checksum=b23a75618764df0f + اگر دستیاب ہو تو بصارت سے محروم افراد کے لئے تفصیل کے ساتھ آڈیو ٹریک منتخب کریں + بائیں اشارے کی کارروائی \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fc00769ba3d..d0b52df5d5d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,16 +1,16 @@ - Nhấn vào nút tìm kiếm để bắt đầu. + Nhấn vào kính lúp để bắt đầu. Đăng vào %1$s Không tìm thấy trình phát. Cài đặt VLC\? - Cài đặt + Cài vô Hủy Mở trong trình duyệt - Mở bằng chế độ popup + Mở trong chế độ bật lên Chia sẻ Tải về Tìm kiếm - Cài đặt + Các cài đặt Ý bạn là \"%1$s\"\? Chia sẻ với Sử dụng trình phát video bên ngoài @@ -28,7 +28,7 @@ Hiện độ phân giải cao hơn Chỉ một số thiết bị hỗ trợ phát video 2K/4K Phát bằng Kodi - Cài đặt ứng dụng Kode\? + Cài đặt ứng dụng Kore\? Hiện tùy chọn \"Phát bằng Kodi\" Hiện tùy chọn phát video qua trung tâm media Kodi Âm thanh @@ -67,9 +67,9 @@ Nội dung không khả dụng Không thể thiết lập menu tải về Ứng dụng / Giao diện người dùng bị lỗi - Hmm, app đã xảy ra lỗi, lướt xuống để xem lỗi. + Có vẻ NewPipe đã xảy ra lỗi, lướt xuống kiểm tra xem. Báo lỗi qua email - Có gì đó không đúng lắm. Kiểm tra xem. + Có gì đó không đúng lắm. Thật khó chịu. Báo cáo Thông tin: Chuyện gì đã xảy ra: @@ -80,7 +80,7 @@ Hình thu nhỏ của avatar người tải lên Lượt thích Lượt không thích - Video + Băng hình Âm thanh Thử lại nghìn @@ -106,9 +106,9 @@ Giới thiệu về NewPipe Giấy phép của bên thứ ba © %1$s bởi %2$s dưới %3$s - Thông tin & Các câu hỏi + Thông tin & FAQ Giấy phép - Trình phát video YT nhẹ, mã nguồn mở và không quảng cáo cho Android. + Trình phát video Yiu tu be nhẹ, mã nguồn mở và không quảng cáo cho Android. Xem trên GitHub Giấy phép của NewPipe Sự đóng góp của bạn luôn được hoan nghênh – kể cả khi bạn dịch, thay đổi giao diện, dọn code, thêm tính năng hay thay đổi những thứ khác, sự giúp đỡ của bạn vẫn đáng được trân trọng. Bạn càng làm nhiều, ứng dụng này sẽ càng tốt hơn bao giờ hết ! @@ -125,9 +125,9 @@ Không thể thay đổi tình trạng đăng ký Không thể cập nhật tình trạng đăng ký Không tìm thấy trình phát luồng nào (bạn có thể cài đặt VLC để phát). - Tải về tệp luồng + Tải tệp luồng về Hiện thông tin - Đăng ký + Kênh đăng ký Danh sách phát được đánh dấu Video mới Thêm vào @@ -174,7 +174,7 @@ Xóa lịch sử xem Xóa lịch sử những video đã xem và vị trí phát Xóa toàn bộ lịch sử xem\? - Lịch sử xem đã bị xóa + Đã xoá lịch sử xem Xóa lịch sử tìm kiếm Xóa lịch sử tìm kiếm mà bạn đã ghi Xóa toàn bộ lịch sử tìm kiếm\? @@ -243,7 +243,7 @@ Cảnh báo: Không thể nhập tất cả các tệp. Thao tác này sẽ ghi đè cài đặt hiện tại của bạn. Bạn cũng muốn nhập cài đặt? - Thịnh hành + Đang thịnh hành Mới và đang hot Loại bỏ Chi tiết @@ -329,10 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Điều khiển âm lượng bằng cử chỉ - Sử dụng cử chỉ để điều chỉnh âm lượng - Điều khiển độ sáng bằng cử chỉ - Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật Sự kiện Đã xóa tập tin @@ -393,7 +389,7 @@ Vị trí phát trong danh sách Hiện vị trí phát lại trong danh sách Xoá dữ liệu - Đã xoá vị trí phát lại + Đã xoá vị trí phát Tệp đã di chuyển hoặc đã xoá Tên file này đã tồn tại Không thể ghi đè lên tệp @@ -439,7 +435,7 @@ Xóa video đã xem Mặc định hệ thống Ngôn ngữ ứng dụng - \'Storage Access Framework\' cho phép tải về thẻ SD + \'Khung truy cập bộ nhớ\' cho phép tải xuống thẻ SD bên ngoài Sử dụng trình chọn thư mục của hệ thống (SAF) Xóa file đã tải về Xóa lịch sử tải về @@ -465,7 +461,7 @@ Nghệ sĩ Album Bài hát - Video + Các video Video này bị giới hạn độ tuổi. \n \nBật \"%1$s\" trong cài đặt nếu bạn muốn xem video này. @@ -509,7 +505,7 @@ Đã chọn %d Chưa chọn kênh nào - Chọn kênh + Chọn kênh đăng ký Đang xử lý thông báo… Số kênh không tải được: %d Đang tải thông báo… @@ -616,7 +612,6 @@ Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn. %s cung cấp lý do này: Tài khoản đã bị chấm dứt - Hiện các mục đã xem Chế độ nguồn dữ liệu nhanh không cung cấp thêm thông tin về cái này. Tài khoản của người này đã bị chấm dứt. \nNewPipe sẽ không thể tải nguồn dữ liệu này trong tương lai. @@ -663,10 +658,9 @@ Mục thông báo mới Làm trình phát dừng Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework. +\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống - Thay đổi kích thước khoảng thời gian tải (tầm khoảng %s). Để ở giá trị thấp hơn có thể sẽ tăng tốc độ tải video hơn ban đầu. Khởi động lại trình phát để áp dụng thay đổi LeakCanary không khả dụng ExoPlayer mặc định Bình luận được ghim @@ -701,13 +695,10 @@ Định dạng không xác định (:P) Độ phân giải không xác định Kích thước khoảng thời gian tải - Hiện video đề xuất - Ẩn video đề xuất Thể loại Câu hỏi thường gặp Xem trên website Nếu bạn gặp vấn đề khi sử dụng ứng dụng , hãy chắc chắn rằng bạn đã tìm kiếm các câu hỏi thường thấy ! - Ẩn các video đã xem Nhập hoặc xuất các kênh bạn đăng ký bằng cách nhấn nút 3 chấm ở góc trên màn hình Không thể sao chép vào khay nhớ tạm Đã thêm khoảng thời gian %d trùng lặp (s) @@ -715,6 +706,45 @@ Bạn đang dùng phiên bản mới nhất Tùy chọn này chỉ được bật khi chủ đề %s được dùng Nhấn để tải %s - Chế độ tia sét + Chế độ tăng tốc Danh sách này bị trùng lặp. + Hữu ích trong trường hợp phím bấm âm lượng trên tai nghe hoặc thiết bị của bạn bị hỏng + Không nhận phím điều khiển âm lượng vật lý + Loại bỏ mục trùng lặp + Loại bỏ mục trùng lặp\? + Bạn có muốn loại bỏ tất cả các nguồn trùng nhau trong danh sách phát này\? + Hiện/Ẩn nguồn phát + Hiện các nguồn phát sau + Đã xem + Đã xem 1 phần + Bỏ đặt hình thumbnail + Thay đổi kích thước khoảng thời gian tải (tầm khoảng %s). Để ở giá trị thấp hơn có thể sẽ tăng tốc độ tải video hơn ban đầu. Khởi động lại trình phát để áp dụng thay đổi + Bản âm thanh đã có sẳn trong stream này + Sử dụng tính năng giải mã ExoPlayer dự phòng + Giải pháp thay thế này phát hành và khởi tạo lại codec video khi xảy ra thay đổi bề mặt, thay vì đặt trực tiếp bề mặt vào codec. Đã được ExoPlayer sử dụng trên một số thiết bị gặp sự cố, cài đặt này chỉ ảnh hưởng cho thiết bị chạy Android 6 trở lên +\n +\nBật tùy chọn này có thể ngăn lỗi phát lại khi chuyển đổi trình phát video hiện tại hoặc chuyển sang chế độ toàn màn hình + Bật tùy chọn này nếu bạn gặp sự cố khởi tạo bộ giải mã, vấn đề này sẽ quay trở lại bộ giải mã có mức độ ưu tiên thấp hơn nếu quá trình khởi tạo bộ giải mã chính thất bại. Điều này có thể dẫn đến hiệu suất phát lại kém hơn so với khi sử dụng bộ giải mã chính + Luôn dùng biện pháp thay thế cho bề mặt đầu ra video cho ExoPlayer + Nguyên gốc + Phần mô tả + Lồng tiếng + Chọn âm thanh gốc bạn thích + Chọn bản âm thanh gốc kể cả nhiều ngôn ngữ + Âm thanh mô tả bạn thích + Chọn bản âm thanh có phần mô tả cho người kiếm thị nếu có + Chọn cử chỉ vuốt cho phía bên trái nửa màn hình của trình chơi + Hành động cho cử chỉ trái + Chọn cử chỉ vuốt cho phía bên phải nửa màn hình của trình chơi + Hành động cho cử chỉ phải + Độ sáng + Âm lượng + Không + Âm thanh: %s + Bản âm thanh + Sắp đến + Không rõ + Chọn bản âm thanh cho trình phát ngoài + Cài đặt Exoplayer + Quản lý một số cài đặt trong Exoplayer. Hãy khởi động lại trình phát để áp dụng thay đổi \ 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 4ee6bc285c5..7886502068a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -33,7 +33,7 @@ %s 个视频 已停用 - 后台播放 + 后台 显示搜索建议 订阅 已订阅 @@ -350,10 +350,6 @@ 曲目 用户 选择标签 - 手势控制音量 - 使用手势控制播放器的音量 - 手势控制亮度 - 使用手势控制播放器的亮度 视频默认语言 应用更新通知 NewPipe 新版本的通知 @@ -592,7 +588,7 @@ 选择你最喜欢的夜间主题 — %s 夜间主题 显示频道详情 - 如果遇到黑屏或视频播放卡顿的情况,请停用媒体隧道 + 如果在视频播放中遇到黑屏或卡顿的情况,请停用媒体隧道。 停用媒体隧道 停用简介中的文本选择功能 内部 @@ -623,7 +619,6 @@ 你会被问到在哪里保存每个下载 尚未设置下载文件夹,现在选择默认下载文件夹 平板模式 - 显示已观看的项目 关闭 开启 评论功能已停用 @@ -668,7 +663,6 @@ NewPipe 遇到了一个错误,点击此处报告此错误 置顶评论 LeakCanary 不可用 - 更改加载间隔的大小(当前为 %s),较低的值可以加快视频的首次加载速度。更改需要重启播放器 ExoPlayer 默认 配置当前正在播放的串流的通知 新串流通知 @@ -701,9 +695,6 @@ 不显示下载器尚不支持的串流 未知画质 播放加载间隔大小 - 显示未来项目 - 隐藏看过的项目 - 隐藏未来项目 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! 在网站上查看 @@ -728,4 +719,36 @@ 只看了一部分 即将到来 删除重复 + 亮度 + 音量 + 右半边手势动作 + 左半边手势动作 + 选择播放器屏幕左半边手势 + 选择播放器屏幕右半边手势 + + 更改渐进式内容的加载间隔大小(当前为 %s)。较低的值可加快初始加载 + 偏好描述性音频 + 如果可用,为视障人群选择带描述的音轨 + 音频:%s + 此串流中应该已经有音轨 + 选择外部播放器音轨 + 未知 + 管理一些 ExoPlayer 设置。这些更改需要重启播放器才能生效 + 使用 ExoPlayer 的编码器回退功能 + 始终使用 ExoPlayer 的视频输出界面设置变通方法 + 此变通方法在发生界面更改时会释放并重新初始化视频编解码器,而不是直接将编解码器设置到新界面。在某些有这个问题的设备上,Exoplayer 已经在使用这个方法。此设置仅适用于 Android 6 及更高的系统版本 +\n +\n启用此选项可防止切换当前视频播放器或切换到全屏播放时出现播放错误 + 原始 + 配音 + 描述 + 偏好原始音频 + 不管何种语言都选择原始音轨 + 音轨 + ExoPlayer 设置 + 如遇解码器初始化方面的问题可开启此选项。启用后,如主解码器初始化失败,ExoPlayer 将使用较低优先级的解码器进行播放。请注意,这可能导致播放性能下降 + 将主标签页选择器移到底部 + 主标签页位置 + %1s %2s + 媒体隧道功能在你的设备上默认停用,因为已知你的设备型号不支持它。 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 8e83c40150f..b465d887d8e 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -12,21 +12,21 @@ 用出面嘅音樂播放器 影片下載路徑 下載咗嘅影片檔案會收埋喺度 - 揀選影片檔案嘅下載資料夾 - 預設解像度 + 揀選影片檔案嘅下載文件夾 + 預設嘅解像度 用 Kodi 嚟播放 - 要唔要裝缺少嘅 Kore app? + 裝唔裝缺少咗嘅 Kore app? 顯示「用 Kodi 嚟播放」嘅選項 顯示以 Kodi 媒體中心播放影片嘅選項 聲音 預設聲音檔案格式 - 色系 + 主題 黑暗 明亮 下載 顯示「接續落」同「咁上下」嘅影片 唔支援呢個網址 - 內容預設語言 + 預設內容語言 影音 版面 幕後播緊 @@ -34,17 +34,17 @@ 播放影片,片長: 上載者嘅頭像縮圖 讚好 - 劣評 + 負皮 搵唔到串流播放器。要唔要裝 VLC? 喺瀏覽器開啟 - 分享影片比 - 音樂下載資料夾 + 分享影片畀 + 音樂下載文件夾 下載咗嘅音樂檔案會收埋喺度 - 揀選音樂檔案嘅下載資料夾 + 揀選音樂檔案嘅下載文件夾 撳放大鏡開始。 內容 顯示年齡設限嘅內容 - 直播 + 實況 問題 載入唔晒全部縮圖 影片 URL 簽章解唔到碼 @@ -55,8 +55,8 @@ 出咗啲問題,唔好意思。 報告 資訊: - 出事: - 您嘅意見 (請以英文輸入): + 出咗咩事: + 你嘅見解 (請以英文輸入): 詳情: 影片 聲音 @@ -64,10 +64,10 @@ 下載 下載 問題報告 - 內容未能提供 + 未能提供內容 開始 暫停 - 刪除 + 剷走 校驗碼 檔案名稱 @@ -79,13 +79,13 @@ 複製咗去剪貼簿 請之後喺設定度揀定一個下載資料夾 以浮面模式開啟 - 預設浮面解像度 + 預設浮面播放器嘅解像度 顯示更高解像度 - 得某啲機至播到 2K/4K 影片 - 預設影片檔案格式 + 得某啲機先播到 2K/4K 影片 + 預設嘅影片檔案格式 純黑 浮面播緊 - 魂&我 + 全部嘢 App/界面閃退 經過:\\n請求:\\n內容語言:\\n內容國家:\\nApp 語言:\\n服務:\\nGMT 時間:\\n封裝:\\n版本:\\nOS 版本: @@ -97,12 +97,12 @@ 某啲影片可能會冇聲 幕後播 浮面播 - 記住浮面點擺法 - 記住對上一次浮面嘅大細同擺位 + 記住浮面嘅擺法 + 記住上次浮面嘅大細同擺位 搜尋建議 揀選搜尋嘅時候顯示邊啲建議 不適用 - 清除 + 抹走 最佳解像度 十億 關於 NewPipe @@ -110,14 +110,14 @@ © %1$s %2$s 版權所有,根據 %3$s 嘅條款授權 跋記 版權協議 - 喺 Android 上盡享自由輕便串流。 + 喺 Android 上盡享自由輕快嘅串流。 去 GitHub 睇下 NewPipe 嘅版權協議 - 無論您對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都無任歡迎您幫手。聚沙成塔,眾志成城! + 無論你對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都勁歡迎你嚟幫手。聚沙成塔,眾志成城! 閱讀版權協議 貢獻 - 抹走睇過嘅紀錄 - 搵唔到串流播放器 (您可以裝 VLC 嚟播)。 + 抹走播放紀錄 + 搵唔到串流播放器 (你可以裝 VLC 嚟播)。 下載串流檔案 訂閱 訂閱咗 @@ -128,7 +128,7 @@ 顯示資訊 訂閱 儲起嘅播放清單 - 用粗略快轉 + 用粗略嘅快轉 加入去 選擇標籤 第一粒動作掣 @@ -137,27 +137,26 @@ 第四粒動作掣 隨機播放 緩衝緊 - 空白 - 用手勢去控制播放器光暗 + 空寥寥 本機搜尋建議 遠端搜尋建議 - 喺本機儲存搵過嘅查詢 - 睇過有紀錄 + 喺本機儲低搵過嘅紀錄 + 有睇過有紀錄 恢復播放 - 返返最後播放到去嗰個位 + 返返去最後播放嘅嗰個位 清單度睇到播到去邊 縮圖以 1:1 長寬比框起 顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比 通知色彩化 等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意:唔係部部機都用得) - 夜色 + 夜間 跳前/跳後嘅快轉長短 - 關閉去隱藏影片描述同附加資訊 + 閂埋佢去隱藏影片描述同附加資訊 剔低睇過 開啟方式係 搜尋到嘅嘢係:%s 第五粒動作掣 - 撳一下下面每粒掣去更改各個通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度顯示 + 撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度 精簡通知最多淨係擺到三個動作! 循環播放 載入縮圖 @@ -169,19 +168,16 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 音量手勢控制 - 用手勢去控制播放器音量 - 光暗手勢控制 - 關閉去避免載入縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 - 粗糙快轉允許播放器比較籠統噉快轉去其他位置。快轉 5、15 或 25 秒就太精緻,粗做唔到 + 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 + 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 - 內容預設國家 + 預設嘅國家內容 演出者 專輯 淨係支援 HTTPS 嘅 URL 除錯 復原 - 刪除咗個檔案 + 剷走咗個檔案 幾時都係 一次咁多 檔案 @@ -194,19 +190,19 @@ 使用者 事件 歌曲 - 抹走當您完成 reCAPTCHA 嘅時候 NewPipe 儲存嘅 Cookie + 抹走當你完成 reCAPTCHA 嘅時候, NewPipe 儲存嘅 Cookie 轉返主版面 收埋喺背景 撈起去浮面 匯入資料庫 主播放器用全螢幕開啟 - 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。您仍可結束全螢幕返返去袖珍播放器 + 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。你仍可結束全螢幕返返去袖珍播放器 認唔出呢個 URL。要唔要用另一個 app 開? YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容 - 有年齡限制 (例如 18+) 故可能兒童不宜嘅內容都照顯示 + 有年齡限制 (例如 18+/兒童不宜)嘅內容都照顯示 呢部影片有年齡限制。 \n -\n如果您想睇,請喺設定度開啟「%1$s」。 +\n如果你想睇,請喺設定度開啟「%1$s」。 呢部影片有年齡限制。 \n鑑於 YouTube 就年齡限制影片嘅新政策,NewPipe 存取唔到條片嘅任何影像串流,所以播放唔到。 [未知] @@ -214,7 +210,7 @@ 抹走咗 reCAPTCHA Cookie 恢復播放 打斷 (例如有電話) 完之後繼續播放 - 記低睇過嘅影片 + 記低晒睇過嘅影片 自動播放 更新 開啟 YouTube 嘅「嚴格篩選模式」 @@ -229,7 +225,7 @@ 外置播放器唔支援呢類型嘅連結 搵唔到影像串流 搵唔到聲音串流 - 檔案搬走咗或刪除咗 + 檔案搬走咗或剷走咗 個檔案唔喺度,又或者欠缺讀寫權限 檔名冇得留空 復原緊播放器錯誤 @@ -238,24 +234,24 @@ 讀取唔到儲存咗嘅分頁,所以用返預設分頁 還原返預設噉樣 發生錯誤:%1$s - 您係咪要還原返做預設嗰個樣? + 你係咪要還原返做預設嗰個樣? 複製執咗格式嘅報告 乜都搵唔到 名稱 接受 - 關閉 + 閂埋佢 下載失敗 - 完成咗 %s 個下載 + 完成咗 %s 嘅下載 產生獨一無二嘅名稱 匯入檔案 匯出緊… 先前嘅匯出 - 惟請注意:呢項操作可能相當消耗網絡數據。 + 請注意:呢項操作可能相當消耗網絡數據。 \n -\n您係咪要繼續? +\n你係咪要繼續? 幾時都唔使 自動 低畫質 (細格啲) @@ -294,9 +290,9 @@ 匯入唔到訂閱 節奏 播放速度控掣 - 系統預設噉樣 + 系統預設 檢查有冇更新 - 個 App 用咩文 + 個 App 用咩語言 睇咗嗰啲剷咗佢 係咪要剷走睇咗嘅影片? 網站 @@ -325,11 +321,11 @@ 刪除咗 1 個項目。 執執佢 搞掂 - NewPipe 專案非常著重您嘅私隱。因此,呢個 app 未得您同意係唔會收集任何資料。 -\nNewPipe 嘅私隱政策,詳述當您傳送彈 app 報告時,有咩資料會傳送同保存。 + NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 +\nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 最近播放 最常播放 - 頭版內容 + 頭條新嘢 頭版要擺放邊啲分頁 打橫掃走啲項目去剷走佢 空白頁 @@ -338,13 +334,13 @@ 頭 50 位 最新同大熱 警告:未能匯入晒全部檔案。 - 噉樣做會冚咗您而家嘅設定個囉噃。 - 您想唔想匯入埋啲設定? + 噉樣做會冚咗你而家嘅設定個囉噃。 + 你想唔想匯入埋啲設定? 載入唔到留言 最近新加 剷咗佢 詳細資料 - 唔使靜音 + 唔使噤聲 背景播放器 浮面播放器 幾時都問 @@ -359,8 +355,8 @@ 匯入緊… 無聲嘅時候快轉 重設 - 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請您注意 NewPipe 嘅私隱政策。請仔細閱讀。 -\n您必須接受先可以傳送錯誤報告畀我哋。 + 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。 +\n你必須接受,先可以傳送錯誤報告畀我哋。 拒絕 用流動數據嘅時候限制解像度 更新 @@ -387,53 +383,53 @@ 改過個名 字母同數目字 - 大部份特殊字元 + 大部份嘅特殊字元 下載 課金 匯出唔到訂閱 修改播放器字幕大細同背景款式。要重新開過個 app 先會生效 執好就撳一下「搞掂」 - 靜音 + 噤聲 處理緊… 可能要等等 令播放器閃退 自動輪候 - 係咪要全部剷走晒睇過嘅紀錄? + 係咪要全部剷走晒睇片嘅紀錄? 顯示元資訊 - 關閉去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 + 閂埋佢去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 顯示「撳住就輪候」提示 - 揀選啱您心水嘅 PeerTube 站 + 揀選啱你心水嘅 PeerTube 站 紀錄與快取 NewPipe 播放器嘅通知 抹除元資料快取 抹除咗元資料快取 - 自動輪候接續落串流 - 排隊播要完嘅時候 (又未設定循環播放) 就追加一條咁上下嘅串流 + 自動輪候接落串流 + 排隊清單嘅片要播完嘅時候 (並未設定循環播放) ,就追加一條相似性質嘅串流片 PeerTube 站 - 去 %s 發掘啱您心水嘅站 + 去 %s 發掘啱你心水嘅站 播放清單 問題報告通知 報告問題嘅通知 - 剷走播放過嘅串流同播放到邊個位嘅紀錄 + 剷走播放過嘅串流同之前啲片睇到邊嘅紀錄 剷走咗睇過嘅紀錄 NewPipe 遇到問題,撳一下去報告 發生問題,詳見通知 - 拖拉執排位 + 拖條片去執好清單排位 轉換服務,而家揀選咗嘅係: 清單檢視模式 - 做噉一半冇咗,因為個檔案刪除咗 - 連線等太耐 + 做做下冇咗,因為個檔案刪除咗 + 等太耐連線 開始晒所有下載 - 下載排隊逐個嚟,唔要一次過 + 下載要排隊逐個嚟 近期 - 帳戶已被終止 + 已終止帳戶 語言 支援 覆寫唔到個檔案 暫停晒所有下載 平板電腦模式 - 個檔案建立唔到 - 您係咪想喺搜尋紀錄度刪除呢個項目? + 建立唔到呢個檔案 + 你係咪想喺搜尋紀錄度剷走呢個項目? 睇下咩問題 有個整緊嘅下載撞名 有個等緊嘅下載撞名 @@ -441,47 +437,47 @@ 喺鎖定畫面背景同埋通知都擺放縮圖 開始咗下載 年齡限制 - 您部機冇 app 開到佢 + 你部機冇 app 開到佢 呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。 - 揀選啱您心水嘅夜色主題 — %s + 揀選啱你心水嘅夜色主題 — %s 呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。 - 您可以喺下面揀選啱您心水嘅夜色主題 - 停用揀選描述入面嘅文字 + 你可以喺下面揀選啱你心水嘅夜色主題 + 停止揀選描述入面嘅文字 一格格 一行行 加入去播放清單 新嘅播放清單 顯示頻道詳情 - 唔見影 + 唔見咗影 揀選一個播放清單 伺服器唔接受多執行緒下載,請改用 @string/msg_threads = 1 再試下啦 連接唔到伺服器 播放清單頁面 撳住就輪候 - 目的地資料夾建立唔到 + 建立唔到呢個目的地資料夾 建立唔到安全連線 喺幕後開始播放 部機冇晒位 頂櫳重試幾多次 - 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載或者冇得暫停 - 輪住下載 + 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載冇得暫停 + 輪住嚟下載 內部 私人 停止 按用量收費嘅網絡就閘住 抹走下載紀錄 - 您想抹走您嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? + 你想抹走你嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? 剷走下載咗嘅檔案 - 刪除咗 %1$s 個下載 + 剷走咗 %1$s 個下載 問我要下載去邊 - 排隊尾 + 排隊排隊尾 搵唔到伺服器 - 伺服器冇傳回資料 + 伺服器冇傳返資料嚟 後期處理失敗 - NewPipe 未搞掂個檔案就關閉咗 - 呢個下載恢復唔到 + NewPipe 未搞掂個檔案就閂埋咗 + 呢個下載檔案恢復唔到 同個下載咗嘅檔案撞名 同個現有嘅檔案撞名 @@ -494,22 +490,21 @@ 由 %s 建立 出自 %s 章節 - 呢部內容 NewPipe 仲未支援。 + NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 - 顯示睇過嘅項目 %s 話理由如下: 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式 - 呢部內容限區,喺您所在國家未有提供。 - 呢首 (至少喺您所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 - 呢部內容屬於私人,因此 NewPipe 未能串流或下載。 + 呢部內容限區,喺你所在國家未有提供。 + 呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 + 呢部內容係私人嘢,因此 NewPipe 未能串流或下載。 自動 (跟返部機嘅主題色系) 精選 廣播 - 您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結會撳唔到。 + 你而家可以揀選喺描述入面嘅文字喇。不過要單聲先,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結可能會撳唔到。 啟用揀選描述入面嘅文字 版權協議 分類 @@ -521,39 +516,39 @@ 置頂留言 創作者畀咗心心 開啟網站 - + 主機 喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示 紀錄 - 紀錄 - 攝下個等陣播 - 記憶體洩露監測喺傾卸堆疊嘅時候,或者會導致個 app 冇反應 - 閂選單 - 攝咗做下個等陣播 + 歷史紀錄 + 攝咗做下個播 + 記憶體洩露監測喺傾卸堆疊嘢嘅時候,或者會導致個 app 冇反應 + 閂埋選單 + 攝咗做下個播 點做法 影片雜湊進度嘅通知 大笪地 抹走搜尋紀錄 - 刪除搜尋關鍵字嘅紀錄 + 剷走晒搜尋關鍵字嘅紀錄 係咪要全部剷走晒搜尋嘅紀錄? 頻道頁面 揀選一個頻道 排隊播 聲音設定 - 開選單 + 開啟選單 揀做播放清單縮圖 整咗個播放清單 加咗入播放清單 LeakCanary 用唔到 顯示記憶體洩露 - 強制報告喺片段或活動週期棄置後送遞唔到嘅 Rx 例外狀況 + 強制報告喺片段或週期棄置後送遞唔到嘅 Rx 狀況 顯示「令播放器閃退」 用播放器嘅時候顯示一個閃退選項 令個 app 閃退 顯示一則錯誤橫條 - 建立一則錯誤通知 + 建立一則出現錯誤通知 好,包括埋睇過但未睇晒嘅影片 - 礙於 ExoPlayer 所限,快轉長短經已改為 %d 秒 + 礙於 ExoPlayer 所限,快轉長度經已改為 %d 秒 影片雜湊通知 排咗去隊尾 揀定「開啟」動作 @@ -565,47 +560,47 @@ 未有頻道訂閱 轉咗播放清單縮圖。 報告週期完結後嘅錯誤 - 每次下載都會問您要儲存去邊 - 每次下載都會問您要儲存去邊。 -\n如果您想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) + 每次下載都會問你要儲存去邊 + 每次下載都會問你要儲存去邊。 +\n如果你想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) 用系統資料夾揀選器 (SAF) 加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 -\n您肯定?剷走咗冇得掹個囉喎! - 「儲存空間存取框架」呢壇嘢,俾您下載落外置 SD 卡嗰度 - Android 10 打上局住要用「儲存空間存取框架」 +\n你肯定?剷走咗冇得掹個囉喎! + 「儲存空間存取框架」係畀你下載落外置 SD 卡嗰度 + Android 10 打上,局住要用「儲存空間存取框架」 ExoPlayer 預設值 外置儲存空間用唔到 - 排隊尾輪候播 - 刪除咗搜尋紀錄 - 冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾位置? + 排隊尾等待播放 + 剷走晒搜尋紀錄 + 冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾嘅位置? 喺浮面開始播放 收起播放清單 - 唔再收起 - 係咪要刪除呢個播放清單? + 唔再收埋 + 係咪要剷走呢個播放清單? 播放器通知 調整目前播放緊咩串流嘅通知 訂閱有新加串流嘅通知 載入緊串流詳細資料… - 通知訂閱有新加串流 + 通知訂閱有新嘅串流 檢查頻率 用咩網絡連線 咩網絡都無所謂 收取通知 - 您而家訂閱咗呢個頻道 + 你而家訂閱咗呢個頻道 全部切換 執行檢查有冇新加串流 通知 - 新加串流 + 新加嘅串流 %s 個新加串流 - 新加串流通知 + 新嘅串流通知 係咪要喺磁碟機上面消除晒全部下載咗嘅檔案? - 通知已停用 + 已停用通知 單曲 全部剷走晒播放到邊個位 - 請睇過係咪已經有人喺度講緊您呢次彈 app 嘅狀況。若然重複發表新嘅議題,就會嘥咗我哋可以真正用嚟修復個問題嘅時間㗎喇。 - NewPipe 係由一班熱心人用空閒時間義務開發,為您帶嚟最佳嘅使用體驗。係時候少少無拘,支持返開發者令 NewPipe 更臻完美,同時一顆心意挺佢哋可以嘆返杯咖啡。 + 請睇過係咪已經有人喺度講緊你呢次彈 app 嘅狀況。若然重複發表已有嘅議題,就會嘥咗我哋可以真正用嚟修復其他錯漏嘅時間㗎喇。 + NewPipe 係由一班熱心人用空閒時間義務咁開發㗎,為咗帶畀你最佳嘅使用體驗。係時候慷慨解囊,撐返開發者嘅付出,使 NewPipe 更臻完美,同時畀杯咖啡佢哋嘆下。 站內 聚首 轉 app 嘅時候借過 @@ -618,7 +613,7 @@ 載入緊摘要… 處理緊摘要… 摘要 - 摘要上次更新:%s + 摘要上次更新到:%s 未有載入:%d 摘要隔幾耐要更新 訂閱對上一次更新後,隔幾耐視之為過時 — %s @@ -640,77 +635,74 @@ 下載工具暫未支援嘅串流,就無謂擺出嚟喇 著作者嘅帳戶已經被終止。 \nNewPipe 日後唔會載入到呢個摘要。 -\n您要唔要取消訂閱呢個頻道? - 某啲服務有提供,通常會快趣好多,但項目數量可能有限兼欠奉詳情 (例如片長、項目類型、直播狀態) +\n你要唔要取消訂閱呢個頻道? + 某啲服務有提供,通常會快趣好多,但項目數量可能有限同埋資訊欠奉 (例如片長、項目類型、直播狀態) 剷走播放到邊個位 - 係咪要全部剷走晒播放到邊個位? + 係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄? 百分比 半音 - 更改載入斬件大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要開過個播放器至生效 - 問過先至將排隊播清零 - 目前播放器入面嘅排隊播將會清零 + 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波 + 問咗先至將排隊列表清走 + 目前播放器嘅排隊列表將會清走 加一個站 請輸入個站嘅 URL 驗證唔到個站 個站已經喺度喇 - 冚過您目前嘅紀錄、訂閱、播放清單,同埋 (有得揀係咪冚埋) 設定 + 冚過你目前嘅紀錄、訂閱、播放清單,同埋 (有得揀係咪冚埋) 設定 匯出紀錄、訂閱、播放清單,同埋設定 新嘅摘要項目 揀選一個站 - 轉換播放器嘅時候,排隊播可能會清零 - NewPipe 係「著佐權」(copyleft) 自由軟件:您可以隨意使用、考究、分享同改進佢。具體而言,您可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 - 載入斬件大細 + 轉換播放器嘅時候,排隊列表可能會清走 + NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按你選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 + 載入播放間隔大細 互動頁面 - 預設嘅互動站 - 輸入 URL 或者您嘅 ID 去匯入 SoundCloud 個人檔案: + 預設嘅互動站(Kiosk) + 輸入 URL 或者你嘅 ID 去匯入 SoundCloud 個人檔案: \n \n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版) \n二、去呢個網址:%1$s -\n三、叫您就登入 -\n四、複製佢彈返您去個人檔案嗰版個 URL。 - 您個 ID、soundcloud.com/您個id +\n三、叫你登入就去馬 +\n四、複製佢彈返畀你去個人檔案嗰版個 URL。 + 你個 ID、soundcloud.com/你個id 揀選互動站 - 顯示返項目原底話時隔幾耐 + 顯示返項目原本話時隔幾耐 停用多媒體隧道 - 頻道成軍 - 成軍名留空 - 黃袍 - 您係咪要刪除呢個成軍? - 淨係顯示未成軍嘅訂閱 + 頻道成谷 + 成谷名留空 + + 你係咪要刪除呢個谷? + 淨係顯示未成谷嘅訂閱 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 - 服務原底嘅字會騷返喺串流項目上面 + 服務原本嘅字會騷返喺串流項目上面 影像要推三色碼 - 未夠鐘上畫嘅項目照顯示 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n \n一、去呢個網址:%1$s -\n二、叫您就登入 +\n二、叫你就登入 \n三、撳一下「包含所有資料」,再撳一下「全部不選」,之後淨係剔返「訂閱」,然後撳「確定」 \n四、撳一下「下一步」然後揀「建立匯出」 \n五、個掣騷出嚟嘅時候就撳一下「下載」 \n六、返返嚟呢度,喺下低撳「匯入檔案」,揀返下載咗嗰個 .zip 檔案 \n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」),喺下低撳「匯入檔案」,揀返抽出嚟個 csv 檔案 - 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (您可以喺設定度更改,又或者撳一下下低個掣)。 + 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (你可以喺設定度更改,又或者撳一下下低個掣)。 \n \nNewPipe 提供兩種載入摘要嘅方針: \n• 攞晒成個訂閱頻道,慢得嚟志在夠完整。 \n• 用特設嘅服務終端,快得嚟啲料爭少少。 \n -\n兩者嘅分別在於,快趣嗰個通常都係爭噉啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 +\n兩者嘅分別在於,快趣嗰個通常都係爭咁啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 \n -\nYouTube 就係其中一個服務,有用 RSS 摘要提供呢個快趣嘅門路。 +\nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n -\n所以就睇您點揀:想快定要準。 - 收埋睇過嘅項目 - 未夠鐘上畫嘅項目就收埋 +\n所以就睇你點揀:想快定要準。 去網站睇下 排序 常見問題 - 若然您用呢個 app 有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! + 若然你係用緊呢個 app嗰陣有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! 快速模式 右上角嘅選單有得匯入或匯出訂閱 - 您已經用緊最新版本嘅 NewPipe + 你已經用緊最新版本嘅 NewPipe 撳一下去下載 %s 唔再揀定封面縮圖 色系揀做%s 嘅時候至有得揀 @@ -719,13 +711,40 @@ 灰咗嘅播放清單,即係已經有呢個項目。 重複加入咗 %d 次 忽略硬件多媒體掣嘅事件 - 譬如話您個耳機上面啲實體掣軭咗就會有用 + 譬如話你用耳機嗰陣,撳上面啲實體掣就會有用 重複嗰啲剷咗佢 重複咗嗰啲係咪要剷走? - 下列嘅串流騷出嚟 + 下列嘅串流見得光 顯示/隱藏串流 睇晒 未睇晒 未夠鐘上畫 - 您係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 你係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 揀選左手邊播放器螢幕嘅手勢 + 左手邊手勢動作 + 揀選右手邊播放器螢幕嘅手勢 + 右手邊手勢動作 + 亮度 + 聲音 + + 首選嘅原始聲音 + 首選嘅敘述性聲音 + 如果可以用嘅話,會為視障人士揀敘述性音軌 + 無論語言係咩,都揀選原始音軌 + 聲音: %s + 音軌 + 未知 + 呢個串流已經有音軌喇 + Exoplayer 設定 + 管理一啲 ExoPlayer 設定。呢啲變更需要重新啟動播放程式先會生效 + 用 ExoPlayer 嘅解碼器汰退功能 + 如果遇到解碼器初始化問題,請啟用呢個選項,如果主解碼器初始化失敗,就會用優先順序較低的解碼器。咁樣可能會導致播放性能比使用主解碼器嗰陣差 + 幾時都用 Exoplayer嘅浮面影片輸出設定解決方法 + 原始嘅 + 配音嘅 + 敘述性 + 為外面嘅播放器揀選音軌 + 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 +\n +\n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7c986e9c177..1218a62d551 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,10 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 音量手勢控制 - 使用手勢控制播放器音量 - 亮度手勢控制 - 使用手勢控制播放器亮度 更新 已刪除檔案 應用程式更新通知 @@ -592,7 +588,7 @@ 自動(裝置佈景主題) 夜間佈景主題 顯示頻道詳細資訊 - 如果您遇到黑畫面或影片播放停頓的現象,請停用媒體隧道 + 如果您遇到黑畫面或影片播放停頓的現象,請停用媒體隧道。 停用媒體隧道 內部 私人 @@ -625,7 +621,6 @@ 關閉 開啟 平板電腦模式 - 顯示已檢視的項目 留言已停用 不要顯示 低品質(較小) @@ -669,7 +664,6 @@ 釘選的留言 LeakCanary 無法使用 ExoPlayer 預設值 - 變更載入間隔大小(目前為 %s)。較低的值可能會提昇初始影片載入速度。變更需要重新啟動播放器 播放器通知 通知 正在載入串流詳細資訊…… @@ -701,9 +695,6 @@ 沒有可用於外部播放程式的視訊串流 選取外部播放程式的畫質 播放載入間隔大小 - 顯示未來項目 - 隱藏未來項目 - 隱藏已觀看的項目 常見問題 在網站上檢視 排序 @@ -728,6 +719,38 @@ 即將到來 移除重複的 您想要移除所有在此播放清單中重複的串流? + 左側手勢動作 + 右側手勢動作 + 亮度 + 音量 + 為播放器畫面左側選擇手勢 + 為播放器畫面右側選擇手勢 + + 偏好原始音訊 + 音訊:%s + 音訊軌道 + 此串流應已存在音訊軌道 + 為外部播放程式選取音訊軌道 + 未知 + ExoPlayer 設定 + 使用 ExoPlayer 的解碼器汰退功能 + 一律使用 ExoPlayer 的視訊輸出表面設定解決方法 + 原始 + 配音 + 描述性 + 變更漸進式內容的載入間隔大小(目前為 %s)。較低的值可能會加速初始載入速度 + 偏好描述性的音訊 + 若可用,為視障人士選取帶有描述的音訊軌道 + 無論語言都選取原始音訊軌道 + 管理一些 ExoPlayer 設定。這些變更需要重新啟動播放程式才會生效 + 若您有解碼器初始化的問題,請啟用此選項,若主要的解碼器初始化失敗,其將會汰退至較低優先度的解碼器。這可能會導致播放效能比使用主要解碼器時差 + 此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器,而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定,此設定僅對 Android 6 或更新版本有效。 +\n +\n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤 + 將主分頁選擇器移動至底部 + 主分頁位置 + %1s %2s + 因為您的裝置型號已知不支援媒體隧道,因此已預設停用。 SponsorBlock (測試功能、第三方服務) SponsorBlock 分類 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e35b3c2e531..e47b72c9aa6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,9 +3,7 @@ 16dp 8dp - 32dp 12dp - 8dp 4dp 2dp @@ -134,9 +132,6 @@ 12sp - 12dp - 6dp - 4dp 16sp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index ef264bcf773..949fb8c0c50 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -24,7 +24,6 @@ https://newpipe.net/FAQ/ %1$s/%2$s YouTube - SoundCloud @string/app_name LeakCanary %1$s-%2$s diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 52be905c9b0..eca8e13f673 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -16,8 +16,6 @@ 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 @@ -192,6 +190,37 @@ @string/audio_webm_key + left_gesture_control + @string/brightness_control_key + brightness_control + volume_control + none_control + + @string/brightness + @string/volume + @string/none + + + @string/brightness_control_key + @string/volume_control_key + @string/none_control_key + + + right_gesture_control + @string/volume_control_key + + @string/volume + @string/brightness + @string/none + + + @string/volume_control_key + @string/brightness_control_key + @string/none_control_key + + + prefer_original_audio + prefer_descriptive_audio last_resize_mode @@ -200,7 +229,6 @@ show_memory_leaks_key allow_disposed_exceptions_key show_original_time_ago_key - disable_media_tunneling_key show_image_indicators_key show_crash_the_player_key check_new_streams @@ -242,6 +270,9 @@ caption_settings_key caption_user_set_key + + main_tabs_position + show_search_suggestions show_local_search_suggestions @@ -475,6 +506,7 @@ lt hu nl + nqo no nn uz @@ -525,6 +557,7 @@ zh-TW zh-HK ja + ryu ko @@ -555,6 +588,7 @@ Lietuvių Magyar Nederlands + ߒߞߏ Norsk Nynorsk O‘zbek @@ -605,6 +639,7 @@ 中文 (繁體) 中文 (香港) 日本語 + うちなーぐち 한국어 @@ -1165,6 +1200,7 @@ ne nl nl-be + nqo oc or pa @@ -1174,6 +1210,7 @@ pt-pt ro ru + ryu sat sc sk @@ -1234,6 +1271,7 @@ Íslenska Italiano 日本語 + うちなーぐち ꦧꦱꦗꦮ Taqbaylit Kurmancî @@ -1248,6 +1286,7 @@ Nनेपाली Nederlands (NL) Nederlands (BE) + ߒߞߏ Occitan ଓଡ଼ିଆ ਪੰਜਾਬੀ @@ -1372,4 +1411,12 @@ streams_notifications_channels player_notification_screen + + + exoplayer_settings_key + disable_media_tunneling_key + disabled_media_tunneling_automatically_key + media_tunneling_device_blacklist_version + use_exoplayer_decoder_fallback_key + always_use_exoplayer_set_output_surface_workaround_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe3b1ac00c3..f7ed2122a94 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,7 +79,7 @@ Inexact seek allows the player to seek to positions faster with reduced precision. Seeking for 5, 15 or 25 seconds doesn\'t work with this Fast-forward/-rewind seek duration Playback load interval size - Change the load interval size (currently %s). A lower value may speed up initial video loading. Changes require a player restart + Change the load interval size on progressive contents (currently %s). A lower value may speed up their initial loading Ask for confirmation before clearing a queue Switching from one player to another may replace your queue The active player queue will be replaced @@ -94,6 +94,10 @@ Turn off to hide video description and additional information Show meta info Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request + Prefer original audio + Select the original audio track regardless of the language + Prefer descriptive audio + Select an audio track with descriptions for visually impaired people if available Image cache wiped Wipe cached metadata Remove all cached webpage data @@ -101,10 +105,13 @@ Auto-enqueue next stream Continue ending (non-repeating) playback queue by appending a related stream Auto-enqueuing - Volume gesture control - Use gestures to control player volume - Brightness gesture control - Use gestures to control player brightness + Choose gesture for left half of player screen + Left gesture action + Choose gesture for right half of player screen + Right gesture action + Brightness + Volume + None Search suggestions Choose the suggestions to show when searching Local search suggestions @@ -240,6 +247,8 @@ Delete entire search history? Search history deleted Fast mode + Move main tab selector to the bottom + Main tabs position Error External storage unavailable @@ -437,6 +446,8 @@ Remove Details Audio Settings + Audio: %s + Audio track Hold to enqueue Show channel details Enqueue @@ -495,7 +506,8 @@ Show original time ago on items Original texts from services will be visible in stream items Disable media tunneling - Disable media tunneling if you experience a black screen or stuttering on video playback + Disable media tunneling if you experience a black screen or stuttering on video playback. + Media tunneling was disabled by default on your device because your device model is known to not support it. Show image indicators Show Picasso colored ribbons on top of images indicating their source: red for network, blue for disk and green for memory Show \"Crash the player\" @@ -784,18 +796,29 @@ , Toggle all Streams which are not yet supported by the downloader are not shown + An audio track should be already present in this stream The selected stream is not supported by external players No audio streams are available for external players No video streams are available for external players Select quality for external players + Select audio track for external players Unknown format Unknown quality - Show future items - Hide future items + Unknown Fully watched Partially watched Upcoming Sort + ExoPlayer settings + Manage some ExoPlayer settings. These changes require a player restart to take effect + Use ExoPlayer\'s decoder fallback feature + Enable this option if you have decoder initialization issues, which falls back to lower-priority decoders if primary decoders initialization fail. This may result in poor playback performance than when using primary decoders + Always use ExoPlayer\'s video output surface setting workaround + This workaround releases and re-instantiates video codecs when a surface change occurs, instead of setting the surface to the codec directly. Already used by ExoPlayer on some devices with this issue, this setting has only an effect on Android 6 and higher\n\nEnabling this option may prevent playback errors when switching the current video player or switching to fullscreen + %1s %2s + original + dubbed + descriptive SponsorBlock View Website diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml index d726e26b735..beb46cdf5e7 100644 --- a/app/src/main/res/xml/appearance_settings.xml +++ b/app/src/main/res/xml/appearance_settings.xml @@ -66,4 +66,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml index 7405e47acf7..84bb281f31e 100644 --- a/app/src/main/res/xml/debug_settings.xml +++ b/app/src/main/res/xml/debug_settings.xml @@ -34,14 +34,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + + + + + + + + + + diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml deleted file mode 100644 index a7cd061b86d..00000000000 --- a/app/src/main/res/xml/provider_paths.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 117ee870370..727ce4df40a 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -61,13 +61,27 @@ app:iconSpaceReserved="false" app:useSimpleSummaryProvider="true" /> - + + + + @@ -174,19 +188,23 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 8a75b1b4e07..c7c36eadc62 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -3,10 +3,13 @@ import org.junit.Test; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import org.schabi.newpipe.extractor.stream.VideoStream; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -29,6 +32,15 @@ public class ListHelperTest { generateAudioStream("mp3-192", MediaFormat.MP3, 192), generateAudioStream("webma-320", MediaFormat.WEBMA, 320)); + private static final List AUDIO_TRACKS_TEST_LIST = List.of( + generateAudioTrack("en.or", "en.or", Locale.ENGLISH, AudioTrackType.ORIGINAL), + generateAudioTrack("en.du", "en.du", Locale.ENGLISH, AudioTrackType.DUBBED), + generateAudioTrack("en.ds", "en.ds", Locale.ENGLISH, AudioTrackType.DESCRIPTIVE), + generateAudioTrack("unknown", null, null, null), + generateAudioTrack("de.du", "de.du", Locale.GERMAN, AudioTrackType.DUBBED), + generateAudioTrack("de.ds", "de.ds", Locale.GERMAN, AudioTrackType.DESCRIPTIVE) + ); + private static final List VIDEO_STREAMS_TEST_LIST = List.of( generateVideoStream("mpeg_4-720", MediaFormat.MPEG_4, "720p", false), generateVideoStream("v3gpp-240", MediaFormat.v3GPP, "240p", false), @@ -199,24 +211,29 @@ public void getDefaultResolutionTest() { @Test public void getHighestQualityAudioFormatTest() { - AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST)); + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, false); + AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST)); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, false); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST)); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, false); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getHighestQualityAudioFormatPreferredAbsent() { + final Comparator cmp = + ListHelper.getAudioFormatComparator(MediaFormat.MP3, false); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -227,8 +244,7 @@ public void getHighestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192", MediaFormat.WEBMA, 192)); // List doesn't contains this format // It should fallback to the highest bitrate audio no matter what format it is - AudioStream stream = testList.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.MP3, testList)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -246,44 +262,51 @@ public void getHighestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192-4", MediaFormat.WEBMA, 192))); // List doesn't contains this format, it should fallback to the highest bitrate audio and // the highest quality format. - stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // Adding a new format and bitrate. Adding another stream will have no impact since // it's not a preferred format. testList.add(generateAudioStream("webma-192-5", MediaFormat.WEBMA, 192)); - stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); } @Test public void getHighestQualityAudioNull() { - assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, null)); - assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, new ArrayList<>())); + final Comparator cmp = ListHelper.getAudioFormatComparator(null, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp)); } @Test public void getLowestQualityAudioFormatTest() { - AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST)); + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, true); + AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST)); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, true); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST)); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getLowestQualityAudioFormatPreferredAbsent() { + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -294,14 +317,13 @@ public void getLowestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192-1", MediaFormat.WEBMA, 192))); // List doesn't contains this format // It should fallback to the most compact audio no matter what format it is. - AudioStream stream = testList.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.MP3, testList)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // WEBMA is more compact than M4A testList.add(generateAudioStream("webma-192-2", MediaFormat.WEBMA, 128)); - stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList)); + stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -318,20 +340,58 @@ public void getLowestQualityAudioFormatPreferredAbsent() { generateAudioStream("m4a-192-3", MediaFormat.M4A, 192))); // List doesn't contain this format // It should fallback to the most compact audio no matter what format it is. - stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList)); + stream = testList.get( + ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); // Should be same as above - stream = testList.get(ListHelper.getMostCompactAudioIndex(null, testList)); + cmp = ListHelper.getAudioFormatComparator(null, true); + stream = testList.get( + ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); } @Test public void getLowestQualityAudioNull() { - assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, null)); - assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, new ArrayList<>())); + final Comparator cmp = ListHelper.getAudioFormatComparator(null, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp)); + } + + @Test + public void getAudioTrack() { + // English language + Comparator cmp = + ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, false); + AudioStream stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); + + // German language + cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("de.du", stream.getId()); + + // German language, but prefer original + cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, true, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); + + // Prefer descriptive audio + cmp = ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, true); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.ds", stream.getId()); + + // Japanese language, fall back to original + cmp = ListHelper.getAudioTrackComparator(Locale.JAPANESE, true, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); } @Test @@ -390,6 +450,22 @@ private static AudioStream generateAudioStream(@NonNull final String id, .build(); } + private static AudioStream generateAudioTrack( + @NonNull final String id, + @Nullable final String trackId, + @Nullable final Locale locale, + @Nullable final AudioTrackType trackType) { + return new AudioStream.Builder() + .setId(id) + .setContent("", true) + .setMediaFormat(MediaFormat.M4A) + .setAverageBitrate(128) + .setAudioTrackId(trackId) + .setAudioLocale(locale) + .setAudioTrackType(trackType) + .build(); + } + @NonNull private static VideoStream generateVideoStream(@NonNull final String id, @Nullable final MediaFormat mediaFormat, diff --git a/build.gradle b/build.gradle index 1384d0a9cef..24a28bd6eb7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.21' + ext.kotlin_version = '1.8.21' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.0' + classpath 'com.android.tools.build:gradle:8.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/doc/README.asm.md b/doc/README.asm.md new file mode 100644 index 00000000000..8b2373514c7 --- /dev/null +++ b/doc/README.asm.md @@ -0,0 +1,113 @@ +

  +

নিউপাইপ

+

এণ্ড্ৰইডৰ বাবে এটা লিব্ৰে লাইটৱেট ষ্ট্ৰীমিং ফ্ৰন্ট-এণ্ড।

+ +

Get it on F-Droid

+ +

+ + +

+
+

+স্ক্ৰীণশ্বট • + সমৰ্থিত সেৱাসমূহবিৱৰণ • + বৈশিষ্ট্যসমূহইনষ্টল আৰু আপডেটসমূহ • + অৱদানঅনুদান • + অনুজ্ঞাপত্ৰ

+ WebsiteBlog • + FAQ • + Press


+ +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* + +সতৰ্কবাণী: এই এপটো নিৰ্মিয়মান অৱস্থাত আছে, গতিকে আপুনি ব্যৱহাৰ কৰোঁতে কোনো অসুবিধাৰ সন্মুখীন হ'ব পাৰে। যদি আপুনি অসুবিধাৰ সন্মুখীন হয়, ইছ্যু টেমপ্লেট পূৰণ কৰি আমাৰ GITHUB ৰিপ'জিটৰিত এটা ইছ্যু খোলক। + +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 এ বৰ্তমান এই সেৱাসমূহ সমৰ্থন কৰে: +* YouTube ([website](https://www.youtube.com/)) and YouTube Music ([website](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([website](https://joinpeertube.org/)) and all its instances (তাৰ অৰ্থ কি জানিবলৈ ৱেবছাইটটো খোলক!) ([wiki](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([website](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([website](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([website](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +আপুনি দেখাৰ দৰে, NewPipe এ একাধিক ভিডিঅ' আৰু অডিঅ' সেৱা সমৰ্থন কৰে। যদিও ই ইউটিউবৰ পৰা আৰম্ভ হৈছিল, বছৰ বছৰ ধৰি আন মানুহে অধিক সেৱা যোগ কৰিছে, যাৰ ফলত নিউপাইপক অধিক আৰু অধিক বহুমুখী কৰি তুলিছে। আংশিকভাৱে পৰিস্থিতিৰ বাবে, আৰু আংশিকভাৱে ইয়াৰ জনপ্ৰিয়তাৰ বাবে, এই সেৱাসমূহৰ ভিতৰত ইউটিউব সৰ্বোত্তম সমৰ্থিত। যদি আপুনি এই অন্য কোনো সেৱা ব্যৱহাৰ কৰে বা পৰিচিত, অনুগ্ৰহ কৰি আমাক ইয়াৰ বাবে সমৰ্থন উন্নত কৰাত সহায় কৰক! আমি SoundCloud আৰু PeerTube ৰ বাবে সমৰ্থনকাৰী বিচাৰিছোঁ। + যদি আপুনি নতুন সেৱা যোগ কৰাৰ মনস্থ কৰিছে তেন্তে প্ৰথমে আমাৰ সৈতে যোগাযোগ কৰক! অধিক তথ্যৰ বাবে [docs](https://teamnewpipe.github.io/documentation/) আৰু [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor) চাওক। + +## বিৱৰণ +NewPipe এ আপুনি ব্যৱহাৰ কৰা সেৱাৰ অফিচিয়েল API (যেনে PeerTube) ৰ পৰা প্ৰয়োজনীয় তথ্য আনি কাম কৰে। যদিও আমাৰ উদ্দেশ্যৰ বাবে অফিচিয়েল API নিষিদ্ধ (যেনে YouTube), বা মালিকানাধীন, এপটোৱে ৱেবছাইটটো বিশ্লেষণ কৰে বা ইয়াৰ পৰিৱৰ্তে এটা আভ্যন্তৰীণ API ব্যৱহাৰ কৰে। ইয়াৰ অৰ্থ হ'ল NewPipe ব্যৱহাৰ কৰিবলৈ কোনো সেৱাত একাউণ্টৰ প্ৰয়োজন নাই। লগতে, যিহেতু ই বিনামূলীয়া আৰু মুক্ত উৎস(Open Source) চফ্টৱেৰ, এপ বা এক্সট্ৰেক্টৰে কোনো মালিকানাধীন লাইব্ৰেৰী বা ফ্ৰেমৱৰ্ক ব্যৱহাৰ নকৰে, যেনে গুগল প্লে সেৱা। অৰ্থাৎ আপুনি এনে ডিভাইচ বা কাষ্টম ৰমত NewPipe ব্যৱহাৰ কৰিব পাৰে যিবোৰত গুগল এপ ইনষ্টল কৰা হোৱা নাই। + +### বৈশিষ্ট্যসমূহ +* 4K পৰ্যন্ত ৰিজ’লিউচনত ভিডিঅ’ চাওক +* এপ নোখোলাকৈ অডিঅ' শুনা +* পপআপ মোড (ফ্ল'টিং প্লেয়াৰ, ওৰফে PIP ) +* কেপচন অন/অফৰ ব্যৱস্থা +* ভিডিঅ' আৰু অডিঅ' সন্ধান কৰক (ইউটিউবত, আপুনি বিষয়বস্তুৰ ভাষাও নিৰ্দিষ্ট কৰি দিব পাৰে) +* ভিডিঅ'সমূহ পৰৱৰ্তী সময়ত চাবলৈ প্ৰথমে বাছনি কৰা (আৰু সিহতক স্থানীয় প্লেলিষ্ট হিচাপে সংৰক্ষণ কৰা) +* ভিডিঅ'সমূহৰ বিষয়ে সাধাৰণ তথ্য দেখুৱা/লুকুৱা (যেনে ভিডিঅ'ৰ বিৱৰণ আৰু টেগসমূহ) +* পৰৱৰ্তী/আগৰ ভিডিঅ'ৰ সম্পৰ্কীয় ভিডিঅ' দেখুৱা/লুকুৱা +* মন্তব্য সমূহ দেখুৱা/লুকুৱা +* ভিডিঅ', অডিঅ', চেনেল, প্লেলিষ্ট আৰু এলবামৰ সন্ধান কৰক +* এটা চেনেলৰ ভিতৰত ভিডিঅ’ আৰু অডিঅ’ ব্ৰাউজ কৰা +* চেনেল চাবস্ক্ৰাইব কৰা (কোনো একাউণ্টত লগ ইন নকৰাকৈ কৰিব পাৰিব) +* আপুনি চাবস্ক্ৰাইব কৰা চেনেলৰ পৰা নতুন ভিডিঅ'ৰ বিষয়ে জাননী লাভ কৰা +* চেনেলৰ গোট সৃষ্টি আৰু সম্পাদনা কৰা (সহজ ব্ৰাউজিং আৰু ব্যৱস্থাপনাৰ বাবে) +* আপোনাৰ চেনেলৰ গোটসমূহৰ ভিডিঅ' ফিডসমূহ ব্ৰাউজ কৰা +* আপোনাৰ ভিডিঅ' উপভোগৰ ইতিহাস চোৱা আৰু সন্ধান কৰা +* প্লেলিষ্টসমূহৰ সন্ধান (এইবোৰ দূৰৱৰ্তী প্লেলিষ্ট, যাৰ অৰ্থ হৈছে আপুনি ব্ৰাউজ কৰা সেৱাৰ পৰা ইয়াক অনা হয়) +* স্থানীয় প্লেলিষ্ট সৃষ্টি আৰু সম্পাদনা কৰা (এইবোৰ এপৰ ভিতৰত সৃষ্টি আৰু সংৰক্ষণ কৰা হয়, আৰু কোনো সেৱাৰ সৈতে কোনো সম্পৰ্ক নাই) +* ভিডিঅ'/অডিঅ'/চাবটাইটেল ডাউনলোড কৰা (কেপচন) +* যিকোনো ভিডিঅ' Kodi ত খুলিব পৰা +* বয়স নিষিদ্ধ সামগ্ৰী চোৱা/ব্লক কৰা + +## ইনষ্টল আৰু আপডেটসমূহ + +আপুনি নিম্নলিখিত পদ্ধতিসমূহৰ এটা ব্যৱহাৰ কৰি NewPipe ইনষ্টল কৰিব পাৰিব: + +১)আমাৰ কাষ্টম ৰেপো F-Droid ত যোগ কৰক আৰু তাৰ পৰাই ইনষ্টল কৰক। নিৰ্দেশনাসমূহ ইয়াত আছে:https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + +২)[GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) ৰ পৰা এপ ডাউনলোড আৰু ইনষ্টল কৰক। + +৩)F-Droid ৰ জৰিয়তে আপডেট কৰক। এইটো আপডেট পোৱাৰ আটাইতকৈ লেহেমীয়া পদ্ধতি, কাৰণ F-Droid এ সকলো কাম নিজে কৰি ব্যৱহাৰকাৰীলৈ আপডেট সমূহ পঠিয়ায়। + +৪)নিজেই এটা Debug APK নিৰ্মাণ কৰক। + +৫)আপোনাৰ ডিভাইচত নতুন বৈশিষ্ট্যসমূহ পোৱাৰ এইটো আটাইতকৈ দ্ৰুত উপায়, কিন্তু ই বহুত বেছি জটিল, গতিকে আমি অন্য পদ্ধতিসমূহৰ এটা ব্যৱহাৰ কৰাৰ পৰামৰ্শ দিওঁ। যদি আপুনি ইয়াৰ নিৰ্দিষ্ট বৈশিষ্ট্য বা সমস্যা সমাধানৰ প্ৰতি আগ্ৰহী, আপুনি ইয়াৰ APK PR ৰ ভিতৰৰ পৰাও ডাউনলোড কৰিব পাৰে। নিৰ্দেশনাৰ বাবে জনসংযোগৰ বিৱৰণ পঢ়ক। PR APK সমূহৰ বিষয়ে ডাঙৰ কথাটো হ'ল যে ইয়াক অফিচিয়েল এপৰ সৈতে একেলগে ইনষ্টল কৰা হয়, যাতে আপুনি আপোনাৰ ডাটা হেৰুৱাব বা একো গোলমাল কৰাৰ চিন্তা কৰিব নালাগে। +আমি বেছিভাগ ব্যৱহাৰকাৰীৰ বাবে পদ্ধতি ১ ৰ পৰামৰ্শ দিওঁ। পদ্ধতি 1 বা 2 ব্যৱহাৰ কৰি সংস্থাপন কৰা APKসমূহ ইটোৱে সিটোৰ সৈতে সুসংগত (অৰ্থাৎ যদি আপুনি পদ্ধতি 1 বা 2 ব্যৱহাৰ কৰি NewPipe ইনষ্টল কৰিছে, আপুনি অন্যটো ব্যৱহাৰ কৰি NewPipe আপডেট কৰিব পাৰে), কিন্তু পদ্ধতি 3 ব্যৱহাৰ কৰি সংস্থাপন কৰাসমূহৰ সৈতে নহয় কিয়নো ১ আৰু ২ ৰ বাবে একেটা স্বাক্ষৰ ব্যৱহাৰ কৰা হৈছে, কিন্তু এটা ভিন্ন স্বাক্ষৰ (F-Droid's) 3 ৰ বাবে ব্যৱহাৰ কৰা হৈছে। পদ্ধতি ৪ ব্যৱহাৰ কৰি এটা ডিবাগ APK নিৰ্মাণ কৰিলে এটা স্বাক্ষৰ সম্পূৰ্ণৰূপে পৃথক হৈ পৰে। চাইনিং চাবি সমূহে নিশ্চিত কৰাত সহায় কৰে যে এজন ব্যৱহাৰকাৰীয়ে এটা এপৰ বিপদজনক আপডেট ইনষ্টল কৰা নাই। পদ্ধতি ৫ ব্যৱহাৰ কৰাৰ সময়ত, প্ৰতিটো APK, GitHub Actions দ্বাৰা যোগান ধৰা এটা ভিন্ন যাদৃচ্ছিক চাবিৰ সৈতে স্বাক্ষৰিত হয়, গতিকে আপুনি ইয়াক আপডেটো কৰিব নোৱাৰে। আপুনি প্ৰতিবাৰেই এটা নতুন APK ব্যৱহাৰ কৰিব বিচৰাৰ সময়ত এপ ডাটা বেকআপ আৰু পুনৰুদ্ধাৰ কৰিব লাগিব। + + ইয়াৰ মাজতে, যদি আপুনি কোনো কাৰণত উৎস সলনি কৰিব বিচাৰে (যেনে NewPipe ৰ মূল কাৰ্য্যকৰীতা বিচ্ছিন্ন হয় আৰু F-Droid ৰ শেহতীয়া আপডেট লাভ কৰা নাই), আমি এই পদ্ধতি অনুসৰণ কৰিবলৈ পৰামৰ্শ দিওঁ: + +১)Settings > Content > Export Database ৰ জৰিয়তে ভিডিঅ' উপভোগৰ ইতিহাস, প্লেলিষ্ট আদি ৰপ্তানি কৰক। + +২)NewPipe আনইনষ্টল কৰক। + +৩)নতুন উৎসৰ পৰা APK ডাউনলোড কৰি ইনষ্টল কৰক + +৪)Settings > Content > Import Database যোগেদি তথ্য আমদানি কৰক + +টোকা: যেতিয়া আপুনি এটা ডাটাবেছ অফিচিয়েল এপলৈ আমদানি কৰে, সদায় নিশ্চিত কৰক যে সেইটো আপুনি অফিচিয়েল এপৰ পৰা ৰপ্তানি কৰাটোৱেই। যদি আপুনি অফিচিয়েল এপৰ বাহিৰে অন্য এটা APK ৰ পৰা ৰপ্তানি কৰা ডাটাবেছ আমদানি কৰে, ই এপটো অক্ষম কৰি ব পাৰে। এনে কাৰ্য্য সমৰ্থিত নহয়, আৰু আপুনি তেতিয়াহে তেনে কৰা উচিত যেতিয়া আপুনি সম্পূৰ্ণ নিশ্চিত যে আপুনি কি কৰি আছে সেয়া জানে। + +## অৱদান + +আপোনাৰ ধাৰণা, অনুবাদ, ডিজাইন পৰিবৰ্তন, ক'ড পৰিষ্কাৰ কৰা, বা আনকি ডাঙৰ ক'ড পৰিৱৰ্তন হওক, সহায় সদায় আদৰণীয়। প্ৰতিটো অৱদানৰ লগে লগে এপটো ভাল হৈ পৰে, যিমানেই ডাঙৰ বা সৰু নহওক কিয়! যদি আপুনি জড়িত হ'ব বিচাৰে তেন্তে চাওক আমাৰ [অবদানৰ টোকা সমূহ](.github/CONTRIBUTING.md).Translation status + +## অনুদান + +যদি আপুনি NewPipe ভাল পায় তেন্তে অনুদান প্ৰেৰণ কৰিব পাৰে। আমি Liberapay পছন্দ কৰো, কাৰণ ই মুক্ত উৎস(Open Source) আৰু অলাভজনক(Non-profit) দুয়োটা। NewPipe লৈ দান দিয়াৰ বিষয়ে অধিক তথ্যৰ বাবে অনুগ্ৰহ কৰি আমাৰ [ৱেবচাইট](https://newpipe.net/donate) চাওক.
Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
Bitcoin Bitcoin QR code 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Bountysource Visit NewPipe at bountysource.com Check out how many bounties you can earn.
+ +## গোপনীয়তা নীতি + +নিউপাইপ প্ৰকল্পৰ লক্ষ্য হৈছে ৱেব-ভিত্তিক মিডিয়া সেৱা ব্যৱহাৰৰ বাবে এক ব্যক্তিগত অভিজ্ঞতা প্ৰদান কৰা। গতিকে আপোনাৰ সন্মতি অবিহনে এপটোৱে কোনো তথ্য সংগ্ৰহ নকৰে। 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 হৈছে বিনামূলীয়া চফ্টৱেৰ: আপুনি ইয়াক ইচ্ছামতে ব্যৱহাৰ, অধ্যয়ন, চেয়াৰ আৰু উন্নত কৰিব পাৰে। বিশেষভাৱে আপুনি ইয়াক মুক্ত চফ্টৱেৰ(Open Source) ফাউণ্ডেচনে প্ৰকাশ কৰাৰ দৰে [GNU General Public License](https://www.gnu.org/licenses/gpl.html)ৰ চৰ্তসমূহৰ অধীনত পৰিবৰ্তন কৰিব পাৰিব(অনুজ্ঞাৰ সংস্কৰণ ৩, বা যিকোনো পৰৱৰ্তী সংস্কৰণ। diff --git a/doc/README.de.md b/doc/README.de.md new file mode 100644 index 00000000000..e5aecca1336 --- /dev/null +++ b/doc/README.de.md @@ -0,0 +1,169 @@ +

Wir planen große Teile des Quellcodes neu zu schreiben, um NewPipe neu, modern und stabiler zu machen!

+

Öffne keine neuen Pull Requests für neue Features, es werden nur Fehlerbehebungen akzeptiert.

+ +

+

NewPipe

+

Eine freie, offene und leichtgewichtige Streaming App für Android.

+ +

Hole es dir auf F-Droid

+ +

+ + + + + + +

+
+

ScreenshotsUnterstützte DiensteBeschreibungFeaturesInstallation und UpdatesBeitragSpendenLizenz

+

WebsiteBlogFAQÜber NewPipe

+
+ +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* + +WARNUNG: DIESE APP BEFINDET SICH IN EINER BETA-PHASE, DAHER KÖNNTEST DU BUGS BEGEGNEN. FALLS DIES PASSIERT, ERSTELLE EIN ISSUE (AUF ENGLISCH) IN UNSEREM GITHUB REPOSITORY, INDEM DU DIE VORLAGE DORT AUSFÜLLST. + +NEWPIPE, ODER JEGLICHEN FORK DAVON, IM GOOGLE PLAYSTORE ANZUBIETEN, VERLETZT DESSEN GESCHÄFTSBEDINGUNGEN. + +## Screenshots + +[](fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + +## Unterstützte Dienste + +Aktuell unterstützt NewPipe die folgenden Dienste: + + +* YouTube ([Webseite](https://www.youtube.com/)) und YouTube Music ([Webseite](https://music.youtube.com/)) ([Wiki](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([Webseite](https://joinpeertube.org/)) sowie all seine *Instanzen* (öffne die Webseite um herauszufinden was das bedeutet!) ([Wiki](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([Webseite](https://bandcamp.com/)) ([Wiki](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([Webseite](https://soundcloud.com/)) ([Wiki](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([Webseite](https://media.ccc.de/)) ([Wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +NewPipe unterstützt offensichtlich mehrere Video- und Audiodienste. Anfänglich war es nur YouTube, über die Jahre haben verschiedene Menschen immer mehr Dienste hinzugefügt - was zu einem zunehmend vielfältigeren NewPipe führte! + +Teils den Umständen geschuldet, teils aufgrund der Bekanntheit, ist von allen Diensten YouTube der am besten Unterstützte. Wenn du einen der anderen Dienste nutzt und/oder dich mit ihm gut auskennst, hilf uns bitte, ihn besser zu machen! Wir suchen nach Betreuern für SoundCloud und PeerTube. + +Falls du vorhaben solltest, einen neuen Dienst hinzuzügen, kontaktiere uns bitte zuerst! In unserer [Dokumentation](https://teamnewpipe.github.io/documentation/) findest du mehr Informationen, wie man der App und dem [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor) einen neuen Dienst hinzufügen kann. + +## Beschreibung + +NewPipe holt sich die benötigten Daten über die offizielle API des jeweiligen Dienstes (z.B. PeerTube). Falls die offizielle API für unsere Zwecke zu eingeschränkt ist (z.B. YouTube), oder weil sie proprietär ist, wird die Webseite entweder *geparst* oder stattdessen eine interne API benutzt. Das heißt also, dass für keinen Dienst ein Account gebraucht wird, um NewPipe zu benutzen. + +Da außerdem sowohl die App als auch der Extractor frei und quelloffen sind, wird keine proprietäre Bibliothek und kein proprietäres Framework benutzt, wie z.B. Google Pay Services. +NewPipe kann also unproblematisch auf Geräten und Custom ROMs benutzt werden, die keine Google Apps installiert haben. + +### Features + +* Sieh dir Videos mit einer Auflösung von bis zu 4K an +* Höre Audio im Hintergrund, wodurch nur der Audio Stream geladen wird, um Daten zu sparen +* Popup Modus ("schwebender Player", auch bekannt als Picture-in-Picture) +* Schaue Live Streams +* Ein- und Ausblenden von Untertitel +* Suche nach Videos und Musik (bei YouTube kann zusätzlich die Sprache des Inhalts festgelegt werden) +* Warteschlangen für Videos (speichere sie optional als lokale Playlists) +* Ein- und Ausblenden von allgemeinen Information über die Videos (z.B. Beschreibung und Tags) +* Ein- und Ausblenden von nächsten/ähnlichen Videos +* Ein- und Ausblenden der Kommentarsektion +* Suche Videos, Musik, Kanäle, Playlists und Alben +* Durchsuche Videos und Musik innerhalb eines Kanals +* Abonniere Kanäle (ja, ohne sich mit einem Account anzumelden!) +* Bekomme Benachrichtigungen für neue Videos von Kanälen, die du abonniert hast +* Erstelle und bearbeite Gruppen von Kanälen (um das Durchsuchen und Organisieren zu vereinfachen) +* Durchsuche Video Feeds, die aus deinen Kanalgruppen entstehen +* Schaue dir deinen Verlauf an und durchsuche ihn +* Suche und schaue dir Playlists an (Es handelt sich um „Remote Playlists“, die also vom Dienst abgerufen werden, den du gerade durchsuchst) +* Erstelle und bearbeite lokale Playlists (diese werden lediglich in der App gespeichert, also nicht im jeweiligen Dienst!) +* Nutze Videos/Audio/Untertitel offline +* Mit Kodi Medien öffnen +* Schaue oder blockiere altergeschützten Inhalt + +## Installation und Updates +NewPipe kann über einer der folgenden Methoden installiert werden: + 1. Füge unser Custom Repo in F-Droid hinzu und installiere es von dort. Die Anleitung dafür findest du hier: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Lade die APK direkt von den [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) herunter und installiere es manuell. + 3. Updates via F-Droid. + Das ist dia langsamste Methode, Updates zu fahren. Da F-Droid selbst Veränderungen erkennen, die APK erstellen, signieren, und dann das Update den Benutzern bereitstellen muss. + 4. Erstelle selbst die APK. + Das ist die beste Methode, um neue Features schnellstmöglich zu bekommen, aber auch sehr kompliziert und umständlich. + Wir raten dir daher zu einer der anderen Methoden. + 5. Falls du an einem konkreten Feature oder Bugfix interessiert bist, welches/r in einem Pull Request in dieser Repo adressiert wird, kannst du auch die APK aus dem PR direkt beziehen. + Lies dir die PR Beschreibung für entsprechende Anweisungen durch. Das Gute an PR-spezifischen APKs ist, dass sie parallel zu der offiziellen App installiert werden. + Du musst also nicht fürchten, dass deine Daten verloren gehen oder irgendetwas kaputt geht. + +Für die meisten Benutzer empfehlen wir die erste Methode. +APKs, die mit Methode 1 oder 2 installiert wurden, sind untereinander kompatibel (d.h. wenn NewPipe mit Methode 1 installiert wurde, kann es trotzdem mit Methode 2 aktualisiert werden und vice versa) - aber nicht mit Methode 3. +Das liegt daran, dass Methode 1 und 2 den gleichen Signierschlüssel benutzen (unseren), während Methode 3 einen anderen benutzt (den von F-Droid). +Eine mit Methode 4 gebaute Debug APK benutzt überhaupt gar keinen Schlüssel. +Das Signieren mit Schlüssel hilft, zu verhindern, dass Benutzer dazu verleitet werden, bösartige Updates zu installieren. +Bei Methode 5 wird für jede APK ein zufälliger Signierschlüssel von GitHub Actions generiert, d.h. Updates sind unmöglich. +Bei jeder neuen APK Installation muss ein Backup gemacht werden und die Daten wiederhergestellt werden. + +Falls du aus welchem Grund auch immer die Quelle (Methode) ändern willst (z.B. weil irgendetwas in NewPipe nicht mehr funktioniert und F-Droid nicht das neuste Update mit dem Fix hat), empfehlen wir folgende Herangehensweise: +1. Mache ein Back-up über _Einstellungen > Inhalt > Datenbank exportieren_, damit dein Verlauf, deine Abos und Playlists nicht verloren gehen +2. Deinstalliere NewPipe +3. Lade die APK von der neuen Quelle herunter und installiere sie +4. Importiere die Daten aus Schritt 1 über _Einstellungen > Inhalt > Datenbank importieren_ + + +Hinweis: Wenn du eine Datenbank in die offizielle App importierst, stelle sicher, dass sie _von_ der offiziellen App exportiert wurde. +Wenn du eine Datenbank aus einer nicht offiziellen APK importierst, können Dinge kaputt gehen. +So eine Aktion wird nicht unterstützt und du solltest sie nur in Erwägung ziehen, wenn du weißt, was du tust. + + +## Beitrag +Egal ob du neue Ideen, Übersetzungen, Designvorschläge, kleine Code-Bereinigungen, oder sogar große Code-Verbesserungen hast, jegliche Unterstützung ist immer gern gesehen. +Die App wird mit _jedem_ Beitrag besser und besser - egal wie viel Arbeit in ihn gesteckt wird! +Wenn du dich einbringen willst, sehe dir die [Beitragshinweise](.github/CONTRIBUTING.md) an. + + +Übersetzt + + +## Spenden +Wenn dir NewPipe gefällt, kannst du uns gerne durch eine Spende unterstützen. +Wir bevorzugen Liberapay, da es sowohl quelloffen als auch nicht gewinnorientiert ist. +Für weitere Informationen über Spenden an NewPipe, besuche unsere [Website](https://newpipe.net/donate). + + + + + + + + + + + + + + + + + +
LiberapayGehe zu NewPipe auf liberapay.comSpenden mit Liberapay
BitcoinBitcoin QR Code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
BountysourceGehe zu NewPipe auf bountysource.comSieh nach, wie viel Bounties du bekommen kannst.
+ +## Privacy Policy + +Das NewPipe Projekt hat zum Ziel, eine private und anonyme Benutzung von Web-basierten Medien-Dienste zu ermöglichen. +Daher sammelt die App keinerlei Daten ohne deine Zustimmung. +NewPipe's Datenschutzbestimmungen erklären im Detail, welche Daten gesendet und gespeichert werden, wenn du einen _Crash Report_ einreichst, oder ein Kommentar auf unserem Blog hinterlässt. +Du findest das Dokument [hier](https://newpipe.net/legal/privacy/). + +## Lizenz +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.de.html) + +NewPipe ist freie Software: Du kannst es nach Belieben benutzen, studieren, teilen, und verbessern. +Du kannst es insbesondere unter den Bedingungen der [GNU General Public License](https://www.gnu.org/licenses/gpl-3.0.de.html), wie von der Free Software Foundation veröffentlicht, entweder Version 3 der Lizenz oder (nach deiner Wahl) jede spätere Version, weiter verbreiten und/oder verändern. diff --git a/doc/README.fr.md b/doc/README.fr.md new file mode 100644 index 00000000000..dd752b051e4 --- /dev/null +++ b/doc/README.fr.md @@ -0,0 +1,145 @@ +

+

NewPipe

+

Un front-end de streaming libre et léger pour Android.

+ +

Get it on F-Droid

+ +

+ + + + + + +

+
+

Captures d'écranServices SupportésDescriptionFonctionnalitésInstallation et mises à jourContribuerDonsLicence

+

SiteBlogFAQPresse

+
+ +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* + +ATTENTION: CETTE APP EST EN BETA, VOUS POUVEZ DONC RENCONTRER DES BUGS. SI C'EST LE CAS, OUVREZ UNE ISSUE DANS NOTRE DÉPÔT GITHUB EN REMPLISSANT LE MODÈLE D'ISSUE. + +METTRE NEWPIPE, OU N'IMPORTE QUEL FORK DE NEWPIPE, SUR LE GOOGLE PLAY STORE ENFREINT LEURS CONDITIONS D'UTILISATION + +## Captures d'écran + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + +### Services supportés + +NewPipe supporte actuellement ces services: + + +* YouTube ([site web](https://www.youtube.com/)) et YouTube Music ([site web](https://music.youtube.com/)) ([wiki](https://fr.wikipedia.org/wiki/YouTube)) +* PeerTube ([site web](https://joinpeertube.org/)) et toutes ses instances (regardez le site web pour savoir ce que cela signifie !) ([wiki](https://fr.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([site web](https://bandcamp.com/)) ([wiki](https://fr.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([site web](https://soundcloud.com/)) ([wiki](https://fr.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([site web](https://media.ccc.de/)) ([wiki](https://fr.wikipedia.org/wiki/Chaos_Computer_Club)) + +Comme vous pouvez le constater, NewPipe supporte de multiples services vidéo et audio. Bien que cela ait commencé avec YouTube, d'autres personnes ont ajouté de nouveaux services au fil des ans, rendant NewPipe de plus en plus polyvalent ! + +En partie pour les circonstances et en partie en raison de sa popularité, YouTube est le service le mieux pris en charge. Si vous utilisez ou connaissez l'un de ces autres services, aidez-nous à améliorer leur prise en charge ! Nous recherchons des mainteneurs pour SoundCloud et PeerTube. + +Si vous avez l'intention d'ajouter un nouveau service, veuillez d'abord nous contacter ! Notre [documentation](https://teamnewpipe.github.io/documentation/) fournit plus d'informations sur la façon dont un nouveau service peut être ajouté à l'application et au [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). + +## Description + +NewPipe fonctionne en récupérant les données requises à partir des APIs officielles (par exemple PeerTube) du service que vous utilisez. Si l'API officielle est limitée (par exemple YouTube) pour nos besoins, ou si elle est propriétaire, l'application analyse le site Web ou utilise une API interne à la place. Cela signifie que vous n'avez pas besoin de compte sur n'importe lequel des services proposés pour utiliser NewPipe. + +De plus, puisqu'il s'agit de logiciels libres et gratuits, ni l'application ni l'Extracteur n'utilisent de bibliothèques ou de frameworks propriétaires, comme les services Google Play. Cela signifie que vous pouvez utiliser NewPipe sur des appareils ou des ROM personnalisées qui n'ont pas d'applications Google installées. + +### Fonctionnalités + +* Regarder des vidéos à des résolutions allant jusqu'à la 4K +* Écouter de l'audio en arrière-plan, en ne chargant que le flux audio pour économiser des données +* Mode Popup (lecteur floattant, aka Picture-in-Picture) +* Regarder des flux en direct +* Afficher/masquer les sous-titres +* Chercher des vidéos et de l'audio (sur Youtube, vous pouvez également spécifier la langue du contenu) +* Mettre en file d'attente les vidéos (et éventuellement les enregistrer en tant que listes de lecture locales) +* Afficher/cacher les inforamtions générales à propos des vidéos (comme la description et les tags) +* Afficher/cacher les vidéos suivantes ou en relation +* Afficher/cacher les commentaires +* Chercher des vidéos, de l'audio, des chaînes, des listes et lecture et des albums +* Parcourir les vidéos et les audios d'une chaîne +* S'abonner à des chaînes (oui, sans avoir besoin de se connecter à un compte !) +* Recevoir des notifications sur les nouvelles vidéos des chaînes auxquelles vous êtes abonné. +* Créer et modifier des groupes de chaînes (pour une gestion et une navigation plus simples) +* Parcourir des fils de vidéos générés depuis vos groupes de chaînes +* Voir et rechercher dans votre historique de visionnage +* Voir et chercher les listes de lectures (il s'agit de listes de lecture à distance, ce qui signifie qu'elles sont extraites du service sur lequel vous naviguez) +* Créer et éditer des listes de lecture locales (elles sont créées et sauvegardées dans l'application, et n'ont rien à voir avec n'importe lequel des services) +* Télécharger des vidéos/de l'audio/des sous-titres +* Lire dans Kodi +* Regarder/bloquer du contenu restreint en fonction de l'âge + + + + +## Installation et mises à jour +Vous pouvez installer NewPipe en utilisant l'une de ces méthodes: + 1. Ajoutez notre dépôt dans F-Droid et l'installer de là. Les instructions sont ici: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Téléchargez l'APK depuis les [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) et l'installer. + 3. Mettez à jour via F-Droid. C'est la méthode la plus lente pour avoir des mises à jour, car F-Droid doit détecter les changements, construire l'APK lui-même, le signer puis enfin publier la mise à jour. + 4. Construisez un APK de débug vous-même. C'est la façon la plus rapide d'avoir des nouvelles fonctionnalités sur votre appareil, mais c'est bien plus compliqué, c'est pour ça que nous vous recommandons d'utiliser une des autres méthodes. + 5. Si vous êtes intéréssé par une fonctionnalité ou une résolution de bug spécifique à une PR de ce dépôt, vous pouvez également télécharger l'APK depuis ladite PR. Vous trouverez les instructions dans la description de la PR. Ce qui est super avec les APK spécifiques à des PR est qu'ils sont installés à côté de l'application officielle, vous n'avez donc pas à vous inquiéter de perdre vos données ou de casser quoi que ce soit. + +Nous recommandons la méthode 1 pour la plupart des utilisateurs. Les APKs installés en suivant les méthodes 1 ou 2 sont compatibles les uns avec les autres (ce qui signifie que si vous installez NewPipe en utilisant une de ces deux méthodes, vous pouvez également mettre à jour NewPipe en utilisant l'autre), mais pas avec ceux installés en utilisant la méthode 3. Cela est dû au fait que la même clé de signature (la notre) est utilisée pour les méthodes 1 et 2, mais une différente clé (celle de F-Droid) est utilisée pour la 3. Construire un APK de débug en utilisant la méthode 4 ne requiert aucune clé. Les clés de signature aident à assurer que l'utilisateur ne s'est pas fait avoir et installe une mise à jour frauduleuse de l'app. Lorsque la méthode 5 est utilisée, chaque APK est signé avec une clé unique et aléatoire générée par les GitHub Actions; vous ne pouvez donc pas les mettre à jour. Vous devrez alors sauvegarder et restaurer les données de l'application à chaque fois que vous voudrez utiliser un nouvel APK. + +Entre temps, si vous voulez changer de source pour une raison quelconque (par exemple, la fonctionnalité de base de NewPipe est cassée et F-Droid n'a pas encore la dernière mise à jour), nous vous recommandons de suivre cette procédure : +1. Sauvegardez vos données via Settings > Content > Export Database pour conserver votre historique, vos abonnements et vos listes de lecture. +2. Désinstallez NewPipe +3. Téléchargez l'APK depuis la nouvelle source et installez le. +4. Restaurez les données de l'étape 1 via Settings > Content > Import Database + +Note: lorsque vous importez une base de données dans l'application officielle, assurez vous de toujours vérifier que c'est celle que vous avez exportée _depuis_ l'application officielle. Si vous importez une base de données provenant d'un autre APK que l'officiel, il se peut que des choses cassent. Une telle action n'est pas supportée, et vous devriez le faire uniquement lorsque vous êtes absolument certains de savoir ce que vous faites + +## Contribuer + +Que vous ayez des idées, des traductions, des changements de design, du nettoyage de code, ou encore un changement de code majeur, toute aide est la bienvenue. L'app s'améliore un peu plus à chaque contribution, peu importe qu'elle soit grosse ou petite ! Si vous aimeriez être impliqué, jetez un coup d'oeil à nos [notes pour contribuer](.github/CONTRIBUTING.md). + + +Translation status + + +## Dons +Si vous aimez NewPipe, vous êtes invités à envoyer un don. Nous préferons Liberapay, car c'est à la fois open-source et à but non-lucratif. Pour plus d'informations sur comment donner à NewPipe, visitez notre [site web](https://newpipe.net/donate) + + + + + + + + + + + + + + + + +
LiberapayVisitez NewPipe sur liberapay.comDonnez via Liberapay
BitcoinQR code Bitcoin16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
BountysourceVisitez NewPipe sur bountysource.comRegardez combien de primes vous pouvez gagner.
+ +## Politique de confidentialité + +Le projet NewPipe vise à offrir une expérience privée et anonyme pour l'utilisation de services médiatiques basés sur le Web. Par conséquent, l'application ne recueille aucune donnée sans votre consentement. La politique de confidentialité de NewPipe explique en détail quelles données sont envoyées et stockées lorsque vous envoyez un rapport d'incident ou laissez un commentaire sur notre blog. Vous pouvez trouver le document [ici](https://newpipe.net/legal/privacy/). + +## Licence +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe est un logiciel libre : vous pouvez l'utiliser, l'étudier, le partager et l'améliorer à volonté. Plus précisément, vous pouvez le redistribuer et/ou le modifier selon les conditions de la [GNU General Public License](https://www.gnu.org/licenses/gpl.html) telle que publiée par la Free Software Foundation, soit la version 3 de la Licence, soit (à votre choix) toute version ultérieure. diff --git a/doc/README.hi.md b/doc/README.hi.md index 42077fadf8d..7ce4605ea80 100644 --- a/doc/README.hi.md +++ b/doc/README.hi.md @@ -17,7 +17,7 @@

वेबसाइटब्लॉगसाधारण सवाल-जवाबप्रेस


-इसे दूसरी भाषाओं में पढ़ें: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md)। +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* चेतावनी: यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें। @@ -25,18 +25,18 @@ ## ऐप कैसी दिखती है -[](../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/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## विवरण diff --git a/doc/README.it.md b/doc/README.it.md new file mode 100644 index 00000000000..76b90318ef2 --- /dev/null +++ b/doc/README.it.md @@ -0,0 +1,146 @@ +

+

NewPipe

+

Un frontend di streaming libero e leggero per Android.

+ +

Scaricalo su F-Droid

+ +

+ + + + + + +

+
+

ScreenshotServizi SupportatiDescrizioneFunzionalitàInstallazione e aggiornamentiContribuireDonareLicenza

+

SitoBlogFAQStampa

+
+ +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* + +ATTENZIONE: QUEST'APP È IN BETA, QUINDI POTRESTI IMBATTERTI IN BUG. SE COSÌ FOSSE, APRI UN'ISSUE SUL NOSTRO REPOSITORIO GITHUB COMPILANDO IL TEMPLATE ISSUE. + +METTERE NEWPIPE, O QUALSIASI SUA FORK, NEL GOOGLE PLAY STORE, VIOLA I LORO TERMINI E CONDIZIONI. + +## Screenshot + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + +### Servizi Supportati + +NewPipe supporta, al momento, questi servizi: + + +* YouTube ([sito](https://www.youtube.com/)) e YouTube Music ([sito](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([sito](https://joinpeertube.org/)) e tutte le sue istanze (apri il sito per capire cosa significa!) ([wiki](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([sito](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([sito](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([sito](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +Come puoi vedere, NewPipe supporta molteplici servizi audio e video. Sebbene tutto sia iniziato con YouTube, altre persone hanno aggiunto più siti col passare degli anni, rendendo NewPipe sempre più versatile! + +Parzialmente per via delle circostanze, e parzialmente per via della sua popolarità, YouTube è il meglio supportato di questi servizi. Se usi o hai familiarità con qualcuno di questi altri servizi, per favore, aiutaci a migliorare il loro supporto! Stiamo cercando addetti a SoundCloud e PeerTube. + +Se vuoi aggiungere un nuovo servizio, per favore, contattaci prima! La nostra [documentazione [*N.d.T.: in inglese*]](https://teamnewpipe.github.io/documentation) fornisce più informazioni su come un nuovo servizio può essere aggiunto all'app e a [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). + +## Descrizione + +NewPipe svolge le sue funzioni prendendo i dati richiesti dall'API (ad es. PeerTube) del servizio che stai usando. Se l'API ufficiale ha delle restrinzioni (ad es. YouTube) per i nostri scopi, o è proprietaria, invece, l'app analizza il sito o usa un'API interna. Questo significa che non hai bisogno di un account su nessun servizio per usare NewPipe. + +Inoltre, siccome sono programmi liberi e *open-source*, nè l'app nè l'estrattore usano alcuna libreria o *framework* proprietario, come i Google Play Services. Questo vuol dire che puoi usare NewPipe su dispositivi o *ROM custom* che non hanno le app Google installate. + +### Funzionalità + +* Guarda video a risoluzioni fino al 4K +* Ascolta audio in sottofondo, caricando solo il flusso audio per risparmiare dati +* Modalità pop-up (lettore *floating*, anche noto come *Picture-in-Picture*) +* Guarda dirette +* Mostra/nascondi sottotitoli +* Cerca video e audio (su YouTube, puoi anche specificare la lingua dei contenuti) +* Accoda video (e salvali facoltativamente come *playlist* locali) +* Mostra/nascondi informazioni sui video (come descrizione e *tag*) +* Mostra/nascondi prossimi video o video correlati +* Mostra/nascondi commenti +* Cerca video, audio, canali, *playlist* e *album* +* Esplora video e audio in un canale +* Iscriviti a canali (sì, senza entrare in alcun *account*!) +* Ricevi notifiche su video nuovi di canali a cui sei iscritto +* Crea e modifica gruppi di canali (per navigazione e gestione facili) +* Esplora *feed* di video generati dai tuoi gruppi di canali +* Visualizza la tua cronologia e cerca in quest'ultima +* Cerca e guarda *playlist* (queste sono *playlist* remote, il chè significa che sono prese dal servizio che stai esplorando) +* Crea e modifica *playlist* locali (queste sono create e salvate nell'app, e non hanno niente a che fare con alcun servizio) +* Scarica video/audio/sottotitoli (*closed caption*) +* Apri in Kodi +* Guarda/Blocca materiale soggetto a limiti di età + +## Installazione e aggiornamenti + +Puoi installare NewPipe usando uno dei seguenti metodi: +1. Aggiungi il nostro repo a F-Droid e installalo da lì. Le istruzioni sono qui: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ +2. Scarica l'APK da [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e installalo. +3. Aggiorna tramite F-Droid. Questo è il metodo più lento di ricevere aggiornamenti, perché F-Droid deve riconoscere i cambiamenti, assemblare l'APK da solo, firmarlo, e poi distribuire l'aggiornamento agli utenti. +4. Assemblare un APK di *debug* da solo/a. Questo è il metodo più veloce di ottenere nuove funzioni sul tuo dispositivo, ma è molto più complicato, quindi consigliamo usare uno degli altri metodi. +5. Se sei interessato in una specifica funzione o un *bugfix* provveduto in una *Pull Request* in questo repo, puoi anche scaricare il suo APK da dentro la *PR*- Leggi la descrizione della *PR* per le istruzioni. La cosa bella degli APK specifici delle *PR* è che sono installati affianco all'app ufficiale, quindi non devi preoccuparti di perdere dati o fare qualche pasticcio. + +Consigliamo il metodo 1 per la maggior parte degli utenti. Gli APK installati usando il metodo 1 o 2 sono compatibili gli uni con gli altri (quindi, se hai installato NewPipe usando o il metodo 1 o il metodo 2, puoi anche aggiornare NewPipe usando l'altro), ma non con quelli installati usando il metodo 3. Questo è per via del fatto che la stessa *signing key* (la nostra) è usata sia per il 1° che per il 2°, ma un'altra *signing key* (quella di F-Droid) è usata per il 3°. Assemblare un APK di debug usando il metodo 4 esclude una chiave interamente. Le *signing key* aiutano ad assicurarsi che l'utente non sia spinto a installare un aggiornamento malevolo ad un'app. Quando si usa il metodo 5, ogni APK è firmato con una diversa chiave random fornita da GitHub Actions, quindi non puoi neanche aggiornarlo. Dovrai fare il *backup* e recuperare i dati dell'app ogni volta che desideri usare un nuovo APK. + +Nel frattempo, se vuoi cambiare fonte per la stessa ragione (ad es. la funzionalità essenziale di NewPipe si rompe e F-Droid non ha ancora l'ultimo aggiornamento), consigliamo di seguire questa procedura: +1. Fai il *backup* dei tuoi dati tramite Impostazioni > Contenuti > Esporta Database così puoi mantenere la tua cronologia, le tue iscrizioni, e le tue *playlist* +2. Disinstalla NewPipe +3. Scarica l'APK dalla nuova fonte e installalo +4. Importa i dati del passo 1 da Impostazioni > Contenuti > Importa Database + +N.B.: quando stai importando un *database* nell'app ufficiale, assicurati sempre che sia quello che hai esportato _dall'app_ ufficiale. Se importi un *database* esportato da un APK diverso da quello dell'app ufficiale, potrebbe rompere molte cose. Un'azione del genere non è supportata, e dovresti compierla solo se sei assolutamente sicuro di sapere quello che stai facendo. + +## Contribuire + +Se hai idee, traduzioni, cambiamenti di *design*, pulizia di codice, o addirittura grossi cambiamenti di codice, l'aiuto è sempre apprezzato. L'app diventa sempre meglio con ogni contribuzione, non importa quanto grande o piccola essa sia! Se ti piacerebbe essere parte del progetto, vedi le nostre [note di contribuzione](.github/CONTRIBUTING.md). + + +Stato traduzione + + +## Donare + +Se ti piace NewPipe, le donazioni sono benvenute. Preferiamo Liberapay, siccome è sia *open-source* che senza fini di lucro. Per ulteriori informazioni sulle donazioni a NewPipe, per favore, visita il nostro [sito](https://newpipe.net/donate). + + + + + + + + + + + + + + + + + +
LiberapayVisita NewPipe su liberapay.comDona via Liberapay
BitcoinCodice QR Bitcoin16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
BountysourceVisita NewPipe su bountysource.comScopri quanti <i>bounty</i> puoi guadagnare.
+ +## Privacy Policy + +Il progetto NewPipe mira a fornire un'esperienza privata e anonima per usare servizi multimediali basati sul *web*. Di conseguenza, l'app non raccoglie alcun dato senza il tuo consenso. La *privacy policy* di NewPipe spiega nel dettaglio quali dati sono inviati e memorizzati quando invii un *crash report*, o lasci un commento nel nostro *blog*. Puoi trovare il documento [qui](https://newpipe.net/legal/privacy/). + +## Licenza + +[![Immagine GNU GPLv3](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe è Software Libero: Puoi usarlo, studiarlo, condividerlo e migliorarlo a tuoi piacimento. Specificamente, puoi ridistribuirlo e/o modificarlo sotto i termini della [GNU General Public License](https://www.gnu.org/licenses/gpl.html) come pubblicata dalla Free Software Foundation, o la versione 3 della Licenza, o (a tua scelta) qualsiasi versione successiva. diff --git a/doc/README.pa.md b/doc/README.pa.md new file mode 100644 index 00000000000..65e817b4e4c --- /dev/null +++ b/doc/README.pa.md @@ -0,0 +1,142 @@ +

+

NewPipe

+

ਐਂਡਰੌਇਡ ਲਈ ਇੱਕ ਮੁਫਤ ਹਲਕਾ-ਫੁਲਕਾ ਸਟ੍ਰੀਮਿੰਗ ਯੂਟਿਊਬ ਫਰੰਟ-ਐਂਡ।

+ +

Get it on F-Droid

+ +

+ + + + + + +

+
+

ਸਕਰੀਨਸ਼ਾਟਸੇਵਾਵਾਂਵਰਣਨਵਿਸ਼ੇਸ਼ਤਾਵਾਂਇੰਸਟਾਲੇਸ਼ਨ ਅਤੇ ਅੱਪਡੇਟਯੋਗਦਾਨਦਾਨਲਾਈਸੈਂਸ

+

ਵੈੱਬਸਾਈਟਬਲੌਗਆਮ ਸਵਾਲ ਜਵਾਬਪ੍ਰੈਸ

+
+ +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* + +ਚੇਤਾਵਨੀ: ਇਹ ਐਪ ਬੀਟਾ ਵਿੱਚ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਬੱਗ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਮਪਲੇਟ ਨੂੰ ਭਰ ਕੇ ਸਾਡੀ ਗਿਟਹੱਬ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਮੁੱਦਾ ਖੋਲ੍ਹੋ + +ਗੂਗਲ ਪਲੇ ਸਟੋਰ ਵਿੱਚ ਨਿਊਪਾਈਪ ਜਾਂ ਇਸ ਦਾ ਕੋਈ ਵੀ ਫੋਰਕ ਲਗਾਉਣਾ ਉਹਨਾਂ ਦੇ ਨਿਯਮਾਂ ਅਤੇ ਸ਼ਰਤਾਂ ਦੀ ਉਲੰਘਣਾ ਕਰਦਾ ਹੈ। + +## ਸਕਰੀਨਸ਼ਾਟ + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + +## ਸੇਵਾਵਾਂ + +NewPipe ਵਰਤਮਾਨ ਵਿੱਚ ਇਹਨਾਂ ਸੇਵਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ:: + + +* YouTube ([ਵੈੱਬਸਾਈਟ](https://www.youtube.com/)) and YouTube Music ([ਵੈੱਬਸਾਈਟ](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([ਵੈੱਬਸਾਈਟ](https://joinpeertube.org/)) ਅਤੇ ਇਸ ਦੇ ਸਾਰੇ ਇੰਸਟੈਂਸ (ਇਸ ਦਾ ਮਤਲਬ ਜਾਣਨ ਲਈ ਵੈੱਬਸਾਈਟ ਖੋਲ੍ਹੋ!) ([wiki](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([ਵੈੱਬਸਾਈਟ](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([ਵੈੱਬਸਾਈਟ](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([ਵੈੱਬਸਾਈਟ](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +ਜਿਵੇਂ ਕਿ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, NewPipe ਮਲਟੀਪਲ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸੇਵਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ ਇਹ YouTube ਦੇ ਨਾਲ ਸ਼ੁਰੂ ਹੋਇਆ ਸੀ, ਦੂਜੇ ਲੋਕਾਂ ਨੇ ਸਾਲਾਂ ਦੌਰਾਨ ਹੋਰ ਸੇਵਾਵਾਂ ਜੋੜੀਆਂ ਹਨ, ਜਿਸ ਨਾਲ NewPipe ਨੂੰ ਵੱਧ ਤੋਂ ਵੱਧ ਬਹੁਮੁਖੀ ਬਣਾਇਆ ਗਿਆ ਹੈ! + +ਅੰਸ਼ਕ ਤੌਰ 'ਤੇ ਹਾਲਾਤ ਦੇ ਕਾਰਨ, ਅਤੇ ਅੰਸ਼ਕ ਤੌਰ 'ਤੇ ਇਸਦੀ ਪ੍ਰਸਿੱਧੀ ਦੇ ਕਾਰਨ, YouTube ਇਹਨਾਂ ਸੇਵਾਵਾਂ ਵਿੱਚੋਂ ਸਭ ਤੋਂ ਵਧੀਆ ਸਮਰਥਿਤ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਇਹਨਾਂ ਵਿੱਚੋਂ ਕਿਸੇ ਵੀ ਹੋਰ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ ਜਾਂ ਉਹਨਾਂ ਤੋਂ ਜਾਣੂ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਉਹਨਾਂ ਲਈ ਸਹਾਇਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰੋ! ਅਸੀਂ SoundCloud ਅਤੇ PeerTube ਲਈ ਰੱਖਿਅਕਾਂ ਦੀ ਭਾਲ ਕਰ ਰਹੇ ਹਾਂ। + +ਜੇ ਤੁਸੀਂ ਕੋਈ ਨਵੀਂ ਸੇਵਾ ਜੋੜਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਪਹਿਲਾਂ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ! ਸਾਡਾ [docs](https://teamnewpipe.github.io/documentation/) ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਐਪ ਕਿ ਇਸ ਵਿੱਚ ਨਵੀਂ ਸੇਵਾ ਕਿਵੇਂ ਸ਼ਾਮਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). + +## ਵਰਣਨ + +NewPipe ਤੁਹਾਡੇ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਰਹੀ ਸੇਵਾ ਦੇ ਅਧਿਕਾਰਤ API (ਉਦਾਹਰਨ ਲਈ PeerTube) ਤੋਂ ਲੋੜੀਂਦਾ ਡੇਟਾ ਪ੍ਰਾਪਤ ਕਰਕੇ ਕੰਮ ਕਰਦਾ ਹੈ। ਜੇਕਰ ਅਧਿਕਾਰਤ API ਸਾਡੇ ਉਦੇਸ਼ਾਂ ਲਈ ਪ੍ਰਤਿਬੰਧਿਤ ਹੈ (ਉਦਾਹਰਨ ਲਈ YouTube) ਜਾਂ ਮਲਕੀਅਤ ਹੈ, ਤਾਂ ਐਪ ਵੈੱਬਸਾਈਟ ਨੂੰ ਪਾਰਸ ਕਰਦੀ ਹੈ ਜਾਂ ਇਸਦੀ ਬਜਾਏ ਇੱਕ ਅੰਦਰੂਨੀ API ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਹਾਨੂੰ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਕਿਸੇ ਵੀ ਸੇਵਾ 'ਤੇ ਖਾਤੇ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। + +ਨਾਲ ਹੀ, ਕਿਉਂਕਿ ਇਹ ਮੁਫਤ ਅਤੇ ਓਪਨ ਸੋਰਸ ਸੌਫਟਵੇਅਰ ਹਨ, ਨਾ ਤਾਂ ਐਪ ਅਤੇ ਨਾ ਹੀ ਐਕਸਟਰੈਕਟਰ ਕਿਸੇ ਵੀ ਮਲਕੀਅਤ ਲਾਇਬ੍ਰੇਰੀਆਂ ਜਾਂ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ, ਜਿਵੇਂ ਕਿ Google Play ਸੇਵਾਵਾਂ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਉਹਨਾਂ ਡਿਵਾਈਸਾਂ ਜਾਂ ਕਸਟਮ ਰੋਮਾਂ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ ਜਿਨ੍ਹਾਂ ਵਿੱਚ Google ਐਪਸ ਸਥਾਪਿਤ ਨਹੀਂ ਹਨ। + +## ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ + +* 4K ਤੱਕ ਰੈਜ਼ੋਲਿਊਸ਼ਨ 'ਤੇ ਵੀਡੀਓ ਵੇਖੋ +* ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਆਡੀਓ ਸੁਣੋ, ਡਾਟਾ ਬਚਾਉਣ ਲਈ ਸਿਰਫ਼ ਆਡੀਓ ਸਟ੍ਰੀਮ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ +* ਪੌਪਅੱਪ ਮੋਡ (ਫਲੋਟਿੰਗ ਪਲੇਅਰ, ਉਰਫ ਪਿਕਚਰ-ਇਨ-ਪਿਕਚਰ) +* ਲਾਈਵ ਸਟ੍ਰੀਮ ਵੇਖੋ +* ਸਬਟਾਈਟਲ/ ਕਲੋਜ਼ਡ ਕੈਪਸ਼ਨਾਂ ਵਿਖਾਓ/ਲੁਕਾਓ +* ਵੀਡੀਓ ਅਤੇ ਆਡੀਓਜ਼ ਖੋਜੋ (ਯੂਟਿਊਬ 'ਤੇ, ਤੁਸੀਂ ਸਮੱਗਰੀ ਦੀ ਭਾਸ਼ਾ ਵੀ ਨਿਰਧਾਰਤ ਕਰ ਸਕਦੇ ਹੋ) +* ਵੀਡੀਓਜ਼ ਨੂੰ ਕਤਾਰਬੱਧ ਕਰੋ /ਵੇਖੋ (ਅਤੇ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਉਹਨਾਂ ਨੂੰ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਵਜੋਂ ਸੁਰੱਖਿਅਤ ਕਰੋ) +* ਵੀਡੀਓਜ਼ ਬਾਰੇ ਆਮ ਜਾਣਕਾਰੀ ਵਿਖਾਓ/ਛੁਪਾਓ (ਜਿਵੇਂ ਕਿ ਵਰਣਨ ਅਤੇ ਟੈਗਸ) +* ਅਗਲੇ/ਸਬੰਧਤ ਵੀਡੀਓ ਵਿਖਾਓਲੁਕਾਓ +* ਟਿੱਪਣੀਆਂ ਵਿਖਾਓ/ਲੁਕਾਓ +* ਵੀਡੀਓ, ਆਡੀਓ, ਚੈਨਲ, ਪਲੇਲਿਸਟ ਅਤੇ ਐਲਬਮਾਂ ਖੋਜੋ +* ਇੱਕ ਚੈਨਲ ਦੇ ਅੰਦਰ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਬ੍ਰਾਊਜ਼ ਕਰੋ +* ਚੈਨਲਾਂ ਨੂੰ ਸਬਸਕਰਾਈਬ ਕਰੋ(ਹਾਂ, ਕਿਸੇ ਵੀ ਖਾਤੇ ਵਿੱਚ ਲੌਗਇਨ ਕੀਤੇ ਬਿਨਾਂ!) +* ਤੁਹਾਡੇ ਦੁਆਰਾ ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਗਏ ਚੈਨਲਾਂ ਤੋਂ ਨਵੇਂ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ +* ਚੈਨਲ ਸਮੂਹ ਬਣਾਓ ਅਤੇ ਸੰਪਾਦਿਤ ਕਰੋ (ਆਸਾਨ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਤੇ ਪ੍ਰਬੰਧਨ ਲਈ) +* ਤੁਹਾਡੇ ਚੈਨਲ ਸਮੂਹਾਂ ਤੋਂ ਤਿਆਰ ਵੀਡੀਓ ਫੀਡਾਂ ਨੂੰ ਬ੍ਰਾਊਜ਼ ਕਰੋ +* ਆਪਣਾ ਵੇਖਣ ਦਾ ਇਤਿਹਾਸ ਵੇਖੋ ਅਤੇ ਖੋਜੋ +* ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਖੋਜੋ ਅਤੇ ਵੇਖੋ (ਇਹ ਰਿਮੋਟ ਪਲੇਲਿਸਟਾਂ ਹਨ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਉਹ ਤੁਹਾਡੇ ਦੁਆਰਾ ਬ੍ਰਾਊਜ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਸੇਵਾ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ) +* ਸਥਾਨਕ ਪਲੇਲਿਸਟਸ ਬਣਾਓ ਅਤੇ ਸੰਪਾਦਿਤ ਕਰੋ (ਇਹ ਐਪ ਦੇ ਅੰਦਰ ਬਣਾਈਆਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਅਤੇ ਇਹਨਾਂ ਦਾ ਕਿਸੇ ਸੇਵਾ ਨਾਲ ਕੋਈ ਲੈਣਾ-ਦੇਣਾ ਨਹੀਂ ਹੈ) +* ਵੀਡੀਓ/ਆਡੀਓ/ਸਬਟਾਈਟਲ (ਕਲੋਜ਼ਡ ਕੈਪਸ਼ਨਾਂ ) ਡਾਊਨਲੋਡ ਕਰੋ +* ਕੋਡੀ ਵਿੱਚ ਖੋਲ੍ਹੋ +* ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਵੇਖੋ /ਬਲਾਕ ਕਰੋ + +## ਇੰਸਟਾਲੇਸ਼ਨ ਅਤੇ ਅੱਪਡੇਟ +ਤੁਸੀਂ ਹੇਠਾਂ ਦਿੱਤੇ ਤਰੀਕਿਆਂ ਵਿੱਚੋਂ ਇੱਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਨਿਊਪਾਈਪ ਨੂੰ ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ: + 1. ਸਾਡੇ ਕਸਟਮ ਰੈਪੋ ਨੂੰ F-Droid ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਉਥੋਂ ਇੰਸਟਾਲ ਕਰੋ। ਨਿਰਦੇਸ਼ ਇੱਥੇ ਹਨ: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2.[GitHub Releases] ਤੋਂ ਏਪੀਕੇ ਡਾਊਨਲੋਡ ਕਰੋ (https://github.com/TeamNewPipe/NewPipe/releases) ਅਤੇ ਇਸਨੂੰ ਇੰਸਟਾਲ ਕਰੋ। + 3.F-Droid ਰਾਹੀਂ ਅੱਪਡੇਟ ਕਰੋ। ਇਹ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦਾ ਸਭ ਤੋਂ ਹੌਲੀ ਤਰੀਕਾ ਹੈ, ਕਿਉਂਕਿ F-Droid ਨੂੰ ਤਬਦੀਲੀਆਂ ਨੂੰ ਪਛਾਣਨਾ ਹੁੰਦਾ ਹੈ, ਏਪੀਕੇ ਨੂੰ ਖੁਦ ਬਣਾਉਣਾ ਹੁੰਦਾ ਹੈ, ਇਸ 'ਤੇ ਦਸਤਖਤ ਕਰਨਾ ਹੁੰਦਾ ਹੈ, ਅਤੇ ਫਿਰ ਉਪਭੋਗਤਾਵਾਂ ਤੱਕ ਅੱਪਡੇਟ ਨੂੰ ਭੇਜਦੇ ਹਨ। + 4.ਇੱਕ ਡੀਬੱਗ APK ਆਪਣੇ ਆਪ ਬਣਾਓ। ਇਹ ਤੁਹਾਡੀ ਡਿਵਾਈਸ 'ਤੇ ਨਵੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਦਾ ਸਭ ਤੋਂ ਤੇਜ਼ ਤਰੀਕਾ ਹੈ, ਪਰ ਇਹ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗੁੰਝਲਦਾਰ ਹੈ, ਇਸ ਲਈ ਅਸੀਂ ਹੋਰ ਤਰੀਕਿਆਂ ਵਿੱਚੋਂ ਇੱਕ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਸਿਫਾਰਸ਼ ਕਰਦੇ ਹਾਂ। + 5.ਜੇ ਤੁਸੀਂ ਇਸ ਰੈਪੋ ਵਿੱਚ ਪੁੱਲ ਬੇਨਤੀ ਵਿੱਚ ਪ੍ਰਦਾਨ ਕੀਤੀ ਗਈ ਇੱਕ ਵਿਸ਼ੇਸ਼ ਵਿਸ਼ੇਸ਼ਤਾ ਜਾਂ ਬੱਗਫਿਕਸ ਵਿੱਚ ਦਿਲਚਸਪੀ ਰੱਖਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਪੀਆਰ ਦੇ ਅੰਦਰੋਂ ਇਸਦਾ ਏਪੀਕੇ ਵੀ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੇ ਹੋ। ਨਿਰਦੇਸ਼ਾਂ ਲਈ PR ਵਰਣਨ ਪੜ੍ਹੋ। PR-ਵਿਸ਼ੇਸ਼ APKs ਬਾਰੇ ਸਭ ਤੋਂ ਵੱਡੀ ਗੱਲ ਇਹ ਹੈ ਕਿ ਉਹ ਅਧਿਕਾਰਤ ਐਪ ਦੇ ਨਾਲ-ਨਾਲ ਸਥਾਪਿਤ ਕੀਤੇ ਗਏ ਹਨ, ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਡੇਟਾ ਗੁਆਉਣ ਜਾਂ ਕਿਸੇ ਵੀ ਗੜਬੜੀ ਬਾਰੇ ਚਿੰਤਾ ਕਰਨ ਦੀ ਕੋਈ ਲੋੜ ਨਹੀਂ ਹੈ। + +ਅਸੀਂ ਜ਼ਿਆਦਾਤਰ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਵਿਧੀ 1 ਦੀ ਸਿਫ਼ਾਰਿਸ਼ ਕਰਦੇ ਹਾਂ। ਵਿਧੀ 1 ਜਾਂ 2 ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਥਾਪਤ ਕੀਤੇ ਏਪੀਕੇ ਇੱਕ ਦੂਜੇ ਦੇ ਅਨੁਕੂਲ ਹੁੰਦੇ ਹਨ (ਮਤਲਬ ਕਿ ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਵਿਧੀ 1 ਜਾਂ 2 ਦੀ ਵਰਤੋਂ ਕਰਕੇ NewPipe ਨੂੰ ਸਥਾਪਿਤ ਕੀਤਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਦੂਜੀ ਦੀ ਵਰਤੋਂ ਕਰਕੇ NewPipe ਨੂੰ ਵੀ ਅੱਪਡੇਟ ਕਰ ਸਕਦੇ ਹੋ), ਪਰ ਉਹਨਾਂ ਨਾਲ ਨਹੀਂ ਜੋ ਵਿਧੀ 3 ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਥਾਪਿਤ ਕੀਤੇ ਗਏ ਹਨ। ਇੱਕੋ ਸਾਈਨਿੰਗ ਕੁੰਜੀ (ਸਾਡੀ) 1 ਅਤੇ 2 ਲਈ ਵਰਤੀ ਜਾ ਰਹੀ ਹੈ, ਪਰ 3 ਲਈ ਇੱਕ ਵੱਖਰੀ ਸਾਈਨਿੰਗ ਕੁੰਜੀ (F-Droid's) ਵਰਤੀ ਜਾ ਰਹੀ ਹੈ। ਵਿਧੀ 4 ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਇੱਕ ਡੀਬੱਗ ਏਪੀਕੇ ਬਣਾਉਣਾ ਇੱਕ ਕੁੰਜੀ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬਾਹਰ ਰੱਖਦਾ ਹੈ। ਦਸਤਖਤ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਦੀਆਂ ਹਨ ਕਿ ਕਿਸੇ ਉਪਭੋਗਤਾ ਨੂੰ ਐਪ ਲਈ ਇੱਕ ਖਤਰਨਾਕ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨ ਲਈ ਧੋਖਾ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਵਿਧੀ 5 ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ, ਹਰੇਕ ਏਪੀਕੇ ਨੂੰ GitHub ਐਕਸ਼ਨਾਂ ਦੁਆਰਾ ਸਪਲਾਈ ਕੀਤੀ ਇੱਕ ਵੱਖਰੀ ਬੇਤਰਤੀਬ ਕੁੰਜੀ ਨਾਲ ਹਸਤਾਖਰਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਇਸਲਈ ਤੁਸੀਂ ਇਸਨੂੰ ਅਪਡੇਟ ਵੀ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ। ਹਰ ਵਾਰ ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਏਪੀਕੇ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਤੁਹਾਨੂੰ ਐਪ ਡੇਟਾ ਦਾ ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ ਕਰਨਾ ਹੋਵੇਗਾ। + +ਇਸ ਦੌਰਾਨ, ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਕਾਰਨ ਕਰਕੇ ਸਰੋਤਾਂ ਨੂੰ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ (ਜਿਵੇਂ ਕਿ NewPipe ਦੀ ਕੋਰ ਕਾਰਜਸ਼ੀਲਤਾ ਬਰੇਕ ਅਤੇ F-Droid ਵਿੱਚ ਅਜੇ ਤੱਕ ਨਵੀਨਤਮ ਅੱਪਡੇਟ ਨਹੀਂ ਹੈ), ਤਾਂ ਅਸੀਂ ਇਸ ਪ੍ਰਕਿਰਿਆ ਦੀ ਪਾਲਣਾ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਿਸ਼ ਕਰਦੇ ਹਾਂ: +1. ਸੈਟਿੰਗਾਂ > ਸਮਗਰੀ > ਐਕਸਪੋਰਟ ਡੇਟਾਬੇਸ ਰਾਹੀਂ ਆਪਣੇ ਡੇਟਾ ਦਾ ਬੈਕਅੱਪ ਲਓ ਤਾਂ ਜੋ ਤੁਸੀਂ ਆਪਣਾ ਇਤਿਹਾਸ, ਸਬਸਕਰਿਪਸ਼ਨਾਂ ਅਤੇ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਰੱਖੋ +2. ਨਿਊ ਪਾਈਪ ਨੂੰ ਅਣਇੰਸਟਾਲ ਕਰੋ +3. ਨਵੇਂ ਸਰੋਤ ਤੋਂ ਏਪੀਕੇ ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਸਥਾਪਿਤ ਕਰੋ +4. ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਆਯਾਤ ਡੇਟਾਬੇਸ ਰਾਹੀਂ ਸਟੈਪ 1 ਤੋਂ ਡੇਟਾ ਆਯਾਤ ਕਰੋ + +ਨੋਟ: ਜਦੋਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਵਿੱਚ ਇੱਕ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਹਮੇਸ਼ਾਂ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇਹ ਉਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਇਲਾਵਾ ਕਿਸੇ ਏਪੀਕੇ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤੇ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਚੀਜ਼ਾਂ ਨੂੰ ਤੋੜ ਸਕਦਾ ਹੈ। ਅਜਿਹੀ ਕਾਰਵਾਈ ਅਸਮਰਥਿਤ ਹੈ, ਅਤੇ ਤੁਹਾਨੂੰ ਅਜਿਹਾ ਉਦੋਂ ਹੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਯਕੀਨ ਹੋਵੇ ਕਿ ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਕੀ ਕਰ ਰਹੇ ਹੋ। + +## ਯੋਗਦਾਨ +ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ, ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਤਬਦੀਲੀਆਂ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਇੱਥੋਂ ਤੱਕ ਕਿ ਵੱਡੀਆਂ ਕੋਡ ਤਬਦੀਲੀਆਂ ਹੋਣ, ਮਦਦ ਦਾ ਹਮੇਸ਼ਾ ਸਵਾਗਤ ਹੈ। ਐਪ ਹਰੇਕ ਯੋਗਦਾਨ ਦੇ ਨਾਲ ਬਿਹਤਰ ਅਤੇ ਬਿਹਤਰ ਹੋ ਜਾਂਦੀ ਹੈ, ਚਾਹੇ ਉਹ ਕਿੰਨਾ ਵੱਡਾ ਜਾਂ ਛੋਟਾ ਹੋਵੇ! ਜੇਕਰ ਤੁਸੀਂ ਸ਼ਾਮਲ ਹੋਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਸਾਡੀ ਜਾਂਚ ਕਰੋ [contribution notes](.github/CONTRIBUTING.md). + + +Translation status + + +## ਦਾਨ +ਜੇਕਰ ਤੁਹਾਨੂੰ NewPipe ਪਸੰਦ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਦਾਨ ਭੇਜਣ ਲਈ ਸੁਆਗਤ ਹੈ। ਅਸੀਂ Liberapay ਨੂੰ ਤਰਜੀਹ ਦਿੰਦੇ ਹਾਂ, ਕਿਉਂਕਿ ਇਹ ਓਪਨ-ਸੋਰਸ ਅਤੇ ਗੈਰ-ਮੁਨਾਫ਼ਾ ਦੋਵੇਂ ਹੈ। ਨਿਊ ਪਾਈਪ ਨੂੰ ਦਾਨ ਕਰਨ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੀ [ਵੈੱਬਸਾਈਟ](https://newpipe.net/donate) 'ਤੇ ਜਾਓ। + + + + + + + + + + + + + + + + + +
Liberapayliberapay.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋDonate via Liberapay
Bitcoinਬਿਟਕੋਇਨ 'ਤੇ ਦਾਨ ਕਰਨ ਲਈ QR ਕੋਡ16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Bountysourcebountysource.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋਦੇਖੋ ਕਿ ਤੁਸੀਂ ਕਿੰਨੇ ਇਨਾਮ ਕਮਾ ਸਕਦੇ ਹੋ।
+ +## ਗੋਪਨੀਅਤਾ ਨੀਤੀ + +ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਦਾ ਉਦੇਸ਼ ਵੈੱਬ-ਆਧਾਰਿਤ ਮੀਡੀਆ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਕ ਨਿੱਜੀ, ਅਗਿਆਤ ਅਨੁਭਵ ਪ੍ਰਦਾਨ ਕਰਨਾ ਹੈ। ਇਸ ਲਈ, ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਡਾਟਾ ਇਕੱਠਾ ਨਹੀਂ ਕਰਦਾ ਹੈ। NewPipe ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ, ਜਾਂ ਸਾਡੇ ਬਲੌਗ ਵਿੱਚ ਕੋਈ ਟਿੱਪਣੀ ਛੱਡਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡੇਟਾ ਭੇਜਿਆ ਅਤੇ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਤੁਸੀਂ ਇੱਥੇ ਦਸਤਾਵੇਜ਼ ਲੱਭ ਸਕਦੇ ਹੋ[here](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 ਮੁਫਤ ਸਾਫਟਵੇਅਰ ਹੈ: ਤੁਸੀਂ ਆਪਣੀ ਮਰਜ਼ੀ ਨਾਲ ਇਸਦੀ ਵਰਤੋਂ, ਅਧਿਐਨ, ਸਾਂਝਾ ਅਤੇ ਸੁਧਾਰ ਕਰ ਸਕਦੇ ਹੋ। ਖਾਸ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਇਸ ਨੂੰ ਦੀਆਂ ਸ਼ਰਤਾਂ ਦੇ ਤਹਿਤ ਮੁੜ ਵੰਡ ਅਤੇ/ਜਾਂ ਸੋਧ ਸਕਦੇ ਹੋ [GNU General Public License](https://www.gnu.org/licenses/gpl.html) ਜਿਵੇਂ ਕਿ ਫ੍ਰੀ ਸੌਫਟਵੇਅਰ ਫਾਊਂਡੇਸ਼ਨ ਦੁਆਰਾ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਜਾਂ ਤਾਂ ਲਾਇਸੈਂਸ ਦਾ ਸੰਸਕਰਣ 3, ਜਾਂ (ਤੁਹਾਡੇ ਵਿਕਲਪ ਤੇ) ਕੋਈ ਬਾਅਦ ਵਾਲਾ ਸੰਸਕਰਣ। diff --git a/doc/README.pl.md b/doc/README.pl.md index 246a86c8ea9..16577cb4d81 100644 --- a/doc/README.pl.md +++ b/doc/README.pl.md @@ -17,7 +17,7 @@

StronaBlogFAQPress


-*Przeczytaj w innych językach: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* UWAGA: TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. @@ -25,18 +25,18 @@ ## 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) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Opis diff --git a/doc/README.ru.md b/doc/README.ru.md new file mode 100644 index 00000000000..d13a0477655 --- /dev/null +++ b/doc/README.ru.md @@ -0,0 +1,143 @@ +

+

NewPipe

+

Свободный и легковесный клиент потоковых сервисов для Android.

+ +

Скачать на F-Droid

+ +

+ + + + + + +

+
+

СкриншотыПоддерживаемые сервисыОписаниеВозможностиУстановка и обновленияУчастиеПожертвованиеЛицензия

+

СайтБлогЧЗВПресса

+
+ +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* + +ВНИМАНИЕ: ЭТО ПРИЛОЖЕНИЕ НАХОДИТСЯ В СТАДИИ БЕТА, ПОЭТОМУ ВЫ МОЖЕТЕ ОБНАРУЖИТЬ ОШИБКИ. ЕСЛИ ЭТО СЛУЧИТСЯ, ОТКРОЙТЕ ВОПРОС В НАШЕМ РЕПОЗИТОРИИ GITHUB, ЗАПОЛНЯ ЕГО ПО ШАБЛОНУ. + +РАЗМЕЩЕНИЕ NEWPIPE ИЛИ ЕГО ОТВЕТВЛЕНИЙ В МАГАЗИНЕ GOOGLE PLAY НАРУШАЕТ ИХ УСЛОВИЯ И ПОЛОЖЕНИЯ. + +## Скриншоты + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + + +### Поддерживаемые сервисы + +NewPipe на данный момент поддерживает эти сервисы: + + +* YouTube ([сайт](https://www.youtube.com/)) и YouTube Music ([сайт](https://music.youtube.com/)) ([Вики](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([сайт](https://joinpeertube.org/)) и все его вариации (откройте этот сайт, чтобы понять о чём мы!) ([Вики](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([сайт](https://bandcamp.com/)) ([Вики](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([сайт](https://soundcloud.com/)) ([Вики](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([сайт](https://media.ccc.de/)) ([Вики](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +Как видите, NewPipe поддерживает несколько видео- и аудиосервисов. Хотя все началось с YouTube, с годами люди добавляли новые сервисы, делая NewPipe все более и более универсальным! + +Частично из-за обстоятельств, а частично из-за своей популярности лучше всего из этих сервисов поддерживается YouTube. Если вы используете какие-либо из них или знакомы с ними, помогите нам улучшить их поддержку! Мы ищем сопровождающих для SoundCloud и PeerTube. + +Если вы хотите добавить новый сервис, сначала свяжитесь с нами! В нашей [документации](https://teamnewpipe.github.io/documentation/) содержится дополнительная информация о том, как можно добавить новый сервис в приложение и в [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). + +## Описание + +NewPipe работает, извлекая необходимые данные из официального API (например, PeerTube) сервиса, который вы используете. Если официальный API ограничен (например, YouTube) для наших целей или является проприетарным, приложение анализирует веб-сайт или использует вместо этого внутренний API. Это означает, что вам не нужна учетная запись в этих сервисах для использования NewPipe. + +Кроме того, поскольку это бесплатное и открытое программное обеспечение, ни приложение, ни Extractor не используют какие-либо проприетарные библиотеки или платформы, такие как Google Play Services. Это означает, что вы можете использовать NewPipe на устройствах или пользовательских ROM, на которых не установлены приложения Google. + +### Возможности + +* Смотрите видео с разрешением до 4K +* Слушайте аудио в фоновом режиме, загружая аудиопоток только для сохранения данных +* Режим всплывания (плавающий плеер, он же «Картинка в картинке») +* Смотрите прямые трансляции +* Показать/скрыть субтитры/скрытые титры +* Поиск видео и аудио (на YouTube вы также можете указать язык контента) +* Очередь видео (и, при желании, сохраняйте их как локальные плейлисты) +* Показать/скрыть общую информацию о видео (например, описание и теги) +* Показать/скрыть следующие/похожие видео +* Показать/скрыть комментарии +* Поиск видео, аудио, каналов, плейлистов и альбомов +* Просматривайте видео и аудио на канале +* Подписывайтесь на каналы (да, без входа в какой-либо аккаунт!) +* Получайте уведомления о новых видео с каналов, на которые вы подписаны +* Создавайте и редактируйте группы каналов (для более удобного просмотра и управления) +* Просматривайте ленты с видео, добавленными из ваших групп каналов +* Обзор и поиск истории просмотра +* Поиск и просмотр списков воспроизведения (это удаленные списки воспроизведения, что означает, что они получены из сервиса, которую вы просматриваете) +* Создавайте и редактируйте локальные списки воспроизведения (они создаются и сохраняются в приложении и не имеют ничего общего с каким-либо сервисом) +* Скачивайте видео/аудио/субтитры (скрытые титры) +* Откройте в Kodi +* Смотрите/блокируйте материалы с возрастным ограничением + +## Установка и обновления +Вы можете установить NewPipe одним из следующих способов: + 1. Добавьте наш пользовательский репозиторий в F-Droid и установите его оттуда. Инструкции находятся здесь: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Скачайте APK из [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) и установите его. + 3. Обновите через F-Droid. Это самый медленный способ получения обновлений, так как F-Droid должен распознавать изменения, создавать сам APK, подписывать его, а затем отправлять обновления пользователям. + 4. Создайте отладочный APK самостоятельно. Это самый быстрый способ получить новые функции на вашем устройстве, но он намного сложнее, поэтому мы рекомендуем использовать другие способы. + 5. Если вас интересует конкретная функция или исправление ошибки, предоставленные в пул реквесте в этом репозитории, вы также можете скачать файл APK из PR. Прочтите описание PR для получения инструкций. Отличительной особенностью APK-файлов из PR является то, что они устанавливаются рядом с официальным приложением, поэтому вам не нужно беспокоиться о потере ваших данных или о том, что возникнет путаница. + +Мы рекомендуем 1 способ для большинства пользователей. APK, установленные 1 или 2 способом, совместимы друг с другом (это означает, что если вы установили NewPipe с помощью способа 1 или 2, вы также можете обновить NewPipe с помощью другого), но не с теми APK, которые были установлены с помощью способа 3. Это потому, что для 1 и 2 способа используется один и тот же ключ подписи (наш), но для способа 3 используется другой ключ подписи (F-Droid). Создание отладочного APK с использованием 4 способа полностью исключает ключ. Ключи подписи помогают гарантировать, что пользователь не будет обманут установкой вредоносного обновления для приложения. При использовании 5 способа каждый APK подписывается разными случайными ключами, предоставляемыми GitHub Actions, поэтому вы даже не сможете его обновить. Вам придется делать резервную копию и восстанавливать данные приложения каждый раз, когда захотите использовать новый APK. + +Между тем, если вы хотите по какой-то причине сменить источник (например, основные функции NewPipe не работают, а для F-Droid ещё нет последнего обновления), мы рекомендуем выполнить следующую процедуру: +1. Создайте резервную копию своих данных через «Настройки» > «Контент» > «Экспортировать базу данных», чтобы сохранить историю, подписки и плейлисты. +2. Удалите NewPipe +3. Загрузите APK из нового источника и установите его. +4. Импортируйте данные из шага 1 через «Настройки» > «Содержимое» > «Импортировать базу данных». + +Примечание: когда вы импортируете базу данных в официальное приложение, убедитесь, что это именно та база данных, которую вы экспортировали _из_ официального приложения. Если вы импортируете базу данных, экспортированную из APK, отличного от официального приложения, это может привести к ошибке. Такое действие не поддерживается, и вы должны делать его только тогда, когда абсолютно уверены, что знаете, что делаете. + +## Участие +Если у вас есть идеи, переводы, изменения дизайна, очистка кода или даже серьезные изменения кода, помощь всегда приветствуется. Приложение становится всё лучше и лучше с каждым вкладом, независимо от того, большой он или маленький! Если вы хотите принять участие, ознакомьтесь с нашими [заметками об участии](.github/CONTRIBUTING.md). + + +Состояние перевода + + +## Пожертвование +Если вам нравится NewPipe, вы можете отправить пожертвование. Мы предпочитаем Liberapay, так как это открытая и некоммерческая платформа. Для получения дополнительной информации о пожертвовании NewPipe посетите наш [сайт](https://newpipe.net/donate). + + + + + + + + + + + + + + + + + +
LiberapayПосетите NewPipe на liberapay.comПожертвование через Liberapay
BitcoinQR-код Bitcoin16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
BountysourceПосетите NewPipe на bountysource.comПроверьте, сколько наград вы можете заработать.
+ +## Политика конфиденциальности + +Целью проекта 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.ru.html) + +NewPipe — это бесплатное программное обеспечение: вы можете использовать, изучать, делиться и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять ее в соответствии с условиями [Стандартной общественной лицензии GNU](https://www.gnu.org/licenses/gpl.html) (GPL-3.0), опубликованной Free Software Foundation, либо версии 3 Лицензии или (на ваш выбор) любая более поздняя версия. diff --git a/doc/README.ryu.md b/doc/README.ryu.md new file mode 100644 index 00000000000..f68645b07b0 --- /dev/null +++ b/doc/README.ryu.md @@ -0,0 +1,149 @@ +

+

NewPipe

+

じゆーいっしけいりょうなAndroidんきーストリーミングフロントエンド

+ +

Get it on F-Droid

+ +

+ + + + + + +

+
+

スクリーンショットしちめいちぬーインストールとぅこうしんこうきんちーふライセンス

+

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

+
+ +*ふかぬぎんぐっしゆむん: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [うちなーぐち](README.ryu.md)。* + +ちゅうい:くれーベータばんぬたみ、バグぬはっせいすがのうゆいがあいびーん。むしバグぬはっせいさーあい、GitHubぬリポジトリっしIssueふぃらちくぃみそーれー。 + +NewPipeうゆびいじりぬフォークGoogle Playストアんかいかんかいしーねー、Googleぬとぅいふぃちじょうきんぬいはんになります。 + + +## スクリーンショット + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.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/doc/README.zh_TW.md b/doc/README.zh_TW.md index 83267b65bfd..476bd9eb812 100644 --- a/doc/README.zh_TW.md +++ b/doc/README.zh_TW.md @@ -17,7 +17,7 @@

網站部落格FAQ媒體


-*其他語言: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](doc/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* 警告:這是測試版本,可能會發生錯誤。如果遇到錯誤,請在我們的 GITHUB REPO 開 ISSUE 回報。 @@ -26,18 +26,18 @@ ## 截圖 -[](../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/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

+[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## 說明 diff --git a/fastlane/metadata/android/ar/changelogs/65.txt b/fastlane/metadata/android/ar/changelogs/65.txt new file mode 100644 index 00000000000..15a3af72a55 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/65.txt @@ -0,0 +1,28 @@ +### تحسينات + +- تعطيل الرسوم المتحركة لرمز قائمة برجر#1486 +- التراجع عن حذف التنزيلات #1472 +- خيار التنزيل في قائمة المشاركة #1498 +- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 +- تصغير المشغل الرئيسي عند الخروج #1354 +- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 +- ExoPlayer 2.8.2 تحديث #1392 + - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع. + - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة +سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت =\\). + -دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية + وهو متاح مباشرة عند بدء التشغيل. + -عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل. + - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه +- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة + +### إصلاحات + +- يصلح #1440 تخطيط معلومات الفيديو المكسور #1491 +- عرض تاريخ الإصلاح #1497 + - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. + - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل. +- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640) +- إصلاح مشغل الفيديو الرئيسي #1509 + - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية. + - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق. diff --git a/fastlane/metadata/android/ar/changelogs/66.txt b/fastlane/metadata/android/ar/changelogs/66.txt new file mode 100644 index 00000000000..1261963079d --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/66.txt @@ -0,0 +1,35 @@ +# التغيير منv0.13.7 + +### ثابت +- إصلاح مشكلات عامل التصفية من v0.13.6 + +# التغيير من v0.13.6 + +### تحسينات + +- تعطيل الرسوم المتحركة لرمز قائمة برجر #1486 +- التراجع عن حذف التنزيلات #1472 +- خيار التنزيل في قائمة المشاركة #1498 +- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 +- تصغير المشغل الرئيسي عند الخروج #1354 +- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 +- ExoPlayer 2.8.2 تحديث #1392 + - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع. + - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت +=\\). + - دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية و + متاح مباشرة عند بدء التشغيل. + - عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل. + - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه +- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة + +### إصلاحات + +- الإصلاح #1440 تخطيط معلومات الفيديو المكسور#1491 +- عرض تاريخ الإصلاح #1497 + - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. + - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل. +- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640) +- إصلاح مشغل الفيديو الرئيسي #1509 + - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية. + - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق. diff --git a/fastlane/metadata/android/ar/changelogs/68.txt b/fastlane/metadata/android/ar/changelogs/68.txt new file mode 100644 index 00000000000..4d5980643e4 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/68.txt @@ -0,0 +1,20 @@ +# تغييرات للإصدار 0.14.1 + +### مُثَبَّت +- فشل ثابت في فك تشفير عنوان url للفيديو # 1659 +- رابط الوصف الثابت غير مستخرج جيدًا # 1657 + +# تغييرات للإصدار 0.14.0 + +### جديد +- تصميم درج جديد رقم 1461 +- صفحة أمامية جديدة قابلة للتخصيص # 1461 + +### تحسينات +- إعادة صياغة ضوابط الإيماءات # 1604 +- طريقة جديدة لإغلاق المشغل المنبثق # 1597 + +### مُثَبَّت +- إصلاح الخطأ عندما لا يتوفر عدد الاشتراكات. يغلق # 1649. + - اعرض "عدد المشتركين غير متوفر" في تلك الحالات + - إصلاح أي شيء يظهر استثناء مشغلات التقرير diff --git a/fastlane/metadata/android/ar/changelogs/69.txt b/fastlane/metadata/android/ar/changelogs/69.txt new file mode 100644 index 00000000000..4d22ab7c612 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/69.txt @@ -0,0 +1,11 @@ +### جديد +- النقر لفترة طويلة حذف والمشاركة في الاشتراكات # 1516 +- واجهة مستخدم الكمبيوتر اللوحي وتخطيط قائمة الشبكة # 1617 + +### إصلاحات +- إصلاح تحليل الوقت ل. ، لذلك يمكن استخدام NewPipe في فنلندا +- إصلاح عدد الاشتراكات +- إضافة إذن خدمة المقدمة لأجهزة API 28+ # 1830 + +### البق المعروف +- لا يمكن حفظ حالة التشغيل على Android P diff --git a/fastlane/metadata/android/ar/changelogs/70.txt b/fastlane/metadata/android/ar/changelogs/70.txt new file mode 100644 index 00000000000..32d1edd23b1 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/70.txt @@ -0,0 +1,9 @@ +تنبيه: ربما يكون هذا الإصدار عبارة عن bugfest ، تماما مثل الإصدار الأخير. ولكن بسبب الإغلاق الكامل منذ 17. نسخة مكسورة أفضل من أي إصدار. صح؟ ¯\_(ツ)_/¯ + +### التحسينات +* يمكن الآن فتح الملفات التي تم تنزيلها بنقرة واحدة # 1879 +* إسقاط الدعم لالروبوت 4.1 - 4.3 # 1884 +* إزالة اللاعب القديم # 1884 +* المعالجة اللاحقة للتنزيلات وتنفيذ الميزات المفقودة # 1759 بواسطة @kapodamy + * البنية التحتية لما بعد المعالجة + * التعامل مع الخطأ السليم "البنية التحتية" (للتنزيل) diff --git a/fastlane/metadata/android/ar/changelogs/740.txt b/fastlane/metadata/android/ar/changelogs/740.txt new file mode 100644 index 00000000000..d4a619611e6 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/740.txt @@ -0,0 +1,11 @@ +

التحسينات

+
    +
  • جعل الروابط في التعليقات قابلة للنقر ، وزيادة حجم النص
  • +
  • السعي عند النقر فوق روابط الطابع الزمني في التعليقات
  • +
  • إظهار علامة التبويب المفضلة استنادا إلى الحالة المحددة مؤخرا
  • +
  • أضف قائمة تشغيل إلى قائمة الانتظار عند النقر لفترة طويلة على ' الخلفية ' في نافذة قائمة التشغيل
  • +
  • البحث عن نص مشترك عندما لا يكون عنوان URL
  • +
+

ثابت

+
    +
  • تم إصلاح التمرير مع التعليقات والتدفقات ذات الصلة معطلة
  • diff --git a/fastlane/metadata/android/ar/changelogs/750.txt b/fastlane/metadata/android/ar/changelogs/750.txt new file mode 100644 index 00000000000..3d8f39a356d --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/750.txt @@ -0,0 +1,16 @@ +الجديد +استئناف التشغيل # 2288 +• استئناف التدفقات حيث توقفت في المرة الأخيرة +تحسينات التنزيل # 2149 +• استخدم إطار الوصول إلى التخزين لتخزين التنزيلات على بطاقات SD الخارجية +• mp4 muxer جديد +• اختياريا تغيير دليل التنزيل قبل بدء التنزيل +• احترام الشبكات المقننة + +تحسين +• تمت إزالة سلاسل جيما # 2295 +• التعامل مع تغييرات الدوران (التلقائي) أثناء دورة حياة النشاط # 2444 +• جعل قوائم الضغط الطويل متسقة # 2368 + +ثابت +• تم إصلاح اسم مسار الترجمة المحدد الذي لم يتم عرضه # 2394 diff --git a/fastlane/metadata/android/ar/changelogs/760.txt b/fastlane/metadata/android/ar/changelogs/760.txt new file mode 100644 index 00000000000..86f6a82739a --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/760.txt @@ -0,0 +1,17 @@ +التغييرات في 0.17.1 + +الجديد +• توطين التايلاندية + +تحسين +• إضافة بدء اللعب هنا العمل في قوائم الضغط لفترة طويلة لقوائم التشغيل مرة أخرى # 2518 +• إضافة مفتاح ل SAF / منتقي الملفات القديم # 2521 + +تحسين +• تمت إزالة سلاسل جيما # 2295 +• التعامل مع تغييرات التدوير +• جعل قوائم الضغط الطويل متسقة # 2368 + +ثابت +• [SoundCloud] تعطل ثابت عند تحميل قوائم التشغيل TeamNewPipe / NewPipeExtractor # 170 +• [يوتيوب] لا يمكن تحديد المدة الثابتة TeamNewPipe / NewPipeExtractor # 177 diff --git a/fastlane/metadata/android/ar/changelogs/780.txt b/fastlane/metadata/android/ar/changelogs/780.txt new file mode 100644 index 00000000000..4932a5d8047 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/780.txt @@ -0,0 +1,12 @@ +تغييرات في 0.17.3 + +محسّن +• تمت إضافة خيار لمسح حالات التشغيل #2550 +• إظهار الدلائل المخفية في منتقي الملفات #2591 +• دعم عناوين URL من مثيلات "invidio.us" ليتم فتحها باستخدام NewPipe #2488 +• أضف دعمًا لـ `music.youtube.com` URLs TeamNewPipe/NewPipeمستخرج#194 + +ثابت +• [موقع YouTube] ثابت 'java.lang.IllegalArgumentException #192 +• [YouTube] البث المباشر الثابت لا يعمل TeamNewPipe/NewPipeExtractor#195 +• تم إصلاح مشكلة الأداء في أندرويد عند تنزيل البث #2592 diff --git a/fastlane/metadata/android/ar/changelogs/790.txt b/fastlane/metadata/android/ar/changelogs/790.txt new file mode 100644 index 00000000000..4e6aed24c9e --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/790.txt @@ -0,0 +1,14 @@ +محسّن +• أضف المزيد من العناوين لتحسين إمكانية الوصول للمكفوفين #2655 +• اجعل لغة إعداد مجلد التنزيل أكثر اتساقًا وأقل غموضًا #2637 + +ثابت +• تحقق مما إذا تم تنزيل آخر بايت في الكتلة #2646 +• التمرير الثابت في جزء تفاصيل الفيديو #2672 +• إزالة الرسوم المتحركة مربع مسح البحث المزدوج إلى واحد #2695 +• [SoundCloud] إصلاح استخراج client_id #2745 + +تطوير +• أضف التبعيات المفقودة الموروثة من NewPipeExtractor إلى NewPipe #2535 +• الانتقال إلى AndroidX #2685 +• تحديث ل ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/ar/changelogs/800.txt b/fastlane/metadata/android/ar/changelogs/800.txt new file mode 100644 index 00000000000..9a57cae8f23 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/800.txt @@ -0,0 +1,13 @@ +الجديد +• دعم PeerTube بدون P2P (# 2201) [بيتا]: + ◦ مشاهدة وتنزيل مقاطع الفيديو من مثيلات PeerTube + ◦ قد تكون هناك مشاكل في مصافحة SSL على Android 4.4 و 7.1 عند الوصول إلى حالات معينة مما يؤدي إلى حدوث خطأ في الشبكة. + +• تنزيل (# 2679): + ◦ حساب تحميل ETA + ◦ قم بتنزيل التأليف (ملفات webm) بتنسيق ogg + ◦ استعادة روابط التنزيل منتهية الصلاحية لاستئناف التنزيلات بعد توقف طويل + +تطور +• تحديث ExoPlayer إلى 2.10.8 # 2791 ، # 2816 +• قم بتحديث Gradle إلى 3.5.1 وإضافة دعم Kotlin # 2714 diff --git a/fastlane/metadata/android/ar/changelogs/810.txt b/fastlane/metadata/android/ar/changelogs/810.txt new file mode 100644 index 00000000000..e8621f28202 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/810.txt @@ -0,0 +1,12 @@ +الجديد +• إظهار الصورة المصغرة للفيديو على شاشة القفل عند اللعب في الخلفية + +تحسين +• إضافة قائمة تشغيل محلية إلى قائمة الانتظار عند الضغط لفترة طويلة على زر الخلفية / النافذة المنبثقة +• اجعل علامات تبويب الصفحة الرئيسية قابلة للتمرير وإخفائها عندما يكون هناك علامة تبويب واحدة فقط +• إضافة زر لحذف الملفات التي تم تنزيلها أو تنزيل السجل في "التنزيلات" +• [يوتيوب] إضافة دعم إلى /c/shortened_url روابط القنوات + +ثابت +• ترحيل نتائج البحث الثابتة +• [يوتيوب] ثابت التبديل على فارغة تسبب NPE diff --git a/fastlane/metadata/android/ar/changelogs/967.txt b/fastlane/metadata/android/ar/changelogs/967.txt new file mode 100644 index 00000000000..1c66d0bff9b --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/967.txt @@ -0,0 +1 @@ +تم إصلاح YouTube لا يعمل بشكل صحيح في الاتحاد الأوروبي. كان هذا بسبب نظام جديد لملفات تعريف الارتباط والموافقة على الخصوصية يتطلب من NewPipe تعيين ملف تعريف ارتباط الموافقة. diff --git a/fastlane/metadata/android/ar/changelogs/968.txt b/fastlane/metadata/android/ar/changelogs/968.txt new file mode 100644 index 00000000000..ea5588429d6 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/968.txt @@ -0,0 +1,7 @@ +تمت إضافة خيار تفاصيل القناة إلى قائمة الضغط لفترة طويلة. +تمت إضافة وظيفة لإعادة تسمية اسم قائمة التشغيل من واجهة قائمة التشغيل. +السماح للمستخدم بالتوقف مؤقتا أثناء التخزين المؤقت للفيديو. +مصقول موضوع أبيض. +إصلاح الخطوط المتداخلة عند استخدام حجم خط أكبر. +تم إصلاح أي فيديو على أجهزة Formuler و Zephier. +إصلاح مختلف الأعطال. diff --git a/fastlane/metadata/android/ar/changelogs/969.txt b/fastlane/metadata/android/ar/changelogs/969.txt new file mode 100644 index 00000000000..59b35133823 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/969.txt @@ -0,0 +1,8 @@ +• السماح بالتثبيت على وحدة التخزين الخارجية +• [Bandcamp] تمت إضافة دعم لعرض التعليقات الثلاثة الأولى على البث +• إظهار نخب "بدأ التنزيل" فقط عند بدء التنزيل +• لا تقم بتعيين ملف تعريف ارتباط reCaptcha عندما لا يكون هناك ملف تعريف ارتباط مخزن +• [لاعب] تحسين أداء ذاكرة التخزين المؤقت +• [لاعب] لاعب ثابت لا يلعب تلقائيا +• استبعاد Snackbars السابقة عند حذف التنزيلات +• تم إصلاح محاولة حذف كائن غير موجود في القائمة diff --git a/fastlane/metadata/android/ar/changelogs/970.txt b/fastlane/metadata/android/ar/changelogs/970.txt new file mode 100644 index 00000000000..14b0a2b7fe7 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/970.txt @@ -0,0 +1,11 @@ +الجديد +• إظهار البيانات الوصفية للمحتوى (العلامات ، الفئات ، الترخيص ، ...) أسفل الوصف +• تمت إضافة خيار "إظهار تفاصيل القناة" في قوائم التشغيل البعيدة (غير المحلية) +• تمت إضافة خيار "فتح في المتصفح" إلى قائمة الضغط لفترة طويلة + +ثابت +• تعطل دوران ثابت على صفحة تفاصيل الفيديو +• ثابت زر "اللعب مع Kodi" في لاعب يطالب دائما لتثبيت كور +• إعداد ثابت ومحسن لمسارات الاستيراد والتصدير +• [يوتيوب] تعليق ثابت مثل العد +وأكثر من ذلك بكثير diff --git a/fastlane/metadata/android/ar/changelogs/971.txt b/fastlane/metadata/android/ar/changelogs/971.txt new file mode 100644 index 00000000000..8784d8ac842 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/971.txt @@ -0,0 +1,3 @@ +الإصلاح العاجل +• زيادة المخزن المؤقت للتشغيل بعد المخزن المؤقت +• تعطل ثابت على الأجهزة اللوحية وأجهزة التلفزيون عند النقر على أيقونة قائمة انتظار التشغيل في المشغل diff --git a/fastlane/metadata/android/ar/changelogs/972.txt b/fastlane/metadata/android/ar/changelogs/972.txt new file mode 100644 index 00000000000..ff0cb549a82 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/972.txt @@ -0,0 +1,14 @@ +الجديد +التعرف على الطوابع الزمنية وعلامات التصنيف في الوصف +تمت إضافة إعداد وضع الكمبيوتر اللوحي اليدوي +تمت إضافة القدرة على إخفاء العناصر التي تم تشغيلها في موجز ويب + +تحسين +دعم إطار الوصول إلى التخزين بشكل صحيح +معالجة أفضل للأخطاء في القنوات غير المتاحة والتي تم إنهاؤها +تعرض ورقة مشاركة Android لمستخدمي Android 10+ الآن عنوان المحتوى. +تم تحديث حالات Invidious ودعم الروابط المنقولة بالأنابيب. + +ثابت +[يوتيوب] المحتوى المقيد على فئات عمرية معينة +منع تسرب استثناء النافذة عند فتح مربع حوار الاختيار diff --git a/fastlane/metadata/android/ar/changelogs/973.txt b/fastlane/metadata/android/ar/changelogs/973.txt new file mode 100644 index 00000000000..990eaf015be --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/973.txt @@ -0,0 +1,4 @@ +الإصلاح العاجل +• إصلاح الصور المصغرة والعناوين التي يتم قصها في تخطيط الشبكة ، بسبب الحساب الخاطئ لعدد مقاطع الفيديو التي يمكن وضعها في صف واحد +• إصلاح مربع حوار التنزيل الذي يختفي دون القيام بأي شيء إذا تم فتحه من قائمة المشاركة +• تحديث مكتبة تتعلق بفتح الأنشطة الخارجية مثل منتقي ملفات إطار الوصول إلى التخزين diff --git a/fastlane/metadata/android/ar/changelogs/974.txt b/fastlane/metadata/android/ar/changelogs/974.txt new file mode 100644 index 00000000000..e440a56a5ef --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/974.txt @@ -0,0 +1,5 @@ +الإصلاح العاجل +• إصلاح مشكلات التخزين المؤقت الناتجة عن اختناق YouTube +• إصلاح استخراج تعليقات YouTube وأعطالها مع التعليقات المعطلة +• إصلاح البحث عن الموسيقى يوتيوب +• إصلاح البث المباشر PeerTube diff --git a/fastlane/metadata/android/ar/changelogs/975.txt b/fastlane/metadata/android/ar/changelogs/975.txt new file mode 100644 index 00000000000..6a57c8c1982 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/975.txt @@ -0,0 +1,16 @@ +الجديد +• إظهار معاينة الصورة المصغرة أثناء البحث +• كشف التعليقات المعطلة +• السماح بوضع علامة على عنصر تغذية على أنه تمت مشاهدته +• إظهار قلوب التعليق + +تحسين +• تحسين البيانات الوصفية وتخطيط العلامات +• تطبيق لون الخدمة على مكونات واجهة المستخدم + +ثابت +• إصلاح الصورة المصغرة في مشغل صغير +• إصلاح التخزين المؤقت الذي لا نهاية له على عناصر قائمة الانتظار المكررة +• بعض إصلاحات اللاعب مثل الدوران والإغلاق الأسرع +• تعطيل النقرات أثناء تحديث الخلاصة +• إصلاح بعض أعطال التنزيل diff --git a/fastlane/metadata/android/ar/changelogs/976.txt b/fastlane/metadata/android/ar/changelogs/976.txt new file mode 100644 index 00000000000..72b09412004 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/976.txt @@ -0,0 +1,10 @@ +• خيار مضاف لفتح المشغل مباشرة في وضع ملء الشاشة +• السماح باختيار أنواع اقتراحات البحث التي سيتم عرضها +• المظهر الداكن الآن أغمق + تمت إضافة شاشة البداية الداكنة +• منتقي ملفات محسّن لإخفاء الملفات غير المرغوب فيها +• إصلاح استيراد اشتراكات YouTube +• إعادة تشغيل تيار يتطلب النقر على زر إعادة التشغيل مرة أخرى +• إصلاح إغلاق الجلسة الصوتية +• [Android TV] يقفز شريط البحث الطويل الثابت عند استخدام DPad + +لمشاهدة المزيد من التغييرات ، قم بعرض سجل التغيير (ومنشور المدونة) من علامة التبويب الروابط أدناه. diff --git a/fastlane/metadata/android/ar/changelogs/977.txt b/fastlane/metadata/android/ar/changelogs/977.txt new file mode 100644 index 00000000000..f2b4608be04 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/977.txt @@ -0,0 +1,10 @@ +• تمت إضافة زر "تشغيل التالي" إلى قائمة الضغط لفترة طويلة +• تمت إضافة بادئة مسار قصير على YouTube إلى مرشح الهدف +• استيراد الإعدادات الثابتة +• تبديل موضع شريط البحث مع أزرار المشغل في شاشة قائمة الانتظار +• إصلاحات مختلفة متعلقة بـ MediasessionManager +• لم يكتمل شريط البحث الثابت بعد انتهاء الفيديو +• تم تعطيل نفق الوسائط على RealtekATV +• توسيع منطقة أزرار المشغل المصغرة القابلة للنقر + +لمشاهدة المزيد من التغييرات ، قم بعرض سجل التغيير (ومنشور المدونة) من علامة التبويب الروابط أدناه. diff --git a/fastlane/metadata/android/ar/changelogs/978.txt b/fastlane/metadata/android/ar/changelogs/978.txt new file mode 100644 index 00000000000..fd213d985b4 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/978.txt @@ -0,0 +1 @@ +تم إصلاح تنفيذ الشيك لإصدار NewPipe جديد. تم تنفيذ هذا الفحص في وقت مبكر جدا في بعض الأحيان وبالتالي أدى إلى تعطل التطبيق. يجب إصلاح ذلك الآن. diff --git a/fastlane/metadata/android/ar/changelogs/980.txt b/fastlane/metadata/android/ar/changelogs/980.txt new file mode 100644 index 00000000000..84ab4ff82bc --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/980.txt @@ -0,0 +1,13 @@ +الجديد +• تمت إضافة خيار "إضافة إلى قائمة التشغيل" لمشاركة القائمة +• إضافة دعم لروابط y2u.be و PeerTube القصيرة + +تحسين +• جعل التحكم في سرعة التشغيل أكثر إحكاما +• تغذية يسلط الضوء على عناصر جديدة الآن +• يتم الآن حفظ خيار "إظهار العناصر التي تمت مشاهدتها" في الخلاصة + +ثابت +• إصلاح يوتيوب يحب ويكره استخراج +• إعادة التشغيل التلقائي الثابت بعد العودة من الخلفية +وأكثر من ذلك بكثير diff --git a/fastlane/metadata/android/ar/changelogs/981.txt b/fastlane/metadata/android/ar/changelogs/981.txt new file mode 100644 index 00000000000..a21fd65e968 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/981.txt @@ -0,0 +1,2 @@ +تمت إزالة دعم MediaParser لإصلاح استئناف التشغيل الفاشل بعد التخزين المؤقت على Android 11+. +نفق وسائط معطل على QM16XE من Philips لإصلاح مشاكل التشغيل. diff --git a/fastlane/metadata/android/ar/changelogs/982.txt b/fastlane/metadata/android/ar/changelogs/982.txt new file mode 100644 index 00000000000..562f169445a --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/982.txt @@ -0,0 +1 @@ +تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق diff --git a/fastlane/metadata/android/ar/changelogs/983.txt b/fastlane/metadata/android/ar/changelogs/983.txt new file mode 100644 index 00000000000..8b220f42183 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/983.txt @@ -0,0 +1,9 @@ +إضافة واجهة مستخدم وسلوك جديدين للنقر المزدوج للبحث +جعل الإعدادات قابلة للبحث +تمييز التعليقات المثبتة على هذا النحو +إضافة دعم مفتوح مع التطبيق لمثيل PeerTube الخاص ب FSFE +إضافة إشعارات بالخطأ +إصلاح إعادة تشغيل عنصر قائمة الانتظار الأول عند تغيير اللاعب +انتظر لفترة أطول عند التخزين المؤقت أثناء البث المباشر قبل الفشل +إصلاح ترتيب نتائج البحث المحلية +إصلاح حقول العناصر الفارغة في قائمة انتظار التشغيل diff --git a/fastlane/metadata/android/ar/changelogs/984.txt b/fastlane/metadata/android/ar/changelogs/984.txt new file mode 100644 index 00000000000..32c9c67578c --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/984.txt @@ -0,0 +1,7 @@ +قم بتحميل عناصر أولية كافية في القوائم لملء الشاشة بأكملها ولإصلاح التمرير على الأجهزة اللوحية وأجهزة التلفزيون +إصلاح الأعطال العشوائية أثناء التمرير عبر القوائم +اجعل قوس تراكب البحث السريع للاعب يمر تحت واجهة مستخدم النظام +التراجع عن التغييرات إلى القواطع عند اللعب في نافذة متعددة ، مما يتسبب في تراجع المشغل في غير محله على بعض الهواتف +زيادة برنامج التنمية المستدامة من 30 إلى 31 +تحديث مكتبة الإبلاغ عن الأخطاء +إعادة بناء بعض التعليمات البرمجية في المشغل diff --git a/fastlane/metadata/android/ar/changelogs/985.txt b/fastlane/metadata/android/ar/changelogs/985.txt new file mode 100644 index 00000000000..562f169445a --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/985.txt @@ -0,0 +1 @@ +تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق diff --git a/fastlane/metadata/android/ar/changelogs/986.txt b/fastlane/metadata/android/ar/changelogs/986.txt new file mode 100644 index 00000000000..96abeeaa534 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/986.txt @@ -0,0 +1,16 @@ +الجديد +• إخطارات للتيارات الجديدة +• الانتقال السلس بين الخلفية ومشغلات الفيديو +• تغيير درجة الصوت بنصف نغمة +• إلحاق قائمة انتظار اللاعب الرئيسي بقائمة تشغيل + +تحسين +• تذكر حجم خطوة السرعة / الملعب +• تخفيف التخزين المؤقت الطويل الأولي في مشغل الفيديو +• تحسين واجهة مستخدم المشغل لتلفزيون Android +• تأكيد قبل حذف جميع الملفات التي تم تنزيلها + +ثابت +• إصلاح زر الوسائط لا يخفي عناصر تحكم اللاعب +• إصلاح إعادة تعيين التشغيل عند تغيير نوع اللاعب +• إصلاح تدوير مربع حوار قائمة التشغيل diff --git a/fastlane/metadata/android/ar/changelogs/987.txt b/fastlane/metadata/android/ar/changelogs/987.txt new file mode 100644 index 00000000000..3825106c408 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/987.txt @@ -0,0 +1,12 @@ +الجديد +• دعم طرق التسليم بخلاف HTTP التقدمي: وقت تحميل تشغيل أسرع ، وإصلاحات ل PeerTube و SoundCloud ، وتشغيل البث المباشر على YouTube الذي انتهى مؤخرا +• إضافة زر لإضافة قائمة تشغيل عن بعد إلى قائمة تشغيل محلية +• معاينة الصورة في ورقة مشاركة Android 10+ + +تحسين +• تحسين مربع حوار معلمات التشغيل +• نقل أزرار استيراد / تصدير الاشتراك إلى قائمة ثلاثية النقاط + +ثابت +• إصلاح إزالة مقاطع الفيديو التي تمت مشاهدتها بالكامل من قائمة التشغيل +• إصلاح موضوع قائمة المشاركة وإدخال "إضافة إلى قائمة التشغيل" diff --git a/fastlane/metadata/android/ar/changelogs/988.txt b/fastlane/metadata/android/ar/changelogs/988.txt new file mode 100644 index 00000000000..98f3711ae3b --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/988.txt @@ -0,0 +1,2 @@ +[يوتيوب] إصلاح الخطأ "تعذر الحصول على أي بث" عند محاولة تشغيل أي فيديو +[يوتيوب] إصلاح الرسالة "المحتوى التالي غير متوفر في هذا التطبيق." تظهر بدلا من الفيديو المطلوب diff --git a/fastlane/metadata/android/ar/changelogs/989.txt b/fastlane/metadata/android/ar/changelogs/989.txt new file mode 100644 index 00000000000..5421df78d3e --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/989.txt @@ -0,0 +1,3 @@ +• [يوتيوب] إصلاح التحميل اللانهائي عند محاولة تشغيل أي فيديو +• [يوتيوب] إصلاح الاختناق على بعض مقاطع الفيديو +• قم بترقية مكتبة jsoup إلى 1.15.3 ، والتي تتضمن إصلاحا أمنيا diff --git a/fastlane/metadata/android/ar/changelogs/990.txt b/fastlane/metadata/android/ar/changelogs/990.txt new file mode 100644 index 00000000000..efd6afbae64 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/990.txt @@ -0,0 +1,13 @@ +يسقط هذا الإصدار الدعم لنظام Android 4.4 KitKat ، والآن الحد الأدنى للإصدار هو Android 5 Lollipop! + +الجديد +• إخفاء مقاطع الفيديو المستقبلية في الخلاصة +• مشاركة قوائم التشغيل المحلية + +تحسين +• إعادة بناء رمز اللاعب إلى مكونات صغيرة: ذاكرة وصول عشوائي أقل مستخدمة ، أخطاء أقل +• تحسين وضع مقياس الصور المصغرة + +ثابت +• إصلاح المشكلات المختلفة المتعلقة بإخطار اللاعب: معلومات الوسائط القديمة / المفقودة ، الصورة المصغرة المشوهة +• إصلاح ملء الشاشة باستخدام 1/4 من الشاشة diff --git a/fastlane/metadata/android/ar/changelogs/992.txt b/fastlane/metadata/android/ar/changelogs/992.txt new file mode 100644 index 00000000000..4c5b06ceee1 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/992.txt @@ -0,0 +1,17 @@ +الجديد +• عدد المشتركين في تفاصيل الفيديو +• تحميل من قائمة الانتظار +• تعيين صورة مصغرة لقائمة التشغيل بشكل دائم +• هاشتاغ وروابط الضغط لفترة طويلة +• وضع عرض البطاقة + +تحسين +• زر إغلاق مشغل صغير أكبر +• تصغير حجم الصورة المصغرة بشكل أكثر سلاسة +• الهدف الروبوت 13 (API 33) +• السعي لم يعد يوقف اللاعب مؤقتا + +ثابت +• إصلاح تراكب على DeX / الماوس +• السماح لمشغل الخلفية بدون تدفقات صوتية منفصلة +• إصلاحات يوتيوب مختلفة وأكثر من ذلك … diff --git a/fastlane/metadata/android/ar/changelogs/993.txt b/fastlane/metadata/android/ar/changelogs/993.txt new file mode 100644 index 00000000000..d6dda41a140 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/993.txt @@ -0,0 +1,12 @@ +الجديد +• إضافة تحذير عند إضافة مكررات قائمة التشغيل وإضافة زر لإزالتها +• السماح بتجاهل أزرار الأجهزة +• السماح بإخفاء مقاطع الفيديو التي تمت مشاهدتها جزئيا في الخلاصة + +تحسين +• استخدم المزيد من أعمدة الشبكة على الشاشات الكبيرة +• جعل مؤشرات التقدم متسقة مع الإعدادات + +ثابت +• إصلاح فتح عناوين URL للمتصفح والتنزيلات والمشغل الخارجي على Android 11+ +• إصلاح التفاعل مع ملء الشاشة الذي يتطلب نقرتين على اجهزة MIUI diff --git a/fastlane/metadata/android/ar/changelogs/994.txt b/fastlane/metadata/android/ar/changelogs/994.txt new file mode 100644 index 00000000000..dc72471cd3a --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/994.txt @@ -0,0 +1,15 @@ +الجديد +• دعم مسارات / لغات صوتية متعددة +• السماح بإعداد إيماءات مستوى الصوت والسطوع على أي جانب من الشاشة +• دعم لعرض علامات التبويب الرئيسية في الجزء السفلي من الشاشة + +تحسين +• [Bandcamp] التعامل مع المسارات خلف جدار الدفع + +ثابت +• [يوتيوب] 403 أخطاء HTTP للتدفقات +• مشغل أسود عند التبديل إلى المشغل الرئيسي من عرض قائمة التشغيل +• تسرب ذاكرة لخدمة المشغل +• تم تبديل [PeerTube] رافع الصور الرمزية والقناة الفرعية + +وأكثر من ذلك diff --git a/fastlane/metadata/android/az/full_description.txt b/fastlane/metadata/android/az/full_description.txt index 2843f8abeee..50efa3929db 100644 --- a/fastlane/metadata/android/az/full_description.txt +++ b/fastlane/metadata/android/az/full_description.txt @@ -1 +1 @@ -Newpipe hər hansı Google çərçivə kitabxanası və ya Youtube API-si istifadə etmir. O sadəcə zəruri məlumatları toplamaq məqsədilə veb-saytı təhlil edir. Buna görə də bu tətbiqetmə Google Xidmətləri quraşdırılmamış cihazlarda istifadə edilə bilər. Həmçinin NewPipe istifadə etməyiniz üçün YouTube hesabına ehtiyacınız yoxdur və o, azad və açıq qaynaqlı tətbiqdir. +NewPipe hər hansı Google quruluş kitabxanası və ya Youtube API istifadə etmir. O yalnız ehtiyac olan məlumatları toplamaq üçün veb-saytı təhlil edir. Bu səbəbdən, bu tətbiq Google Xidmətləri quraşdırılmamış cihazlarda istifadə edilə biləndir. Həmçinin NewPipe istifadə etmək üçün YouTube hesabına ehtiyacınız yoxdur və o, azad və açıq qaynaqlı tətbiqdir. diff --git a/fastlane/metadata/android/be/changelogs/65.txt b/fastlane/metadata/android/be/changelogs/65.txt new file mode 100644 index 00000000000..e50dcef7778 --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/65.txt @@ -0,0 +1,26 @@ +### Выпраўлена + +- Выключэнне анімацыі меню атладчыка #1486 +- адмяніць выдаленне усталёўкі #1472 +- Опцыя "Усталяваць у меню падзяліцца #1498 +- Дададзена опцыя падзяліцца да меню доўгага касання #1454 +- Мінімізаваць галоўны прайгравальнік пры выхадзе #1354 +- Абноўлена версія бібліятэкі і выпраўлены бэкап базы дадзеных #1510 +- ExoPlayer 2.8.2 Абнаўленне #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/bm/short_description.txt b/fastlane/metadata/android/bm/short_description.txt new file mode 100644 index 00000000000..918d3ef3eab --- /dev/null +++ b/fastlane/metadata/android/bm/short_description.txt @@ -0,0 +1 @@ +ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߜ߲ߘߙߏߌߘ ߞߊ߲߬. diff --git a/fastlane/metadata/android/cs/short_description.txt b/fastlane/metadata/android/cs/short_description.txt index 36dc2a0e67b..597347b24f0 100644 --- a/fastlane/metadata/android/cs/short_description.txt +++ b/fastlane/metadata/android/cs/short_description.txt @@ -1 +1 @@ -Svobodný a nenáročný YouTube přehrávač for Android. +Svobodný a nenáročný YouTube frontend pro Android. diff --git a/fastlane/metadata/android/de/changelogs/65.txt b/fastlane/metadata/android/de/changelogs/65.txt new file mode 100644 index 00000000000..8190e9ae9f8 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/65.txt @@ -0,0 +1,10 @@ +Verbesserungen +-Menü Animation deaktiviert #1486 +-Löschen von Downloads rückgängig machen #1472 +-Option zum Downloaden im Austausch Menu #1498 +-hinzufügen der Teilen Funktion im Menü #1454 +-Minimieren der Wiedergabe beim beenden #1354 +-Datenbank Versions Aktualisierung und Datenbestand Wiederherstellung #1510 +-ExoPlayer 2.8.2 aktualisiert #1392 +-Überarbeitung der Wiedergabegeschwindigkeitskolntrolle um Änderungen besser zu unterstützen +-hinzufügen der Möglichkeit Stille zu überspringen(Hilfreich bei Audiobücher und einigen Musik Arten) unterstützt dadurch eine nahtlose Wiedergabe (nicht so toll bei Liedern in denen es auch Stille Passagen gibt) diff --git a/fastlane/metadata/android/de/changelogs/940.txt b/fastlane/metadata/android/de/changelogs/940.txt new file mode 100644 index 00000000000..3cbf73516fb --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/940.txt @@ -0,0 +1,13 @@ +Neu +- Unterstützung für SoundCloud-Kommentare hinzufügen +- YouTube-Einstellung für eingeschränkten Modus hinzufügen +- Details des übergeordneten PeerTube-Kanals anzeigen + +Verbessert +- Anzeige der Kore-Schaltfläche nur für unterstützte Dienste +- Blockieren von Player-Gesten, die in der Navigationsleiste oder Statusleiste beginnen +- Ändern der Hintergrundfarbe der Schaltflächen Wiederholen und Abonnieren, basierend auf der Farbe des Dienstes + +Behoben +- Einfrieren des Download-Dialogs behoben +... diff --git a/fastlane/metadata/android/de/changelogs/951.txt b/fastlane/metadata/android/de/changelogs/951.txt new file mode 100644 index 00000000000..7c6d939820b --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/951.txt @@ -0,0 +1,11 @@ +Neu +- Suche nach Abonnements im Feed-Gruppen-Dialog hinzufügen +- Filter zum Feed-Gruppen-Dialog hinzufügen, um nur nicht gruppierte Abonnements anzuzeigen +- Registerkarte Wiedergabeliste zur Hauptseite hinzufügen +- Schneller Vorlauf/Rücklauf im Hintergrund/Pop-up-Player-Warteschlange +- Suchvorschlag anzeigen: meinten Sie & Ergebnis anzeigen für + +Verbessert +- Anwendungsmetadaten nicht mehr in gemuxte Dateien schreiben +- Fehlerhafte Streams nicht aus der Warteschlange entfernen +... diff --git a/fastlane/metadata/android/de/changelogs/964.txt b/fastlane/metadata/android/de/changelogs/964.txt new file mode 100644 index 00000000000..89c726ac805 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/964.txt @@ -0,0 +1,7 @@ +- Unterstützung für Kapitel in der Playersteuerung hinzugefügt +- [PeerTube] Sepia-Suche hinzugefügt +- Schaltfläche zum Teilen in der Video-Detailansicht wieder hinzugefügt und Stream-Beschreibung in das Tab-Layout verschoben +- Deaktiviert die Wiederherstellung der Helligkeit, wenn die Helligkeitsgeste deaktiviert ist +- Listenelement zum Abspielen von Videos auf Kodi hinzugefügt +- Absturz behoben, wenn auf manchen Geräten kein Standardbrowser eingestellt ist, und Freigabedialoge verbessert +... diff --git a/fastlane/metadata/android/de/changelogs/972.txt b/fastlane/metadata/android/de/changelogs/972.txt new file mode 100644 index 00000000000..c05cf182f21 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/972.txt @@ -0,0 +1,11 @@ +Neu +Erkennung von Zeitstempeln und Hashtags in der Beschreibung +Manuelle Einstellung des Tablet-Modus hinzugefügt +Abgespielte Elemente können nun in einem Feed ausgeblendet werden + +Verbessert +Korrekte Unterstützung des Storage Access Framework +Bessere Fehlerbehandlung von nicht verfügbaren und beendeten Kanälen +Das Android Share Sheet für Android >=10 Nutzer zeigt nun den Titel des Inhalts an. +Aktualisierte Invidious Instanzen und Unterstützung von Piped Links. +... diff --git a/fastlane/metadata/android/de/changelogs/993.txt b/fastlane/metadata/android/de/changelogs/993.txt new file mode 100644 index 00000000000..54b04faa7c9 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/993.txt @@ -0,0 +1,12 @@ +Neu +• Warnung bei Erstellung von Duplikaten in Wiedergabelisten und neue Schaltfläche um Duplikate zu entfernen +• Möglichkeit, Hardware Tasten zu ignorieren +• Möglichkeit, teilweise gesehene Videos im Feed auszublenden + +Verbessert +• Mehr Rasterspalten auf großen Displays +• Fortschrittsbalken sind jetzt konsistent mit Einstellungen + +Behoben +• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern auf Android 11+ +• Fullscreen-Bedingung benötigte zweimaliges Drücken auf MIUI diff --git a/fastlane/metadata/android/en-US/changelogs/994.txt b/fastlane/metadata/android/en-US/changelogs/994.txt new file mode 100644 index 00000000000..ef04dac0cfd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/994.txt @@ -0,0 +1,15 @@ +New +• Support multiple audio tracks/languages +• Allow setting volume and brightness gestures on any side of the screen +• Support for displaying main-tabs at the bottom of the screen + +Improved +• [Bandcamp] Handle tracks behind pay wall + +Fixed +• [YouTube] 403 HTTP errors for streams +• Black player when switching to main player from playlist view +• Player service memory leak +• [PeerTube] Uploader and subchannel avatars were swapped + +and more diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png new file mode 100644 index 00000000000..3a74f5a5b92 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png new file mode 100644 index 00000000000..1b0edbb57f4 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png new file mode 100644 index 00000000000..4b5301c4ba7 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png new file mode 100644 index 00000000000..d421490485e Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png new file mode 100644 index 00000000000..b27211bae44 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png new file mode 100644 index 00000000000..6c9c12d7005 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png new file mode 100644 index 00000000000..f236028af7d Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png new file mode 100644 index 00000000000..c6cadacdbf3 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png new file mode 100644 index 00000000000..e4b9ca249c7 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png deleted file mode 100644 index 434355763cb..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png deleted file mode 100644 index 1291c645b80..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png deleted file mode 100644 index 6473216de32..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png deleted file mode 100644 index 264163f8e41..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png deleted file mode 100644 index 1cf54b1c3a6..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png deleted file mode 100644 index 0c05d515850..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png deleted file mode 100644 index 2a0a8accb9f..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png deleted file mode 100644 index f405667f2f5..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png deleted file mode 100644 index 37259ae6d99..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png deleted file mode 100644 index 4a55b8860ec..00000000000 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png new file mode 100644 index 00000000000..38bcb178d96 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png differ diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png new file mode 100644 index 00000000000..3093ded5eb1 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png differ diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png deleted file mode 100644 index 82d7bd7b16a..00000000000 Binary files a/fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png deleted file mode 100644 index 806bf7d7f6a..00000000000 Binary files a/fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png and /dev/null differ diff --git a/fastlane/metadata/android/es/changelogs/840.txt b/fastlane/metadata/android/es/changelogs/840.txt index 37c0628a8ad..505d1d8815e 100644 --- a/fastlane/metadata/android/es/changelogs/840.txt +++ b/fastlane/metadata/android/es/changelogs/840.txt @@ -1,24 +1,22 @@ Nuevo -- Se ha añadido un selector de idioma para cambiar el idioma de la aplicación -- Se ha añadido el botón de enviar a Kodi al menú desplegable del reproductor -- Se ha añadido la posibilidad de copiar comentarios con una pulsación larga +• Selector de idioma añadido para cambiar el idioma +• Se agregó el botón Enviar a Kodi al menú desplegable del reproductor. +• Se agregó la capacidad de copiar comentarios al presionar prolongadamente Mejorado -- Se ha corregido la actividad de ReCaptcha y se han guardado correctamente las cookies obtenidas -- Menú de puntos eliminado en favor de cajón y botón del historial ocultado cuando no está habilitado el historial de reloj en ajustes -- Pedir permiso de visualización sobre otras aplicaciones en ajustes correctamente en Android 6 y posteriores -- Cambiar nombre de lista de reproducción local haciendo un clic largo en MarcadorDePáginasFragmentos -- Varias mejorías en PeerTube -- Mejoría de varias cadenas de origen en inglés +• Corrige la actividad de ReCaptcha y guarda correctamente las cookies obtenidas +• Se eliminó el menú de puntos a favor del cajón y el botón de ocultar historial cuando el historial de visualización no está habilitado en los ajustes +• Solicitar permiso para mostrar sobre otras aplicaciones en la configuración en Android 6 y versiones posteriores +• Cambiar el nombre de la lista de reproducción local haciendo clic largo en BookmarkFragment +• Varias mejoras de PeerTube +• Varias cadenas fuente en inglés mejoradas -Corregido -Corregido que reproductor se reinicie aunque esté en pausa con opción "minimizar al cambiar de app" activada y NewPipe está minimizado -- Corregido el valor de brillo inicial para el gesto -- Corregida la descarga de subtítulos .srt que no contienen todos los saltos de línea -- Corregida descarga a tarjeta SD que falla porque algunos dispositivos Android 5 no son compatibles con CTF -- Corregida la descarga en Android KitKat -- Arreglado el archivo de vídeo .mp4 corrupto que era reconocido como archivo de audio -- Corregidos múltiples problemas de localización, incluyendo códigos de idioma chino erróneos -- YouTube] Las marcas de tiempo en la descripción vuelven a ser cliqueables - -Traducción realizada con la versión gratuita del traductor www.DeepL.com/Translator +Fijado +• Se corrigió que el reproductor volviera a comenzar aunque estaba en pausa cuando la opción "minimizar al cambiar de aplicación" estaba habilitada y NewPipe estaba minimizado +• Fijar el valor de brillo inicial para el gesto +• Se corrigieron las descargas de subtítulos .srt que no contenían todos los saltos de línea. +• Se corrigió la falla de la descarga a la tarjeta SD porque algunos dispositivos con Android 5 no son compatibles con CTF +• Descarga fija en Android KitKat +• Se corrigió el archivo corrupto de video .mp4 que se reconoce como archivo de audio +• Se corrigieron múltiples problemas de localización, incluidos códigos de idioma chino incorrectos. +• [YouTube] Las marcas de tiempo en la descripción se pueden volver a hacer clic diff --git a/fastlane/metadata/android/es/changelogs/994.txt b/fastlane/metadata/android/es/changelogs/994.txt new file mode 100644 index 00000000000..6c323f98afa --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/994.txt @@ -0,0 +1,15 @@ +Nuevo +• Admite múltiples pistas de audio/idiomas +• Configurar gestos de volumen y brillo en la pantalla +• Mostrar pestañas principales en la parte inferior de la pantalla + +Mejorado +• [Bandcamp] Maneja las pistas detrás del muro de pago + +Fijado +• [YouTube] errores HTTP 403 para transmisiones +• Reproductor en negro al cambiar al reproductor principal desde la lista de reproducción +• Pérdida de memoria del reproductor +• [PeerTube] Se intercambiaron los avatares del subcanal y del cargador. + +y más diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt new file mode 100644 index 00000000000..1276a514d99 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/750.txt @@ -0,0 +1,22 @@ +Nouveau +Reprise de lecture #2288 +• Reprise des flux où ils s'étaient arrêtés +Améliorations du téléchargeur #2149 +• Utilisation du Storage Access Framework pour stocker sur cartes SD +• Nouveau multiplexeur mp4 +• Peut changer le dossier de téléchargement +• Respect des réseaux tarifés + + +Améliorations +• Suppression des chaînes gema #2295 +• Gestion des changements de rotation #2444 +• Uniformisation des menus longue-pression #2368 + +Corrections +• Nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 +• Ne plante pas quand la vérification de la mise à jour de l'application échoue #2423 +• Téléchargements bloqués à 99,9 % #2440 +• Mise à jour des métadonnées de la file de lecture #2453 +• [SoundCloud] Ne plante pas lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Durée pas analysée TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/fr/changelogs/760.txt b/fastlane/metadata/android/fr/changelogs/760.txt new file mode 100644 index 00000000000..2f74c57b4cc --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/760.txt @@ -0,0 +1,43 @@ +Changements dans la version 0.17.1 + +Nouveauté +• Localisation en thaïlandais + + +Améliorations +• Ajout de l'action "Commencer à jouer ici" dans les menus qui s'appuient longuement pour les listes de lecture #2518 +• Ajout d'un commutateur pour le sélecteur de fichiers SAF / hérité #2521 + +Corrections +• Correction des boutons qui disparaissent dans la vue des téléchargements lors du changement d'applications #2487 +• Correction de la position de lecture qui est enregistrée même si l'historique de visionnage est désactivé +• Correction des performances réduites causées par la position de lecture dans les vues de liste #2517 +• [Extractor] Correction de ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Correction de l'erreur de recherche occasionnelle lorsque les listes de lecture sont dans les résultats TeamNewPipe/NewPipeExtractor#185 + + + +Changements dans la version 0.17.0 + +Nouveautés +Reprise de lecture #2288 +• Reprise des flux là où vous vous étiez arrêté la dernière fois +Améliorations du téléchargeur #2149 +• Utilisation du Storage Access Framework pour stocker les téléchargements sur des cartes SD externes +• Nouveau multiplexeur mp4 +• Possibilité de changer le répertoire de téléchargement avant de commencer un téléchargement +• Respect des réseaux tarifés + + +Améliorations +• Suppression des chaînes gema #2295 +• Gestion des changements de (auto)rotation pendant le cycle de vie de l'activité #2444 +• Uniformisation des menus qui s'appuient longuement #2368 + +Corrections +• Correction du nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 +• Ne plante pas lorsque la vérification de la mise à jour de l'application échoue (version GitHub) #2423 +• Correction des téléchargements bloqués à 99,9 % #2440 +• Mise à jour des métadonnées de la file de lecture #2453 +• [SoundCloud] Correction du plantage lors du chargement des listes de lecture TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Correction de la durée qui ne peut pas être analysée TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt index 70048c15a31..8063e3fab12 100644 --- a/fastlane/metadata/android/fr/short_description.txt +++ b/fastlane/metadata/android/fr/short_description.txt @@ -1 +1 @@ -Une interface pour YouTube libre et légère sur Android. +Une interface YouTube libre et légère pour Android. diff --git a/fastlane/metadata/android/hi/changelogs/993.txt b/fastlane/metadata/android/hi/changelogs/993.txt new file mode 100644 index 00000000000..57b6fe8be3b --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/993.txt @@ -0,0 +1,12 @@ +नया +• प्लेलिस्ट डुप्लिकेट जोड़ते समय चेतावनी जोड़ें और उन्हें हटाने के लिए बटन जोड़ें +• हार्डवेयर बटन को अनदेखा करने की अनुमति दें +• फ़ीड में आंशिक रूप से देखे गए वीडियो को छिपाने की अनुमति दें + +बेहतर +• बड़ी स्क्रीन पर अधिक ग्रिड कॉलम का उपयोग करें +• प्रगति संकेतक सेटिंग्स के अनुरूप बनाएं + +फिक्स +• एंड्रॉइड 11+ पर ब्राउज़र यूआरएल, डाउनलोड और बाहरी खिलाड़ियों को खोलने को ठीक करें +• एमआईयूआई पर दो टैप की आवश्यकता वाले फुलस्क्रीन के साथ इंटरेक्टि करना ठीक करें diff --git a/fastlane/metadata/android/hi/changelogs/994.txt b/fastlane/metadata/android/hi/changelogs/994.txt new file mode 100644 index 00000000000..b118ca428df --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/994.txt @@ -0,0 +1,15 @@ +नया +• एकाधिक ऑडियो ट्रैक/भाषाओं का समर्थन करें +• स्क्रीन के किसी भी तरफ वॉल्यूम और ब्राइटनेस जेस्चर सेट करने की अनुमति दें +• स्क्रीन के नीचे मुख्य-टैब प्रदर्शित करने के लिए समर्थन + +किए सुधार +• [बैंडकैंप] पे वॉल के पीछे ट्रैक संभालें + +हल किया गया +• [यूट्यूब] स्ट्रीम के लिए 403 HTTP त्रुटियाँ +• प्लेलिस्ट दृश्य से मुख्य प्लेयर पर स्विच करते समय काला प्लेयर +• प्लेयर सेवा मेमोरी लीक +• [पीयरट्यूब] अपलोडर और सबचैनल अवतारों की अदला-बदली की गई + +और अधिक diff --git a/fastlane/metadata/android/hu/changelogs/63.txt b/fastlane/metadata/android/hu/changelogs/63.txt index e9b4b461c11..8a08f438cf1 100644 --- a/fastlane/metadata/android/hu/changelogs/63.txt +++ b/fastlane/metadata/android/hu/changelogs/63.txt @@ -5,4 +5,4 @@ - GDPR információk hozzáadása #1420 ### Javítva -- Letöltés: A befejezetlen .giga fájlokból történő betöltés közbeni összeomlás javítása #1407 +- Letöltő: A befejezetlen .giga fájl letöltések betöltése közbeni összeomlás javítása #1407 diff --git a/fastlane/metadata/android/hu/changelogs/65.txt b/fastlane/metadata/android/hu/changelogs/65.txt index c3ee63eccdb..e1180478a0a 100644 --- a/fastlane/metadata/android/hu/changelogs/65.txt +++ b/fastlane/metadata/android/hu/changelogs/65.txt @@ -1,26 +1,26 @@ ### Fejlesztések -- A burgermenu ikon animációjának letiltása #1486 +- A burgermenü ikonanimációjának letiltása #1486 - a letöltések törlésének visszavonása #1472 -- Letöltési lehetőség a #1498 megosztás menüben +- Letöltési lehetőség a megosztás menüben #1498 - Megosztási lehetőség hozzáadva a hosszú érintéssel #1454 -- A fő játékos minimalizálása a 1354-es kijáratnál +- A fő lejátszó minimalizálása a kilépésnél #1354 - A könyvtár verziójának frissítése és az adatbázis biztonsági mentésének javítása #1510 - ExoPlayer 2.8.2 frissítés #1392 - - Átdolgoztuk a lejátszási sebesség-vezérlő párbeszédpanelt, hogy támogassa a különböző lépésméreteket a gyorsabb sebességváltás érdekében. - - Hozzáadott egy kapcsolót a gyors előretekeréshez a lejátszási sebesség szabályozásában a csendek alatt. Ez hasznos lehet hangoskönyvek és bizonyos zenei műfajok esetében, és valódi zökkenőmentes élményt nyújthat (és megszakíthat egy dalt sok csenddel =\\). - - Átdolgozott médiaforrás felbontás, amely lehetővé teszi a metaadatok továbbítását a média mellett a lejátszón belül, nem pedig manuálisan. Most már egyetlen metaadatforrásunk van, és közvetlenül elérhető a lejátszás megkezdésekor. - - Javítva a távoli lejátszási lista metaadatai, amelyek nem frissülnek, amikor új metaadatok állnak rendelkezésre a lejátszási lista töredékének megnyitásakor. - - Különféle felhasználói felület-javítások: #1383, a háttérben lévő lejátszó értesítési vezérlői mostantól mindig fehérek, a felugró lejátszót egyszerűbben le lehet állítani dobással -- Használjon új kivonatot refaktorált architektúrával a többszolgáltatáshoz + - Átdolgoztuk a lejátszásisebesség-vezérlő párbeszédpanelt, hogy támogassa a különböző lépésmértéket a gyorsabb sebességváltás érdekében. + - Hozzáadott kapcsoló a gyors előre- hátratekeréshez a lejátszásisebesség-vezérlőben a csendek alatt. Ez hasznos lehet hangoskönyvek és bizonyos zenei műfajok esetében és valódi zökkenőmentes élményt nyújthat (és megtörhet egy dalt sok csenddel =\\). + - Átdolgozott médiaforrás felbontás, amely lehetővé teszi a metaadatok továbbítását a média mellett a lejátszón belül, manuális helyett. Most már egyetlen metaadatforrásunk van és közvetlenül elérhető a lejátszás megkezdésekor. + - Javítva a távoli lejátszási lista metaadatai nem frissülnek, amikor új metaadatok állnak rendelkezésre a lejátszási lista töredékének megnyitásakor. + - Különféle felhasználóifelület-javítások: #1383, a háttérlejátszó értesítési vezérlői mostantól mindig fehérek, a felugró lejátszót egyszerűbben le lehet állítani eldobással +- Újraírt extractor használata több szolgáltatáshoz ### Javítások -- Javítás: #1440 Sérült videó információs elrendezés #1491 -- Előzmények megtekintése #1497. javítás +- a #1440 Sérült videó információs elrendezés #1491 +- Előzmények megtekintése #1497 - #1495, a metaadatok (bélyegkép, cím és videószám) frissítésével, amint a felhasználó hozzáfér a lejátszási listához. - #1475, egy nézet regisztrálásával az adatbázisban, amikor a felhasználó elindít egy videót a külső lejátszón a részletrészleten. -- Javítsa ki a képernyő időtúllépését felugró mód esetén. #1463 (fix #640) -- Fő videólejátszó javítás #1509 - - [#1412] Javítva az ismétlési mód, ami a játékos NPE-jét okozza, ha új szándék érkezik, miközben a játékos tevékenysége a háttérben van. - - Javítva, hogy a lejátszó előugró ablakra minimalizálja, nem semmisíti meg a lejátszót ha a popup engedélyt nem adják meg. +- a képernyő időtúllépése felugró mód esetén. #1463 (javítva #640) +- Fő videólejátszó #1509 + - [#1412] az ismétlés mód, ami a lejátszó NPE-t okozza, ha új szándék érkezik, miközben a lejátszó a háttérben fut. + - a lejátszó felugró ablakra minimalizálása nem semmisíti meg a lejátszót, ha a felugró ablak nem engedélyezett. diff --git a/fastlane/metadata/android/hu/changelogs/68.txt b/fastlane/metadata/android/hu/changelogs/68.txt new file mode 100644 index 00000000000..d292749fd32 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/68.txt @@ -0,0 +1,31 @@ +# Változások v0.14.1 + +### Javítva +- a nem sikerül visszafejteni a videó URL-t #1659 +- a leíró link nem jól kibontható #1657 + +# Változások v0.14.0 + +### Új +- fiókkialakítás #1461 +- testreszabható címlap #1461 + +### Fejlesztések +- Átdolgozott gesztusvezérlők #1604 +- Új módja a felugrólejátszó bezárásának #1597 + +### Javítva +- a feliratkozók száma nem érhető el hibája. Bezárva a #1649. +- Ezekben az esetekben „A feliratkozók száma nem érhető el” megjelenítése +- az NPE, ha egy YouTube lejátszási lista üres +- Gyors javítás a SoundCloud kioszkjaihoz +- Refaktor és hibajavítás #1623 + - a ciklikus keresési eredmény #1562 + - a keresősáv nincs statikusan elrendezve + - az YT Prémium videó nincs megfelelően blokkolva + - a videók néha nem töltődnek be (a DASH elemzés miatt) + - a linkek a videó leírásában + - Figyelmeztetés megjelenítése, ha valaki külső SD-kártyára próbál letölteni + - a semmi sem jelenik meg kivétel jelentést vált ki + - A bélyegkép nem jelenik meg az Android 8.1 háttérlejátszóban [lásd itt](https://github.com/TeamNewPipe/NewPipe/issues/943) +- a műsorszóró vevőregisztrációja. Bezárva a #1641. diff --git a/fastlane/metadata/android/hu/changelogs/974.txt b/fastlane/metadata/android/hu/changelogs/974.txt new file mode 100644 index 00000000000..f932a89c35c --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/974.txt @@ -0,0 +1,5 @@ +Gyorsjavítás +• Javítva a YouTube szabályozás által okozott pufferelési problémák +• Javítva a YouTube megjegyzések kinyerése átal okozott összeomlás, letiltott megjegyzéseknél +• Javítva a YouTube zenei keresés +• Javítva a PeerTube élő közvetítések diff --git a/fastlane/metadata/android/hu/changelogs/978.txt b/fastlane/metadata/android/hu/changelogs/978.txt new file mode 100644 index 00000000000..68cae7c9de2 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/978.txt @@ -0,0 +1 @@ +Kijavítva az új NewPipe-verzió ellenőrzésének végrehajtása. Ez az ellenőrzés néha túl korán lett végregajtva, és ez az alkalmazás összeomlásához vezetett. Ezt most meg lett oldva. diff --git a/fastlane/metadata/android/hu/changelogs/979.txt b/fastlane/metadata/android/hu/changelogs/979.txt new file mode 100644 index 00000000000..d7733434dd5 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/979.txt @@ -0,0 +1,2 @@ +- Javítva a lejátszásfolytatás +- Fejlesztések annak biztosítására, hogy az a szolgáltatás, amely meghatározza, hogy a NewPipe új verzióellenőrzéseket keres-e, ne induljon el a háttérben diff --git a/fastlane/metadata/android/hu/changelogs/991.txt b/fastlane/metadata/android/hu/changelogs/991.txt index 386cded5aa0..cd4640f8c99 100644 --- a/fastlane/metadata/android/hu/changelogs/991.txt +++ b/fastlane/metadata/android/hu/changelogs/991.txt @@ -10,4 +10,4 @@ Javítások Hibajavítások • Többféle összeomlás lett javítva -• [YouTube] Javítva lett a csatornák betöltése, a nem dedikált feed és néhány ország visszajátszási gondjait megkerültük +• [YouTube] Javítva lett a csatornák betöltése, a nem elkülönített feed, és néhány ország lejátszási gondjait megkerültük diff --git a/fastlane/metadata/android/hu/changelogs/993.txt b/fastlane/metadata/android/hu/changelogs/993.txt new file mode 100644 index 00000000000..81b8e9a1dec --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/993.txt @@ -0,0 +1,12 @@ +Új +• Figyelmeztetés hozzáadása lejátszási lista ismétlődéseinek hozzáadásakor, és gomb hozzáadása ezek eltávolításához +• Engedélyezve a hardvergombok figyelmen kívül hagyása +• A hírfolyamban részben megtekintett videók elrejtésének engedélyezése + +Fejlesztés +• Több rácsoszlop használata a nagy képernyőkön +• A folyamatjelzők összhangban állítása a beállításokkal + +Javítva +• A böngésző nyitó URL-címeinek, letöltéseinek és külső lejátszóinak javítása Android 11+ rendszeren +• A MIUI két érintést igénylő teljes képernyős kölcsönhatásának javítása diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt index 772992ee41e..6ea92d55ad9 100644 --- a/fastlane/metadata/android/hu/full_description.txt +++ b/fastlane/metadata/android/hu/full_description.txt @@ -1 +1 @@ -A NewPipe nem használ semmilyen Google keretrendszer programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélkül futó eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube-fiókra sem. A NewPipe szabad és nyílt forráskódú szoftver. +A NewPipe nem használ semmilyen Google keretrendszer programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélküli eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube fiókra és ez szabad és nyílt forráskódú szoftver (FLOSS). diff --git a/fastlane/metadata/android/it/changelogs/994.txt b/fastlane/metadata/android/it/changelogs/994.txt new file mode 100644 index 00000000000..f7fbe44fedd --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/994.txt @@ -0,0 +1,15 @@ +Novità +• Supporto di più tracce audio/lingue +• Consenti gesti di volume e luminosità su qualsiasi lato dello schermo +• Supporto per mostrare le schede principali in basso allo schermo + +Migliorato +• [Bandcamp] Gestisci le tracce dietro paywall + +Corretto +• [YouTube] Errori HTTP 403 per i video +• Player nero quando si passa al player principale dalla scheda playlist +• Perdita di memoria del servizio del player +• [PeerTube] Gli avatar dell'uploader e del sottocanale erano scambiati + +e altro ancora diff --git a/fastlane/metadata/android/ja/changelogs/63.txt b/fastlane/metadata/android/ja/changelogs/63.txt new file mode 100644 index 00000000000..8ad7cdc9520 --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/63.txt @@ -0,0 +1,8 @@ +###改善点 +- 書き出し/読み込みの設定 #1333 +- オーバードローの削減 (パフォーマンスの向上) #1371 +- 小さなコードの改善 #1375 +- GDPR#1420に関する全てを追加 + +###修正済み +- ダウンローダー: .giga ファイルから未完了のダウンロードをロードする際のクラッシュを修正 #1407 diff --git a/fastlane/metadata/android/ja/changelogs/64.txt b/fastlane/metadata/android/ja/changelogs/64.txt new file mode 100644 index 00000000000..fb3817428f4 --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/64.txt @@ -0,0 +1,8 @@ +###改善点 +- モバイルデータを使用する場合にビデオ品質を制限する機能を追加しました。#1339 +- セッションの明るさを記憶する #1442 +- 弱いCPUでのダウンロード性能を向上 #1431 +- メディアセッション#1433の (動作する)サポートを追加しました。 + +###修正 +- ダウンロードをする際のクラッシュを修正(修正はリリースビルドで利用可能な修正) #1441 diff --git a/fastlane/metadata/android/ko/changelogs/952.txt b/fastlane/metadata/android/ko/changelogs/952.txt new file mode 100644 index 00000000000..4fa66285c82 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/952.txt @@ -0,0 +1,7 @@ +개선된 사항 +• 유튜브에서만 가능했던 자동재생 기능이 이제 모든 서비스에서 사용가능합니다 + +고쳐진점 +• 유튜브의 새로운 컨티뉴어스를 지원하여 관련된 스트림과 연관된 문제를 고쳤습니다 +• 연령제한된 유튜브 비디오 기능을 고쳤습니다 +• [안드로이드 TV] 오래 지속되는 포커스 하이라이트 오버레이를 고쳤습니다 diff --git a/fastlane/metadata/android/ko/full_description.txt b/fastlane/metadata/android/ko/full_description.txt index 7b6a6ae65dc..b12aa99020e 100644 --- a/fastlane/metadata/android/ko/full_description.txt +++ b/fastlane/metadata/android/ko/full_description.txt @@ -1 +1 @@ -NewPipe는 구글 프레임워크 러이브러리나 유튜브 API를 전혀 사용하지 않습니다. 대신에 NewPipe가 필요한 정보를 위해 웹싸이트를 파싱만 합니다. 따라서 구글 서비스가 설치되지 않은 어떤 디바이스에서도 이 앱을 사용할 수 있습니다. 또한, NewPipe 사용을 위해 유튜브 계정도 필요없는, 완벽한 오픈소스입니다. +NewPipe는 구글 프레임워크 러이브러리나 유튜브 API를 전혀 사용하지 않습니다. NewPipe는 필요한 정보를 얻기 위해서만 웹사이트 파싱을 합니다. 따라서 구글 서비스가 설치되지 않은 디바이스에서도 이 앱을 사용할 수 있습니다. 또한, NewPipe 사용을 위해 유튜브 계정이 필요없으며, 완벽한 오픈소스입니다. diff --git a/fastlane/metadata/android/nl/changelogs/953.txt b/fastlane/metadata/android/nl/changelogs/953.txt index ca4000ebd8b..8f7f8b89a36 100644 --- a/fastlane/metadata/android/nl/changelogs/953.txt +++ b/fastlane/metadata/android/nl/changelogs/953.txt @@ -1 +1 @@ -Hersteld: extractie van de decoderingsfunctie van YouTube. +Herstel de extractie van de decoderingsfunctie van YouTube. diff --git a/fastlane/metadata/android/nl/full_description.txt b/fastlane/metadata/android/nl/full_description.txt index b00bc774fd5..ca16cfa50ed 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 bibliotheek, noch de YouTube API. Het analyseert de website op zoek naar enkel de informatie die het nodig heeft. Daardoor kan deze app gebruikt worden zonder dat Google Services is geïnstalleerd. Daarnaast heb je geen YouTube-account nodig om NewPipe te gebruiken, en is het FLOSS. +NewPipe gebruikt geen enkele Google-framework-bibliotheek, noch de YouTube-API. Het analyseert de website op zoek naar enkel de informatie die het nodig heeft. Daardoor kan deze app gebruikt worden zonder dat Google Services is geïnstalleerd. Daarnaast heft u geen YouTube-account nodig om NewPipe te gebruiken, en is de app FLOSS. diff --git a/fastlane/metadata/android/nl/short_description.txt b/fastlane/metadata/android/nl/short_description.txt index 90781785845..4030fe4043d 100644 --- a/fastlane/metadata/android/nl/short_description.txt +++ b/fastlane/metadata/android/nl/short_description.txt @@ -1 +1 @@ -Een gratis lichtgewicht YouTube frontend voor Android. +Een gratis en lichtgewicht YouTube-front-end voor Android. diff --git a/fastlane/metadata/android/nqo/changelogs/63.txt b/fastlane/metadata/android/nqo/changelogs/63.txt new file mode 100644 index 00000000000..fd5ca6fd500 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/63.txt @@ -0,0 +1,8 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ +- ߟߊ߬ߛߣߍ߬ߟߌ/ߟߊߝߏ߬ߦߟߌ߫ ߢߊߓߐߟߌ ߟߎ߬ #1333 +- ߞߙߍ߬ߢߍ߬ߡߊ߬ߛߊߦߌ ߟߊߘߐ߯ߦߊ (ߘߏߢߊߟߌ ߓߘߊ߫ ߟߊߢߊ߬) #1371 +- ߘߏߝߙߍߕߍ߫ ߘߋ߲ߣߍ߲ ߠߊߢߊ߭ #1375 +- GDPR ߞߏ ߓߍ߯ ߝߊ߬ߙߊ #1420 + +### ߘߐ߬ߓߍ߲߬ߠߌ߲ +- ߟߊ߬ߖߌ߰ߟߊ߲: ߕߌߢߍߟߌ ߘߏ߫ ߓߘߊ߫ ߘߐߓߍ߲߬ ߡߍ߲ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߓߊ߲ߓߊߟߌ ߟߎ߬ ߖߛߐ ߝߍ߬ ߞߊ߬ ߝߘߊ߫ .giga ߞߐߕߐ߮ ߟߎ߬ ߟߊ߫ #1407 diff --git a/fastlane/metadata/android/nqo/changelogs/64.txt b/fastlane/metadata/android/nqo/changelogs/64.txt new file mode 100644 index 00000000000..cd6ad2b7d57 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/64.txt @@ -0,0 +1,8 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ +- ߦߋߡߍ߲ߕߊ߫ ߓߘߍ߬ߦߊ߫ ߘߊ߲߬ߠߊߕߍ߱ ߛߋߞߏߦߊ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ ߘߐ߫ #1339 +- ߞߊ߬ ߞߣߍߦߊ ߟߊߞߎ߲߬ߘߎ߬ ߛߌ߰ߘߐ ߢߍ߫ #1442 +- ߟߊߖߌ߰ߟߌ߫ ߢߣߊ߬ߦߊ ߟߢߊ߬ߟߌ ߟߎ߬ ߦߙߍߞߍߟߊ߲߫ ߖߊߝߏߣߍ߲ ߢߍ߫ #1431 +- ߞߟߋߞߟߋ߫ ߘߌ߯ߘߐ ߟߎ߬ ߞߐߞߘߐߓߌ߲ߓߌ߲ #1433 + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߜߊߛߊ߲ߠߌ߲ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߦߟߍ߫ ߕߎߡߊ (ߊ߬ ߡߊߟߐ߬ߘߐ߲߬ߕߊ ߦߋ߫ ߓߐߞߏ߫ ߞߐߟߕߊ ߟߎ߫ ߟߋ߬ ߘߐ߫) #1441 diff --git a/fastlane/metadata/android/nqo/changelogs/65.txt b/fastlane/metadata/android/nqo/changelogs/65.txt new file mode 100644 index 00000000000..ad622b38711 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/65.txt @@ -0,0 +1,26 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ + +- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 +- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 +- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498 +- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ "ߕߐߘߐ߲߫ ߖߊ߲" ߢߣߊߥߟߊ ߟߊ߫ #1454 +- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 +- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 +- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392 + - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫. + - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\) + - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬. + - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ. + - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ : #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬. + - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫. + +### ߛߊߞߍߟߌ ߟߎ߬ + +- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 +- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497 + - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬. + - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬. +- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640) +- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 + - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫. + - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/changelogs/66.txt b/fastlane/metadata/android/nqo/changelogs/66.txt new file mode 100644 index 00000000000..2b9afde7da1 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/66.txt @@ -0,0 +1,33 @@ +# ߓߐߞߏ߫ ߀.߁߃.߇ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߫ ߝߐ߰ߓߍ + +### ߛߊߞߍߣߍ߲ ߠߎ߬ +- ߓߐߞߏ߫ ߀.߁߃.߆ ߘߕߐ߬ߡߐ߲߬ߠߌ߲߫ ߛߍ߲ߛߍ߲ߟߊ߲ ߝߙߋߞߋ ߘߏ߫ ߓߘߊ߫ ߛߊߞߍ߫ + +# ߓߐߞߏ߫ ߀.߁߃.߆ ߡߝߊ߬ߟߋ߲߬ߠߌ߲߫ ߠߎ߬ ߛߙߍߘߍ + +### ߟߢߊ߬ߟߌ ߟߎ߬ + +- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 +- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 +- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498 +- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ "ߕߐߘߐ߲߫ ߖߊ߲" ߢߣߊߥߟߊ ߟߊ߫ #1454 +- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 +- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 +- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392 + - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫. + - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\) + - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬. + - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ. + - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ : #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬. + - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫. + +### ߛߊߞߍߟߌ ߟߎ߬ + +- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 +- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497 + - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬. + - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬. +- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640) +- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 + - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫. + - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/changelogs/68.txt b/fastlane/metadata/android/nqo/changelogs/68.txt new file mode 100644 index 00000000000..9d12539b043 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/68.txt @@ -0,0 +1,31 @@ +# ߓ߀.߁߄.߁ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߘߏߝߙߍߕߍߓߐ ߗߌߙߏ߲ #1659 +- ߞߊ߲߬ߛߓߍ߫ ߛߘߌ߬ߜߋ߲ ߕߎ߲߬ ߕߍ߫ ߟߛߊ߬ ߟߴߊ߬ ߢߌ߲߬ߡߊ ߟߊ߫ #1657 + +# ߓ߀.߁߄.߀ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ + +### ߞߎߘߊ ߟߎ߬ +- ߞߎ߲ߓߍ߲߫ ߞߙߍ߬ߢߍ #1461 +- ߟߊ߬ߛߣߍ߬ߟߌ߬ ߞߐߜߍ߫ ߟߊߖߘߍ߬ߕߦߊ߬ߕߊ #1461 + +### ߟߡߊ߬ߟߌ ߟߎ߬ +- ߡߊ߬ߡߙߊ߬ߟߌ߫ ߖߍ߰ߙߍ߬ߡߊ ߟߎ߬ ߓߘߊ߫ ߘߐߓߊ߯ߙߊ߫ #1604 +- ߘߐߛߊߙߌߟߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ߫ ߘߊߕߎ߲߯ ߢߊ߫ ߞߎߘߊ #1597 + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߝߎ߬ߕߎ߲߬ߕߌ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬. ߏ߬ ߘߌ߫ ߘߊߕߎ߲߯ #1649. + - ߏ߬ ߘߐ߫߸ ߊ߬ ߘߴߊ߬ ߦߌ߬ߘߊ߬ ߞߏ߫ "ߡߊ߬ߝߘߎ߬ߓߊ߮ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬". +- ߛߊߞߍߟߌ ߓߘߊ߫ ߞߍ߫ NPE ߟߊ߫߸ ߣߌ߫ ߦߕߎߓߎ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߘߏ߫ ߘߐߞߏߟߏ߲ ߦߋ߫ +- ߝߎ߲ߞߎ߲ߟߋ߲ ߠߎ߬ SoundCloud ߞߣߐ߫ +- ߜߊߛߊ߲ߠߌ߲߫ ߘߐߓߊ߯ߙߊ ߣߵߊ߬ ߛߊߞߍߟߌ #1623 +- ߢߌߣߌ߲ߠߌ߲߫ ߞߎ߲߬ߕߊ߰ߡߊ ߟߎ߬ ߞߐߝߟߌ #1562 +- ߢߌߣߌ߲ߠߌ߲߫ ߜߋߟߊ߲ߞߊ ߡߍ߲ ߡߊ߫ ߓߌ߲߬ߟߊ߬ ߞߐߜߍ ߞߊ߬ ߞߵߊ߬ ߜߊߘߊ߲߫ +- ߦߕߎߕߓߎ߫ ߛߙߊ߬ߕߊ ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߓߟߏߕߍ߰ ߞߏߢߊ߬ +- ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߖߛߐ߫ ߟߊ߫ ߡߎ߰ߡߍ߫ (DASH ߘߐߞߕߌ߫ ߞߏߛߐ߲߬) +- ߛߘߌ߲߬ߜߋ߲ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߦߋߡߍ߲ߕߊ ߟߎ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ +- ߊ߬ ߘߌ߫ ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߦߌ߬ߘߊ߬ ߣߌ߫ ߡߐ߱ ߘߏ߫ ߞߵߊ߬ ߝߐ߫ ߞߴߊ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߟߊ߫ ߞߐߞߊ߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬ +- ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ "ߝߏ߬ߛߌ߬ ߡߊ߫ ߛߌߝߊ߫" ߡߍ߲ ߘߌ߫ ߘߊ߬ߕߍ߰ߟߌ ߟߊߟߥߌ߬ +- ߞߏ߬ߋߞߏ߬ߋ ߕߍ߫ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߊ߲ߘߙߏߌߘ ߈.߁ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߊߖߎ ߞߣߐ߫ [ߊ߬ ߝߟߍ߫ ߦߊ߲߬](https://github.com/TeamNewPipe/NewPipe/issues/943) +- ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲߫ ߟߊߛߣߍߟߊ߲ ߠߊߞߎ߲߬ߘߎ. ߏ߬ ߦߋ߫ ߞߎ߲ߓߍ߲ ߘߊߕߎ߲߯ ߠߊ߫ #1641. diff --git a/fastlane/metadata/android/nqo/full_description.txt b/fastlane/metadata/android/nqo/full_description.txt new file mode 100644 index 00000000000..0041d7a3afb --- /dev/null +++ b/fastlane/metadata/android/nqo/full_description.txt @@ -0,0 +1 @@ +NewPipe ߕߍ߫ ߜ߭ߎߜ߭ߐߟ ߟߊ߫ ߝߊߙߡߑߥߐߙߞ ߟߍߙߘߊ߫ ߛߌ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߥߟߊ߫ ߦߕߎߓߎ߫ ߟߊ߫ API. ߊ߬ ߦߋ߫ ߗߍߦߙߐ ߘߐߛߍ߲߬ߛߍ߲߬ ߠߊ߫ ߟߵߊ߬ ߘߊߞߘߐ߫ ߞߊ߬ ߟߐ߲ߕߊ߫ ߡߊ߬ߞߏ߬ߡߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. ߏ߬ ߞߏߛߐ߲߬ ߟߥߊߟߌߟߊ߲ ߣߌ߲߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߤߊߟߌ߬ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߜ߭ߎߜ߭ߐߟ ߗߋߢߊ ߟߎ߬ ߡߊߗߍߣߍ߲߫ ߕߍ߫. ߊ߬ ߣߴߌߞߐ߫߸ ߌ ߡߊ߬ߞߏ߬ ߕߍ߫ ߦߕߎߓߎ߫ ߖߊߕߋߘߊ߫ ߟߊ߫ ߞߊ߬ ߣߌߎߔߌߔ ߟߊߓߊ߯ߙߊ߫. ߊ߬ ߘߏ߲߬ ߝߛߙߌ ߟߋ߬ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/short_description.txt b/fastlane/metadata/android/nqo/short_description.txt new file mode 100644 index 00000000000..a798a5d851d --- /dev/null +++ b/fastlane/metadata/android/nqo/short_description.txt @@ -0,0 +1 @@ +ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߊ߲ߘߙߏߌߘ ߢߍ߫. diff --git a/fastlane/metadata/android/pa/changelogs/994.txt b/fastlane/metadata/android/pa/changelogs/994.txt new file mode 100644 index 00000000000..3bda8ce2f75 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/994.txt @@ -0,0 +1,15 @@ +ਨਵਾਂ +• ਇੱਕ ਤੋਂ ਵਧੇਰੇ ਆਡੀਓ ਟਰੈਕਾਂ/ਭਾਸ਼ਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰੋ +• ਸਕ੍ਰੀਨ ਦੇ ਕਿਸੇ ਵੀ ਪਾਸੇ ਆਵਾਜ਼ ਅਤੇ ਚਮਕ ਦੇ ਸੰਕੇਤਾਂ ਨੂੰ ਸੈੱਟ ਕਰਨ ਦਿਓ +• ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਪਾਸੇ ਮੁੱਖ-ਟੈਬਾਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਲਈ ਸਮਰਥਨ + +ਸੁਧਾਰ +• [ਬੈਂਡਕੈਂਪ] ਪੇ-ਵਾਲ ਦੇ ਪਿੱਛੇ ਟਰੈਕਾਂ ਨੂੰ ਸੰਭਾਲੋ + +ਠੀਕ ਕੀਤੇ +• [ਯੂਟਿਊਬ] ਸਟ੍ਰੀਮਾਂ ਲਈ 403 HTTP ਤਰੁੱਟੀਆਂ +• ਪਲੇਲਿਸਟ ਦ੍ਰਿਸ਼ ਤੋਂ ਮੁੱਖ ਪਲੇਅਰ 'ਤੇ ਸਵਿਚ ਕਰਨ ਵੇਲੇ ਖ਼ਾਲੀ-ਕਾਲ੍ਹਾ ਪਲੇਅਰ +• ਪਲੇਅਰ ਸਰਵਿਸ ਮੈਮੋਰੀ ਲੀਕ +• [ਪੀਅਰਟਿਊਬ] ਅੱਪਲੋਡਰ ਅਤੇ ਸਬ-ਚੈਨਲ ਅਵਤਾਰ ਚਿੰਨ੍ਹ ਆਪਸ ਵਿੱਚ ਬਦਲੇ ਗਏ + +ਅਤੇ ਹੋਰ ਵੀ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/full_description.txt b/fastlane/metadata/android/pa/full_description.txt index 1b987c994ad..4f67f5a5083 100644 --- a/fastlane/metadata/android/pa/full_description.txt +++ b/fastlane/metadata/android/pa/full_description.txt @@ -1 +1 @@ -ਨਿਊ-ਪਾਈਪ ਕਿਸੇ ਵੀ ਗੂਗਲ ਫ਼ਰੇਮਵਰਕ ਲਾਇਬ੍ਰੇਰੀ ਜਾਂ ਯੂਟਿਊਬ ਏਪੀਆਈ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰਦੀ। ਇਹ ਸਿਰਫ਼ ਜ਼ਰੂਰੀ ਜਾਣਕਾਰੀ ਲੈਣ ਵਾਸਤੇ ਉਹਨਾਂ ਨੂੰ ਪੜ੍ਹਦੀ ਅਤੇ ਅਮਲ ਕਰਦੀ ਹੈ। ਇਸ ਕਰਕੇ ਇਸ ਐਪ ਦੀ ਵਰਤੋਂ ਉਹਨਾਂ ਯੰਤਰਾਂ ਤੇ ਵੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਿਨ੍ਹਾਂ 'ਤੇ ਗੂਗਲ ਸੇਵਾਵਾਂ ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ। ਨਿਊ-ਪਾਈਪ ਵਰਤਣ ਲਈ ਤੁਹਾਨੂੰ ਯੂਟਿਊਬ ਖਾਤੇ ਦੀ ਵੀ ਲੋੜ ਨਹੀਂ ਅਤੇ ਇਹ ਅਜ਼ਾਦ ਅਤੇ ਓਪਨ ਸਰੋਤ ਹੈ। +ਨਿਊ-ਪਾਈਪ ਕਿਸੇ ਵੀ ਗੂਗਲ ਫ਼ਰੇਮਵਰਕ ਲਾਇਬ੍ਰੇਰੀ ਜਾਂ ਯੂਟਿਊਬ ਏ.ਪੀ.ਆਈ. ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰਦੀ। ਇਹ ਸਿਰਫ਼ ਜ਼ਰੂਰੀ ਜਾਣਕਾਰੀ ਲੈਣ ਵਾਸਤੇ ਉਹਨਾਂ ਨੂੰ ਪੜ੍ਹਦਾ ਅਤੇ ਅਮਲ ਕਰਦਾ ਹੈ। ਇਸ ਕਰਕੇ ਇਸ ਐਪ ਦੀ ਵਰਤੋਂ ਉਹਨਾਂ ਯੰਤਰਾਂ ਤੇ ਵੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਿਨ੍ਹਾਂ 'ਤੇ ਗੂਗਲ ਸੇਵਾਵਾਂ ਭਰੀਆਂ ਨਹੀਂ ਹਨ। ਨਿਊ-ਪਾਈਪ ਵਰਤਣ ਲਈ ਤੁਹਾਨੂੰ ਯੂਟਿਊਬ ਖਾਤੇ ਦੀ ਵੀ ਲੋੜ ਨਹੀਂ ਅਤੇ ਇਹ ਅਜ਼ਾਦ ਅਤੇ ਖੁੱਲ੍ਹਾ-ਸਰੋਤ ਹੈ। diff --git a/fastlane/metadata/android/pl/changelogs/994.txt b/fastlane/metadata/android/pl/changelogs/994.txt new file mode 100644 index 00000000000..1d44d120e6f --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/994.txt @@ -0,0 +1,15 @@ +Nowe +• Obsługa wielu ścieżek/języków dźwiękowych +• Zezwolenie na ustawienie gestów głośności i jasności po dowolnej stronie ekranu +• Obsługa wyświetlania kart głównych na dole ekranu + +Ulepszone +• [Bandcamp] Obsługa utworów schowanych za paywallem + +Naprawione +• [YouTube] Błędy 403 HTTP dla strumieni +• Czarny odtwarzacz podczas przełączania do głównego odtwarzacza z widoku playlisty +• Wyciek pamięci usługi odtwarzacza +• [PeerTube] Awatary przesyłającego i podkanału zostały zamienione + +i więcej diff --git a/fastlane/metadata/android/sk/changelogs/65.txt b/fastlane/metadata/android/sk/changelogs/65.txt new file mode 100644 index 00000000000..c7cac262691 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/65.txt @@ -0,0 +1,26 @@ +### Zlepšenia + +- Zakázanie animácie ikony burgermenu #1486 +- Zrušenie odstránenia stiahnutých súborov #1472 +- Možnosť sťahovania v ponuke zdieľania #1498 +- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 +- Minimalizácia hlavného prehrávača pri ukončení #1354 +- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 +- Aktualizácia ExoPlayer 2.8.2 #1392 + - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. + - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). + - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. + - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. + - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia +- Použitie nového extraktora s preformulovanou architektúrou pre multiservis + +### Opravy + +- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 +- Oprava histórie zobrazenia #1497 + - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. + - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. +- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) +- Oprava hlavného prehrávača videa č. 1509 + - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. + - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. diff --git a/fastlane/metadata/android/sk/changelogs/66.txt b/fastlane/metadata/android/sk/changelogs/66.txt new file mode 100644 index 00000000000..ba9808cba6a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/66.txt @@ -0,0 +1,33 @@ +# Zoznam zmien verzie v0.13.7 + +### Opravené +- Oprava problémov s triediacim filtrom vo verzii v0.13.6 + +# Zoznam zmien verzie v0.13.6 + +### Vylepšenia + +- Zakázanie animácie ikony burgermenu #1486 +- Zrušenie odstránenia stiahnutých súborov #1472 +- Možnosť sťahovania v ponuke zdieľania #1498 +- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 +- Minimalizácia hlavného prehrávača pri ukončení #1354 +- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 +- Aktualizácia ExoPlayer 2.8.2 #1392 + - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. + - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). + - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. + - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. + - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia +- Použitie nového extraktora s preformulovanou architektúrou pre multiservis + +### Opravy + +- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 +- Oprava histórie zobrazenia #1497 + - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. + - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. +- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) +- Oprava hlavného prehrávača videa č. 1509 + - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. + - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. diff --git a/fastlane/metadata/android/sk/changelogs/989.txt b/fastlane/metadata/android/sk/changelogs/989.txt new file mode 100644 index 00000000000..ff412ff7dcd --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/989.txt @@ -0,0 +1,3 @@ +- [YouTube] Oprava nekonečného načítavania pri pokuse o prehrávanie akéhokoľvek videa +- [YouTube] Oprava obmedzovania výkonu pri niektorých videách +- Aktualizácia knižnice jep na verziu 1.15.3, ktorá obsahuje opravu zabezpečenia diff --git a/fastlane/metadata/android/sk/changelogs/990.txt b/fastlane/metadata/android/sk/changelogs/990.txt new file mode 100644 index 00000000000..3a073d72029 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/990.txt @@ -0,0 +1,15 @@ +V tejto verzii sa ruší podpora systému Android 4.4 KitKat, teraz je minimálna verzia Android 5 Lollipop! + +Novinky +- Stiahnutie z ponuky dlhého stlačenia +- Skrytie budúcich videí v kanáli +- Zdieľanie miestnych zoznamov skladieb + +Vylepšenia +- Prepracovanie kódu prehrávača do malých komponentov: menej použitej pamäte RAM, menej chýb +- Vylepšenie režimu zmenšovania miniatúr +- Vektorizácia zástupných znakov obrázkov + +Opravy +- Oprava rôznych problémov s oznámením prehrávača: neaktuálne/chýbajúce informácie o médiách, skreslené miniatúry +- Oprava zobrazenia na celú obrazovku pomocou 1/4 obrazovky diff --git a/fastlane/metadata/android/sk/changelogs/992.txt b/fastlane/metadata/android/sk/changelogs/992.txt new file mode 100644 index 00000000000..0ae2b2e9fe7 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/992.txt @@ -0,0 +1,17 @@ +Nové +- Počet odberateľov v detailoch videa +- Stiahnutie z frontu +- Trvalé nastavenie miniatúry zoznamu skladieb +- Dlhé stlačenie hashtagov a odkazov +- Režim zobrazenia kariet + +Vylepšená stránka +- Väčšie tlačidlo na zatvorenie miniprehrávača +- Hladšie zmenšovanie miniatúr +- Cieľový systém Android 13 (API 33) +- Vyhľadávanie už nepozastavuje prehrávač + +Opravená stránka +- Oprava prekrytia na DeX/myši +- Povolenie prehrávača na pozadí bez samostatných zvukových tokov +- Rôzne opravy YouTube a ďalšie… diff --git a/fastlane/metadata/android/sk/changelogs/993.txt b/fastlane/metadata/android/sk/changelogs/993.txt new file mode 100644 index 00000000000..9db62cc8cc9 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/993.txt @@ -0,0 +1,12 @@ +Nové +- Pridanie upozornenia pri pridávaní duplikátov do zoznamu skladieb a pridanie tlačidla na ich odstránenie +- Umožniť ignorovanie hardvérových tlačidiel +- Umožniť skrývanie čiastočne sledovaných videí v kanáli + +Vylepšená stránka +- Použitie väčšieho počtu stĺpcov mriežky na veľkých obrazovkách +- Zosúladiť ukazovatele priebehu s nastaveniami + +Opravená stránka +- Oprava otvárania adries URL prehliadača, sťahovania a externých prehrávačov v systéme Android 11+ +- Oprava interakcie s celou obrazovkou vyžadujúcou dve ťuknutia na MIUI diff --git a/fastlane/metadata/android/sv/changelogs/800.txt b/fastlane/metadata/android/sv/changelogs/800.txt new file mode 100644 index 00000000000..413feb78e56 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/800.txt @@ -0,0 +1,7 @@ +Nytt +• Stöd för PeerTube utan P2P (#2201) [Beta]: + ◦ Titta på och ladda ner videor från PeerTube-instanser + ◦ Lägg till instanser i inställningarna för att få tillgång till hela PeerTube-världen + ◦ Det kan uppstå problem med SSL-handskakningar på Android 4.4 och 7.1 vid åtkomst till vissa instanser, vilket resulterar i ett nätverksfel. + +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/810.txt b/fastlane/metadata/android/sv/changelogs/810.txt new file mode 100644 index 00000000000..da4adcfb5ec --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/810.txt @@ -0,0 +1,4 @@ +Nytt +• Visa videominiatyr på låsskärmen när videon spelas upp i bakgrunden + +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/840.txt b/fastlane/metadata/android/sv/changelogs/840.txt new file mode 100644 index 00000000000..52aebc0a090 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/840.txt @@ -0,0 +1,6 @@ +Nytt +• Lagt till språkväljare för att ändra appens språk +• Lägg till knappen Skicka till Kodi i spelarens hopfällbara meny +• Lagt till möjlighet att kopiera kommentarer vid lång tryck + +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/860.txt b/fastlane/metadata/android/sv/changelogs/860.txt new file mode 100644 index 00000000000..65c7d122b2c --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/860.txt @@ -0,0 +1,7 @@ +Förbättrat +• Spara och återställ om tonhöjd och tempo är avkopplade eller inte +• Stöd för skärmutskärning i spelare +• Runda antalet visningar och prenumeranter +• Optimerat YouTube för att använda mindre data + +Mer än 15 YouTube-relaterade buggar har åtgärdats i denna version. diff --git a/fastlane/metadata/android/sv/changelogs/900.txt b/fastlane/metadata/android/sv/changelogs/900.txt new file mode 100644 index 00000000000..a6a76aabe19 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/900.txt @@ -0,0 +1,14 @@ +Nytt +• Prenumerationsgrupper och sorterade flöden +• Mute-knapp i spelare + +Förbättrat +• Tillåt öppning music.youtube.com och media.ccc.de länkar i NewPipe +• Flytta två inställningar från Utseende till Innehåll +• Dölj sökalternativ på 5, 15, 25 sekunder om inexakt sökning är aktiverad + +Fixat +• vissa WebM-videor kan inte sökas +• databas backup på Android P +• krasch när du delar en nedladdad fil +• massor av YouTube problem och mer ... diff --git a/fastlane/metadata/android/sv/changelogs/920.txt b/fastlane/metadata/android/sv/changelogs/920.txt new file mode 100644 index 00000000000..ccdb743fb77 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/920.txt @@ -0,0 +1,9 @@ +Förbättrat + +• Lagt till uppladdningsdatum och visningsantal på strömrutnätobjekt +• Förbättringar för lådhuvudets layout + +Fixat + +• Fixat mute-knapp som orsakar kraschar på API 19 +• Fixat nedladdning av långa 1080p 60fps videor diff --git a/fastlane/metadata/android/sv/changelogs/930.txt b/fastlane/metadata/android/sv/changelogs/930.txt new file mode 100644 index 00000000000..892f08c750f --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/930.txt @@ -0,0 +1,12 @@ +Nytt +• Sök på YouTube Music +• Grundläggande Android TV-stöd + +Förbättrat +• Lade till möjligheten att ta bort alla visade videor från en lokal spellista +• Visa meddelande när innehåll inte stöds ännu istället för att krascha +• Förbättrade ändring av popup-spelarens storlek med nyp gester +• Köa strömmar på långa tryck på bakgrund och popup-knappar i kanalen +• Förbättrad storlekshantering av lådans rubriktitel + +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/940.txt b/fastlane/metadata/android/sv/changelogs/940.txt new file mode 100644 index 00000000000..f7f1eee7e31 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/940.txt @@ -0,0 +1,11 @@ +Nytt +• Lägg till stöd för SoundCloud-kommentarer +• Lägg till inställning för begränsat läge på YouTube +• Visa information om PeerTubes överordnade kanal + +Förbättrat +• Visa Kore-knappen endast för tjänster som stöds +• Blockera spelargester som börjar vid navigations baren eller status baren +• Ändra återförsök och prenumerera knappar bakgrundsfärg baserat på servicefärg + +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/951.txt b/fastlane/metadata/android/sv/changelogs/951.txt new file mode 100644 index 00000000000..519342abc1a --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/951.txt @@ -0,0 +1,8 @@ +Nytt +• Lägg till sökning efter prenumerationsväljare i dialogrutan för flödesgrupp +• Lägg till filter i dialogrutan för flödesgrupp för att endast visa ogrupperade prenumerationer +• Lägg till fliken spellista på huvudsidan +• Snabbspolning framåt / bakåt i bakgrund / popup-spelarkö +• Visa sökförslag: menade du & visar resultat för + +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/952.txt b/fastlane/metadata/android/sv/changelogs/952.txt new file mode 100644 index 00000000000..f76230d8971 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/952.txt @@ -0,0 +1,7 @@ +Förbättrat +• Automatisk spelning är tillgängligt för alla tjänster (istället för bara YouTube) + +Fixat +• Fixade relaterade strömmar genom att stödja YouTubes nya fortsättningar +• Fixade åldersbegränsade YouTube-videor +• [Android TV] Fixade kvardröjande fokus markerade överlägg diff --git a/fastlane/metadata/android/ti/changelogs/850.txt b/fastlane/metadata/android/ti/changelogs/850.txt new file mode 100644 index 00000000000..7d7d9fe5aed --- /dev/null +++ b/fastlane/metadata/android/ti/changelogs/850.txt @@ -0,0 +1 @@ +እዚ ሕታም እዚ እቲ ወብ ሳይት ዩቱብ ዘዳለዎ ሕታም እዋናዊ እዩ ነይሩ። እቲ ናይ ቀደም ወብ ሳይት ሕታም ኣብ መጋቢት ስለ ዚቋረጽ ነቲ ሓድሽ ፓይፕ ከተመሓይሾ ኣሎካ። diff --git a/fastlane/metadata/android/ti/full_description.txt b/fastlane/metadata/android/ti/full_description.txt new file mode 100644 index 00000000000..f0afa90abc1 --- /dev/null +++ b/fastlane/metadata/android/ti/full_description.txt @@ -0,0 +1 @@ +ኒውፓይፕ ዝዀነ ይኹን ናይ ጎልጋል ቤተ-መጻሕፍቲ ወይ ናይ ዩቱብ ኤፒኢ ኣይጥቀምን ኢዩ። ነቲ ወብ ሳይት ዜድልዮ ሓበሬታ ንምርካብ ጥራይ እዩ ዚምርምሮ ። ስለዚ እዚ ኣፕሊኬሽን እዚ ብዘይ ናይ ጎልጋል ሰርቪስ ኣብ ኤለክትሮኒካዊ መሳርሒታት ክትጥቀመሉ ትኽእል ኢኻ ። ኒውፓይፕ ንምጥቃም እውን ናይ ዩቱብ ሕሳብ ኣየድልየካን ኢዩ እዚ ኸኣ FLOSS ኢዩ። diff --git a/fastlane/metadata/android/ti/short_description.txt b/fastlane/metadata/android/ti/short_description.txt new file mode 100644 index 00000000000..f7f2099a19d --- /dev/null +++ b/fastlane/metadata/android/ti/short_description.txt @@ -0,0 +1 @@ +ብናጻ ፈኲስ ናይ ዩቱብ ግንባር ንኣንድሮይድ ። diff --git a/fastlane/metadata/android/tok/full_description.txt b/fastlane/metadata/android/tok/full_description.txt new file mode 100644 index 00000000000..6ad92e97c8d --- /dev/null +++ b/fastlane/metadata/android/tok/full_description.txt @@ -0,0 +1 @@ +ilo Papisin diff --git a/fastlane/metadata/android/tok/short_description.txt b/fastlane/metadata/android/tok/short_description.txt new file mode 100644 index 00000000000..22b36fb9fc7 --- /dev/null +++ b/fastlane/metadata/android/tok/short_description.txt @@ -0,0 +1 @@ +ilo pi lukin e sitelen tawa pi ilo Jutu (YouTube) lon ilo Antoto (Android). diff --git a/fastlane/metadata/android/ur/changelogs/63.txt b/fastlane/metadata/android/ur/changelogs/63.txt new file mode 100644 index 00000000000..80220fcf284 --- /dev/null +++ b/fastlane/metadata/android/ur/changelogs/63.txt @@ -0,0 +1,8 @@ +### بہتری +- درآمد/برآمد کی ترتیبات #1333 +- اوور ڈرا کی کمی (کارکردگی میں بہتری) #1371 +- چھوٹے کوڈ میں بہتری #1375 +- GDPR کے بارے میں سب کچھ شامل کرنا۔ #1420 + +### درستگی +- ڈاؤنلوڈر: .giga فائلز سے نامکمل ڈاؤن لوڈ کو لوڈ کرنے پر کریش ہونے کی درستگی۔ #1407 diff --git a/fastlane/metadata/android/ur/changelogs/956.txt b/fastlane/metadata/android/ur/changelogs/956.txt new file mode 100644 index 00000000000..00f37df8af0 --- /dev/null +++ b/fastlane/metadata/android/ur/changelogs/956.txt @@ -0,0 +1 @@ +(یوٹیوب) ویڈیو لوڈ کرتے ہوئے کریش کو ٹھیک کر دیا گیا ہے diff --git a/fastlane/metadata/android/ur/full_description.txt b/fastlane/metadata/android/ur/full_description.txt new file mode 100644 index 00000000000..eb60c169949 --- /dev/null +++ b/fastlane/metadata/android/ur/full_description.txt @@ -0,0 +1 @@ +نیو پائپ کوئی گوگل فریم ورک لائبریری، یا YouTube API استعمال نہیں کرتا ہے۔ یہ صرف ویب سائٹ کو پارس کرتا ہے تاکہ اس کی ضرورت کی معلومات حاصل کی جا سکے۔ اس لیے اس ایپ کو گوگل سروسز انسٹال کیے بغیر ڈیوائسز پر استعمال کیا جا سکتا ہے۔ اس کے علاوہ، آپ کو نیو پائپ استعمال کرنے کے لیے یوٹیوب اکاؤنٹ کی ضرورت نہیں ہے، اور یہ FLOSS ہے۔ diff --git a/fastlane/metadata/android/ur/short_description.txt b/fastlane/metadata/android/ur/short_description.txt new file mode 100644 index 00000000000..968126c1379 --- /dev/null +++ b/fastlane/metadata/android/ur/short_description.txt @@ -0,0 +1 @@ +اینڈرائیڈ کے لیے ایک لائٹ ویٹ یوٹیوب فرنٹ اینڈ diff --git a/fastlane/metadata/android/vi/changelogs/780.txt b/fastlane/metadata/android/vi/changelogs/780.txt new file mode 100644 index 00000000000..14f3a70418b --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/780.txt @@ -0,0 +1,12 @@ +Các thay đổi trong 0.17.3 + +Cải tiến +• Thêm tùy chọn để xóa trạng thái phát lại #2550 +• Hiển thị các thư mục ẩn trong bộ chọn tệp #2591 +• Hỗ trợ các URL từ các phiên bản `invidio.us` sẽ được mở bằng NewPipe #2488 +• Thêm hỗ trợ cho các URL `music.youtube.com` TeamNewPipe/NewPipeExtractor#194 + +Đã sửa +• [YouTube] Đã sửa 'java.lang.IllegalArgumentException #192 +• [YouTube] Đã sửa luồng không hoạt động TeamNewPipe/NewPipeExtractor#195 +• Đã sửa lỗi hiệu suất trong android Pie khi tải xuống luồng #2592 diff --git a/fastlane/metadata/android/vi/changelogs/992.txt b/fastlane/metadata/android/vi/changelogs/992.txt new file mode 100644 index 00000000000..e7a852351a0 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/992.txt @@ -0,0 +1,17 @@ +Mới +• Số người đăng ký trong chi tiết video +• Tải xuống từ hàng đợi +• Đặt hình thu nhỏ danh sách phát vĩnh viễn +• Nhấn và giữ liên kết và thẻ bắt đầu bằng # +• Chế độ xem thẻ + +Cải tiến +• Nút đóng trình phát mini lớn hơn +• Thu nhỏ hình thu nhỏ mượt mà hơn +• Nhắm mục tiêu Android 13 (API 33) +• Tìm kiếm không còn tạm dừng trình phát + +Đã sửa +• Sửa lớp phủ trên DeX/chuột +• Cho phép trình phát nền không có luồng âm thanh riêng biệt +• Các bản sửa lỗi khác nhau của YouTube và hơn thế nữa… diff --git a/fastlane/metadata/android/vi/changelogs/993.txt b/fastlane/metadata/android/vi/changelogs/993.txt new file mode 100644 index 00000000000..2186fc99cbb --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/993.txt @@ -0,0 +1,12 @@ +Mới +• Thêm cảnh báo khi thêm danh sách phát trùng lặp và nút thêm để xóa chúng +• Cho phép bỏ qua các nút phần cứng +• Cho phép ẩn video đã xem một phần trong nguồn cấp dữ liệu + +Cải tiến +• Sử dụng nhiều cột lưới hơn trên màn hình lớn +• Làm cho các chỉ báo tiến độ nhất quán với cài đặt + +Đã sửa +• Sửa lỗi mở URL trình duyệt, nội dung tải xuống và trình phát bên ngoài trên Android 11 trở lên +• Sửa lỗi tương tác với toàn màn hình yêu cầu hai lần nhấn trên MIUI diff --git a/fastlane/metadata/android/vi/short_description.txt b/fastlane/metadata/android/vi/short_description.txt index d3983722e51..2ab29e40817 100644 --- a/fastlane/metadata/android/vi/short_description.txt +++ b/fastlane/metadata/android/vi/short_description.txt @@ -1 +1 @@ -Một ứng dụng YouTube nhẹ cho Android. +Một giao diện người dùng YouTube nhẹ miễn phí dành cho Android. diff --git a/gradle.properties b/gradle.properties index 032d70cee99..7b138b24e7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,7 @@ +android.defaults.buildfeatures.buildconfig=true android.enableJetifier=false +android.nonFinalResIds=false +android.nonTransitiveRClass=false android.useAndroidX=true -org.gradle.jvmargs=-Xmx2048M +org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED systemProp.file.encoding=utf-8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f09..c1962a79e29 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5116c5b1869..2c3425d49ec 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip -distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 +distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6c20..aeb74cbb43e 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -143,12 +140,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/gradlew.bat b/gradlew.bat index 53a6b238d41..6689b85beec 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME%