diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d5fdc97e0a7..647cfbabb48 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 =============================== @@ -40,10 +42,6 @@ You'll see *exactly* what is sent, be able to add **your comments**, and then se * Create PRs that cover only **one specific issue/solution/bug**. Do not create PRs that are huge monoliths and could have been split into multiple independent contributions. * NewPipe uses [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) to fetch data from services. If you need to change something there, you must test your changes in NewPipe. Telling NewPipe to use your extractor version can be accomplished by editing the `app/build.gradle` file: the comments under the "NewPipe libraries" section of `dependencies` will help you out. -### Kotlin in NewPipe -* NewPipe will remain mostly Java for time being -* Contributions containing a simple conversion from Java to Kotlin should be avoided. Conversions to Kotlin should only be done if Kotlin actually brings improvements like bug fixes or better performance which are not, or only with much more effort, implementable in Java. The core team sees Java as an easier to learn and generally well adopted programming language. - ### Creating a Pull Request (PR) * Make changes on a **separate branch** with a meaningful name, not on the _master_ branch or the _dev_ branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request (PR) on GitHub. @@ -81,6 +79,6 @@ The [ktlint](https://github.com/pinterest/ktlint) plugin does the same job as ch ## Communication -* The #newpipe channel on Libera Chat (`ircs://irc.libera.chat:6697/newpipe`) has the core team and other developers in it. [Click here for webchat](https://web.libera.chat/#newpipe)! -* You can also use a Matrix account to join the NewPipe channel at [#newpipe:libera.chat](https://matrix.to/#/#newpipe:libera.chat). Some convenient clients, available both for phone and desktop, are listed at that link. -* You can post your suggestions, changes, ideas etc. on either GitHub or IRC. +* You can use a Matrix account to join the NewPipe channel at [#newpipe:matrix.newpipe-ev.de](https://matrix.to/#/#newpipe:matrix.newpipe-ev.de). Some convenient clients, available both for phone and desktop, are listed at that link. +* Alternatively, the #newpipe channel on Libera Chat (`ircs://irc.libera.chat:6697/newpipe`) can also be joined, as it is bridged to the Matrix room. [Click here for webchat](https://web.libera.chat/#newpipe)! +* You can post your suggestions, changes, ideas etc. on either GitHub or Matrix (including via IRC). diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/questions.yml similarity index 76% rename from .github/ISSUE_TEMPLATE/question.yml rename to .github/DISCUSSION_TEMPLATE/questions.yml index 134f171f767..2d467d5e5a2 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/DISCUSSION_TEMPLATE/questions.yml @@ -1,11 +1,8 @@ -name: Question -description: Ask about anything NewPipe-related -labels: [question, needs triage] 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 +11,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/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d3befbc8114..52897f1acb7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -14,7 +14,7 @@ body: attributes: label: "Checklist" options: - - label: "I am able to reproduce the bug with the [latest version](https://github.com/TeamNewPipe/NewPipe/releases/latest)." + - label: "I am able to reproduce the bug with the latest version given here: [CLICK THIS LINK](https://github.com/TeamNewPipe/NewPipe/releases/latest)." required: true - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b0fdb56db70..49ab78c7d6a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,11 @@ 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: 💬 Matrix + url: https://matrix.to/#/#newpipe:matrix.newpipe-ev.de + about: Chat with us via Matrix for quick Q/A - name: 💬 IRC url: https://web.libera.chat/#newpipe about: Chat with us via IRC for quick Q/A - - name: 💬 Matrix - url: https://matrix.to/#/#newpipe:libera.chat - about: Chat with us via Matrix 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/changed-lines-count-labeler.yml b/.github/changed-lines-count-labeler.yml new file mode 100644 index 00000000000..902f376c00c --- /dev/null +++ b/.github/changed-lines-count-labeler.yml @@ -0,0 +1,17 @@ +# Add 'size/small' label to any changes with less than 50 lines +size/small: + max: 49 + +# Add 'size/medium' label to any changes between 50 and 249 lines +size/medium: + min: 50 + max: 249 + +# Add 'size/large' label to any changes between 250 and 749 lines +size/large: + min: 250 + max: 749 + +# Add 'size/giant' label to any changes for more than 749 lines +size/giant: + min: 750 diff --git a/.github/workflows/build-release-apk.yml b/.github/workflows/build-release-apk.yml new file mode 100644 index 00000000000..0fad8e1695e --- /dev/null +++ b/.github/workflows/build-release-apk.yml @@ -0,0 +1,38 @@ +name: "Build unsigned release APK on master" + +on: + workflow_dispatch: + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: 'master' + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + cache: 'gradle' + + - name: "Build release APK" + run: ./gradlew assembleRelease --stacktrace + + - name: "Rename APK" + run: | + VERSION_NAME="$(jq -r ".elements[0].versionName" "app/build/outputs/apk/release/output-metadata.json")" + echo "Version name: $VERSION_NAME" >> "$GITHUB_STEP_SUMMARY" + echo '```json' >> "$GITHUB_STEP_SUMMARY" + cat "app/build/outputs/apk/release/output-metadata.json" >> "$GITHUB_STEP_SUMMARY" + echo >> "$GITHUB_STEP_SUMMARY" + echo '```' >> "$GITHUB_STEP_SUMMARY" + # assume there is only one APK in that folder + mv app/build/outputs/apk/release/*.apk "app/build/outputs/apk/release/NewPipe_v$VERSION_NAME.apk" + + - name: "Upload APK" + uses: actions/upload-artifact@v4 + with: + name: app + path: app/build/outputs/apk/release/*.apk diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d12c5a7cc5..54415858ef5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: branches: - dev - master + - refactor - release** paths-ignore: - 'README.md' @@ -36,18 +37,20 @@ jobs: contents: read steps: - - uses: actions/checkout@v3 - - uses: gradle/wrapper-validation-action@v1 + - uses: actions/checkout@v4 + - uses: gradle/wrapper-validation-action@v2 - 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 - uses: actions/setup-java@v3 + - name: set up JDK + uses: actions/setup-java@v4 with: - java-version: 11 + java-version: 21 distribution: "temurin" cache: 'gradle' @@ -55,30 +58,40 @@ jobs: run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint - name: Upload APK - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: app path: app/build/outputs/apk/debug/*.apk test-android: - # macos has hardware acceleration. See android-emulator-runner action - runs-on: macos-latest + runs-on: ubuntu-latest 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 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - - name: set up JDK 11 - uses: actions/setup-java@v3 + - name: set up JDK + uses: actions/setup-java@v4 with: - java-version: 11 + java-version: 21 distribution: "temurin" cache: 'gradle' @@ -86,12 +99,12 @@ 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 - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: android-test-report-api${{ matrix.api-level }} @@ -104,19 +117,19 @@ jobs: contents: read steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 11 - uses: actions/setup-java@v3 + - name: Set up JDK + uses: actions/setup-java@v4 with: - java-version: 11 # Sonar requires JDK 11 + java-version: 21 distribution: "temurin" cache: 'gradle' - name: Cache SonarCloud packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar diff --git a/.github/workflows/image-minimizer.js b/.github/workflows/image-minimizer.js index df1a30f9b14..d099068ba81 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,9 +76,17 @@ 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 + // Async replace function from https://stackoverflow.com/a/48032528 async function replaceAsync(str, regex, asyncFn) { const promises = []; str.replace(regex, (match, ...args) => { @@ -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..d9241c33b62 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 @@ -15,9 +17,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 16 @@ -25,7 +27,7 @@ jobs: run: npm i probe-image-size@7.2.3 --ignore-scripts - name: Minimize simple images - uses: actions/github-script@v6 + uses: actions/github-script@v7 timeout-minutes: 3 with: script: | diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml new file mode 100644 index 00000000000..a18daca3add --- /dev/null +++ b/.github/workflows/pr-labeler.yml @@ -0,0 +1,18 @@ +name: "PR size labeler" +on: [pull_request_target] +permissions: + contents: read + pull-requests: write + +jobs: + changed-lines-count-labeler: + runs-on: ubuntu-latest + name: Automatically labelling pull requests based on the changed lines count + permissions: + pull-requests: write + steps: + - name: Set a label + uses: TeamNewPipe/changed-lines-count-labeler@main + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + configuration-path: .github/changed-lines-count-labeler.yml diff --git a/.idea/icon.svg b/.idea/icon.svg new file mode 100644 index 00000000000..51fdf95dee0 --- /dev/null +++ b/.idea/icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 52e6eef1a96..bf1317f174c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +

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

+

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

+

NewPipe

A libre lightweight streaming front-end for Android.

@@ -10,33 +13,34 @@ - +


ScreenshotsSupported ServicesDescriptionFeaturesInstallation and updatesContributionDonateLicense

WebsiteBlogFAQPress


-*Read this in other languages: [English](README.md), [Español](doc/README.es.md), [हिन्दी](doc/README.hi.md), [한국어](doc/README.ko.md), [Soomaali](doc/README.so.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md).* - -WARNING: THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. +*Read this document in other languages: [Deutsch](doc/README.de.md), [English](README.md), [Español](doc/README.es.md), [Français](doc/README.fr.md), [हिन्दी](doc/README.hi.md), [Italiano](doc/README.it.md), [한국어](doc/README.ko.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [ਪੰਜਾਬੀ ](doc/README.pa.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Soomaali](doc/README.so.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md), [অসমীয়া](doc/README.asm.md), [Српски](doc/README.sr.md), [العربية](README.ar.md)* -PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. +> [!warning] +> THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. +> +> PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. ## Screenshots -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](fastlane/metadata/android/en-US/images/phoneScreenshots/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) ### Supported Services @@ -92,7 +96,7 @@ Also, since they are free and open source software, neither the app nor the Extr ## Installation and updates You can install NewPipe using one of the following methods: 1. Add our custom repo to F-Droid and install it from there. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ - 2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it. + 2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases), [compare the signing key](#apk-info) and install it. 3. Update via F-Droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, and then push the update to users. 4. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. 5. If you're interested in a specific feature or bugfix provided in a Pull Request in this repo, you can also download its APK from within the PR. Read the PR description for instructions. The great thing about PR-specific APKs is that they're installed side-by-side the official app, so you don't have to worry about losing your data or messing anything up. @@ -100,12 +104,20 @@ You can install NewPipe using one of the following methods: We recommend method 1 for most users. APKs installed using method 1 or 2 are compatible with each other (meaning that if you installed NewPipe using either method 1 or 2, you can also update NewPipe using the other), but not with those installed using method 3. This is due to the same signing key (ours) being used for 1 and 2, but a different signing key (F-Droid's) being used for 3. Building a debug APK using method 4 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app. When using method 5, each APK is signed with a different random key supplied by GitHub Actions, so you cannot even update it. You will have to backup and restore the app data each time you wish to use a new APK. In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality breaks and F-Droid doesn't have the latest update yet), we recommend following this procedure: -1. Back up your data via Settings > Content > Export Database so you keep your history, subscriptions, and playlists +1. Back up your data via Settings > Backup and Restore > Export Database so you keep your history, subscriptions, and playlists 2. Uninstall NewPipe 3. Download the APK from the new source and install it -4. Import the data from step 1 via Settings > Content > Import Database +4. Import the data from step 1 via Settings > Backup and Restore > Import Database + +> [!Note] +> When you're importing a database into the official app, always make sure that it is the one you exported _from_ the official app. If you import a database exported from an APK other than the official app, it may break things. Such an action is unsupported, and you should only do so when you're absolutely certain you know what you're doing. + +### APK Info -Note: when you're importing a database into the official app, always make sure that it is the one you exported _from_ the official app. If you import a database exported from an APK other than the official app, it may break things. Such an action is unsupported, and you should only do so when you're absolutely certain you know what you're doing. +This is the SHA fingerprint of NewPipe's signing key to verify downloaded APKs which are signed by us. The fingerprint is also available on [NewPipe's website](https://newpipe.net#download). This is relevant for method 2. +``` +CB:84:06:9B:D6:81:16:BA:FA:E5:EE:4E:E5:B0:8A:56:7A:A6:D8:98:40:4E:7C:B1:2F:9E:75:6D:F5:CF:5C:AB +``` ## Contribution Whether you have ideas, translations, design changes, code cleaning, or even major code changes, help is always welcome. The app gets better and better with each contribution, no matter how big or small! If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTING.md). @@ -123,16 +135,6 @@ If you like NewPipe, you're welcome to send a donation. We prefer Liberapay, as 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. - ## Privacy Policy diff --git a/app/build.gradle b/app/build.gradle index 6066bce4316..662437f642a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,18 @@ +import com.android.tools.profgen.ArtProfileKt +import com.android.tools.profgen.ArtProfileSerializer +import com.android.tools.profgen.DexFile + plugins { id "com.android.application" id "kotlin-android" 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 { - compileSdk 33 + compileSdk 34 namespace 'org.schabi.newpipe' defaultConfig { @@ -16,8 +20,15 @@ android { resValue "string", "app_name", "NewPipe" minSdk 21 targetSdk 33 - versionCode 991 - versionName "0.24.1" + if (System.properties.containsKey('versionCodeOverride')) { + versionCode System.getProperty('versionCodeOverride') as Integer + } else { + versionCode 1001 + } + versionName "0.27.4" + if (System.properties.containsKey('versionNameSuffix')) { + versionNameSuffix System.getProperty('versionNameSuffix') + } testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -46,9 +57,6 @@ android { } } - // Keep the release build type at the end of the list to override 'archivesBaseName' of - // debug build. This seems to be a Gradle bug, therefore - // TODO: update Gradle version release { if (System.properties.containsKey('packageSuffix')) { applicationIdSuffix System.getProperty('packageSuffix') @@ -76,13 +84,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 { @@ -91,26 +99,35 @@ android { buildFeatures { viewBinding true + buildConfig 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', + // 'COPYRIGHT' belongs to RxJava... + 'META-INF/COPYRIGHT'] + } } } ext { - checkstyleVersion = '10.3.1' + checkstyleVersion = '10.12.1' - androidxLifecycleVersion = '2.5.1' - androidxRoomVersion = '2.4.3' - androidxWorkVersion = '2.7.1' + androidxLifecycleVersion = '2.6.2' + androidxRoomVersion = '2.6.1' + androidxWorkVersion = '2.8.1' - icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.2' - googleAutoServiceVersion = '1.0.1' + stateSaverVersion = '1.4.1' + exoPlayerVersion = '2.18.7' + googleAutoServiceVersion = '1.1.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 { @@ -125,7 +142,7 @@ checkstyle { toolVersion = checkstyleVersion } -task runCheckstyle(type: Checkstyle) { +tasks.register('runCheckstyle', Checkstyle) { source 'src' include '**/*.java' exclude '**/gen/**' @@ -146,20 +163,22 @@ task runCheckstyle(type: Checkstyle) { def outputDir = "${project.buildDir}/reports/ktlint/" def inputFiles = project.fileTree(dir: "src", include: "**/*.kt") -task runKtlint(type: JavaExec) { +tasks.register('runKtlint', JavaExec) { inputs.files(inputFiles) outputs.dir(outputDir) 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) { +tasks.register('formatKtlint', JavaExec) { inputs.files(inputFiles) outputs.dir(outputDir) getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "-F", "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } afterEvaluate { @@ -179,7 +198,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.4' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle @@ -187,7 +206,9 @@ 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:2211a24b6934a8a8cdf5547ea1b52daa4cb5de6c' + // WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.24.3` with + // the corresponding commit hash, since JitPack is sometimes buggy + implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.24.3' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ @@ -195,42 +216,43 @@ dependencies { ktlint 'com.pinterest:ktlint:0.45.2' /** Kotlin **/ - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}" + implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}" /** AndroidX **/ - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.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.12.0' implementation 'androidx.documentfile:documentfile:1.0.1' - implementation 'androidx.fragment:fragment-ktx:1.4.1' + implementation 'androidx.fragment:fragment-ktx:1.6.2' implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${androidxLifecycleVersion}" implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0' - implementation 'androidx.media:media:1.6.0' - implementation 'androidx.preference:preference:1.2.0' - implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'androidx.media:media:1.7.0' + implementation 'androidx.preference:preference:1.2.1' + implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation "androidx.room:room-runtime:${androidxRoomVersion}" implementation "androidx.room:room-rxjava3:${androidxRoomVersion}" kapt "androidx.room:room-compiler:${androidxRoomVersion}" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' // Newer version specified to prevent accessibility regressions with RecyclerView, see: // https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 - implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01' + implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02' implementation "androidx.work:work-runtime-ktx:${androidxWorkVersion}" implementation "androidx.work:work-rxjava3:${androidxWorkVersion}" - implementation 'com.google.android.material:material:1.6.1' + implementation 'com.google.android.material:material:1.11.0' /** Third-party libraries **/ // Instance state boilerplate elimination - implementation "frankiesardo:icepick:${icepickVersion}" - kapt "frankiesardo:icepick-processor:${icepickVersion}" + implementation 'com.github.livefront:bridge:v2.0.2' + implementation "com.evernote:android-state:$stateSaverVersion" + kapt "com.evernote:android-state-processor:$stateSaverVersion" // HTML parser - implementation "org.jsoup:jsoup:1.15.3" + implementation "org.jsoup:jsoup:1.17.2" // HTTP client - implementation "com.squareup.okhttp3:okhttp:4.10.0" + implementation "com.squareup.okhttp3:okhttp:4.12.0" // Media player implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}" @@ -259,38 +281,37 @@ dependencies { implementation "io.noties.markwon:linkify:${markwonVersion}" // Crash reporting - implementation "ch.acra:acra-core:5.9.7" + implementation "ch.acra:acra-core:5.11.3" // 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.8" implementation "io.reactivex.rxjava3:rxandroid:3.0.2" // RxJava binding APIs for Android UI widgets implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" // Date and time formatting - implementation "org.ocpsoft.prettytime:prettytime:5.0.6.Final" + implementation "org.ocpsoft.prettytime:prettytime:5.0.8.Final" /** 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}" /** Testing **/ testImplementation 'junit:junit:4.13.2' - testImplementation "org.mockito:mockito-core:${mockitoVersion}" - testImplementation "org.mockito:mockito-inline:${mockitoVersion}" + testImplementation 'org.mockito:mockito-core:5.6.0' - 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.24.2" } static String getGitWorkingBranch() { @@ -308,3 +329,25 @@ static String getGitWorkingBranch() { return "" } } + +// fix reproducible builds +project.afterEvaluate { + tasks.compileReleaseArtProfile.doLast { + outputs.files.each { file -> + if (file.toString().endsWith(".profm")) { + println("Sorting ${file} ...") + def version = ArtProfileSerializer.valueOf("METADATA_0_0_2") + def profile = ArtProfileKt.ArtProfile(file) + def keys = new ArrayList(profile.profileData.keySet()) + def sortedData = new LinkedHashMap() + Collections.sort keys, new DexFile.Companion() + keys.each { key -> sortedData[key] = profile.profileData[key] } + new FileOutputStream(file).with { + write(version.magicBytes$profgen) + write(version.versionBytes$profgen) + version.write$profgen(it, sortedData, "") + } + } + } + } +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5e10d3916ab..215df0da58b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,45 +1,23 @@ -# 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.JavaToJSONConverters -dontwarn org.mozilla.javascript.tools.** -# Rules for icepick. Copy paste from https://github.com/frankiesardo/icepick --dontwarn icepick.** --keep class icepick.** { *; } --keep class **$$Icepick { *; } --keepclasseswithmembernames class * { - @icepick.* ; -} --keepnames class * { @icepick.State *;} +## Rules for ExoPlayer +-keep class com.google.android.exoplayer2.** { *; } -## 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 +25,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/sampledata/channels.json b/app/sampledata/channels.json new file mode 100644 index 00000000000..207d785972c --- /dev/null +++ b/app/sampledata/channels.json @@ -0,0 +1,19 @@ +{ + "data": [ + { + "name": "BBC", + "additional": "12K subscribers•233 videos", + "description": "The BBC is the world’s leading public service broadcaster. We’re impartial and independent, and every day we create distinctive, world-class programmes and content which inform, educate and entertain millions of people in the UK and around the world. SUBSCRIBE to our YouTube channel to get the best of BBC entertainment and comedy programmes, stories from science and nature documentaries, and much more! https://bit.ly/2IXqEIn Get ALL your fresh TV, and sofa-hugging box sets on iPlayer https://bbc.in/2J18jYJ" + }, + { + "name": "Linus Tech Tips", + "additional": "1M subscribers•233 videos", + "description": "Looking for a Tech YouTuber?\n\nLinus Tech Tips is a passionate team of \"professionally curious\" experts in consumer technology and video production which aims to inform and educate people of all ages through our entertaining videos. We create product reviews, step-by-step computer build guides, and a variety of other tech-focused content.\n\nSchedule:\nNew videos every Saturday to Thursday @ 10:00am Pacific\nLive WAN Show podcasts every Friday @ ~5:00pm Pacific" + }, + { + "name": "Marques Brownlee", + "additional": "13 subscribers•12K videos", + "description": "MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!\n\nbusiness@MKBHD.com\n\nNYC" + } + ] +} \ No newline at end of file diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/7.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/7.json new file mode 100644 index 00000000000..a14f8b9a8fd --- /dev/null +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/7.json @@ -0,0 +1,737 @@ +{ + "formatVersion": 1, + "database": { + "version": 7, + "identityHash": "012fc8e7ad3333f1597347f34e76a513", + "entities": [ + { + "tableName": "subscriptions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatar_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subscriberCount", + "columnName": "subscriber_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationMode", + "columnName": "notification_mode", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_subscriptions_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "search_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "creationDate", + "columnName": "creation_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "search", + "columnName": "search", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_search_history_search", + "unique": false, + "columnNames": [ + "search" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "streams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "streamType", + "columnName": "stream_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uploaderUrl", + "columnName": "uploader_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "viewCount", + "columnName": "view_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "textualUploadDate", + "columnName": "textual_upload_date", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploadDate", + "columnName": "upload_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isUploadDateApproximation", + "columnName": "is_upload_date_approximation", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_streams_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "stream_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "accessDate", + "columnName": "access_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatCount", + "columnName": "repeat_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id", + "access_date" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_stream_history_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "stream_state", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progressMillis", + "columnName": "progress_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, `thumbnail_stream_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isThumbnailPermanent", + "columnName": "is_thumbnail_permanent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "thumbnailStreamId", + "columnName": "thumbnail_stream_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "playlist_stream_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "playlistUid", + "columnName": "playlist_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "join_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "playlist_id", + "join_index" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_playlist_stream_join_playlist_id_join_index", + "unique": true, + "columnNames": [ + "playlist_id", + "join_index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" + }, + { + "name": "index_playlist_stream_join_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "playlists", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "playlist_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "remote_playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "streamCount", + "columnName": "stream_count", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_remote_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)" + }, + { + "name": "index_remote_playlists_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "streamId", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id", + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_feed_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_group", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sortOrder", + "columnName": "sort_order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_feed_group_sort_order", + "unique": false, + "columnNames": [ + "sort_order" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed_group_subscription_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "feedGroupId", + "columnName": "group_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "group_id", + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_feed_group_subscription_join_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "feed_group", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "group_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_last_updated", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUpdated", + "columnName": "last_updated", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '012fc8e7ad3333f1597347f34e76a513')" + ] + } +} \ No newline at end of file diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/8.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/8.json new file mode 100644 index 00000000000..d4a89567b8f --- /dev/null +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/8.json @@ -0,0 +1,737 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "012fc8e7ad3333f1597347f34e76a513", + "entities": [ + { + "tableName": "subscriptions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatar_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subscriberCount", + "columnName": "subscriber_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationMode", + "columnName": "notification_mode", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_subscriptions_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "search_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "creationDate", + "columnName": "creation_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "search", + "columnName": "search", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_search_history_search", + "unique": false, + "columnNames": [ + "search" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "streams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "streamType", + "columnName": "stream_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uploaderUrl", + "columnName": "uploader_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "viewCount", + "columnName": "view_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "textualUploadDate", + "columnName": "textual_upload_date", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploadDate", + "columnName": "upload_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isUploadDateApproximation", + "columnName": "is_upload_date_approximation", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_streams_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "stream_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "accessDate", + "columnName": "access_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatCount", + "columnName": "repeat_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id", + "access_date" + ] + }, + "indices": [ + { + "name": "index_stream_history_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "stream_state", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progressMillis", + "columnName": "progress_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, `thumbnail_stream_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isThumbnailPermanent", + "columnName": "is_thumbnail_permanent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "thumbnailStreamId", + "columnName": "thumbnail_stream_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "playlist_stream_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "playlistUid", + "columnName": "playlist_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "join_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "playlist_id", + "join_index" + ] + }, + "indices": [ + { + "name": "index_playlist_stream_join_playlist_id_join_index", + "unique": true, + "columnNames": [ + "playlist_id", + "join_index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" + }, + { + "name": "index_playlist_stream_join_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "playlists", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "playlist_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "remote_playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "streamCount", + "columnName": "stream_count", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_remote_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)" + }, + { + "name": "index_remote_playlists_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "streamId", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id", + "subscription_id" + ] + }, + "indices": [ + { + "name": "index_feed_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_group", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sortOrder", + "columnName": "sort_order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_feed_group_sort_order", + "unique": false, + "columnNames": [ + "sort_order" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed_group_subscription_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "feedGroupId", + "columnName": "group_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "group_id", + "subscription_id" + ] + }, + "indices": [ + { + "name": "index_feed_group_subscription_join_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "feed_group", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "group_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_last_updated", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUpdated", + "columnName": "last_updated", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "subscription_id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '012fc8e7ad3333f1597347f34e76a513')" + ] + } +} \ No newline at end of file diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json new file mode 100644 index 00000000000..aced06c0ab0 --- /dev/null +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json @@ -0,0 +1,730 @@ +{ + "formatVersion": 1, + "database": { + "version": 9, + "identityHash": "7591e8039faa74d8c0517dc867af9d3e", + "entities": [ + { + "tableName": "subscriptions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatar_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subscriberCount", + "columnName": "subscriber_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationMode", + "columnName": "notification_mode", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_subscriptions_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "search_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "creationDate", + "columnName": "creation_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "search", + "columnName": "search", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_search_history_search", + "unique": false, + "columnNames": [ + "search" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "streams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "streamType", + "columnName": "stream_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uploaderUrl", + "columnName": "uploader_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "viewCount", + "columnName": "view_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "textualUploadDate", + "columnName": "textual_upload_date", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploadDate", + "columnName": "upload_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isUploadDateApproximation", + "columnName": "is_upload_date_approximation", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_streams_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "stream_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "accessDate", + "columnName": "access_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatCount", + "columnName": "repeat_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id", + "access_date" + ] + }, + "indices": [ + { + "name": "index_stream_history_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "stream_state", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progressMillis", + "columnName": "progress_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, `thumbnail_stream_id` INTEGER NOT NULL, `display_index` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isThumbnailPermanent", + "columnName": "is_thumbnail_permanent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "thumbnailStreamId", + "columnName": "thumbnail_stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "displayIndex", + "columnName": "display_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "playlist_stream_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "playlistUid", + "columnName": "playlist_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "join_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "playlist_id", + "join_index" + ] + }, + "indices": [ + { + "name": "index_playlist_stream_join_playlist_id_join_index", + "unique": true, + "columnNames": [ + "playlist_id", + "join_index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" + }, + { + "name": "index_playlist_stream_join_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "playlists", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "playlist_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "remote_playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `display_index` INTEGER NOT NULL, `stream_count` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "displayIndex", + "columnName": "display_index", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamCount", + "columnName": "stream_count", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_remote_playlists_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "streamId", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id", + "subscription_id" + ] + }, + "indices": [ + { + "name": "index_feed_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_group", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sortOrder", + "columnName": "sort_order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_feed_group_sort_order", + "unique": false, + "columnNames": [ + "sort_order" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed_group_subscription_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "feedGroupId", + "columnName": "group_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "group_id", + "subscription_id" + ] + }, + "indices": [ + { + "name": "index_feed_group_subscription_join_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "feed_group", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "group_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_last_updated", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUpdated", + "columnName": "last_updated", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "subscription_id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7591e8039faa74d8c0517dc867af9d3e')" + ] + } +} \ No newline at end of file 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 be95c8e277c..a34cfece671 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -4,15 +4,18 @@ 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 import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals import org.junit.Assert.assertNull import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.schabi.newpipe.database.playlist.model.PlaylistEntity +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity +import org.schabi.newpipe.extractor.ServiceList import org.schabi.newpipe.extractor.stream.StreamType @RunWith(AndroidJUnit4::class) @@ -21,20 +24,23 @@ class DatabaseMigrationTest { private const val DEFAULT_SERVICE_ID = 0 private const val DEFAULT_URL = "https://www.youtube.com/watch?v=cDphUib5iG4" private const val DEFAULT_TITLE = "Test Title" + private const val DEFAULT_NAME = "Test Name" private val DEFAULT_TYPE = StreamType.VIDEO_STREAM private const val DEFAULT_DURATION = 480L private const val DEFAULT_UPLOADER_NAME = "Uploader Test" private const val DEFAULT_THUMBNAIL = "https://example.com/example.jpg" - private const val DEFAULT_SECOND_SERVICE_ID = 0 + private const val DEFAULT_SECOND_SERVICE_ID = 1 private const val DEFAULT_SECOND_URL = "https://www.youtube.com/watch?v=ncQU6iBn5Fc" + + private const val DEFAULT_THIRD_SERVICE_ID = 2 + private const val DEFAULT_THIRD_URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" } @get:Rule val testHelper = MigrationTestHelper( InstrumentationRegistry.getInstrumentation(), - AppDatabase::class.java.canonicalName, - FrameworkSQLiteOpenHelperFactory() + AppDatabase::class.java ) @Test @@ -101,6 +107,27 @@ class DatabaseMigrationTest { Migrations.MIGRATION_5_6 ) + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_7, + true, + Migrations.MIGRATION_6_7 + ) + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_8, + true, + Migrations.MIGRATION_7_8 + ) + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_9, + true, + Migrations.MIGRATION_8_9 + ) + val migratedDatabaseV3 = getMigratedDatabase() val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst() @@ -135,6 +162,157 @@ class DatabaseMigrationTest { assertNull(secondStreamFromMigratedDatabase.isUploadDateApproximation) } + @Test + fun migrateDatabaseFrom7to8() { + val databaseInV7 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_7) + + val defaultSearch1 = " abc " + val defaultSearch2 = " abc" + + val serviceId = DEFAULT_SERVICE_ID // YouTube + // Use id different to YouTube because two searches with the same query + // but different service are considered not equal. + val otherServiceId = ServiceList.SoundCloud.serviceId + + databaseInV7.run { + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", serviceId) + put("search", defaultSearch1) + } + ) + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", serviceId) + put("search", defaultSearch2) + } + ) + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", otherServiceId) + put("search", defaultSearch1) + } + ) + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", otherServiceId) + put("search", defaultSearch2) + } + ) + close() + } + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, Migrations.DB_VER_8, + true, Migrations.MIGRATION_7_8 + ) + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, Migrations.DB_VER_9, + true, Migrations.MIGRATION_8_9 + ) + + val migratedDatabaseV8 = getMigratedDatabase() + val listFromDB = migratedDatabaseV8.searchHistoryDAO().all.blockingFirst() + + assertEquals(2, listFromDB.size) + assertEquals("abc", listFromDB[0].search) + assertEquals("abc", listFromDB[1].search) + assertNotEquals(listFromDB[0].serviceId, listFromDB[1].serviceId) + } + + @Test + fun migrateDatabaseFrom8to9() { + val databaseInV8 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_8) + + val localUid1: Long + val localUid2: Long + val remoteUid1: Long + val remoteUid2: Long + databaseInV8.run { + localUid1 = insert( + "playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("name", DEFAULT_NAME + "1") + put("is_thumbnail_permanent", false) + put("thumbnail_stream_id", -1) + } + ) + localUid2 = insert( + "playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("name", DEFAULT_NAME + "2") + put("is_thumbnail_permanent", false) + put("thumbnail_stream_id", -1) + } + ) + delete( + "playlists", "uid = ?", + Array(1) { localUid1 } + ) + remoteUid1 = insert( + "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", DEFAULT_SERVICE_ID) + put("url", DEFAULT_URL) + } + ) + remoteUid2 = insert( + "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", DEFAULT_SECOND_SERVICE_ID) + put("url", DEFAULT_SECOND_URL) + } + ) + delete( + "remote_playlists", "uid = ?", + Array(1) { remoteUid2 } + ) + close() + } + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_9, + true, + Migrations.MIGRATION_8_9 + ) + + val migratedDatabaseV9 = getMigratedDatabase() + var localListFromDB = migratedDatabaseV9.playlistDAO().all.blockingFirst() + var remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().all.blockingFirst() + + assertEquals(1, localListFromDB.size) + assertEquals(localUid2, localListFromDB[0].uid) + assertEquals(-1, localListFromDB[0].displayIndex) + assertEquals(1, remoteListFromDB.size) + assertEquals(remoteUid1, remoteListFromDB[0].uid) + assertEquals(-1, remoteListFromDB[0].displayIndex) + + val localUid3 = migratedDatabaseV9.playlistDAO().insert( + PlaylistEntity(DEFAULT_NAME + "3", false, -1, -1) + ) + val remoteUid3 = migratedDatabaseV9.playlistRemoteDAO().insert( + PlaylistRemoteEntity( + DEFAULT_THIRD_SERVICE_ID, DEFAULT_NAME, DEFAULT_THIRD_URL, + DEFAULT_THUMBNAIL, DEFAULT_UPLOADER_NAME, -1, 10 + ) + ) + + localListFromDB = migratedDatabaseV9.playlistDAO().all.blockingFirst() + remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().all.blockingFirst() + assertEquals(2, localListFromDB.size) + assertEquals(localUid3, localListFromDB[1].uid) + assertEquals(-1, localListFromDB[1].displayIndex) + assertEquals(2, remoteListFromDB.size) + assertEquals(remoteUid3, remoteListFromDB[1].uid) + assertEquals(-1, remoteListFromDB[1].displayIndex) + } + private fun getMigratedDatabase(): AppDatabase { val database: AppDatabase = Room.databaseBuilder( ApplicationProvider.getApplicationContext(), diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt new file mode 100644 index 00000000000..893ae82b7f9 --- /dev/null +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -0,0 +1,130 @@ +package org.schabi.newpipe.database + +import android.content.Context +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import io.reactivex.rxjava3.core.Single +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Before +import org.junit.Test +import org.schabi.newpipe.database.feed.dao.FeedDAO +import org.schabi.newpipe.database.feed.model.FeedEntity +import org.schabi.newpipe.database.feed.model.FeedGroupEntity +import org.schabi.newpipe.database.stream.StreamWithState +import org.schabi.newpipe.database.stream.dao.StreamDAO +import org.schabi.newpipe.database.stream.model.StreamEntity +import org.schabi.newpipe.database.subscription.SubscriptionDAO +import org.schabi.newpipe.database.subscription.SubscriptionEntity +import org.schabi.newpipe.extractor.ServiceList +import org.schabi.newpipe.extractor.channel.ChannelInfo +import org.schabi.newpipe.extractor.stream.StreamType +import java.io.IOException +import java.time.OffsetDateTime +import kotlin.streams.toList + +class FeedDAOTest { + private lateinit var db: AppDatabase + private lateinit var feedDAO: FeedDAO + private lateinit var streamDAO: StreamDAO + private lateinit var subscriptionDAO: SubscriptionDAO + + private val serviceId = ServiceList.YouTube.serviceId + + private val stream1 = StreamEntity(1, serviceId, "https://youtube.com/watch?v=1", "stream 1", StreamType.VIDEO_STREAM, 1000, "channel-1", "https://youtube.com/channel/1", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-01-01", OffsetDateTime.parse("2023-01-01T00:00:00Z")) + private val stream2 = StreamEntity(2, serviceId, "https://youtube.com/watch?v=2", "stream 2", StreamType.VIDEO_STREAM, 1000, "channel-1", "https://youtube.com/channel/1", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-01-02", OffsetDateTime.parse("2023-01-02T00:00:00Z")) + private val stream3 = StreamEntity(3, serviceId, "https://youtube.com/watch?v=3", "stream 3", StreamType.LIVE_STREAM, 1000, "channel-1", "https://youtube.com/channel/1", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-01-03", OffsetDateTime.parse("2023-01-03T00:00:00Z")) + private val stream4 = StreamEntity(4, serviceId, "https://youtube.com/watch?v=4", "stream 4", StreamType.VIDEO_STREAM, 1000, "channel-2", "https://youtube.com/channel/2", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z")) + private val stream5 = StreamEntity(5, serviceId, "https://youtube.com/watch?v=5", "stream 5", StreamType.VIDEO_STREAM, 1000, "channel-2", "https://youtube.com/channel/2", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-20", OffsetDateTime.parse("2023-08-20T00:00:00Z")) + private val stream6 = StreamEntity(6, serviceId, "https://youtube.com/watch?v=6", "stream 6", StreamType.VIDEO_STREAM, 1000, "channel-3", "https://youtube.com/channel/3", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-09-01", OffsetDateTime.parse("2023-09-01T00:00:00Z")) + private val stream7 = StreamEntity(7, serviceId, "https://youtube.com/watch?v=7", "stream 7", StreamType.VIDEO_STREAM, 1000, "channel-4", "https://youtube.com/channel/4", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z")) + + private val allStreams = listOf( + stream1, stream2, stream3, stream4, stream5, stream6, stream7 + ) + + @Before + fun createDb() { + val context = ApplicationProvider.getApplicationContext() + db = Room.inMemoryDatabaseBuilder( + context, AppDatabase::class.java + ).build() + feedDAO = db.feedDAO() + streamDAO = db.streamDAO() + subscriptionDAO = db.subscriptionDAO() + } + + @After + @Throws(IOException::class) + fun closeDb() { + db.close() + } + + @Test + fun testUnlinkStreamsOlderThan_KeepOne() { + setupUnlinkDelete("2023-08-15T00:00:00Z") + val streams = feedDAO.getStreams( + FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + ) + .blockingGet() + val allowedStreams = listOf(stream3, stream5, stream6, stream7) + assertEqual(streams, allowedStreams) + } + + @Test + fun testUnlinkStreamsOlderThan_KeepMultiple() { + setupUnlinkDelete("2023-08-01T00:00:00Z") + val streams = feedDAO.getStreams( + FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + ) + .blockingGet() + val allowedStreams = listOf(stream3, stream4, stream5, stream6, stream7) + assertEqual(streams, allowedStreams) + } + + private fun assertEqual(streams: List?, allowedStreams: List) { + assertNotNull(streams) + assertEquals( + allowedStreams, + streams!! + .map { it.stream } + .sortedBy { it.uid } + .toList() + ) + } + + private fun setupUnlinkDelete(time: String) { + clearAndFillTables() + Single.fromCallable { + feedDAO.unlinkStreamsOlderThan(OffsetDateTime.parse(time)) + }.blockingSubscribe() + Single.fromCallable { + streamDAO.deleteOrphans() + }.blockingSubscribe() + } + + private fun clearAndFillTables() { + db.clearAllTables() + streamDAO.insertAll(allStreams) + subscriptionDAO.insertAll( + listOf( + SubscriptionEntity.from(ChannelInfo(serviceId, "1", "https://youtube.com/channel/1", "https://youtube.com/channel/1", "channel-1")), + SubscriptionEntity.from(ChannelInfo(serviceId, "2", "https://youtube.com/channel/2", "https://youtube.com/channel/2", "channel-2")), + SubscriptionEntity.from(ChannelInfo(serviceId, "3", "https://youtube.com/channel/3", "https://youtube.com/channel/3", "channel-3")), + SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")), + ) + ) + feedDAO.insertAll( + listOf( + FeedEntity(1, 1), + FeedEntity(2, 1), + FeedEntity(3, 1), + FeedEntity(4, 2), + FeedEntity(5, 2), + FeedEntity(6, 3), + FeedEntity(7, 4), + ) + ) + } +} 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..213b679f009 --- /dev/null +++ b/app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java @@ -0,0 +1,82 @@ +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.subscription.SubscriptionEntity; +import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.testUtil.TestDatabase; +import org.schabi.newpipe.testUtil.TrampolineSchedulerRule; + +import java.io.IOException; +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); + 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); + 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()); + } +} diff --git a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt index 0fe251c16b6..9b8ee211e3a 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt @@ -12,15 +12,21 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import androidx.test.internal.runner.junit4.statement.UiThreadStatement import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.schabi.newpipe.R import org.schabi.newpipe.extractor.MediaFormat +import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.stream.AudioStream import org.schabi.newpipe.extractor.stream.Stream import org.schabi.newpipe.extractor.stream.SubtitlesStream import org.schabi.newpipe.extractor.stream.VideoStream +import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper @MediumTest @RunWith(AndroidJUnit4::class) @@ -84,7 +90,7 @@ class StreamItemAdapterTest { @Test fun subtitleStreams_noIcon() { val adapter = StreamItemAdapter( - StreamItemAdapter.StreamSizeWrapper( + StreamItemAdapter.StreamInfoWrapper( (0 until 5).map { SubtitlesStream.Builder() .setContent("https://example.com", true) @@ -105,7 +111,7 @@ class StreamItemAdapterTest { @Test fun audioStreams_noIcon() { val adapter = StreamItemAdapter( - StreamItemAdapter.StreamSizeWrapper( + StreamItemAdapter.StreamInfoWrapper( (0 until 5).map { AudioStream.Builder() .setId(Stream.ID_UNKNOWN) @@ -123,12 +129,109 @@ class StreamItemAdapterTest { } } + @Test + fun retrieveMediaFormatFromFileTypeHeaders() { + val streams = getIncompleteAudioStreams(5) + val wrapper = StreamInfoWrapper(streams, context) + val retrieveMediaFormat = { stream: AudioStream, response: Response -> + StreamInfoWrapper.retrieveMediaFormatFromFileTypeHeaders(stream, wrapper, response) + } + val helper = AssertionHelper(streams, wrapper, retrieveMediaFormat) + + helper.assertInvalidResponse(getResponse(mapOf(Pair("content-length", "mp3"))), 0) + helper.assertInvalidResponse(getResponse(mapOf(Pair("file-type", "mp0"))), 1) + + helper.assertValidResponse(getResponse(mapOf(Pair("x-amz-meta-file-type", "aiff"))), 2, MediaFormat.AIFF) + helper.assertValidResponse(getResponse(mapOf(Pair("file-type", "mp3"))), 3, MediaFormat.MP3) + } + + @Test + fun retrieveMediaFormatFromContentDispositionHeader() { + val streams = getIncompleteAudioStreams(11) + val wrapper = StreamInfoWrapper(streams, context) + val retrieveMediaFormat = { stream: AudioStream, response: Response -> + StreamInfoWrapper.retrieveMediaFormatFromContentDispositionHeader(stream, wrapper, response) + } + val helper = AssertionHelper(streams, wrapper, retrieveMediaFormat) + + helper.assertInvalidResponse(getResponse(mapOf(Pair("content-length", "mp3"))), 0) + helper.assertInvalidResponse( + getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.png\""))), 1 + ) + helper.assertInvalidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"data.csv\""))), 2 + ) + helper.assertInvalidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; filename=\"data.csv\""))), 3 + ) + helper.assertInvalidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"fieldName\"; filename*=\"filename.jpg\""))), 4 + ) + + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.ogg\""))), + 5, MediaFormat.OGG + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Disposition", "some-form-data; filename=\"audio.flac\""))), + 6, MediaFormat.FLAC + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.aiff\"; filename=\"audio.aiff\""))), + 7, MediaFormat.AIFF + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"alien?\"; filename*=UTF-8''%CE%B1%CE%BB%CE%B9%CF%B5%CE%BD.m4a"))), + 8, MediaFormat.M4A + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.mp3\"; filename=\"audio.opus\"; filename*=UTF-8''alien.opus"))), + 9, MediaFormat.OPUS + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.mp3\"; filename=\"audio.opus\"; filename*=\"UTF-8''alien.opus\""))), + 10, MediaFormat.OPUS + ) + } + + @Test + fun retrieveMediaFormatFromContentTypeHeader() { + val streams = getIncompleteAudioStreams(12) + val wrapper = StreamInfoWrapper(streams, context) + val retrieveMediaFormat = { stream: AudioStream, response: Response -> + StreamInfoWrapper.retrieveMediaFormatFromContentTypeHeader(stream, wrapper, response) + } + val helper = AssertionHelper(streams, wrapper, retrieveMediaFormat) + + helper.assertInvalidResponse(getResponse(mapOf(Pair("content-length", "984501"))), 0) + helper.assertInvalidResponse(getResponse(mapOf(Pair("Content-Type", "audio/xyz"))), 1) + helper.assertInvalidResponse(getResponse(mapOf(Pair("Content-Type", "mp3"))), 2) + helper.assertInvalidResponse(getResponse(mapOf(Pair("Content-Type", "mp3"))), 3) + helper.assertInvalidResponse(getResponse(mapOf(Pair("Content-Type", "audio/mpeg"))), 4) + helper.assertInvalidResponse(getResponse(mapOf(Pair("Content-Type", "audio/aif"))), 5) + helper.assertInvalidResponse(getResponse(mapOf(Pair("Content-Type", "whatever"))), 6) + helper.assertInvalidResponse(getResponse(mapOf()), 7) + + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Type", "audio/flac"))), 8, MediaFormat.FLAC + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Type", "audio/wav"))), 9, MediaFormat.WAV + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Type", "audio/opus"))), 10, MediaFormat.OPUS + ) + helper.assertValidResponse( + getResponse(mapOf(Pair("Content-Type", "audio/aiff"))), 11, MediaFormat.AIFF + ) + } + /** * @return a list of video streams, in which their video only property mirrors the provided * [videoOnly] vararg. */ private fun getVideoStreams(vararg videoOnly: Boolean) = - StreamItemAdapter.StreamSizeWrapper( + StreamItemAdapter.StreamInfoWrapper( videoOnly.map { VideoStream.Builder() .setId(Stream.ID_UNKNOWN) @@ -161,6 +264,19 @@ class StreamItemAdapterTest { } ) + private fun getIncompleteAudioStreams(size: Int): List { + val list = ArrayList(size) + for (i in 1..size) { + list.add( + AudioStream.Builder() + .setId(Stream.ID_UNKNOWN) + .setContent("https://example.com/$i", true) + .build() + ) + } + return list + } + /** * Checks whether the item at [position] in the [spinner] has the correct icon visibility when * it is shown in normal mode (selected) and in dropdown mode (user is choosing one of a list). @@ -196,11 +312,56 @@ class StreamItemAdapterTest { streams.forEachIndexed { index, stream -> val secondaryStreamHelper: SecondaryStreamHelper? = stream?.let { SecondaryStreamHelper( - StreamItemAdapter.StreamSizeWrapper(streams, context), + StreamItemAdapter.StreamInfoWrapper(streams, context), it ) } put(index, secondaryStreamHelper) } } + + private fun getResponse(headers: Map): Response { + val listHeaders = HashMap>() + headers.forEach { entry -> + listHeaders[entry.key] = listOf(entry.value) + } + return Response(200, null, listHeaders, "", "") + } + + /** + * Helper class for assertion related to extractions of [MediaFormat]s. + */ + class AssertionHelper( + private val streams: List, + private val wrapper: StreamInfoWrapper, + private val retrieveMediaFormat: (stream: T, response: Response) -> Boolean + ) { + + /** + * Assert that an invalid response does not result in wrongly extracted [MediaFormat]. + */ + fun assertInvalidResponse( + response: Response, + index: Int + ) { + assertFalse( + "invalid header returns valid value", retrieveMediaFormat(streams[index], response) + ) + assertNull("Media format extracted although stated otherwise", wrapper.getFormat(index)) + } + + /** + * Assert that a valid response results in correctly extracted and handled [MediaFormat]. + */ + fun assertValidResponse( + response: Response, + index: Int, + format: MediaFormat + ) { + assertTrue( + "header was not recognized", retrieveMediaFormat(streams[index], response) + ) + assertEquals("Wrong media format extracted", format, wrapper.getFormat(index)) + } + } } 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 3e987abdbb0..d11de9f478d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,14 @@ + + + + + + + + @@ -165,6 +173,7 @@ + @@ -348,15 +357,17 @@ + - + + + - - - + + diff --git a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java index 8d87e90bddf..8d03a148604 100644 --- a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java +++ b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java @@ -25,6 +25,7 @@ import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.os.BundleCompat; import androidx.lifecycle.Lifecycle; import androidx.viewpager.widget.PagerAdapter; @@ -284,7 +285,7 @@ public Parcelable saveState() { Bundle state = null; if (!mSavedState.isEmpty()) { state = new Bundle(); - state.putParcelableArray("states", mSavedState.toArray(new Fragment.SavedState[0])); + state.putParcelableArrayList("states", mSavedState); } for (int i = 0; i < mFragments.size(); i++) { final Fragment f = mFragments.get(i); @@ -311,13 +312,12 @@ public void restoreState(@Nullable final Parcelable state, @Nullable final Class if (state != null) { final Bundle bundle = (Bundle) state; bundle.setClassLoader(loader); - final Parcelable[] fss = bundle.getParcelableArray("states"); + final var states = BundleCompat.getParcelableArrayList(bundle, "states", + Fragment.SavedState.class); mSavedState.clear(); mFragments.clear(); - if (fss != null) { - for (final Parcelable parcelable : fss) { - mSavedState.add((Fragment.SavedState) parcelable); - } + if (states != null) { + mSavedState.addAll(states); } final Iterable keys = bundle.keySet(); for (final String key : keys) { diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index f4410a31b2a..9bc25d55d7f 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -19,10 +19,13 @@ import org.schabi.newpipe.extractor.downloader.Downloader; import org.schabi.newpipe.ktx.ExceptionUtils; import org.schabi.newpipe.settings.NewPipeSettings; +import org.schabi.newpipe.util.BridgeStateSaverInitializer; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.PreferredImageQuality; import java.io.IOException; import java.io.InterruptedIOException; @@ -58,6 +61,8 @@ public class App extends Application { public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID; private static final String TAG = App.class.toString(); + + private boolean isFirstRun = false; private static App app; @NonNull @@ -83,7 +88,13 @@ public void onCreate() { return; } - // Initialize settings first because others inits can use its values + // check if the last used preference version is set + // to determine whether this is the first app run + final int lastUsedPrefVersion = PreferenceManager.getDefaultSharedPreferences(this) + .getInt(getString(R.string.last_used_preferences_version), -1); + isFirstRun = lastUsedPrefVersion == -1; + + // Initialize settings first because other initializations can use its values NewPipeSettings.initSettings(this); NewPipe.init(getDownloader(), @@ -91,6 +102,7 @@ public void onCreate() { Localization.getPreferredContentCountry(this)); Localization.initPrettyTime(Localization.resolvePrettyTime(getApplicationContext())); + BridgeStateSaverInitializer.init(this); StateSaver.init(this); initNotificationChannels(); @@ -99,8 +111,9 @@ public void onCreate() { // Initialize image loader final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); PicassoHelper.init(this); - PicassoHelper.setShouldLoadImages( - prefs.getBoolean(getString(R.string.download_thumbnail_key), true)); + ImageStrategy.setPreferredImageQuality(PreferredImageQuality.fromPreferenceKey(this, + prefs.getString(getString(R.string.image_quality_key), + getString(R.string.image_quality_default)))); PicassoHelper.setIndicatorsEnabled(MainActivity.DEBUG && prefs.getBoolean(getString(R.string.show_image_indicators_key), false)); @@ -252,4 +265,7 @@ protected boolean isDisposedRxExceptionsReported() { return false; } + public boolean isFirstRun() { + return isFirstRun; + } } diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java index 16ddb83766e..a55a341e623 100644 --- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java @@ -10,9 +10,9 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; -import icepick.Icepick; -import icepick.State; -import leakcanary.AppWatcher; +import com.evernote.android.state.State; +import com.livefront.bridge.Bridge; + public abstract class BaseFragment extends Fragment { protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()); @@ -49,7 +49,7 @@ public void onCreate(final Bundle savedInstanceState) { + "savedInstanceState = [" + savedInstanceState + "]"); } super.onCreate(savedInstanceState); - Icepick.restoreInstanceState(this, savedInstanceState); + Bridge.restoreInstanceState(this, savedInstanceState); if (savedInstanceState != null) { onRestoreInstanceState(savedInstanceState); } @@ -71,26 +71,39 @@ public void onViewCreated(@NonNull final View rootView, final Bundle savedInstan @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + Bridge.saveInstanceState(this, outState); } protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) { } - @Override - public void onDestroy() { - super.onDestroy(); - - AppWatcher.INSTANCE.getObjectWatcher().watch(this); - } - /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ + /** + * This method is called in {@link #onViewCreated(View, Bundle)} to initialize the views. + * + *

+ * {@link #initListeners()} is called after this method to initialize the corresponding + * listeners. + *

+ * @param rootView The inflated view for this fragment + * (provided by {@link #onViewCreated(View, Bundle)}) + * @param savedInstanceState The saved state of this fragment + * (provided by {@link #onViewCreated(View, Bundle)}) + */ protected void initViews(final View rootView, final Bundle savedInstanceState) { } + /** + * Initialize the listeners for this fragment. + * + *

+ * This method is called after {@link #initViews(View, Bundle)} + * in {@link #onViewCreated(View, Bundle)}. + *

+ */ protected void initListeners() { } @@ -108,9 +121,20 @@ public void setTitle(final String title) { } } + /** + * Finds the root fragment by looping through all of the parent fragments. The root fragment + * is supposed to be {@link org.schabi.newpipe.fragments.MainFragment}, and is the fragment that + * handles keeping the backstack of opened fragments in NewPipe, and also the player bottom + * sheet. This function therefore returns the fragment manager of said fragment. + * + * @return the fragment manager of the root fragment, i.e. + * {@link org.schabi.newpipe.fragments.MainFragment} + */ protected FragmentManager getFM() { - return getParentFragment() == null - ? getFragmentManager() - : getParentFragment().getFragmentManager(); + Fragment current = this; + while (current.getParentFragment() != null) { + current = current.getParentFragment(); + } + return current.getFragmentManager(); } } diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 9ddbe96dfc9..fda45e39ed1 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -29,7 +29,7 @@ public final class DownloaderImpl extends Downloader { public static final String USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0"; + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"; public static final String YOUTUBE_RESTRICTED_MODE_COOKIE_KEY = "youtube_restricted_mode_key"; public static final String YOUTUBE_RESTRICTED_MODE_COOKIE = "PREF=f2=8000000"; diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 73a81450ec7..17569412572 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -44,6 +44,7 @@ import android.widget.Spinner; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; @@ -51,6 +52,7 @@ import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentContainerView; import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceManager; @@ -64,17 +66,20 @@ import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; +import org.schabi.newpipe.fragments.list.comments.CommentRepliesFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.local.feed.notifications.NotificationWorker; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.event.OnKeyDownListener; import org.schabi.newpipe.player.helper.PlayerHolder; import org.schabi.newpipe.player.playqueue.PlayQueue; +import org.schabi.newpipe.settings.UpdateSettingsFragment; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.KioskTranslator; @@ -82,6 +87,7 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PeertubeHelper; import org.schabi.newpipe.util.PermissionHelper; +import org.schabi.newpipe.util.ReleaseVersionUtil; import org.schabi.newpipe.util.SerializedCache; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; @@ -163,6 +169,11 @@ protected void onCreate(final Bundle savedInstanceState) { // if this is enabled by the user. NotificationWorker.initialize(this); } + if (!UpdateSettingsFragment.wasUserAskedForConsent(this) + && !App.getApp().isFirstRun() + && ReleaseVersionUtil.INSTANCE.isReleaseApk()) { + UpdateSettingsFragment.askForConsentToUpdateChecks(this); + } } @Override @@ -172,7 +183,8 @@ protected void onPostCreate(final Bundle savedInstanceState) { final App app = App.getApp(); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app); - if (prefs.getBoolean(app.getString(R.string.update_app_key), true)) { + if (prefs.getBoolean(app.getString(R.string.update_app_key), false) + && prefs.getBoolean(app.getString(R.string.update_check_consent_key), false)) { // Start the worker which is checking all conditions // and eventually searching for a new version. NewVersionWorker.enqueueNewVersionCheckingWork(app, false); @@ -219,14 +231,14 @@ private void addDrawerMenuForCurrentService() throws ExtractionException { final int currentServiceId = ServiceHelper.getSelectedServiceId(this); final StreamingService service = NewPipe.getService(currentServiceId); - int kioskId = 0; + int kioskMenuItemId = 0; for (final String ks : service.getKioskList().getAvailableKiosks()) { drawerLayoutBinding.navigation.getMenu() - .add(R.id.menu_tabs_group, kioskId, 0, KioskTranslator + .add(R.id.menu_tabs_group, kioskMenuItemId, 0, KioskTranslator .getTranslatedKioskName(ks, this)) .setIcon(KioskTranslator.getKioskIcon(ks)); - kioskId++; + kioskMenuItemId++; } drawerLayoutBinding.navigation.getMenu() @@ -235,7 +247,7 @@ private void addDrawerMenuForCurrentService() throws ExtractionException { .setIcon(R.drawable.ic_tv); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) - .setIcon(R.drawable.ic_rss_feed); + .setIcon(R.drawable.ic_subscriptions); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) .setIcon(R.drawable.ic_bookmark); @@ -306,20 +318,16 @@ private void tabSelected(final MenuItem item) throws ExtractionException { NavigationHelper.openStatisticFragment(getSupportFragmentManager()); break; default: - final int currentServiceId = ServiceHelper.getSelectedServiceId(this); - final StreamingService service = NewPipe.getService(currentServiceId); - String serviceName = ""; - - int kioskId = 0; - for (final String ks : service.getKioskList().getAvailableKiosks()) { - if (kioskId == item.getItemId()) { - serviceName = ks; + final StreamingService currentService = ServiceHelper.getSelectedService(this); + int kioskMenuItemId = 0; + for (final String kioskId : currentService.getKioskList().getAvailableKiosks()) { + if (kioskMenuItemId == item.getItemId()) { + NavigationHelper.openKioskFragment(getSupportFragmentManager(), + currentService.getServiceId(), kioskId); + break; } - kioskId++; + kioskMenuItemId++; } - - NavigationHelper.openKioskFragment(getSupportFragmentManager(), currentServiceId, - serviceName); break; } } @@ -550,14 +558,21 @@ public void onBackPressed() { // interacts with a fragment inside fragment_holder so all back presses should be // handled by it if (bottomSheetHiddenOrCollapsed()) { - final Fragment fragment = getSupportFragmentManager() - .findFragmentById(R.id.fragment_holder); + final FragmentManager fm = getSupportFragmentManager(); + final Fragment fragment = fm.findFragmentById(R.id.fragment_holder); // If current fragment implements BackPressable (i.e. can/wanna handle back press) // delegate the back press to it if (fragment instanceof BackPressable) { if (((BackPressable) fragment).onBackPressed()) { return; } + } else if (fragment instanceof CommentRepliesFragment) { + // expand DetailsFragment if CommentRepliesFragment was opened + // to show the top level comments again + // Expand DetailsFragment if CommentRepliesFragment was opened + // and no other CommentRepliesFragments are on top of the back stack + // to show the top level comments again. + openDetailFragmentFromCommentReplies(fm, false); } } else { @@ -633,10 +648,17 @@ public void onRequestPermissionsResult(final int requestCode, * */ private void onHomeButtonPressed() { - // If search fragment wasn't found in the backstack... - if (!NavigationHelper.tryGotoSearchFragment(getSupportFragmentManager())) { - // ...go to the main fragment - NavigationHelper.gotoMainFragment(getSupportFragmentManager()); + final FragmentManager fm = getSupportFragmentManager(); + final Fragment fragment = fm.findFragmentById(R.id.fragment_holder); + + if (fragment instanceof CommentRepliesFragment) { + // Expand DetailsFragment if CommentRepliesFragment was opened + // and no other CommentRepliesFragments are on top of the back stack + // to show the top level comments again. + openDetailFragmentFromCommentReplies(fm, true); + } else if (!NavigationHelper.tryGotoSearchFragment(fm)) { + // If search fragment wasn't found in the backstack go to the main fragment + NavigationHelper.gotoMainFragment(fm); } } @@ -832,6 +854,68 @@ public void onReceive(final Context context, final Intent intent) { } } + private void openDetailFragmentFromCommentReplies( + @NonNull final FragmentManager fm, + final boolean popBackStack + ) { + // obtain the name of the fragment under the replies fragment that's going to be popped + @Nullable final String fragmentUnderEntryName; + if (fm.getBackStackEntryCount() < 2) { + fragmentUnderEntryName = null; + } else { + fragmentUnderEntryName = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 2) + .getName(); + } + + // the root comment is the comment for which the user opened the replies page + @Nullable final CommentRepliesFragment repliesFragment = + (CommentRepliesFragment) fm.findFragmentByTag(CommentRepliesFragment.TAG); + @Nullable final CommentsInfoItem rootComment = + repliesFragment == null ? null : repliesFragment.getCommentsInfoItem(); + + // sometimes this function pops the backstack, other times it's handled by the system + if (popBackStack) { + fm.popBackStackImmediate(); + } + + // only expand the bottom sheet back if there are no more nested comment replies fragments + // stacked under the one that is currently being popped + if (CommentRepliesFragment.TAG.equals(fragmentUnderEntryName)) { + return; + } + + final BottomSheetBehavior behavior = BottomSheetBehavior + .from(mainBinding.fragmentPlayerHolder); + // do not return to the comment if the details fragment was closed + if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { + return; + } + + // scroll to the root comment once the bottom sheet expansion animation is finished + behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { + @Override + public void onStateChanged(@NonNull final View bottomSheet, + final int newState) { + if (newState == BottomSheetBehavior.STATE_EXPANDED) { + final Fragment detailFragment = fm.findFragmentById( + R.id.fragment_player_holder); + if (detailFragment instanceof VideoDetailFragment && rootComment != null) { + // should always be the case + ((VideoDetailFragment) detailFragment).scrollToComment(rootComment); + } + behavior.removeBottomSheetCallback(this); + } + } + + @Override + public void onSlide(@NonNull final View bottomSheet, final float slideOffset) { + // not needed, listener is removed once the sheet is expanded + } + }); + + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + private boolean bottomSheetHiddenOrCollapsed() { final BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder); diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java index fc3423994e8..21c5354f44d 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java @@ -6,6 +6,9 @@ import static org.schabi.newpipe.database.Migrations.MIGRATION_3_4; import static org.schabi.newpipe.database.Migrations.MIGRATION_4_5; import static org.schabi.newpipe.database.Migrations.MIGRATION_5_6; +import static org.schabi.newpipe.database.Migrations.MIGRATION_6_7; +import static org.schabi.newpipe.database.Migrations.MIGRATION_7_8; +import static org.schabi.newpipe.database.Migrations.MIGRATION_8_9; import android.content.Context; import android.database.Cursor; @@ -26,7 +29,7 @@ private static AppDatabase getDatabase(final Context context) { return Room .databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, - MIGRATION_5_6) + MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8, MIGRATION_8_9) .build(); } diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index dac831fe427..000b83953ec 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,10 +20,7 @@ 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 +import org.schabi.newpipe.util.ReleaseVersionUtil import java.io.IOException class NewVersionWorker( @@ -60,7 +58,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) @@ -84,7 +82,7 @@ class NewVersionWorker( @Throws(IOException::class, ReCaptchaException::class) private fun checkNewVersion() { // Check if the current apk is a github one or not. - if (!isReleaseApk()) { + if (!ReleaseVersionUtil.isReleaseApk) { return } @@ -93,7 +91,7 @@ class NewVersionWorker( // Check if the last request has happened a certain time ago // to reduce the number of API requests. val expiry = prefs.getLong(applicationContext.getString(R.string.update_expiry_key), 0) - if (!isLastUpdateCheckExpired(expiry)) { + if (!ReleaseVersionUtil.isLastUpdateCheckExpired(expiry)) { return } } @@ -108,7 +106,7 @@ class NewVersionWorker( try { // Store a timestamp which needs to be exceeded, // before a new request to the API is made. - val newExpiry = coerceUpdateCheckExpiry(response.getHeader("expires")) + val newExpiry = ReleaseVersionUtil.coerceUpdateCheckExpiry(response.getHeader("expires")) prefs.edit { putLong(applicationContext.getString(R.string.update_expiry_key), newExpiry) } @@ -120,13 +118,13 @@ class NewVersionWorker( // Parse the json from the response. try { - val githubStableObject = JsonParser.`object`() + val newpipeVersionInfo = JsonParser.`object`() .from(response.responseBody()).getObject("flavors") - .getObject("github").getObject("stable") + .getObject("newpipe") - val versionName = githubStableObject.getString("version") - val versionCode = githubStableObject.getInt("version_code") - val apkLocationUrl = githubStableObject.getString("apk") + val versionName = newpipeVersionInfo.getString("version") + val versionCode = newpipeVersionInfo.getInt("version_code") + val apkLocationUrl = newpipeVersionInfo.getString("apk") compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode) } catch (e: JsonParserException) { // Most likely something is wrong in data received from NEWPIPE_API_URL. diff --git a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java index 3255489b0d5..e6177f6a358 100644 --- a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java +++ b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java @@ -75,7 +75,7 @@ public static void openPopupMenu(final PlayQueue playQueue, return true; case R.id.menu_item_share: shareText(context, item.getTitle(), item.getUrl(), - item.getThumbnailUrl()); + item.getThumbnails()); return true; case R.id.menu_item_download: fetchStreamInfoAndSaveToDatabase(context, item.getServiceId(), item.getUrl(), diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 2567df9938a..197c965bac5 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -41,10 +41,14 @@ import androidx.lifecycle.LifecycleOwner; import androidx.preference.PreferenceManager; +import com.evernote.android.state.State; +import com.livefront.bridge.Bridge; + import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.databinding.ListRadioIconItemBinding; import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding; import org.schabi.newpipe.download.DownloadDialog; +import org.schabi.newpipe.download.LoadingDialog; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.ReCaptchaActivity; @@ -64,6 +68,7 @@ import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.exceptions.SoundCloudGoPlusContentException; import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.ktx.ExceptionUtils; @@ -71,10 +76,11 @@ import org.schabi.newpipe.player.PlayerType; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.helper.PlayerHolder; -import org.schabi.newpipe.player.playqueue.ChannelPlayQueue; +import org.schabi.newpipe.player.playqueue.ChannelTabPlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.util.ChannelTabHelper; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExtractorHelper; @@ -95,8 +101,6 @@ import java.util.Optional; import java.util.function.Consumer; -import icepick.Icepick; -import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Single; @@ -149,7 +153,7 @@ protected void onCreate(final Bundle savedInstanceState) { getWindow().setAttributes(params); super.onCreate(savedInstanceState); - Icepick.restoreInstanceState(this, savedInstanceState); + Bridge.restoreInstanceState(this, savedInstanceState); // FragmentManager will take care to recreate (Playlist|Download)Dialog when screen rotates // We used to .setOnDismissListener(dialog -> finish()); when creating these DialogFragments @@ -194,7 +198,7 @@ protected void onStop() { @Override protected void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + Bridge.saveInstanceState(this, outState); } @Override @@ -631,8 +635,7 @@ private void handleChoice(final String selectedChoiceKey) { } if (selectedChoiceKey.equals(getString(R.string.popup_player_key)) - && !PermissionHelper.isPopupEnabled(this)) { - PermissionHelper.showPopupEnablementToast(this); + && !PermissionHelper.isPopupEnabledElseAsk(this)) { finish(); return; } @@ -790,10 +793,10 @@ public void onResume(@NonNull final LifecycleOwner owner) { } } - }, () -> { + }, () -> // this branch is executed if there is no activity context - inFlight(false); - }); + inFlight(false) + ); } Single pleaseWait(final Single single) { @@ -813,19 +816,24 @@ Single pleaseWait(final Single single) { @SuppressLint("CheckResult") private void openDownloadDialog(final int currentServiceId, final String currentUrl) { inFlight(true); + final LoadingDialog loadingDialog = new LoadingDialog(R.string.loading_metadata_title); + loadingDialog.show(getParentFragmentManager(), "loadingDialog"); disposables.add(ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(this::pleaseWait) .subscribe(result -> runOnVisible(ctx -> { + loadingDialog.dismiss(); final FragmentManager fm = ctx.getSupportFragmentManager(); final DownloadDialog downloadDialog = new DownloadDialog(ctx, result); // dismiss listener to be handled by FragmentManager downloadDialog.show(fm, "downloadDialog"); } - ), throwable -> runOnVisible(ctx -> - ((RouterActivity) ctx).showUnsupportedUrlDialog(currentUrl)))); + ), throwable -> runOnVisible(ctx -> { + loadingDialog.dismiss(); + ((RouterActivity) ctx).showUnsupportedUrlDialog(currentUrl); + }))); } private void openAddToPlaylistDialog(final int currentServiceId, final String currentUrl) { @@ -1017,7 +1025,16 @@ public Consumer getResultHandler(final Choice choice) { } playQueue = new SinglePlayQueue((StreamInfo) info); } else if (info instanceof ChannelInfo) { - playQueue = new ChannelPlayQueue((ChannelInfo) info); + final Optional playableTab = ((ChannelInfo) info).getTabs() + .stream() + .filter(ChannelTabHelper::isStreamsTab) + .findFirst(); + + if (playableTab.isPresent()) { + playQueue = new ChannelTabPlayQueue(info.getServiceId(), playableTab.get()); + } else { + return; // there is no playable tab + } } else if (info instanceof PlaylistInfo) { playQueue = new PlaylistPlayQueue((PlaylistInfo) info); } else { diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index c1eec152657..045278da757 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -6,6 +6,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.Button +import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity @@ -57,13 +58,9 @@ class AboutActivity : AppCompatActivity() { * A placeholder fragment containing a simple view. */ class AboutFragment : Fragment() { - private fun Button.openLink(url: Int) { + private fun Button.openLink(@StringRes url: Int) { setOnClickListener { - ShareUtils.openUrlInBrowser( - context, - requireContext().getString(url), - false - ) + ShareUtils.openUrlInApp(context, requireContext().getString(url)) } } @@ -119,7 +116,7 @@ class AboutActivity : AppCompatActivity() { /** * List of all software components. */ - private val SOFTWARE_COMPONENTS = arrayOf( + private val SOFTWARE_COMPONENTS = arrayListOf( SoftwareComponent( "ACRA", "2013", "Kevin Gaudin", "https://github.com/ACRA/acra", StandardLicenses.APACHE2 @@ -141,8 +138,12 @@ class AboutActivity : AppCompatActivity() { "https://github.com/lisawray/groupie", StandardLicenses.MIT ), SoftwareComponent( - "Icepick", "2015", "Frankie Sardo", - "https://github.com/frankiesardo/icepick", StandardLicenses.EPL1 + "Android-State", "2018", "Evernote", + "https://github.com/Evernote/android-state", StandardLicenses.EPL1 + ), + SoftwareComponent( + "Bridge", "2021", "Livefront", + "https://github.com/livefront/bridge", StandardLicenses.APACHE2 ), SoftwareComponent( "Jsoup", "2009 - 2020", "Jonathan Hedley", diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt index f19ecd74a02..9f5ad2a7a07 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt @@ -1,30 +1,40 @@ package org.schabi.newpipe.about import android.os.Bundle +import android.util.Base64 import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.webkit.WebView +import androidx.appcompat.app.AlertDialog import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.schedulers.Schedulers +import org.schabi.newpipe.BuildConfig import org.schabi.newpipe.R import org.schabi.newpipe.databinding.FragmentLicensesBinding import org.schabi.newpipe.databinding.ItemSoftwareComponentBinding +import org.schabi.newpipe.ktx.parcelableArrayList +import org.schabi.newpipe.util.Localization +import org.schabi.newpipe.util.external_communication.ShareUtils /** * Fragment containing the software licenses. */ class LicenseFragment : Fragment() { - private lateinit var softwareComponents: Array - private var activeLicense: License? = null + private lateinit var softwareComponents: List + private var activeSoftwareComponent: SoftwareComponent? = null private val compositeDisposable = CompositeDisposable() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - softwareComponents = arguments?.getParcelableArray(ARG_COMPONENTS) as Array - activeLicense = savedInstanceState?.getSerializable(LICENSE_KEY) as? License - // Sort components by name - softwareComponents.sortBy { it.name } + softwareComponents = arguments?.parcelableArrayList(ARG_COMPONENTS)!! + .sortedBy { it.name } // Sort components by name + activeSoftwareComponent = savedInstanceState?.getSerializable(SOFTWARE_COMPONENT_KEY) as? SoftwareComponent } override fun onDestroy() { @@ -39,9 +49,8 @@ class LicenseFragment : Fragment() { ): View { val binding = FragmentLicensesBinding.inflate(inflater, container, false) binding.licensesAppReadLicense.setOnClickListener { - activeLicense = StandardLicenses.GPL3 compositeDisposable.add( - showLicense(activity, StandardLicenses.GPL3) + showLicense(NEWPIPE_SOFTWARE_COMPONENT) ) } for (component in softwareComponents) { @@ -57,27 +66,72 @@ class LicenseFragment : Fragment() { val root: View = componentBinding.root root.tag = component root.setOnClickListener { - activeLicense = component.license compositeDisposable.add( - showLicense(activity, component) + showLicense(component) ) } binding.licensesSoftwareComponents.addView(root) registerForContextMenu(root) } - activeLicense?.let { compositeDisposable.add(showLicense(activity, it)) } + activeSoftwareComponent?.let { compositeDisposable.add(showLicense(it)) } return binding.root } override fun onSaveInstanceState(savedInstanceState: Bundle) { super.onSaveInstanceState(savedInstanceState) - activeLicense?.let { savedInstanceState.putSerializable(LICENSE_KEY, it) } + activeSoftwareComponent?.let { savedInstanceState.putSerializable(SOFTWARE_COMPONENT_KEY, it) } + } + + private fun showLicense( + softwareComponent: SoftwareComponent + ): Disposable { + return if (context == null) { + Disposable.empty() + } else { + val context = requireContext() + activeSoftwareComponent = softwareComponent + Observable.fromCallable { getFormattedLicense(context, softwareComponent.license) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { formattedLicense -> + val webViewData = Base64.encodeToString( + formattedLicense.toByteArray(), Base64.NO_PADDING + ) + val webView = WebView(context) + webView.loadData(webViewData, "text/html; charset=UTF-8", "base64") + + Localization.assureCorrectAppLanguage(context) + val builder = AlertDialog.Builder(requireContext()) + .setTitle(softwareComponent.name) + .setView(webView) + .setOnCancelListener { activeSoftwareComponent = null } + .setOnDismissListener { activeSoftwareComponent = null } + .setPositiveButton(R.string.done) { dialog, _ -> dialog.dismiss() } + + if (softwareComponent != NEWPIPE_SOFTWARE_COMPONENT) { + builder.setNeutralButton(R.string.open_website_license) { _, _ -> + ShareUtils.openUrlInApp(requireContext(), softwareComponent.link) + } + } + + builder.show() + } + } } companion object { private const val ARG_COMPONENTS = "components" - private const val LICENSE_KEY = "ACTIVE_LICENSE" - fun newInstance(softwareComponents: Array): LicenseFragment { + private const val SOFTWARE_COMPONENT_KEY = "ACTIVE_SOFTWARE_COMPONENT" + private val NEWPIPE_SOFTWARE_COMPONENT = SoftwareComponent( + "NewPipe", + "2014-2023", + "Team NewPipe", + "https://newpipe.net/", + StandardLicenses.GPL3, + BuildConfig.VERSION_NAME + ) + + fun newInstance(softwareComponents: ArrayList): LicenseFragment { val fragment = LicenseFragment() fragment.arguments = bundleOf(ARG_COMPONENTS to softwareComponents) return fragment diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt index 6e3aa4be878..56e21c88a53 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -1,17 +1,8 @@ package org.schabi.newpipe.about import android.content.Context -import android.util.Base64 -import android.webkit.WebView -import androidx.appcompat.app.AlertDialog -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.Disposable -import io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.R -import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.ThemeHelper -import org.schabi.newpipe.util.external_communication.ShareUtils import java.io.IOException /** @@ -20,7 +11,7 @@ import java.io.IOException * @return String which contains a HTML formatted license page * styled according to the context's theme */ -private fun getFormattedLicense(context: Context, license: License): String { +fun getFormattedLicense(context: Context, license: License): String { try { return context.assets.open(license.filename).bufferedReader().use { it.readText() } // split the HTML file and insert the stylesheet into the HEAD of the file @@ -34,7 +25,7 @@ private fun getFormattedLicense(context: Context, license: License): String { * @param context the Android context * @return String which is a CSS stylesheet according to the context's theme */ -private fun getLicenseStylesheet(context: Context): String { +fun getLicenseStylesheet(context: Context): String { val isLightTheme = ThemeHelper.isLightThemeSelected(context) val licenseBackgroundColor = getHexRGBColor( context, if (isLightTheme) R.color.light_license_background_color else R.color.dark_license_background_color @@ -56,48 +47,6 @@ private fun getLicenseStylesheet(context: Context): String { * @param color the color number from R.color * @return a six characters long String with hexadecimal RGB values */ -private fun getHexRGBColor(context: Context, color: Int): String { +fun getHexRGBColor(context: Context, color: Int): String { return context.getString(color).substring(3) } - -fun showLicense(context: Context?, component: SoftwareComponent): Disposable { - return showLicense(context, component.license) { - setPositiveButton(R.string.dismiss) { dialog, _ -> - dialog.dismiss() - } - setNeutralButton(R.string.open_website_license) { _, _ -> - ShareUtils.openUrlInBrowser(context!!, component.link) - } - } -} - -fun showLicense(context: Context?, license: License) = showLicense(context, license) { - setPositiveButton(R.string.ok) { dialog, _ -> dialog.dismiss() } -} - -private fun showLicense( - context: Context?, - license: License, - block: AlertDialog.Builder.() -> AlertDialog.Builder -): Disposable { - return if (context == null) { - Disposable.empty() - } else { - Observable.fromCallable { getFormattedLicense(context, license) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { formattedLicense -> - val webViewData = - Base64.encodeToString(formattedLicense.toByteArray(), Base64.NO_PADDING) - val webView = WebView(context) - webView.loadData(webViewData, "text/html; charset=UTF-8", "base64") - - Localization.assureCorrectAppLanguage(context) - AlertDialog.Builder(context) - .setTitle(license.name) - .setView(webView) - .block() - .show() - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt b/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt index 354e8fef737..262641caaf0 100644 --- a/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt +++ b/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt @@ -2,6 +2,7 @@ package org.schabi.newpipe.about import android.os.Parcelable import kotlinx.parcelize.Parcelize +import java.io.Serializable @Parcelize class SoftwareComponent @@ -13,4 +14,4 @@ constructor( val link: String, val license: License, val version: String? = null -) : Parcelable +) : Parcelable, Serializable diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java index 563e80b1780..04d93a238d5 100644 --- a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.database; -import static org.schabi.newpipe.database.Migrations.DB_VER_6; +import static org.schabi.newpipe.database.Migrations.DB_VER_9; import androidx.room.Database; import androidx.room.RoomDatabase; @@ -38,7 +38,7 @@ FeedEntity.class, FeedGroupEntity.class, FeedGroupSubscriptionEntity.class, FeedLastUpdatedEntity.class }, - version = DB_VER_6 + version = DB_VER_9 ) public abstract class AppDatabase extends RoomDatabase { public static final String DATABASE_NAME = "newpipe.db"; diff --git a/app/src/main/java/org/schabi/newpipe/database/Converters.kt b/app/src/main/java/org/schabi/newpipe/database/Converters.kt index 0eafcede1af..ec097cc1bf3 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Converters.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Converters.kt @@ -7,7 +7,7 @@ import java.time.Instant import java.time.OffsetDateTime import java.time.ZoneOffset -object Converters { +class Converters { /** * Convert a long value to a [OffsetDateTime]. * @@ -47,6 +47,6 @@ object Converters { @TypeConverter fun feedGroupIconOf(id: Int): FeedGroupIcon { - return FeedGroupIcon.values().first { it.id == id } + return FeedGroupIcon.entries.first { it.id == id } } } diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index e301e3f1f80..c9f630869c9 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -24,6 +24,9 @@ public final class Migrations { public static final int DB_VER_4 = 4; public static final int DB_VER_5 = 5; public static final int DB_VER_6 = 6; + public static final int DB_VER_7 = 7; + public static final int DB_VER_8 = 8; + public static final int DB_VER_9 = 9; private static final String TAG = Migrations.class.getName(); public static final boolean DEBUG = MainActivity.DEBUG; @@ -185,7 +188,7 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { @Override public void migrate(@NonNull final SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " - + "INTEGER NOT NULL DEFAULT 0"); + + "INTEGER NOT NULL DEFAULT 0"); } }; @@ -197,6 +200,108 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { } }; + public static final Migration MIGRATION_6_7 = new Migration(DB_VER_6, DB_VER_7) { + @Override + public void migrate(@NonNull final SupportSQLiteDatabase database) { + // Create a new column thumbnail_stream_id + database.execSQL("ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " + + "INTEGER NOT NULL DEFAULT -1"); + + // Migrate the thumbnail_url to the thumbnail_stream_id + database.execSQL("UPDATE playlists SET thumbnail_stream_id = (" + + " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" + + " FROM (" + + " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" + + " FROM playlists p" + + " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" + + " LEFT JOIN streams s ON s.uid = ps.stream_id" + + " WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table" + + " WHERE playlist_uid = playlists.uid)"); + + // Remove the thumbnail_url field in the playlist table + database.execSQL("CREATE TABLE IF NOT EXISTS `playlists_new`" + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "name TEXT, " + + "is_thumbnail_permanent INTEGER NOT NULL, " + + "thumbnail_stream_id INTEGER NOT NULL)"); + + database.execSQL("INSERT INTO playlists_new" + + " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " + + " FROM playlists"); + + + database.execSQL("DROP TABLE playlists"); + database.execSQL("ALTER TABLE playlists_new RENAME TO playlists"); + database.execSQL("CREATE INDEX IF NOT EXISTS " + + "`index_playlists_name` ON `playlists` (`name`)"); + } + }; + + public static final Migration MIGRATION_7_8 = new Migration(DB_VER_7, DB_VER_8) { + @Override + public void migrate(@NonNull final SupportSQLiteDatabase database) { + database.execSQL("DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " + + "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)"); + database.execSQL("UPDATE search_history SET search = trim(search)"); + } + }; + + public static final Migration MIGRATION_8_9 = new Migration(DB_VER_8, DB_VER_9) { + @Override + public void migrate(@NonNull final SupportSQLiteDatabase database) { + try { + database.beginTransaction(); + + // Update playlists. + // Create a temp table to initialize display_index. + database.execSQL("CREATE TABLE `playlists_tmp` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + + "`thumbnail_stream_id` INTEGER NOT NULL, " + + "`display_index` INTEGER NOT NULL)"); + database.execSQL("INSERT INTO `playlists_tmp` " + + "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "`display_index`) " + + "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "-1 " + + "FROM `playlists`"); + + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + database.execSQL("DROP TABLE `playlists`"); + database.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`"); + + + // Update remote_playlists. + // Create a temp table to initialize display_index. + database.execSQL("CREATE TABLE `remote_playlists_tmp` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + + "`thumbnail_url` TEXT, `uploader` TEXT, " + + "`display_index` INTEGER NOT NULL," + + "`stream_count` INTEGER)"); + database.execSQL("INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + + "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + + "`stream_count`)" + + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + + "-1, `stream_count` FROM `remote_playlists`"); + + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + database.execSQL("DROP TABLE `remote_playlists`"); + database.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`"); + + // Create index on the new table. + database.execSQL("CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + + "ON `remote_playlists` (`service_id`, `url`)"); + + database.setTransactionSuccessful(); + } finally { + database.endTransaction(); + } + } + }; + private Migrations() { } } diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 968d0c88ff2..e7ed934977a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -32,6 +32,7 @@ abstract class FeedDAO { * @return the feed streams filtered according to the conditions provided in the parameters * @see StreamStateEntity.isFinished() * @see StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS + * @see StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS */ @Query( """ @@ -66,6 +67,15 @@ abstract class FeedDAO { OR s.stream_type = 'LIVE_STREAM' OR s.stream_type = 'AUDIO_LIVE_STREAM' ) + AND ( + :includePartiallyPlayed + OR sh.stream_id IS NULL + OR sst.stream_id IS NULL + OR (sst.progress_time <= ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} + AND sst.progress_time <= s.duration * 1000 / 4) + OR (sst.progress_time >= s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS} + AND sst.progress_time >= s.duration * 1000 * 3 / 4) + ) AND ( :uploadDateBefore IS NULL OR s.upload_date IS NULL @@ -79,21 +89,34 @@ abstract class FeedDAO { abstract fun getStreams( groupId: Long, includePlayed: Boolean, + includePartiallyPlayed: Boolean, uploadDateBefore: OffsetDateTime? ): Maybe> + /** + * Remove links to streams that are older than the given date + * **but keep at least one stream per uploader**. + * + * One stream per uploader is kept because it is needed as reference + * when fetching new streams to check if they are new or not. + * @param offsetDateTime the newest date to keep, older streams are removed + */ @Query( """ - DELETE FROM feed WHERE - - feed.stream_id IN ( - SELECT s.uid FROM streams s - - INNER JOIN feed f - ON s.uid = f.stream_id - - WHERE s.upload_date < :offsetDateTime - ) + DELETE FROM feed + WHERE feed.stream_id IN (SELECT uid from ( + SELECT s.uid, + (SELECT MAX(upload_date) + FROM streams s1 + INNER JOIN feed f1 + ON s1.uid = f1.stream_id + WHERE f1.subscription_id = f.subscription_id) max_upload_date + FROM streams s + INNER JOIN feed f + ON s.uid = f.stream_id + + WHERE s.upload_date < :offsetDateTime + AND s.upload_date <> max_upload_date)) """ ) abstract fun unlinkStreamsOlderThan(offsetDateTime: OffsetDateTime) 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/database/playlist/PlaylistDuplicatesEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java new file mode 100644 index 00000000000..3be85e6e1cb --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java @@ -0,0 +1,29 @@ +package org.schabi.newpipe.database.playlist; + +import androidx.room.ColumnInfo; + +/** + * This class adds a field to {@link PlaylistMetadataEntry} that contains an integer representing + * how many times a specific stream is already contained inside a local playlist. Used to be able + * to grey out playlists which already contain the current stream in the playlist append dialog. + * @see org.schabi.newpipe.local.playlist.LocalPlaylistManager#getPlaylistDuplicates(String) + */ +public class PlaylistDuplicatesEntry extends PlaylistMetadataEntry { + public static final String PLAYLIST_TIMES_STREAM_IS_CONTAINED = "timesStreamIsContained"; + @ColumnInfo(name = PLAYLIST_TIMES_STREAM_IS_CONTAINED) + public final long timesStreamIsContained; + + @SuppressWarnings("checkstyle:ParameterNumber") + public PlaylistDuplicatesEntry(final long uid, + final String name, + final String thumbnailUrl, + final boolean isThumbnailPermanent, + final long thumbnailStreamId, + final long displayIndex, + final long streamCount, + final long timesStreamIsContained) { + super(uid, name, thumbnailUrl, isThumbnailPermanent, thumbnailStreamId, displayIndex, + streamCount); + this.timesStreamIsContained = timesStreamIsContained; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 695f9ec5a69..072c49e2c07 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -1,22 +1,13 @@ package org.schabi.newpipe.database.playlist; import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; public interface PlaylistLocalItem extends LocalItem { String getOrderingName(); - static List merge( - final List localPlaylists, - final List remotePlaylists) { - return Stream.concat(localPlaylists.stream(), remotePlaylists.stream()) - .sorted(Comparator.comparing(PlaylistLocalItem::getOrderingName, - Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))) - .collect(Collectors.toList()); - } + long getDisplayIndex(); + + long getUid(); + + void setDisplayIndex(long displayIndex); } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java index a13894030a6..03a1e1e308a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java @@ -2,27 +2,40 @@ import androidx.room.ColumnInfo; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_DISPLAY_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_URL; public class PlaylistMetadataEntry implements PlaylistLocalItem { public static final String PLAYLIST_STREAM_COUNT = "streamCount"; @ColumnInfo(name = PLAYLIST_ID) - public final long uid; + private final long uid; @ColumnInfo(name = PLAYLIST_NAME) public final String name; + @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT) + private final boolean isThumbnailPermanent; + @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID) + private final long thumbnailStreamId; @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) public final String thumbnailUrl; + @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) + private long displayIndex; @ColumnInfo(name = PLAYLIST_STREAM_COUNT) public final long streamCount; public PlaylistMetadataEntry(final long uid, final String name, final String thumbnailUrl, - final long streamCount) { + final boolean isThumbnailPermanent, final long thumbnailStreamId, + final long displayIndex, final long streamCount) { this.uid = uid; this.name = name; this.thumbnailUrl = thumbnailUrl; + this.isThumbnailPermanent = isThumbnailPermanent; + this.thumbnailStreamId = thumbnailStreamId; + this.displayIndex = displayIndex; this.streamCount = streamCount; } @@ -35,4 +48,27 @@ public LocalItemType getLocalItemType() { public String getOrderingName() { return name; } + + public boolean isThumbnailPermanent() { + return isThumbnailPermanent; + } + + public long getThumbnailStreamId() { + return thumbnailStreamId; + } + + @Override + public long getDisplayIndex() { + return displayIndex; + } + + @Override + public long getUid() { + return uid; + } + + @Override + public void setDisplayIndex(final long displayIndex) { + this.displayIndex = displayIndex; + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index d2543ae6d64..1d74c6d31dc 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -7,6 +7,7 @@ import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.image.ImageStrategy data class PlaylistStreamEntry( @Embedded @@ -28,7 +29,7 @@ data class PlaylistStreamEntry( item.duration = streamEntity.duration item.uploaderName = streamEntity.uploader item.uploaderUrl = streamEntity.uploaderUrl - item.thumbnailUrl = streamEntity.thumbnailUrl + item.thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) return item } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java index 70aaa3b2dc9..d8071e0af3a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java @@ -2,6 +2,7 @@ import androidx.room.Dao; import androidx.room.Query; +import androidx.room.Transaction; import org.schabi.newpipe.database.BasicDAO; import org.schabi.newpipe.database.playlist.model.PlaylistEntity; @@ -36,4 +37,17 @@ default Flowable> listByService(final int serviceId) { @Query("SELECT COUNT(*) FROM " + PLAYLIST_TABLE) Flowable getCount(); + + @Transaction + default long upsertPlaylist(final PlaylistEntity playlist) { + final long playlistId = playlist.getUid(); + + if (playlistId == -1) { + // This situation is probably impossible. + return insert(playlist); + } else { + update(playlist); + return playlistId; + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java index 6bb84942817..8ab8a2afd33 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java @@ -11,6 +11,7 @@ import io.reactivex.rxjava3.core.Flowable; +import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_DISPLAY_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_SERVICE_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_TABLE; @@ -31,10 +32,18 @@ public interface PlaylistRemoteDAO extends BasicDAO { + " WHERE " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") Flowable> listByService(int serviceId); + @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " + + REMOTE_PLAYLIST_ID + " = :playlistId") + Flowable> getPlaylist(long playlistId); + @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " + REMOTE_PLAYLIST_URL + " = :url AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") Flowable> getPlaylist(long serviceId, String url); + @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + + " ORDER BY " + REMOTE_PLAYLIST_DISPLAY_INDEX) + Flowable> getPlaylists(); + @Query("SELECT " + REMOTE_PLAYLIST_ID + " FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " + REMOTE_PLAYLIST_URL + " = :url " + "AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index df4ef2e52e9..6b77166eae9 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -6,18 +6,25 @@ import androidx.room.Transaction; import org.schabi.newpipe.database.BasicDAO; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; import java.util.List; import io.reactivex.rxjava3.core.Flowable; +import static org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry.PLAYLIST_TIMES_STREAM_IS_CONTAINED; import static org.schabi.newpipe.database.playlist.PlaylistMetadataEntry.PLAYLIST_STREAM_COUNT; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_DISPLAY_INDEX; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.DEFAULT_THUMBNAIL; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_URL; import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_PLAYLIST_ID; @@ -26,6 +33,7 @@ import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_ID; import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_TABLE; import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_THUMBNAIL_URL; +import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_URL; import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID_ALIAS; import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS; import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE; @@ -54,14 +62,15 @@ default Flowable> listByService(final int serviceId) + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") Flowable getMaximumIndexOf(long playlistId); - @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_THUMBNAIL_URL + " ELSE :defaultUrl END" + @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_ID + + " ELSE " + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " END" + " FROM " + STREAM_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " + " LIMIT 1" ) - Flowable getAutomaticThumbnailUrl(long playlistId, String defaultUrl); + Flowable getAutomaticThumbnailStreamId(long playlistId); @RewriteQueriesToDropUnusedColumns @Transaction @@ -84,13 +93,67 @@ default Flowable> listByService(final int serviceId) Flowable> getOrderedStreamsOf(long playlistId); @Transaction - @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + PLAYLIST_THUMBNAIL_URL + ", " + @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + + PLAYLIST_THUMBNAIL_PERMANENT + ", " + PLAYLIST_THUMBNAIL_STREAM_ID + ", " + + PLAYLIST_DISPLAY_INDEX + ", " + + + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = " + + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + + " ELSE (SELECT " + STREAM_THUMBNAIL_URL + + " FROM " + STREAM_TABLE + + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID + + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " + + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + + " FROM " + PLAYLIST_TABLE + + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + + " ON " + PLAYLIST_TABLE + "." + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + + " GROUP BY " + PLAYLIST_ID + + " ORDER BY " + PLAYLIST_DISPLAY_INDEX) + Flowable> getPlaylistMetadata(); + + @RewriteQueriesToDropUnusedColumns + @Transaction + @Query("SELECT *, MIN(" + JOIN_INDEX + ")" + + " FROM " + STREAM_TABLE + " INNER JOIN" + + " (SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX + + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId)" + + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + + " LEFT JOIN " + + "(SELECT " + JOIN_STREAM_ID + " AS " + JOIN_STREAM_ID_ALIAS + ", " + + STREAM_PROGRESS_MILLIS + + " FROM " + STREAM_STATE_TABLE + " )" + + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID_ALIAS + + " GROUP BY " + STREAM_ID + + " ORDER BY MIN(" + JOIN_INDEX + ") ASC") + Flowable> getStreamsWithoutDuplicates(long playlistId); + + @Transaction + @Query("SELECT " + PLAYLIST_TABLE + "." + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + + PLAYLIST_THUMBNAIL_PERMANENT + ", " + PLAYLIST_THUMBNAIL_STREAM_ID + ", " + + PLAYLIST_DISPLAY_INDEX + ", " + + + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = " + + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + + " ELSE (SELECT " + STREAM_THUMBNAIL_URL + + " FROM " + STREAM_TABLE + + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID + + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " + + + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " + + "COALESCE(SUM(" + STREAM_URL + " = :streamUrl), 0) AS " + + PLAYLIST_TIMES_STREAM_IS_CONTAINED + " FROM " + PLAYLIST_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + + " ON " + PLAYLIST_TABLE + "." + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + + + " LEFT JOIN " + STREAM_TABLE + + " ON " + STREAM_TABLE + "." + STREAM_ID + " = " + JOIN_STREAM_ID + + " AND :streamUrl = :streamUrl" + + " GROUP BY " + JOIN_PLAYLIST_ID - + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") - Flowable> getPlaylistMetadata(); + + " ORDER BY " + PLAYLIST_DISPLAY_INDEX + ", " + PLAYLIST_NAME) + Flowable> getPlaylistDuplicatesMetadata(String streamUrl); } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index 086362da22d..e0c1a06b79b 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -2,20 +2,28 @@ import androidx.room.ColumnInfo; import androidx.room.Entity; -import androidx.room.Index; +import androidx.room.Ignore; import androidx.room.PrimaryKey; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; -@Entity(tableName = PLAYLIST_TABLE, - indices = {@Index(value = {PLAYLIST_NAME})}) +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; + +@Entity(tableName = PLAYLIST_TABLE) public class PlaylistEntity { + + public static final String DEFAULT_THUMBNAIL = "drawable://" + + R.drawable.placeholder_thumbnail_playlist; + public static final long DEFAULT_THUMBNAIL_ID = -1; + public static final String PLAYLIST_TABLE = "playlists"; public static final String PLAYLIST_ID = "uid"; public static final String PLAYLIST_NAME = "name"; public static final String PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; + public static final String PLAYLIST_DISPLAY_INDEX = "display_index"; public static final String PLAYLIST_THUMBNAIL_PERMANENT = "is_thumbnail_permanent"; + public static final String PLAYLIST_THUMBNAIL_STREAM_ID = "thumbnail_stream_id"; @PrimaryKey(autoGenerate = true) @ColumnInfo(name = PLAYLIST_ID) @@ -24,17 +32,30 @@ public class PlaylistEntity { @ColumnInfo(name = PLAYLIST_NAME) private String name; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) - private String thumbnailUrl; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT) private boolean isThumbnailPermanent; - public PlaylistEntity(final String name, final String thumbnailUrl, - final boolean isThumbnailPermanent) { + @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID) + private long thumbnailStreamId; + + @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) + private long displayIndex; + + public PlaylistEntity(final String name, final boolean isThumbnailPermanent, + final long thumbnailStreamId, final long displayIndex) { this.name = name; - this.thumbnailUrl = thumbnailUrl; this.isThumbnailPermanent = isThumbnailPermanent; + this.thumbnailStreamId = thumbnailStreamId; + this.displayIndex = displayIndex; + } + + @Ignore + public PlaylistEntity(final PlaylistMetadataEntry item) { + this.uid = item.getUid(); + this.name = item.name; + this.isThumbnailPermanent = item.isThumbnailPermanent(); + this.thumbnailStreamId = item.getThumbnailStreamId(); + this.displayIndex = item.getDisplayIndex(); } public long getUid() { @@ -53,12 +74,12 @@ public void setName(final String name) { this.name = name; } - public String getThumbnailUrl() { - return thumbnailUrl; + public long getThumbnailStreamId() { + return thumbnailStreamId; } - public void setThumbnailUrl(final String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; + public void setThumbnailStreamId(final long thumbnailStreamId) { + this.thumbnailStreamId = thumbnailStreamId; } public boolean getIsThumbnailPermanent() { @@ -69,4 +90,11 @@ public void setIsThumbnailPermanent(final boolean isThumbnailSet) { this.isThumbnailPermanent = isThumbnailSet; } + public long getDisplayIndex() { + return displayIndex; + } + + public void setDisplayIndex(final long displayIndex) { + this.displayIndex = displayIndex; + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index 2e9a15d7dac..60027a057f2 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.database.playlist.PlaylistLocalItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.image.ImageStrategy; import static org.schabi.newpipe.database.LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_NAME; @@ -20,7 +21,6 @@ @Entity(tableName = REMOTE_PLAYLIST_TABLE, indices = { - @Index(value = {REMOTE_PLAYLIST_NAME}), @Index(value = {REMOTE_PLAYLIST_SERVICE_ID, REMOTE_PLAYLIST_URL}, unique = true) }) public class PlaylistRemoteEntity implements PlaylistLocalItem { @@ -31,6 +31,7 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { public static final String REMOTE_PLAYLIST_URL = "url"; public static final String REMOTE_PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; public static final String REMOTE_PLAYLIST_UPLOADER_NAME = "uploader"; + public static final String REMOTE_PLAYLIST_DISPLAY_INDEX = "display_index"; public static final String REMOTE_PLAYLIST_STREAM_COUNT = "stream_count"; @PrimaryKey(autoGenerate = true) @@ -52,6 +53,9 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { @ColumnInfo(name = REMOTE_PLAYLIST_UPLOADER_NAME) private String uploader; + @ColumnInfo(name = REMOTE_PLAYLIST_DISPLAY_INDEX) + private long displayIndex = -1; // Make sure the new item is on the top + @ColumnInfo(name = REMOTE_PLAYLIST_STREAM_COUNT) private Long streamCount; @@ -66,11 +70,25 @@ public PlaylistRemoteEntity(final int serviceId, final String name, final String this.streamCount = streamCount; } + @Ignore + public PlaylistRemoteEntity(final int serviceId, final String name, final String url, + final String thumbnailUrl, final String uploader, + final long displayIndex, final Long streamCount) { + this.serviceId = serviceId; + this.name = name; + this.url = url; + this.thumbnailUrl = thumbnailUrl; + this.uploader = uploader; + this.displayIndex = displayIndex; + this.streamCount = streamCount; + } + @Ignore public PlaylistRemoteEntity(final PlaylistInfo info) { this(info.getServiceId(), info.getName(), info.getUrl(), - info.getThumbnailUrl() == null - ? info.getUploaderAvatarUrl() : info.getThumbnailUrl(), + // use uploader avatar when no thumbnail is available + ImageStrategy.imageListToDbUrl(info.getThumbnails().isEmpty() + ? info.getUploaderAvatars() : info.getThumbnails()), info.getUploaderName(), info.getStreamCount()); } @@ -84,10 +102,14 @@ public boolean isIdenticalTo(final PlaylistInfo info) { && getStreamCount() == info.getStreamCount() && TextUtils.equals(getName(), info.getName()) && TextUtils.equals(getUrl(), info.getUrl()) - && TextUtils.equals(getThumbnailUrl(), info.getThumbnailUrl()) + // we want to update the local playlist data even when either the remote thumbnail + // URL changes, or the preferred image quality setting is changed by the user + && TextUtils.equals(getThumbnailUrl(), + ImageStrategy.imageListToDbUrl(info.getThumbnails())) && TextUtils.equals(getUploader(), info.getUploaderName()); } + @Override public long getUid() { return uid; } @@ -136,6 +158,16 @@ public void setUploader(final String uploader) { this.uploader = uploader; } + @Override + public long getDisplayIndex() { + return displayIndex; + } + + @Override + public void setDisplayIndex(final long displayIndex) { + this.displayIndex = displayIndex; + } + public Long getStreamCount() { return streamCount; } diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt index dc0db59d8df..1f3654e7ae4 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt @@ -7,6 +7,7 @@ import org.schabi.newpipe.database.history.model.StreamHistoryEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.image.ImageStrategy import java.time.OffsetDateTime class StreamStatisticsEntry( @@ -30,7 +31,7 @@ class StreamStatisticsEntry( item.duration = streamEntity.duration item.uploaderName = streamEntity.uploader item.uploaderUrl = streamEntity.uploaderUrl - item.thumbnailUrl = streamEntity.thumbnailUrl + item.thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) return item } diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt index c56f919490b..d9c160b89bc 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt @@ -13,6 +13,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.player.playqueue.PlayQueueItem +import org.schabi.newpipe.util.image.ImageStrategy import java.io.Serializable import java.time.OffsetDateTime @@ -67,7 +68,8 @@ data class StreamEntity( constructor(item: StreamInfoItem) : this( serviceId = item.serviceId, url = item.url, title = item.name, streamType = item.streamType, duration = item.duration, uploader = item.uploaderName, - uploaderUrl = item.uploaderUrl, thumbnailUrl = item.thumbnailUrl, viewCount = item.viewCount, + uploaderUrl = item.uploaderUrl, + thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails), viewCount = item.viewCount, textualUploadDate = item.textualUploadDate, uploadDate = item.uploadDate?.offsetDateTime(), isUploadDateApproximation = item.uploadDate?.isApproximation ) @@ -76,7 +78,8 @@ data class StreamEntity( constructor(info: StreamInfo) : this( serviceId = info.serviceId, url = info.url, title = info.name, streamType = info.streamType, duration = info.duration, uploader = info.uploaderName, - uploaderUrl = info.uploaderUrl, thumbnailUrl = info.thumbnailUrl, viewCount = info.viewCount, + uploaderUrl = info.uploaderUrl, + thumbnailUrl = ImageStrategy.imageListToDbUrl(info.thumbnails), viewCount = info.viewCount, textualUploadDate = info.textualUploadDate, uploadDate = info.uploadDate?.offsetDateTime(), isUploadDateApproximation = info.uploadDate?.isApproximation ) @@ -85,7 +88,8 @@ data class StreamEntity( constructor(item: PlayQueueItem) : this( serviceId = item.serviceId, url = item.url, title = item.title, streamType = item.streamType, duration = item.duration, uploader = item.uploader, - uploaderUrl = item.uploaderUrl, thumbnailUrl = item.thumbnailUrl + uploaderUrl = item.uploaderUrl, + thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails) ) fun toStreamInfoItem(): StreamInfoItem { @@ -93,7 +97,7 @@ data class StreamEntity( item.duration = duration item.uploaderName = uploader item.uploaderUrl = uploaderUrl - item.thumbnailUrl = thumbnailUrl + item.thumbnails = ImageStrategy.dbUrlToImageList(thumbnailUrl) if (viewCount != null) item.viewCount = viewCount as Long item.textualUploadDate = textualUploadDate diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java index 75766850ff5..627acea45a4 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java @@ -30,7 +30,7 @@ public class StreamStateEntity { /** * Playback state will not be saved, if playback time is less than this threshold (5000ms = 5s). */ - private static final long PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000; + public static final long PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000; /** * Stream will be considered finished if the playback time left exceeds this threshold diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java index 0e4bda49076..df5a3067af0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.database.subscription; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; @@ -10,6 +11,7 @@ import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.image.ImageStrategy; import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_SERVICE_ID; import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_TABLE; @@ -57,8 +59,8 @@ public static SubscriptionEntity from(@NonNull final ChannelInfo info) { final SubscriptionEntity result = new SubscriptionEntity(); result.setServiceId(info.getServiceId()); result.setUrl(info.getUrl()); - result.setData(info.getName(), info.getAvatarUrl(), info.getDescription(), - info.getSubscriberCount()); + result.setData(info.getName(), ImageStrategy.imageListToDbUrl(info.getAvatars()), + info.getDescription(), info.getSubscriberCount()); return result; } @@ -94,11 +96,12 @@ public void setName(final String name) { this.name = name; } + @Nullable public String getAvatarUrl() { return avatarUrl; } - public void setAvatarUrl(final String avatarUrl) { + public void setAvatarUrl(@Nullable final String avatarUrl) { this.avatarUrl = avatarUrl; } @@ -138,7 +141,7 @@ public void setData(final String n, final String au, final String d, final Long @Ignore public ChannelInfoItem toChannelInfoItem() { final ChannelInfoItem item = new ChannelInfoItem(getServiceId(), getUrl(), getName()); - item.setThumbnailUrl(getAvatarUrl()); + item.setThumbnails(ImageStrategy.dbUrlToImageList(getAvatarUrl())); item.setSubscriberCount(getSubscriberCount()); item.setDescription(getDescription()); return item; 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 d1ee0ee881d..34a4ba022e2 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -7,8 +7,6 @@ import android.app.Activity; import android.content.ComponentName; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; @@ -16,6 +14,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.IBinder; +import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -40,6 +39,8 @@ import androidx.fragment.app.DialogFragment; import androidx.preference.PreferenceManager; +import com.evernote.android.state.State; +import com.livefront.bridge.Bridge; import com.nononsenseapps.filepicker.Utils; import org.schabi.newpipe.MainActivity; @@ -60,6 +61,8 @@ import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard; import org.schabi.newpipe.streams.io.StoredDirectoryHelper; import org.schabi.newpipe.streams.io.StoredFileHelper; +import org.schabi.newpipe.util.AudioTrackAdapter; +import org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper; import org.schabi.newpipe.util.FilePickerActivityHelper; import org.schabi.newpipe.util.FilenameUtils; import org.schabi.newpipe.util.ListHelper; @@ -67,18 +70,17 @@ import org.schabi.newpipe.util.SecondaryStreamHelper; import org.schabi.newpipe.util.SimpleOnSeekBarChangeListener; import org.schabi.newpipe.util.StreamItemAdapter; -import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; +import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper; import org.schabi.newpipe.util.ThemeHelper; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Optional; -import icepick.Icepick; -import icepick.State; import io.reactivex.rxjava3.disposables.CompositeDisposable; import us.shandian.giga.get.MissionRecoveryInfo; import us.shandian.giga.postprocessing.Postprocessing; @@ -95,11 +97,13 @@ public class DownloadDialog extends DialogFragment @State StreamInfo currentInfo; @State - StreamSizeWrapper wrappedAudioStreams; + StreamInfoWrapper wrappedVideoStreams; @State - StreamSizeWrapper wrappedVideoStreams; + StreamInfoWrapper wrappedSubtitleStreams; @State - StreamSizeWrapper wrappedSubtitleStreams; + AudioTracksWrapper wrappedAudioTracks; + @State + int selectedAudioTrackIndex; @State int selectedVideoIndex; // set in the constructor @State @@ -107,16 +111,14 @@ public class DownloadDialog extends DialogFragment @State int selectedSubtitleIndex = 0; // default to the first item - @Nullable - private OnDismissListener onDismissListener = null; - private StoredDirectoryHelper mainStorageAudio = null; private StoredDirectoryHelper mainStorageVideo = null; private DownloadManager downloadManager = null; private ActionMenuItemView okButton = null; - private Context context; + private Context context = null; private boolean askForSavePath; + private AudioTrackAdapter audioTrackAdapter; private StreamItemAdapter audioStreamsAdapter; private StreamItemAdapter videoStreamsAdapter; private StreamItemAdapter subtitleStreamsAdapter; @@ -141,7 +143,6 @@ public class DownloadDialog extends DialogFragment registerForActivityResult( new StartActivityForResult(), this::requestDownloadPickVideoFolderResult); - /*////////////////////////////////////////////////////////////////////////// // Instance creation //////////////////////////////////////////////////////////////////////////*/ @@ -163,31 +164,32 @@ 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<>( + this.wrappedVideoStreams = new StreamInfoWrapper<>(videoStreams, context); + this.wrappedSubtitleStreams = new StreamInfoWrapper<>( getStreamsOfSpecifiedDelivery(info.getSubtitles(), PROGRESSIVE_HTTP), context); this.selectedVideoIndex = ListHelper.getDefaultResolutionIndex(context, videoStreams); } - /** - * @param onDismissListener the listener to call in {@link #onDismiss(DialogInterface)} - */ - public void setOnDismissListener(@Nullable final OnDismissListener onDismissListener) { - this.onDismissListener = onDismissListener; - } - /*////////////////////////////////////////////////////////////////////////// // Android lifecycle @@ -207,38 +209,16 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { return; } + // context will remain null if dismiss() was called above, allowing to check whether the + // dialog is being dismissed in onViewCreated() context = getContext(); 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"); - } - } - } + Bridge.restoreInstanceState(this, savedInstanceState); - this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); - this.audioStreamsAdapter = new StreamItemAdapter<>(wrappedAudioStreams); + this.audioTrackAdapter = new AudioTrackAdapter(wrappedAudioTracks); this.subtitleStreamsAdapter = new StreamItemAdapter<>(wrappedSubtitleStreams); + updateSecondaryStreams(); final Intent intent = new Intent(context, DownloadManagerService.class); context.startService(intent); @@ -265,6 +245,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 StreamInfoWrapper audioStreams = getWrappedAudioStreams(); + final var secondaryStreams = new SparseArrayCompat>(4); + final List videoStreams = wrappedVideoStreams.getStreamsList(); + wrappedVideoStreams.resetInfo(); + + for (int i = 0; i < videoStreams.size(); i++) { + if (!videoStreams.get(i).isVideoOnly()) { + continue; + } + final AudioStream audioStream = SecondaryStreamHelper.getAudioStreamFor( + context, 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, @@ -282,16 +295,20 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); dialogBinding = DownloadDialogBinding.bind(view); + if (context == null) { + return; // the dialog is being dismissed, see the call to dismiss() in onCreate() + } 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); initToolbar(dialogBinding.toolbarLayout.toolbar); @@ -340,14 +357,6 @@ private void initToolbar(final Toolbar toolbar) { }); } - @Override - public void onDismiss(@NonNull final DialogInterface dialog) { - super.onDismiss(dialog); - if (onDismissListener != null) { - onDismissListener.onDismiss(dialog); - } - } - @Override public void onDestroy() { super.onDestroy(); @@ -363,7 +372,7 @@ public void onDestroyView() { @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + Bridge.saveInstanceState(this, outState); } @@ -373,7 +382,7 @@ public void onSaveInstanceState(@NonNull final Bundle outState) { private void fetchStreamsSize() { disposables.clear(); - disposables.add(StreamSizeWrapper.fetchSizeForWrapper(wrappedVideoStreams) + disposables.add(StreamInfoWrapper.fetchMoreInfoForWrapper(wrappedVideoStreams) .subscribe(result -> { if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.video_button) { @@ -383,7 +392,7 @@ private void fetchStreamsSize() { new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG, "Downloading video stream size", currentInfo.getServiceId())))); - disposables.add(StreamSizeWrapper.fetchSizeForWrapper(wrappedAudioStreams) + disposables.add(StreamInfoWrapper.fetchMoreInfoForWrapper(getWrappedAudioStreams()) .subscribe(result -> { if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button) { @@ -393,7 +402,7 @@ private void fetchStreamsSize() { new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG, "Downloading audio stream size", currentInfo.getServiceId())))); - disposables.add(StreamSizeWrapper.fetchSizeForWrapper(wrappedSubtitleStreams) + disposables.add(StreamInfoWrapper.fetchMoreInfoForWrapper(wrappedSubtitleStreams) .subscribe(result -> { if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.subtitle_button) { @@ -405,14 +414,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() { @@ -422,7 +445,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() { @@ -432,7 +467,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); } @@ -511,7 +550,6 @@ private void requestDownloadPickFolderResult(@NonNull final ActivityResult resul } } - /*////////////////////////////////////////////////////////////////////////// // Listeners //////////////////////////////////////////////////////////////////////////*/ @@ -550,18 +588,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() { @@ -607,6 +658,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; @@ -657,6 +709,13 @@ private void setRadioButtonsState(final boolean enabled) { dialogBinding.subtitleButton.setEnabled(enabled); } + private StreamInfoWrapper getWrappedAudioStreams() { + if (selectedAudioTrackIndex < 0 || selectedAudioTrackIndex > wrappedAudioTracks.size()) { + return StreamInfoWrapper.empty(); + } + return wrappedAudioTracks.getTracksList().get(selectedAudioTrackIndex); + } + private int getSubtitleIndexBy(@NonNull final List streams) { final Localization preferredLocalization = NewPipe.getPreferredLocalization(); @@ -692,12 +751,11 @@ private String getNameEditText() { } private void showFailedDialog(@StringRes final int msg) { - assureCorrectAppLanguage(getContext()); + assureCorrectAppLanguage(requireContext()); new AlertDialog.Builder(context) .setTitle(R.string.general_error) .setMessage(msg) .setNegativeButton(getString(R.string.ok), null) - .create() .show(); } @@ -710,6 +768,7 @@ private void prepareSelectedDownload() { final StoredDirectoryHelper mainStorage; final MediaFormat format; final String selectedMediaType; + final long size; // first, build the filename and get the output folder (if possible) // later, run a very very very large file checking logic @@ -721,35 +780,38 @@ private void prepareSelectedDownload() { selectedMediaType = getString(R.string.last_download_type_audio_key); mainStorage = mainStorageAudio; format = audioStreamsAdapter.getItem(selectedAudioIndex).getFormat(); + size = getWrappedAudioStreams().getSizeInBytes(selectedAudioIndex); if (format == MediaFormat.WEBMA_OPUS) { mimeTmp = "audio/ogg"; filenameTmp += "opus"; } else if (format != null) { mimeTmp = format.mimeType; - filenameTmp += format.suffix; + filenameTmp += format.getSuffix(); } break; case R.id.video_button: selectedMediaType = getString(R.string.last_download_type_video_key); mainStorage = mainStorageVideo; format = videoStreamsAdapter.getItem(selectedVideoIndex).getFormat(); + size = wrappedVideoStreams.getSizeInBytes(selectedVideoIndex); if (format != null) { mimeTmp = format.mimeType; - filenameTmp += format.suffix; + filenameTmp += format.getSuffix(); } break; case R.id.subtitle_button: selectedMediaType = getString(R.string.last_download_type_subtitle_key); mainStorage = mainStorageVideo; // subtitle & video files go together format = subtitleStreamsAdapter.getItem(selectedSubtitleIndex).getFormat(); + size = wrappedSubtitleStreams.getSizeInBytes(selectedSubtitleIndex); if (format != null) { mimeTmp = format.mimeType; } if (format == MediaFormat.TTML) { - filenameTmp += MediaFormat.SRT.suffix; + filenameTmp += MediaFormat.SRT.getSuffix(); } else if (format != null) { - filenameTmp += format.suffix; + filenameTmp += format.getSuffix(); } break; default: @@ -797,6 +859,21 @@ private void prepareSelectedDownload() { return; } + // Check for free storage space + final long freeSpace = mainStorage.getFreeStorageSpace(); + if (freeSpace <= size) { + Toast.makeText(context, getString(R. + string.error_insufficient_storage), Toast.LENGTH_LONG).show(); + // move the user to storage setting tab + final Intent storageSettingsIntent = new Intent(Settings. + ACTION_INTERNAL_STORAGE_SETTINGS); + if (storageSettingsIntent.resolveActivity(context.getPackageManager()) + != null) { + startActivity(storageSettingsIntent); + } + return; + } + // check for existing file with the same name checkSelectedDownload(mainStorage, mainStorage.findFile(filenameTmp), filenameTmp, mimeTmp); @@ -910,7 +987,7 @@ private void checkSelectedDownload(final StoredDirectoryHelper mainStorage, break; } - askDialog.create().show(); + askDialog.show(); return; } @@ -954,7 +1031,7 @@ private void checkSelectedDownload(final StoredDirectoryHelper mainStorage, } }); - askDialog.create().show(); + askDialog.show(); } private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { @@ -979,7 +1056,7 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { final char kind; int threads = dialogBinding.threads.getProgress() + 1; final String[] urls; - final MissionRecoveryInfo[] recoveryInfo; + final List recoveryInfo; String psName = null; String[] psArgs = null; long nearLength = 0; @@ -1013,7 +1090,6 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { psName = Postprocessing.ALGORITHM_WEBM_MUXER; } - psArgs = null; final long videoSize = wrappedVideoStreams.getSizeInBytes( (VideoStream) selectedStream); @@ -1045,9 +1121,7 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { urls = new String[] { selectedStream.getContent() }; - recoveryInfo = new MissionRecoveryInfo[] { - new MissionRecoveryInfo(selectedStream) - }; + recoveryInfo = List.of(new MissionRecoveryInfo(selectedStream)); } else { if (secondaryStream.getDeliveryMethod() != PROGRESSIVE_HTTP) { throw new IllegalArgumentException("Unsupported stream delivery format" @@ -1057,12 +1131,14 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { urls = new String[] { selectedStream.getContent(), secondaryStream.getContent() }; - recoveryInfo = new MissionRecoveryInfo[] {new MissionRecoveryInfo(selectedStream), - new MissionRecoveryInfo(secondaryStream)}; + recoveryInfo = List.of( + new MissionRecoveryInfo(selectedStream), + new MissionRecoveryInfo(secondaryStream) + ); } DownloadManagerService.startMission(context, urls, storage, kind, threads, - currentInfo.getUrl(), psName, psArgs, nearLength, recoveryInfo); + currentInfo.getUrl(), psName, psArgs, nearLength, new ArrayList<>(recoveryInfo)); Toast.makeText(context, getString(R.string.download_has_started), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/org/schabi/newpipe/download/LoadingDialog.java b/app/src/main/java/org/schabi/newpipe/download/LoadingDialog.java new file mode 100644 index 00000000000..9e6861908f0 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/download/LoadingDialog.java @@ -0,0 +1,87 @@ +package org.schabi.newpipe.download; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; + +import org.schabi.newpipe.MainActivity; +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.DownloadLoadingDialogBinding; + +/** + * This class contains a dialog which shows a loading indicator and has a customizable title. + */ +public class LoadingDialog extends DialogFragment { + private static final String TAG = "LoadingDialog"; + private static final boolean DEBUG = MainActivity.DEBUG; + private DownloadLoadingDialogBinding dialogLoadingBinding; + private final @StringRes int title; + + /** + * Create a new LoadingDialog. + * + *

+ * The dialog contains a loading indicator and has a customizable title. + *
+ * Use {@code show()} to display the dialog to the user. + *

+ * + * @param title an informative title shown in the dialog's toolbar + */ + public LoadingDialog(final @StringRes int title) { + this.title = title; + } + + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (DEBUG) { + Log.d(TAG, "onCreate() called with: " + + "savedInstanceState = [" + savedInstanceState + "]"); + } + this.setCancelable(false); + } + + @Override + public View onCreateView( + @NonNull final LayoutInflater inflater, + final ViewGroup container, + final Bundle savedInstanceState) { + if (DEBUG) { + Log.d(TAG, "onCreateView() called with: " + + "inflater = [" + inflater + "], container = [" + container + "], " + + "savedInstanceState = [" + savedInstanceState + "]"); + } + return inflater.inflate(R.layout.download_loading_dialog, container); + } + + @Override + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + dialogLoadingBinding = DownloadLoadingDialogBinding.bind(view); + initToolbar(dialogLoadingBinding.toolbarLayout.toolbar); + } + + private void initToolbar(final Toolbar toolbar) { + if (DEBUG) { + Log.d(TAG, "initToolbar() called with: toolbar = [" + toolbar + "]"); + } + toolbar.setTitle(requireContext().getString(title)); + toolbar.setNavigationOnClickListener(v -> dismiss()); + + } + + @Override + public void onDestroyView() { + dialogLoadingBinding = null; + super.onDestroyView(); + } +} 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 e1dd929d4d4..2f607b4876a 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java @@ -2,7 +2,6 @@ import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -13,15 +12,14 @@ import android.view.MenuInflater; import android.view.MenuItem; -import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.IntentCompat; import com.grack.nanojson.JsonWriter; import org.schabi.newpipe.BuildConfig; -import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.ActivityErrorBinding; import org.schabi.newpipe.util.Localization; @@ -105,7 +103,7 @@ protected void onCreate(final Bundle savedInstanceState) { actionBar.setDisplayShowTitleEnabled(true); } - errorInfo = intent.getParcelableExtra(ERROR_INFO); + errorInfo = IntentCompat.getParcelableExtra(intent, ERROR_INFO, ErrorInfo.class); // important add guru meditation addGuruMeditation(); @@ -160,7 +158,7 @@ private void openPrivacyPolicyDialog(final Context context, final String action) .setMessage(R.string.start_accept_privacy_policy) .setCancelable(false) .setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> - ShareUtils.openUrlInBrowser(context, + ShareUtils.openUrlInApp(context, context.getString(R.string.privacy_policy_url))) .setPositiveButton(R.string.accept, (dialog, which) -> { if (action.equals("EMAIL")) { // send on email @@ -171,14 +169,12 @@ private void openPrivacyPolicyDialog(final Context context, final String action) + getString(R.string.app_name) + " " + BuildConfig.VERSION_NAME) .putExtra(Intent.EXTRA_TEXT, buildJson()); - ShareUtils.openIntentInApp(context, i, true); + ShareUtils.openIntentInApp(context, i); } else if (action.equals("GITHUB")) { // open the NewPipe issue page on GitHub - ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL, false); + ShareUtils.openUrlInApp(this, ERROR_GITHUB_ISSUE_URL); } }) - .setNegativeButton(R.string.decline, (dialog, which) -> { - // do nothing - }) + .setNegativeButton(R.string.decline, null) .show(); } @@ -188,25 +184,6 @@ private String formErrorText(final String[] el) { .collect(Collectors.joining(separator + "\n", separator + "\n", separator)); } - /** - * Get the checked activity. - * - * @param returnActivity the activity to return to - * @return the casted return activity or null - */ - @Nullable - static Class getReturnActivity(final Class returnActivity) { - Class checkedReturnActivity = null; - if (returnActivity != null) { - if (Activity.class.isAssignableFrom(returnActivity)) { - checkedReturnActivity = returnActivity.asSubclass(Activity.class); - } else { - checkedReturnActivity = MainActivity.class; - } - } - return checkedReturnActivity; - } - private void buildInfo(final ErrorInfo info) { String text = ""; diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index d87fa333060..6d8c1bd638c 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -11,7 +11,6 @@ import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException import org.schabi.newpipe.extractor.exceptions.ExtractionException -import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.DeobfuscateException import org.schabi.newpipe.ktx.isNetworkRelated import org.schabi.newpipe.util.ServiceHelper @@ -96,7 +95,6 @@ class ErrorInfo( throwable is ContentNotAvailableException -> R.string.content_not_available throwable != null && throwable.isNetworkRelated -> R.string.network_error throwable is ContentNotSupportedException -> R.string.content_not_supported - throwable is DeobfuscateException -> R.string.youtube_signature_deobfuscation_error throwable is ExtractionException -> R.string.parsing_error throwable is ExoPlaybackException -> { when (throwable.type) { diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index b41d3997ee0..fcc06210202 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -6,7 +6,6 @@ import android.util.Log import android.view.View import android.widget.Button import android.widget.TextView -import androidx.annotation.Nullable import androidx.annotation.StringRes import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -144,7 +143,7 @@ class ErrorPanelHelper( */ private fun showAndSetErrorButtonAction( @StringRes resid: Int, - @Nullable listener: View.OnClickListener + listener: View.OnClickListener ) { errorActionButton.isVisible = true errorActionButton.setText(resid) @@ -156,7 +155,7 @@ class ErrorPanelHelper( ) { errorOpenInBrowserButton.isVisible = true errorOpenInBrowserButton.setOnClickListener { - ShareUtils.openUrlInBrowser(context, errorInfo.request, true) + ShareUtils.openUrlInBrowser(context, errorInfo.request) } } 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 c7b9beeedd2..dcbc1141335 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -9,10 +9,10 @@ import android.view.View import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.fragment.app.Fragment import com.google.android.material.snackbar.Snackbar import org.schabi.newpipe.R -import org.schabi.newpipe.util.PendingIntentCompat /** * This class contains all of the methods that should be used to let the user know that an error has @@ -54,7 +54,7 @@ class ErrorUtil { */ @JvmStatic fun showSnackbar(context: Context, errorInfo: ErrorInfo) { - val rootView = if (context is Activity) context.findViewById(R.id.content) else null + val rootView = (context as? Activity)?.findViewById(android.R.id.content) showSnackbar(context, rootView, errorInfo) } @@ -71,7 +71,7 @@ class ErrorUtil { fun showSnackbar(fragment: Fragment, errorInfo: ErrorInfo) { var rootView = fragment.view if (rootView == null && fragment.activity != null) { - rootView = fragment.requireActivity().findViewById(R.id.content) + rootView = fragment.requireActivity().findViewById(android.R.id.content) } showSnackbar(fragment.requireContext(), rootView, errorInfo) } @@ -118,7 +118,8 @@ class ErrorUtil { context, 0, getErrorActivityIntent(context, errorInfo), - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT, + false ) ) diff --git a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java index 3c14cfe4cac..51a0ff1e632 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java @@ -27,8 +27,6 @@ import org.schabi.newpipe.extractor.utils.Utils; import org.schabi.newpipe.util.ThemeHelper; -import java.io.UnsupportedEncodingException; - /* * Created by beneth on 06.12.16. * @@ -187,14 +185,11 @@ private void handleCookiesFromUrl(@Nullable final String url) { final int abuseEnd = url.indexOf("+path"); try { - String abuseCookie = url.substring(abuseStart + 13, abuseEnd); - abuseCookie = Utils.decodeUrlUtf8(abuseCookie); - handleCookies(abuseCookie); - } catch (UnsupportedEncodingException | StringIndexOutOfBoundsException e) { + handleCookies(Utils.decodeUrlUtf8(url.substring(abuseStart + 13, abuseEnd))); + } catch (final StringIndexOutOfBoundsException e) { if (MainActivity.DEBUG) { - e.printStackTrace(); - Log.d(TAG, "handleCookiesFromUrl: invalid google abuse starting at " - + abuseStart + " and ending at " + abuseEnd + " for url " + url); + Log.e(TAG, "handleCookiesFromUrl: invalid google abuse starting at " + + abuseStart + " and ending at " + abuseEnd + " for url " + url, e); } } } diff --git a/app/src/main/java/org/schabi/newpipe/error/UserAction.java b/app/src/main/java/org/schabi/newpipe/error/UserAction.java index 97617337382..6ca66e0d2ab 100644 --- a/app/src/main/java/org/schabi/newpipe/error/UserAction.java +++ b/app/src/main/java/org/schabi/newpipe/error/UserAction.java @@ -6,6 +6,7 @@ public enum UserAction { USER_REPORT("user report"), UI_ERROR("ui error"), + DATABASE_IMPORT_EXPORT("database import or export"), SUBSCRIPTION_CHANGE("subscription change"), SUBSCRIPTION_UPDATE("subscription update"), SUBSCRIPTION_GET("get subscription"), @@ -19,6 +20,7 @@ public enum UserAction { REQUESTED_PLAYLIST("requested playlist"), REQUESTED_KIOSK("requested kiosk"), REQUESTED_COMMENTS("requested comments"), + REQUESTED_COMMENT_REPLIES("requested comment replies"), REQUESTED_FEED("requested feed"), REQUESTED_BOOKMARK("bookmark"), DELETE_FROM_HISTORY("delete from history"), diff --git a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java index 9b4bf837725..8361953b9dd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java @@ -1,14 +1,20 @@ package org.schabi.newpipe.fragments; +import static org.schabi.newpipe.ktx.ViewUtils.animate; + import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ProgressBar; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.StringRes; import androidx.fragment.app.Fragment; +import com.evernote.android.state.State; + import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorInfo; @@ -18,17 +24,15 @@ import java.util.concurrent.atomic.AtomicBoolean; -import icepick.State; - -import static org.schabi.newpipe.ktx.ViewUtils.animate; - public abstract class BaseStateFragment extends BaseFragment implements ViewContract { @State protected AtomicBoolean wasLoading = new AtomicBoolean(); protected AtomicBoolean isLoading = new AtomicBoolean(); @Nullable - private View emptyStateView; + protected View emptyStateView; + @Nullable + protected TextView emptyStateMessageView; @Nullable private ProgressBar loadingProgressBar; @@ -65,6 +69,7 @@ public void onResume() { protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); emptyStateView = rootView.findViewById(R.id.empty_state_view); + emptyStateMessageView = rootView.findViewById(R.id.empty_state_message); loadingProgressBar = rootView.findViewById(R.id.loading_progress_bar); errorPanelHelper = new ErrorPanelHelper(this, rootView, this::onRetryButtonClicked); } @@ -75,6 +80,8 @@ public void onDestroyView() { if (errorPanelHelper != null) { errorPanelHelper.dispose(); } + emptyStateView = null; + emptyStateMessageView = null; } protected void onRetryButtonClicked() { @@ -127,6 +134,7 @@ public void hideLoading() { hideErrorPanel(); } + @Override public void showEmptyState() { isLoading.set(false); if (emptyStateView != null) { @@ -189,6 +197,12 @@ public final void showTextError(@NonNull final String errorString) { errorPanelHelper.showTextError(errorString); } + protected void setEmptyStateMessage(@StringRes final int text) { + if (emptyStateMessageView != null) { + emptyStateMessageView.setText(text); + } + } + public final void hideErrorPanel() { errorPanelHelper.hide(); lastPanelError = null; 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..381de50032a 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; @@ -25,10 +38,13 @@ import org.schabi.newpipe.databinding.FragmentMainBinding; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.ThemeHelper; +import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; import java.util.List; @@ -42,8 +58,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 +85,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 +107,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 @@ -118,6 +140,12 @@ public void onDestroy() { } } + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } + /*////////////////////////////////////////////////////////////////////////// // Menu //////////////////////////////////////////////////////////////////////////*/ @@ -166,7 +194,6 @@ private void setupTabs() { } binding.pager.setAdapter(null); - binding.pager.setOffscreenPageLimit(tabsList.size()); binding.pager.setAdapter(pagerAdapter); updateTabsIconAndDescription(); @@ -190,6 +217,44 @@ private void updateTitleForTab(final int tabPosition) { setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } + public void commitPlaylistTabs() { + pagerAdapter.getLocalPlaylistFragments() + .stream() + .forEach(LocalPlaylistFragment::saveImmediate); + } + + 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 ? android.R.attr.windowBackground : R.attr.colorPrimary)); + + @ColorInt final int iconColor = bottom + ? ThemeHelper.resolveColorFromAttr(requireContext(), android.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) { @@ -209,10 +274,18 @@ public void onTabReselected(final TabLayout.Tab tab) { updateTitleForTab(tab.getPosition()); } - private static final class SelectedTabsPagerAdapter + public static final class SelectedTabsPagerAdapter extends FragmentStatePagerAdapterMenuWorkaround { private final Context context; private final List internalTabsList; + /** + * Keep reference to LocalPlaylistFragments, because their data can be modified by the user + * during runtime and changes are not committed immediately. However, in some cases, + * the changes need to be committed immediately by calling + * {@link LocalPlaylistFragment#saveImmediate()}. + * The fragments are removed when {@link LocalPlaylistFragment#onDestroy()} is called. + */ + private final List localPlaylistFragments = new ArrayList<>(); private SelectedTabsPagerAdapter(final Context context, final FragmentManager fragmentManager, @@ -239,9 +312,17 @@ public Fragment getItem(final int position) { ((BaseFragment) fragment).useAsFrontPage(true); } + if (fragment instanceof LocalPlaylistFragment) { + localPlaylistFragments.add((LocalPlaylistFragment) fragment); + } + return fragment; } + public List getLocalPlaylistFragments() { + return localPlaylistFragments; + } + @Override public int getItemPosition(@NonNull final Object object) { // Causes adapter to reload all Fragments when diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java new file mode 100644 index 00000000000..4789b02e65b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java @@ -0,0 +1,281 @@ +package org.schabi.newpipe.fragments.detail; + +import static android.text.TextUtils.isEmpty; +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD; + +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.StyleSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.widget.TooltipCompat; +import androidx.core.text.HtmlCompat; + +import com.google.android.material.chip.Chip; + +import org.schabi.newpipe.BaseFragment; +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.FragmentDescriptionBinding; +import org.schabi.newpipe.databinding.ItemMetadataBinding; +import org.schabi.newpipe.databinding.ItemMetadataTagsBinding; +import org.schabi.newpipe.extractor.Image; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream.Description; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.text.TextLinkifier; + +import java.util.List; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +public abstract class BaseDescriptionFragment extends BaseFragment { + private final CompositeDisposable descriptionDisposables = new CompositeDisposable(); + protected FragmentDescriptionBinding binding; + + @Override + public View onCreateView(@NonNull final LayoutInflater inflater, + @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState) { + binding = FragmentDescriptionBinding.inflate(inflater, container, false); + setupDescription(); + setupMetadata(inflater, binding.detailMetadataLayout); + addTagsMetadataItem(inflater, binding.detailMetadataLayout); + return binding.getRoot(); + } + + @Override + public void onDestroy() { + descriptionDisposables.clear(); + super.onDestroy(); + } + + /** + * Get the description to display. + * @return description object, if available + */ + @Nullable + protected abstract Description getDescription(); + + /** + * Get the streaming service. Used for generating description links. + * @return streaming service + */ + @NonNull + protected abstract StreamingService getService(); + + /** + * Get the streaming service ID. Used for tag links. + * @return service ID + */ + protected abstract int getServiceId(); + + /** + * Get the URL of the described video or audio, used to generate description links. + * @return stream URL + */ + @Nullable + protected abstract String getStreamUrl(); + + /** + * Get the list of tags to display below the description. + * @return tag list + */ + @NonNull + public abstract List getTags(); + + /** + * Add additional metadata to display. + * @param inflater LayoutInflater + * @param layout detailMetadataLayout + */ + protected abstract void setupMetadata(LayoutInflater inflater, LinearLayout layout); + + private void setupDescription() { + final Description description = getDescription(); + if (description == null || isEmpty(description.getContent()) + || description == Description.EMPTY_DESCRIPTION) { + binding.detailDescriptionView.setVisibility(View.GONE); + binding.detailSelectDescriptionButton.setVisibility(View.GONE); + return; + } + + // start with disabled state. This also loads description content (!) + disableDescriptionSelection(); + + binding.detailSelectDescriptionButton.setOnClickListener(v -> { + if (binding.detailDescriptionNoteView.getVisibility() == View.VISIBLE) { + disableDescriptionSelection(); + } else { + // enable selection only when button is clicked to prevent flickering + enableDescriptionSelection(); + } + }); + } + + private void enableDescriptionSelection() { + binding.detailDescriptionNoteView.setVisibility(View.VISIBLE); + binding.detailDescriptionView.setTextIsSelectable(true); + + final String buttonLabel = getString(R.string.description_select_disable); + binding.detailSelectDescriptionButton.setContentDescription(buttonLabel); + TooltipCompat.setTooltipText(binding.detailSelectDescriptionButton, buttonLabel); + binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_close); + } + + private void disableDescriptionSelection() { + // show description content again, otherwise some links are not clickable + final Description description = getDescription(); + if (description != null) { + TextLinkifier.fromDescription(binding.detailDescriptionView, + description, HtmlCompat.FROM_HTML_MODE_LEGACY, + getService(), getStreamUrl(), + descriptionDisposables, SET_LINK_MOVEMENT_METHOD); + } + + binding.detailDescriptionNoteView.setVisibility(View.GONE); + binding.detailDescriptionView.setTextIsSelectable(false); + + final String buttonLabel = getString(R.string.description_select_enable); + binding.detailSelectDescriptionButton.setContentDescription(buttonLabel); + TooltipCompat.setTooltipText(binding.detailSelectDescriptionButton, buttonLabel); + binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_select_all); + } + + protected void addMetadataItem(final LayoutInflater inflater, + final LinearLayout layout, + final boolean linkifyContent, + @StringRes final int type, + @NonNull final String content) { + if (isBlank(content)) { + return; + } + + final ItemMetadataBinding itemBinding = + ItemMetadataBinding.inflate(inflater, layout, false); + + itemBinding.metadataTypeView.setText(type); + itemBinding.metadataTypeView.setOnLongClickListener(v -> { + ShareUtils.copyToClipboard(requireContext(), content); + return true; + }); + + if (linkifyContent) { + TextLinkifier.fromPlainText(itemBinding.metadataContentView, content, null, null, + descriptionDisposables, SET_LINK_MOVEMENT_METHOD); + } else { + itemBinding.metadataContentView.setText(content); + } + + itemBinding.metadataContentView.setClickable(true); + + layout.addView(itemBinding.getRoot()); + } + + private String imageSizeToText(final int heightOrWidth) { + if (heightOrWidth < 0) { + return getString(R.string.question_mark); + } else { + return String.valueOf(heightOrWidth); + } + } + + protected void addImagesMetadataItem(final LayoutInflater inflater, + final LinearLayout layout, + @StringRes final int type, + final List images) { + final String preferredImageUrl = ImageStrategy.choosePreferredImage(images); + if (preferredImageUrl == null) { + return; // null will be returned in case there is no image + } + + final ItemMetadataBinding itemBinding = + ItemMetadataBinding.inflate(inflater, layout, false); + itemBinding.metadataTypeView.setText(type); + + final SpannableStringBuilder urls = new SpannableStringBuilder(); + for (final Image image : images) { + if (urls.length() != 0) { + urls.append(", "); + } + final int entryBegin = urls.length(); + + if (image.getHeight() != Image.HEIGHT_UNKNOWN + || image.getWidth() != Image.WIDTH_UNKNOWN + // if even the resolution level is unknown, ?x? will be shown + || image.getEstimatedResolutionLevel() == Image.ResolutionLevel.UNKNOWN) { + urls.append(imageSizeToText(image.getHeight())); + urls.append('x'); + urls.append(imageSizeToText(image.getWidth())); + } else { + switch (image.getEstimatedResolutionLevel()) { + case LOW -> urls.append(getString(R.string.image_quality_low)); + case MEDIUM -> urls.append(getString(R.string.image_quality_medium)); + case HIGH -> urls.append(getString(R.string.image_quality_high)); + default -> { + // unreachable, Image.ResolutionLevel.UNKNOWN is already filtered out + } + } + } + + urls.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull final View widget) { + ShareUtils.openUrlInBrowser(requireContext(), image.getUrl()); + } + }, entryBegin, urls.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + if (preferredImageUrl.equals(image.getUrl())) { + urls.setSpan(new StyleSpan(Typeface.BOLD), entryBegin, urls.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + + itemBinding.metadataContentView.setText(urls); + itemBinding.metadataContentView.setMovementMethod(LinkMovementMethod.getInstance()); + layout.addView(itemBinding.getRoot()); + } + + private void addTagsMetadataItem(final LayoutInflater inflater, final LinearLayout layout) { + final List tags = getTags(); + + if (!tags.isEmpty()) { + final var itemBinding = ItemMetadataTagsBinding.inflate(inflater, layout, false); + + tags.stream().sorted(String.CASE_INSENSITIVE_ORDER).forEach(tag -> { + final Chip chip = (Chip) inflater.inflate(R.layout.chip, + itemBinding.metadataTagsChips, false); + chip.setText(tag); + chip.setOnClickListener(this::onTagClick); + chip.setOnLongClickListener(this::onTagLongClick); + itemBinding.metadataTagsChips.addView(chip); + }); + + layout.addView(itemBinding.getRoot()); + } + } + + private void onTagClick(final View chip) { + if (getParentFragment() != null) { + NavigationHelper.openSearchFragment(getParentFragment().getParentFragmentManager(), + getServiceId(), ((Chip) chip).getText().toString()); + } + } + + private boolean onTagLongClick(final View chip) { + ShareUtils.copyToClipboard(requireContext(), ((Chip) chip).getText().toString()); + return true; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java index bf7f8fa5d97..52fb3f29e72 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java @@ -1,232 +1,112 @@ package org.schabi.newpipe.fragments.detail; -import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT; -import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.util.Localization.getAppLocale; -import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; -import androidx.appcompat.widget.TooltipCompat; -import androidx.core.text.HtmlCompat; -import com.google.android.material.chip.Chip; +import com.evernote.android.state.State; -import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.FragmentDescriptionBinding; -import org.schabi.newpipe.databinding.ItemMetadataBinding; -import org.schabi.newpipe.databinding.ItemMetadataTagsBinding; +import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.stream.Description; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.external_communication.TextLinkifier; -import icepick.State; -import io.reactivex.rxjava3.disposables.CompositeDisposable; +import java.util.List; -public class DescriptionFragment extends BaseFragment { +public class DescriptionFragment extends BaseDescriptionFragment { @State - StreamInfo streamInfo = null; - final CompositeDisposable descriptionDisposables = new CompositeDisposable(); - FragmentDescriptionBinding binding; + StreamInfo streamInfo; + + public DescriptionFragment(final StreamInfo streamInfo) { + this.streamInfo = streamInfo; + } public DescriptionFragment() { + // keep empty constructor for State when resuming fragment from memory } - public DescriptionFragment(final StreamInfo streamInfo) { - this.streamInfo = streamInfo; + + @Nullable + @Override + protected Description getDescription() { + return streamInfo.getDescription(); } + @NonNull @Override - public View onCreateView(@NonNull final LayoutInflater inflater, - @Nullable final ViewGroup container, - @Nullable final Bundle savedInstanceState) { - binding = FragmentDescriptionBinding.inflate(inflater, container, false); - if (streamInfo != null) { - setupUploadDate(); - setupDescription(); - setupMetadata(inflater, binding.detailMetadataLayout); - } - return binding.getRoot(); + protected StreamingService getService() { + return streamInfo.getService(); } @Override - public void onDestroy() { - descriptionDisposables.clear(); - super.onDestroy(); + protected int getServiceId() { + return streamInfo.getServiceId(); } + @NonNull + @Override + protected String getStreamUrl() { + return streamInfo.getUrl(); + } + + @NonNull + @Override + public List getTags() { + return streamInfo.getTags(); + } - private void setupUploadDate() { - if (streamInfo.getUploadDate() != null) { + @Override + protected void setupMetadata(final LayoutInflater inflater, + final LinearLayout layout) { + if (streamInfo != null && streamInfo.getUploadDate() != null) { binding.detailUploadDateView.setText(Localization .localizeUploadDate(activity, streamInfo.getUploadDate().offsetDateTime())); } else { binding.detailUploadDateView.setVisibility(View.GONE); } - } - - private void setupDescription() { - final Description description = streamInfo.getDescription(); - if (description == null || isEmpty(description.getContent()) - || description == Description.EMPTY_DESCRIPTION) { - binding.detailDescriptionView.setVisibility(View.GONE); - binding.detailSelectDescriptionButton.setVisibility(View.GONE); + if (streamInfo == null) { return; } - // start with disabled state. This also loads description content (!) - disableDescriptionSelection(); + addMetadataItem(inflater, layout, false, R.string.metadata_category, + streamInfo.getCategory()); - binding.detailSelectDescriptionButton.setOnClickListener(v -> { - if (binding.detailDescriptionNoteView.getVisibility() == View.VISIBLE) { - disableDescriptionSelection(); - } else { - // enable selection only when button is clicked to prevent flickering - enableDescriptionSelection(); - } - }); - } - - private void enableDescriptionSelection() { - binding.detailDescriptionNoteView.setVisibility(View.VISIBLE); - binding.detailDescriptionView.setTextIsSelectable(true); - - final String buttonLabel = getString(R.string.description_select_disable); - binding.detailSelectDescriptionButton.setContentDescription(buttonLabel); - TooltipCompat.setTooltipText(binding.detailSelectDescriptionButton, buttonLabel); - binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_close); - } - - private void disableDescriptionSelection() { - // show description content again, otherwise some links are not clickable - loadDescriptionContent(); - - binding.detailDescriptionNoteView.setVisibility(View.GONE); - binding.detailDescriptionView.setTextIsSelectable(false); - - final String buttonLabel = getString(R.string.description_select_enable); - binding.detailSelectDescriptionButton.setContentDescription(buttonLabel); - TooltipCompat.setTooltipText(binding.detailSelectDescriptionButton, buttonLabel); - binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_select_all); - } - - private void loadDescriptionContent() { - final Description description = streamInfo.getDescription(); - switch (description.getType()) { - case Description.HTML: - TextLinkifier.createLinksFromHtmlBlock(binding.detailDescriptionView, - description.getContent(), HtmlCompat.FROM_HTML_MODE_LEGACY, streamInfo, - descriptionDisposables); - break; - case Description.MARKDOWN: - TextLinkifier.createLinksFromMarkdownText(binding.detailDescriptionView, - description.getContent(), streamInfo, descriptionDisposables); - break; - case Description.PLAIN_TEXT: default: - TextLinkifier.createLinksFromPlainText(binding.detailDescriptionView, - description.getContent(), streamInfo, descriptionDisposables); - break; - } - } - - - private void setupMetadata(final LayoutInflater inflater, - final LinearLayout layout) { - addMetadataItem(inflater, layout, false, - R.string.metadata_category, streamInfo.getCategory()); - - addMetadataItem(inflater, layout, false, - R.string.metadata_licence, streamInfo.getLicence()); + addMetadataItem(inflater, layout, false, R.string.metadata_licence, + streamInfo.getLicence()); addPrivacyMetadataItem(inflater, layout); if (streamInfo.getAgeLimit() != NO_AGE_LIMIT) { - addMetadataItem(inflater, layout, false, - R.string.metadata_age_limit, String.valueOf(streamInfo.getAgeLimit())); + addMetadataItem(inflater, layout, false, R.string.metadata_age_limit, + String.valueOf(streamInfo.getAgeLimit())); } if (streamInfo.getLanguageInfo() != null) { - addMetadataItem(inflater, layout, false, - R.string.metadata_language, streamInfo.getLanguageInfo().getDisplayLanguage()); - } - - addMetadataItem(inflater, layout, true, - R.string.metadata_support, streamInfo.getSupportInfo()); - addMetadataItem(inflater, layout, true, - R.string.metadata_host, streamInfo.getHost()); - addMetadataItem(inflater, layout, true, - R.string.metadata_thumbnail_url, streamInfo.getThumbnailUrl()); - - addTagsMetadataItem(inflater, layout); - } - - private void addMetadataItem(final LayoutInflater inflater, - final LinearLayout layout, - final boolean linkifyContent, - @StringRes final int type, - @Nullable final String content) { - if (isBlank(content)) { - return; - } - - final ItemMetadataBinding itemBinding = - ItemMetadataBinding.inflate(inflater, layout, false); - - itemBinding.metadataTypeView.setText(type); - itemBinding.metadataTypeView.setOnLongClickListener(v -> { - ShareUtils.copyToClipboard(requireContext(), content); - return true; - }); - - if (linkifyContent) { - TextLinkifier.createLinksFromPlainText(itemBinding.metadataContentView, content, null, - descriptionDisposables); - } else { - itemBinding.metadataContentView.setText(content); + addMetadataItem(inflater, layout, false, R.string.metadata_language, + streamInfo.getLanguageInfo().getDisplayLanguage(getAppLocale(getContext()))); } - layout.addView(itemBinding.getRoot()); - } - - private void addTagsMetadataItem(final LayoutInflater inflater, final LinearLayout layout) { - if (streamInfo.getTags() != null && !streamInfo.getTags().isEmpty()) { - final var itemBinding = ItemMetadataTagsBinding.inflate(inflater, layout, false); - - streamInfo.getTags().stream().sorted(String.CASE_INSENSITIVE_ORDER).forEach(tag -> { - final Chip chip = (Chip) inflater.inflate(R.layout.chip, - itemBinding.metadataTagsChips, false); - chip.setText(tag); - chip.setOnClickListener(this::onTagClick); - chip.setOnLongClickListener(this::onTagLongClick); - itemBinding.metadataTagsChips.addView(chip); - }); - - layout.addView(itemBinding.getRoot()); - } - } - - private void onTagClick(final View chip) { - if (getParentFragment() != null) { - NavigationHelper.openSearchFragment(getParentFragment().getParentFragmentManager(), - streamInfo.getServiceId(), ((Chip) chip).getText().toString()); - } - } - - private boolean onTagLongClick(final View chip) { - ShareUtils.copyToClipboard(requireContext(), ((Chip) chip).getText().toString()); - return true; + addMetadataItem(inflater, layout, true, R.string.metadata_support, + streamInfo.getSupportInfo()); + addMetadataItem(inflater, layout, true, R.string.metadata_host, + streamInfo.getHost()); + + addImagesMetadataItem(inflater, layout, R.string.metadata_thumbnails, + streamInfo.getThumbnails()); + addImagesMetadataItem(inflater, layout, R.string.metadata_uploader_avatars, + streamInfo.getUploaderAvatars()); + addImagesMetadataItem(inflater, layout, R.string.metadata_subchannel_avatars, + streamInfo.getSubChannelAvatars()); } private void addPrivacyMetadataItem(final LayoutInflater inflater, final LinearLayout layout) { @@ -245,14 +125,15 @@ private void addPrivacyMetadataItem(final LayoutInflater inflater, final LinearL case INTERNAL: contentRes = R.string.metadata_privacy_internal; break; - case OTHER: default: + case OTHER: + default: contentRes = 0; break; } if (contentRes != 0) { - addMetadataItem(inflater, layout, false, - R.string.metadata_privacy, getString(contentRes)); + addMetadataItem(inflater, layout, false, R.string.metadata_privacy, + getString(contentRes)); } } } 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 601135cbb59..1d1e166e7d7 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 @@ -7,11 +7,10 @@ import static org.schabi.newpipe.ktx.ViewUtils.animateRotation; import static org.schabi.newpipe.player.helper.PlayerHelper.globalScreenOrientationLocked; import static org.schabi.newpipe.player.helper.PlayerHelper.isClearingQueueConfirmationRequired; -import static org.schabi.newpipe.player.playqueue.PlayQueueItem.RECOVERY_UNSET; +import static org.schabi.newpipe.util.DependentPreferenceHelper.getResumePlaybackEnabled; import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import static org.schabi.newpipe.util.NavigationHelper.openPlayQueue; -import static org.schabi.newpipe.util.NavigationHelper.playWithKore; import android.animation.ValueAnimator; import android.annotation.SuppressLint; @@ -25,7 +24,6 @@ import android.database.ContentObserver; import android.graphics.Color; import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -55,14 +53,15 @@ import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; +import com.evernote.android.state.State; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.tabs.TabLayout; -import com.squareup.picasso.Callback; import org.schabi.newpipe.App; import org.schabi.newpipe.R; @@ -73,8 +72,9 @@ import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.ReCaptchaActivity; import org.schabi.newpipe.error.UserAction; -import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.AudioStream; @@ -85,11 +85,13 @@ import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.EmptyFragment; +import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.list.comments.CommentsFragment; import org.schabi.newpipe.fragments.list.videos.RelatedItemsFragment; import org.schabi.newpipe.ktx.AnimationType; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.PlayerService; import org.schabi.newpipe.player.PlayerType; @@ -105,15 +107,17 @@ import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.InfoCache; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.PlayButtonHelper; import org.schabi.newpipe.util.StreamTypeUtil; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.ArrayList; import java.util.Iterator; @@ -124,7 +128,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; -import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; @@ -163,20 +166,24 @@ 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 private final SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener = (sharedPreferences, key) -> { - if (key.equals(getString(R.string.show_comments_key))) { + if (getString(R.string.show_comments_key).equals(key)) { showComments = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; - } else if (key.equals(getString(R.string.show_next_video_key))) { + } else if (getString(R.string.show_next_video_key).equals(key)) { showRelatedItems = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; - } else if (key.equals(getString(R.string.show_description_key))) { + } else if (getString(R.string.show_description_key).equals(key)) { showDescription = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; } @@ -468,10 +475,23 @@ private void setOnClickListeners() { binding.detailControlsBackground.setOnClickListener(v -> openBackgroundPlayer(false)); binding.detailControlsPopup.setOnClickListener(v -> openPopupPlayer(false)); - binding.detailControlsPlaylistAppend.setOnClickListener(makeOnClickListener(info -> + binding.detailControlsPlaylistAppend.setOnClickListener(makeOnClickListener(info -> { + if (getFM() != null && currentInfo != null) { + final Fragment fragment = getParentFragmentManager(). + findFragmentById(R.id.fragment_holder); + + // commit previous pending changes to database + if (fragment instanceof LocalPlaylistFragment) { + ((LocalPlaylistFragment) fragment).saveImmediate(); + } else if (fragment instanceof MainFragment) { + ((MainFragment) fragment).commitPlaylistTabs(); + } + disposables.add(PlaylistDialog.createCorrespondingDialog(requireContext(), List.of(new StreamEntity(info)), - dialog -> dialog.show(getParentFragmentManager(), TAG))))); + dialog -> dialog.show(getParentFragmentManager(), TAG))); + } + })); binding.detailControlsDownload.setOnClickListener(v -> { if (PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { @@ -480,19 +500,11 @@ private void setOnClickListeners() { }); binding.detailControlsShare.setOnClickListener(makeOnClickListener(info -> ShareUtils.shareText(requireContext(), info.getName(), info.getUrl(), - info.getThumbnailUrl()))); + info.getThumbnails()))); binding.detailControlsOpenInBrowser.setOnClickListener(makeOnClickListener(info -> ShareUtils.openUrlInBrowser(requireContext(), info.getUrl()))); - binding.detailControlsPlayWithKodi.setOnClickListener(makeOnClickListener(info -> { - try { - playWithKore(requireContext(), Uri.parse(info.getUrl())); - } catch (final Exception e) { - if (DEBUG) { - Log.i(TAG, "Failed to start kore", e); - } - KoreUtils.showInstallKoreDialog(requireContext()); - } - })); + binding.detailControlsPlayWithKodi.setOnClickListener(makeOnClickListener(info -> + KoreUtils.playWithKore(requireContext(), Uri.parse(info.getUrl())))); if (DEBUG) { binding.detailControlsCrashThePlayer.setOnClickListener(v -> VideoDetailPlayerCrasher.onCrashThePlayer(requireContext(), player)); @@ -541,9 +553,11 @@ private void setOnLongClickListeners() { })); binding.detailControlsBackground.setOnLongClickListener(makeOnLongClickListener(info -> - openBackgroundPlayer(true))); + openBackgroundPlayer(true) + )); binding.detailControlsPopup.setOnLongClickListener(makeOnLongClickListener(info -> - openPopupPlayer(true))); + openPopupPlayer(true) + )); binding.detailControlsDownload.setOnLongClickListener(makeOnLongClickListener(info -> NavigationHelper.openDownloads(activity))); @@ -626,8 +640,7 @@ protected void initListeners() { final View.OnTouchListener controlsTouchListener = (view, motionEvent) -> { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN - && PreferenceManager.getDefaultSharedPreferences(activity) - .getBoolean(getString(R.string.show_hold_to_append_key), true)) { + && PlayButtonHelper.shouldShowHoldToAppendTip(activity)) { animate(binding.touchAppendDetail, true, 250, AnimationType.ALPHA, 0, () -> animate(binding.touchAppendDetail, false, 1500, AnimationType.ALPHA, 1000)); @@ -654,27 +667,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 //////////////////////////////////////////////////////////////////////////*/ @@ -748,7 +740,7 @@ private void setupFromHistoryItem(final StackItem item) { final boolean isPlayerStopped = !isPlayerAvailable() || player.isStopped(); if (playQueueItem != null && isPlayerStopped) { updateOverlayData(playQueueItem.getTitle(), - playQueueItem.getUploader(), playQueueItem.getThumbnailUrl()); + playQueueItem.getUploader(), playQueueItem.getThumbnails()); } } @@ -863,7 +855,8 @@ private void runWorker(final boolean forceLoad, final boolean addToBackStack) { if (playQueue == null) { playQueue = new SinglePlayQueue(result); } - if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(playQueue)) { + if (stack.isEmpty() || !stack.peek().getPlayQueue() + .equalStreams(playQueue)) { stack.push(new StackItem(serviceId, url, title, playQueue)); } } @@ -1020,6 +1013,20 @@ public void scrollToTop() { updateTabLayoutVisibility(); } + public void scrollToComment(final CommentsInfoItem comment) { + final int commentsTabPos = pageAdapter.getItemPositionByTitle(COMMENTS_TAB_TAG); + final Fragment fragment = pageAdapter.getItem(commentsTabPos); + if (!(fragment instanceof CommentsFragment)) { + return; + } + + // unexpand the app bar only if scrolling to the comment succeeded + if (((CommentsFragment) fragment).scrollToComment(comment)) { + binding.appBarLayout.setExpanded(false, false); + binding.viewPager.setCurrentItem(commentsTabPos, false); + } + } + /*////////////////////////////////////////////////////////////////////////// // Play Utils //////////////////////////////////////////////////////////////////////////*/ @@ -1048,26 +1055,15 @@ 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); } } private void openPopupPlayer(final boolean append) { - if (!PermissionHelper.isPopupEnabled(activity)) { - PermissionHelper.showPopupEnablementToast(activity); + if (!PermissionHelper.isPopupEnabledElseAsk(activity)) { return; } @@ -1115,7 +1111,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); } @@ -1449,14 +1445,14 @@ public void showLoading() { super.showLoading(); //if data is already cached, transition from VISIBLE -> INVISIBLE -> VISIBLE is not required - if (!ExtractorHelper.isCached(serviceId, url, InfoItem.InfoType.STREAM)) { + if (!ExtractorHelper.isCached(serviceId, url, InfoCache.Type.STREAM)) { binding.detailContentRootHiding.setVisibility(View.INVISIBLE); } animate(binding.detailThumbnailPlayButton, false, 50); animate(binding.detailDurationView, false, 100); - animate(binding.detailPositionView, false, 100); - animate(binding.positionView, false, 50); + binding.detailPositionView.setVisibility(View.GONE); + binding.positionView.setVisibility(View.GONE); binding.detailVideoTitleView.setText(title); binding.detailVideoTitleView.setMaxLines(1); @@ -1495,19 +1491,11 @@ 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 = - AppCompatResources.getDrawable(activity, R.drawable.placeholder_person); - binding.detailSubChannelThumbnailView.setImageDrawable(buddyDrawable); - binding.detailUploaderThumbnailView.setImageDrawable(buddyDrawable); - if (info.getViewCount() >= 0) { if (info.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) { binding.detailViewCountView.setText(Localization.listeningCount(activity, @@ -1573,13 +1561,14 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailToggleSecondaryControlsView.setVisibility(View.VISIBLE); binding.detailSecondaryControlPanel.setVisibility(View.GONE); - updateProgressInfo(info); - initThumbnailViews(info); + checkUpdateProgressInfo(info); + PicassoHelper.loadDetailsThumbnail(info.getThumbnails()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailThumbnailImageView); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); if (!isPlayerAvailable() || player.isStopped()) { - updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnailUrl()); + updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnails()); } if (!info.getErrors().isEmpty()) { @@ -1611,27 +1600,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.getUploaderAvatars()).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( @@ -1642,7 +1634,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) { @@ -1652,6 +1644,13 @@ private void displayBothUploaderAndSubChannel(final StreamInfo info, final Conte } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getSubChannelAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailUploaderThumbnailView); + binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE); } public void openDownloadDialog() { @@ -1672,67 +1671,43 @@ public void openDownloadDialog() { // Stream Results //////////////////////////////////////////////////////////////////////////*/ - private void updateProgressInfo(@NonNull final StreamInfo info) { + private void checkUpdateProgressInfo(@NonNull final StreamInfo info) { if (positionSubscriber != null) { positionSubscriber.dispose(); } - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); - final boolean playbackResumeEnabled = prefs - .getBoolean(activity.getString(R.string.enable_watch_history_key), true) - && prefs.getBoolean(activity.getString(R.string.enable_playback_resume_key), true); - final boolean showPlaybackPosition = prefs.getBoolean( - activity.getString(R.string.enable_playback_state_lists_key), true); - if (!playbackResumeEnabled) { - if (playQueue == null || playQueue.getStreams().isEmpty() - || playQueue.getItem().getRecoveryPosition() == RECOVERY_UNSET - || !showPlaybackPosition) { - binding.positionView.setVisibility(View.INVISIBLE); - binding.detailPositionView.setVisibility(View.GONE); - // TODO: Remove this check when separation of concerns is done. - // (live streams weren't getting updated because they are mixed) - if (!StreamTypeUtil.isLiveStream(info.getStreamType())) { - return; - } - } else { - // Show saved position from backStack if user allows it - showPlaybackProgress(playQueue.getItem().getRecoveryPosition(), - playQueue.getItem().getDuration() * 1000); - animate(binding.positionView, true, 500); - animate(binding.detailPositionView, true, 500); - } + if (!getResumePlaybackEnabled(activity)) { + binding.positionView.setVisibility(View.GONE); + binding.detailPositionView.setVisibility(View.GONE); return; } final HistoryRecordManager recordManager = new HistoryRecordManager(requireContext()); - - // TODO: Separate concerns when updating database data. - // (move the updating part to when the loading happens) positionSubscriber = recordManager.loadStreamState(info) .subscribeOn(Schedulers.io()) .onErrorComplete() .observeOn(AndroidSchedulers.mainThread()) .subscribe(state -> { - showPlaybackProgress(state.getProgressMillis(), info.getDuration() * 1000); - animate(binding.positionView, true, 500); - animate(binding.detailPositionView, true, 500); + updatePlaybackProgress( + state.getProgressMillis(), info.getDuration() * 1000); }, e -> { - if (DEBUG) { - e.printStackTrace(); - } + // impossible since the onErrorComplete() }, () -> { binding.positionView.setVisibility(View.GONE); binding.detailPositionView.setVisibility(View.GONE); }); } - private void showPlaybackProgress(final long progress, final long duration) { + private void updatePlaybackProgress(final long progress, final long duration) { + if (!getResumePlaybackEnabled(activity)) { + return; + } final int progressSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(progress); final int durationSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(duration); - // If the old and the new progress values have a big difference then use - // animation. Otherwise don't because it affects CPU - final boolean shouldAnimate = Math.abs(binding.positionView.getProgress() - - progressSeconds) > 2; + // If the old and the new progress values have a big difference then use animation. + // Otherwise don't because it affects CPU + final int progressDifference = Math.abs(binding.positionView.getProgress() + - progressSeconds); binding.positionView.setMax(durationSeconds); - if (shouldAnimate) { + if (progressDifference > 2) { binding.positionView.setProgressAnimated(progressSeconds); } else { binding.positionView.setProgress(progressSeconds); @@ -1778,7 +1753,7 @@ public void onQueueUpdate(final PlayQueue queue) { // deleted/added items inside Channel/Playlist queue and makes possible to have // a history of played items @Nullable final StackItem stackPeek = stack.peek(); - if (stackPeek != null && !stackPeek.getPlayQueue().equals(queue)) { + if (stackPeek != null && !stackPeek.getPlayQueue().equalStreams(queue)) { @Nullable final PlayQueueItem playQueueItem = queue.getItem(); if (playQueueItem != null) { stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(), @@ -1827,7 +1802,7 @@ public void onProgressUpdate(final int currentProgress, } if (player.getPlayQueue().getItem().getUrl().equals(url)) { - showPlaybackProgress(currentProgress, duration); + updatePlaybackProgress(currentProgress, duration); } } @@ -1844,11 +1819,11 @@ public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) { // They are not equal when user watches something in popup while browsing in fragment and // then changes screen orientation. In that case the fragment will set itself as // a service listener and will receive initial call to onMetadataUpdate() - if (!queue.equals(playQueue)) { + if (!queue.equalStreams(playQueue)) { return; } - updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnailUrl()); + updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnails()); if (currentInfo != null && info.getUrl().equals(currentInfo.getUrl())) { return; } @@ -1877,7 +1852,7 @@ public void onServiceStopped() { if (currentInfo != null) { updateOverlayData(currentInfo.getName(), currentInfo.getUploaderName(), - currentInfo.getThumbnailUrl()); + currentInfo.getThumbnails()); } updateOverlayPlayQueueButtonVisibility(); } @@ -2046,7 +2021,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 @@ -2110,7 +2088,7 @@ private StackItem findQueueInStack(final PlayQueue queue) { final Iterator iterator = stack.descendingIterator(); while (iterator.hasNext()) { final StackItem next = iterator.next(); - if (next.getPlayQueue().equals(queue)) { + if (next.getPlayQueue().equalStreams(queue)) { item = next; break; } @@ -2125,7 +2103,7 @@ private void replaceQueueIfUserConfirms(final Runnable onAllow) { if (isClearingQueueConfirmationRequired(activity) && playerIsNotStopped() && activeQueue != null - && !activeQueue.equals(playQueue)) { + && !activeQueue.equalStreams(playQueue)) { showClearingQueueConfirmation(onAllow); } else { onAllow.run(); @@ -2139,10 +2117,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; } @@ -2189,6 +2168,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 * */ @@ -2201,7 +2217,7 @@ private void cleanUp() { playerHolder.stopService(); setInitialData(0, null, "", null); currentInfo = null; - updateOverlayData(null, null, null); + updateOverlayData(null, null, List.of()); } /*////////////////////////////////////////////////////////////////////////// @@ -2383,11 +2399,11 @@ private void updateOverlayPlayQueueButtonVisibility() { private void updateOverlayData(@Nullable final String overlayTitle, @Nullable final String uploader, - @Nullable final String thumbnailUrl) { + @NonNull final List thumbnails) { binding.overlayTitleTextView.setText(isEmpty(overlayTitle) ? "" : overlayTitle); binding.overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader); binding.overlayThumbnail.setImageDrawable(null); - PicassoHelper.loadDetailsThumbnail(thumbnailUrl).tag(PICASSO_VIDEO_DETAILS_TAG) + PicassoHelper.loadDetailsThumbnail(thumbnails).tag(PICASSO_VIDEO_DETAILS_TAG) .into(binding.overlayThumbnail); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 1212cf4ad5c..8a117a47a9a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -26,6 +26,7 @@ import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.info_list.InfoListAdapter; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -91,11 +92,7 @@ public void onResume() { if (updateFlags != 0) { if ((updateFlags & LIST_MODE_UPDATE_FLAG) != 0) { - final boolean useGrid = isGridLayout(); - itemsList.setLayoutManager(useGrid - ? getGridLayoutManager() : getListLayoutManager()); - infoListAdapter.setUseGridVariant(useGrid); - infoListAdapter.notifyDataSetChanged(); + refreshItemViewMode(); } updateFlags = 0; } @@ -221,15 +218,23 @@ protected RecyclerView.LayoutManager getGridLayoutManager() { return lm; } + /** + * Updates the item view mode based on user preference. + */ + private void refreshItemViewMode() { + final ItemViewMode itemViewMode = getItemViewMode(); + itemsList.setLayoutManager((itemViewMode == ItemViewMode.GRID) + ? getGridLayoutManager() : getListLayoutManager()); + infoListAdapter.setItemViewMode(itemViewMode); + infoListAdapter.notifyDataSetChanged(); + } + @Override protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); - final boolean useGrid = isGridLayout(); itemsList = rootView.findViewById(R.id.items_list); - itemsList.setLayoutManager(useGrid ? getGridLayoutManager() : getListLayoutManager()); - - infoListAdapter.setUseGridVariant(useGrid); + refreshItemViewMode(); final Supplier listHeaderSupplier = getListHeaderSupplier(); if (listHeaderSupplier != null) { @@ -469,12 +474,16 @@ public void handleError() { @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { - if (key.equals(getString(R.string.list_view_mode_key))) { + if (getString(R.string.list_view_mode_key).equals(key)) { updateFlags |= LIST_MODE_UPDATE_FLAG; } } - protected boolean isGridLayout() { - return ThemeHelper.shouldUseGridLayout(activity); + /** + * Returns preferred item view mode. + * @return ItemViewMode + */ + protected ItemViewMode getItemViewMode() { + return ThemeHelper.getItemViewMode(requireContext()); } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index 35424437da7..61a361f23ee 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.fragments.list; +import static org.schabi.newpipe.extractor.ServiceList.SoundCloud; + import android.os.Bundle; import android.text.TextUtils; import android.util.Log; @@ -7,13 +9,15 @@ import androidx.annotation.NonNull; +import com.evernote.android.state.State; + +import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.ListInfo; import org.schabi.newpipe.extractor.Page; -import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.views.NewPipeRecyclerView; @@ -22,7 +26,6 @@ import java.util.List; import java.util.Queue; -import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.Disposable; @@ -141,7 +144,7 @@ public void startLoading(final boolean forceLoad) { currentWorker = loadResult(forceLoad) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe((@NonNull L result) -> { + .subscribe((@NonNull final L result) -> { isLoading.set(false); currentInfo = result; currentNextPage = result.getNextPage(); @@ -229,13 +232,11 @@ public void handleResult(@NonNull final L result) { if (!result.getRelatedItems().isEmpty()) { infoListAdapter.addInfoItemList(result.getRelatedItems()); showListFooter(hasMoreItems()); + } else if (hasMoreItems()) { + loadMoreItems(); } else { infoListAdapter.clearStreamItemList(); - // showEmptyState should be called only if there is no item as - // well as no header in infoListAdapter - if (!(result instanceof ChannelInfo && infoListAdapter.getItemCount() == 1)) { - showEmptyState(); - } + showEmptyState(); } } @@ -252,6 +253,20 @@ public void handleResult(@NonNull final L result) { } } + @Override + public void showEmptyState() { + // show "no streams" for SoundCloud; otherwise "no videos" + // showing "no live streams" is handled in KioskFragment + if (emptyStateView != null) { + if (currentInfo.getService() == SoundCloud) { + setEmptyStateMessage(R.string.no_streams); + } else { + setEmptyStateMessage(R.string.no_videos); + } + } + super.showEmptyState(); + } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java new file mode 100644 index 00000000000..b7f4a9d3dfc --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java @@ -0,0 +1,94 @@ +package org.schabi.newpipe.fragments.list.channel; + +import static org.schabi.newpipe.extractor.stream.StreamExtractor.UNKNOWN_SUBSCRIBER_COUNT; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.evernote.android.state.State; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.stream.Description; +import org.schabi.newpipe.fragments.detail.BaseDescriptionFragment; +import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.Localization; + +import java.util.List; + +public class ChannelAboutFragment extends BaseDescriptionFragment { + @State + protected ChannelInfo channelInfo; + + ChannelAboutFragment(@NonNull final ChannelInfo channelInfo) { + this.channelInfo = channelInfo; + } + + public ChannelAboutFragment() { + // keep empty constructor for State when resuming fragment from memory + } + + @Override + protected void initViews(final View rootView, final Bundle savedInstanceState) { + super.initViews(rootView, savedInstanceState); + binding.constraintLayout.setPadding(0, DeviceUtils.dpToPx(8, requireContext()), 0, 0); + } + + @Nullable + @Override + protected Description getDescription() { + return new Description(channelInfo.getDescription(), Description.PLAIN_TEXT); + } + + @NonNull + @Override + protected StreamingService getService() { + return channelInfo.getService(); + } + + @Override + protected int getServiceId() { + return channelInfo.getServiceId(); + } + + @Nullable + @Override + protected String getStreamUrl() { + return null; + } + + @NonNull + @Override + public List getTags() { + return channelInfo.getTags(); + } + + @Override + protected void setupMetadata(final LayoutInflater inflater, + final LinearLayout layout) { + // There is no upload date available for channels, so hide the relevant UI element + binding.detailUploadDateView.setVisibility(View.GONE); + + if (channelInfo == null) { + return; + } + + if (channelInfo.getSubscriberCount() != UNKNOWN_SUBSCRIBER_COUNT) { + addMetadataItem(inflater, layout, false, R.string.metadata_subscribers, + Localization.localizeNumber( + requireContext(), + channelInfo.getSubscriberCount())); + } + + addImagesMetadataItem(inflater, layout, R.string.metadata_avatars, + channelInfo.getAvatars()); + addImagesMetadataItem(inflater, layout, R.string.metadata_banners, + channelInfo.getBanners()); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 8ed9389c39d..d67cd11f16d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -5,6 +5,7 @@ import static org.schabi.newpipe.ktx.ViewUtils.animateBackgroundColor; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.text.TextUtils; @@ -16,51 +17,51 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; +import androidx.core.view.MenuProvider; +import androidx.preference.PreferenceManager; +import com.evernote.android.state.State; import com.google.android.material.snackbar.Snackbar; +import com.google.android.material.tabs.TabLayout; import com.jakewharton.rxbinding4.view.RxView; import org.schabi.newpipe.R; import org.schabi.newpipe.database.subscription.NotificationMode; import org.schabi.newpipe.database.subscription.SubscriptionEntity; -import org.schabi.newpipe.databinding.ChannelHeaderBinding; import org.schabi.newpipe.databinding.FragmentChannelBinding; -import org.schabi.newpipe.databinding.PlaylistControlBinding; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; -import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.fragments.BaseStateFragment; +import org.schabi.newpipe.fragments.detail.TabAdapter; import org.schabi.newpipe.ktx.AnimationType; -import org.schabi.newpipe.local.subscription.SubscriptionManager; import org.schabi.newpipe.local.feed.notifications.NotificationHelper; -import org.schabi.newpipe.player.PlayerType; -import org.schabi.newpipe.player.playqueue.ChannelPlayQueue; -import org.schabi.newpipe.player.playqueue.PlayQueue; +import org.schabi.newpipe.local.subscription.SubscriptionManager; +import org.schabi.newpipe.util.ChannelTabHelper; +import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.StateSaver; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.List; +import java.util.Queue; import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; -import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.functions.Action; @@ -68,29 +69,38 @@ import io.reactivex.rxjava3.functions.Function; import io.reactivex.rxjava3.schedulers.Schedulers; -public class ChannelFragment extends BaseListInfoFragment - implements View.OnClickListener { +public class ChannelFragment extends BaseStateFragment + implements StateSaver.WriteRead { private static final int BUTTON_DEBOUNCE_INTERVAL = 100; private static final String PICASSO_CHANNEL_TAG = "PICASSO_CHANNEL_TAG"; + @State + protected int serviceId = Constants.NO_SERVICE_ID; + @State + protected String name; + @State + protected String url; + + private ChannelInfo currentInfo; + private Disposable currentWorker; private final CompositeDisposable disposables = new CompositeDisposable(); private Disposable subscribeButtonMonitor; - + private SubscriptionManager subscriptionManager; + private int lastTab; private boolean channelContentNotSupported = false; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ - private SubscriptionManager subscriptionManager; - - private FragmentChannelBinding channelBinding; - private ChannelHeaderBinding headerBinding; - private PlaylistControlBinding playlistControlBinding; + private FragmentChannelBinding binding; + private TabAdapter tabAdapter; private MenuItem menuRssButton; private MenuItem menuNotifyButton; + private SubscriptionEntity channelSubscription; + private MenuProvider menuProvider; public static ChannelFragment getInstance(final int serviceId, final String url, final String name) { @@ -99,22 +109,78 @@ public static ChannelFragment getInstance(final int serviceId, final String url, return instance; } - public ChannelFragment() { - super(UserAction.REQUESTED_CHANNEL); + private void setInitialData(final int sid, final String u, final String title) { + this.serviceId = sid; + this.url = u; + this.name = !TextUtils.isEmpty(title) ? title : ""; } - @Override - public void onResume() { - super.onResume(); - if (activity != null && useAsFrontPage) { - setTitle(currentInfo != null ? currentInfo.getName() : name); - } - } /*////////////////////////////////////////////////////////////////////////// // LifeCycle //////////////////////////////////////////////////////////////////////////*/ + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + menuProvider = new MenuProvider() { + @Override + public void onCreateMenu(@NonNull final Menu menu, + @NonNull final MenuInflater inflater) { + inflater.inflate(R.menu.menu_channel, menu); + + if (DEBUG) { + Log.d(TAG, "onCreateOptionsMenu() called with: " + + "menu = [" + menu + "], inflater = [" + inflater + "]"); + } + + } + + @Override + public void onPrepareMenu(@NonNull final Menu menu) { + menuRssButton = menu.findItem(R.id.menu_item_rss); + menuNotifyButton = menu.findItem(R.id.menu_item_notify); + updateRssButton(); + updateNotifyButton(channelSubscription); + } + + @Override + public boolean onMenuItemSelected(@NonNull final MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_item_notify: + final boolean value = !item.isChecked(); + item.setEnabled(false); + setNotify(value); + break; + case R.id.action_settings: + NavigationHelper.openSettings(requireContext()); + break; + case R.id.menu_item_rss: + if (currentInfo != null) { + ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl()); + } + break; + case R.id.menu_item_openInBrowser: + if (currentInfo != null) { + ShareUtils.openUrlInBrowser(requireContext(), + currentInfo.getOriginalUrl()); + } + break; + case R.id.menu_item_share: + if (currentInfo != null) { + ShareUtils.shareText(requireContext(), name, + currentInfo.getOriginalUrl(), currentInfo.getAvatars()); + } + break; + default: + return false; + } + return true; + } + }; + activity.addMenuProvider(menuProvider); + } + @Override public void onAttach(@NonNull final Context context) { super.onAttach(context); @@ -125,104 +191,57 @@ public void onAttach(@NonNull final Context context) { public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_channel, container, false); + binding = FragmentChannelBinding.inflate(inflater, container, false); + return binding.getRoot(); } - @Override - public void onViewCreated(@NonNull final View rootView, final Bundle savedInstanceState) { - super.onViewCreated(rootView, savedInstanceState); - channelBinding = FragmentChannelBinding.bind(rootView); - showContentNotSupportedIfNeeded(); - } + @Override // called from onViewCreated in BaseFragment.onViewCreated + protected void initViews(final View rootView, final Bundle savedInstanceState) { + super.initViews(rootView, savedInstanceState); - @Override - public void onDestroy() { - super.onDestroy(); - disposables.clear(); - if (subscribeButtonMonitor != null) { - subscribeButtonMonitor.dispose(); - } - channelBinding = null; - headerBinding = null; - playlistControlBinding = null; - } + tabAdapter = new TabAdapter(getChildFragmentManager()); + binding.viewPager.setAdapter(tabAdapter); + binding.tabLayout.setupWithViewPager(binding.viewPager); - /*////////////////////////////////////////////////////////////////////////// - // Init - //////////////////////////////////////////////////////////////////////////*/ - - @Override - protected Supplier getListHeaderSupplier() { - headerBinding = ChannelHeaderBinding - .inflate(activity.getLayoutInflater(), itemsList, false); - playlistControlBinding = headerBinding.playlistControl; - - return headerBinding::getRoot; + setTitle(name); + binding.channelTitleView.setText(name); + if (!ImageStrategy.shouldLoadImages()) { + // do not waste space for the banner if it is not going to be loaded + binding.channelBannerImage.setImageDrawable(null); + } } @Override protected void initListeners() { super.initListeners(); - headerBinding.subChannelTitleView.setOnClickListener(this); - headerBinding.subChannelAvatarView.setOnClickListener(this); - } - - /*////////////////////////////////////////////////////////////////////////// - // Menu - //////////////////////////////////////////////////////////////////////////*/ - - @Override - public void onCreateOptionsMenu(@NonNull final Menu menu, - @NonNull final MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - final ActionBar supportActionBar = activity.getSupportActionBar(); - if (useAsFrontPage && supportActionBar != null) { - supportActionBar.setDisplayHomeAsUpEnabled(false); - } else { - inflater.inflate(R.menu.menu_channel, menu); - - if (DEBUG) { - Log.d(TAG, "onCreateOptionsMenu() called with: " - + "menu = [" + menu + "], inflater = [" + inflater + "]"); + final View.OnClickListener openSubChannel = v -> { + if (!TextUtils.isEmpty(currentInfo.getParentChannelUrl())) { + try { + NavigationHelper.openChannelFragment(getFM(), currentInfo.getServiceId(), + currentInfo.getParentChannelUrl(), + currentInfo.getParentChannelName()); + } catch (final Exception e) { + ErrorUtil.showUiErrorSnackbar(this, "Opening channel fragment", e); + } + } else if (DEBUG) { + Log.i(TAG, "Can't open parent channel because we got no channel URL"); } - menuRssButton = menu.findItem(R.id.menu_item_rss); - menuNotifyButton = menu.findItem(R.id.menu_item_notify); - } + }; + binding.subChannelAvatarView.setOnClickListener(openSubChannel); + binding.subChannelTitleView.setOnClickListener(openSubChannel); } @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case R.id.action_settings: - NavigationHelper.openSettings(requireContext()); - break; - case R.id.menu_item_notify: - final boolean value = !item.isChecked(); - item.setEnabled(false); - setNotify(value); - break; - case R.id.menu_item_rss: - if (currentInfo != null) { - ShareUtils.openUrlInBrowser( - requireContext(), currentInfo.getFeedUrl(), false); - } - break; - case R.id.menu_item_openInBrowser: - if (currentInfo != null) { - ShareUtils.openUrlInBrowser(requireContext(), currentInfo.getOriginalUrl()); - } - break; - case R.id.menu_item_share: - if (currentInfo != null) { - ShareUtils.shareText(requireContext(), name, currentInfo.getOriginalUrl(), - currentInfo.getAvatarUrl()); - } - break; - default: - return super.onOptionsItemSelected(item); + public void onDestroy() { + super.onDestroy(); + if (currentWorker != null) { + currentWorker.dispose(); } - return true; + disposables.clear(); + binding = null; + activity.removeMenuProvider(menuProvider); + menuProvider = null; } /*////////////////////////////////////////////////////////////////////////// @@ -230,8 +249,8 @@ public boolean onOptionsItemSelected(final MenuItem item) { //////////////////////////////////////////////////////////////////////////*/ private void monitorSubscription(final ChannelInfo info) { - final Consumer onError = (Throwable throwable) -> { - animate(headerBinding.channelSubscribeButton, false, 100); + final Consumer onError = (final Throwable throwable) -> { + animate(binding.channelSubscribeButton, false, 100); showSnackBarError(new ErrorInfo(throwable, UserAction.SUBSCRIPTION_GET, "Get subscription status", currentInfo)); }; @@ -264,16 +283,15 @@ private void monitorSubscription(final ChannelInfo info) { }, onError)); } - private Function mapOnSubscribe(final SubscriptionEntity subscription, - final ChannelInfo info) { - return (@NonNull Object o) -> { - subscriptionManager.insertSubscription(subscription, info); + private Function mapOnSubscribe(final SubscriptionEntity subscription) { + return (@NonNull final Object o) -> { + subscriptionManager.insertSubscription(subscription); return o; }; } private Function mapOnUnsubscribe(final SubscriptionEntity subscription) { - return (@NonNull Object o) -> { + return (@NonNull final Object o) -> { subscriptionManager.deleteSubscription(subscription); return o; }; @@ -299,9 +317,8 @@ private void updateSubscription(final ChannelInfo info) { .subscribe(onComplete, onError)); } - private Disposable monitorSubscribeButton(final Button subscribeButton, - final Function action) { - final Consumer onNext = (@NonNull Object o) -> { + private Disposable monitorSubscribeButton(final Function action) { + final Consumer onNext = (@NonNull final Object o) -> { if (DEBUG) { Log.d(TAG, "Changed subscription status to this channel!"); } @@ -312,7 +329,7 @@ private Disposable monitorSubscribeButton(final Button subscribeButton, "Changing subscription for " + currentInfo.getUrl(), currentInfo)); /* Emit clicks from main thread unto io thread */ - return RxView.clicks(subscribeButton) + return RxView.clicks(binding.channelSubscribeButton) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .debounce(BUTTON_DEBOUNCE_INTERVAL, TimeUnit.MILLISECONDS) // Ignore rapid clicks @@ -321,7 +338,7 @@ private Disposable monitorSubscribeButton(final Button subscribeButton, } private Consumer> getSubscribeUpdateMonitor(final ChannelInfo info) { - return (List subscriptionEntities) -> { + return (final List subscriptionEntities) -> { if (DEBUG) { Log.d(TAG, "subscriptionManager.subscriptionTable.doOnNext() called with: " + "subscriptionEntities = [" + subscriptionEntities + "]"); @@ -338,20 +355,20 @@ private Consumer> getSubscribeUpdateMonitor(final Chann channel.setServiceId(info.getServiceId()); channel.setUrl(info.getUrl()); channel.setData(info.getName(), - info.getAvatarUrl(), + ImageStrategy.imageListToDbUrl(info.getAvatars()), info.getDescription(), info.getSubscriberCount()); + channelSubscription = null; updateNotifyButton(null); - subscribeButtonMonitor = monitorSubscribeButton( - headerBinding.channelSubscribeButton, mapOnSubscribe(channel, info)); + subscribeButtonMonitor = monitorSubscribeButton(mapOnSubscribe(channel)); } else { if (DEBUG) { Log.d(TAG, "Found subscription to this channel!"); } - final SubscriptionEntity subscription = subscriptionEntities.get(0); - updateNotifyButton(subscription); - subscribeButtonMonitor = monitorSubscribeButton( - headerBinding.channelSubscribeButton, mapOnUnsubscribe(subscription)); + channelSubscription = subscriptionEntities.get(0); + updateNotifyButton(channelSubscription); + subscribeButtonMonitor = + monitorSubscribeButton(mapOnUnsubscribe(channelSubscription)); } }; } @@ -362,34 +379,40 @@ private void updateSubscribeButton(final boolean isSubscribed) { + "isSubscribed = [" + isSubscribed + "]"); } - final boolean isButtonVisible = headerBinding.channelSubscribeButton.getVisibility() + final boolean isButtonVisible = binding.channelSubscribeButton.getVisibility() == View.VISIBLE; final int backgroundDuration = isButtonVisible ? 300 : 0; final int textDuration = isButtonVisible ? 200 : 0; - final int subscribeBackground = ThemeHelper - .resolveColorFromAttr(activity, R.attr.colorPrimary); - final int subscribeText = ContextCompat.getColor(activity, R.color.subscribe_text_color); final int subscribedBackground = ContextCompat .getColor(activity, R.color.subscribed_background_color); final int subscribedText = ContextCompat.getColor(activity, R.color.subscribed_text_color); + final int subscribeBackground = ColorUtils.blendARGB(ThemeHelper + .resolveColorFromAttr(activity, R.attr.colorPrimary), subscribedBackground, 0.35f); + final int subscribeText = ContextCompat.getColor(activity, R.color.subscribe_text_color); - if (!isSubscribed) { - headerBinding.channelSubscribeButton.setText(R.string.subscribe_button_title); - animateBackgroundColor(headerBinding.channelSubscribeButton, backgroundDuration, - subscribedBackground, subscribeBackground); - animateTextColor(headerBinding.channelSubscribeButton, textDuration, subscribedText, - subscribeText); - } else { - headerBinding.channelSubscribeButton.setText(R.string.subscribed_button_title); - animateBackgroundColor(headerBinding.channelSubscribeButton, backgroundDuration, + if (isSubscribed) { + binding.channelSubscribeButton.setText(R.string.subscribed_button_title); + animateBackgroundColor(binding.channelSubscribeButton, backgroundDuration, subscribeBackground, subscribedBackground); - animateTextColor(headerBinding.channelSubscribeButton, textDuration, subscribeText, + animateTextColor(binding.channelSubscribeButton, textDuration, subscribeText, subscribedText); + } else { + binding.channelSubscribeButton.setText(R.string.subscribe_button_title); + animateBackgroundColor(binding.channelSubscribeButton, backgroundDuration, + subscribedBackground, subscribeBackground); + animateTextColor(binding.channelSubscribeButton, textDuration, subscribedText, + subscribeText); } - animate(headerBinding.channelSubscribeButton, true, 100, - AnimationType.LIGHT_SCALE_AND_ALPHA); + animate(binding.channelSubscribeButton, true, 100, AnimationType.LIGHT_SCALE_AND_ALPHA); + } + + private void updateRssButton() { + if (menuRssButton == null || currentInfo == null) { + return; + } + menuRssButton.setVisible(!TextUtils.isEmpty(currentInfo.getFeedUrl())); } private void updateNotifyButton(@Nullable final SubscriptionEntity subscription) { @@ -425,107 +448,176 @@ private void setNotify(final boolean isEnabled) { * Show a snackbar with the option to enable notifications on new streams for this channel. */ private void showNotifySnackbar() { - Snackbar.make(itemsList, R.string.you_successfully_subscribed, Snackbar.LENGTH_LONG) + Snackbar.make(binding.getRoot(), R.string.you_successfully_subscribed, Snackbar.LENGTH_LONG) .setAction(R.string.get_notified, v -> setNotify(true)) .setActionTextColor(Color.YELLOW) .show(); } + /*////////////////////////////////////////////////////////////////////////// - // Load and handle + // Init + //////////////////////////////////////////////////////////////////////////*/ + + private void updateTabs() { + tabAdapter.clearAllItems(); + + if (currentInfo != null && !channelContentNotSupported) { + final Context context = requireContext(); + final SharedPreferences preferences = PreferenceManager + .getDefaultSharedPreferences(context); + + for (final ListLinkHandler linkHandler : currentInfo.getTabs()) { + final String tab = linkHandler.getContentFilters().get(0); + if (ChannelTabHelper.showChannelTab(context, preferences, tab)) { + final ChannelTabFragment channelTabFragment = + ChannelTabFragment.getInstance(serviceId, linkHandler, name); + channelTabFragment.useAsFrontPage(useAsFrontPage); + tabAdapter.addFragment(channelTabFragment, + context.getString(ChannelTabHelper.getTranslationKey(tab))); + } + } + + if (ChannelTabHelper.showChannelTab( + context, preferences, R.string.show_channel_tabs_about)) { + tabAdapter.addFragment( + new ChannelAboutFragment(currentInfo), + context.getString(R.string.channel_tab_about)); + } + } + + tabAdapter.notifyDataSetUpdate(); + + for (int i = 0; i < tabAdapter.getCount(); i++) { + binding.tabLayout.getTabAt(i).setText(tabAdapter.getItemTitle(i)); + } + + // Restore previously selected tab + final TabLayout.Tab ltab = binding.tabLayout.getTabAt(lastTab); + if (ltab != null) { + binding.tabLayout.selectTab(ltab); + } + } + + + /*////////////////////////////////////////////////////////////////////////// + // State Saving //////////////////////////////////////////////////////////////////////////*/ @Override - protected Single> loadMoreItemsLogic() { - return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPage); + public String generateSuffix() { + return null; } @Override - protected Single loadResult(final boolean forceLoad) { - return ExtractorHelper.getChannelInfo(serviceId, url, forceLoad); + public void writeTo(final Queue objectsToSave) { + objectsToSave.add(currentInfo); + objectsToSave.add(binding == null ? 0 : binding.tabLayout.getSelectedTabPosition()); } - /*////////////////////////////////////////////////////////////////////////// - // OnClick - //////////////////////////////////////////////////////////////////////////*/ + @Override + public void readFrom(@NonNull final Queue savedObjects) { + currentInfo = (ChannelInfo) savedObjects.poll(); + lastTab = (Integer) savedObjects.poll(); + } @Override - public void onClick(final View v) { - if (isLoading.get() || currentInfo == null) { - return; + public void onSaveInstanceState(final @NonNull Bundle outState) { + super.onSaveInstanceState(outState); + if (binding != null) { + outState.putInt("LastTab", binding.tabLayout.getSelectedTabPosition()); } + } - switch (v.getId()) { - case R.id.sub_channel_avatar_view: - case R.id.sub_channel_title_view: - if (!TextUtils.isEmpty(currentInfo.getParentChannelUrl())) { - try { - NavigationHelper.openChannelFragment(getFM(), currentInfo.getServiceId(), - currentInfo.getParentChannelUrl(), - currentInfo.getParentChannelName()); - } catch (final Exception e) { - ErrorUtil.showUiErrorSnackbar(this, "Opening channel fragment", e); - } - } else if (DEBUG) { - Log.i(TAG, "Can't open parent channel because we got no channel URL"); - } - break; - } + @Override + protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + lastTab = savedInstanceState.getInt("LastTab", 0); } + /*////////////////////////////////////////////////////////////////////////// // Contract //////////////////////////////////////////////////////////////////////////*/ + @Override + protected void doInitialLoadLogic() { + if (currentInfo == null) { + startLoading(false); + } else { + handleResult(currentInfo); + } + } + + @Override + public void startLoading(final boolean forceLoad) { + super.startLoading(forceLoad); + + currentInfo = null; + updateTabs(); + if (currentWorker != null) { + currentWorker.dispose(); + } + + runWorker(forceLoad); + } + + private void runWorker(final boolean forceLoad) { + currentWorker = ExtractorHelper.getChannelInfo(serviceId, url, forceLoad) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + isLoading.set(false); + handleResult(result); + }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_CHANNEL, + url == null ? "No URL" : url, serviceId))); + } + @Override public void showLoading() { super.showLoading(); PicassoHelper.cancelTag(PICASSO_CHANNEL_TAG); - animate(headerBinding.channelSubscribeButton, false, 100); + animate(binding.channelSubscribeButton, false, 100); } @Override public void handleResult(@NonNull final ChannelInfo result) { super.handleResult(result); + currentInfo = result; + setInitialData(result.getServiceId(), result.getOriginalUrl(), result.getName()); + + if (ImageStrategy.shouldLoadImages() && !result.getBanners().isEmpty()) { + PicassoHelper.loadBanner(result.getBanners()).tag(PICASSO_CHANNEL_TAG) + .into(binding.channelBannerImage); + } else { + // do not waste space for the banner, if the user disabled images or there is not one + binding.channelBannerImage.setImageDrawable(null); + } - headerBinding.getRoot().setVisibility(View.VISIBLE); - PicassoHelper.loadBanner(result.getBannerUrl()).tag(PICASSO_CHANNEL_TAG) - .into(headerBinding.channelBannerImage); - PicassoHelper.loadAvatar(result.getAvatarUrl()).tag(PICASSO_CHANNEL_TAG) - .into(headerBinding.channelAvatarView); - PicassoHelper.loadAvatar(result.getParentChannelAvatarUrl()).tag(PICASSO_CHANNEL_TAG) - .into(headerBinding.subChannelAvatarView); + PicassoHelper.loadAvatar(result.getAvatars()).tag(PICASSO_CHANNEL_TAG) + .into(binding.channelAvatarView); + PicassoHelper.loadAvatar(result.getParentChannelAvatars()).tag(PICASSO_CHANNEL_TAG) + .into(binding.subChannelAvatarView); - headerBinding.channelSubscriberView.setVisibility(View.VISIBLE); + binding.channelTitleView.setText(result.getName()); + binding.channelSubscriberView.setVisibility(View.VISIBLE); if (result.getSubscriberCount() >= 0) { - headerBinding.channelSubscriberView.setText(Localization + binding.channelSubscriberView.setText(Localization .shortSubscriberCount(activity, result.getSubscriberCount())); } else { - headerBinding.channelSubscriberView.setText(R.string.subscribers_count_not_available); + binding.channelSubscriberView.setText(R.string.subscribers_count_not_available); } if (!TextUtils.isEmpty(currentInfo.getParentChannelName())) { - headerBinding.subChannelTitleView.setText(String.format( + binding.subChannelTitleView.setText(String.format( getString(R.string.channel_created_by), currentInfo.getParentChannelName()) ); - headerBinding.subChannelTitleView.setVisibility(View.VISIBLE); - headerBinding.subChannelAvatarView.setVisibility(View.VISIBLE); - } else { - headerBinding.subChannelTitleView.setVisibility(View.GONE); - } - - if (menuRssButton != null) { - menuRssButton.setVisible(!TextUtils.isEmpty(result.getFeedUrl())); + binding.subChannelTitleView.setVisibility(View.VISIBLE); + binding.subChannelAvatarView.setVisibility(View.VISIBLE); } - // PlaylistControls should be visible only if there is some item in - // infoListAdapter other than header - if (infoListAdapter.getItemCount() != 1) { - playlistControlBinding.getRoot().setVisibility(View.VISIBLE); - } else { - playlistControlBinding.getRoot().setVisibility(View.GONE); - } + updateRssButton(); channelContentNotSupported = false; for (final Throwable throwable : result.getErrors()) { @@ -540,62 +632,21 @@ public void handleResult(@NonNull final ChannelInfo result) { if (subscribeButtonMonitor != null) { subscribeButtonMonitor.dispose(); } + + updateTabs(); updateSubscription(result); monitorSubscription(result); - - playlistControlBinding.playlistCtrlPlayAllButton - .setOnClickListener(view -> NavigationHelper - .playOnMainPlayer(activity, getPlayQueue())); - playlistControlBinding.playlistCtrlPlayPopupButton - .setOnClickListener(view -> NavigationHelper - .playOnPopupPlayer(activity, getPlayQueue(), false)); - playlistControlBinding.playlistCtrlPlayBgButton - .setOnClickListener(view -> NavigationHelper - .playOnBackgroundPlayer(activity, getPlayQueue(), false)); - - playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.POPUP); - return true; - }); - - playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.AUDIO); - return true; - }); } private void showContentNotSupportedIfNeeded() { // channelBinding might not be initialized when handleResult() is called // (e.g. after rotating the screen, #6696) - if (!channelContentNotSupported || channelBinding == null) { + if (!channelContentNotSupported || binding == null) { return; } - channelBinding.errorContentNotSupported.setVisibility(View.VISIBLE); - channelBinding.channelKaomoji.setText("(︶︹︺)"); - channelBinding.channelKaomoji.setTextSize(TypedValue.COMPLEX_UNIT_SP, 45f); - channelBinding.channelNoVideos.setVisibility(View.GONE); - } - - private PlayQueue getPlayQueue() { - final List streamItems = infoListAdapter.getItemsList().stream() - .filter(StreamInfoItem.class::isInstance) - .map(StreamInfoItem.class::cast) - .collect(Collectors.toList()); - - return new ChannelPlayQueue(currentInfo.getServiceId(), currentInfo.getUrl(), - currentInfo.getNextPage(), streamItems, 0); - } - - /*////////////////////////////////////////////////////////////////////////// - // Utils - //////////////////////////////////////////////////////////////////////////*/ - - @Override - public void setTitle(final String title) { - super.setTitle(title); - if (!useAsFrontPage) { - headerBinding.channelTitleView.setText(title); - } + binding.errorContentNotSupported.setVisibility(View.VISIBLE); + binding.channelKaomoji.setText("(︶︹︺)"); + binding.channelKaomoji.setTextSize(TypedValue.COMPLEX_UNIT_SP, 45f); } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java new file mode 100644 index 00000000000..5d398821a3a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java @@ -0,0 +1,170 @@ +package org.schabi.newpipe.fragments.list.channel; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.evernote.android.state.State; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.PlaylistControlBinding; +import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.linkhandler.ReadyChannelTabListLinkHandler; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; +import org.schabi.newpipe.player.playqueue.ChannelTabPlayQueue; +import org.schabi.newpipe.player.playqueue.PlayQueue; +import org.schabi.newpipe.util.ChannelTabHelper; +import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.PlayButtonHelper; + +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import io.reactivex.rxjava3.core.Single; + +public class ChannelTabFragment extends BaseListInfoFragment + implements PlaylistControlViewHolder { + + // states must be protected and not private for State being able to access them + @State + protected ListLinkHandler tabHandler; + @State + protected String channelName; + + private PlaylistControlBinding playlistControlBinding; + + @NonNull + public static ChannelTabFragment getInstance(final int serviceId, + final ListLinkHandler tabHandler, + final String channelName) { + final ChannelTabFragment instance = new ChannelTabFragment(); + instance.serviceId = serviceId; + instance.tabHandler = tabHandler; + instance.channelName = channelName; + return instance; + } + + public ChannelTabFragment() { + super(UserAction.REQUESTED_CHANNEL); + } + + /*////////////////////////////////////////////////////////////////////////// + // LifeCycle + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(false); + } + + @Override + public View onCreateView(@NonNull final LayoutInflater inflater, + @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_channel_tab, container, false); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + playlistControlBinding = null; + } + + @Override + protected Supplier getListHeaderSupplier() { + if (ChannelTabHelper.isStreamsTab(tabHandler)) { + playlistControlBinding = PlaylistControlBinding + .inflate(activity.getLayoutInflater(), itemsList, false); + return playlistControlBinding::getRoot; + } + return null; + } + + @Override + protected Single loadResult(final boolean forceLoad) { + return ExtractorHelper.getChannelTab(serviceId, tabHandler, forceLoad); + } + + @Override + protected Single> loadMoreItemsLogic() { + return ExtractorHelper.getMoreChannelTabItems(serviceId, tabHandler, currentNextPage); + } + + @Override + public void setTitle(final String title) { + // The channel name is displayed as title in the toolbar. + // The title is always a description of the content of the tab fragment. + // It should be unique for each channel because multiple channel tabs + // can be added to the main page. Therefore, the channel name is used. + // Using the title variable would cause the title to be the same for all channel tabs. + super.setTitle(channelName); + } + + @Override + public void handleResult(@NonNull final ChannelTabInfo result) { + super.handleResult(result); + + // FIXME this is a really hacky workaround, to avoid storing useless data in the fragment + // state. The problem is, `ReadyChannelTabListLinkHandler` might contain raw JSON data that + // uses a lot of memory (e.g. ~800KB for YouTube). While 800KB doesn't seem much, if + // you combine just a couple of channel tab fragments you easily go over the 1MB + // save&restore transaction limit, and get `TransactionTooLargeException`s. A proper + // solution would require rethinking about `ReadyChannelTabListLinkHandler`s. + if (tabHandler instanceof ReadyChannelTabListLinkHandler) { + try { + // once `handleResult` is called, the parsed data was already saved to cache, so + // we can discard any raw data in ReadyChannelTabListLinkHandler and create a + // link handler with identical properties, but without any raw data + final ListLinkHandlerFactory channelTabLHFactory = result.getService() + .getChannelTabLHFactory(); + if (channelTabLHFactory != null) { + // some services do not not have a ChannelTabLHFactory + tabHandler = channelTabLHFactory.fromQuery(tabHandler.getId(), + tabHandler.getContentFilters(), tabHandler.getSortFilter()); + } + } catch (final ParsingException e) { + // silently ignore the error, as the app can continue to function normally + Log.w(TAG, "Could not recreate channel tab handler", e); + } + } + + if (playlistControlBinding != null) { + // PlaylistControls should be visible only if there is some item in + // infoListAdapter other than header + if (infoListAdapter.getItemCount() > 1) { + playlistControlBinding.getRoot().setVisibility(View.VISIBLE); + } else { + playlistControlBinding.getRoot().setVisibility(View.GONE); + } + + PlayButtonHelper.initPlaylistControlClickListener( + activity, playlistControlBinding, this); + } + } + + @Override + public PlayQueue getPlayQueue() { + final List streamItems = infoListAdapter.getItemsList().stream() + .filter(StreamInfoItem.class::isInstance) + .map(StreamInfoItem.class::cast) + .collect(Collectors.toList()); + + return new ChannelTabPlayQueue(currentInfo.getServiceId(), tabHandler, + currentInfo.getNextPage(), streamItems, 0); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java new file mode 100644 index 00000000000..0514eefde82 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java @@ -0,0 +1,171 @@ +package org.schabi.newpipe.fragments.list.comments; + +import static org.schabi.newpipe.util.ServiceHelper.getServiceById; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.text.HtmlCompat; + +import com.evernote.android.state.State; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.CommentRepliesHeaderBinding; +import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.ItemViewMode; +import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.text.TextLinkifier; + +import java.util.Queue; +import java.util.function.Supplier; + +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +public final class CommentRepliesFragment + extends BaseListInfoFragment { + + public static final String TAG = CommentRepliesFragment.class.getSimpleName(); + + @State + CommentsInfoItem commentsInfoItem; // the comment to show replies of + private final CompositeDisposable disposables = new CompositeDisposable(); + + + /*////////////////////////////////////////////////////////////////////////// + // Constructors and lifecycle + //////////////////////////////////////////////////////////////////////////*/ + + // only called by the Android framework, after which readFrom is called and restores all data + public CommentRepliesFragment() { + super(UserAction.REQUESTED_COMMENT_REPLIES); + } + + public CommentRepliesFragment(@NonNull final CommentsInfoItem commentsInfoItem) { + this(); + this.commentsInfoItem = commentsInfoItem; + // setting "" as title since the title will be properly set right after + setInitialData(commentsInfoItem.getServiceId(), commentsInfoItem.getUrl(), ""); + } + + @Nullable + @Override + public View onCreateView(@NonNull final LayoutInflater inflater, + @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_comments, container, false); + } + + @Override + public void onDestroyView() { + disposables.clear(); + super.onDestroyView(); + } + + @Override + protected Supplier getListHeaderSupplier() { + return () -> { + final CommentRepliesHeaderBinding binding = CommentRepliesHeaderBinding + .inflate(activity.getLayoutInflater(), itemsList, false); + final CommentsInfoItem item = commentsInfoItem; + + // load the author avatar + PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(binding.authorAvatar); + binding.authorAvatar.setVisibility(ImageStrategy.shouldLoadImages() + ? View.VISIBLE : View.GONE); + + // setup author name and comment date + binding.authorName.setText(item.getUploaderName()); + binding.uploadDate.setText(Localization.relativeTimeOrTextual( + getContext(), item.getUploadDate(), item.getTextualUploadDate())); + binding.authorTouchArea.setOnClickListener( + v -> NavigationHelper.openCommentAuthorIfPresent(requireActivity(), item)); + + // setup like count, hearted and pinned + binding.thumbsUpCount.setText( + Localization.likeCount(requireContext(), item.getLikeCount())); + // for heartImage goneMarginEnd was used, but there is no way to tell ConstraintLayout + // not to use a different margin only when both the next two views are gone + ((ConstraintLayout.LayoutParams) binding.thumbsUpCount.getLayoutParams()) + .setMarginEnd(DeviceUtils.dpToPx( + (item.isHeartedByUploader() || item.isPinned() ? 8 : 16), + requireContext())); + binding.heartImage.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); + binding.pinnedImage.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE); + + // setup comment content + TextLinkifier.fromDescription(binding.commentContent, item.getCommentText(), + HtmlCompat.FROM_HTML_MODE_LEGACY, getServiceById(item.getServiceId()), + item.getUrl(), disposables, null); + + return binding.getRoot(); + }; + } + + + /*////////////////////////////////////////////////////////////////////////// + // State saving + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void writeTo(final Queue objectsToSave) { + super.writeTo(objectsToSave); + objectsToSave.add(commentsInfoItem); + } + + @Override + public void readFrom(@NonNull final Queue savedObjects) throws Exception { + super.readFrom(savedObjects); + commentsInfoItem = (CommentsInfoItem) savedObjects.poll(); + } + + + /*////////////////////////////////////////////////////////////////////////// + // Data loading + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected Single loadResult(final boolean forceLoad) { + return Single.fromCallable(() -> new CommentRepliesInfo(commentsInfoItem, + // the reply count string will be shown as the activity title + Localization.replyCount(requireContext(), commentsInfoItem.getReplyCount()))); + } + + @Override + protected Single> loadMoreItemsLogic() { + // commentsInfoItem.getUrl() should contain the url of the original + // ListInfo, which should be the stream url + return ExtractorHelper.getMoreCommentItems( + serviceId, commentsInfoItem.getUrl(), currentNextPage); + } + + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected ItemViewMode getItemViewMode() { + return ItemViewMode.LIST; + } + + /** + * @return the comment to which the replies are shown + */ + public CommentsInfoItem getCommentsInfoItem() { + return commentsInfoItem; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java new file mode 100644 index 00000000000..cc160c39538 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java @@ -0,0 +1,22 @@ +package org.schabi.newpipe.fragments.list.comments; + +import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; + +import java.util.Collections; + +public final class CommentRepliesInfo extends ListInfo { + /** + * This class is used to wrap the comment replies page into a ListInfo object. + * + * @param comment the comment from which to get replies + * @param name will be shown as the fragment title + */ + public CommentRepliesInfo(final CommentsInfoItem comment, final String name) { + super(comment.getServiceId(), + new ListLinkHandler("", "", "", Collections.emptyList(), null), name); + setNextPage(comment.getReplies()); + setRelatedItems(Collections.emptyList()); // since it must be non-null + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 3b092cc2885..e25e02794f1 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -17,6 +17,7 @@ import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.util.ExtractorHelper; @@ -106,7 +107,17 @@ public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) { } @Override - protected boolean isGridLayout() { - return false; + protected ItemViewMode getItemViewMode() { + return ItemViewMode.LIST; + } + + public boolean scrollToComment(final CommentsInfoItem comment) { + final int position = infoListAdapter.getItemsList().indexOf(comment); + if (position < 0) { + return false; + } + + itemsList.scrollToPosition(position); + return true; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 0b01627d6e9..6823e13d38b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -11,23 +11,26 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; +import com.evernote.android.state.State; + import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCLiveStreamKiosk; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.Localization; -import icepick.State; import io.reactivex.rxjava3.core.Single; /** @@ -161,4 +164,14 @@ public void handleResult(@NonNull final KioskInfo result) { name = kioskTranslatedName; setTitle(kioskTranslatedName); } + + @Override + public void showEmptyState() { + // show "no live streams" for live stream kiosk + super.showEmptyState(); + if (MediaCCCLiveStreamKiosk.KIOSK_ID.equals(currentInfo.getId()) + && ServiceList.MediaCCC.getServiceId() == currentInfo.getServiceId()) { + setEmptyStateMessage(R.string.no_live_streams); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistControlViewHolder.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistControlViewHolder.java new file mode 100644 index 00000000000..e4705bb7188 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistControlViewHolder.java @@ -0,0 +1,11 @@ +package org.schabi.newpipe.fragments.list.playlist; + +import org.schabi.newpipe.player.playqueue.PlayQueue; + +/** + * Interface for {@code R.layout.playlist_control} view holders + * to give access to the play queue. + */ +public interface PlaylistControlViewHolder { + PlayQueue getPlayQueue(); +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index a3150a77307..6410fb9ee75 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -1,7 +1,9 @@ package org.schabi.newpipe.fragments.list.playlist; +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; +import static org.schabi.newpipe.util.ServiceHelper.getServiceById; import android.content.Context; import android.os.Bundle; @@ -37,20 +39,22 @@ import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper; +import org.schabi.newpipe.extractor.stream.Description; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; -import org.schabi.newpipe.player.PlayerType; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.PlayButtonHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.text.TextEllipsizer; import java.util.ArrayList; import java.util.List; @@ -64,7 +68,8 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; -public class PlaylistFragment extends BaseListInfoFragment { +public class PlaylistFragment extends BaseListInfoFragment + implements PlaylistControlViewHolder { private static final String PICASSO_PLAYLIST_TAG = "PICASSO_PLAYLIST_TAG"; @@ -84,6 +89,9 @@ public class PlaylistFragment extends BaseListInfoFragment getListHeaderSupplier() { protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); + // Is mini variant still relevant? + // Only the remote playlist screen uses it now infoListAdapter.setUseMiniVariant(true); } @@ -231,7 +241,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { break; case R.id.menu_item_share: ShareUtils.shareText(requireContext(), name, url, - currentInfo == null ? null : currentInfo.getThumbnailUrl()); + currentInfo == null ? List.of() : currentInfo.getThumbnails()); break; case R.id.menu_item_bookmark: onBookmarkClicked(); @@ -270,6 +280,12 @@ public void showLoading() { animate(headerBinding.uploaderLayout, false, 200); } + @Override + public void handleNextItems(final ListExtractor.InfoItemsPage result) { + super.handleNextItems(result); + setStreamCountAndOverallDuration(result.getItems(), !result.hasNextPage()); + } + @Override public void handleResult(@NonNull final PlaylistInfo result) { super.handleResult(result); @@ -296,7 +312,6 @@ public void handleResult(@NonNull final PlaylistInfo result) { playlistControlBinding.getRoot().setVisibility(View.VISIBLE); - final String avatarUrl = result.getUploaderAvatarUrl(); if (result.getServiceId() == ServiceList.YouTube.getServiceId() && (YoutubeParsingHelper.isYoutubeMixId(result.getId()) || YoutubeParsingHelper.isYoutubeMusicMixId(result.getId()))) { @@ -312,12 +327,36 @@ public void handleResult(@NonNull final PlaylistInfo result) { R.drawable.ic_radio) ); } else { - PicassoHelper.loadAvatar(avatarUrl).tag(PICASSO_PLAYLIST_TAG) + PicassoHelper.loadAvatar(result.getUploaderAvatars()).tag(PICASSO_PLAYLIST_TAG) .into(headerBinding.uploaderAvatarView); } - headerBinding.playlistStreamCount.setText(Localization - .localizeStreamCount(getContext(), result.getStreamCount())); + streamCount = result.getStreamCount(); + setStreamCountAndOverallDuration(result.getRelatedItems(), !result.hasNextPage()); + + final Description description = result.getDescription(); + if (description != null && description != Description.EMPTY_DESCRIPTION + && !isBlank(description.getContent())) { + final TextEllipsizer ellipsizer = new TextEllipsizer( + headerBinding.playlistDescription, 5, getServiceById(result.getServiceId())); + ellipsizer.setStateChangeListener(isEllipsized -> + headerBinding.playlistDescriptionReadMore.setText( + Boolean.TRUE.equals(isEllipsized) ? R.string.show_more : R.string.show_less + )); + ellipsizer.setOnContentChanged(canBeEllipsized -> { + headerBinding.playlistDescriptionReadMore.setVisibility( + Boolean.TRUE.equals(canBeEllipsized) ? View.VISIBLE : View.GONE); + if (Boolean.TRUE.equals(canBeEllipsized)) { + ellipsizer.ellipsize(); + } + }); + ellipsizer.setContent(description); + headerBinding.playlistDescriptionReadMore.setOnClickListener(v -> ellipsizer.toggle()); + headerBinding.playlistDescription.setOnClickListener(v -> ellipsizer.toggle()); + } else { + headerBinding.playlistDescription.setVisibility(View.GONE); + headerBinding.playlistDescriptionReadMore.setVisibility(View.GONE); + } if (!result.getErrors().isEmpty()) { showSnackBarError(new ErrorInfo(result.getErrors(), UserAction.REQUESTED_PLAYLIST, @@ -330,25 +369,10 @@ public void handleResult(@NonNull final PlaylistInfo result) { .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistBookmarkSubscriber()); - playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(view -> - NavigationHelper.playOnMainPlayer(activity, getPlayQueue())); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(view -> - NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(), false)); - playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(view -> - NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue(), false)); - - playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.POPUP); - return true; - }); - - playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.AUDIO); - return true; - }); + PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this); } - private PlayQueue getPlayQueue() { + public PlayQueue getPlayQueue() { return getPlayQueue(0); } @@ -472,4 +496,20 @@ private void updateBookmarkButtons() { playlistBookmarkButton.setIcon(drawable); playlistBookmarkButton.setTitle(titleRes); } + + private void setStreamCountAndOverallDuration(final List list, + final boolean isDurationComplete) { + if (activity != null && headerBinding != null) { + playlistOverallDurationSeconds += list.stream() + .mapToLong(x -> x.getDuration()) + .sum(); + headerBinding.playlistStreamCount.setText( + Localization.concatenateStrings( + Localization.localizeStreamCount(activity, streamCount), + Localization.getDurationString(playlistOverallDurationSeconds, + isDurationComplete, true)) + ); + } + } + } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 26a28322921..18c60400b47 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.fragments.list.search; import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags; +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; import static java.util.Arrays.asList; @@ -39,6 +40,8 @@ import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; +import com.evernote.android.state.State; + import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.FragmentSearchBinding; import org.schabi.newpipe.error.ErrorInfo; @@ -76,7 +79,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Single; @@ -167,6 +169,10 @@ public class SearchFragment extends BaseListFragment savedObjects) throws Exception @Override public void onSaveInstanceState(@NonNull final Bundle bundle) { searchString = searchEditText != null - ? searchEditText.getText().toString() + ? getSearchEditString().trim() : searchString; super.onSaveInstanceState(bundle); } @@ -396,11 +402,11 @@ public void onSaveInstanceState(@NonNull final Bundle bundle) { @Override public void reloadContent() { - if (!TextUtils.isEmpty(searchString) - || (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) { + if (!TextUtils.isEmpty(searchString) || (searchEditText != null + && !isSearchEditBlank())) { search(!TextUtils.isEmpty(searchString) ? searchString - : searchEditText.getText().toString(), this.contentFilter, ""); + : getSearchEditString(), this.contentFilter, ""); } else { if (searchEditText != null) { searchEditText.setText(""); @@ -494,7 +500,8 @@ private void showSearchOnStart() { } searchEditText.setText(searchString); - if (TextUtils.isEmpty(searchString) || TextUtils.isEmpty(searchEditText.getText())) { + if (TextUtils.isEmpty(searchString) + || isSearchEditBlank()) { searchToolbarContainer.setTranslationX(100); searchToolbarContainer.setAlpha(0.0f); searchToolbarContainer.setVisibility(View.VISIBLE); @@ -518,7 +525,7 @@ private void initSearchListeners() { if (DEBUG) { Log.d(TAG, "onClick() called with: v = [" + v + "]"); } - if (TextUtils.isEmpty(searchEditText.getText())) { + if (isSearchEditBlank()) { NavigationHelper.gotoMainFragment(getFM()); return; } @@ -544,7 +551,7 @@ private void initSearchListeners() { } }); - searchEditText.setOnFocusChangeListener((View v, boolean hasFocus) -> { + searchEditText.setOnFocusChangeListener((final View v, final boolean hasFocus) -> { if (DEBUG) { Log.d(TAG, "onFocusChange() called with: " + "v = [" + v + "], hasFocus = [" + hasFocus + "]"); @@ -583,11 +590,13 @@ public void onSuggestionItemLongClick(final SuggestionItem item) { @Override public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) { + // Do nothing, old text is already clean } @Override public void onTextChanged(final CharSequence s, final int start, final int before, final int count) { + // Changes are handled in afterTextChanged; CharSequence cannot be changed here. } @Override @@ -597,13 +606,13 @@ public void afterTextChanged(final Editable s) { s.removeSpan(span); } - final String newText = searchEditText.getText().toString(); + final String newText = getSearchEditString().trim(); suggestionPublisher.onNext(newText); } }; searchEditText.addTextChangedListener(textWatcher); searchEditText.setOnEditorActionListener( - (TextView v, int actionId, KeyEvent event) -> { + (final TextView v, final int actionId, final KeyEvent event) -> { if (DEBUG) { Log.d(TAG, "onEditorAction() called with: v = [" + v + "], " + "actionId = [" + actionId + "], event = [" + event + "]"); @@ -613,7 +622,8 @@ public void afterTextChanged(final Editable s) { } else if (event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) { - search(searchEditText.getText().toString(), new String[0], ""); + searchEditText.setText(getSearchEditString().trim()); + search(getSearchEditString(), new String[0], ""); return true; } return false; @@ -688,7 +698,7 @@ private void showDeleteSuggestionDialog(final SuggestionItem item) { .observeOn(AndroidSchedulers.mainThread()) .subscribe( howManyDeleted -> suggestionPublisher - .onNext(searchEditText.getText().toString()), + .onNext(getSearchEditString()), throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Deleting item failed"))); @@ -717,9 +727,9 @@ private Observable> getLocalSuggestionsObservable( .getRelatedSearches(query, similarQueryLimit, 25) .toObservable() .map(searchHistoryEntries -> - searchHistoryEntries.stream() - .map(entry -> new SuggestionItem(true, entry)) - .collect(Collectors.toList())); + searchHistoryEntries.stream() + .map(entry -> new SuggestionItem(true, entry)) + .collect(Collectors.toList())); } private Observable> getRemoteSuggestionsObservable(final String query) { @@ -786,12 +796,12 @@ private void initSuggestionObserver() { } else if (listNotification.isOnError() && listNotification.getError() != null && !ExceptionUtils.isInterruptedCaused( - listNotification.getError())) { + listNotification.getError())) { showSnackBarError(new ErrorInfo(listNotification.getError(), UserAction.GET_SUGGESTIONS, searchString, serviceId)); } }, throwable -> showSnackBarError(new ErrorInfo( - throwable, UserAction.GET_SUGGESTIONS, searchString, serviceId))); + throwable, UserAction.GET_SUGGESTIONS, searchString, serviceId))); } @Override @@ -799,7 +809,13 @@ protected void doInitialLoadLogic() { // no-op } - private void search(final String theSearchString, + /** + * Perform a search. + * @param theSearchString the trimmed search string + * @param theContentFilter the content filter to use. FIXME: unused param + * @param theSortFilter FIXME: unused param + */ + private void search(@NonNull final String theSearchString, final String[] theContentFilter, final String theSortFilter) { if (DEBUG) { @@ -809,25 +825,26 @@ private void search(final String theSearchString, return; } + // Check if theSearchString is a URL which can be opened by NewPipe directly + // and open it if possible. try { final StreamingService streamingService = NewPipe.getServiceByUrl(theSearchString); - if (streamingService != null) { - showLoading(); - disposables.add(Observable - .fromCallable(() -> NavigationHelper.getIntentByLink(activity, - streamingService, theSearchString)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(intent -> { - getFM().popBackStackImmediate(); - activity.startActivity(intent); - }, throwable -> showTextError(getString(R.string.unsupported_url)))); - return; - } + showLoading(); + disposables.add(Observable + .fromCallable(() -> NavigationHelper.getIntentByLink(activity, + streamingService, theSearchString)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(intent -> { + getFM().popBackStackImmediate(); + activity.startActivity(intent); + }, throwable -> showTextError(getString(R.string.unsupported_url)))); + return; } catch (final Exception ignored) { // Exception occurred, it's not a url } + // prepare search lastSearchedString = this.searchString; this.searchString = theSearchString; infoListAdapter.clearStreamItemList(); @@ -836,13 +853,17 @@ private void search(final String theSearchString, searchBinding.searchMetaInfoSeparator, disposables); hideKeyboardSearch(); + // store search query if search history is enabled disposables.add(historyRecordManager.onSearched(serviceId, theSearchString) .observeOn(AndroidSchedulers.mainThread()) .subscribe( - ignored -> { }, + ignored -> { + }, throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.SEARCHED, theSearchString, serviceId)) )); + + // load search results suggestionPublisher.onNext(theSearchString); startLoading(false); } @@ -932,6 +953,14 @@ private void setQuery(final int theServiceId, sortFilter = theSortFilter; } + private String getSearchEditString() { + return searchEditText.getText().toString(); + } + + private boolean isSearchEditBlank() { + return isBlank(getSearchEditString()); + } + /*////////////////////////////////////////////////////////////////////////// // Suggestion Results //////////////////////////////////////////////////////////////////////////*/ @@ -973,6 +1002,9 @@ public void handleResult(@NonNull final SearchInfo result) { } searchSuggestion = result.getSearchSuggestion(); + if (searchSuggestion != null) { + searchSuggestion = searchSuggestion.trim(); + } isCorrectedSearch = result.isCorrectedSearch(); // List cannot be bundled without creating some containers @@ -1074,7 +1106,7 @@ public void onSuggestionItemSwiped(@NonNull final RecyclerView.ViewHolder viewHo .observeOn(AndroidSchedulers.mainThread()) .subscribe( howManyDeleted -> suggestionPublisher - .onNext(searchEditText.getText().toString()), + .onNext(getSearchEditString()), throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Deleting item failed"))); disposables.add(onDelete); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java index f0ece69f37c..39d145b1d07 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; @@ -18,20 +19,22 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.ItemViewMode; +import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.ktx.ViewUtils; -import org.schabi.newpipe.util.RelatedItemInfo; import java.io.Serializable; import java.util.function.Supplier; import io.reactivex.rxjava3.core.Single; -public class RelatedItemsFragment extends BaseListInfoFragment +public class RelatedItemsFragment extends BaseListInfoFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String INFO_KEY = "related_info_key"; - private RelatedItemInfo relatedItemInfo; + private RelatedItemsInfo relatedItemsInfo; /*////////////////////////////////////////////////////////////////////////// // Views @@ -68,7 +71,7 @@ public void onDestroyView() { @Override protected Supplier getListHeaderSupplier() { - if (relatedItemInfo == null || relatedItemInfo.getRelatedItems() == null) { + if (relatedItemsInfo == null || relatedItemsInfo.getRelatedItems() == null) { return null; } @@ -96,8 +99,8 @@ protected Single> loadMoreItemsLogic() { //////////////////////////////////////////////////////////////////////////*/ @Override - protected Single loadResult(final boolean forceLoad) { - return Single.fromCallable(() -> relatedItemInfo); + protected Single loadResult(final boolean forceLoad) { + return Single.fromCallable(() -> relatedItemsInfo); } @Override @@ -109,7 +112,7 @@ public void showLoading() { } @Override - public void handleResult(@NonNull final RelatedItemInfo result) { + public void handleResult(@NonNull final RelatedItemsInfo result) { super.handleResult(result); if (headerBinding != null) { @@ -136,38 +139,64 @@ public void onCreateOptionsMenu(@NonNull final Menu menu, private void setInitialData(final StreamInfo info) { super.setInitialData(info.getServiceId(), info.getUrl(), info.getName()); - if (this.relatedItemInfo == null) { - this.relatedItemInfo = RelatedItemInfo.getInfo(info); + if (this.relatedItemsInfo == null) { + this.relatedItemsInfo = new RelatedItemsInfo(info); } } @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - outState.putSerializable(INFO_KEY, relatedItemInfo); + outState.putSerializable(INFO_KEY, relatedItemsInfo); } @Override protected void onRestoreInstanceState(@NonNull final Bundle savedState) { super.onRestoreInstanceState(savedState); final Serializable serializable = savedState.getSerializable(INFO_KEY); - if (serializable instanceof RelatedItemInfo) { - this.relatedItemInfo = (RelatedItemInfo) serializable; + if (serializable instanceof RelatedItemsInfo) { + this.relatedItemsInfo = (RelatedItemsInfo) serializable; } } @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, - final String s) { - if (headerBinding != null) { - headerBinding.autoplaySwitch.setChecked( - sharedPreferences.getBoolean( - getString(R.string.auto_queue_key), false)); + final String key) { + if (headerBinding != null && getString(R.string.auto_queue_key).equals(key)) { + headerBinding.autoplaySwitch.setChecked(sharedPreferences.getBoolean(key, false)); } } @Override - protected boolean isGridLayout() { - return false; + protected ItemViewMode getItemViewMode() { + ItemViewMode mode = super.getItemViewMode(); + // Only list mode is supported. Either List or card will be used. + if (mode != ItemViewMode.LIST && mode != ItemViewMode.CARD) { + mode = ItemViewMode.LIST; + } + return mode; } + + @Override + protected void showInfoItemDialog(final StreamInfoItem item) { + // Try and attach the InfoItemDialog to the parent fragment of the RelatedItemsFragment + // so that its context is not lost when the RelatedItemsFragment is reinitialized, + // e.g. when a new stream is loaded in a parent VideoDetailFragment. + final Fragment parentFragment = getParentFragment(); + if (parentFragment != null) { + try { + new InfoItemDialog.Builder( + parentFragment.getActivity(), + parentFragment.getContext(), + parentFragment, + item + ).create().show(); + } catch (final IllegalArgumentException e) { + InfoItemDialog.Builder.reportErrorDuringInitialization(e, item); + } + } else { + super.showInfoItemDialog(item); + } + } + } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsInfo.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsInfo.java new file mode 100644 index 00000000000..bbc7e1ed001 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsInfo.java @@ -0,0 +1,22 @@ +package org.schabi.newpipe.fragments.list.videos; + +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.stream.StreamInfo; + +import java.util.ArrayList; +import java.util.Collections; + +public final class RelatedItemsInfo extends ListInfo { + /** + * This class is used to wrap the related items of a StreamInfo into a ListInfo object. + * + * @param info the stream info from which to get related items + */ + public RelatedItemsInfo(final StreamInfo info) { + super(info.getServiceId(), new ListLinkHandler(info.getOriginalUrl(), info.getUrl(), + info.getId(), Collections.emptyList(), null), info.getName()); + setRelatedItems(new ArrayList<>(info.getRelatedItems())); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index 68f19ee9714..d959c63277c 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -13,8 +13,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentInfoItemHolder; import org.schabi.newpipe.info_list.holder.InfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; @@ -87,8 +86,7 @@ private InfoItemHolder holderFromInfoType(@NonNull final ViewGroup parent, return useMiniVariant ? new PlaylistMiniInfoItemHolder(this, parent) : new PlaylistInfoItemHolder(this, parent); case COMMENT: - return useMiniVariant ? new CommentsMiniInfoItemHolder(this, parent) - : new CommentsInfoItemHolder(this, parent); + return new CommentInfoItemHolder(this, parent); default: throw new RuntimeException("InfoType not expected = " + infoType.name()); } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index fb27593e7e0..575568c00f9 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -17,15 +17,17 @@ import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.info_list.holder.ChannelCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentInfoItemHolder; import org.schabi.newpipe.info_list.holder.InfoItemHolder; +import org.schabi.newpipe.info_list.holder.PlaylistCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.StreamCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder; @@ -67,14 +69,16 @@ public class InfoListAdapter extends RecyclerView.Adapter headerSupplier = null; public InfoListAdapter(final Context context) { @@ -114,8 +119,8 @@ public void setUseMiniVariant(final boolean useMiniVariant) { this.useMiniVariant = useMiniVariant; } - public void setUseGridVariant(final boolean useGridVariant) { - this.useGridVariant = useGridVariant; + public void setItemViewMode(final ItemViewMode itemViewMode) { + this.itemMode = itemViewMode; } public void addInfoItemList(@Nullable final List data) { @@ -234,16 +239,37 @@ public int getItemViewType(int position) { final InfoItem item = infoItemList.get(position); switch (item.getInfoType()) { case STREAM: - return useGridVariant ? GRID_STREAM_HOLDER_TYPE : useMiniVariant - ? MINI_STREAM_HOLDER_TYPE : STREAM_HOLDER_TYPE; + if (itemMode == ItemViewMode.CARD) { + return CARD_STREAM_HOLDER_TYPE; + } else if (itemMode == ItemViewMode.GRID) { + return GRID_STREAM_HOLDER_TYPE; + } else if (useMiniVariant) { + return MINI_STREAM_HOLDER_TYPE; + } else { + return STREAM_HOLDER_TYPE; + } case CHANNEL: - return useGridVariant ? GRID_CHANNEL_HOLDER_TYPE : useMiniVariant - ? MINI_CHANNEL_HOLDER_TYPE : CHANNEL_HOLDER_TYPE; + if (itemMode == ItemViewMode.CARD) { + return CARD_CHANNEL_HOLDER_TYPE; + } else if (itemMode == ItemViewMode.GRID) { + return GRID_CHANNEL_HOLDER_TYPE; + } else if (useMiniVariant) { + return MINI_CHANNEL_HOLDER_TYPE; + } else { + return CHANNEL_HOLDER_TYPE; + } case PLAYLIST: - return useGridVariant ? GRID_PLAYLIST_HOLDER_TYPE : useMiniVariant - ? MINI_PLAYLIST_HOLDER_TYPE : PLAYLIST_HOLDER_TYPE; + if (itemMode == ItemViewMode.CARD) { + return CARD_PLAYLIST_HOLDER_TYPE; + } else if (itemMode == ItemViewMode.GRID) { + return GRID_PLAYLIST_HOLDER_TYPE; + } else if (useMiniVariant) { + return MINI_PLAYLIST_HOLDER_TYPE; + } else { + return PLAYLIST_HOLDER_TYPE; + } case COMMENT: - return useMiniVariant ? MINI_COMMENT_HOLDER_TYPE : COMMENT_HOLDER_TYPE; + return COMMENT_HOLDER_TYPE; default: return -1; } @@ -274,10 +300,14 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren return new StreamInfoItemHolder(infoItemBuilder, parent); case GRID_STREAM_HOLDER_TYPE: return new StreamGridInfoItemHolder(infoItemBuilder, parent); + case CARD_STREAM_HOLDER_TYPE: + return new StreamCardInfoItemHolder(infoItemBuilder, parent); case MINI_CHANNEL_HOLDER_TYPE: return new ChannelMiniInfoItemHolder(infoItemBuilder, parent); case CHANNEL_HOLDER_TYPE: return new ChannelInfoItemHolder(infoItemBuilder, parent); + case CARD_CHANNEL_HOLDER_TYPE: + return new ChannelCardInfoItemHolder(infoItemBuilder, parent); case GRID_CHANNEL_HOLDER_TYPE: return new ChannelGridInfoItemHolder(infoItemBuilder, parent); case MINI_PLAYLIST_HOLDER_TYPE: @@ -286,10 +316,10 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren return new PlaylistInfoItemHolder(infoItemBuilder, parent); case GRID_PLAYLIST_HOLDER_TYPE: return new PlaylistGridInfoItemHolder(infoItemBuilder, parent); - case MINI_COMMENT_HOLDER_TYPE: - return new CommentsMiniInfoItemHolder(infoItemBuilder, parent); + case CARD_PLAYLIST_HOLDER_TYPE: + return new PlaylistCardInfoItemHolder(infoItemBuilder, parent); case COMMENT_HOLDER_TYPE: - return new CommentsInfoItemHolder(infoItemBuilder, parent); + return new CommentInfoItemHolder(infoItemBuilder, parent); default: return new FallbackViewHolder(new View(parent.getContext())); } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java new file mode 100644 index 00000000000..447c540a0cd --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java @@ -0,0 +1,23 @@ +package org.schabi.newpipe.info_list; + +/** + * Item view mode for streams & playlist listing screens. + */ +public enum ItemViewMode { + /** + * Default mode. + */ + AUTO, + /** + * Full width list item with thumb on the left and two line title & uploader in right. + */ + LIST, + /** + * Grid mode places two cards per row. + */ + GRID, + /** + * A full width card in phone - portrait. + */ + CARD +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt index 5fc8aa68469..1e52d316808 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt @@ -8,7 +8,7 @@ import com.xwray.groupie.Item import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamSegment import org.schabi.newpipe.util.Localization -import org.schabi.newpipe.util.PicassoHelper +import org.schabi.newpipe.util.image.PicassoHelper class StreamSegmentItem( private val item: StreamSegment, diff --git a/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java b/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java index c67880d0eb8..c7ac9556f85 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java @@ -99,18 +99,12 @@ public enum StreamDialogDefaultEntry { ) ), - PLAY_WITH_KODI(R.string.play_with_kodi_title, (fragment, item) -> { - final Uri videoUrl = Uri.parse(item.getUrl()); - try { - NavigationHelper.playWithKore(fragment.requireContext(), videoUrl); - } catch (final Exception e) { - KoreUtils.showInstallKoreDialog(fragment.requireActivity()); - } - }), + PLAY_WITH_KODI(R.string.play_with_kodi_title, (fragment, item) -> + KoreUtils.playWithKore(fragment.requireContext(), Uri.parse(item.getUrl()))), SHARE(R.string.share, (fragment, item) -> ShareUtils.shareText(fragment.requireContext(), item.getName(), item.getUrl(), - item.getThumbnailUrl())), + item.getThumbnails())), /** * Opens a {@link DownloadDialog} after fetching some stream info. @@ -119,7 +113,10 @@ public enum StreamDialogDefaultEntry { DOWNLOAD(R.string.download, (fragment, item) -> fetchStreamInfoAndSaveToDatabase(fragment.requireContext(), item.getServiceId(), item.getUrl(), info -> { - if (fragment.getContext() != null) { + // Ensure the fragment is attached and its state hasn't been saved to avoid + // showing dialog during lifecycle changes or when the activity is paused, + // e.g. by selecting the download option and opening a different fragment. + if (fragment.isAdded() && !fragment.isStateSaved()) { final DownloadDialog downloadDialog = new DownloadDialog(fragment.requireContext(), info); downloadDialog.show(fragment.getChildFragmentManager(), diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java new file mode 100644 index 00000000000..29fc50be05d --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java @@ -0,0 +1,22 @@ +package org.schabi.newpipe.info_list.holder; + +import android.view.ViewGroup; + +import androidx.annotation.Nullable; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.info_list.InfoItemBuilder; + +public class ChannelCardInfoItemHolder extends ChannelMiniInfoItemHolder { + public ChannelCardInfoItemHolder(final InfoItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_channel_card_item, parent); + } + + @Override + protected int getDescriptionMaxLineCount(@Nullable final String content) { + // Based on `list_channel_card_item` left side content (thumbnail 100dp + // + additional details), Right side description can grow up to 8 lines. + return 8; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java index cf1ed255b75..f8133d3de4e 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java @@ -1,14 +1,9 @@ package org.schabi.newpipe.info_list.holder; import android.view.ViewGroup; -import android.widget.TextView; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.Localization; /* * Created by Christian Schabesberger on 12.02.17. @@ -31,40 +26,7 @@ */ public class ChannelInfoItemHolder extends ChannelMiniInfoItemHolder { - private final TextView itemChannelDescriptionView; - public ChannelInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, R.layout.list_channel_item, parent); - itemChannelDescriptionView = itemView.findViewById(R.id.itemChannelDescriptionView); - } - - @Override - public void updateFromItem(final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - super.updateFromItem(infoItem, historyRecordManager); - - if (!(infoItem instanceof ChannelInfoItem)) { - return; - } - final ChannelInfoItem item = (ChannelInfoItem) infoItem; - - itemChannelDescriptionView.setText(item.getDescription()); - } - - @Override - protected String getDetailLine(final ChannelInfoItem item) { - String details = super.getDetailLine(item); - - if (item.getStreamCount() >= 0) { - final String formattedVideoAmount = Localization.localizeStreamCount( - itemBuilder.getContext(), item.getStreamCount()); - - if (!details.isEmpty()) { - details += " • " + formattedVideoAmount; - } else { - details = formattedVideoAmount; - } - } - return details; } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java index 89398a1e52a..7afc05c6c25 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java @@ -1,21 +1,26 @@ package org.schabi.newpipe.info_list.holder; +import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.utils.Utils; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; public class ChannelMiniInfoItemHolder extends InfoItemHolder { - public final ImageView itemThumbnailView; - public final TextView itemTitleView; + private final ImageView itemThumbnailView; + private final TextView itemTitleView; private final TextView itemAdditionalDetailView; + private final TextView itemChannelDescriptionView; ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { @@ -24,6 +29,7 @@ public class ChannelMiniInfoItemHolder extends InfoItemHolder { itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); itemTitleView = itemView.findViewById(R.id.itemTitleView); itemAdditionalDetailView = itemView.findViewById(R.id.itemAdditionalDetails); + itemChannelDescriptionView = itemView.findViewById(R.id.itemChannelDescriptionView); } public ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, @@ -40,9 +46,17 @@ public void updateFromItem(final InfoItem infoItem, final ChannelInfoItem item = (ChannelInfoItem) infoItem; itemTitleView.setText(item.getName()); - itemAdditionalDetailView.setText(getDetailLine(item)); + itemTitleView.setSelected(true); + + final String detailLine = getDetailLine(item); + if (detailLine == null) { + itemAdditionalDetailView.setVisibility(View.GONE); + } else { + itemAdditionalDetailView.setVisibility(View.VISIBLE); + itemAdditionalDetailView.setText(getDetailLine(item)); + } - PicassoHelper.loadAvatar(item.getThumbnailUrl()).into(itemThumbnailView); + PicassoHelper.loadAvatar(item.getThumbnails()).into(itemThumbnailView); itemView.setOnClickListener(view -> { if (itemBuilder.getOnChannelSelectedListener() != null) { @@ -56,14 +70,48 @@ public void updateFromItem(final InfoItem infoItem, } return true; }); + + if (itemChannelDescriptionView != null) { + // itemChannelDescriptionView will be null in the mini variant + if (Utils.isBlank(item.getDescription())) { + itemChannelDescriptionView.setVisibility(View.GONE); + } else { + itemChannelDescriptionView.setVisibility(View.VISIBLE); + itemChannelDescriptionView.setText(item.getDescription()); + // setMaxLines utilize the line space for description if the additional details + // (sub / video count) are not present. + // Case1: 2 lines of description + 1 line additional details + // Case2: 3 lines of description (additionalDetails is GONE) + itemChannelDescriptionView.setMaxLines(getDescriptionMaxLineCount(detailLine)); + } + } + } + + /** + * Returns max number of allowed lines for the description field. + * @param content additional detail content (video / sub count) + * @return max line count + */ + protected int getDescriptionMaxLineCount(@Nullable final String content) { + return content == null ? 3 : 2; } - protected String getDetailLine(final ChannelInfoItem item) { - String details = ""; - if (item.getSubscriberCount() >= 0) { - details += Localization.shortSubscriberCount(itemBuilder.getContext(), + @Nullable + private String getDetailLine(final ChannelInfoItem item) { + if (item.getStreamCount() >= 0 && item.getSubscriberCount() >= 0) { + return Localization.concatenateStrings( + Localization.shortSubscriberCount(itemBuilder.getContext(), + item.getSubscriberCount()), + Localization.localizeStreamCount(itemBuilder.getContext(), + item.getStreamCount())); + } else if (item.getStreamCount() >= 0) { + return Localization.localizeStreamCount(itemBuilder.getContext(), + item.getStreamCount()); + } else if (item.getSubscriberCount() >= 0) { + return Localization.shortSubscriberCount(itemBuilder.getContext(), item.getSubscriberCount()); + } else { + return null; } - return details; } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java new file mode 100644 index 00000000000..839aa1813f3 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java @@ -0,0 +1,210 @@ +package org.schabi.newpipe.info_list.holder; + +import static org.schabi.newpipe.util.ServiceHelper.getServiceById; +import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; + +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.URLSpan; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.text.TextEllipsizer; + +public class CommentInfoItemHolder extends InfoItemHolder { + + private static final int COMMENT_DEFAULT_LINES = 2; + private final int commentHorizontalPadding; + private final int commentVerticalPadding; + + private final RelativeLayout itemRoot; + private final ImageView itemThumbnailView; + private final TextView itemContentView; + private final ImageView itemThumbsUpView; + private final TextView itemLikesCountView; + private final TextView itemTitleView; + private final ImageView itemHeartView; + private final ImageView itemPinnedView; + private final Button repliesButton; + + @NonNull + private final TextEllipsizer textEllipsizer; + + public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_comment_item, parent); + + itemRoot = itemView.findViewById(R.id.itemRoot); + itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); + itemContentView = itemView.findViewById(R.id.itemCommentContentView); + itemThumbsUpView = itemView.findViewById(R.id.detail_thumbs_up_img_view); + itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); + itemTitleView = itemView.findViewById(R.id.itemTitleView); + itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); + itemPinnedView = itemView.findViewById(R.id.detail_pinned_view); + repliesButton = itemView.findViewById(R.id.replies_button); + + commentHorizontalPadding = (int) infoItemBuilder.getContext() + .getResources().getDimension(R.dimen.comments_horizontal_padding); + commentVerticalPadding = (int) infoItemBuilder.getContext() + .getResources().getDimension(R.dimen.comments_vertical_padding); + + textEllipsizer = new TextEllipsizer(itemContentView, COMMENT_DEFAULT_LINES, null); + textEllipsizer.setStateChangeListener(isEllipsized -> { + if (Boolean.TRUE.equals(isEllipsized)) { + denyLinkFocus(); + } else { + determineMovementMethod(); + } + }); + } + + @Override + public void updateFromItem(final InfoItem infoItem, + final HistoryRecordManager historyRecordManager) { + if (!(infoItem instanceof CommentsInfoItem)) { + return; + } + final CommentsInfoItem item = (CommentsInfoItem) infoItem; + + + // load the author avatar + PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView); + if (ImageStrategy.shouldLoadImages()) { + itemThumbnailView.setVisibility(View.VISIBLE); + itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding, + commentVerticalPadding, commentVerticalPadding); + } else { + itemThumbnailView.setVisibility(View.GONE); + itemRoot.setPadding(commentHorizontalPadding, commentVerticalPadding, + commentHorizontalPadding, commentVerticalPadding); + } + itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item)); + + + // setup the top row, with pinned icon, author name and comment date + itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE); + itemTitleView.setText(Localization.concatenateStrings(item.getUploaderName(), + Localization.relativeTimeOrTextual(itemBuilder.getContext(), item.getUploadDate(), + item.getTextualUploadDate()))); + + + // setup bottom row, with likes, heart and replies button + itemLikesCountView.setText( + Localization.likeCount(itemBuilder.getContext(), item.getLikeCount())); + + itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); + + final boolean hasReplies = item.getReplies() != null; + repliesButton.setOnClickListener(hasReplies ? v -> openCommentReplies(item) : null); + repliesButton.setVisibility(hasReplies ? View.VISIBLE : View.GONE); + repliesButton.setText(hasReplies + ? Localization.replyCount(itemBuilder.getContext(), item.getReplyCount()) : ""); + ((RelativeLayout.LayoutParams) itemThumbsUpView.getLayoutParams()).topMargin = + hasReplies ? 0 : DeviceUtils.dpToPx(6, itemBuilder.getContext()); + + + // setup comment content and click listeners to expand/ellipsize it + textEllipsizer.setStreamingService(getServiceById(item.getServiceId())); + textEllipsizer.setStreamUrl(item.getUrl()); + textEllipsizer.setContent(item.getCommentText()); + textEllipsizer.ellipsize(); + + //noinspection ClickableViewAccessibility + itemContentView.setOnTouchListener((v, event) -> { + final CharSequence text = itemContentView.getText(); + if (text instanceof Spanned buffer) { + final int action = event.getAction(); + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + final int offset = getOffsetForHorizontalLine(itemContentView, event); + final var links = buffer.getSpans(offset, offset, ClickableSpan.class); + + if (links.length != 0) { + if (action == MotionEvent.ACTION_UP) { + links[0].onClick(itemContentView); + } + // we handle events that intersect links, so return true + return true; + } + } + } + return false; + }); + + itemView.setOnClickListener(view -> { + textEllipsizer.toggle(); + if (itemBuilder.getOnCommentsSelectedListener() != null) { + itemBuilder.getOnCommentsSelectedListener().selected(item); + } + }); + + itemView.setOnLongClickListener(view -> { + if (DeviceUtils.isTv(itemBuilder.getContext())) { + openCommentAuthor(item); + } else { + final CharSequence text = itemContentView.getText(); + if (text != null) { + ShareUtils.copyToClipboard(itemBuilder.getContext(), text.toString()); + } + } + return true; + }); + } + + private void openCommentAuthor(@NonNull final CommentsInfoItem item) { + NavigationHelper.openCommentAuthorIfPresent((FragmentActivity) itemBuilder.getContext(), + item); + } + + private void openCommentReplies(@NonNull final CommentsInfoItem item) { + NavigationHelper.openCommentRepliesFragment((FragmentActivity) itemBuilder.getContext(), + item); + } + + private void allowLinkFocus() { + itemContentView.setMovementMethod(LinkMovementMethod.getInstance()); + } + + private void denyLinkFocus() { + itemContentView.setMovementMethod(null); + } + + private boolean shouldFocusLinks() { + if (itemView.isInTouchMode()) { + return false; + } + + final URLSpan[] urls = itemContentView.getUrls(); + + return urls != null && urls.length != 0; + } + + private void determineMovementMethod() { + if (shouldFocusLinks()) { + allowLinkFocus(); + } else { + denyLinkFocus(); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java deleted file mode 100644 index 4fc2d9f84b8..00000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.schabi.newpipe.info_list.holder; - -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.comments.CommentsInfoItem; -import org.schabi.newpipe.info_list.InfoItemBuilder; -import org.schabi.newpipe.local.history.HistoryRecordManager; - -/* - * Created by Christian Schabesberger on 12.02.17. - * - * Copyright (C) Christian Schabesberger 2016 - * ChannelInfoItemHolder .java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - -public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder { - public final TextView itemTitleView; - private final ImageView itemHeartView; - private final ImageView itemPinnedView; - - public CommentsInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { - super(infoItemBuilder, R.layout.list_comments_item, parent); - - itemTitleView = itemView.findViewById(R.id.itemTitleView); - itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); - itemPinnedView = itemView.findViewById(R.id.detail_pinned_view); - } - - @Override - public void updateFromItem(final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - super.updateFromItem(infoItem, historyRecordManager); - - if (!(infoItem instanceof CommentsInfoItem)) { - return; - } - final CommentsInfoItem item = (CommentsInfoItem) infoItem; - - itemTitleView.setText(item.getUploaderName()); - - itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); - - itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java deleted file mode 100644 index 92e37afd8d4..00000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ /dev/null @@ -1,243 +0,0 @@ -package org.schabi.newpipe.info_list.holder; - -import android.text.TextUtils; -import android.text.method.LinkMovementMethod; -import android.text.style.URLSpan; -import android.text.util.Linkify; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.text.util.LinkifyCompat; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.error.ErrorUtil; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.comments.CommentsInfoItem; -import org.schabi.newpipe.info_list.InfoItemBuilder; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.CommentTextOnTouchListener; -import org.schabi.newpipe.util.DeviceUtils; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; -import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.external_communication.TimestampExtractor; - -import java.util.Objects; - -public class CommentsMiniInfoItemHolder extends InfoItemHolder { - private static final String TAG = "CommentsMiniIIHolder"; - - private static final int COMMENT_DEFAULT_LINES = 2; - private static final int COMMENT_EXPANDED_LINES = 1000; - - private final int commentHorizontalPadding; - private final int commentVerticalPadding; - - private final RelativeLayout itemRoot; - private final ImageView itemThumbnailView; - private final TextView itemContentView; - private final TextView itemLikesCountView; - private final TextView itemPublishedTime; - - private String commentText; - private String streamUrl; - - CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, - final ViewGroup parent) { - super(infoItemBuilder, layoutId, parent); - - itemRoot = itemView.findViewById(R.id.itemRoot); - itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); - itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); - itemPublishedTime = itemView.findViewById(R.id.itemPublishedTime); - itemContentView = itemView.findViewById(R.id.itemCommentContentView); - - commentHorizontalPadding = (int) infoItemBuilder.getContext() - .getResources().getDimension(R.dimen.comments_horizontal_padding); - commentVerticalPadding = (int) infoItemBuilder.getContext() - .getResources().getDimension(R.dimen.comments_vertical_padding); - } - - public CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, - final ViewGroup parent) { - this(infoItemBuilder, R.layout.list_comments_mini_item, parent); - } - - @Override - public void updateFromItem(final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - if (!(infoItem instanceof CommentsInfoItem)) { - return; - } - final CommentsInfoItem item = (CommentsInfoItem) infoItem; - - PicassoHelper.loadAvatar(item.getUploaderAvatarUrl()).into(itemThumbnailView); - if (PicassoHelper.getShouldLoadImages()) { - itemThumbnailView.setVisibility(View.VISIBLE); - itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding, - commentVerticalPadding, commentVerticalPadding); - } else { - itemThumbnailView.setVisibility(View.GONE); - itemRoot.setPadding(commentHorizontalPadding, commentVerticalPadding, - commentHorizontalPadding, commentVerticalPadding); - } - - - itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item)); - - streamUrl = item.getUrl(); - - itemContentView.setLines(COMMENT_DEFAULT_LINES); - commentText = item.getCommentText(); - itemContentView.setText(commentText, TextView.BufferType.SPANNABLE); - itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); - - if (itemContentView.getLineCount() == 0) { - itemContentView.post(this::ellipsize); - } else { - ellipsize(); - } - - if (item.getLikeCount() >= 0) { - itemLikesCountView.setText( - Localization.shortCount( - itemBuilder.getContext(), - item.getLikeCount())); - } else { - itemLikesCountView.setText("-"); - } - - if (item.getUploadDate() != null) { - itemPublishedTime.setText(Localization.relativeTime(item.getUploadDate() - .offsetDateTime())); - } else { - itemPublishedTime.setText(item.getTextualUploadDate()); - } - - itemView.setOnClickListener(view -> { - toggleEllipsize(); - if (itemBuilder.getOnCommentsSelectedListener() != null) { - itemBuilder.getOnCommentsSelectedListener().selected(item); - } - }); - - - itemView.setOnLongClickListener(view -> { - if (DeviceUtils.isTv(itemBuilder.getContext())) { - openCommentAuthor(item); - } else { - ShareUtils.copyToClipboard(itemBuilder.getContext(), commentText); - } - return true; - }); - } - - private void openCommentAuthor(final CommentsInfoItem item) { - if (TextUtils.isEmpty(item.getUploaderUrl())) { - return; - } - final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); - try { - NavigationHelper.openChannelFragment( - activity.getSupportFragmentManager(), - item.getServiceId(), - item.getUploaderUrl(), - item.getUploaderName()); - } catch (final Exception e) { - ErrorUtil.showUiErrorSnackbar(activity, "Opening channel fragment", e); - } - } - - private void allowLinkFocus() { - itemContentView.setMovementMethod(LinkMovementMethod.getInstance()); - } - - private void denyLinkFocus() { - itemContentView.setMovementMethod(null); - } - - private boolean shouldFocusLinks() { - if (itemView.isInTouchMode()) { - return false; - } - - final URLSpan[] urls = itemContentView.getUrls(); - - return urls != null && urls.length != 0; - } - - private void determineLinkFocus() { - if (shouldFocusLinks()) { - allowLinkFocus(); - } else { - denyLinkFocus(); - } - } - - private void ellipsize() { - boolean hasEllipsis = false; - - if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - final int endOfLastLine = itemContentView - .getLayout() - .getLineEnd(COMMENT_DEFAULT_LINES - 1); - int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine - 2); - if (end == -1) { - end = Math.max(endOfLastLine - 2, 0); - } - final String newVal = itemContentView.getText().subSequence(0, end) + " …"; - itemContentView.setText(newVal); - hasEllipsis = true; - } - - linkify(); - - if (hasEllipsis) { - denyLinkFocus(); - } else { - determineLinkFocus(); - } - } - - private void toggleEllipsize() { - if (itemContentView.getText().toString().equals(commentText)) { - if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - ellipsize(); - } - } else { - expand(); - } - } - - private void expand() { - itemContentView.setMaxLines(COMMENT_EXPANDED_LINES); - itemContentView.setText(commentText); - linkify(); - determineLinkFocus(); - } - - private void linkify() { - LinkifyCompat.addLinks(itemContentView, Linkify.WEB_URLS); - LinkifyCompat.addLinks(itemContentView, TimestampExtractor.TIMESTAMPS_PATTERN, null, null, - (match, url) -> { - try { - final var timestampMatch = TimestampExtractor - .getTimestampFromMatcher(match, commentText); - if (timestampMatch == null) { - return url; - } - return streamUrl + url.replace(Objects.requireNonNull(match.group(0)), - "#timestamp=" + timestampMatch.seconds()); - } catch (final Exception ex) { - Log.e(TAG, "Unable to process url='" + url + "' as timestampLink", ex); - return url; - } - }); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java new file mode 100644 index 00000000000..f1682b4e4d8 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.info_list.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.info_list.InfoItemBuilder; + +/** + * Playlist card layout. + */ +public class PlaylistCardInfoItemHolder extends PlaylistMiniInfoItemHolder { + + public PlaylistCardInfoItemHolder(final InfoItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java index bf5f57db3a7..c9216d9a9e5 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java @@ -9,7 +9,7 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; public class PlaylistMiniInfoItemHolder extends InfoItemHolder { @@ -46,7 +46,7 @@ public void updateFromItem(final InfoItem infoItem, .localizeStreamCountMini(itemStreamCountView.getContext(), item.getStreamCount())); itemUploaderView.setText(item.getUploaderName()); - PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + PicassoHelper.loadPlaylistThumbnail(item.getThumbnails()).into(itemThumbnailView); itemView.setOnClickListener(view -> { if (itemBuilder.getOnPlaylistSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java new file mode 100644 index 00000000000..807bad6e06e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java @@ -0,0 +1,16 @@ +package org.schabi.newpipe.info_list.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.info_list.InfoItemBuilder; + +/** + * Card layout for stream. + */ +public class StreamCardInfoItemHolder extends StreamInfoItemHolder { + + public StreamCardInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_stream_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java index a84c9840416..80f62eed3d1 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java @@ -12,10 +12,6 @@ import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; -import androidx.preference.PreferenceManager; - -import static org.schabi.newpipe.MainActivity.DEBUG; - /* * Created by Christian Schabesberger on 01.08.16. *

@@ -81,7 +77,9 @@ private String getStreamInfoDetailLine(final StreamInfoItem infoItem) { } } - final String uploadDate = getFormattedRelativeUploadDate(infoItem); + final String uploadDate = Localization.relativeTimeOrTextual(itemBuilder.getContext(), + infoItem.getUploadDate(), + infoItem.getTextualUploadDate()); if (!TextUtils.isEmpty(uploadDate)) { if (viewsAndDate.isEmpty()) { return uploadDate; @@ -92,20 +90,4 @@ private String getStreamInfoDetailLine(final StreamInfoItem infoItem) { return viewsAndDate; } - - private String getFormattedRelativeUploadDate(final StreamInfoItem infoItem) { - if (infoItem.getUploadDate() != null) { - String formattedRelativeTime = Localization - .relativeTime(infoItem.getUploadDate().offsetDateTime()); - - if (DEBUG && PreferenceManager.getDefaultSharedPreferences(itemBuilder.getContext()) - .getBoolean(itemBuilder.getContext() - .getString(R.string.show_original_time_ago_key), false)) { - formattedRelativeTime += " (" + infoItem.getTextualUploadDate() + ")"; - } - return formattedRelativeTime; - } else { - return infoItem.getTextualUploadDate(); - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index 8d17017d217..01f3be6b328 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -14,8 +14,9 @@ import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.StreamTypeUtil; import org.schabi.newpipe.views.AnimatedProgressBar; @@ -60,8 +61,12 @@ public void updateFromItem(final InfoItem infoItem, R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - final StreamStateEntity state2 = historyRecordManager.loadStreamState(infoItem) - .blockingGet()[0]; + StreamStateEntity state2 = null; + if (DependentPreferenceHelper + .getPositionsInListsEnabled(itemProgressView.getContext())) { + state2 = historyRecordManager.loadStreamState(infoItem) + .blockingGet()[0]; + } if (state2 != null) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getDuration()); @@ -82,7 +87,7 @@ public void updateFromItem(final InfoItem infoItem, } // Default thumbnail is shown on error, while loading and if the url is empty - PicassoHelper.loadThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + PicassoHelper.loadThumbnail(item.getThumbnails()).into(itemThumbnailView); itemView.setOnClickListener(view -> { if (itemBuilder.getOnStreamSelectedListener() != null) { @@ -111,9 +116,12 @@ public void updateState(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { final StreamInfoItem item = (StreamInfoItem) infoItem; - final StreamStateEntity state = historyRecordManager - .loadStreamState(infoItem) - .blockingGet()[0]; + StreamStateEntity state = null; + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())) { + state = historyRecordManager + .loadStreamState(infoItem) + .blockingGet()[0]; + } if (state != null && item.getDuration() > 0 && !StreamTypeUtil.isLiveStream(item.getStreamType())) { itemProgressView.setMax((int) item.getDuration()); diff --git a/app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt b/app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt new file mode 100644 index 00000000000..61721d5467c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt @@ -0,0 +1,9 @@ +package org.schabi.newpipe.ktx + +import android.os.Bundle +import android.os.Parcelable +import androidx.core.os.BundleCompat + +inline fun Bundle.parcelableArrayList(key: String?): ArrayList? { + return BundleCompat.getParcelableArrayList(this, key, T::class.java) +} diff --git a/app/src/main/java/org/schabi/newpipe/ktx/SharedPreferences.kt b/app/src/main/java/org/schabi/newpipe/ktx/SharedPreferences.kt new file mode 100644 index 00000000000..ff406fc91c3 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/ktx/SharedPreferences.kt @@ -0,0 +1,7 @@ +package org.schabi.newpipe.ktx + +import android.content.SharedPreferences + +fun SharedPreferences.getStringSafe(key: String, defValue: String): String { + return getString(key, null) ?: defValue +} diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 7474537fafb..53fe1677bf8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -22,10 +22,11 @@ import org.schabi.newpipe.databinding.PignateFooterBinding; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.list.ListViewContract; +import org.schabi.newpipe.info_list.ItemViewMode; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; -import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout; +import static org.schabi.newpipe.util.ThemeHelper.getItemViewMode; /** * This fragment is design to be used with persistent data such as @@ -77,16 +78,23 @@ public void onResume() { super.onResume(); if (updateFlags != 0) { if ((updateFlags & LIST_MODE_UPDATE_FLAG) != 0) { - final boolean useGrid = shouldUseGridLayout(requireContext()); - itemsList.setLayoutManager( - useGrid ? getGridLayoutManager() : getListLayoutManager()); - itemListAdapter.setUseGridVariant(useGrid); - itemListAdapter.notifyDataSetChanged(); + refreshItemViewMode(); } updateFlags = 0; } } + /** + * Updates the item view mode based on user preference. + */ + private void refreshItemViewMode() { + final ItemViewMode itemViewMode = getItemViewMode(requireContext()); + itemsList.setLayoutManager((itemViewMode == ItemViewMode.GRID) + ? getGridLayoutManager() : getListLayoutManager()); + itemListAdapter.setItemViewMode(itemViewMode); + itemListAdapter.notifyDataSetChanged(); + } + /*////////////////////////////////////////////////////////////////////////// // Lifecycle - View //////////////////////////////////////////////////////////////////////////*/ @@ -120,11 +128,9 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { itemListAdapter = new LocalItemListAdapter(activity); - final boolean useGrid = shouldUseGridLayout(requireContext()); itemsList = rootView.findViewById(R.id.items_list); - itemsList.setLayoutManager(useGrid ? getGridLayoutManager() : getListLayoutManager()); + refreshItemViewMode(); - itemListAdapter.setUseGridVariant(useGrid); headerRootBinding = getListHeader(); if (headerRootBinding != null) { itemListAdapter.setHeader(headerRootBinding.getRoot()); @@ -255,7 +261,7 @@ public void handleError() { @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { - if (key.equals(getString(R.string.list_view_mode_key))) { + if (getString(R.string.list_view_mode_key).equals(key)) { updateFlags |= LIST_MODE_UPDATE_FLAG; } } diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 05e2fdac083..b33619dea7a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -12,14 +12,21 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.stream.model.StreamStateEntity; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.local.holder.LocalBookmarkPlaylistItemHolder; import org.schabi.newpipe.local.holder.LocalItemHolder; +import org.schabi.newpipe.local.holder.LocalPlaylistCardItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistGridItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistItemHolder; +import org.schabi.newpipe.local.holder.LocalPlaylistStreamCardItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistStreamGridItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistStreamItemHolder; +import org.schabi.newpipe.local.holder.LocalStatisticStreamCardItemHolder; import org.schabi.newpipe.local.holder.LocalStatisticStreamGridItemHolder; import org.schabi.newpipe.local.holder.LocalStatisticStreamItemHolder; +import org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder; +import org.schabi.newpipe.local.holder.RemotePlaylistCardItemHolder; import org.schabi.newpipe.local.holder.RemotePlaylistGridItemHolder; import org.schabi.newpipe.local.holder.RemotePlaylistItemHolder; import org.schabi.newpipe.util.FallbackViewHolder; @@ -61,11 +68,19 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems; @@ -73,9 +88,10 @@ public class LocalItemListAdapter extends RecyclerView.Adapter, Void> { +public final class BookmarkFragment extends BaseLocalListFragment, Void> + implements DebounceSavable { + + private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State - protected Parcelable itemsListState; + Parcelable itemsListState; private Subscription databaseSubscription; private CompositeDisposable disposables = new CompositeDisposable(); private LocalPlaylistManager localPlaylistManager; private RemotePlaylistManager remotePlaylistManager; + private ItemTouchHelper itemTouchHelper; + + /* Have the bookmarked playlists been fully loaded from db */ + private AtomicBoolean isLoadingComplete; + + /* Gives enough time to avoid interrupting user sorting operations */ + @Nullable + private DebounceSaver debounceSaver; + + private List> deletedItems; /////////////////////////////////////////////////////////////////////////// // Fragment LifeCycle - Creation @@ -65,6 +87,11 @@ public void onCreate(final Bundle savedInstanceState) { localPlaylistManager = new LocalPlaylistManager(database); remotePlaylistManager = new RemotePlaylistManager(database); disposables = new CompositeDisposable(); + + isLoadingComplete = new AtomicBoolean(); + debounceSaver = new DebounceSaver(3000, this); + + deletedItems = new ArrayList<>(); } @Nullable @@ -94,12 +121,17 @@ public void onResume() { @Override protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); + + itemListAdapter.setUseItemHandle(true); } @Override protected void initListeners() { super.initListeners(); + itemTouchHelper = new ItemTouchHelper(getItemTouchCallback()); + itemTouchHelper.attachToRecyclerView(itemsList); + itemListAdapter.setSelectedListener(new OnClickGesture<>() { @Override public void selected(final LocalItem selectedItem) { @@ -107,7 +139,7 @@ public void selected(final LocalItem selectedItem) { if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.uid, + NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.getUid(), entry.name); } else if (selectedItem instanceof PlaylistRemoteEntity) { @@ -128,6 +160,14 @@ public void held(final LocalItem selectedItem) { showRemoteDeleteDialog((PlaylistRemoteEntity) selectedItem); } } + + @Override + public void drag(final LocalItem selectedItem, + final RecyclerView.ViewHolder viewHolder) { + if (itemTouchHelper != null) { + itemTouchHelper.startDrag(viewHolder); + } + } }); } @@ -139,8 +179,13 @@ public void held(final LocalItem selectedItem) { public void startLoading(final boolean forceLoad) { super.startLoading(forceLoad); - Flowable.combineLatest(localPlaylistManager.getPlaylists(), - remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) + if (debounceSaver != null) { + disposables.add(debounceSaver.getDebouncedSaver()); + debounceSaver.setNoChangesToSave(); + } + isLoadingComplete.set(false); + + getMergedOrderedPlaylists(localPlaylistManager, remotePlaylistManager) .onBackpressureLatest() .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistsSubscriber()); @@ -154,6 +199,9 @@ public void startLoading(final boolean forceLoad) { public void onPause() { super.onPause(); itemsListState = itemsList.getLayoutManager().onSaveInstanceState(); + + // Save on exit + saveImmediate(); } @Override @@ -168,19 +216,27 @@ public void onDestroyView() { } databaseSubscription = null; + itemTouchHelper = null; } @Override public void onDestroy() { super.onDestroy(); + if (debounceSaver != null) { + debounceSaver.getDebouncedSaveSignal().onComplete(); + } if (disposables != null) { disposables.dispose(); } + debounceSaver = null; disposables = null; localPlaylistManager = null; remotePlaylistManager = null; itemsListState = null; + + isLoadingComplete = null; + deletedItems = null; } /////////////////////////////////////////////////////////////////////////// @@ -188,10 +244,12 @@ public void onDestroy() { /////////////////////////////////////////////////////////////////////////// private Subscriber> getPlaylistsSubscriber() { - return new Subscriber>() { + return new Subscriber<>() { @Override public void onSubscribe(final Subscription s) { showLoading(); + isLoadingComplete.set(false); + if (databaseSubscription != null) { databaseSubscription.cancel(); } @@ -201,7 +259,10 @@ public void onSubscribe(final Subscription s) { @Override public void onNext(final List subscriptions) { - handleResult(subscriptions); + if (debounceSaver == null || !debounceSaver.getIsModified()) { + handleResult(subscriptions); + isLoadingComplete.set(true); + } if (databaseSubscription != null) { databaseSubscription.request(1); } @@ -214,7 +275,8 @@ public void onError(final Throwable exception) { } @Override - public void onComplete() { } + public void onComplete() { + } }; } @@ -249,12 +311,183 @@ protected void resetFragment() { } } + /*////////////////////////////////////////////////////////////////////////// + // Playlist Metadata Manipulation + //////////////////////////////////////////////////////////////////////////*/ + + private void changeLocalPlaylistName(final long id, final String name) { + if (localPlaylistManager == null) { + return; + } + + if (DEBUG) { + Log.d(TAG, "Updating playlist id=[" + id + "] " + + "with new name=[" + name + "] items"); + } + + final Disposable disposable = localPlaylistManager.renamePlaylist(id, name) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( + new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, + "Changing playlist name"))); + disposables.add(disposable); + } + + private void deleteItem(final PlaylistLocalItem item) { + if (itemListAdapter == null) { + return; + } + itemListAdapter.removeItem(item); + + if (item instanceof PlaylistMetadataEntry) { + deletedItems.add(new Pair<>(item.getUid(), + LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)); + } else if (item instanceof PlaylistRemoteEntity) { + deletedItems.add(new Pair<>(item.getUid(), + LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)); + } + + if (debounceSaver != null) { + debounceSaver.setHasChangesToSave(); + saveImmediate(); + } + } + + @Override + public void saveImmediate() { + if (itemListAdapter == null) { + return; + } + + // List must be loaded and modified in order to save + if (isLoadingComplete == null || debounceSaver == null + || !isLoadingComplete.get() || !debounceSaver.getIsModified()) { + return; + } + + final List items = itemListAdapter.getItemsList(); + final List localItemsUpdate = new ArrayList<>(); + final List localItemsDeleteUid = new ArrayList<>(); + final List remoteItemsUpdate = new ArrayList<>(); + final List remoteItemsDeleteUid = new ArrayList<>(); + + // Calculate display index + for (int i = 0; i < items.size(); i++) { + final LocalItem item = items.get(i); + + if (item instanceof PlaylistMetadataEntry + && ((PlaylistMetadataEntry) item).getDisplayIndex() != i) { + ((PlaylistMetadataEntry) item).setDisplayIndex(i); + localItemsUpdate.add((PlaylistMetadataEntry) item); + } else if (item instanceof PlaylistRemoteEntity + && ((PlaylistRemoteEntity) item).getDisplayIndex() != i) { + ((PlaylistRemoteEntity) item).setDisplayIndex(i); + remoteItemsUpdate.add((PlaylistRemoteEntity) item); + } + } + + // Find deleted items + for (final Pair item : deletedItems) { + if (item.second.equals(LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)) { + localItemsDeleteUid.add(item.first); + } else if (item.second.equals(LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)) { + remoteItemsDeleteUid.add(item.first); + } + } + + deletedItems.clear(); + + // 1. Update local playlists + // 2. Update remote playlists + // 3. Set NoChangesToSave + disposables.add(localPlaylistManager.updatePlaylists(localItemsUpdate, localItemsDeleteUid) + .mergeWith(remotePlaylistManager.updatePlaylists( + remoteItemsUpdate, remoteItemsDeleteUid)) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> { + if (debounceSaver != null) { + debounceSaver.setNoChangesToSave(); + } + }, + throwable -> showError(new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, "Saving playlist")) + )); + + } + + private ItemTouchHelper.SimpleCallback getItemTouchCallback() { + // if adding grid layout, also include ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT + // with an `if (shouldUseGridLayout()) ...` + return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, + ItemTouchHelper.ACTION_STATE_IDLE) { + @Override + public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView, + final int viewSize, + final int viewSizeOutOfBounds, + final int totalSize, + final long msSinceStartScroll) { + final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView, + viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll); + final int minimumAbsVelocity = Math.max(MINIMUM_INITIAL_DRAG_VELOCITY, + Math.abs(standardSpeed)); + return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds); + } + + @Override + public boolean onMove(@NonNull final RecyclerView recyclerView, + @NonNull final RecyclerView.ViewHolder source, + @NonNull final RecyclerView.ViewHolder target) { + + // Allow swap LocalBookmarkPlaylistItemHolder and RemoteBookmarkPlaylistItemHolder. + if (itemListAdapter == null + || source.getItemViewType() != target.getItemViewType() + && !( + ( + (source instanceof LocalBookmarkPlaylistItemHolder) + || (source instanceof RemoteBookmarkPlaylistItemHolder) + ) + && ( + (target instanceof LocalBookmarkPlaylistItemHolder) + || (target instanceof RemoteBookmarkPlaylistItemHolder) + )) + ) { + return false; + } + + final int sourceIndex = source.getBindingAdapterPosition(); + final int targetIndex = target.getBindingAdapterPosition(); + final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); + if (isSwapped && debounceSaver != null) { + debounceSaver.setHasChangesToSave(); + } + return isSwapped; + } + + @Override + public boolean isLongPressDragEnabled() { + return false; + } + + @Override + public boolean isItemViewSwipeEnabled() { + return false; + } + + @Override + public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, + final int swipeDir) { + // Do nothing. + } + }; + } + /////////////////////////////////////////////////////////////////////////// // Utils /////////////////////////////////////////////////////////////////////////// private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) { - showDeleteDialog(item.getName(), remotePlaylistManager.deletePlaylist(item.getUid())); + showDeleteDialog(item.getName(), item); } private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { @@ -262,9 +495,7 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { final String delete = getString(R.string.delete); final String unsetThumbnail = getString(R.string.unset_playlist_thumbnail); final boolean isThumbnailPermanent = localPlaylistManager - .getIsPlaylistThumbnailPermanent(selectedItem.uid); - - final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + .getIsPlaylistThumbnailPermanent(selectedItem.getUid()); final ArrayList items = new ArrayList<>(); items.add(rename); @@ -277,19 +508,20 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { if (items.get(index).equals(rename)) { showRenameDialog(selectedItem); } else if (items.get(index).equals(delete)) { - showDeleteDialog(selectedItem.name, - localPlaylistManager.deletePlaylist(selectedItem.uid)); + showDeleteDialog(selectedItem.name, selectedItem); } else if (isThumbnailPermanent && items.get(index).equals(unsetThumbnail)) { - final String thumbnailUrl = localPlaylistManager - .getAutomaticPlaylistThumbnail(selectedItem.uid); + final long thumbnailStreamId = localPlaylistManager + .getAutomaticPlaylistThumbnailStreamId(selectedItem.getUid()); localPlaylistManager - .changePlaylistThumbnail(selectedItem.uid, thumbnailUrl, false) + .changePlaylistThumbnail(selectedItem.getUid(), thumbnailStreamId, false) .observeOn(AndroidSchedulers.mainThread()) .subscribe(); } }; - 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,18 +531,17 @@ 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, + selectedItem.getUid(), dialogBinding.dialogEditText.getText().toString())) .setNegativeButton(R.string.cancel, null) - .create() .show(); } - private void showDeleteDialog(final String name, final Single deleteReactor) { + private void showDeleteDialog(final String name, final PlaylistLocalItem item) { if (activity == null || disposables == null) { return; } @@ -319,35 +550,8 @@ private void showDeleteDialog(final String name, final Single deleteRea .setTitle(name) .setMessage(R.string.delete_playlist_prompt) .setCancelable(true) - .setPositiveButton(R.string.delete, (dialog, i) -> - disposables.add(deleteReactor - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> { /*Do nothing on success*/ }, throwable -> - showError(new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Deleting playlist"))))) + .setPositiveButton(R.string.delete, (dialog, i) -> deleteItem(item)) .setNegativeButton(R.string.cancel, null) .show(); } - - private void changeLocalPlaylistName(final long id, final String name) { - if (localPlaylistManager == null) { - return; - } - - if (DEBUG) { - Log.d(TAG, "Updating playlist id=[" + id + "] " - + "with new name=[" + name + "] items"); - } - - localPlaylistManager.renamePlaylist(id, name); - final Disposable disposable = localPlaylistManager.renamePlaylist(id, name) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( - new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Changing playlist name"))); - disposables.add(disposable); - } } - diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/MergedPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/MergedPlaylistManager.java new file mode 100644 index 00000000000..25eb2f65226 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/MergedPlaylistManager.java @@ -0,0 +1,95 @@ +package org.schabi.newpipe.local.bookmark; + +import org.schabi.newpipe.database.playlist.PlaylistLocalItem; +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; +import org.schabi.newpipe.local.playlist.LocalPlaylistManager; +import org.schabi.newpipe.local.playlist.RemotePlaylistManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import io.reactivex.rxjava3.core.Flowable; + +/** + * Takes care of remote and local playlists at once, hence "merged". + */ +public final class MergedPlaylistManager { + + private MergedPlaylistManager() { + } + + public static Flowable> getMergedOrderedPlaylists( + final LocalPlaylistManager localPlaylistManager, + final RemotePlaylistManager remotePlaylistManager) { + return Flowable.combineLatest( + localPlaylistManager.getPlaylists(), + remotePlaylistManager.getPlaylists(), + MergedPlaylistManager::merge + ); + } + + /** + * Merge localPlaylists and remotePlaylists by the display index. + * If two items have the same display index, sort them in {@code CASE_INSENSITIVE_ORDER}. + * + * @param localPlaylists local playlists, already sorted by display index + * @param remotePlaylists remote playlists, already sorted by display index + * @return merged playlists + */ + public static List merge( + final List localPlaylists, + final List remotePlaylists) { + + // This algorithm is similar to the merge operation in merge sort. + final List result = new ArrayList<>( + localPlaylists.size() + remotePlaylists.size()); + final List itemsWithSameIndex = new ArrayList<>(); + + int i = 0; + int j = 0; + while (i < localPlaylists.size()) { + while (j < remotePlaylists.size()) { + if (remotePlaylists.get(j).getDisplayIndex() + <= localPlaylists.get(i).getDisplayIndex()) { + addItem(result, remotePlaylists.get(j), itemsWithSameIndex); + j++; + } else { + break; + } + } + addItem(result, localPlaylists.get(i), itemsWithSameIndex); + i++; + } + while (j < remotePlaylists.size()) { + addItem(result, remotePlaylists.get(j), itemsWithSameIndex); + j++; + } + addItemsWithSameIndex(result, itemsWithSameIndex); + + return result; + } + + private static void addItem(final List result, + final PlaylistLocalItem item, + final List itemsWithSameIndex) { + if (!itemsWithSameIndex.isEmpty() + && itemsWithSameIndex.get(0).getDisplayIndex() != item.getDisplayIndex()) { + // The new item has a different display index, add previous items with same + // index to the result. + addItemsWithSameIndex(result, itemsWithSameIndex); + itemsWithSameIndex.clear(); + } + itemsWithSameIndex.add(item); + } + + private static void addItemsWithSameIndex(final List result, + final List itemsWithSameIndex) { + Collections.sort(itemsWithSameIndex, + Comparator.comparing(PlaylistLocalItem::getOrderingName, + Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); + result.addAll(itemsWithSameIndex); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 88dec3911a5..478ef8039fe 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -4,6 +4,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; @@ -13,7 +14,8 @@ import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistEntity; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.local.LocalItemListAdapter; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; @@ -28,6 +30,7 @@ public final class PlaylistAppendDialog extends PlaylistDialog { private RecyclerView playlistRecyclerView; private LocalItemListAdapter playlistAdapter; + private TextView playlistDuplicateIndicator; private final CompositeDisposable playlistDisposables = new CompositeDisposable(); @@ -63,8 +66,9 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved playlistAdapter = new LocalItemListAdapter(getActivity()); playlistAdapter.setSelectedListener(selectedItem -> { final List entities = getStreamEntities(); - if (selectedItem instanceof PlaylistMetadataEntry && entities != null) { - onPlaylistSelected(playlistManager, (PlaylistMetadataEntry) selectedItem, entities); + if (selectedItem instanceof PlaylistDuplicatesEntry && entities != null) { + onPlaylistSelected(playlistManager, + (PlaylistDuplicatesEntry) selectedItem, entities); } }); @@ -72,10 +76,13 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved playlistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); playlistRecyclerView.setAdapter(playlistAdapter); + playlistDuplicateIndicator = view.findViewById(R.id.playlist_duplicate); + final View newPlaylistButton = view.findViewById(R.id.newPlaylist); newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog()); - playlistDisposables.add(playlistManager.getPlaylists() + playlistDisposables.add(playlistManager + .getPlaylistDuplicates(getStreamEntities().get(0).getUrl()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::onPlaylistsReceived)); } @@ -117,31 +124,51 @@ public void openCreatePlaylistDialog() { requireDialog().dismiss(); } - private void onPlaylistsReceived(@NonNull final List playlists) { - if (playlistAdapter != null && playlistRecyclerView != null) { + private void onPlaylistsReceived(@NonNull final List playlists) { + if (playlistAdapter != null + && playlistRecyclerView != null + && playlistDuplicateIndicator != null) { playlistAdapter.clearStreamItemList(); playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); + playlistDuplicateIndicator.setVisibility( + anyPlaylistContainsDuplicates(playlists) ? View.VISIBLE : View.GONE); } } + private boolean anyPlaylistContainsDuplicates(final List playlists) { + return playlists.stream() + .anyMatch(playlist -> playlist.timesStreamIsContained > 0); + } + private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, - @NonNull final PlaylistMetadataEntry playlist, + @NonNull final PlaylistDuplicatesEntry playlist, @NonNull final List streams) { - final Toast successToast = Toast.makeText(getContext(), - R.string.playlist_add_stream_success, Toast.LENGTH_SHORT); - - if (playlist.thumbnailUrl - .equals("drawable://" + R.drawable.placeholder_thumbnail_playlist)) { - playlistDisposables.add(manager - .changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl(), false) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> successToast.show())); + + final String toastText; + if (playlist.timesStreamIsContained > 0) { + toastText = getString(R.string.playlist_add_stream_success_duplicate, + playlist.timesStreamIsContained); + } else { + toastText = getString(R.string.playlist_add_stream_success); } - playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams) + final Toast successToast = Toast.makeText(getContext(), toastText, Toast.LENGTH_SHORT); + + playlistDisposables.add(manager.appendToPlaylist(playlist.getUid(), streams) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> successToast.show())); + .subscribe(ignored -> { + successToast.show(); + + if (playlist.thumbnailUrl != null + && playlist.thumbnailUrl.equals(PlaylistEntity.DEFAULT_THUMBNAIL)) { + playlistDisposables.add(manager + .changePlaylistThumbnail(playlist.getUid(), streams.get(0).getUid(), + false) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(ignore -> successToast.show())); + } + })); requireDialog().dismiss(); } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt index 07edb04997d..ed65d4048e8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt @@ -43,11 +43,13 @@ class FeedDatabaseManager(context: Context) { fun getStreams( groupId: Long, includePlayedStreams: Boolean, + includePartiallyPlayedStreams: Boolean, includeFutureStreams: Boolean ): Maybe> { return feedTable.getStreams( groupId, includePlayedStreams, + includePartiallyPlayedStreams, if (includeFutureStreams) null else OffsetDateTime.now() ) } 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 b3442d3dcde..61eb4c8d201 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 @@ -36,23 +36,19 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.Button -import androidx.annotation.Nullable import androidx.appcompat.app.AlertDialog -import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.edit -import androidx.core.math.MathUtils import androidx.core.os.bundleOf -import androidx.core.view.MenuItemCompat import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.evernote.android.state.State import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.Item import com.xwray.groupie.OnItemClickListener import com.xwray.groupie.OnItemLongClickListener -import icepick.State import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable @@ -63,12 +59,14 @@ import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.databinding.FragmentFeedBinding import org.schabi.newpipe.error.ErrorInfo +import org.schabi.newpipe.error.ErrorUtil import org.schabi.newpipe.error.UserAction import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty import org.schabi.newpipe.fragments.BaseStateFragment +import org.schabi.newpipe.info_list.ItemViewMode import org.schabi.newpipe.info_list.dialog.InfoItemDialog import org.schabi.newpipe.ktx.animate import org.schabi.newpipe.ktx.animateHideRecyclerViewAllowingScrolling @@ -80,6 +78,7 @@ import org.schabi.newpipe.util.DeviceUtils import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NavigationHelper import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountStreams +import org.schabi.newpipe.util.ThemeHelper.getItemViewMode import org.schabi.newpipe.util.ThemeHelper.resolveDrawable import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout import java.time.OffsetDateTime @@ -99,8 +98,6 @@ class FeedFragment : BaseStateFragment() { private var oldestSubscriptionUpdate: OffsetDateTime? = null private lateinit var groupAdapter: GroupieAdapter - @State @JvmField var showPlayedItems: Boolean = true - @State @JvmField var showFutureItems: Boolean = true private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null private var updateListViewModeOnResume = false @@ -120,7 +117,7 @@ class FeedFragment : BaseStateFragment() { groupName = arguments?.getString(KEY_GROUP_NAME) ?: "" onSettingsChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> - if (key.equals(getString(R.string.list_view_mode_key))) { + if (getString(R.string.list_view_mode_key).equals(key)) { updateListViewModeOnResume = true } } @@ -139,8 +136,6 @@ class FeedFragment : BaseStateFragment() { val factory = FeedViewModel.getFactory(requireContext(), groupId) viewModel = ViewModelProvider(this, factory)[FeedViewModel::class.java] - showPlayedItems = viewModel.getShowPlayedItemsFromPreferences() - showFutureItems = viewModel.getShowFutureItemsFromPreferences() viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) } groupAdapter = GroupieAdapter().apply { @@ -215,8 +210,6 @@ class FeedFragment : BaseStateFragment() { activity.supportActionBar?.subtitle = groupName inflater.inflate(R.menu.menu_feed_fragment, menu) - updateTogglePlayedItemsButton(menu.findItem(R.id.menu_item_feed_toggle_played_items)) - updateToggleFutureItemsButton(menu.findItem(R.id.menu_item_feed_toggle_future_items)) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -238,24 +231,42 @@ 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) { - showPlayedItems = !item.isChecked - updateTogglePlayedItemsButton(item) - viewModel.togglePlayedItems(showPlayedItems) - viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) - } else if (item.itemId == R.id.menu_item_feed_toggle_future_items) { - showFutureItems = !item.isChecked - updateToggleFutureItemsButton(item) - viewModel.toggleFutureItems(showFutureItems) - viewModel.saveShowFutureItemsToPreferences(showFutureItems) + showStreamVisibilityDialog() } return super.onOptionsItemSelected(item) } + private fun showStreamVisibilityDialog() { + val dialogItems = arrayOf( + getString(R.string.feed_show_watched), + getString(R.string.feed_show_partially_watched), + getString(R.string.feed_show_upcoming) + ) + + val checkedDialogItems = booleanArrayOf( + viewModel.getShowPlayedItemsFromPreferences(), + viewModel.getShowPartiallyPlayedItemsFromPreferences(), + viewModel.getShowFutureItemsFromPreferences() + ) + + 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() { super.onDestroyOptionsMenu() activity?.supportActionBar?.subtitle = null @@ -282,40 +293,6 @@ class FeedFragment : BaseStateFragment() { super.onDestroyView() } - private fun updateTogglePlayedItemsButton(menuItem: MenuItem) { - menuItem.isChecked = showPlayedItems - menuItem.icon = AppCompatResources.getDrawable( - requireContext(), - if (showPlayedItems) R.drawable.ic_visibility_on else R.drawable.ic_visibility_off - ) - MenuItemCompat.setTooltipText( - menuItem, - getString( - if (showPlayedItems) - R.string.feed_toggle_hide_played_items - else - R.string.feed_toggle_show_played_items - ) - ) - } - - private fun updateToggleFutureItemsButton(menuItem: MenuItem) { - menuItem.isChecked = showFutureItems - menuItem.icon = AppCompatResources.getDrawable( - requireContext(), - if (showFutureItems) R.drawable.ic_history_future else R.drawable.ic_history - ) - MenuItemCompat.setTooltipText( - menuItem, - getString( - if (showFutureItems) - R.string.feed_toggle_hide_future_items - else - R.string.feed_toggle_show_future_items - ) - ) - } - // ////////////////////////////////////////////////////////////////////////// // Handling // ////////////////////////////////////////////////////////////////////////// @@ -416,11 +393,10 @@ class FeedFragment : BaseStateFragment() { @SuppressLint("StringFormatMatches") private fun handleLoadedState(loadedState: FeedState.LoadedState) { - - val itemVersion = if (shouldUseGridLayout(context)) { - StreamItem.ItemVersion.GRID - } else { - StreamItem.ItemVersion.NORMAL + val itemVersion = when (getItemViewMode(requireContext())) { + ItemViewMode.GRID -> StreamItem.ItemVersion.GRID + ItemViewMode.CARD -> StreamItem.ItemVersion.CARD + else -> StreamItem.ItemVersion.NORMAL } loadedState.items.forEach { it.itemVersion = itemVersion } @@ -477,29 +453,38 @@ class FeedFragment : BaseStateFragment() { if (t is FeedLoadService.RequestException && t.cause is ContentNotAvailableException ) { - Single.fromCallable { - NewPipeDatabase.getInstance(requireContext()).subscriptionDAO() - .getSubscription(t.subscriptionId) - }.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { subscriptionEntity -> - handleFeedNotAvailable( - subscriptionEntity, - t.cause, - errors.subList(i + 1, errors.size) - ) - }, - { throwable -> Log.e(TAG, "Unable to process", throwable) } - ) - return // this will be called on the remaining errors by handleFeedNotAvailable() + disposables.add( + Single.fromCallable { + NewPipeDatabase.getInstance(requireContext()).subscriptionDAO() + .getSubscription(t.subscriptionId) + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { subscriptionEntity -> + handleFeedNotAvailable( + subscriptionEntity, + t.cause, + errors.subList(i + 1, errors.size) + ) + }, + { throwable -> Log.e(TAG, "Unable to process", throwable) } + ) + ) + // this will be called on the remaining errors by handleFeedNotAvailable() + return@handleItemsErrors } } + + if (errors.isNotEmpty()) { + // if no error was a ContentNotAvailableException, show a general error snackbar + ErrorUtil.showSnackbar(this, ErrorInfo(errors, UserAction.REQUESTED_FEED, "")) + } } private fun handleFeedNotAvailable( subscriptionEntity: SubscriptionEntity, - @Nullable cause: Throwable?, + cause: Throwable?, nextItemsErrors: List ) { val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) @@ -509,15 +494,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) { @@ -534,7 +517,8 @@ class FeedFragment : BaseStateFragment() { message += "\n" + cause.message } } - builder.setMessage(message).create().show() + builder.setMessage(message) + .show() } private fun updateRelativeTimeViews() { @@ -565,7 +549,7 @@ class FeedFragment : BaseStateFragment() { var typeface = Typeface.DEFAULT var backgroundSupplier = { ctx: Context -> - resolveDrawable(ctx, R.attr.selectableItemBackground) + resolveDrawable(ctx, android.R.attr.selectableItemBackground) } if (doCheck) { // If the uploadDate is null or true we should highlight the item @@ -578,7 +562,7 @@ class FeedFragment : BaseStateFragment() { LayerDrawable( arrayOf( resolveDrawable(ctx, R.attr.dashed_border), - resolveDrawable(ctx, R.attr.selectableItemBackground) + resolveDrawable(ctx, android.R.attr.selectableItemBackground) ) ) } @@ -604,7 +588,7 @@ class FeedFragment : BaseStateFragment() { // state until the user scrolls them out of the visible area which causes a update/bind-call groupAdapter.notifyItemRangeChanged( 0, - MathUtils.clamp(highlightCount, lastNewItemsCount, groupAdapter.itemCount) + highlightCount.coerceIn(lastNewItemsCount, groupAdapter.itemCount) ) if (highlightCount > 0) { @@ -623,9 +607,13 @@ class FeedFragment : BaseStateFragment() { execOnEnd = { // Disabled animations would result in immediately hiding the button // after it showed up - if (DeviceUtils.hasAnimationsAnimatorDurationEnabled(context)) { - // Hide the new items-"popup" after 10s - hideNewItemsLoaded(true, 10000) + // Context can be null in some cases, so we have to make sure it is not null in + // order to avoid a NullPointerException + context?.let { + if (DeviceUtils.hasAnimationsAnimatorDurationEnabled(it)) { + // Hide the new items button after 10s + hideNewItemsLoaded(true, 10000) + } } } ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt index 27613e83e9c..665ebbe4396 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt @@ -13,9 +13,9 @@ sealed class FeedState { data class LoadedState( val items: List, - val oldestUpdate: OffsetDateTime? = null, + val oldestUpdate: OffsetDateTime?, val notLoadedCount: Long, - val itemsErrors: List = emptyList() + val itemsErrors: List ) : FeedState() data class ErrorState( diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 76d5e9d632b..728570b17e0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -11,7 +11,7 @@ import androidx.lifecycle.viewmodel.viewModelFactory import androidx.preference.PreferenceManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.functions.Function5 +import io.reactivex.rxjava3.functions.Function6 import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.App @@ -31,18 +31,24 @@ import java.util.concurrent.TimeUnit class FeedViewModel( private val application: Application, groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - initialShowPlayedItems: Boolean = true, - initialShowFutureItems: Boolean = true + initialShowPlayedItems: Boolean, + initialShowPartiallyPlayedItems: Boolean, + initialShowFutureItems: Boolean ) : ViewModel() { private val feedDatabaseManager = FeedDatabaseManager(application) - private val toggleShowPlayedItems = BehaviorProcessor.create() - private val toggleShowPlayedItemsFlowable = toggleShowPlayedItems + private val showPlayedItems = BehaviorProcessor.create() + private val showPlayedItemsFlowable = showPlayedItems .startWithItem(initialShowPlayedItems) .distinctUntilChanged() - private val toggleShowFutureItems = BehaviorProcessor.create() - private val toggleShowFutureItemsFlowable = toggleShowFutureItems + private val showPartiallyPlayedItems = BehaviorProcessor.create() + private val showPartiallyPlayedItemsFlowable = showPartiallyPlayedItems + .startWithItem(initialShowPartiallyPlayedItems) + .distinctUntilChanged() + + private val showFutureItems = BehaviorProcessor.create() + private val showFutureItemsFlowable = showFutureItems .startWithItem(initialShowFutureItems) .distinctUntilChanged() @@ -52,23 +58,24 @@ class FeedViewModel( private var combineDisposable = Flowable .combineLatest( FeedEventManager.events(), - toggleShowPlayedItemsFlowable, - toggleShowFutureItemsFlowable, + showPlayedItemsFlowable, + showPartiallyPlayedItemsFlowable, + showFutureItemsFlowable, feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function5 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, - t4: Long, t5: List -> - return@Function5 CombineResultEventHolder(t1, t2, t3, t4, t5.firstOrNull()) + Function6 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, t4: Boolean, + t5: Long, t6: List -> + return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull()) } ) .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) - .map { (event, showPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> + .map { (event, showPlayedItems, showPartiallyPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> val streamItems = if (event is SuccessResultEvent || event is IdleEvent) feedDatabaseManager - .getStreams(groupId, showPlayedItems, showFutureItems) + .getStreams(groupId, showPlayedItems, showPartiallyPlayedItems, showFutureItems) .blockingGet(arrayListOf()) else arrayListOf() @@ -79,7 +86,7 @@ class FeedViewModel( .subscribe { (event, listFromDB, notLoadedCount, oldestUpdate) -> mutableStateLiveData.postValue( when (event) { - is IdleEvent -> FeedState.LoadedState(listFromDB.map { e -> StreamItem(e) }, oldestUpdate, notLoadedCount) + is IdleEvent -> FeedState.LoadedState(listFromDB.map { e -> StreamItem(e) }, oldestUpdate, notLoadedCount, listOf()) is ProgressEvent -> FeedState.ProgressState(event.currentProgress, event.maxProgress, event.progressMessage) is SuccessResultEvent -> FeedState.LoadedState(listFromDB.map { e -> StreamItem(e) }, oldestUpdate, notLoadedCount, event.itemsErrors) is ErrorResultEvent -> FeedState.ErrorState(event.error) @@ -100,8 +107,9 @@ class FeedViewModel( val t1: FeedEventManager.Event, val t2: Boolean, val t3: Boolean, - val t4: Long, - val t5: OffsetDateTime? + val t4: Boolean, + val t5: Long, + val t6: OffsetDateTime? ) private data class CombineResultDataHolder( @@ -111,37 +119,49 @@ class FeedViewModel( val t4: OffsetDateTime? ) - fun togglePlayedItems(showPlayedItems: Boolean) { - toggleShowPlayedItems.onNext(showPlayedItems) - } - - fun saveShowPlayedItemsToPreferences(showPlayedItems: Boolean) = + fun setSaveShowPlayedItems(showPlayedItems: Boolean) { + this.showPlayedItems.onNext(showPlayedItems) PreferenceManager.getDefaultSharedPreferences(application).edit { - this.putBoolean(application.getString(R.string.feed_show_played_items_key), showPlayedItems) + this.putBoolean(application.getString(R.string.feed_show_watched_items_key), showPlayedItems) this.apply() } + } fun getShowPlayedItemsFromPreferences() = getShowPlayedItemsFromPreferences(application) - fun toggleFutureItems(showFutureItems: Boolean) { - toggleShowFutureItems.onNext(showFutureItems) + fun setSaveShowPartiallyPlayedItems(showPartiallyPlayedItems: Boolean) { + this.showPartiallyPlayedItems.onNext(showPartiallyPlayedItems) + PreferenceManager.getDefaultSharedPreferences(application).edit { + this.putBoolean(application.getString(R.string.feed_show_partially_watched_items_key), showPartiallyPlayedItems) + this.apply() + } } - fun saveShowFutureItemsToPreferences(showFutureItems: Boolean) = + fun getShowPartiallyPlayedItemsFromPreferences() = getShowPartiallyPlayedItemsFromPreferences(application) + + fun setSaveShowFutureItems(showFutureItems: Boolean) { + this.showFutureItems.onNext(showFutureItems) PreferenceManager.getDefaultSharedPreferences(application).edit { this.putBoolean(application.getString(R.string.feed_show_future_items_key), showFutureItems) this.apply() } + } fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application) companion object { private fun getShowPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_played_items_key), true) + .getBoolean(context.getString(R.string.feed_show_watched_items_key), true) + + private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = + PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) + private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.feed_show_future_items_key), true) + fun getFactory(context: Context, groupId: Long) = viewModelFactory { initializer { FeedViewModel( @@ -149,6 +169,7 @@ class FeedViewModel( groupId, // Read initial value from preferences getShowPlayedItemsFromPreferences(context.applicationContext), + getShowPartiallyPlayedItemsFromPreferences(context.applicationContext), getShowFutureItemsFromPreferences(context.applicationContext) ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index 96d395aa505..4a071d6df75 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -18,8 +18,8 @@ import org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_AUDIO_STREAM import org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_STREAM import org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM import org.schabi.newpipe.util.Localization -import org.schabi.newpipe.util.PicassoHelper import org.schabi.newpipe.util.StreamTypeUtil +import org.schabi.newpipe.util.image.PicassoHelper import java.util.concurrent.TimeUnit import java.util.function.Consumer @@ -42,12 +42,13 @@ data class StreamItem( override fun getId(): Long = stream.uid - enum class ItemVersion { NORMAL, MINI, GRID } + enum class ItemVersion { NORMAL, MINI, GRID, CARD } override fun getLayout(): Int = when (itemVersion) { ItemVersion.NORMAL -> R.layout.list_stream_item ItemVersion.MINI -> R.layout.list_stream_mini_item ItemVersion.GRID -> R.layout.list_stream_grid_item + ItemVersion.CARD -> R.layout.list_stream_card_item } override fun initializeViewBinding(view: View) = ListStreamItemBinding.bind(view) 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..8ea89368d6b 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 +import org.schabi.newpipe.util.image.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.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) + .getChannelIntent(context, data.serviceId, data.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.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.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..a40bf35dc52 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() } @@ -137,7 +137,7 @@ class NotificationWorker( .enqueueUniquePeriodicWork( WORK_TAG, if (force) { - ExistingPeriodicWorkPolicy.REPLACE + ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE } else { ExistingPeriodicWorkPolicy.KEEP }, diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt index 3d19de9c693..1c2826e7a67 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt @@ -26,7 +26,7 @@ object FeedEventManager { } sealed class Event { - object IdleEvent : Event() + data object IdleEvent : Event() data class ProgressEvent(val currentProgress: Int = -1, val maxProgress: Int = -1, @StringRes val progressMessage: Int = 0) : Event() { constructor(@StringRes progressMessage: Int) : this(-1, -1, progressMessage) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index fec50a579a7..9b0f177d568 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.feed.service import android.content.Context +import android.content.SharedPreferences import androidx.preference.PreferenceManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable @@ -13,11 +14,19 @@ import io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.subscription.NotificationMode -import org.schabi.newpipe.extractor.ListInfo +import org.schabi.newpipe.database.subscription.SubscriptionEntity +import org.schabi.newpipe.extractor.Info +import org.schabi.newpipe.extractor.NewPipe +import org.schabi.newpipe.extractor.ServiceList +import org.schabi.newpipe.extractor.feed.FeedInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.ktx.getStringSafe import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.subscription.SubscriptionManager -import org.schabi.newpipe.util.ExtractorHelper +import org.schabi.newpipe.util.ChannelTabHelper +import org.schabi.newpipe.util.ExtractorHelper.getChannelInfo +import org.schabi.newpipe.util.ExtractorHelper.getChannelTab +import org.schabi.newpipe.util.ExtractorHelper.getMoreChannelTabItems import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.concurrent.atomic.AtomicBoolean @@ -62,12 +71,10 @@ class FeedLoadManager(private val context: Context) { val outdatedThreshold = if (ignoreOutdatedThreshold) { OffsetDateTime.now(ZoneOffset.UTC) } else { - val thresholdOutdatedSeconds = ( - defaultSharedPreferences.getString( - context.getString(R.string.feed_update_threshold_key), - context.getString(R.string.feed_update_threshold_default_value) - ) ?: context.getString(R.string.feed_update_threshold_default_value) - ).toInt() + val thresholdOutdatedSeconds = defaultSharedPreferences.getStringSafe( + context.getString(R.string.feed_update_threshold_key), + context.getString(R.string.feed_update_threshold_default_value) + ).toInt() OffsetDateTime.now(ZoneOffset.UTC).minusSeconds(thresholdOutdatedSeconds.toLong()) } @@ -75,13 +82,19 @@ class FeedLoadManager(private val context: Context) { * subscriptions which have not been updated within the feed updated threshold */ val outdatedSubscriptions = when (groupId) { - FeedGroupEntity.GROUP_ALL_ID -> feedDatabaseManager.outdatedSubscriptions(outdatedThreshold) + FeedGroupEntity.GROUP_ALL_ID -> feedDatabaseManager.outdatedSubscriptions( + outdatedThreshold + ) GROUP_NOTIFICATION_ENABLED -> feedDatabaseManager.outdatedSubscriptionsWithNotificationMode( outdatedThreshold, NotificationMode.ENABLED ) else -> feedDatabaseManager.outdatedSubscriptionsForGroup(groupId, outdatedThreshold) } + // like `currentProgress`, but counts the number of YouTube extractions that have begun, so + // they can be properly throttled every once in a while (see doOnNext below) + val youtubeExtractionCount = AtomicInteger() + return outdatedSubscriptions .take(1) .doOnNext { @@ -97,56 +110,20 @@ class FeedLoadManager(private val context: Context) { .observeOn(Schedulers.io()) .flatMap { Flowable.fromIterable(it) } .takeWhile { !cancelSignal.get() } + .doOnNext { subscriptionEntity -> + // throttle YouTube extractions once every BATCH_SIZE to avoid being rate limited + if (subscriptionEntity.serviceId == ServiceList.YouTube.serviceId) { + val previousCount = youtubeExtractionCount.getAndIncrement() + if (previousCount != 0 && previousCount % BATCH_SIZE == 0) { + Thread.sleep(DELAY_BETWEEN_BATCHES_MILLIS.random()) + } + } + } .parallel(PARALLEL_EXTRACTIONS, PARALLEL_EXTRACTIONS * 2) .runOn(Schedulers.io(), PARALLEL_EXTRACTIONS * 2) .filter { !cancelSignal.get() } .map { subscriptionEntity -> - var error: Throwable? = null - try { - // check for and load new streams - // either by using the dedicated feed method or by getting the channel info - val listInfo = if (useFeedExtractor) { - ExtractorHelper - .getFeedInfoFallbackToChannelInfo( - subscriptionEntity.serviceId, - subscriptionEntity.url - ) - .onErrorReturn { - error = it // store error, otherwise wrapped into RuntimeException - throw it - } - .blockingGet() - } else { - ExtractorHelper - .getChannelInfo( - subscriptionEntity.serviceId, - subscriptionEntity.url, - true - ) - .onErrorReturn { - error = it // store error, otherwise wrapped into RuntimeException - throw it - } - .blockingGet() - } as ListInfo - - return@map Notification.createOnNext( - FeedUpdateInfo( - subscriptionEntity, - listInfo - ) - ) - } catch (e: Throwable) { - if (error == null) { - // do this to prevent blockingGet() from wrapping into RuntimeException - error = e - } - - val request = "${subscriptionEntity.serviceId}:${subscriptionEntity.url}" - val wrapper = - FeedLoadService.RequestException(subscriptionEntity.uid, request, error!!) - return@map Notification.createOnError(wrapper) - } + loadStreams(subscriptionEntity, useFeedExtractor, defaultSharedPreferences) } .sequential() .observeOn(AndroidSchedulers.mainThread()) @@ -164,7 +141,112 @@ class FeedLoadManager(private val context: Context) { } private fun broadcastProgress() { - FeedEventManager.postEvent(FeedEventManager.Event.ProgressEvent(currentProgress.get(), maxProgress.get())) + FeedEventManager.postEvent( + FeedEventManager.Event.ProgressEvent( + currentProgress.get(), + maxProgress.get() + ) + ) + } + + private fun loadStreams( + subscriptionEntity: SubscriptionEntity, + useFeedExtractor: Boolean, + defaultSharedPreferences: SharedPreferences + ): Notification { + var error: Throwable? = null + val storeOriginalErrorAndRethrow = { e: Throwable -> + // keep original to prevent blockingGet() from wrapping it into RuntimeException + error = e + throw e + } + + try { + // check for and load new streams + // either by using the dedicated feed method or by getting the channel info + var originalInfo: Info? = null + var streams: List? = null + val errors = ArrayList() + + if (useFeedExtractor) { + NewPipe.getService(subscriptionEntity.serviceId) + .getFeedExtractor(subscriptionEntity.url) + ?.also { feedExtractor -> + // the user wants to use a feed extractor and there is one, use it + val feedInfo = FeedInfo.getInfo(feedExtractor) + errors.addAll(feedInfo.errors) + originalInfo = feedInfo + streams = feedInfo.relatedItems + } + } + + if (originalInfo == null) { + // use the normal channel tabs extractor if either the user wants it, or + // the current service does not have a dedicated feed extractor + + val channelInfo = getChannelInfo( + subscriptionEntity.serviceId, + subscriptionEntity.url, true + ) + .onErrorReturn(storeOriginalErrorAndRethrow) + .blockingGet() + errors.addAll(channelInfo.errors) + originalInfo = channelInfo + + streams = channelInfo.tabs + .filter { tab -> + ChannelTabHelper.fetchFeedChannelTab( + context, + defaultSharedPreferences, + tab + ) + } + .map { + Pair( + getChannelTab(subscriptionEntity.serviceId, it, true) + .onErrorReturn(storeOriginalErrorAndRethrow) + .blockingGet(), + it + ) + } + .flatMap { (channelTabInfo, linkHandler) -> + errors.addAll(channelTabInfo.errors) + if (channelTabInfo.relatedItems.isEmpty() && + channelTabInfo.nextPage != null + ) { + val infoItemsPage = getMoreChannelTabItems( + subscriptionEntity.serviceId, + linkHandler, channelTabInfo.nextPage + ) + .blockingGet() + + errors.addAll(infoItemsPage.errors) + return@flatMap infoItemsPage.items + } else { + return@flatMap channelTabInfo.relatedItems + } + } + .filterIsInstance() + } + + return Notification.createOnNext( + FeedUpdateInfo( + subscriptionEntity, + originalInfo!!, + streams!!, + errors, + ) + ) + } catch (e: Throwable) { + val request = "${subscriptionEntity.serviceId}:${subscriptionEntity.url}" + val wrapper = FeedLoadService.RequestException( + subscriptionEntity.uid, + request, + // do this to prevent blockingGet() from wrapping into RuntimeException + error ?: e + ) + return Notification.createOnError(wrapper) + } } /** @@ -203,24 +285,24 @@ class FeedLoadManager(private val context: Context) { for (notification in list) { when { notification.isOnNext -> { - val subscriptionId = notification.value!!.uid - val info = notification.value!!.listInfo + val info = notification.value!! - notification.value!!.newStreams = filterNewStreams( - notification.value!!.listInfo.relatedItems - ) + notification.value!!.newStreams = filterNewStreams(info.streams) - feedDatabaseManager.upsertAll(subscriptionId, info.relatedItems) - subscriptionManager.updateFromInfo(subscriptionId, info) + feedDatabaseManager.upsertAll(info.uid, info.streams) + subscriptionManager.updateFromInfo(info) if (info.errors.isNotEmpty()) { feedResultsHolder.addErrors( - FeedLoadService.RequestException.wrapList( - subscriptionId, - info - ) + info.errors.map { + FeedLoadService.RequestException( + info.uid, + "${info.serviceId}:${info.url}", + it + ) + } ) - feedDatabaseManager.markAsOutdated(subscriptionId) + feedDatabaseManager.markAsOutdated(info.uid) } } notification.isOnError -> { @@ -260,7 +342,19 @@ class FeedLoadManager(private val context: Context) { /** * How many extractions will be running in parallel. */ - private const val PARALLEL_EXTRACTIONS = 6 + private const val PARALLEL_EXTRACTIONS = 3 + + /** + * How many YouTube extractions to perform before waiting [DELAY_BETWEEN_BATCHES_MILLIS] + * to avoid being rate limited + */ + private const val BATCH_SIZE = 50 + + /** + * Wait a random delay in this range once every [BATCH_SIZE] YouTube extractions to avoid + * being rate limited + */ + private val DELAY_BETWEEN_BATCHES_MILLIS = (6000L..12000L) /** * Number of items to buffer to mass-insert in the database. 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..f960040de6b 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 @@ -38,11 +39,8 @@ import org.schabi.newpipe.App import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity -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 +93,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) @@ -132,17 +124,7 @@ class FeedLoadService : Service() { // Loading & Handling // ///////////////////////////////////////////////////////////////////////// - class RequestException(val subscriptionId: Long, message: String, cause: Throwable) : Exception(message, cause) { - companion object { - fun wrapList(subscriptionId: Long, info: ListInfo): List { - val toReturn = ArrayList(info.errors.size) - info.errors.mapTo(toReturn) { - RequestException(subscriptionId, info.serviceId.toString() + ":" + info.url, it) - } - return toReturn - } - } - } + class RequestException(val subscriptionId: Long, message: String, cause: Throwable) : Exception(message, cause) // ///////////////////////////////////////////////////////////////////////// // Notification @@ -152,8 +134,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/feed/service/FeedUpdateInfo.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt index 5f72a6b842a..b44eec35333 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt @@ -2,33 +2,58 @@ package org.schabi.newpipe.local.feed.service import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionEntity -import org.schabi.newpipe.extractor.ListInfo +import org.schabi.newpipe.extractor.Info +import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.image.ImageStrategy +/** + * Instances of this class might stay around in memory for some time while fetching the feed, + * because of [FeedLoadManager.BUFFER_COUNT_BEFORE_INSERT]. Therefore this class should contain + * as little data as possible to avoid out of memory errors. In particular, avoid storing whole + * [ChannelInfo] objects, as they might contain raw JSON info in ready channel tabs link handlers. + */ data class FeedUpdateInfo( val uid: Long, @NotificationMode val notificationMode: Int, val name: String, - val avatarUrl: String, - val listInfo: ListInfo, + val avatarUrl: String?, + val url: String, + val serviceId: Int, + // description and subscriberCount are null if the constructor info is from the fast feed method + val description: String?, + val subscriberCount: Long?, + val streams: List, + val errors: List, ) { constructor( subscription: SubscriptionEntity, - listInfo: ListInfo, + info: Info, + streams: List, + errors: List, ) : this( uid = subscription.uid, notificationMode = subscription.notificationMode, - name = subscription.name, - avatarUrl = subscription.avatarUrl, - listInfo = listInfo, + name = info.name, + avatarUrl = (info as? ChannelInfo)?.avatars?.let { + // if the newly fetched info is not from fast feed, then it contains updated avatars + ImageStrategy.imageListToDbUrl(it) + } ?: subscription.avatarUrl, + url = info.url, + serviceId = info.serviceId, + // there is no description and subscriberCount in the fast feed + description = (info as? ChannelInfo)?.description, + subscriberCount = (info as? ChannelInfo)?.subscriberCount, + streams = streams, + errors = errors, ) /** * Integer id, can be used as notification id, etc. */ val pseudoId: Int - get() = listInfo.url.hashCode() + get() = url.hashCode() lateinit var newStreams: List } diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java index b8d2eae2d97..ed3cf548f96 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java @@ -87,7 +87,7 @@ public HistoryRecordManager(final Context context) { * Marks a stream item as watched such that it is hidden from the feed if watched videos are * hidden. Adds a history entry and updates the stream progress to 100%. * - * @see FeedViewModel#togglePlayedItems + * @see FeedViewModel#setSaveShowPlayedItems * @param info the item to mark as watched * @return a Maybe containing the ID of the item if successful */ diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java index a20a80ae985..3302e387ec5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java @@ -15,6 +15,7 @@ import androidx.annotation.Nullable; import androidx.viewbinding.ViewBinding; +import com.evernote.android.state.State; import com.google.android.material.snackbar.Snackbar; import org.reactivestreams.Subscriber; @@ -28,14 +29,16 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; +import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry; import org.schabi.newpipe.local.BaseLocalListFragment; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.settings.HistorySettingsFragment; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; -import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry; +import org.schabi.newpipe.util.PlayButtonHelper; import java.util.ArrayList; import java.util.Collections; @@ -43,13 +46,13 @@ import java.util.List; import java.util.Objects; -import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; public class StatisticsPlaylistFragment - extends BaseLocalListFragment, Void> { + extends BaseLocalListFragment, Void> + implements PlaylistControlViewHolder { private final CompositeDisposable disposables = new CompositeDisposable(); @State Parcelable itemsListState; @@ -195,14 +198,9 @@ public void onDestroyView() { if (itemListAdapter != null) { itemListAdapter.unsetSelectedListener(); } - if (playlistControlBinding != null) { - playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(null); - playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(null); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(null); - headerBinding = null; - playlistControlBinding = null; - } + headerBinding = null; + playlistControlBinding = null; if (databaseSubscription != null) { databaseSubscription.cancel(); @@ -276,12 +274,8 @@ public void handleResult(@NonNull final List result) { itemsListState = null; } - playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(view -> - NavigationHelper.playOnMainPlayer(activity, getPlayQueue())); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(view -> - NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(), false)); - playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(view -> - NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue(), false)); + PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this); + headerBinding.sortButton.setOnClickListener(view -> toggleSortMode()); hideLoading(); @@ -338,10 +332,6 @@ private void showInfoItemDialog(final StreamStatisticsEntry item) { StreamDialogDefaultEntry.DELETE, (f, i) -> deleteEntry( Math.max(itemListAdapter.getItemsList().indexOf(item), 0))) - .setAction( - StreamDialogDefaultEntry.START_HERE_ON_BACKGROUND, - (f, i) -> NavigationHelper.playOnBackgroundPlayer( - context, getPlayQueueStartingAt(item), true)) .create() .show(); } catch (final IllegalArgumentException e) { @@ -374,7 +364,8 @@ private void deleteEntry(final int index) { } } - private PlayQueue getPlayQueue() { + @Override + public PlayQueue getPlayQueue() { return getPlayQueue(0); } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java new file mode 100644 index 00000000000..16130009b6e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java @@ -0,0 +1,54 @@ +package org.schabi.newpipe.local.holder; + +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; +import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; + +import java.time.format.DateTimeFormatter; + +public class LocalBookmarkPlaylistItemHolder extends LocalPlaylistItemHolder { + private final View itemHandleView; + + public LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); + } + + LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, + final ViewGroup parent) { + super(infoItemBuilder, layoutId, parent); + itemHandleView = itemView.findViewById(R.id.itemHandle); + } + + @Override + public void updateFromItem(final LocalItem localItem, + final HistoryRecordManager historyRecordManager, + final DateTimeFormatter dateTimeFormatter) { + if (!(localItem instanceof PlaylistMetadataEntry)) { + return; + } + final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem; + + itemHandleView.setOnTouchListener(getOnTouchListener(item)); + + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); + } + + private View.OnTouchListener getOnTouchListener(final PlaylistMetadataEntry item) { + return (view, motionEvent) -> { + view.performClick(); + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null + && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + itemBuilder.getOnItemSelectedListener().drag(item, + LocalBookmarkPlaylistItemHolder.this); + } + return false; + }; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java new file mode 100644 index 00000000000..33418ec987b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +/** + * Playlist card layout. + */ +public class LocalPlaylistCardItemHolder extends LocalPlaylistItemHolder { + + public LocalPlaylistCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index f8c5176ec2d..336f5cfe30b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -4,15 +4,19 @@ import android.view.ViewGroup; import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; import java.time.format.DateTimeFormatter; public class LocalPlaylistItemHolder extends PlaylistItemHolder { + + private static final float GRAYED_OUT_ALPHA = 0.6f; + public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, parent); } @@ -38,6 +42,13 @@ public void updateFromItem(final LocalItem localItem, PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); + if (item instanceof PlaylistDuplicatesEntry + && ((PlaylistDuplicatesEntry) item).timesStreamIsContained > 0) { + itemView.setAlpha(GRAYED_OUT_ALPHA); + } else { + itemView.setAlpha(1.0f); + } + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java new file mode 100644 index 00000000000..7f81a527fda --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +/** + * Local playlist stream UI. This also includes a handle to rearrange the videos. + */ +public class LocalPlaylistStreamCardItemHolder extends LocalPlaylistStreamItemHolder { + + public LocalPlaylistStreamCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_stream_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java index d3975832670..89a714fd7f6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java @@ -14,8 +14,9 @@ import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.views.AnimatedProgressBar; @@ -68,7 +69,8 @@ public void updateFromItem(final LocalItem localItem, R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - if (item.getProgressMillis() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getStreamEntity().getDuration()); itemProgressView.setProgress((int) TimeUnit.MILLISECONDS @@ -109,7 +111,8 @@ public void updateState(final LocalItem localItem, } final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem; - if (item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { itemProgressView.setMax((int) item.getStreamEntity().getDuration()); if (itemProgressView.getVisibility() == View.VISIBLE) { itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java new file mode 100644 index 00000000000..4e03d5fb105 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java @@ -0,0 +1,13 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +public class LocalStatisticStreamCardItemHolder extends LocalStatisticStreamItemHolder { + public LocalStatisticStreamCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_stream_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java index 0d88eecba70..150a35eb59c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java @@ -14,8 +14,9 @@ import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.views.AnimatedProgressBar; @@ -97,7 +98,8 @@ public void updateFromItem(final LocalItem localItem, R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - if (item.getProgressMillis() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getStreamEntity().getDuration()); itemProgressView.setProgress((int) TimeUnit.MILLISECONDS @@ -141,7 +143,8 @@ public void updateState(final LocalItem localItem, } final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem; - if (item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { itemProgressView.setMax((int) item.getStreamEntity().getDuration()); if (itemProgressView.getVisibility() == View.VISIBLE) { itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java new file mode 100644 index 00000000000..6d61d1e08bf --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java @@ -0,0 +1,54 @@ +package org.schabi.newpipe.local.holder; + +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; +import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; + +import java.time.format.DateTimeFormatter; + +public class RemoteBookmarkPlaylistItemHolder extends RemotePlaylistItemHolder { + private final View itemHandleView; + + public RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); + } + + RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, + final ViewGroup parent) { + super(infoItemBuilder, layoutId, parent); + itemHandleView = itemView.findViewById(R.id.itemHandle); + } + + @Override + public void updateFromItem(final LocalItem localItem, + final HistoryRecordManager historyRecordManager, + final DateTimeFormatter dateTimeFormatter) { + if (!(localItem instanceof PlaylistRemoteEntity)) { + return; + } + final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem; + + itemHandleView.setOnTouchListener(getOnTouchListener(item)); + + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); + } + + private View.OnTouchListener getOnTouchListener(final PlaylistRemoteEntity item) { + return (view, motionEvent) -> { + view.performClick(); + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null + && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + itemBuilder.getOnItemSelectedListener().drag(item, + RemoteBookmarkPlaylistItemHolder.this); + } + return false; + }; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java new file mode 100644 index 00000000000..74a67c3db1e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +/** + * Playlist card UI for list item. + */ +public class RemotePlaylistCardItemHolder extends RemotePlaylistItemHolder { + + public RemotePlaylistCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index 70987a6fc1d..7657320634c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -8,12 +8,13 @@ import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import java.time.format.DateTimeFormatter; public class RemotePlaylistItemHolder extends PlaylistItemHolder { + public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, parent); 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 68a35e72b2e..c87d9cccccd 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; @@ -23,11 +22,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; +import com.evernote.android.state.State; + import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import org.schabi.newpipe.NewPipeDatabase; @@ -35,6 +35,7 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.history.model.StreamHistoryEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.databinding.DialogEditTextBinding; import org.schabi.newpipe.databinding.LocalPlaylistHeaderBinding; @@ -42,36 +43,37 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.MainFragment; +import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry; import org.schabi.newpipe.local.BaseLocalListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.player.PlayerType; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; +import org.schabi.newpipe.util.PlayButtonHelper; +import org.schabi.newpipe.util.debounce.DebounceSavable; +import org.schabi.newpipe.util.debounce.DebounceSaver; import org.schabi.newpipe.util.external_communication.ShareUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; -import io.reactivex.rxjava3.subjects.PublishSubject; -public class LocalPlaylistFragment extends BaseLocalListFragment, Void> { - // Save the list 10 seconds after the last change occurred - private static final long SAVE_DEBOUNCE_MILLIS = 10000; +public class LocalPlaylistFragment extends BaseLocalListFragment, Void> + implements PlaylistControlViewHolder, DebounceSavable { + private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State protected Long playlistId; @@ -88,15 +90,21 @@ public class LocalPlaylistFragment extends BaseLocalListFragment debouncedSaveSignal; private CompositeDisposable disposables; - /* Has the playlist been fully loaded from db */ + /** Whether the playlist has been fully loaded from db. */ private AtomicBoolean isLoadingComplete; - /* Has the playlist been modified (e.g. items reordered or deleted) */ - private AtomicBoolean isModified; - /* Is the playlist currently being processed to remove watched videos */ - private boolean isRemovingWatched = false; + /** Used to debounce saving playlist edits to disk. */ + private DebounceSaver debounceSaver; + /** Flag to prevent simultaneous rewrites of the playlist. */ + private boolean isRewritingPlaylist = false; + + /** + * The pager adapter that the fragment is created from when it is used as frontpage, i.e. + * {@link #useAsFrontPage} is {@link true}. + */ + @Nullable + private MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter = null; public static LocalPlaylistFragment getInstance(final long playlistId, final String name) { final LocalPlaylistFragment instance = new LocalPlaylistFragment(); @@ -112,12 +120,11 @@ public static LocalPlaylistFragment getInstance(final long playlistId, final Str public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); playlistManager = new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); - debouncedSaveSignal = PublishSubject.create(); disposables = new CompositeDisposable(); isLoadingComplete = new AtomicBoolean(); - isModified = new AtomicBoolean(); + debounceSaver = new DebounceSaver(this); } @Override @@ -223,10 +230,13 @@ public void startLoading(final boolean forceLoad) { if (disposables != null) { disposables.clear(); } - disposables.add(getDebouncedSaver()); + + if (debounceSaver != null) { + disposables.add(debounceSaver.getDebouncedSaver()); + debounceSaver.setNoChangesToSave(); + } isLoadingComplete.set(false); - isModified.set(false); playlistManager.getPlaylistStreams(playlistId) .onBackpressureLatest() @@ -265,14 +275,10 @@ public void onDestroyView() { if (itemListAdapter != null) { itemListAdapter.unsetSelectedListener(); } - if (playlistControlBinding != null) { - playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(null); - playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(null); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(null); - headerBinding = null; - playlistControlBinding = null; - } + headerBinding = null; + playlistControlBinding = null; + if (databaseSubscription != null) { databaseSubscription.cancel(); @@ -288,19 +294,21 @@ public void onDestroyView() { @Override public void onDestroy() { super.onDestroy(); - if (debouncedSaveSignal != null) { - debouncedSaveSignal.onComplete(); + if (debounceSaver != null) { + debounceSaver.getDebouncedSaveSignal().onComplete(); } if (disposables != null) { disposables.dispose(); } + if (tabsPagerAdapter != null) { + tabsPagerAdapter.getLocalPlaylistFragments().remove(this); + } - debouncedSaveSignal = null; + debounceSaver = null; playlistManager = null; disposables = null; isLoadingComplete = null; - isModified = null; } /////////////////////////////////////////////////////////////////////////// @@ -324,7 +332,7 @@ public void onSubscribe(final Subscription s) { @Override public void onNext(final List streams) { // Skip handling the result after it has been modified - if (isModified == null || !isModified.get()) { + if (debounceSaver == null || !debounceSaver.getIsModified()) { handleResult(streams); isLoadingComplete.set(true); } @@ -349,24 +357,27 @@ public void onComplete() { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == R.id.menu_item_share_playlist) { - sharePlaylist(); + createShareConfirmationDialog(); } else if (item.getItemId() == R.id.menu_item_rename_playlist) { createRenameDialog(); } else if (item.getItemId() == R.id.menu_item_remove_watched) { - if (!isRemovingWatched) { + if (!isRewritingPlaylist) { 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) { + if (!isRewritingPlaylist) { + openRemoveDuplicatesDialog(); + } } else { return super.onOptionsItemSelected(item); } @@ -374,24 +385,41 @@ public boolean onOptionsItemSelected(final MenuItem item) { } /** - * Share the playlist as a newline-separated list of stream URLs. + * Shares the playlist as a list of stream URLs if {@code shouldSharePlaylistDetails} is + * set to {@code false}. Shares the playlist name along with a list of video titles and URLs + * if {@code shouldSharePlaylistDetails} is set to {@code true}. + * + * @param shouldSharePlaylistDetails Whether the playlist details should be included in the + * shared content. */ - public void sharePlaylist() { + private void sharePlaylist(final boolean shouldSharePlaylistDetails) { + final Context context = requireContext(); + disposables.add(playlistManager.getPlaylistStreams(playlistId) .flatMapSingle(playlist -> Single.just(playlist.stream() .map(PlaylistStreamEntry::getStreamEntity) - .map(StreamEntity::getUrl) + .map(streamEntity -> { + if (shouldSharePlaylistDetails) { + return context.getString(R.string.video_details_list_item, + streamEntity.getTitle(), streamEntity.getUrl()); + } else { + return streamEntity.getUrl(); + } + }) .collect(Collectors.joining("\n")))) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(urlsText -> ShareUtils.shareText(requireContext(), name, urlsText), + .subscribe(urlsText -> ShareUtils.shareText( + context, name, shouldSharePlaylistDetails + ? context.getString(R.string.share_playlist_content_details, + name, urlsText) : urlsText), throwable -> showUiErrorSnackbar(this, "Sharing playlist", throwable))); } public void removeWatchedStreams(final boolean removePartiallyWatched) { - if (isRemovingWatched) { + if (isRewritingPlaylist) { return; } - isRemovingWatched = true; + isRewritingPlaylist = true; showLoading(); final var recordManager = new HistoryRecordManager(getContext()); @@ -417,8 +445,8 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { if (indexInHistory < 0) { itemsToKeep.add(playlistItem); } else if (!isThumbnailPermanent && !thumbnailVideoRemoved - && playlistManager.getPlaylistThumbnail(playlistId) - .equals(playlistItem.getStreamEntity().getThumbnailUrl())) { + && playlistManager.getPlaylistThumbnailStreamId(playlistId) + == playlistItem.getStreamEntity().getUid()) { thumbnailVideoRemoved = true; } } @@ -438,8 +466,8 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { && !streamStateEntity.isFinished(duration))) { itemsToKeep.add(playlistItem); } else if (!isThumbnailPermanent && !thumbnailVideoRemoved - && playlistManager.getPlaylistThumbnail(playlistId) - .equals(playlistItem.getStreamEntity().getThumbnailUrl())) { + && playlistManager.getPlaylistThumbnailStreamId(playlistId) + == playlistItem.getStreamEntity().getUid()) { thumbnailVideoRemoved = true; } } @@ -456,20 +484,20 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { itemListAdapter.clearStreamItemList(); itemListAdapter.addItems(itemsToKeep); - saveChanges(); + debounceSaver.setHasChangesToSave(); if (thumbnailVideoRemoved) { updateThumbnailUrl(); } final long videoCount = itemListAdapter.getItemsList().size(); - setVideoCount(videoCount); + setStreamCountAndOverallDuration(itemListAdapter.getItemsList()); if (videoCount == 0) { showEmptyState(); } hideLoading(); - isRemovingWatched = false; + isRewritingPlaylist = false; }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, "Removing watched videos, partially watched=" + removePartiallyWatched)))); } @@ -493,40 +521,13 @@ public void handleResult(@NonNull final List result) { itemsList.getLayoutManager().onRestoreInstanceState(itemsListState); itemsListState = null; } - setVideoCount(itemListAdapter.getItemsList().size()); - - playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(view -> { - NavigationHelper.playOnMainPlayer(activity, getPlayQueue()); - showHoldToAppendTipIfNeeded(); - }); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(view -> { - NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(), false); - showHoldToAppendTipIfNeeded(); - }); - playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(view -> { - NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue(), false); - showHoldToAppendTipIfNeeded(); - }); - playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.POPUP); - return true; - }); + setStreamCountAndOverallDuration(itemListAdapter.getItemsList()); - playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> { - NavigationHelper.enqueueOnPlayer(activity, getPlayQueue(), PlayerType.AUDIO); - return true; - }); + PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this); hideLoading(); } - private void showHoldToAppendTipIfNeeded() { - if (PreferenceManager.getDefaultSharedPreferences(activity) - .getBoolean(getString(R.string.show_hold_to_append_key), true)) { - Toast.makeText(activity, R.string.hold_to_append, Toast.LENGTH_SHORT).show(); - } - } - /////////////////////////////////////////////////////////////////////////// // Fragment Error Handling /////////////////////////////////////////////////////////////////////////// @@ -555,15 +556,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) { @@ -587,7 +587,7 @@ private void changePlaylistName(final String title) { disposables.add(disposable); } - private void changeThumbnailUrl(final String thumbnailUrl, final boolean isPermanent) { + private void changeThumbnailStreamId(final long thumbnailStreamId, final boolean isPermanent) { if (playlistManager == null || (!isPermanent && playlistManager .getIsPlaylistThumbnailPermanent(playlistId))) { return; @@ -599,11 +599,11 @@ private void changeThumbnailUrl(final String thumbnailUrl, final boolean isPerma if (DEBUG) { Log.d(TAG, "Updating playlist id=[" + playlistId + "] " - + "with new thumbnail url=[" + thumbnailUrl + "]"); + + "with new thumbnail stream id=[" + thumbnailStreamId + "]"); } final Disposable disposable = playlistManager - .changePlaylistThumbnail(playlistId, thumbnailUrl, isPermanent) + .changePlaylistThumbnail(playlistId, thumbnailStreamId, isPermanent) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignore -> successToast.show(), throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, @@ -616,65 +616,81 @@ private void updateThumbnailUrl() { return; } - final String newThumbnailUrl; + final long thumbnailStreamId; if (!itemListAdapter.getItemsList().isEmpty()) { - newThumbnailUrl = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0)) - .getStreamEntity().getThumbnailUrl(); + thumbnailStreamId = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0)) + .getStreamEntity().getUid(); } else { - newThumbnailUrl = "drawable://" + R.drawable.placeholder_thumbnail_playlist; + thumbnailStreamId = PlaylistEntity.DEFAULT_THUMBNAIL_ID; } - changeThumbnailUrl(newThumbnailUrl, false); + changeThumbnailStreamId(thumbnailStreamId, false); } - private void deleteItem(final PlaylistStreamEntry item) { - if (itemListAdapter == null) { + private void openRemoveDuplicatesDialog() { + 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) + .show(); + } + + private void removeDuplicatesInPlaylist() { + if (isRewritingPlaylist) { return; } + isRewritingPlaylist = true; + showLoading(); - itemListAdapter.removeItem(item); - if (playlistManager.getPlaylistThumbnail(playlistId) - .equals(item.getStreamEntity().getThumbnailUrl())) { - updateThumbnailUrl(); - } + final var streamsMaybe = playlistManager + .getDistinctPlaylistStreams(playlistId).firstElement(); + + + disposables.add(streamsMaybe.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(itemsToKeep -> { + itemListAdapter.clearStreamItemList(); + itemListAdapter.addItems(itemsToKeep); + setStreamCountAndOverallDuration(itemListAdapter.getItemsList()); + debounceSaver.setHasChangesToSave(); - setVideoCount(itemListAdapter.getItemsList().size()); - saveChanges(); + hideLoading(); + isRewritingPlaylist = false; + }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, + "Removing duplicated streams")))); } - private void saveChanges() { - if (isModified == null || debouncedSaveSignal == null) { + private void deleteItem(final PlaylistStreamEntry item) { + if (itemListAdapter == null) { return; } - isModified.set(true); - debouncedSaveSignal.onNext(System.currentTimeMillis()); - } - - private Disposable getDebouncedSaver() { - if (debouncedSaveSignal == null) { - return Disposable.empty(); + itemListAdapter.removeItem(item); + if (playlistManager.getPlaylistThumbnailStreamId(playlistId) == item.getStreamId()) { + updateThumbnailUrl(); } - return debouncedSaveSignal - .debounce(SAVE_DEBOUNCE_MILLIS, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> saveImmediate(), throwable -> - showError(new ErrorInfo(throwable, UserAction.SOMETHING_ELSE, - "Debounced saver"))); + setStreamCountAndOverallDuration(itemListAdapter.getItemsList()); + debounceSaver.setHasChangesToSave(); } - private void saveImmediate() { + /** + *

Commit changes immediately if the playlist has been modified.

+ * Delete operations and other modifications will be committed to ensure that the database + * is up to date, e.g. when the user adds the just deleted stream from another fragment. + */ + @Override + public void saveImmediate() { if (playlistManager == null || itemListAdapter == null) { return; } // List must be loaded and modified in order to save - if (isLoadingComplete == null || isModified == null - || !isLoadingComplete.get() || !isModified.get()) { - Log.w(TAG, "Attempting to save playlist when local playlist " - + "is not loaded or not modified: playlist id=[" + playlistId + "]"); + if (isLoadingComplete == null || debounceSaver == null + || !isLoadingComplete.get() || !debounceSaver.getIsModified()) { return; } @@ -695,8 +711,8 @@ private void saveImmediate() { .observeOn(AndroidSchedulers.mainThread()) .subscribe( () -> { - if (isModified != null) { - isModified.set(false); + if (debounceSaver != null) { + debounceSaver.setNoChangesToSave(); } }, throwable -> showError(new ErrorInfo(throwable, @@ -739,7 +755,7 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, final int targetIndex = target.getBindingAdapterPosition(); final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { - saveChanges(); + debounceSaver.setHasChangesToSave(); } return isSwapped; } @@ -793,7 +809,7 @@ context, getPlayQueueStartingAt(item), true)) .setAction( StreamDialogDefaultEntry.SET_AS_PLAYLIST_THUMBNAIL, (f, i) -> - changeThumbnailUrl(item.getStreamEntity().getThumbnailUrl(), + changeThumbnailStreamId(item.getStreamEntity().getUid(), true)) .setAction( StreamDialogDefaultEntry.DELETE, @@ -810,14 +826,26 @@ private void setInitialData(final long pid, final String title) { this.name = !TextUtils.isEmpty(title) ? title : ""; } - private void setVideoCount(final long count) { + private void setStreamCountAndOverallDuration(final ArrayList itemsList) { if (activity != null && headerBinding != null) { - headerBinding.playlistStreamCount.setText(Localization - .localizeStreamCount(activity, count)); + final long streamCount = itemsList.size(); + final long playlistOverallDurationSeconds = itemsList.stream() + .filter(PlaylistStreamEntry.class::isInstance) + .map(PlaylistStreamEntry.class::cast) + .map(PlaylistStreamEntry::getStreamEntity) + .mapToLong(StreamEntity::getDuration) + .sum(); + headerBinding.playlistStreamCount.setText( + Localization.concatenateStrings( + Localization.localizeStreamCount(activity, streamCount), + Localization.getDurationString(playlistOverallDurationSeconds, + true, true)) + ); } } - private PlayQueue getPlayQueue() { + @Override + public PlayQueue getPlayQueue() { return getPlayQueue(0); } @@ -835,5 +863,29 @@ private PlayQueue getPlayQueue(final int index) { } return new SinglePlayQueue(streamInfoItems, index); } + + /** + * Creates a dialog to confirm whether the user wants to share the playlist + * with the playlist details or just the list of stream URLs. + * After the user has made a choice, the playlist is shared. + */ + private void createShareConfirmationDialog() { + new AlertDialog.Builder(requireContext()) + .setTitle(R.string.share_playlist) + .setMessage(R.string.share_playlist_with_titles_message) + .setCancelable(true) + .setPositiveButton(R.string.share_playlist_with_titles, (dialog, which) -> + sharePlaylist(/* shouldSharePlaylistDetails= */ true) + ) + .setNegativeButton(R.string.share_playlist_with_list, (dialog, which) -> + sharePlaylist(/* shouldSharePlaylistDetails= */ false) + ) + .show(); + } + + public void setTabsPagerAdapter( + @Nullable final MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter) { + this.tabsPagerAdapter = tabsPagerAdapter; + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 4007d0e09bc..dd9307675de 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -2,8 +2,8 @@ import androidx.annotation.Nullable; -import org.schabi.newpipe.R; import org.schabi.newpipe.database.AppDatabase; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.playlist.dao.PlaylistDAO; @@ -19,10 +19,11 @@ import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; public class LocalPlaylistManager { + private static final long THUMBNAIL_ID_LEAVE_UNCHANGED = -2; + private final AppDatabase database; private final StreamDAO streamTable; private final PlaylistDAO playlistTable; @@ -40,30 +41,37 @@ public Maybe> createPlaylist(final String name, final List database.runInTransaction(() -> - upsertStreams(playlistTable.insert(newPlaylist), streams, 0)) - ).subscribeOn(Schedulers.io()); + // Save to the database directly. + // Make sure the new playlist is always on the top of bookmark. + // The index will be reassigned to non-negative number in BookmarkFragment. + return Maybe.fromCallable(() -> database.runInTransaction(() -> { + final List streamIds = streamTable.upsertAll(streams); + final PlaylistEntity newPlaylist = new PlaylistEntity(name, false, + streamIds.get(0), -1); + + return insertJoinEntities(playlistTable.insert(newPlaylist), + streamIds, 0); + } + )).subscribeOn(Schedulers.io()); } public Maybe> appendToPlaylist(final long playlistId, final List streams) { return playlistStreamTable.getMaximumIndexOf(playlistId) .firstElement() - .map(maxJoinIndex -> database.runInTransaction(() -> - upsertStreams(playlistId, streams, maxJoinIndex + 1)) - ).subscribeOn(Schedulers.io()); + .map(maxJoinIndex -> database.runInTransaction(() -> { + final List streamIds = streamTable.upsertAll(streams); + return insertJoinEntities(playlistId, streamIds, maxJoinIndex + 1); + } + )).subscribeOn(Schedulers.io()); } - private List upsertStreams(final long playlistId, - final List streams, - final int indexOffset) { + private List insertJoinEntities(final long playlistId, final List streamIds, + final int indexOffset) { + + final List joinEntities = new ArrayList<>(streamIds.size()); - final List joinEntities = new ArrayList<>(streams.size()); - final List streamIds = streamTable.upsertAll(streams); for (int index = 0; index < streamIds.size(); index++) { joinEntities.add(new PlaylistStreamEntity(playlistId, streamIds.get(index), index + indexOffset)); @@ -83,6 +91,39 @@ public Completable updateJoin(final long playlistId, final List streamIds) })).subscribeOn(Schedulers.io()); } + public Completable updatePlaylists(final List updateItems, + final List deletedItems) { + final List items = new ArrayList<>(updateItems.size()); + for (final PlaylistMetadataEntry item : updateItems) { + items.add(new PlaylistEntity(item)); + } + return Completable.fromRunnable(() -> database.runInTransaction(() -> { + for (final Long uid : deletedItems) { + playlistTable.deletePlaylist(uid); + } + for (final PlaylistEntity item : items) { + playlistTable.upsertPlaylist(item); + } + })).subscribeOn(Schedulers.io()); + } + + public Flowable> getDistinctPlaylistStreams(final long playlistId) { + return playlistStreamTable + .getStreamsWithoutDuplicates(playlistId).subscribeOn(Schedulers.io()); + } + + /** + * Get playlists with attached information about how many times the provided stream is already + * contained in each playlist. + * + * @param streamUrl the stream url for which to check for duplicates + * @return a list of {@link PlaylistDuplicatesEntry} + */ + public Flowable> getPlaylistDuplicates(final String streamUrl) { + return playlistStreamTable.getPlaylistDuplicatesMetadata(streamUrl) + .subscribeOn(Schedulers.io()); + } + public Flowable> getPlaylists() { return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); } @@ -91,23 +132,18 @@ public Flowable> getPlaylistStreams(final long playlis return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); } - public Single deletePlaylist(final long playlistId) { - return Single.fromCallable(() -> playlistTable.deletePlaylist(playlistId)) - .subscribeOn(Schedulers.io()); - } - public Maybe renamePlaylist(final long playlistId, final String name) { - return modifyPlaylist(playlistId, name, null, false); + return modifyPlaylist(playlistId, name, THUMBNAIL_ID_LEAVE_UNCHANGED, false); } public Maybe changePlaylistThumbnail(final long playlistId, - final String thumbnailUrl, + final long thumbnailStreamId, final boolean isPermanent) { - return modifyPlaylist(playlistId, null, thumbnailUrl, isPermanent); + return modifyPlaylist(playlistId, null, thumbnailStreamId, isPermanent); } - public String getPlaylistThumbnail(final long playlistId) { - return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailUrl(); + public long getPlaylistThumbnailStreamId(final long playlistId) { + return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailStreamId(); } public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { @@ -115,14 +151,18 @@ public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { .getIsThumbnailPermanent(); } - public String getAutomaticPlaylistThumbnail(final long playlistId) { - final String def = "drawable://" + R.drawable.placeholder_thumbnail_playlist; - return playlistStreamTable.getAutomaticThumbnailUrl(playlistId, def).blockingFirst(); + public long getAutomaticPlaylistThumbnailStreamId(final long playlistId) { + final long streamId = playlistStreamTable.getAutomaticThumbnailStreamId(playlistId) + .blockingFirst(); + if (streamId < 0) { + return PlaylistEntity.DEFAULT_THUMBNAIL_ID; + } + return streamId; } private Maybe modifyPlaylist(final long playlistId, @Nullable final String name, - @Nullable final String thumbnailUrl, + final long thumbnailStreamId, final boolean isPermanent) { return playlistTable.getPlaylist(playlistId) .firstElement() @@ -132,8 +172,8 @@ private Maybe modifyPlaylist(final long playlistId, if (name != null) { playlist.setName(name); } - if (thumbnailUrl != null) { - playlist.setThumbnailUrl(thumbnailUrl); + if (thumbnailStreamId != THUMBNAIL_ID_LEAVE_UNCHANGED) { + playlist.setThumbnailStreamId(thumbnailStreamId); playlist.setIsThumbnailPermanent(isPermanent); } return playlistTable.update(playlist); diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java index 5221139e34f..4cc51f7525e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java @@ -7,20 +7,23 @@ import java.util.List; +import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; public class RemotePlaylistManager { + private final AppDatabase database; private final PlaylistRemoteDAO playlistRemoteTable; public RemotePlaylistManager(final AppDatabase db) { + database = db; playlistRemoteTable = db.playlistRemoteDAO(); } public Flowable> getPlaylists() { - return playlistRemoteTable.getAll().subscribeOn(Schedulers.io()); + return playlistRemoteTable.getPlaylists().subscribeOn(Schedulers.io()); } public Flowable> getPlaylist(final PlaylistInfo info) { @@ -33,6 +36,18 @@ public Single deletePlaylist(final long playlistId) { .subscribeOn(Schedulers.io()); } + public Completable updatePlaylists(final List updateItems, + final List deletedItems) { + return Completable.fromRunnable(() -> database.runInTransaction(() -> { + for (final Long uid: deletedItems) { + playlistRemoteTable.deletePlaylist(uid); + } + for (final PlaylistRemoteEntity item: updateItems) { + playlistRemoteTable.upsert(item); + } + })).subscribeOn(Schedulers.io()); + } + public Single onBookmark(final PlaylistInfo playlistInfo) { return Single.fromCallable(() -> { final PlaylistRemoteEntity playlist = new PlaylistRemoteEntity(playlistInfo); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt index ac7197b48fd..1fa70e4d860 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt @@ -51,7 +51,8 @@ enum class FeedGroupIcon( WORLD(34, R.drawable.ic_public), STAR(35, R.drawable.ic_stars), SUN(36, R.drawable.ic_wb_sunny), - RSS(37, R.drawable.ic_rss_feed); + RSS(37, R.drawable.ic_rss_feed), + WHATS_NEW(38, R.drawable.ic_subscriptions); @DrawableRes fun getDrawableRes(): Int { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index da8e1070a99..c3d3843eedf 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.local.subscription; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + import android.app.Dialog; import android.content.Intent; import android.os.Bundle; @@ -10,12 +12,10 @@ import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; -import org.schabi.newpipe.R; - -import icepick.Icepick; -import icepick.State; +import com.evernote.android.state.State; +import com.livefront.bridge.Bridge; -import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; +import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { @State @@ -57,12 +57,12 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { throw new IllegalStateException("Result intent is null"); } - Icepick.restoreInstanceState(this, savedInstanceState); + Bridge.restoreInstanceState(this, savedInstanceState); } @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + Bridge.saveInstanceState(this, outState); } } 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 9e1e19fff74..7288d91030c 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 @@ -20,11 +20,11 @@ import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager +import com.evernote.android.state.State import com.xwray.groupie.Group import com.xwray.groupie.GroupAdapter import com.xwray.groupie.Section import com.xwray.groupie.viewbinding.GroupieViewHolder -import icepick.State import io.reactivex.rxjava3.disposables.CompositeDisposable import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.GROUP_ALL_ID @@ -60,7 +60,6 @@ import org.schabi.newpipe.util.NavigationHelper import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.ServiceHelper import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountChannels -import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout import org.schabi.newpipe.util.external_communication.ShareUtils import java.text.SimpleDateFormat import java.util.Date @@ -116,6 +115,11 @@ class SubscriptionFragment : BaseStateFragment() { feedGroupsCarouselState = feedGroupsCarousel.onSaveInstanceState() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onDestroy() { super.onDestroy() disposables.dispose() @@ -245,7 +249,7 @@ class SubscriptionFragment : BaseStateFragment() { super.initViews(rootView, savedInstanceState) _binding = FragmentSubscriptionBinding.bind(rootView) - groupAdapter.spanCount = if (shouldUseGridLayout(context)) getGridSpanCountChannels(context) else 1 + groupAdapter.spanCount = if (SubscriptionViewModel.shouldUseGridForSubscription(requireContext())) getGridSpanCountChannels(context) else 1 binding.itemsList.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply { spanSizeLookup = groupAdapter.spanSizeLookup } @@ -337,8 +341,7 @@ class SubscriptionFragment : BaseStateFragment() { val actions = DialogInterface.OnClickListener { _, i -> when (i) { 0 -> ShareUtils.shareText( - requireContext(), selectedItem.name, selectedItem.url, - selectedItem.thumbnailUrl + requireContext(), selectedItem.name, selectedItem.url, selectedItem.thumbnails ) 1 -> ShareUtils.openUrlInBrowser(requireContext(), selectedItem.url) 2 -> deleteChannel(selectedItem) @@ -353,7 +356,6 @@ class SubscriptionFragment : BaseStateFragment() { AlertDialog.Builder(requireContext()) .setCustomTitle(dialogTitleBinding.root) .setItems(commands, actions) - .create() .show() } @@ -380,15 +382,15 @@ class SubscriptionFragment : BaseStateFragment() { override fun handleResult(result: SubscriptionState) { super.handleResult(result) - val shouldUseGridLayout = shouldUseGridLayout(context) when (result) { is SubscriptionState.LoadedState -> { result.subscriptions.forEach { if (it is ChannelItem) { it.gesturesListener = listenerChannelItem - it.itemVersion = when { - shouldUseGridLayout -> ChannelItem.ItemVersion.GRID - else -> ChannelItem.ItemVersion.MINI + it.itemVersion = if (SubscriptionViewModel.shouldUseGridForSubscription(requireContext())) { + ChannelItem.ItemVersion.GRID + } else { + ChannelItem.ItemVersion.MINI } } } @@ -433,10 +435,10 @@ class SubscriptionFragment : BaseStateFragment() { clear() if (listViewMode) { add(FeedGroupAddNewItem()) - add(FeedGroupCardItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.RSS)) + add(FeedGroupCardItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.WHATS_NEW)) } else { add(FeedGroupAddNewGridItem()) - add(FeedGroupCardGridItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.RSS)) + add(FeedGroupCardGridItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.WHATS_NEW)) } addAll(groups) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index b17f498015e..474add4f41b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.subscription import android.content.Context +import android.util.Pair import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable @@ -11,12 +12,13 @@ import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionDAO import org.schabi.newpipe.database.subscription.SubscriptionEntity -import org.schabi.newpipe.extractor.ListInfo import org.schabi.newpipe.extractor.channel.ChannelInfo -import org.schabi.newpipe.extractor.feed.FeedInfo +import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.FeedDatabaseManager +import org.schabi.newpipe.local.feed.service.FeedUpdateInfo import org.schabi.newpipe.util.ExtractorHelper +import org.schabi.newpipe.util.image.ImageStrategy class SubscriptionManager(context: Context) { private val database = NewPipeDatabase.getInstance(context) @@ -46,28 +48,38 @@ class SubscriptionManager(context: Context) { } } - fun upsertAll(infoList: List): List { + fun upsertAll(infoList: List>>): List { val listEntities = subscriptionTable.upsertAll( - infoList.map { SubscriptionEntity.from(it) } + infoList.map { SubscriptionEntity.from(it.first) } ) database.runInTransaction { infoList.forEachIndexed { index, info -> - feedDatabaseManager.upsertAll(listEntities[index].uid, info.relatedItems) + info.second.forEach { + feedDatabaseManager.upsertAll( + listEntities[index].uid, + it.relatedItems.filterIsInstance() + ) + } } } return listEntities } - fun updateChannelInfo(info: ChannelInfo): Completable = subscriptionTable.getSubscription(info.serviceId, info.url) - .flatMapCompletable { - Completable.fromRunnable { - it.setData(info.name, info.avatarUrl, info.description, info.subscriberCount) - subscriptionTable.update(it) - feedDatabaseManager.upsertAll(it.uid, info.relatedItems) + fun updateChannelInfo(info: ChannelInfo): Completable = + subscriptionTable.getSubscription(info.serviceId, info.url) + .flatMapCompletable { + Completable.fromRunnable { + it.setData( + info.name, + ImageStrategy.imageListToDbUrl(info.avatars), + info.description, + info.subscriberCount + ) + subscriptionTable.update(it) + } } - } fun updateNotificationMode(serviceId: Int, url: String, @NotificationMode mode: Int): Completable { return subscriptionTable().getSubscription(serviceId, url) @@ -84,19 +96,17 @@ class SubscriptionManager(context: Context) { } } - fun updateFromInfo(subscriptionId: Long, info: ListInfo) { - val subscriptionEntity = subscriptionTable.getSubscription(subscriptionId) - - if (info is FeedInfo) { - subscriptionEntity.name = info.name - } else if (info is ChannelInfo) { - subscriptionEntity.setData( - info.name, - info.avatarUrl, - info.description, - info.subscriberCount - ) - } + fun updateFromInfo(info: FeedUpdateInfo) { + val subscriptionEntity = subscriptionTable.getSubscription(info.uid) + + subscriptionEntity.name = info.name + + // some services do not provide an avatar URL + info.avatarUrl?.let { subscriptionEntity.avatarUrl = it } + + // these two fields are null if the feed info was fetched using the fast feed method + info.description?.let { subscriptionEntity.description = it } + info.subscriberCount?.let { subscriptionEntity.subscriberCount = it } subscriptionTable.update(subscriptionEntity) } @@ -107,11 +117,8 @@ class SubscriptionManager(context: Context) { .observeOn(AndroidSchedulers.mainThread()) } - fun insertSubscription(subscriptionEntity: SubscriptionEntity, info: ChannelInfo) { - database.runInTransaction { - val subscriptionId = subscriptionTable.insert(subscriptionEntity) - feedDatabaseManager.upsertAll(subscriptionId, info.relatedItems) - } + fun insertSubscription(subscriptionEntity: SubscriptionEntity) { + subscriptionTable.insert(subscriptionEntity) } fun deleteSubscription(subscriptionEntity: SubscriptionEntity) { @@ -125,7 +132,10 @@ class SubscriptionManager(context: Context) { */ private fun rememberAllStreams(subscription: SubscriptionEntity): Completable { return ExtractorHelper.getChannelInfo(subscription.serviceId, subscription.url, false) - .map { channel -> channel.relatedItems.map { stream -> StreamEntity(stream) } } + .flatMap { info -> + ExtractorHelper.getChannelTab(subscription.serviceId, info.tabs.first(), false) + } + .map { channel -> channel.relatedItems.filterIsInstance().map { stream -> StreamEntity(stream) } } .flatMapCompletable { entities -> Completable.fromAction { database.streamDAO().upsertAll(entities) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt index 914299c78f1..dfad60c3f48 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.subscription import android.app.Application +import android.content.Context import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -8,12 +9,13 @@ import com.xwray.groupie.Group import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import org.schabi.newpipe.info_list.ItemViewMode import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardGridItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT -import org.schabi.newpipe.util.ThemeHelper +import org.schabi.newpipe.util.ThemeHelper.getItemViewMode import java.util.concurrent.TimeUnit class SubscriptionViewModel(application: Application) : AndroidViewModel(application) { @@ -22,7 +24,7 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica // true -> list view, false -> grid view private val listViewMode = BehaviorProcessor.createDefault( - !ThemeHelper.shouldUseGridLayout(application) + !shouldUseGridForSubscription(application) ) private val listViewModeFlowable = listViewMode.distinctUntilChanged() @@ -77,4 +79,26 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica data class LoadedState(val subscriptions: List) : SubscriptionState() data class ErrorState(val error: Throwable? = null) : SubscriptionState() } + + companion object { + + /** + * Returns whether to use GridLayout mode for Subscription Fragment. + * + * ### Current mapping: + * + * | ItemViewMode | ItemVersion | Span count | + * |---|---|---| + * | AUTO | MINI | 1 | + * | LIST | MINI | 1 | + * | CARD | GRID | > 1 (ThemeHelper defined) | + * | GRID | GRID | > 1 (ThemeHelper defined) | + * + * @see [SubscriptionViewModel.shouldUseGridForSubscription] to modify Layout Manager + */ + fun shouldUseGridForSubscription(context: Context): Boolean { + val itemViewMode = getItemViewMode(context) + return itemViewMode == ItemViewMode.GRID || itemViewMode == ItemViewMode.CARD + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java index 56972b60d99..77a70afa9dc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java @@ -27,6 +27,8 @@ import androidx.appcompat.app.ActionBar; import androidx.core.text.util.LinkifyCompat; +import com.evernote.android.state.State; + import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorInfo; @@ -44,8 +46,6 @@ import java.util.Collections; import java.util.List; -import icepick.State; - public class SubscriptionsImportFragment extends BaseFragment { @State int currentServiceId = Constants.NO_SERVICE_ID; diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 19c581c080f..71c90e3c115 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -18,11 +18,11 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.evernote.android.state.State +import com.livefront.bridge.Bridge import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.OnItemClickListener import com.xwray.groupie.Section -import icepick.Icepick -import icepick.State import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.databinding.DialogFeedGroupCreateBinding @@ -55,10 +55,10 @@ class FeedGroupDialog : DialogFragment(), BackPressable { private var groupSortOrder: Long = -1 sealed class ScreenState : Serializable { - object InitialScreen : ScreenState() - object IconPickerScreen : ScreenState() - object SubscriptionsPickerScreen : ScreenState() - object DeleteScreen : ScreenState() + data object InitialScreen : ScreenState() + data object IconPickerScreen : ScreenState() + data object SubscriptionsPickerScreen : ScreenState() + data object DeleteScreen : ScreenState() } @State @JvmField var selectedIcon: FeedGroupIcon? = null @@ -78,7 +78,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Icepick.restoreInstanceState(this, savedInstanceState) + Bridge.restoreInstanceState(this, savedInstanceState) setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext())) groupId = arguments?.getLong(KEY_GROUP_ID, NO_GROUP_SELECTED) ?: NO_GROUP_SELECTED @@ -114,7 +114,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { iconsListState = feedGroupCreateBinding.iconSelector.layoutManager?.onSaveInstanceState() subscriptionsListState = feedGroupCreateBinding.subscriptionsSelectorList.layoutManager?.onSaveInstanceState() - Icepick.saveInstanceState(this, outState) + Bridge.saveInstanceState(this, outState) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -370,7 +370,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { private fun setupIconPicker() { val groupAdapter = GroupieAdapter() - groupAdapter.addAll(FeedGroupIcon.values().map { PickerIconItem(it) }) + groupAdapter.addAll(FeedGroupIcon.entries.map { PickerIconItem(it) }) feedGroupCreateBinding.iconSelector.apply { layoutManager = GridLayoutManager(requireContext(), 7, RecyclerView.VERTICAL, false) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt index eff1a4400bb..292bda394cc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt @@ -110,8 +110,8 @@ class FeedGroupDialogViewModel( } sealed class DialogEvent { - object ProcessingEvent : DialogEvent() - object SuccessEvent : DialogEvent() + data object ProcessingEvent : DialogEvent() + data object SuccessEvent : DialogEvent() } data class Filter(val query: String, val showOnlyUngrouped: Boolean) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt index 1f3ab71eb62..c087da46441 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt @@ -11,10 +11,10 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper.SimpleCallback import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.evernote.android.state.State +import com.livefront.bridge.Bridge import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.TouchCallback -import icepick.Icepick -import icepick.State import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.databinding.DialogFeedGroupReorderBinding @@ -23,10 +23,6 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewMo import org.schabi.newpipe.local.subscription.item.FeedGroupReorderItem import org.schabi.newpipe.util.ThemeHelper import java.util.Collections -import kotlin.collections.ArrayList -import kotlin.collections.List -import kotlin.collections.map -import kotlin.collections.sortedBy class FeedGroupReorderDialog : DialogFragment() { private var _binding: DialogFeedGroupReorderBinding? = null @@ -42,7 +38,7 @@ class FeedGroupReorderDialog : DialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Icepick.restoreInstanceState(this, savedInstanceState) + Bridge.restoreInstanceState(this, savedInstanceState) setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext())) } @@ -80,7 +76,7 @@ class FeedGroupReorderDialog : DialogFragment() { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - Icepick.saveInstanceState(this, outState) + Bridge.saveInstanceState(this, outState) } private fun handleGroups(list: List) { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt index bee2e910a8d..bc39dafe632 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt @@ -9,7 +9,7 @@ import org.schabi.newpipe.R import org.schabi.newpipe.extractor.channel.ChannelInfoItem import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.OnClickGesture -import org.schabi.newpipe.util.PicassoHelper +import org.schabi.newpipe.util.image.PicassoHelper class ChannelItem( private val infoItem: ChannelInfoItem, @@ -39,7 +39,7 @@ class ChannelItem( itemChannelDescriptionView.text = infoItem.description } - PicassoHelper.loadAvatar(infoItem.thumbnailUrl).into(itemThumbnailView) + PicassoHelper.loadAvatar(infoItem.thumbnails).into(itemThumbnailView) gesturesListener?.run { viewHolder.root.setOnClickListener { selected(infoItem) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt index aadb2fc73e6..3a4c6e41b99 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.databinding.PickerSubscriptionItemBinding import org.schabi.newpipe.ktx.AnimationType import org.schabi.newpipe.ktx.animate -import org.schabi.newpipe.util.PicassoHelper +import org.schabi.newpipe.util.image.PicassoHelper data class PickerSubscriptionItem( val subscriptionEntity: SubscriptionEntity, diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java index d56d16f3cc5..ab1a5a10c2e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java @@ -25,6 +25,7 @@ import android.net.Uri; import android.util.Log; +import androidx.core.content.IntentCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.reactivestreams.Subscriber; @@ -65,7 +66,7 @@ public int onStartCommand(final Intent intent, final int flags, final int startI return START_NOT_STICKY; } - final Uri path = intent.getParcelableExtra(KEY_FILE_PATH); + final Uri path = IntentCompat.getParcelableExtra(intent, KEY_FILE_PATH, Uri.class); if (path == null) { stopAndReportError(new IllegalStateException( "Exporting to a file, but the path is null"), @@ -75,7 +76,10 @@ public int onStartCommand(final Intent intent, final int flags, final int startI try { outFile = new StoredFileHelper(this, path, "application/json"); - outputStream = new SharpOutputStream(outFile.getStream()); + // truncate the file before writing to it, otherwise if the new content is smaller than + // the previous file size, the file will retain part of the previous content and be + // corrupted + outputStream = new SharpOutputStream(outFile.openAndTruncateStream()); } catch (final IOException e) { handleError(e); return START_NOT_STICKY; diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java index af598b10601..442c7fddb8b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java @@ -26,9 +26,11 @@ import android.net.Uri; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.IntentCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.reactivestreams.Subscriber; @@ -38,6 +40,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo; import org.schabi.newpipe.extractor.subscription.SubscriptionItem; import org.schabi.newpipe.ktx.ExceptionUtils; import org.schabi.newpipe.streams.io.SharpInputStream; @@ -48,6 +51,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -105,7 +109,7 @@ public int onStartCommand(final Intent intent, final int flags, final int startI if (currentMode == CHANNEL_URL_MODE) { channelUrl = intent.getStringExtra(KEY_VALUE); } else { - final Uri uri = intent.getParcelableExtra(KEY_VALUE); + final Uri uri = IntentCompat.getParcelableExtra(intent, KEY_VALUE, Uri.class); if (uri == null) { stopAndReportError(new IllegalStateException( "Importing from input stream, but file path is null"), @@ -199,12 +203,19 @@ private void startImport() { .parallel(PARALLEL_EXTRACTIONS) .runOn(Schedulers.io()) - .map((Function>) subscriptionItem -> { + .map((Function>>>) subscriptionItem -> { try { - return Notification.createOnNext(ExtractorHelper + final ChannelInfo channelInfo = ExtractorHelper .getChannelInfo(subscriptionItem.getServiceId(), subscriptionItem.getUrl(), true) - .blockingGet()); + .blockingGet(); + return Notification.createOnNext(new Pair<>(channelInfo, + Collections.singletonList( + ExtractorHelper.getChannelTab( + subscriptionItem.getServiceId(), + channelInfo.getTabs().get(0), true).blockingGet() + ))); } catch (final Throwable e) { return Notification.createOnError(e); } @@ -223,7 +234,7 @@ private void startImport() { } private Subscriber> getSubscriber() { - return new Subscriber>() { + return new Subscriber<>() { @Override public void onSubscribe(final Subscription s) { subscription = s; @@ -254,10 +265,11 @@ public void onComplete() { }; } - private Consumer> getNotificationsConsumer() { + private Consumer>>> getNotificationsConsumer() { return notification -> { if (notification.isOnNext()) { - final String name = notification.getValue().getName(); + final String name = notification.getValue().first.getName(); eventListener.onItemCompleted(!TextUtils.isEmpty(name) ? name : ""); } else if (notification.isOnError()) { final Throwable error = notification.getError(); @@ -275,10 +287,12 @@ private Consumer> getNotificationsConsumer() { }; } - private Function>, List> upsertBatch() { + private Function>>>, + List> upsertBatch() { return notificationList -> { - final List infoList = new ArrayList<>(notificationList.size()); - for (final Notification n : notificationList) { + final List>> infoList = + new ArrayList<>(notificationList.size()); + for (final Notification>> n : notificationList) { if (n.isOnNext()) { infoList.add(n.getValue()); } 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 94de7fef383..195baecbda8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -13,8 +13,10 @@ 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.ImageButton; import android.widget.SeekBar; import androidx.annotation.Nullable; @@ -27,11 +29,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; @@ -44,6 +48,9 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.util.List; +import java.util.Optional; + public final class PlayQueueActivity extends AppCompatActivity implements PlayerEventListener, SeekBar.OnSeekBarChangeListener, View.OnClickListener, PlaybackParameterDialog.Callback { @@ -52,6 +59,8 @@ public final class PlayQueueActivity extends AppCompatActivity private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80; + private static final int MENU_ID_AUDIO_TRACK = 71; + private Player player; private boolean serviceBound; @@ -97,6 +106,7 @@ public 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) { @@ -143,11 +153,9 @@ public boolean onOptionsItemSelected(final MenuItem item) { NavigationHelper.playOnMainPlayer(this, player.getPlayQueue(), true); return true; case R.id.action_switch_popup: - if (PermissionHelper.isPopupEnabled(this)) { + if (PermissionHelper.isPopupEnabledElseAsk(this)) { this.player.setRecovery(); NavigationHelper.playOnPopupPlayer(this, player.getPlayQueue(), true); - } else { - PermissionHelper.showPopupEnablementToast(this); } return true; case R.id.action_switch_background: @@ -155,6 +163,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); } @@ -518,18 +532,19 @@ public void onServiceStopped() { //////////////////////////////////////////////////////////////////////////// private void onStateChanged(final int state) { + final ImageButton playPauseButton = queueControlBinding.controlPlayPause; switch (state) { case Player.STATE_PAUSED: - queueControlBinding.controlPlayPause - .setImageResource(R.drawable.ic_play_arrow); + playPauseButton.setImageResource(R.drawable.ic_play_arrow); + playPauseButton.setContentDescription(getString(R.string.play)); break; case Player.STATE_PLAYING: - queueControlBinding.controlPlayPause - .setImageResource(R.drawable.ic_pause); + playPauseButton.setImageResource(R.drawable.ic_pause); + playPauseButton.setContentDescription(getString(R.string.pause)); break; case Player.STATE_COMPLETED: - queueControlBinding.controlPlayPause - .setImageResource(R.drawable.ic_replay); + playPauseButton.setImageResource(R.drawable.ic_replay); + playPauseButton.setContentDescription(getString(R.string.replay)); break; default: break; @@ -554,16 +569,16 @@ private void onStateChanged(final int state) { private void onPlayModeChanged(final int repeatMode, final boolean shuffled) { switch (repeatMode) { case com.google.android.exoplayer2.Player.REPEAT_MODE_OFF: - queueControlBinding.controlRepeat - .setImageResource(R.drawable.exo_controls_repeat_off); + queueControlBinding.controlRepeat.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_off); break; case com.google.android.exoplayer2.Player.REPEAT_MODE_ONE: - queueControlBinding.controlRepeat - .setImageResource(R.drawable.exo_controls_repeat_one); + queueControlBinding.controlRepeat.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_one); break; case com.google.android.exoplayer2.Player.REPEAT_MODE_ALL: - queueControlBinding.controlRepeat - .setImageResource(R.drawable.exo_controls_repeat_all); + queueControlBinding.controlRepeat.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_all); break; } @@ -572,11 +587,9 @@ private void onPlayModeChanged(final int repeatMode, final boolean shuffled) { } private void onPlaybackParameterChanged(@Nullable final PlaybackParameters parameters) { - if (parameters != null) { - if (menu != null && player != null) { - final MenuItem item = menu.findItem(R.id.action_playback_speed); - item.setTitle(formatSpeed(parameters.speed)); - } + if (parameters != null && menu != null && player != null) { + final MenuItem item = menu.findItem(R.id.action_playback_speed); + item.setTitle(formatSpeed(parameters.speed)); } } @@ -593,4 +606,71 @@ 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) + .map(Player::getCurrentMetadata) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) + .orElse(null); + final Optional selectedAudioStream = Optional.ofNullable(player) + .flatMap(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 b6098a1ef7d..920435a7e3b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -29,7 +29,6 @@ import static com.google.android.exoplayer2.Player.RepeatMode; import static org.schabi.newpipe.extractor.ServiceList.YouTube; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; -import static org.schabi.newpipe.player.helper.PlayerHelper.isPlaybackResumeEnabled; import static org.schabi.newpipe.player.helper.PlayerHelper.nextRepeatMode; import static org.schabi.newpipe.player.helper.PlayerHelper.retrievePlaybackParametersFromPrefs; import static org.schabi.newpipe.player.helper.PlayerHelper.retrieveSeekDurationFromPreferences; @@ -70,7 +69,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.Timeline; import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.source.MediaSource; @@ -78,7 +76,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; @@ -89,6 +86,8 @@ 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.Image; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -97,6 +96,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; @@ -115,10 +115,10 @@ import org.schabi.newpipe.player.ui.PlayerUiList; import org.schabi.newpipe.player.ui.PopupPlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; -import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.SerializedCache; import org.schabi.newpipe.util.StreamTypeUtil; @@ -181,13 +181,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 @@ -196,12 +201,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 @@ -226,24 +236,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; /*////////////////////////////////////////////////////////////////////////// @@ -263,7 +281,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); @@ -326,7 +353,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 @@ -334,7 +361,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()); @@ -348,7 +375,7 @@ public void handleIntent(@NonNull final Intent intent) { final boolean playbackSkipSilence = getPrefs().getBoolean(getContext().getString( R.string.playback_skip_silence_key), getPlaybackSkipSilence()); - final boolean samePlayQueue = playQueue != null && playQueue.equals(newQueue); + final boolean samePlayQueue = playQueue != null && playQueue.equalStreamsAndIndex(newQueue); final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode()); final boolean playWhenReady = intent.getBooleanExtra(PLAY_WHEN_READY, true); final boolean isMuted = intent.getBooleanExtra(IS_MUTED, isMuted()); @@ -391,7 +418,7 @@ public void handleIntent(@NonNull final Intent intent) { simpleExoPlayer.setPlayWhenReady(playWhenReady); } else if (intent.getBooleanExtra(RESUME_PLAYBACK, false) - && isPlaybackResumeEnabled(this) + && DependentPreferenceHelper.getResumePlaybackEnabled(context) && !samePlayQueue && !newQueue.isEmpty() && newQueue.getItem() != null @@ -435,7 +462,6 @@ && isPlaybackResumeEnabled(this) if (oldPlayerType != playerType && playQueue != null) { // If playerType changes from one to another we should reload the player // (to disable/enable video stream or to set quality) - setRecovery(); reloadPlayQueueManager(); } @@ -520,16 +546,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 @@ -784,10 +805,10 @@ public void onPrepareLoad(final Drawable placeHolderDrawable) { }; } - private void loadCurrentThumbnail(final String url) { + private void loadCurrentThumbnail(final List thumbnails) { if (DEBUG) { - Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with url = [" - + (url == null ? "null" : url) + "]"); + Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with thumbnails = [" + + thumbnails.size() + "]"); } // first cancel any previous loading @@ -796,12 +817,12 @@ private void loadCurrentThumbnail(final String url) { // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media // session metadata while the new thumbnail is being loaded by Picasso. onThumbnailLoaded(null); - if (isNullOrEmpty(url)) { + if (thumbnails.isEmpty()) { return; } // scale down the notification thumbnail for performance - PicassoHelper.loadScaledDownThumbnail(context, url) + PicassoHelper.loadScaledDownThumbnail(context, thumbnails) .tag(PICASSO_PLAYER_THUMBNAIL_TAG) .into(currentThumbnailTarget); } @@ -911,7 +932,7 @@ public void triggerProgressUpdate() { 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)); @@ -920,7 +941,6 @@ private Disposable getProgressUpdateDisposable() { //endregion - /*////////////////////////////////////////////////////////////////////////// // Playback states //////////////////////////////////////////////////////////////////////////*/ @@ -1062,7 +1082,7 @@ private void onPrepared(final boolean playWhenReady) { UIs.call(PlayerUi::onPrepared); - if (playWhenReady) { + if (playWhenReady && !isMuted()) { audioReactor.requestAudioFocus(); } } @@ -1203,6 +1223,11 @@ public void toggleShuffleModeEnabled() { public void toggleMute() { final boolean wasMuted = isMuted(); simpleExoPlayer.setVolume(wasMuted ? 1 : 0); + if (wasMuted) { + audioReactor.requestAudioFocus(); + } else { + audioReactor.abandonAudioFocus(); + } UIs.call(playerUi -> playerUi.onMuteUnmuteChanged(!wasMuted)); notifyPlaybackUpdateToListeners(); } @@ -1242,6 +1267,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()) { @@ -1262,6 +1290,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(); } }); }); @@ -1349,6 +1383,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:

@@ -1375,8 +1410,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. @@ -1589,7 +1625,9 @@ public void play() { return; } - audioReactor.requestAudioFocus(); + if (!isMuted()) { + audioReactor.requestAudioFocus(); + } if (currentState == STATE_COMPLETED) { if (playQueue.getIndex() == 0) { @@ -1754,10 +1792,11 @@ private void updateMetadataWith(@NonNull final StreamInfo info) { maybeAutoQueueNextStream(info); - loadCurrentThumbnail(info.getThumbnailUrl()); + loadCurrentThumbnail(info.getThumbnails()); registerStreamViewed(); notifyMetadataUpdateToListeners(); + notifyAudioTrackUpdateToListeners(); UIs.call(playerUi -> playerUi.onMetadataChanged(info)); } @@ -1886,6 +1925,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 @@ -2017,44 +2062,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(); }); @@ -2113,7 +2160,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); @@ -2175,7 +2222,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(); } @@ -2253,7 +2311,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..e7abf4320d5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java @@ -29,8 +29,11 @@ import android.util.Log; import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; +import org.schabi.newpipe.player.notification.NotificationPlayerUi; import org.schabi.newpipe.util.ThemeHelper; +import java.lang.ref.WeakReference; + /** * One service for all players. @@ -41,7 +44,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); /*////////////////////////////////////////////////////////////////////////// @@ -57,6 +60,14 @@ public void onCreate() { ThemeHelper.setTheme(this); player = new Player(this); + /* + Create the player notification and start immediately the service in foreground, + otherwise if nothing is played or initializing the player and its components (especially + loading stream metadata) takes a lot of time, the app would crash on Android 8+ as the + service would never be put in the foreground while we said to the system we would do so + */ + player.UIs().get(NotificationPlayerUi.class) + .ifPresent(NotificationPlayerUi::createNotificationAndStartForeground); } @Override @@ -66,16 +77,38 @@ public int onStartCommand(final Intent intent, final int flags, final int startI + "], flags = [" + flags + "], startId = [" + startId + "]"); } + /* + Be sure that the player notification is set and the service is started in foreground, + otherwise, the app may crash on Android 8+ as the service would never be put in the + foreground while we said to the system we would do so + The service is always requested to be started in foreground, so always creating a + notification if there is no one already and starting the service in foreground should + not create any issues + If the service is already started in foreground, requesting it to be started shouldn't + do anything + */ + if (player != null) { + player.UIs().get(NotificationPlayerUi.class) + .ifPresent(NotificationPlayerUi::createNotificationAndStartForeground); + } + if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) - && player.getPlayQueue() == null) { - // No need to process media button's actions if the player is not working, otherwise the - // player service would strangely start with nothing to play + && (player == null || player.getPlayQueue() == null)) { + /* + No need to process media button's actions if the player is not working, otherwise + the player service would strangely start with nothing to play + Stop the service in this case, which will be removed from the foreground and its + notification cancelled in its destruction + */ + stopSelf(); return START_NOT_STICKY; } - player.handleIntent(intent); - player.UIs().get(MediaSessionPlayerUi.class) - .ifPresent(ui -> ui.handleMediaButtonIntent(intent)); + if (player != null) { + player.handleIntent(intent); + player.UIs().get(MediaSessionPlayerUi.class) + .ifPresent(ui -> ui.handleMediaButtonIntent(intent)); + } return START_NOT_STICKY; } @@ -85,7 +118,7 @@ public void stopForImmediateReusing() { Log.d(TAG, "stopForImmediateReusing() called"); } - if (!player.exoPlayerIsNull()) { + if (player != null && !player.exoPlayerIsNull()) { // Releases wifi & cpu, disables keepScreenOn, etc. // We can't just pause the player here because it will make transition // from one stream to a new stream not smooth @@ -96,7 +129,7 @@ public void stopForImmediateReusing() { @Override public void onTaskRemoved(final Intent rootIntent) { super.onTaskRemoved(rootIntent); - if (!player.videoPlayerSelected()) { + if (player != null && !player.videoPlayerSelected()) { return; } onDestroy(); @@ -134,14 +167,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..ff0bb269d0a 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 @@ -7,7 +7,6 @@ import android.view.View.OnTouchListener import android.widget.ProgressBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources -import androidx.core.math.MathUtils import androidx.core.view.isVisible import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R @@ -113,7 +112,7 @@ class MainPlayerGestureListener( // Update progress bar val oldBrightness = layoutParams.screenBrightness - bar.progress = (bar.max * MathUtils.clamp(oldBrightness, 0f, 1f)).toInt() + bar.progress = (bar.max * oldBrightness.coerceIn(0f, 1f)).toInt() bar.incrementProgressBy(distanceY.toInt()) // Update brightness @@ -161,13 +160,12 @@ class MainPlayerGestureListener( } override fun onScroll( - initialEvent: MotionEvent, + initialEvent: MotionEvent?, movingEvent: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { - - if (!playerUi.isFullscreen) { + if (initialEvent == null || !playerUi.isFullscreen) { return false } @@ -193,18 +191,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/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index a540c0ab02f..0b94bf364e0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -4,7 +4,7 @@ import android.util.Log import android.view.MotionEvent import android.view.View import android.view.ViewConfiguration -import androidx.core.math.MathUtils +import androidx.core.view.isVisible import org.schabi.newpipe.MainActivity import org.schabi.newpipe.ktx.AnimationType import org.schabi.newpipe.ktx.animate @@ -167,7 +167,7 @@ class PopupPlayerGestureListener( } override fun onFling( - e1: MotionEvent, + e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float @@ -218,11 +218,14 @@ class PopupPlayerGestureListener( } override fun onScroll( - initialEvent: MotionEvent, + initialEvent: MotionEvent?, movingEvent: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { + if (initialEvent == null) { + return false + } if (isResizing) { return super.onScroll(initialEvent, movingEvent, distanceX, distanceY) @@ -235,14 +238,16 @@ class PopupPlayerGestureListener( isMoving = true val diffX = (movingEvent.rawX - initialEvent.rawX) - val posX = MathUtils.clamp( - initialPopupX + diffX, - 0f, (playerUi.screenWidth - playerUi.popupLayoutParams.width).toFloat() + val posX = (initialPopupX + diffX).coerceIn( + 0f, + (playerUi.screenWidth - playerUi.popupLayoutParams.width).toFloat() + .coerceAtLeast(0f) ) val diffY = (movingEvent.rawY - initialEvent.rawY) - val posY = MathUtils.clamp( - initialPopupY + diffY, - 0f, (playerUi.screenHeight - playerUi.popupLayoutParams.height).toFloat() + val posY = (initialPopupY + diffY).coerceIn( + 0f, + (playerUi.screenHeight - playerUi.popupLayoutParams.height).toFloat() + .coerceAtLeast(0f) ) playerUi.popupLayoutParams.x = posX.toInt() @@ -251,8 +256,7 @@ class PopupPlayerGestureListener( // -- Determine if the ClosingOverlayView (red X) has to be shown or hidden -- val showClosingOverlayView: Boolean = playerUi.isInsideClosingRadius(movingEvent) // Check if an view is in expected state and if not animate it into the correct state - val expectedVisibility = if (showClosingOverlayView) View.VISIBLE else View.GONE - if (binding.closingOverlay.visibility != expectedVisibility) { + if (binding.closingOverlay.isVisible != showClosingOverlayView) { binding.closingOverlay.animate(showClosingOverlayView, 200) } 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/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index 796208a0498..7e74c38480b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -24,6 +24,9 @@ import androidx.fragment.app.DialogFragment; import androidx.preference.PreferenceManager; +import com.evernote.android.state.State; +import com.livefront.bridge.Bridge; + import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.DialogPlaybackParameterBinding; import org.schabi.newpipe.player.ui.VideoPlayerUi; @@ -37,9 +40,6 @@ import java.util.function.DoubleFunction; import java.util.function.DoubleSupplier; -import icepick.Icepick; -import icepick.State; - public class PlaybackParameterDialog extends DialogFragment { private static final String TAG = "PlaybackParameterDialog"; @@ -135,7 +135,7 @@ public void onAttach(@NonNull final Context context) { @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + Bridge.saveInstanceState(this, outState); } /*////////////////////////////////////////////////////////////////////////// @@ -146,7 +146,7 @@ public void onSaveInstanceState(@NonNull final Bundle outState) { @Override public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) { assureCorrectAppLanguage(getContext()); - Icepick.restoreInstanceState(this, savedInstanceState); + Bridge.restoreInstanceState(this, savedInstanceState); binding = DialogPlaybackParameterBinding.inflate(getLayoutInflater()); initUI(); @@ -342,14 +342,14 @@ private void changePitchControlMode(final boolean semitones) { final Map pitchCtrlModeComponentMapping = getPitchControlModeComponentMappings(); pitchCtrlModeComponentMapping.forEach((v, textView) -> textView.setBackground( - resolveDrawable(requireContext(), R.attr.selectableItemBackground))); + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground))); // Mark the selected textview final TextView textView = pitchCtrlModeComponentMapping.get(semitones); if (textView != null) { textView.setBackground(new LayerDrawable(new Drawable[]{ resolveDrawable(requireContext(), R.attr.dashed_border), - resolveDrawable(requireContext(), R.attr.selectableItemBackground) + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground) })); } @@ -415,14 +415,14 @@ private void setStepSizeToUI(final double newStepSize) { // Bring all textviews into a normal state final Map stepSiteComponentMapping = getStepSizeComponentMappings(); stepSiteComponentMapping.forEach((v, textView) -> textView.setBackground( - resolveDrawable(requireContext(), R.attr.selectableItemBackground))); + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground))); // Mark the selected textview final TextView textView = stepSiteComponentMapping.get(newStepSize); if (textView != null) { textView.setBackground(new LayerDrawable(new Drawable[]{ resolveDrawable(requireContext(), R.attr.dashed_border), - resolveDrawable(requireContext(), R.attr.selectableItemBackground) + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground) })); } 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 abde7c3d12c..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 @@ -14,6 +14,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.provider.Settings; import android.view.accessibility.CaptioningManager; @@ -227,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) { @@ -382,8 +385,11 @@ public static void setScreenBrightness(@NonNull final Context context, public static boolean globalScreenOrientationLocked(final Context context) { // 1: Screen orientation changes using accelerometer // 0: Screen orientation is locked + // if the accelerometer sensor is missing completely, assume locked orientation return android.provider.Settings.System.getInt( - context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 0; + context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 0 + || !context.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER); } public static int getProgressiveLoadIntervalBytes(@NonNull final Context context) { @@ -425,13 +431,6 @@ private static SinglePlayQueue getAutoQueuedSinglePlayQueue( // Utils used by player //////////////////////////////////////////////////////////////////////////// - public static boolean isPlaybackResumeEnabled(final Player player) { - return player.getPrefs().getBoolean( - player.getContext().getString(R.string.enable_watch_history_key), true) - && player.getPrefs().getBoolean( - player.getContext().getString(R.string.enable_playback_resume_key), true); - } - @RepeatMode public static int nextRepeatMode(@RepeatMode final int repeatMode) { switch (repeatMode) { diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java index ebedf8c71f6..95a4f74af4d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java @@ -3,6 +3,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.util.image.ImageStrategy; import java.util.List; import java.util.Optional; @@ -74,7 +75,7 @@ public String getStreamUrl() { @Override public String getThumbnailUrl() { - return item.getThumbnailUrl(); + return ImageStrategy.choosePreferredImage(item.getThumbnails()); } @Override 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..346bb92fab6 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); @@ -75,8 +81,9 @@ default String makeMediaId() { @NonNull default MediaItem asMediaItem() { + final String thumbnailUrl = getThumbnailUrl(); final MediaMetadata mediaMetadata = new MediaMetadata.Builder() - .setArtworkUri(Uri.parse(getThumbnailUrl())) + .setArtworkUri(thumbnailUrl == null ? null : Uri.parse(thumbnailUrl)) .setArtist(getUploaderName()) .setDescription(getTitle()) .setDisplayTitle(getTitle()) @@ -128,4 +135,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..e24a93615a4 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,9 +2,11 @@ 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; +import org.schabi.newpipe.util.image.ImageStrategy; import java.util.Collections; import java.util.List; @@ -25,25 +27,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 @@ -78,7 +96,7 @@ public String getStreamUrl() { @Override public String getThumbnailUrl() { - return streamInfo.getThumbnailUrl(); + return ImageStrategy.choosePreferredImage(streamInfo.getThumbnails()); } @Override @@ -103,6 +121,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 +134,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/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index e9541ab06d8..c673e688c47 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -1,9 +1,12 @@ package org.schabi.newpipe.player.mediasession; import static org.schabi.newpipe.MainActivity.DEBUG; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_RECREATE_NOTIFICATION; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.os.Build; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; import android.util.Log; @@ -13,24 +16,44 @@ import androidx.media.session.MediaButtonReceiver; import com.google.android.exoplayer2.ForwardingPlayer; +import com.google.android.exoplayer2.Player.RepeatMode; import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.notification.NotificationActionData; +import org.schabi.newpipe.player.notification.NotificationConstants; import org.schabi.newpipe.player.ui.PlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.StreamTypeUtil; +import java.util.List; +import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; -public class MediaSessionPlayerUi extends PlayerUi { +public class MediaSessionPlayerUi extends PlayerUi + implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "MediaSessUi"; + @Nullable private MediaSessionCompat mediaSession; + @Nullable private MediaSessionConnector sessionConnector; + private final String ignoreHardwareMediaButtonsKey; + private boolean shouldIgnoreHardwareMediaButtons = false; + + // used to check whether any notification action changed, before sending costly updates + private List prevNotificationActions = List.of(); + + public MediaSessionPlayerUi(@NonNull final Player player) { super(player); + ignoreHardwareMediaButtonsKey = + context.getString(R.string.ignore_hardware_media_buttons_key); } @Override @@ -45,14 +68,29 @@ public void initPlayer() { sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); sessionConnector.setPlayer(getForwardingPlayer()); + // It seems like events from the Media Control UI in the notification area don't go through + // this function, so it's safe to just ignore all events in case we want to ignore the + // hardware media buttons. Returning true stops all further event processing of the system. + sessionConnector.setMediaButtonEventHandler((p, i) -> shouldIgnoreHardwareMediaButtons); + + // listen to changes to ignore_hardware_media_buttons_key + updateShouldIgnoreHardwareMediaButtons(player.getPrefs()); + player.getPrefs().registerOnSharedPreferenceChangeListener(this); + sessionConnector.setMetadataDeduplicationEnabled(true); sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata()); + + // force updating media session actions by resetting the previous ones + prevNotificationActions = List.of(); + updateMediaSessionActions(); } @Override public void destroyPlayer() { super.destroyPlayer(); + player.getPrefs().unregisterOnSharedPreferenceChangeListener(this); if (sessionConnector != null) { + sessionConnector.setMediaButtonEventHandler(null); sessionConnector.setPlayer(null); sessionConnector.setQueueNavigator(null); sessionConnector = null; @@ -62,6 +100,7 @@ public void destroyPlayer() { mediaSession.release(); mediaSession = null; } + prevNotificationActions = List.of(); } @Override @@ -74,6 +113,20 @@ public void onThumbnailLoaded(@Nullable final Bitmap bitmap) { } + @Override + public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, + final String key) { + if (key == null || key.equals(ignoreHardwareMediaButtonsKey)) { + updateShouldIgnoreHardwareMediaButtons(sharedPreferences); + } + } + + public void updateShouldIgnoreHardwareMediaButtons(final SharedPreferences sharedPreferences) { + shouldIgnoreHardwareMediaButtons = + sharedPreferences.getBoolean(ignoreHardwareMediaButtonsKey, false); + } + + public void handleMediaButtonIntent(final Intent intent) { MediaButtonReceiver.handleIntent(mediaSession, intent); } @@ -131,4 +184,114 @@ private MediaMetadataCompat buildMediaMetadata() { return builder.build(); } + + + private void updateMediaSessionActions() { + // On Android 13+ (or Android T or API 33+) the actions in the player notification can't be + // controlled directly anymore, but are instead derived from custom media session actions. + // However the system allows customizing only two of these actions, since the other three + // are fixed to play-pause-buffering, previous, next. + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + // Although setting media session actions on older android versions doesn't seem to + // cause any trouble, it also doesn't seem to do anything, so we don't do anything to + // save battery. Check out NotificationUtil.updateActions() to see what happens on + // older android versions. + return; + } + + if (sessionConnector == null) { + // sessionConnector will be null after destroyPlayer is called + return; + } + + // only use the fourth and fifth actions (the settings page also shows only the last 2 on + // Android 13+) + final List newNotificationActions = IntStream.of(3, 4) + .map(i -> player.getPrefs().getInt( + player.getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), + NotificationConstants.SLOT_DEFAULTS[i])) + .mapToObj(action -> NotificationActionData + .fromNotificationActionEnum(player, action)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // avoid costly notification actions update, if nothing changed from last time + if (!newNotificationActions.equals(prevNotificationActions)) { + prevNotificationActions = newNotificationActions; + sessionConnector.setCustomActionProviders( + newNotificationActions.stream() + .map(data -> new SessionConnectorActionProvider(data, context)) + .toArray(SessionConnectorActionProvider[]::new)); + } + } + + @Override + public void onBlocked() { + super.onBlocked(); + updateMediaSessionActions(); + } + + @Override + public void onPlaying() { + super.onPlaying(); + updateMediaSessionActions(); + } + + @Override + public void onBuffering() { + super.onBuffering(); + updateMediaSessionActions(); + } + + @Override + public void onPaused() { + super.onPaused(); + updateMediaSessionActions(); + } + + @Override + public void onPausedSeek() { + super.onPausedSeek(); + updateMediaSessionActions(); + } + + @Override + public void onCompleted() { + super.onCompleted(); + updateMediaSessionActions(); + } + + @Override + public void onRepeatModeChanged(@RepeatMode final int repeatMode) { + super.onRepeatModeChanged(repeatMode); + updateMediaSessionActions(); + } + + @Override + public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) { + super.onShuffleModeEnabledChanged(shuffleModeEnabled); + updateMediaSessionActions(); + } + + @Override + public void onBroadcastReceived(final Intent intent) { + super.onBroadcastReceived(intent); + if (ACTION_RECREATE_NOTIFICATION.equals(intent.getAction())) { + // the notification actions changed + updateMediaSessionActions(); + } + } + + @Override + public void onMetadataChanged(@NonNull final StreamInfo info) { + super.onMetadataChanged(info); + updateMediaSessionActions(); + } + + @Override + public void onPlayQueueEdited() { + super.onPlayQueueEdited(); + updateMediaSessionActions(); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java index 2e54b1129d7..3339869c129 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java @@ -20,6 +20,7 @@ import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.util.image.ImageStrategy; import java.util.ArrayList; import java.util.Collections; @@ -137,9 +138,12 @@ public MediaDescriptionCompat getQueueMetadata(final int index) { .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, player.getPlayQueue().size()); descBuilder.setExtras(additionalMetadata); - final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl()); - if (thumbnailUri != null) { - descBuilder.setIconUri(thumbnailUri); + try { + descBuilder.setIconUri(Uri.parse( + ImageStrategy.choosePreferredImage(item.getThumbnails()))); + } catch (final Throwable e) { + // no thumbnail available at all, or the user disabled image loading, + // or the obtained url is not a valid `Uri` } return descBuilder.build(); diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java new file mode 100644 index 00000000000..a5c9fccc9eb --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java @@ -0,0 +1,47 @@ +package org.schabi.newpipe.player.mediasession; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.media.session.PlaybackStateCompat; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; + +import org.schabi.newpipe.player.notification.NotificationActionData; + +import java.lang.ref.WeakReference; + +public class SessionConnectorActionProvider implements MediaSessionConnector.CustomActionProvider { + + private final NotificationActionData data; + @NonNull + private final WeakReference context; + + public SessionConnectorActionProvider(final NotificationActionData notificationActionData, + @NonNull final Context context) { + this.data = notificationActionData; + this.context = new WeakReference<>(context); + } + + @Override + public void onCustomAction(@NonNull final Player player, + @NonNull final String action, + @Nullable final Bundle extras) { + final Context actualContext = context.get(); + if (actualContext != null) { + actualContext.sendBroadcast(new Intent(action)); + } + } + + @Nullable + @Override + public PlaybackStateCompat.CustomAction getCustomAction(@NonNull final Player player) { + return new PlaybackStateCompat.CustomAction.Builder( + data.action(), data.name(), data.icon() + ).build(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java index 817b048f259..3bf7c09d934 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java @@ -15,7 +15,7 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed private final long expireTimestamp; /** - * Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource} + * Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource}s * containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration * timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under * {@link ManagedMediaSourcePlaylist}. diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java new file mode 100644 index 00000000000..17ae732c6b6 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java @@ -0,0 +1,205 @@ +package org.schabi.newpipe.player.notification; + +import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; +import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE; + +import android.annotation.SuppressLint; +import android.content.Context; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.player.Player; + +import java.util.Objects; + +public final class NotificationActionData { + + @NonNull + private final String action; + @NonNull + private final String name; + @DrawableRes + private final int icon; + + + public NotificationActionData(@NonNull final String action, @NonNull final String name, + @DrawableRes final int icon) { + this.action = action; + this.name = name; + this.icon = icon; + } + + @NonNull + public String action() { + return action; + } + + @NonNull + public String name() { + return name; + } + + @DrawableRes + public int icon() { + return icon; + } + + + @SuppressLint("PrivateResource") // we currently use Exoplayer's internal strings and icons + @Nullable + public static NotificationActionData fromNotificationActionEnum( + @NonNull final Player player, + @NotificationConstants.Action final int selectedAction + ) { + + final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction]; + final Context ctx = player.getContext(); + + switch (selectedAction) { + case NotificationConstants.PREVIOUS: + return new NotificationActionData(ACTION_PLAY_PREVIOUS, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description), baseActionIcon); + + case NotificationConstants.NEXT: + return new NotificationActionData(ACTION_PLAY_NEXT, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description), baseActionIcon); + + case NotificationConstants.REWIND: + return new NotificationActionData(ACTION_FAST_REWIND, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description), baseActionIcon); + + case NotificationConstants.FORWARD: + return new NotificationActionData(ACTION_FAST_FORWARD, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description), baseActionIcon); + + case NotificationConstants.SMART_REWIND_PREVIOUS: + if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { + return new NotificationActionData(ACTION_PLAY_PREVIOUS, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_previous); + } else { + return new NotificationActionData(ACTION_FAST_REWIND, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_rewind); + } + + case NotificationConstants.SMART_FORWARD_NEXT: + if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { + return new NotificationActionData(ACTION_PLAY_NEXT, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_next); + } else { + return new NotificationActionData(ACTION_FAST_FORWARD, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_fastforward); + } + + case NotificationConstants.PLAY_PAUSE_BUFFERING: + if (player.getCurrentState() == Player.STATE_PREFLIGHT + || player.getCurrentState() == Player.STATE_BLOCKED + || player.getCurrentState() == Player.STATE_BUFFERING) { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(R.string.notification_action_buffering), + R.drawable.ic_hourglass_top); + } + + // fallthrough + case NotificationConstants.PLAY_PAUSE: + if (player.getCurrentState() == Player.STATE_COMPLETED) { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description), + R.drawable.ic_replay); + } else if (player.isPlaying() + || player.getCurrentState() == Player.STATE_PREFLIGHT + || player.getCurrentState() == Player.STATE_BLOCKED + || player.getCurrentState() == Player.STATE_BUFFERING) { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_pause); + } else { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_play_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_play); + } + + case NotificationConstants.REPEAT: + if (player.getRepeatMode() == REPEAT_MODE_ALL) { + return new NotificationActionData(ACTION_REPEAT, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_repeat_all_description), + com.google.android.exoplayer2.ext.mediasession.R.drawable + .exo_media_action_repeat_all); + } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { + return new NotificationActionData(ACTION_REPEAT, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_repeat_one_description), + com.google.android.exoplayer2.ext.mediasession.R.drawable + .exo_media_action_repeat_one); + } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { + return new NotificationActionData(ACTION_REPEAT, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_repeat_off_description), + com.google.android.exoplayer2.ext.mediasession.R.drawable + .exo_media_action_repeat_off); + } + + case NotificationConstants.SHUFFLE: + if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { + return new NotificationActionData(ACTION_SHUFFLE, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_shuffle_on_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_shuffle_on); + } else { + return new NotificationActionData(ACTION_SHUFFLE, + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_shuffle_off_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_shuffle_off); + } + + case NotificationConstants.CLOSE: + return new NotificationActionData(ACTION_CLOSE, ctx.getString(R.string.close), + R.drawable.ic_close); + + case NotificationConstants.NOTHING: + default: + // do nothing + return null; + } + } + + + @Override + public boolean equals(@Nullable final Object obj) { + return (obj instanceof NotificationActionData other) + && this.action.equals(other.action) + && this.name.equals(other.name) + && this.icon == other.icon; + } + + @Override + public int hashCode() { + return Objects.hash(action, name, icon); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java index 89bf0b22ae2..4f304b4056f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java @@ -13,7 +13,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; @@ -65,23 +65,29 @@ private NotificationConstants() { public static final int CLOSE = 11; @Retention(RetentionPolicy.SOURCE) - @IntDef({NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, - PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT, SHUFFLE, CLOSE}) + @IntDef({NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, + SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT, + SHUFFLE, CLOSE}) public @interface Action { } + @Action + public static final int[] ALL_ACTIONS = {NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, + SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT, + SHUFFLE, CLOSE}; + @DrawableRes public static final int[] ACTION_ICONS = { 0, - R.drawable.exo_icon_previous, - R.drawable.exo_icon_next, - R.drawable.exo_icon_rewind, - R.drawable.exo_icon_fastforward, - R.drawable.exo_icon_previous, - R.drawable.exo_icon_next, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_next, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_rewind, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_fastforward, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_next, R.drawable.ic_pause, R.drawable.ic_hourglass_top, - R.drawable.exo_icon_repeat_all, - R.drawable.exo_icon_shuffle_on, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_repeat_all, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_shuffle_on, R.drawable.ic_close, }; @@ -95,16 +101,6 @@ private NotificationConstants() { CLOSE, }; - @Action - public static final int[][] SLOT_ALLOWED_ACTIONS = { - new int[] {PREVIOUS, REWIND, SMART_REWIND_PREVIOUS}, - new int[] {REWIND, PLAY_PAUSE, PLAY_PAUSE_BUFFERING}, - new int[] {NEXT, FORWARD, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING}, - new int[] {NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, SMART_REWIND_PREVIOUS, - SMART_FORWARD_NEXT, REPEAT, SHUFFLE, CLOSE}, - new int[] {NOTHING, NEXT, FORWARD, SMART_FORWARD_NEXT, REPEAT, SHUFFLE, CLOSE}, - }; - public static final int[] SLOT_PREF_KEYS = { R.string.notification_slot_0_key, R.string.notification_slot_1_key, @@ -126,29 +122,41 @@ private NotificationConstants() { public static String getActionName(@NonNull final Context context, @Action final int action) { switch (action) { case PREVIOUS: - return context.getString(R.string.exo_controls_previous_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description); case NEXT: - return context.getString(R.string.exo_controls_next_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description); case REWIND: - return context.getString(R.string.exo_controls_rewind_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description); case FORWARD: - return context.getString(R.string.exo_controls_fastforward_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description); case SMART_REWIND_PREVIOUS: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_rewind_description), - context.getString(R.string.exo_controls_previous_description)); + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description)); case SMART_FORWARD_NEXT: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_fastforward_description), - context.getString(R.string.exo_controls_next_description)); + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description)); case PLAY_PAUSE: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_play_description), - context.getString(R.string.exo_controls_pause_description)); + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_play_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description)); case PLAY_PAUSE_BUFFERING: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_play_description), - context.getString(R.string.exo_controls_pause_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_play_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description), context.getString(R.string.notification_action_buffering)); case REPEAT: return context.getString(R.string.notification_action_repeat); @@ -165,14 +173,11 @@ public static String getActionName(@NonNull final Context context, @Action final /** * @param context the context to use * @param sharedPreferences the shared preferences to query values from - * @param slotCount remove indices >= than this value (set to {@code 5} to do nothing, or make - * it lower if there are slots with empty actions) * @return a sorted list of the indices of the slots to use as compact slots */ - public static List getCompactSlotsFromPreferences( + public static Collection getCompactSlotsFromPreferences( @NonNull final Context context, - final SharedPreferences sharedPreferences, - final int slotCount) { + final SharedPreferences sharedPreferences) { final SortedSet compactSlots = new TreeSet<>(); for (int i = 0; i < 3; i++) { final int compactSlot = sharedPreferences.getInt( @@ -180,14 +185,14 @@ public static List getCompactSlotsFromPreferences( if (compactSlot == Integer.MAX_VALUE) { // settings not yet populated, return default values - return new ArrayList<>(SLOT_COMPACT_DEFAULTS); + return SLOT_COMPACT_DEFAULTS; } - // a negative value (-1) is set when the user does not want a particular compact slot - if (compactSlot >= 0 && compactSlot < slotCount) { + if (compactSlot >= 0) { + // compact slot is < 0 if there are less than 3 checked checkboxes compactSlots.add(compactSlot); } } - return new ArrayList<>(compactSlots); + return compactSlots; } } diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java index 4b1fc417f0e..75b27545cfb 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java @@ -17,7 +17,6 @@ import org.schabi.newpipe.player.ui.PlayerUi; public final class NotificationPlayerUi extends PlayerUi { - private boolean foregroundNotificationAlreadyCreated = false; private final NotificationUtil notificationUtil; public NotificationPlayerUi(@NonNull final Player player) { @@ -25,15 +24,6 @@ public NotificationPlayerUi(@NonNull final Player player) { notificationUtil = new NotificationUtil(player); } - @Override - public void initPlayer() { - super.initPlayer(); - if (!foregroundNotificationAlreadyCreated) { - notificationUtil.createNotificationAndStartForeground(); - foregroundNotificationAlreadyCreated = true; - } - } - @Override public void destroy() { super.destroy(); @@ -122,4 +112,8 @@ public void onPlayQueueEdited() { super.onPlayQueueEdited(); notificationUtil.createNotificationIfNeededAndUpdate(false); } + + public void createNotificationAndStartForeground() { + notificationUtil.createNotificationAndStartForeground(); + } } 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..30420b0c7da 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 @@ -1,18 +1,22 @@ package org.schabi.newpipe.player.notification; +import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import static androidx.media.app.NotificationCompat.MediaStyle; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; + import android.annotation.SuppressLint; +import android.app.PendingIntent; import android.content.Intent; import android.content.pm.ServiceInfo; import android.graphics.Bitmap; import android.os.Build; import android.util.Log; -import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; @@ -21,25 +25,13 @@ 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.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Optional; -import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; -import static androidx.media.app.NotificationCompat.MediaStyle; -import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; -import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE; - /** * This is a utility class for player notifications. */ @@ -100,29 +92,21 @@ private synchronized NotificationCompat.Builder createNotification() { final NotificationCompat.Builder builder = new NotificationCompat.Builder(player.getContext(), player.getContext().getString(R.string.notification_channel_id)); - - initializeNotificationSlots(); - - // count the number of real slots, to make sure compact slots indices are not out of bound - int nonNothingSlotCount = 5; - if (notificationSlots[3] == NotificationConstants.NOTHING) { - --nonNothingSlotCount; + final MediaStyle mediaStyle = new MediaStyle(); + + // setup media style (compact notification slots and media session) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + // notification actions are ignored on Android 13+, and are replaced by code in + // MediaSessionPlayerUi + final int[] compactSlots = initializeNotificationSlots(); + mediaStyle.setShowActionsInCompactView(compactSlots); } - if (notificationSlots[4] == NotificationConstants.NOTHING) { - --nonNothingSlotCount; - } - - // build the compact slot indices array (need code to convert from Integer... because Java) - final List compactSlotList = NotificationConstants.getCompactSlotsFromPreferences( - player.getContext(), player.getPrefs(), nonNothingSlotCount); - final int[] compactSlots = compactSlotList.stream().mapToInt(Integer::intValue).toArray(); - - final MediaStyle mediaStyle = new MediaStyle().setShowActionsInCompactView(compactSlots); player.UIs() .get(MediaSessionPlayerUi.class) .flatMap(MediaSessionPlayerUi::getSessionToken) .ifPresent(mediaStyle::setMediaSession); + // setup notification builder builder.setStyle(mediaStyle) .setPriority(NotificationCompat.PRIORITY_HIGH) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) @@ -134,7 +118,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,12 +136,16 @@ 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()); - updateActions(notificationBuilder); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + // notification actions are ignored on Android 13+, and are replaced by code in + // MediaSessionPlayerUi + updateActions(notificationBuilder); + } } @@ -209,12 +197,35 @@ public void cancelNotificationAndStopForeground() { // ACTIONS ///////////////////////////////////////////////////// - private void initializeNotificationSlots() { + /** + * The compact slots array from settings contains indices from 0 to 4, each referring to one of + * the five actions configurable by the user. However, if the user sets an action to "Nothing", + * then all of the actions coming after will have a "settings index" different than the index + * of the corresponding action when sent to the system. + * + * @return the indices of compact slots referred to the list of non-nothing actions that will be + * sent to the system + */ + private int[] initializeNotificationSlots() { + final Collection settingsCompactSlots = NotificationConstants + .getCompactSlotsFromPreferences(player.getContext(), player.getPrefs()); + final List adjustedCompactSlots = new ArrayList<>(); + + int nonNothingIndex = 0; for (int i = 0; i < 5; ++i) { notificationSlots[i] = player.getPrefs().getInt( player.getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), NotificationConstants.SLOT_DEFAULTS[i]); + + if (notificationSlots[i] != NotificationConstants.NOTHING) { + if (settingsCompactSlots.contains(i)) { + adjustedCompactSlots.add(nonNothingIndex); + } + nonNothingIndex += 1; + } } + + return adjustedCompactSlots.stream().mapToInt(Integer::intValue).toArray(); } @SuppressLint("RestrictedApi") @@ -227,115 +238,15 @@ private void updateActions(final NotificationCompat.Builder builder) { private void addAction(final NotificationCompat.Builder builder, @NotificationConstants.Action final int slot) { - final NotificationCompat.Action action = getAction(slot); - if (action != null) { - builder.addAction(action); - } - } - - @Nullable - private NotificationCompat.Action getAction( - @NotificationConstants.Action final int selectedAction) { - final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction]; - switch (selectedAction) { - case NotificationConstants.PREVIOUS: - return getAction(baseActionIcon, - R.string.exo_controls_previous_description, ACTION_PLAY_PREVIOUS); - - case NotificationConstants.NEXT: - return getAction(baseActionIcon, - R.string.exo_controls_next_description, ACTION_PLAY_NEXT); - - case NotificationConstants.REWIND: - return getAction(baseActionIcon, - R.string.exo_controls_rewind_description, ACTION_FAST_REWIND); - - case NotificationConstants.FORWARD: - return getAction(baseActionIcon, - R.string.exo_controls_fastforward_description, ACTION_FAST_FORWARD); - - case NotificationConstants.SMART_REWIND_PREVIOUS: - if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { - return getAction(R.drawable.exo_notification_previous, - R.string.exo_controls_previous_description, ACTION_PLAY_PREVIOUS); - } else { - return getAction(R.drawable.exo_controls_rewind, - R.string.exo_controls_rewind_description, ACTION_FAST_REWIND); - } - - case NotificationConstants.SMART_FORWARD_NEXT: - if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { - return getAction(R.drawable.exo_notification_next, - R.string.exo_controls_next_description, ACTION_PLAY_NEXT); - } else { - return getAction(R.drawable.exo_controls_fastforward, - R.string.exo_controls_fastforward_description, ACTION_FAST_FORWARD); - } - - case NotificationConstants.PLAY_PAUSE_BUFFERING: - if (player.getCurrentState() == Player.STATE_PREFLIGHT - || player.getCurrentState() == Player.STATE_BLOCKED - || player.getCurrentState() == Player.STATE_BUFFERING) { - // null intent -> show hourglass icon that does nothing when clicked - return new NotificationCompat.Action(R.drawable.ic_hourglass_top, - player.getContext().getString(R.string.notification_action_buffering), - null); - } - - // fallthrough - case NotificationConstants.PLAY_PAUSE: - if (player.getCurrentState() == Player.STATE_COMPLETED) { - return getAction(R.drawable.ic_replay, - R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); - } else if (player.isPlaying() - || player.getCurrentState() == Player.STATE_PREFLIGHT - || player.getCurrentState() == Player.STATE_BLOCKED - || player.getCurrentState() == Player.STATE_BUFFERING) { - return getAction(R.drawable.exo_notification_pause, - R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); - } else { - return getAction(R.drawable.exo_notification_play, - R.string.exo_controls_play_description, ACTION_PLAY_PAUSE); - } - - case NotificationConstants.REPEAT: - if (player.getRepeatMode() == REPEAT_MODE_ALL) { - return getAction(R.drawable.exo_media_action_repeat_all, - R.string.exo_controls_repeat_all_description, ACTION_REPEAT); - } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { - return getAction(R.drawable.exo_media_action_repeat_one, - R.string.exo_controls_repeat_one_description, ACTION_REPEAT); - } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { - return getAction(R.drawable.exo_media_action_repeat_off, - R.string.exo_controls_repeat_off_description, ACTION_REPEAT); - } - - case NotificationConstants.SHUFFLE: - if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { - return getAction(R.drawable.exo_controls_shuffle_on, - R.string.exo_controls_shuffle_on_description, ACTION_SHUFFLE); - } else { - return getAction(R.drawable.exo_controls_shuffle_off, - R.string.exo_controls_shuffle_off_description, ACTION_SHUFFLE); - } - - case NotificationConstants.CLOSE: - return getAction(R.drawable.ic_close, - R.string.close, ACTION_CLOSE); - - case NotificationConstants.NOTHING: - default: - // do nothing - return null; + @Nullable final NotificationActionData data = + NotificationActionData.fromNotificationActionEnum(player, slot); + if (data == null) { + return; } - } - private NotificationCompat.Action getAction(@DrawableRes final int drawable, - @StringRes final int title, - final String intentAction) { - return new NotificationCompat.Action(drawable, player.getContext().getString(title), - PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, - new Intent(intentAction), FLAG_UPDATE_CURRENT)); + final PendingIntent intent = PendingIntentCompat.getBroadcast(player.getContext(), + NOTIFICATION_ID, new Intent(data.action()), FLAG_UPDATE_CURRENT, false); + builder.addAction(new NotificationCompat.Action(data.icon(), data.name(), intent)); } private Intent getIntentForNotification() { @@ -364,7 +275,7 @@ private void setLargeIcon(final NotificationCompat.Builder builder) { final Bitmap thumbnail = player.getThumbnail(); if (thumbnail == null || !showThumbnail) { // since the builder is reused, make sure the thumbnail is unset if there is not one - builder.setLargeIcon(null); + builder.setLargeIcon((Bitmap) null); return; } diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java index e51ee4720d4..33ec390a567 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java @@ -4,6 +4,7 @@ import androidx.annotation.NonNull; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.ListInfo; import org.schabi.newpipe.extractor.Page; @@ -15,7 +16,7 @@ import io.reactivex.rxjava3.core.SingleObserver; import io.reactivex.rxjava3.disposables.Disposable; -abstract class AbstractInfoPlayQueue> +abstract class AbstractInfoPlayQueue> extends PlayQueue { boolean isInitial; private boolean isComplete; @@ -27,7 +28,13 @@ abstract class AbstractInfoPlayQueue> private transient Disposable fetchReactor; protected AbstractInfoPlayQueue(final T info) { - this(info.getServiceId(), info.getUrl(), info.getNextPage(), info.getRelatedItems(), 0); + this(info.getServiceId(), info.getUrl(), info.getNextPage(), + info.getRelatedItems() + .stream() + .filter(StreamInfoItem.class::isInstance) + .map(StreamInfoItem.class::cast) + .collect(Collectors.toList()), + 0); } protected AbstractInfoPlayQueue(final int serviceId, @@ -72,7 +79,11 @@ public void onSuccess(@NonNull final T result) { } nextPage = result.getNextPage(); - append(extractListItems(result.getRelatedItems())); + append(extractListItems(result.getRelatedItems() + .stream() + .filter(StreamInfoItem.class::isInstance) + .map(StreamInfoItem.class::cast) + .collect(Collectors.toList()))); fetchReactor.dispose(); fetchReactor = null; @@ -87,7 +98,7 @@ public void onError(@NonNull final Throwable e) { }; } - SingleObserver> getNextPageObserver() { + SingleObserver> getNextPageObserver() { return new SingleObserver<>() { @Override public void onSubscribe(@NonNull final Disposable d) { @@ -101,13 +112,17 @@ public void onSubscribe(@NonNull final Disposable d) { @Override public void onSuccess( - @NonNull final ListExtractor.InfoItemsPage result) { + @NonNull final ListExtractor.InfoItemsPage result) { if (!result.hasNextPage()) { isComplete = true; } nextPage = result.getNextPage(); - append(extractListItems(result.getItems())); + append(extractListItems(result.getItems() + .stream() + .filter(StreamInfoItem.class::isInstance) + .map(StreamInfoItem.class::cast) + .collect(Collectors.toList()))); fetchReactor.dispose(); fetchReactor = null; diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java deleted file mode 100644 index 1e1fef85ea2..00000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.schabi.newpipe.player.playqueue; - - -import org.schabi.newpipe.extractor.Page; -import org.schabi.newpipe.extractor.channel.ChannelInfo; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.util.ExtractorHelper; - -import java.util.List; - -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; -import io.reactivex.rxjava3.schedulers.Schedulers; - -public final class ChannelPlayQueue extends AbstractInfoPlayQueue { - - public ChannelPlayQueue(final ChannelInfo info) { - super(info); - } - - public ChannelPlayQueue(final int serviceId, - final String url, - final Page nextPage, - final List streams, - final int index) { - super(serviceId, url, nextPage, streams, index); - } - - @Override - protected String getTag() { - return "ChannelPlayQueue@" + Integer.toHexString(hashCode()); - } - - @Override - public void fetch() { - if (this.isInitial) { - ExtractorHelper.getChannelInfo(this.serviceId, this.baseUrl, false) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getHeadListObserver()); - } else { - ExtractorHelper.getMoreChannelItems(this.serviceId, this.baseUrl, this.nextPage) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getNextPageObserver()); - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelTabPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelTabPlayQueue.java new file mode 100644 index 00000000000..a9eb2a19c7e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelTabPlayQueue.java @@ -0,0 +1,53 @@ +package org.schabi.newpipe.player.playqueue; + + +import org.schabi.newpipe.extractor.Page; +import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.util.ExtractorHelper; + +import java.util.Collections; +import java.util.List; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public final class ChannelTabPlayQueue extends AbstractInfoPlayQueue { + + final ListLinkHandler linkHandler; + + public ChannelTabPlayQueue(final int serviceId, + final ListLinkHandler linkHandler, + final Page nextPage, + final List streams, + final int index) { + super(serviceId, linkHandler.getUrl(), nextPage, streams, index); + this.linkHandler = linkHandler; + } + + public ChannelTabPlayQueue(final int serviceId, + final ListLinkHandler linkHandler) { + this(serviceId, linkHandler, null, Collections.emptyList(), 0); + } + + @Override + protected String getTag() { + return "ChannelTabPlayQueue@" + Integer.toHexString(hashCode()); + } + + @Override + public void fetch() { + if (isInitial) { + ExtractorHelper.getChannelTab(this.serviceId, this.linkHandler, false) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getHeadListObserver()); + } else { + ExtractorHelper.getMoreChannelTabItems(this.serviceId, this.linkHandler, this.nextPage) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getNextPageObserver()); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java index edf5a771c02..cfa2ab3162c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java @@ -518,12 +518,10 @@ public synchronized boolean previous() { * This method also gives a chance to track history of items in a queue in * VideoDetailFragment without duplicating items from two identical queues */ - @Override - public boolean equals(@Nullable final Object obj) { - if (!(obj instanceof PlayQueue)) { + public boolean equalStreams(@Nullable final PlayQueue other) { + if (other == null) { return false; } - final PlayQueue other = (PlayQueue) obj; if (size() != other.size()) { return false; } @@ -539,9 +537,12 @@ public boolean equals(@Nullable final Object obj) { return true; } - @Override - public int hashCode() { - return streams.hashCode(); + public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) { + if (equalStreams(other)) { + //noinspection ConstantConditions + return other.getIndex() == getIndex(); //NOSONAR: other is not null + } + return false; } public boolean isDisposed() { diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java index bf31ea9b10d..759c512671c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java @@ -3,12 +3,14 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.util.ExtractorHelper; import java.io.Serializable; +import java.util.List; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; @@ -24,7 +26,7 @@ public class PlayQueueItem implements Serializable { private final int serviceId; private final long duration; @NonNull - private final String thumbnailUrl; + private final List thumbnails; @NonNull private final String uploader; private final String uploaderUrl; @@ -38,7 +40,7 @@ public class PlayQueueItem implements Serializable { PlayQueueItem(@NonNull final StreamInfo info) { this(info.getName(), info.getUrl(), info.getServiceId(), info.getDuration(), - info.getThumbnailUrl(), info.getUploaderName(), + info.getThumbnails(), info.getUploaderName(), info.getUploaderUrl(), info.getStreamType()); if (info.getStartPosition() > 0) { @@ -48,20 +50,20 @@ public class PlayQueueItem implements Serializable { PlayQueueItem(@NonNull final StreamInfoItem item) { this(item.getName(), item.getUrl(), item.getServiceId(), item.getDuration(), - item.getThumbnailUrl(), item.getUploaderName(), + item.getThumbnails(), item.getUploaderName(), item.getUploaderUrl(), item.getStreamType()); } @SuppressWarnings("ParameterNumber") private PlayQueueItem(@Nullable final String name, @Nullable final String url, final int serviceId, final long duration, - @Nullable final String thumbnailUrl, @Nullable final String uploader, + final List thumbnails, @Nullable final String uploader, final String uploaderUrl, @NonNull final StreamType streamType) { this.title = name != null ? name : EMPTY_STRING; this.url = url != null ? url : EMPTY_STRING; this.serviceId = serviceId; this.duration = duration; - this.thumbnailUrl = thumbnailUrl != null ? thumbnailUrl : EMPTY_STRING; + this.thumbnails = thumbnails; this.uploader = uploader != null ? uploader : EMPTY_STRING; this.uploaderUrl = uploaderUrl; this.streamType = streamType; @@ -88,8 +90,8 @@ public long getDuration() { } @NonNull - public String getThumbnailUrl() { - return thumbnailUrl; + public List getThumbnails() { + return thumbnails; } @NonNull diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java index e7aeb9638b8..066f92c2607 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java @@ -6,7 +6,7 @@ import android.view.View; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; public class PlayQueueItemBuilder { @@ -33,7 +33,7 @@ public void buildStreamInfoItem(final PlayQueueItemHolder holder, final PlayQueu holder.itemDurationView.setVisibility(View.GONE); } - PicassoHelper.loadThumbnail(item.getThumbnailUrl()).into(holder.itemThumbnailView); + PicassoHelper.loadThumbnail(item.getThumbnails()).into(holder.itemThumbnailView); holder.itemRoot.setOnClickListener(view -> { if (onItemClickListener != null) { diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java index e5117321407..0eb0f235ac6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.player.playqueue; +import androidx.annotation.NonNull; + import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -20,11 +22,11 @@ public SinglePlayQueue(final StreamInfo info, final long startPosition) { getItem().setRecoveryPosition(startPosition); } - public SinglePlayQueue(final List items, final int index) { + public SinglePlayQueue(@NonNull final List items, final int index) { super(index, playQueueItemsOf(items)); } - private static List playQueueItemsOf(final List items) { + private static List playQueueItemsOf(@NonNull final List items) { final List playQueueItems = new ArrayList<>(items.size()); for (final StreamInfoItem item : items) { playQueueItems.add(new PlayQueueItem(item)); @@ -39,5 +41,7 @@ public boolean isComplete() { @Override public void fetch() { + // Item was already passed in constructor. + // No further items need to be fetched as this is a PlayQueue with only one item } } 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/seekbarpreview/SeekbarPreviewThumbnailHolder.java b/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java index 50ffa2f2a8e..09c61b8b35a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java +++ b/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java @@ -14,7 +14,7 @@ import com.google.common.base.Stopwatch; import org.schabi.newpipe.extractor.stream.Frameset; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.Comparator; import java.util.List; @@ -132,17 +132,8 @@ private void generateDataFrom(final Frameset frameset, final UUID updateRequestI // Get the bounds where the frame is found final int[] bounds = frameset.getFrameBoundsAt(currentPosMs); - generatedDataForUrl.put(currentPosMs, () -> { - // It can happen, that the original bitmap could not be downloaded - // In such a case - we don't want a NullPointer - simply return null - if (srcBitMap == null) { - return null; - } - - // Cut out the corresponding bitmap form the "srcBitMap" - return Bitmap.createBitmap(srcBitMap, bounds[1], bounds[2], - frameset.getFrameWidth(), frameset.getFrameHeight()); - }); + generatedDataForUrl.put(currentPosMs, + createBitmapSupplier(srcBitMap, bounds, frameset)); currentPosMs += frameset.getDurationPerFrame(); pos++; @@ -165,6 +156,45 @@ private void generateDataFrom(final Frameset frameset, final UUID updateRequestI } } + private Supplier createBitmapSupplier(final Bitmap srcBitMap, + final int[] bounds, + final Frameset frameset) { + return () -> { + // It can happen, that the original bitmap could not be downloaded + // (or it was recycled though that should not happen) + // In such a case - we don't want a NullPointer/ + // "cannot use a recycled source in createBitmap" Exception -> simply return null + if (srcBitMap == null || srcBitMap.isRecycled()) { + return null; + } + + // Under some rare circumstances the YouTube API returns slightly too small storyboards, + // (or not the matching frame width/height) + // This would lead to createBitmap cutting out a bitmap that is out of bounds, + // so we need to adjust the bounds accordingly + if (srcBitMap.getWidth() < bounds[1] + frameset.getFrameWidth()) { + bounds[1] = srcBitMap.getWidth() - frameset.getFrameWidth(); + } + + if (srcBitMap.getHeight() < bounds[2] + frameset.getFrameHeight()) { + bounds[2] = srcBitMap.getHeight() - frameset.getFrameHeight(); + } + + // Cut out the corresponding bitmap form the "srcBitMap" + final Bitmap cutOutBitmap = Bitmap.createBitmap(srcBitMap, bounds[1], bounds[2], + frameset.getFrameWidth(), frameset.getFrameHeight()); + + // If the cut out bitmap is identical to its source, + // we need to copy the bitmap to create a new instance. + // createBitmap allows itself to return the original object that is was created with + // this leads to recycled bitmaps being returned (if they are identical) + // Reference: https://stackoverflow.com/a/23683075 + first comment + // Fixes: https://github.com/TeamNewPipe/NewPipe/issues/11461 + return cutOutBitmap == srcBitMap + ? cutOutBitmap.copy(cutOutBitmap.getConfig(), true) : cutOutBitmap; + }; + } + @Nullable private Bitmap getBitMapFrom(final String url) { if (url == null) { diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 683629c251f..d8efb30df7d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -25,9 +25,7 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; -import android.util.DisplayMetrics; import android.util.Log; -import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -44,6 +42,7 @@ import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.exoplayer2.ui.SubtitleView; import com.google.android.exoplayer2.video.VideoSize; import org.schabi.newpipe.R; @@ -434,7 +433,7 @@ protected void showOrHideButtons() { return; } - final boolean showQueue = playQueue.getStreams().size() > 1; + final boolean showQueue = !playQueue.getStreams().isEmpty(); final boolean showSegment = !player.getCurrentStreamInfo() .map(StreamInfo::getStreamSegments) .map(List::isEmpty) @@ -522,11 +521,8 @@ private void showHideKodiButton() { @Override protected void setupSubtitleView(final float captionScale) { - final DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - final int minimumLength = Math.min(metrics.heightPixels, metrics.widthPixels); - final float captionRatioInverse = 20f + 4f * (1.0f - captionScale); - binding.subtitleView.setFixedTextSize( - TypedValue.COMPLEX_UNIT_PX, minimumLength / captionRatioInverse); + binding.subtitleView.setFractionalTextSize( + SubtitleView.DEFAULT_TEXT_SIZE_FRACTION * captionScale); } //endregion @@ -740,7 +736,7 @@ public void onItemLongClick(@NonNull final StreamSegmentItem item, final int sec String videoUrl = player.getVideoUrl(); videoUrl += ("&t=" + seconds); ShareUtils.shareText(context, currentItem.getTitle(), - videoUrl, currentItem.getThumbnailUrl()); + videoUrl, currentItem.getThumbnails()); } } }; diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java index 90c24c0c6cf..02f7c07b0db 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java @@ -424,9 +424,8 @@ public void onCompleted() { @Override protected void setupSubtitleView(final float captionScale) { - final float captionRatio = (captionScale - 1.0f) / 5.0f + 1.0f; binding.subtitleView.setFractionalTextSize( - SubtitleView.DEFAULT_TEXT_SIZE_FRACTION * captionRatio); + SubtitleView.DEFAULT_TEXT_SIZE_FRACTION * captionScale); } @Override 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 e4f5b05e187..7157d6af22f 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 @@ -41,6 +41,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.view.ContextThemeWrapper; +import androidx.appcompat.widget.AppCompatImageButton; import androidx.appcompat.widget.PopupMenu; import androidx.core.graphics.BitmapCompat; import androidx.core.graphics.Insets; @@ -63,6 +64,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; @@ -78,6 +80,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.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; @@ -101,6 +104,9 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa // other constants (TODO remove playback speeds and use normal menu for popup, too) private static final float[] PLAYBACK_SPEEDS = {0.5f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f}; + private enum PlayButtonAction { + PLAY, PAUSE, REPLAY + } /*////////////////////////////////////////////////////////////////////////// // Views @@ -108,7 +114,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; @@ -117,11 +124,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; @@ -146,7 +155,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //region Constructor, setup, destroy protected VideoPlayerUi(@NonNull final Player player, - @NonNull final PlayerBinding playerBinding) { + @NonNull final PlayerBinding playerBinding) { super(player); binding = playerBinding; setupFromView(); @@ -173,6 +182,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); @@ -190,6 +200,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); @@ -214,7 +226,7 @@ protected void initListeners() { final PlayQueueItem currentItem = player.getCurrentItem(); if (currentItem != null) { ShareUtils.shareText(context, currentItem.getTitle(), - player.getVideoUrlAtCurrentTime(), currentItem.getThumbnailUrl()); + player.getVideoUrlAtCurrentTime(), currentItem.getThumbnails()); } })); binding.share.setOnLongClickListener(v -> { @@ -266,6 +278,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); @@ -419,6 +432,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); @@ -524,6 +538,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) { @@ -536,6 +551,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) { @@ -743,6 +759,29 @@ public boolean isFullscreen() { // only MainPlayerUi can be in fullscreen, so overridden there return false; } + + /** + * Update the play/pause button ({@link R.id.playPauseButton}) to reflect the action + * that will be performed when the button is clicked.. + * @param action the action that is performed when the play/pause button is clicked + */ + private void updatePlayPauseButton(final PlayButtonAction action) { + final AppCompatImageButton button = binding.playPauseButton; + switch (action) { + case PLAY: + button.setContentDescription(context.getString(R.string.play)); + button.setImageResource(R.drawable.ic_play_arrow); + break; + case PAUSE: + button.setContentDescription(context.getString(R.string.pause)); + button.setImageResource(R.drawable.ic_pause); + break; + case REPLAY: + button.setContentDescription(context.getString(R.string.replay)); + button.setImageResource(R.drawable.ic_replay); + break; + } + } //endregion @@ -773,7 +812,7 @@ public void onBlocked() { animate(binding.loadingPanel, true, 0); animate(binding.surfaceForeground, true, 100); - binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow); + updatePlayPauseButton(PlayButtonAction.PLAY); animatePlayButtons(false, 100); binding.getRoot().setKeepScreenOn(false); } @@ -794,7 +833,7 @@ public void onPlaying() { animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0, () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_pause); + updatePlayPauseButton(PlayButtonAction.PAUSE); animatePlayButtons(true, 200); if (!isAnyListViewOpen()) { binding.playPauseButton.requestFocus(); @@ -824,7 +863,7 @@ public void onPaused() { animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0, () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow); + updatePlayPauseButton(PlayButtonAction.PLAY); animatePlayButtons(true, 200); if (!isAnyListViewOpen()) { binding.playPauseButton.requestFocus(); @@ -848,7 +887,7 @@ public void onCompleted() { animate(binding.playPauseButton, false, 0, AnimationType.SCALE_AND_ALPHA, 0, () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_replay); + updatePlayPauseButton(PlayButtonAction.REPLAY); animatePlayButtons(true, DEFAULT_CONTROLS_DURATION); }); @@ -913,11 +952,14 @@ public void onRepeatModeChanged(@RepeatMode final int repeatMode) { super.onRepeatModeChanged(repeatMode); if (repeatMode == REPEAT_MODE_ALL) { - binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_all); + binding.repeatButton.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_all); } else if (repeatMode == REPEAT_MODE_ONE) { - binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_one); + binding.repeatButton.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_one); } else /* repeatMode == REPEAT_MODE_OFF */ { - binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_off); + binding.repeatButton.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_off); } } @@ -984,6 +1026,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); @@ -1019,6 +1062,7 @@ private void updateStreamRelatedViews() { } buildQualityMenu(); + buildAudioTrackMenu(); binding.qualityTextView.setVisibility(View.VISIBLE); binding.surfaceView.setVisibility(View.VISIBLE); @@ -1067,6 +1111,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; @@ -1175,6 +1247,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. */ @@ -1187,26 +1264,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(); @@ -1219,6 +1280,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. */ @@ -1312,6 +1414,10 @@ private void setupSubtitleView() { binding.subtitleView.setStyle(captionStyle); } + /** + * + * @param captionScale Value returned by {@link PlayerHelper#getCaptionScale}. + */ protected abstract void setupSubtitleView(float captionScale); //endregion @@ -1420,14 +1526,7 @@ private void onMoreOptionsClicked() { private void onPlayWithKodiClicked() { if (player.getCurrentMetadata() != null) { player.pause(); - try { - NavigationHelper.playWithKore(context, Uri.parse(player.getVideoUrl())); - } catch (final Exception e) { - if (DEBUG) { - Log.i(TAG, "Failed to start kore", e); - } - KoreUtils.showInstallKoreDialog(player.getContext()); - } + KoreUtils.playWithKore(context, Uri.parse(player.getVideoUrl())); } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java new file mode 100644 index 00000000000..97df1549b2e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java @@ -0,0 +1,301 @@ +package org.schabi.newpipe.settings; + +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; +import android.widget.Toast; + +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.preference.Preference; +import androidx.preference.PreferenceManager; + +import com.grack.nanojson.JsonParserException; + +import org.schabi.newpipe.NewPipeDatabase; +import org.schabi.newpipe.R; +import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.ErrorUtil; +import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.settings.export.BackupFileLocator; +import org.schabi.newpipe.settings.export.ImportExportManager; +import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard; +import org.schabi.newpipe.streams.io.StoredFileHelper; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.ZipHelper; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Objects; + +public class BackupRestoreSettingsFragment extends BasePreferenceFragment { + + private static final String ZIP_MIME_TYPE = "application/zip"; + + private final SimpleDateFormat exportDateFormat = + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US); + private ImportExportManager manager; + private String importExportDataPathKey; + private final ActivityResultLauncher requestImportPathLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + this::requestImportPathResult); + private final ActivityResultLauncher requestExportPathLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + this::requestExportPathResult); + + + @Override + public void onCreatePreferences(@Nullable final Bundle savedInstanceState, + @Nullable final String rootKey) { + final File homeDir = ContextCompat.getDataDir(requireContext()); + Objects.requireNonNull(homeDir); + manager = new ImportExportManager(new BackupFileLocator(homeDir)); + + importExportDataPathKey = getString(R.string.import_export_data_path); + + + addPreferencesFromResourceRegistry(); + + final Preference importDataPreference = requirePreference(R.string.import_data); + importDataPreference.setOnPreferenceClickListener((Preference p) -> { + NoFileManagerSafeGuard.launchSafe( + requestImportPathLauncher, + StoredFileHelper.getPicker(requireContext(), + ZIP_MIME_TYPE, getImportExportDataUri()), + TAG, + getContext() + ); + + return true; + }); + + final Preference exportDataPreference = requirePreference(R.string.export_data); + exportDataPreference.setOnPreferenceClickListener((final Preference p) -> { + NoFileManagerSafeGuard.launchSafe( + requestExportPathLauncher, + StoredFileHelper.getNewPicker(requireContext(), + "NewPipeData-" + exportDateFormat.format(new Date()) + ".zip", + ZIP_MIME_TYPE, getImportExportDataUri()), + TAG, + getContext() + ); + + return true; + }); + + final Preference resetSettings = findPreference(getString(R.string.reset_settings)); + // Resets all settings by deleting shared preference and restarting the app + // A dialogue will pop up to confirm if user intends to reset all settings + assert resetSettings != null; + resetSettings.setOnPreferenceClickListener(preference -> { + // Show Alert Dialogue + final AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setMessage(R.string.reset_all_settings); + builder.setCancelable(true); + builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> { + // Deletes all shared preferences xml files. + final SharedPreferences sharedPreferences = + PreferenceManager.getDefaultSharedPreferences(requireContext()); + sharedPreferences.edit().clear().apply(); + // Restarts the app + if (getActivity() == null) { + return; + } + NavigationHelper.restartApp(getActivity()); + }); + builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> { + }); + final AlertDialog alertDialog = builder.create(); + alertDialog.show(); + return true; + }); + } + + private void requestExportPathResult(final ActivityResult result) { + assureCorrectAppLanguage(requireContext()); + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + // will be saved only on success + final Uri lastExportDataUri = result.getData().getData(); + + final StoredFileHelper file = new StoredFileHelper( + requireContext(), result.getData().getData(), ZIP_MIME_TYPE); + + exportDatabase(file, lastExportDataUri); + } + } + + private void requestImportPathResult(final ActivityResult result) { + assureCorrectAppLanguage(requireContext()); + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + // will be saved only on success + final Uri lastImportDataUri = result.getData().getData(); + + final StoredFileHelper file = new StoredFileHelper( + requireContext(), result.getData().getData(), ZIP_MIME_TYPE); + + new androidx.appcompat.app.AlertDialog.Builder(requireActivity()) + .setMessage(R.string.override_current_data) + .setPositiveButton(R.string.ok, (d, id) -> + importDatabase(file, lastImportDataUri)) + .setNegativeButton(R.string.cancel, (d, id) -> + d.cancel()) + .show(); + } + } + + private void exportDatabase(final StoredFileHelper file, final Uri exportDataUri) { + try { + //checkpoint before export + NewPipeDatabase.checkpoint(); + + final SharedPreferences preferences = PreferenceManager + .getDefaultSharedPreferences(requireContext()); + manager.exportDatabase(preferences, file); + + saveLastImportExportDataUri(exportDataUri); // save export path only on success + Toast.makeText(requireContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT) + .show(); + } catch (final Exception e) { + showErrorSnackbar(e, "Exporting database and settings"); + } + } + + private void importDatabase(final StoredFileHelper file, final Uri importDataUri) { + // check if file is supported + if (!ZipHelper.isValidZipFile(file)) { + Toast.makeText(requireContext(), R.string.no_valid_zip_file, Toast.LENGTH_SHORT) + .show(); + return; + } + + try { + if (!manager.ensureDbDirectoryExists()) { + throw new IOException("Could not create databases dir"); + } + + // replace the current database + if (!manager.extractDb(file)) { + Toast.makeText(requireContext(), R.string.could_not_import_all_files, + Toast.LENGTH_LONG) + .show(); + } + + // if settings file exist, ask if it should be imported. + final boolean hasJsonPrefs = manager.exportHasJsonPrefs(file); + if (hasJsonPrefs || manager.exportHasSerializedPrefs(file)) { + new androidx.appcompat.app.AlertDialog.Builder(requireContext()) + .setTitle(R.string.import_settings) + .setMessage(hasJsonPrefs ? null : requireContext() + .getString(R.string.import_settings_vulnerable_format)) + .setOnDismissListener(dialog -> finishImport(importDataUri)) + .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); + try { + if (hasJsonPrefs) { + manager.loadJsonPrefs(file, prefs); + } else { + manager.loadSerializedPrefs(file, prefs); + } + } catch (IOException | ClassNotFoundException | JsonParserException e) { + createErrorNotification(e, "Importing preferences"); + return; + } + cleanImport(context, prefs); + finishImport(importDataUri); + }) + .show(); + } else { + finishImport(importDataUri); + } + } catch (final Exception e) { + showErrorSnackbar(e, "Importing database and settings"); + } + } + + /** + * 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 app. + * + * @param importDataUri The import path to save + */ + private void finishImport(final Uri importDataUri) { + // save import path only on success + saveLastImportExportDataUri(importDataUri); + // restart app to properly load db + NavigationHelper.restartApp(requireActivity()); + } + + private Uri getImportExportDataUri() { + final String path = defaultPreferences.getString(importExportDataPathKey, null); + return isBlank(path) ? null : Uri.parse(path); + } + + private void saveLastImportExportDataUri(final Uri importExportDataUri) { + final SharedPreferences.Editor editor = defaultPreferences.edit() + .putString(importExportDataPathKey, importExportDataUri.toString()); + editor.apply(); + } + + private void showErrorSnackbar(final Throwable e, final String request) { + ErrorUtil.showSnackbar(this, new ErrorInfo(e, UserAction.DATABASE_IMPORT_EXPORT, request)); + } + + private void createErrorNotification(final Throwable e, final String request) { + ErrorUtil.createNotification( + requireContext(), + new ErrorInfo(e, UserAction.DATABASE_IMPORT_EXPORT, request) + ); + } +} 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..ec2bed67a44 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -1,112 +1,47 @@ package org.schabi.newpipe.settings; -import static org.schabi.newpipe.extractor.utils.Utils.isBlank; -import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; - -import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.Toast; -import androidx.activity.result.ActivityResult; -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; import androidx.preference.Preference; -import androidx.preference.PreferenceManager; import org.schabi.newpipe.DownloaderImpl; -import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; -import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.extractor.localization.Localization; -import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard; -import org.schabi.newpipe.streams.io.StoredFileHelper; -import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; -import org.schabi.newpipe.util.ZipHelper; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.PreferredImageQuality; -import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Objects; public class ContentSettingsFragment extends BasePreferenceFragment { - private static final String ZIP_MIME_TYPE = "application/zip"; - - private final SimpleDateFormat exportDateFormat = - new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US); - - private ContentSettingsManager manager; - - private String importExportDataPathKey; private String youtubeRestrictedModeEnabledKey; private Localization initialSelectedLocalization; private ContentCountry initialSelectedContentCountry; private String initialLanguage; - private final ActivityResultLauncher requestImportPathLauncher = - registerForActivityResult(new StartActivityForResult(), this::requestImportPathResult); - private final ActivityResultLauncher requestExportPathLauncher = - registerForActivityResult(new StartActivityForResult(), this::requestExportPathResult); @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - final File homeDir = ContextCompat.getDataDir(requireContext()); - Objects.requireNonNull(homeDir); - manager = new ContentSettingsManager(new NewPipeFileLocator(homeDir)); - manager.deleteSettingsFile(); - - importExportDataPathKey = getString(R.string.import_export_data_path); youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled); addPreferencesFromResourceRegistry(); - final Preference importDataPreference = requirePreference(R.string.import_data); - importDataPreference.setOnPreferenceClickListener((Preference p) -> { - NoFileManagerSafeGuard.launchSafe( - requestImportPathLauncher, - StoredFileHelper.getPicker(requireContext(), - ZIP_MIME_TYPE, getImportExportDataUri()), - TAG, - getContext() - ); - - return true; - }); - - final Preference exportDataPreference = requirePreference(R.string.export_data); - exportDataPreference.setOnPreferenceClickListener((final Preference p) -> { - NoFileManagerSafeGuard.launchSafe( - requestExportPathLauncher, - StoredFileHelper.getNewPicker(requireContext(), - "NewPipeData-" + exportDateFormat.format(new Date()) + ".zip", - ZIP_MIME_TYPE, getImportExportDataUri()), - TAG, - getContext() - ); - - return true; - }); - initialSelectedLocalization = org.schabi.newpipe.util.Localization .getPreferredLocalization(requireContext()); initialSelectedContentCountry = org.schabi.newpipe.util.Localization .getPreferredContentCountry(requireContext()); initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en"); - findPreference(getString(R.string.download_thumbnail_key)).setOnPreferenceChangeListener( + final Preference imageQualityPreference = requirePreference(R.string.image_quality_key); + imageQualityPreference.setOnPreferenceChangeListener( (preference, newValue) -> { - PicassoHelper.setShouldLoadImages((Boolean) newValue); + ImageStrategy.setPreferredImageQuality(PreferredImageQuality + .fromPreferenceKey(requireContext(), (String) newValue)); try { PicassoHelper.clearCache(preference.getContext()); Toast.makeText(preference.getContext(), @@ -153,118 +88,4 @@ public void onDestroy() { NewPipe.setupLocalization(selectedLocalization, selectedContentCountry); } } - - private void requestExportPathResult(final ActivityResult result) { - assureCorrectAppLanguage(getContext()); - if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { - // will be saved only on success - final Uri lastExportDataUri = result.getData().getData(); - - final StoredFileHelper file = - new StoredFileHelper(getContext(), result.getData().getData(), ZIP_MIME_TYPE); - - exportDatabase(file, lastExportDataUri); - } - } - - private void requestImportPathResult(final ActivityResult result) { - assureCorrectAppLanguage(getContext()); - if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { - // will be saved only on success - final Uri lastImportDataUri = result.getData().getData(); - - final StoredFileHelper file = - new StoredFileHelper(getContext(), result.getData().getData(), ZIP_MIME_TYPE); - - new AlertDialog.Builder(requireActivity()) - .setMessage(R.string.override_current_data) - .setPositiveButton(R.string.ok, (d, id) -> - importDatabase(file, lastImportDataUri)) - .setNegativeButton(R.string.cancel, (d, id) -> - d.cancel()) - .create() - .show(); - } - } - - private void exportDatabase(final StoredFileHelper file, final Uri exportDataUri) { - try { - //checkpoint before export - NewPipeDatabase.checkpoint(); - - final SharedPreferences preferences = PreferenceManager - .getDefaultSharedPreferences(requireContext()); - manager.exportDatabase(preferences, file); - - saveLastImportExportDataUri(exportDataUri); // save export path only on success - Toast.makeText(getContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT).show(); - } catch (final Exception e) { - ErrorUtil.showUiErrorSnackbar(this, "Exporting database", e); - } - } - - private void importDatabase(final StoredFileHelper file, final Uri importDataUri) { - // check if file is supported - if (!ZipHelper.isValidZipFile(file)) { - Toast.makeText(getContext(), R.string.no_valid_zip_file, Toast.LENGTH_SHORT) - .show(); - return; - } - - try { - if (!manager.ensureDbDirectoryExists()) { - throw new IOException("Could not create databases dir"); - } - - if (!manager.extractDb(file)) { - Toast.makeText(getContext(), R.string.could_not_import_all_files, Toast.LENGTH_LONG) - .show(); - } - - // 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(); - } else { - finishImport(importDataUri); - } - } catch (final Exception e) { - ErrorUtil.showUiErrorSnackbar(this, "Importing database", e); - } - } - - /** - * Save import path and restart system. - * - * @param importDataUri The import path to save - */ - private void finishImport(final Uri importDataUri) { - // save import path only on success - saveLastImportExportDataUri(importDataUri); - // restart app to properly load db - NavigationHelper.restartApp(requireActivity()); - } - - private Uri getImportExportDataUri() { - final String path = defaultPreferences.getString(importExportDataPathKey, null); - return isBlank(path) ? null : Uri.parse(path); - } - - private void saveLastImportExportDataUri(final Uri importExportDataUri) { - final SharedPreferences.Editor editor = defaultPreferences.edit() - .putString(importExportDataPathKey, importExportDataUri.toString()); - editor.apply(); - } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt deleted file mode 100644 index 8adf6a64909..00000000000 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt +++ /dev/null @@ -1,110 +0,0 @@ -package org.schabi.newpipe.settings - -import android.content.SharedPreferences -import android.util.Log -import org.schabi.newpipe.streams.io.SharpOutputStream -import org.schabi.newpipe.streams.io.StoredFileHelper -import org.schabi.newpipe.util.ZipHelper -import java.io.IOException -import java.io.ObjectInputStream -import java.io.ObjectOutputStream -import java.util.zip.ZipOutputStream - -class ContentSettingsManager(private val fileLocator: NewPipeFileLocator) { - companion object { - const val TAG = "ContentSetManager" - } - - /** - * Exports given [SharedPreferences] to the file in given outputPath. - * It also creates the file. - */ - @Throws(Exception::class) - fun exportDatabase(preferences: SharedPreferences, file: StoredFileHelper) { - file.create() - ZipOutputStream(SharpOutputStream(file.stream).buffered()) - .use { outZip -> - ZipHelper.addFileToZip(outZip, fileLocator.db.path, "newpipe.db") - - try { - ObjectOutputStream(fileLocator.settings.outputStream()).use { output -> - output.writeObject(preferences.all) - output.flush() - } - } catch (e: IOException) { - Log.e(TAG, "Unable to exportDatabase", e) - } - - ZipHelper.addFileToZip(outZip, fileLocator.settings.path, "newpipe.settings") - } - } - - fun deleteSettingsFile() { - fileLocator.settings.delete() - } - - /** - * Tries to create database directory if it does not exist. - * - * @return Whether the directory exists afterwards. - */ - fun ensureDbDirectoryExists(): Boolean { - return fileLocator.dbDir.exists() || fileLocator.dbDir.mkdir() - } - - fun extractDb(file: StoredFileHelper): Boolean { - val success = ZipHelper.extractFileFromZip(file, fileLocator.db.path, "newpipe.db") - if (success) { - fileLocator.dbJournal.delete() - fileLocator.dbWal.delete() - fileLocator.dbShm.delete() - } - - return success - } - - fun extractSettings(file: StoredFileHelper): Boolean { - return ZipHelper.extractFileFromZip(file, fileLocator.settings.path, "newpipe.settings") - } - - fun loadSharedPreferences(preferences: SharedPreferences) { - try { - val preferenceEditor = preferences.edit() - - ObjectInputStream(fileLocator.settings.inputStream()).use { input -> - preferenceEditor.clear() - @Suppress("UNCHECKED_CAST") - val entries = input.readObject() as Map - for ((key, value) in entries) { - when (value) { - is Boolean -> { - preferenceEditor.putBoolean(key, value) - } - is Float -> { - preferenceEditor.putFloat(key, value) - } - is Int -> { - preferenceEditor.putInt(key, value) - } - is Long -> { - preferenceEditor.putLong(key, value) - } - is String -> { - preferenceEditor.putString(key, value) - } - is Set<*> -> { - // There are currently only Sets with type String possible - @Suppress("UNCHECKED_CAST") - preferenceEditor.putStringSet(key, value as Set?) - } - } - } - preferenceEditor.commit() - } - } catch (e: IOException) { - Log.e(TAG, "Unable to loadSharedPreferences", e) - } catch (e: ClassNotFoundException) { - Log.e(TAG, "Unable to loadSharedPreferences", e) - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java index 0f4c9765e5d..d78ade49df6 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java @@ -10,7 +10,7 @@ import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.feed.notifications.NotificationWorker; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.Optional; 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..ff7811af3e6 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.settings; -import static org.schabi.newpipe.extractor.utils.Utils.decodeUrlUtf8; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import android.app.Activity; @@ -30,8 +29,6 @@ import java.io.File; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URI; public class DownloadSettingsFragment extends BasePreferenceFragment { public static final boolean IGNORE_RELEASE_ON_OLD_PATH = true; @@ -108,28 +105,15 @@ private void updatePreferencesSummary() { private void showPathInSummary(final String prefKey, @StringRes final int defaultString, final Preference target) { - String rawUri = defaultPreferences.getString(prefKey, null); - if (rawUri == null || rawUri.isEmpty()) { + final Uri uri = Uri.parse(defaultPreferences.getString(prefKey, "")); + if (uri.equals(Uri.EMPTY)) { target.setSummary(getString(defaultString)); return; } - if (rawUri.charAt(0) == File.separatorChar) { - target.setSummary(rawUri); - return; - } - if (rawUri.startsWith(ContentResolver.SCHEME_FILE)) { - target.setSummary(new File(URI.create(rawUri)).getPath()); - return; - } - - try { - rawUri = decodeUrlUtf8(rawUri); - } catch (final UnsupportedEncodingException e) { - // nothing to do - } - - target.setSummary(rawUri); + final String summary = ContentResolver.SCHEME_FILE.equals(uri.getScheme()) + ? uri.getPath() : uri.toString(); + target.setSummary(summary); } private boolean isFileUri(final String path) { @@ -170,11 +154,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/MainSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java index 3776d78f679..32e33d55bf6 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java @@ -23,7 +23,7 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro setHasOptionsMenu(true); // Otherwise onCreateOptionsMenu is not called // Check if the app is updatable - if (!ReleaseVersionUtil.isReleaseApk()) { + if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) { getPreferenceScreen().removePreference( findPreference(getString(R.string.update_pref_screen_key))); diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeFileLocator.kt b/app/src/main/java/org/schabi/newpipe/settings/NewPipeFileLocator.kt deleted file mode 100644 index c2f93d15f0a..00000000000 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeFileLocator.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.schabi.newpipe.settings - -import java.io.File - -/** - * Locates specific files of NewPipe based on the home directory of the app. - */ -class NewPipeFileLocator(private val homeDir: File) { - - val dbDir by lazy { File(homeDir, "/databases") } - - val db by lazy { File(homeDir, "/databases/newpipe.db") } - - val dbJournal by lazy { File(homeDir, "/databases/newpipe.db-journal") } - - val dbShm by lazy { File(homeDir, "/databases/newpipe.db-shm") } - - val dbWal by lazy { File(homeDir, "/databases/newpipe.db-wal") } - - val settings by lazy { File(homeDir, "/databases/newpipe.settings") } -} 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 16df646f981..421440ea7f8 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; @@ -9,14 +11,13 @@ import androidx.annotation.StringRes; import androidx.preference.PreferenceManager; +import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.util.DeviceUtils; import java.io.File; import java.util.Set; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; - /* * Created by k3b on 07.01.2016. * @@ -44,24 +45,8 @@ public final class NewPipeSettings { private NewPipeSettings() { } public static void initSettings(final Context context) { - // check if there are entries in the prefs to determine whether this is the first app run - Boolean isFirstRun = null; - final Set prefsKeys = PreferenceManager.getDefaultSharedPreferences(context) - .getAll().keySet(); - for (final String key: prefsKeys) { - // ACRA stores some info in the prefs during app initialization - // which happens before this method is called. Therefore ignore ACRA-related keys. - if (!key.toLowerCase().startsWith("acra")) { - isFirstRun = false; - break; - } - } - if (isFirstRun == null) { - isFirstRun = true; - } - // first run migrations, then setDefaultValues, since the latter requires the correct types - SettingMigrations.initMigrations(context, isFirstRun); + SettingMigrations.runMigrationsIfNeeded(context); // readAgain is true so that if new settings are added their default value is set PreferenceManager.setDefaultValues(context, R.xml.main_settings, true); @@ -73,9 +58,12 @@ public static void initSettings(final Context context) { PreferenceManager.setDefaultValues(context, R.xml.player_notification_settings, true); PreferenceManager.setDefaultValues(context, R.xml.update_settings, true); PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true); + PreferenceManager.setDefaultValues(context, R.xml.backup_restore_settings, true); saveDefaultVideoDownloadDirectory(context); saveDefaultAudioDownloadDirectory(context); + + disableMediaTunnelingIfNecessary(context); } static void saveDefaultVideoDownloadDirectory(final Context context) { @@ -152,4 +140,48 @@ 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 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 (App.getApp().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/NotificationsSettingsFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt index fcc9abf7391..2d3344c09f3 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt @@ -3,8 +3,10 @@ package org.schabi.newpipe.settings import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.graphics.Color +import android.os.Build import android.os.Bundle import androidx.preference.Preference +import androidx.preference.SwitchPreference import com.google.android.material.snackbar.Snackbar import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.Disposable @@ -21,15 +23,17 @@ import org.schabi.newpipe.local.subscription.SubscriptionManager class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferenceChangeListener { + private var streamsNotificationsPreference: SwitchPreference? = null private var notificationWarningSnackbar: Snackbar? = null private var loader: Disposable? = null override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.notifications_settings) + streamsNotificationsPreference = + findPreference(getString(R.string.enable_streams_notifications)) // main check is done in onResume, but also do it here to prevent flickering - preferenceScreen.isEnabled = - NotificationHelper.areNotificationsEnabledOnDevice(requireContext()) + updateEnabledState(NotificationHelper.areNotificationsEnabledOnDevice(requireContext())) } override fun onStart() { @@ -68,7 +72,7 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen // If they are disabled, show a snackbar informing the user about that // while allowing them to open the device's app settings. val enabled = NotificationHelper.areNotificationsEnabledOnDevice(requireContext()) - preferenceScreen.isEnabled = enabled // it is disabled by default, see the xml + updateEnabledState(enabled) if (!enabled) { if (notificationWarningSnackbar == null) { notificationWarningSnackbar = Snackbar.make( @@ -109,6 +113,16 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen super.onPause() } + private fun updateEnabledState(enabled: Boolean) { + // On Android 13 player notifications are exempt from notification settings + // so the preferences in app should always be available. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + streamsNotificationsPreference?.isEnabled = enabled + } else { + preferenceScreen.isEnabled = enabled + } + } + private fun updateSubscriptions(subscriptions: List) { val notified = subscriptions.count { it.notificationMode != NotificationMode.DISABLED } val preference = findPreference(getString(R.string.streams_notifications_channels_key)) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index 0f25be63083..37335421d16 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -19,7 +19,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.local.subscription.SubscriptionManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ThemeHelper; import java.util.List; diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index e8491d52cda..36abef9e5ca 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.settings; +import static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists; + import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -25,13 +27,12 @@ import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.List; import java.util.Vector; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; -import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.disposables.Disposable; public class SelectPlaylistFragment extends DialogFragment { @@ -90,8 +91,7 @@ private void loadPlaylists() { final LocalPlaylistManager localPlaylistManager = new LocalPlaylistManager(database); final RemotePlaylistManager remotePlaylistManager = new RemotePlaylistManager(database); - disposable = Flowable.combineLatest(localPlaylistManager.getPlaylists(), - remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) + disposable = getMergedOrderedPlaylists(localPlaylistManager, remotePlaylistManager) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::displayPlaylists, this::onError); } @@ -118,7 +118,7 @@ private void clickedItem(final int position) { if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - onSelectedListener.onLocalPlaylistSelected(entry.uid, entry.name); + onSelectedListener.onLocalPlaylistSelected(entry.getUid(), entry.name); } else if (selectedItem instanceof PlaylistRemoteEntity) { final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); 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..d731f2f5ec1 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -4,8 +4,10 @@ import android.content.SharedPreferences; import android.util.Log; +import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; +import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; @@ -30,9 +32,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 +46,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 +65,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 +81,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 +110,39 @@ 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(); + } + }; + + public static final Migration MIGRATION_5_6 = new Migration(5, 6) { + @Override + protected void migrate(@NonNull final Context context) { + final boolean loadImages = sp.getBoolean("download_thumbnail_key", true); + + sp.edit() + .putString(context.getString(R.string.image_quality_key), + context.getString(loadImages + ? R.string.image_quality_default + : R.string.image_quality_none_key)) + .apply(); + } + }; + /** * List of all implemented migrations. *

@@ -119,22 +154,24 @@ protected void migrate(final Context context) { MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, + MIGRATION_4_5, + MIGRATION_5_6, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - public static final int VERSION = 4; + private static final int VERSION = 6; - public static void initMigrations(final Context context, final boolean isFirstRun) { + public static void runMigrationsIfNeeded(@NonNull final Context context) { // 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); final int lastPrefVersion = sp.getInt(lastPrefVersionKey, 0); // no migration to run, already up to date - if (isFirstRun) { + if (App.getApp().isFirstRun()) { sp.edit().putInt(lastPrefVersionKey, VERSION).apply(); return; } else if (lastPrefVersion == VERSION) { @@ -192,7 +229,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/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index 3ee6668bf94..0d57ce1742d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -21,7 +21,9 @@ import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import com.evernote.android.state.State; import com.jakewharton.rxbinding4.widget.RxTextView; +import com.livefront.bridge.Bridge; import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; @@ -41,9 +43,6 @@ import java.util.concurrent.TimeUnit; -import icepick.Icepick; -import icepick.State; - /* * Created by Christian Schabesberger on 31.08.15. * @@ -93,7 +92,7 @@ protected void onCreate(final Bundle savedInstanceBundle) { assureCorrectAppLanguage(this); super.onCreate(savedInstanceBundle); - Icepick.restoreInstanceState(this, savedInstanceBundle); + Bridge.restoreInstanceState(this, savedInstanceBundle); final boolean restored = savedInstanceBundle != null; final SettingsLayoutBinding settingsLayoutBinding = @@ -125,7 +124,7 @@ protected void onCreate(final Bundle savedInstanceBundle) { @Override protected void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); + Bridge.saveInstanceState(this, outState); } @Override @@ -266,7 +265,7 @@ private void initSearch( */ private void ensureSearchRepresentsApplicationState() { // Check if the update settings are available - if (!ReleaseVersionUtil.isReleaseApk()) { + if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) { SettingsResourceRegistry.getInstance() .getEntryByPreferencesResId(R.xml.update_settings) .setSearchable(false); 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 78ddb37866d..06e0a7c1eae 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,8 @@ 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(BackupRestoreSettingsFragment.class, R.xml.backup_restore_settings); } private SettingRegistryEntry add( diff --git a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java index d1a379e66ea..b8d0aa556d3 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -1,9 +1,12 @@ package org.schabi.newpipe.settings; +import android.app.AlertDialog; +import android.content.Context; import android.os.Bundle; import android.widget.Toast; import androidx.preference.Preference; +import androidx.preference.PreferenceManager; import org.schabi.newpipe.NewVersionWorker; import org.schabi.newpipe.R; @@ -36,4 +39,38 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro findPreference(getString(R.string.manual_update_key)) .setOnPreferenceClickListener(manualUpdateClick); } + + public static void askForConsentToUpdateChecks(final Context context) { + new AlertDialog.Builder(context) + .setTitle(context.getString(R.string.check_for_updates)) + .setMessage(context.getString(R.string.auto_update_check_description)) + .setPositiveButton(context.getString(R.string.yes), (d, w) -> { + d.dismiss(); + setAutoUpdateCheckEnabled(context, true); + }) + .setNegativeButton(R.string.no, (d, w) -> { + d.dismiss(); + // set explicitly to false, since the default is true on previous versions + setAutoUpdateCheckEnabled(context, false); + }) + .show(); + } + + private static void setAutoUpdateCheckEnabled(final Context context, final boolean enabled) { + PreferenceManager.getDefaultSharedPreferences(context) + .edit() + .putBoolean(context.getString(R.string.update_app_key), enabled) + .putBoolean(context.getString(R.string.update_check_consent_key), true) + .apply(); + } + + /** + * Whether the user was asked for consent to automatically check for app updates. + * @param context + * @return true if the user was asked for consent, false otherwise + */ + public static boolean wasUserAskedForConsent(final Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.update_check_consent_key), false); + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index 039f00c1df8..a1f563724ee 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -13,6 +13,7 @@ import com.google.android.material.snackbar.Snackbar; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.PermissionHelper; import java.util.LinkedList; @@ -26,15 +27,15 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro addPreferencesFromResourceRegistry(); updateSeekOptions(); - - listener = (sharedPreferences, s) -> { + updateResolutionOptions(); + listener = (sharedPreferences, key) -> { // on M and above, if user chooses to minimise to popup player on exit // and the app doesn't have display over other apps permission, // show a snackbar to let the user give permission if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && s.equals(getString(R.string.minimize_on_exit_key))) { - final String newSetting = sharedPreferences.getString(s, null); + && getString(R.string.minimize_on_exit_key).equals(key)) { + final String newSetting = sharedPreferences.getString(key, null); if (newSetting != null && newSetting.equals(getString(R.string.minimize_on_exit_popup_key)) && !Settings.canDrawOverlays(getContext())) { @@ -46,12 +47,86 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro .show(); } - } else if (s.equals(getString(R.string.use_inexact_seek_key))) { + } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); + } else if (getString(R.string.show_higher_resolutions_key).equals(key)) { + updateResolutionOptions(); } }; } + /** + * Update default resolution, default popup resolution & mobile data resolution options. + *
+ * Show high resolutions when "Show higher resolution" option is enabled. + * Set default resolution to "best resolution" when "Show higher resolution" option + * is disabled. + */ + private void updateResolutionOptions() { + final Resources resources = getResources(); + final boolean showHigherResolutions = getPreferenceManager().getSharedPreferences() + .getBoolean(resources.getString(R.string.show_higher_resolutions_key), false); + + // get sorted resolution lists + final List resolutionListDescriptions = ListHelper.getSortedResolutionList( + resources, + R.array.resolution_list_description, + R.array.high_resolution_list_descriptions, + showHigherResolutions); + final List resolutionListValues = ListHelper.getSortedResolutionList( + resources, + R.array.resolution_list_values, + R.array.high_resolution_list_values, + showHigherResolutions); + final List limitDataUsageResolutionValues = ListHelper.getSortedResolutionList( + resources, + R.array.limit_data_usage_values_list, + R.array.high_resolution_limit_data_usage_values_list, + showHigherResolutions); + final List limitDataUsageResolutionDescriptions = ListHelper + .getSortedResolutionList(resources, + R.array.limit_data_usage_description_list, + R.array.high_resolution_list_descriptions, + showHigherResolutions); + + // get resolution preferences + final ListPreference defaultResolution = findPreference( + getString(R.string.default_resolution_key)); + final ListPreference defaultPopupResolution = findPreference( + getString(R.string.default_popup_resolution_key)); + final ListPreference mobileDataResolution = findPreference( + getString(R.string.limit_mobile_data_usage_key)); + + // update resolution preferences with new resolutions, entries & values for each + defaultResolution.setEntries(resolutionListDescriptions.toArray(new String[0])); + defaultResolution.setEntryValues(resolutionListValues.toArray(new String[0])); + defaultPopupResolution.setEntries(resolutionListDescriptions.toArray(new String[0])); + defaultPopupResolution.setEntryValues(resolutionListValues.toArray(new String[0])); + mobileDataResolution.setEntries( + limitDataUsageResolutionDescriptions.toArray(new String[0])); + mobileDataResolution.setEntryValues(limitDataUsageResolutionValues.toArray(new String[0])); + + // if "Show higher resolution" option is disabled, + // set default resolution to "best resolution" + if (!showHigherResolutions) { + if (ListHelper.isHighResolutionSelected(defaultResolution.getValue(), + R.array.high_resolution_list_values, + resources)) { + defaultResolution.setValueIndex(0); + } + if (ListHelper.isHighResolutionSelected(defaultPopupResolution.getValue(), + R.array.high_resolution_list_values, + resources)) { + defaultPopupResolution.setValueIndex(0); + } + if (ListHelper.isHighResolutionSelected(mobileDataResolution.getValue(), + R.array.high_resolution_limit_data_usage_values_list, + resources)) { + mobileDataResolution.setValueIndex(0); + } + } + } + /** * Update fast-forward/-rewind seek duration options * according to language and inexact seek setting. diff --git a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java index 3e92f297e6e..7dfddef20d3 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java +++ b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java @@ -5,35 +5,22 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.content.res.ColorStateList; +import android.os.Build; import android.util.AttributeSet; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.RadioButton; -import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.core.widget.TextViewCompat; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import org.schabi.newpipe.App; import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.ListRadioIconItemBinding; -import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding; import org.schabi.newpipe.player.notification.NotificationConstants; -import org.schabi.newpipe.util.DeviceUtils; -import org.schabi.newpipe.util.ThemeHelper; -import org.schabi.newpipe.views.FocusOverlayView; +import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; @@ -45,8 +32,9 @@ public NotificationActionsPreference(final Context context, final AttributeSet a } - @Nullable private NotificationSlot[] notificationSlots = null; - @Nullable private List compactSlots = null; + private NotificationSlot[] notificationSlots; + private List compactSlots; + //////////////////////////////////////////////////////////////////////////// // Lifecycle @@ -56,6 +44,11 @@ public NotificationActionsPreference(final Context context, final AttributeSet a public void onBindViewHolder(@NonNull final PreferenceViewHolder holder) { super.onBindViewHolder(holder); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ((TextView) holder.itemView.findViewById(R.id.summary)) + .setText(R.string.notification_actions_summary_android13); + } + holder.itemView.setClickable(false); setupActions(holder.itemView); } @@ -75,13 +68,29 @@ public void onDetached() { //////////////////////////////////////////////////////////////////////////// private void setupActions(@NonNull final View view) { - compactSlots = NotificationConstants.getCompactSlotsFromPreferences(getContext(), - getSharedPreferences(), 5); + compactSlots = new ArrayList<>(NotificationConstants.getCompactSlotsFromPreferences( + getContext(), getSharedPreferences())); notificationSlots = IntStream.range(0, 5) - .mapToObj(i -> new NotificationSlot(i, view)) + .mapToObj(i -> new NotificationSlot(getContext(), getSharedPreferences(), i, view, + compactSlots.contains(i), this::onToggleCompactSlot)) .toArray(NotificationSlot[]::new); } + private void onToggleCompactSlot(final int i, final CheckBox checkBox) { + if (checkBox.isChecked()) { + compactSlots.remove((Integer) i); + } else if (compactSlots.size() < 3) { + compactSlots.add(i); + } else { + Toast.makeText(getContext(), + R.string.notification_actions_at_most_three, + Toast.LENGTH_SHORT).show(); + return; + } + + checkBox.toggle(); + } + //////////////////////////////////////////////////////////////////////////// // Saving @@ -99,143 +108,10 @@ private void saveChanges() { for (int i = 0; i < 5; i++) { editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), - notificationSlots[i].selectedAction); + notificationSlots[i].getSelectedAction()); } editor.apply(); } } - - - //////////////////////////////////////////////////////////////////////////// - // Notification action - //////////////////////////////////////////////////////////////////////////// - - private static final int[] SLOT_ITEMS = { - R.id.notificationAction0, - R.id.notificationAction1, - R.id.notificationAction2, - R.id.notificationAction3, - R.id.notificationAction4, - }; - - private static final int[] SLOT_TITLES = { - R.string.notification_action_0_title, - R.string.notification_action_1_title, - R.string.notification_action_2_title, - R.string.notification_action_3_title, - R.string.notification_action_4_title, - }; - - private class NotificationSlot { - - final int i; - @NotificationConstants.Action int selectedAction; - - ImageView icon; - TextView summary; - - NotificationSlot(final int actionIndex, final View parentView) { - this.i = actionIndex; - - final View view = parentView.findViewById(SLOT_ITEMS[i]); - setupSelectedAction(view); - setupTitle(view); - setupCheckbox(view); - } - - void setupTitle(final View view) { - ((TextView) view.findViewById(R.id.notificationActionTitle)) - .setText(SLOT_TITLES[i]); - view.findViewById(R.id.notificationActionClickableArea).setOnClickListener( - v -> openActionChooserDialog()); - } - - void setupCheckbox(final View view) { - final CheckBox compactSlotCheckBox = view.findViewById(R.id.notificationActionCheckBox); - compactSlotCheckBox.setChecked(compactSlots.contains(i)); - view.findViewById(R.id.notificationActionCheckBoxClickableArea).setOnClickListener( - v -> { - if (compactSlotCheckBox.isChecked()) { - compactSlots.remove((Integer) i); - } else if (compactSlots.size() < 3) { - compactSlots.add(i); - } else { - Toast.makeText(getContext(), - R.string.notification_actions_at_most_three, - Toast.LENGTH_SHORT).show(); - return; - } - - compactSlotCheckBox.toggle(); - }); - } - - void setupSelectedAction(final View view) { - icon = view.findViewById(R.id.notificationActionIcon); - summary = view.findViewById(R.id.notificationActionSummary); - selectedAction = getSharedPreferences().getInt( - getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), - NotificationConstants.SLOT_DEFAULTS[i]); - updateInfo(); - } - - void updateInfo() { - if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) { - icon.setImageDrawable(null); - } else { - icon.setImageDrawable(AppCompatResources.getDrawable(getContext(), - NotificationConstants.ACTION_ICONS[selectedAction])); - } - - summary.setText(NotificationConstants.getActionName(getContext(), selectedAction)); - } - - void openActionChooserDialog() { - final LayoutInflater inflater = LayoutInflater.from(getContext()); - final SingleChoiceDialogViewBinding binding = - SingleChoiceDialogViewBinding.inflate(inflater); - - final AlertDialog alertDialog = new AlertDialog.Builder(getContext()) - .setTitle(SLOT_TITLES[i]) - .setView(binding.getRoot()) - .setCancelable(true) - .create(); - - final View.OnClickListener radioButtonsClickListener = v -> { - selectedAction = NotificationConstants.SLOT_ALLOWED_ACTIONS[i][v.getId()]; - updateInfo(); - alertDialog.dismiss(); - }; - - for (int id = 0; id < NotificationConstants.SLOT_ALLOWED_ACTIONS[i].length; ++id) { - final int action = NotificationConstants.SLOT_ALLOWED_ACTIONS[i][id]; - final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater) - .getRoot(); - - // if present set action icon with correct color - final int iconId = NotificationConstants.ACTION_ICONS[action]; - if (iconId != 0) { - radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, iconId, 0); - - final var color = ColorStateList.valueOf(ThemeHelper - .resolveColorFromAttr(getContext(), android.R.attr.textColorPrimary)); - TextViewCompat.setCompoundDrawableTintList(radioButton, color); - } - - radioButton.setText(NotificationConstants.getActionName(getContext(), action)); - radioButton.setChecked(action == selectedAction); - radioButton.setId(id); - radioButton.setLayoutParams(new RadioGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - radioButton.setOnClickListener(radioButtonsClickListener); - binding.list.addView(radioButton); - } - alertDialog.show(); - - if (DeviceUtils.isTv(getContext())) { - FocusOverlayView.setupFocusObserver(alertDialog); - } - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java new file mode 100644 index 00000000000..981ba3e7549 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java @@ -0,0 +1,172 @@ +package org.schabi.newpipe.settings.custom; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.widget.TextViewCompat; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.ListRadioIconItemBinding; +import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding; +import org.schabi.newpipe.player.notification.NotificationConstants; +import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.ThemeHelper; +import org.schabi.newpipe.views.FocusOverlayView; + +import java.util.Objects; +import java.util.function.BiConsumer; + +class NotificationSlot { + + private static final int[] SLOT_ITEMS = { + R.id.notificationAction0, + R.id.notificationAction1, + R.id.notificationAction2, + R.id.notificationAction3, + R.id.notificationAction4, + }; + + private static final int[] SLOT_TITLES = { + R.string.notification_action_0_title, + R.string.notification_action_1_title, + R.string.notification_action_2_title, + R.string.notification_action_3_title, + R.string.notification_action_4_title, + }; + + private final int i; + private @NotificationConstants.Action int selectedAction; + private final Context context; + private final BiConsumer onToggleCompactSlot; + + private ImageView icon; + private TextView summary; + + NotificationSlot(final Context context, + final SharedPreferences prefs, + final int actionIndex, + final View parentView, + final boolean isCompactSlotChecked, + final BiConsumer onToggleCompactSlot) { + this.context = context; + this.i = actionIndex; + this.onToggleCompactSlot = onToggleCompactSlot; + + selectedAction = Objects.requireNonNull(prefs).getInt( + context.getString(NotificationConstants.SLOT_PREF_KEYS[i]), + NotificationConstants.SLOT_DEFAULTS[i]); + final View view = parentView.findViewById(SLOT_ITEMS[i]); + + // only show the last two notification slots on Android 13+ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || i >= 3) { + setupSelectedAction(view); + setupTitle(view); + setupCheckbox(view, isCompactSlotChecked); + } else { + view.setVisibility(View.GONE); + } + } + + void setupTitle(final View view) { + ((TextView) view.findViewById(R.id.notificationActionTitle)) + .setText(SLOT_TITLES[i]); + view.findViewById(R.id.notificationActionClickableArea).setOnClickListener( + v -> openActionChooserDialog()); + } + + void setupCheckbox(final View view, final boolean isCompactSlotChecked) { + final CheckBox compactSlotCheckBox = view.findViewById(R.id.notificationActionCheckBox); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + // there are no compact slots to customize on Android 13+ + compactSlotCheckBox.setVisibility(View.GONE); + view.findViewById(R.id.notificationActionCheckBoxClickableArea) + .setVisibility(View.GONE); + return; + } + + compactSlotCheckBox.setChecked(isCompactSlotChecked); + view.findViewById(R.id.notificationActionCheckBoxClickableArea).setOnClickListener( + v -> onToggleCompactSlot.accept(i, compactSlotCheckBox)); + } + + void setupSelectedAction(final View view) { + icon = view.findViewById(R.id.notificationActionIcon); + summary = view.findViewById(R.id.notificationActionSummary); + updateInfo(); + } + + void updateInfo() { + if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) { + icon.setImageDrawable(null); + } else { + icon.setImageDrawable(AppCompatResources.getDrawable(context, + NotificationConstants.ACTION_ICONS[selectedAction])); + } + + summary.setText(NotificationConstants.getActionName(context, selectedAction)); + } + + void openActionChooserDialog() { + final LayoutInflater inflater = LayoutInflater.from(context); + final SingleChoiceDialogViewBinding binding = + SingleChoiceDialogViewBinding.inflate(inflater); + + final AlertDialog alertDialog = new AlertDialog.Builder(context) + .setTitle(SLOT_TITLES[i]) + .setView(binding.getRoot()) + .setCancelable(true) + .create(); + + final View.OnClickListener radioButtonsClickListener = v -> { + selectedAction = NotificationConstants.ALL_ACTIONS[v.getId()]; + updateInfo(); + alertDialog.dismiss(); + }; + + for (int id = 0; id < NotificationConstants.ALL_ACTIONS.length; ++id) { + final int action = NotificationConstants.ALL_ACTIONS[id]; + final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater) + .getRoot(); + + // if present set action icon with correct color + final int iconId = NotificationConstants.ACTION_ICONS[action]; + if (iconId != 0) { + radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, iconId, 0); + + final var color = ColorStateList.valueOf(ThemeHelper + .resolveColorFromAttr(context, android.R.attr.textColorPrimary)); + TextViewCompat.setCompoundDrawableTintList(radioButton, color); + } + + radioButton.setText(NotificationConstants.getActionName(context, action)); + radioButton.setChecked(action == selectedAction); + radioButton.setId(id); + radioButton.setLayoutParams(new RadioGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + radioButton.setOnClickListener(radioButtonsClickListener); + binding.list.addView(radioButton); + } + alertDialog.show(); + + if (DeviceUtils.isTv(context)) { + FocusOverlayView.setupFocusObserver(alertDialog); + } + } + + @NotificationConstants.Action + public int getSelectedAction() { + return selectedAction; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt b/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt new file mode 100644 index 00000000000..c864e4a0df8 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt @@ -0,0 +1,28 @@ +package org.schabi.newpipe.settings.export + +import java.io.File + +/** + * Locates specific files of NewPipe based on the home directory of the app. + */ +class BackupFileLocator(private val homeDir: File) { + companion object { + const val FILE_NAME_DB = "newpipe.db" + @Deprecated( + "Serializing preferences with Java's ObjectOutputStream is vulnerable to injections", + replaceWith = ReplaceWith("FILE_NAME_JSON_PREFS") + ) + const val FILE_NAME_SERIALIZED_PREFS = "newpipe.settings" + const val FILE_NAME_JSON_PREFS = "preferences.json" + } + + val dbDir by lazy { File(homeDir, "/databases") } + + val db by lazy { File(dbDir, FILE_NAME_DB) } + + val dbJournal by lazy { File(dbDir, "$FILE_NAME_DB-journal") } + + val dbShm by lazy { File(dbDir, "$FILE_NAME_DB-shm") } + + val dbWal by lazy { File(dbDir, "$FILE_NAME_DB-wal") } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt new file mode 100644 index 00000000000..36e0b9ce153 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt @@ -0,0 +1,181 @@ +package org.schabi.newpipe.settings.export + +import android.content.SharedPreferences +import com.grack.nanojson.JsonArray +import com.grack.nanojson.JsonParser +import com.grack.nanojson.JsonParserException +import com.grack.nanojson.JsonWriter +import org.schabi.newpipe.streams.io.SharpOutputStream +import org.schabi.newpipe.streams.io.StoredFileHelper +import org.schabi.newpipe.util.ZipHelper +import java.io.FileNotFoundException +import java.io.IOException +import java.io.ObjectOutputStream +import java.util.zip.ZipOutputStream + +class ImportExportManager(private val fileLocator: BackupFileLocator) { + companion object { + const val TAG = "ImportExportManager" + } + + /** + * Exports given [SharedPreferences] to the file in given outputPath. + * It also creates the file. + */ + @Throws(Exception::class) + fun exportDatabase(preferences: SharedPreferences, file: StoredFileHelper) { + // truncate the file before writing to it, otherwise if the new content is smaller than the + // previous file size, the file will retain part of the previous content and be corrupted + ZipOutputStream(SharpOutputStream(file.openAndTruncateStream()).buffered()).use { outZip -> + // add the database + ZipHelper.addFileToZip( + outZip, + BackupFileLocator.FILE_NAME_DB, + fileLocator.db.path, + ) + + // add the legacy vulnerable serialized preferences (will be removed in the future) + ZipHelper.addFileToZip( + outZip, + BackupFileLocator.FILE_NAME_SERIALIZED_PREFS + ) { byteOutput -> + ObjectOutputStream(byteOutput).use { output -> + output.writeObject(preferences.all) + output.flush() + } + } + + // add the JSON preferences + ZipHelper.addFileToZip( + outZip, + BackupFileLocator.FILE_NAME_JSON_PREFS + ) { byteOutput -> + JsonWriter + .indent("") + .on(byteOutput) + .`object`(preferences.all) + .done() + } + } + } + + /** + * Tries to create database directory if it does not exist. + * + * @return Whether the directory exists afterwards. + */ + fun ensureDbDirectoryExists(): Boolean { + return fileLocator.dbDir.exists() || fileLocator.dbDir.mkdir() + } + + /** + * Extracts the database from the given file to the app's database directory. + * The current app's database will be overwritten. + * @param file the .zip file to extract the database from + * @return true if the database was successfully extracted, false otherwise + */ + fun extractDb(file: StoredFileHelper): Boolean { + val success = ZipHelper.extractFileFromZip( + file, + BackupFileLocator.FILE_NAME_DB, + fileLocator.db.path, + ) + + if (success) { + fileLocator.dbJournal.delete() + fileLocator.dbWal.delete() + fileLocator.dbShm.delete() + } + + return success + } + + @Deprecated( + "Serializing preferences with Java's ObjectOutputStream is vulnerable to injections", + replaceWith = ReplaceWith("exportHasJsonPrefs") + ) + fun exportHasSerializedPrefs(zipFile: StoredFileHelper): Boolean { + return ZipHelper.zipContainsFile(zipFile, BackupFileLocator.FILE_NAME_SERIALIZED_PREFS) + } + + fun exportHasJsonPrefs(zipFile: StoredFileHelper): Boolean { + return ZipHelper.zipContainsFile(zipFile, BackupFileLocator.FILE_NAME_JSON_PREFS) + } + + /** + * Remove all shared preferences from the app and load the preferences supplied to the manager. + */ + @Deprecated( + "Serializing preferences with Java's ObjectOutputStream is vulnerable to injections", + replaceWith = ReplaceWith("loadJsonPrefs") + ) + @Throws(IOException::class, ClassNotFoundException::class) + fun loadSerializedPrefs(zipFile: StoredFileHelper, preferences: SharedPreferences) { + ZipHelper.extractFileFromZip(zipFile, BackupFileLocator.FILE_NAME_SERIALIZED_PREFS) { + PreferencesObjectInputStream(it).use { input -> + @Suppress("UNCHECKED_CAST") + val entries = input.readObject() as Map + + val editor = preferences.edit() + editor.clear() + + for ((key, value) in entries) { + when (value) { + is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is String -> editor.putString(key, value) + is Set<*> -> { + // There are currently only Sets with type String possible + @Suppress("UNCHECKED_CAST") + editor.putStringSet(key, value as Set?) + } + } + } + + if (!editor.commit()) { + throw IOException("Unable to commit loadSerializedPrefs") + } + } + }.let { fileExists -> + if (!fileExists) { + throw FileNotFoundException(BackupFileLocator.FILE_NAME_SERIALIZED_PREFS) + } + } + } + + /** + * Remove all shared preferences from the app and load the preferences supplied to the manager. + */ + @Throws(IOException::class, JsonParserException::class) + fun loadJsonPrefs(zipFile: StoredFileHelper, preferences: SharedPreferences) { + ZipHelper.extractFileFromZip(zipFile, BackupFileLocator.FILE_NAME_JSON_PREFS) { + val jsonObject = JsonParser.`object`().from(it) + + val editor = preferences.edit() + editor.clear() + + for ((key, value) in jsonObject) { + when (value) { + is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is String -> editor.putString(key, value) + is JsonArray -> { + editor.putStringSet(key, value.mapNotNull { e -> e as? String }.toSet()) + } + } + } + + if (!editor.commit()) { + throw IOException("Unable to commit loadJsonPrefs") + } + }.let { fileExists -> + if (!fileExists) { + throw FileNotFoundException(BackupFileLocator.FILE_NAME_JSON_PREFS) + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.java b/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.java new file mode 100644 index 00000000000..0d11b0b61c8 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.java @@ -0,0 +1,58 @@ +package org.schabi.newpipe.settings.export; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.util.Set; + +/** + * An {@link ObjectInputStream} that only allows preferences-related types to be deserialized, to + * prevent injections. The only allowed types are: all primitive types, all boxed primitive types, + * null, strings. HashMap, HashSet and arrays of previously defined types are also allowed. Sources: + * + * cmu.edu + * , + * + * OWASP cheatsheet + * , + * + * Apache's {@code ValidatingObjectInputStream} + * + */ +public class PreferencesObjectInputStream extends ObjectInputStream { + + /** + * Primitive types, strings and other built-in types do not pass through resolveClass() but + * instead have a custom encoding; see + * + * official docs. + */ + private static final Set CLASS_WHITELIST = Set.of( + "java.lang.Boolean", + "java.lang.Byte", + "java.lang.Character", + "java.lang.Short", + "java.lang.Integer", + "java.lang.Long", + "java.lang.Float", + "java.lang.Double", + "java.lang.Void", + "java.util.HashMap", + "java.util.HashSet" + ); + + public PreferencesObjectInputStream(final InputStream in) throws IOException { + super(in); + } + + @Override + protected Class resolveClass(final ObjectStreamClass desc) + throws ClassNotFoundException, IOException { + if (CLASS_WHITELIST.contains(desc.getName())) { + return super.resolveClass(desc); + } else { + throw new ClassNotFoundException("Class not allowed: " + desc.getName()); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java index 6b1d70a8668..7e3f5d0c825 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java @@ -248,7 +248,7 @@ public String getTabName(final Context context) { @DrawableRes @Override public int getTabIconRes(final Context context) { - return R.drawable.ic_rss_feed; + return R.drawable.ic_subscriptions; } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java index 32f25ccbdf9..30676477c65 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java @@ -20,6 +20,7 @@ public final class TabsJsonHelper { private static final List FALLBACK_INITIAL_TABS_LIST = List.of( Tab.Type.DEFAULT_KIOSK.getTab(), + Tab.Type.FEED.getTab(), Tab.Type.SUBSCRIPTIONS.getTab(), Tab.Type.BOOKMARKS.getTab()); diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java index 2836fe52b5b..7dcbee56f37 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java @@ -73,10 +73,8 @@ public void unsetSavedTabsListener() { private SharedPreferences.OnSharedPreferenceChangeListener getPreferenceChangeListener() { return (sp, key) -> { - if (key.equals(savedTabsKey)) { - if (savedTabsChangeListener != null) { - savedTabsChangeListener.onTabsChanged(); - } + if (savedTabsKey.equals(key) && savedTabsChangeListener != null) { + savedTabsChangeListener.onTabsChanged(); } }; } diff --git a/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java b/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java index 48ae54284d9..bb47a4b9116 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java +++ b/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java @@ -1,11 +1,19 @@ package org.schabi.newpipe.streams.io; +import static android.provider.DocumentsContract.Document.COLUMN_DISPLAY_NAME; +import static android.provider.DocumentsContract.Root.COLUMN_DOCUMENT_ID; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; + import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; +import android.os.ParcelFileDescriptor; import android.provider.DocumentsContract; +import android.system.Os; +import android.system.StructStatVfs; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -14,23 +22,30 @@ import org.schabi.newpipe.settings.NewPipeSettings; import org.schabi.newpipe.util.FilePickerActivityHelper; -import java.io.File; +import java.io.FileDescriptor; import java.io.IOException; import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; - -import static android.provider.DocumentsContract.Document.COLUMN_DISPLAY_NAME; -import static android.provider.DocumentsContract.Root.COLUMN_DOCUMENT_ID; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class StoredDirectoryHelper { + private static final String TAG = StoredDirectoryHelper.class.getSimpleName(); public static final int PERMISSION_FLAGS = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION; - private File ioTree; + private Path ioTree; private DocumentFile docTree; + /** + * Context is `null` for non-SAF files, i.e. files that use `ioTree`. + */ + @Nullable private Context context; private final String tag; @@ -40,7 +55,7 @@ public StoredDirectoryHelper(@NonNull final Context context, @NonNull final Uri this.tag = tag; if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(path.getScheme())) { - this.ioTree = new File(URI.create(path.toString())); + ioTree = Paths.get(URI.create(path.toString())); return; } @@ -64,13 +79,17 @@ public StoredFileHelper createFile(final String filename, final String mime) { } public StoredFileHelper createUniqueFile(final String name, final String mime) { - final ArrayList matches = new ArrayList<>(); + final List matches = new ArrayList<>(); final String[] filename = splitFilename(name); - final String lcFilename = filename[0].toLowerCase(); + final String lcFileName = filename[0].toLowerCase(); if (docTree == null) { - for (final File file : ioTree.listFiles()) { - addIfStartWith(matches, lcFilename, file.getName()); + try (Stream stream = Files.list(ioTree)) { + matches.addAll(stream.map(path -> path.getFileName().toString().toLowerCase()) + .filter(fileName -> fileName.startsWith(lcFileName)) + .collect(Collectors.toList())); + } catch (final IOException e) { + Log.e(TAG, "Exception while traversing " + ioTree, e); } } else { // warning: SAF file listing is very slow @@ -82,37 +101,37 @@ public StoredFileHelper createUniqueFile(final String name, final String mime) { final ContentResolver cr = context.getContentResolver(); try (Cursor cursor = cr.query(docTreeChildren, projection, selection, - new String[]{lcFilename}, null)) { + new String[]{lcFileName}, null)) { if (cursor != null) { while (cursor.moveToNext()) { - addIfStartWith(matches, lcFilename, cursor.getString(0)); + addIfStartWith(matches, lcFileName, cursor.getString(0)); } } } } - if (matches.size() < 1) { + if (matches.isEmpty()) { return createFile(name, mime, true); - } else { - // check if the filename is in use - String lcName = name.toLowerCase(); - for (final String testName : matches) { - if (testName.equals(lcName)) { - lcName = null; - break; - } - } + } - // check if not in use - if (lcName != null) { - return createFile(name, mime, true); + // check if the filename is in use + String lcName = name.toLowerCase(); + for (final String testName : matches) { + if (testName.equals(lcName)) { + lcName = null; + break; } } + // create file if filename not in use + if (lcName != null) { + return createFile(name, mime, true); + } + Collections.sort(matches, String::compareTo); for (int i = 1; i < 1000; i++) { - if (Collections.binarySearch(matches, makeFileName(lcFilename, i, filename[1])) < 0) { + if (Collections.binarySearch(matches, makeFileName(lcFileName, i, filename[1])) < 0) { return createFile(makeFileName(filename[0], i, filename[1]), mime, true); } } @@ -141,11 +160,11 @@ private StoredFileHelper createFile(final String filename, final String mime, } public Uri getUri() { - return docTree == null ? Uri.fromFile(ioTree) : docTree.getUri(); + return docTree == null ? Uri.fromFile(ioTree.toFile()) : docTree.getUri(); } public boolean exists() { - return docTree == null ? ioTree.exists() : docTree.exists(); + return docTree == null ? Files.exists(ioTree) : docTree.exists(); } /** @@ -157,10 +176,50 @@ public boolean isDirect() { return docTree == null; } + /** + * Get free memory of the storage partition this file belongs to (root of the directory). + * See StackOverflow and + * + * {@code statvfs()} and {@code fstatvfs()} docs + * + * @return amount of free memory in the volume of current directory (bytes), or {@link + * Long#MAX_VALUE} if an error occurred + */ + public long getFreeStorageSpace() { + try { + final StructStatVfs stat; + + if (ioTree != null) { + // non-SAF file, use statvfs with the path directly (also, `context` would be null + // for non-SAF files, so we wouldn't be able to call `getContentResolver` anyway) + stat = Os.statvfs(ioTree.toString()); + + } else { + // SAF file, we can't get a path directly, so obtain a file descriptor first + // and then use fstatvfs with the file descriptor + try (ParcelFileDescriptor parcelFileDescriptor = + context.getContentResolver().openFileDescriptor(getUri(), "r")) { + if (parcelFileDescriptor == null) { + return Long.MAX_VALUE; + } + final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); + stat = Os.fstatvfs(fileDescriptor); + } + } + + // this is the same formula used inside the FsStat class + return stat.f_bavail * stat.f_frsize; + } catch (final Throwable e) { + // ignore any error + Log.e(TAG, "Could not get free storage space", e); + return Long.MAX_VALUE; + } + } + /** * Only using Java I/O. Creates the directory named by this abstract pathname, including any - * necessary but nonexistent parent directories. Note that if this - * operation fails it may have succeeded in creating some of the necessary + * necessary but nonexistent parent directories. + * Note that if this operation fails it may have succeeded in creating some of the necessary * parent directories. * * @return true if and only if the directory was created, @@ -169,7 +228,12 @@ public boolean isDirect() { */ public boolean mkdirs() { if (docTree == null) { - return ioTree.exists() || ioTree.mkdirs(); + try { + Files.createDirectories(ioTree); + } catch (final IOException e) { + Log.e(TAG, "Error while creating directories at " + ioTree, e); + } + return Files.exists(ioTree); } if (docTree.exists()) { @@ -206,8 +270,8 @@ public String getTag() { public Uri findFile(final String filename) { if (docTree == null) { - final File res = new File(ioTree, filename); - return res.exists() ? Uri.fromFile(res) : null; + final Path res = ioTree.resolve(filename); + return Files.exists(res) ? Uri.fromFile(res.toFile()) : null; } final DocumentFile res = findFileSAFHelper(context, docTree, filename); @@ -215,7 +279,7 @@ public Uri findFile(final String filename) { } public boolean canWrite() { - return docTree == null ? ioTree.canWrite() : docTree.canWrite(); + return docTree == null ? Files.isWritable(ioTree) : docTree.canWrite(); } /** @@ -230,14 +294,14 @@ public boolean isInvalidSafStorage() { @NonNull @Override public String toString() { - return (docTree == null ? Uri.fromFile(ioTree) : docTree.getUri()).toString(); + return (docTree == null ? Uri.fromFile(ioTree.toFile()) : docTree.getUri()).toString(); } //////////////////// // Utils /////////////////// - private static void addIfStartWith(final ArrayList list, @NonNull final String base, + private static void addIfStartWith(final List list, @NonNull final String base, final String str) { if (isNullOrEmpty(str)) { return; @@ -248,6 +312,12 @@ private static void addIfStartWith(final ArrayList list, @NonNull final } } + /** + * Splits the filename into the name and extension. + * + * @param filename The filename to split + * @return A String array with the name at index 0 and extension at index 1 + */ private static String[] splitFilename(@NonNull final String filename) { final int dotIndex = filename.lastIndexOf('.'); @@ -259,7 +329,7 @@ private static String[] splitFilename(@NonNull final String filename) { } private static String makeFileName(final String name, final int idx, final String ext) { - return name.concat(" (").concat(String.valueOf(idx)).concat(")").concat(ext); + return name + "(" + idx + ")" + ext; } /** diff --git a/app/src/main/java/org/schabi/newpipe/streams/io/StoredFileHelper.java b/app/src/main/java/org/schabi/newpipe/streams/io/StoredFileHelper.java index 1f0c914568d..1e2c178bff0 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/io/StoredFileHelper.java +++ b/app/src/main/java/org/schabi/newpipe/streams/io/StoredFileHelper.java @@ -23,6 +23,9 @@ import java.io.IOException; import java.io.Serializable; import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import us.shandian.giga.io.FileStream; import us.shandian.giga.io.FileStreamSAF; @@ -36,7 +39,7 @@ public class StoredFileHelper implements Serializable { private transient DocumentFile docFile; private transient DocumentFile docTree; - private transient File ioFile; + private transient Path ioPath; private transient Context context; protected String source; @@ -49,7 +52,8 @@ public class StoredFileHelper implements Serializable { public StoredFileHelper(final Context context, final Uri uri, final String mime) { if (FilePickerActivityHelper.isOwnFileUri(context, uri)) { - ioFile = Utils.getFileForUri(uri); + final File ioFile = Utils.getFileForUri(uri); + ioPath = ioFile.toPath(); source = Uri.fromFile(ioFile).toString(); } else { docFile = DocumentFile.fromSingleUri(context, uri); @@ -100,26 +104,18 @@ public StoredFileHelper(@Nullable final Uri parent, final String filename, final this.srcType = this.docFile.getType(); } - StoredFileHelper(final File location, final String filename, final String mime) + StoredFileHelper(final Path location, final String filename, final String mime) throws IOException { - this.ioFile = new File(location, filename); + ioPath = location.resolve(filename); - if (this.ioFile.exists()) { - if (!this.ioFile.isFile() && !this.ioFile.delete()) { - throw new IOException("The filename is already in use by non-file entity " - + "and cannot overwrite it"); - } - } else { - if (!this.ioFile.createNewFile()) { - throw new IOException("Cannot create the file"); - } - } + Files.deleteIfExists(ioPath); + Files.createFile(ioPath); - this.source = Uri.fromFile(this.ioFile).toString(); - this.sourceTree = Uri.fromFile(location).toString(); + source = Uri.fromFile(ioPath.toFile()).toString(); + sourceTree = Uri.fromFile(location.toFile()).toString(); - this.srcName = ioFile.getName(); - this.srcType = mime; + srcName = ioPath.getFileName().toString(); + srcType = mime; } public StoredFileHelper(final Context context, @Nullable final Uri parent, @@ -129,12 +125,12 @@ public StoredFileHelper(final Context context, @Nullable final Uri parent, if (path.getScheme() == null || path.getScheme().equalsIgnoreCase(ContentResolver.SCHEME_FILE)) { - this.ioFile = new File(URI.create(this.source)); + this.ioPath = Paths.get(URI.create(this.source)); } else { final DocumentFile file = DocumentFile.fromSingleUri(context, path); if (file == null) { - throw new RuntimeException("SAF not available"); + throw new IOException("SAF not available"); } this.context = context; @@ -187,12 +183,25 @@ public SharpStream getStream() throws IOException { assertValid(); if (docFile == null) { - return new FileStream(ioFile); + return new FileStream(ioPath.toFile()); } else { return new FileStreamSAF(context.getContentResolver(), docFile.getUri()); } } + public SharpStream openAndTruncateStream() throws IOException { + final SharpStream sharpStream = getStream(); + try { + sharpStream.setLength(0); + } catch (final Throwable e) { + // we can't use try-with-resources here, since we only want to close the stream if an + // exception occurs, but leave it open if everything goes well + sharpStream.close(); + throw e; + } + return sharpStream; + } + /** * Indicates whether it's using the {@code java.io} API. * @@ -211,7 +220,7 @@ public boolean isInvalid() { public Uri getUri() { assertValid(); - return docFile == null ? Uri.fromFile(ioFile) : docFile.getUri(); + return docFile == null ? Uri.fromFile(ioPath.toFile()) : docFile.getUri(); } public Uri getParentUri() { @@ -233,7 +242,12 @@ public boolean delete() { return true; } if (docFile == null) { - return ioFile.delete(); + try { + return Files.deleteIfExists(ioPath); + } catch (final IOException e) { + Log.e(TAG, "Exception while deleting " + ioPath, e); + return false; + } } final boolean res = docFile.delete(); @@ -252,21 +266,30 @@ public boolean delete() { public long length() { assertValid(); - return docFile == null ? ioFile.length() : docFile.length(); + if (docFile == null) { + try { + return Files.size(ioPath); + } catch (final IOException e) { + Log.e(TAG, "Exception while getting the size of " + ioPath, e); + return 0; + } + } else { + return docFile.length(); + } } public boolean canWrite() { if (source == null) { return false; } - return docFile == null ? ioFile.canWrite() : docFile.canWrite(); + return docFile == null ? Files.isWritable(ioPath) : docFile.canWrite(); } public String getName() { if (source == null) { return srcName; } else if (docFile == null) { - return ioFile.getName(); + return ioPath.getFileName().toString(); } final String name = docFile.getName(); @@ -287,12 +310,11 @@ public String getTag() { } public boolean existsAsFile() { - if (source == null || (docFile == null && ioFile == null)) { + if (source == null || (docFile == null && ioPath == null)) { if (DEBUG) { Log.d(TAG, "existsAsFile called but something is null: source = [" + (source == null ? "null => storage is invalid" : source) - + "], docFile = [" + (docFile == null ? "null" : docFile) - + "], ioFile = [" + (ioFile == null ? "null" : ioFile) + "]"); + + "], docFile = [" + docFile + "], ioPath = [" + ioPath + "]"); } return false; } @@ -300,7 +322,7 @@ public boolean existsAsFile() { // WARNING: DocumentFile.exists() and DocumentFile.isFile() methods are slow // docFile.isVirtual() means it is non-physical? return docFile == null - ? (ioFile.exists() && ioFile.isFile()) + ? Files.isRegularFile(ioPath) : (docFile.exists() && docFile.isFile()); } @@ -310,8 +332,10 @@ public boolean create() { if (docFile == null) { try { - result = ioFile.createNewFile(); + Files.createFile(ioPath); + result = true; } catch (final IOException e) { + Log.e(TAG, "Exception while creating " + ioPath, e); return false; } } else if (docTree == null) { @@ -332,7 +356,8 @@ public boolean create() { } if (result) { - source = (docFile == null ? Uri.fromFile(ioFile) : docFile.getUri()).toString(); + source = (docFile == null ? Uri.fromFile(ioPath.toFile()) : docFile.getUri()) + .toString(); srcName = getName(); srcType = getType(); } @@ -352,7 +377,7 @@ public void invalidate() { docTree = null; docFile = null; - ioFile = null; + ioPath = null; context = null; } @@ -383,7 +408,7 @@ public boolean equals(final StoredFileHelper storage) { } if (this.isDirect()) { - return this.ioFile.getPath().equalsIgnoreCase(storage.ioFile.getPath()); + return this.ioPath.equals(storage.ioPath); } return DocumentsContract.getDocumentId(this.docFile.getUri()) 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..90689052edf --- /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.StreamInfoWrapper; + +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 StreamInfoWrapper<>(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/BridgeStateSaverInitializer.java b/app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java new file mode 100644 index 00000000000..aeda4717cad --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java @@ -0,0 +1,61 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.os.Bundle; +import android.os.Parcelable; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.evernote.android.state.StateSaver; +import com.livefront.bridge.Bridge; +import com.livefront.bridge.SavedStateHandler; +import com.livefront.bridge.ViewSavedStateHandler; + +/** + * Configures Bridge's state saver. + */ +public final class BridgeStateSaverInitializer { + + public static void init(final Context context) { + Bridge.initialize( + context, + new SavedStateHandler() { + @Override + public void saveInstanceState( + @NonNull final Object target, + @NonNull final Bundle state) { + StateSaver.saveInstanceState(target, state); + } + + @Override + public void restoreInstanceState( + @NonNull final Object target, + @Nullable final Bundle state) { + StateSaver.restoreInstanceState(target, state); + } + }, + new ViewSavedStateHandler() { + @NonNull + @Override + public Parcelable saveInstanceState( + @NonNull final T target, + @Nullable final Parcelable parentState) { + return StateSaver.saveInstanceState(target, parentState); + } + + @Nullable + @Override + public Parcelable restoreInstanceState( + @NonNull final T target, + @Nullable final Parcelable state) { + return StateSaver.restoreInstanceState(target, state); + } + } + ); + } + + private BridgeStateSaverInitializer() { + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java b/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java new file mode 100644 index 00000000000..8e8d3849007 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java @@ -0,0 +1,151 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.content.SharedPreferences; + +import androidx.annotation.StringRes; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.channel.tabs.ChannelTabs; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; + +import java.util.List; +import java.util.Set; + +public final class ChannelTabHelper { + private ChannelTabHelper() { + } + + /** + * @param tab the channel tab to check + * @return whether the tab should contain (playable) streams or not + */ + public static boolean isStreamsTab(final String tab) { + switch (tab) { + case ChannelTabs.VIDEOS: + case ChannelTabs.TRACKS: + case ChannelTabs.SHORTS: + case ChannelTabs.LIVESTREAMS: + return true; + default: + return false; + } + } + + /** + * @param tab the channel tab link handler to check + * @return whether the tab should contain (playable) streams or not + */ + public static boolean isStreamsTab(final ListLinkHandler tab) { + final List contentFilters = tab.getContentFilters(); + if (contentFilters.isEmpty()) { + return false; // this should never happen, but check just to be sure + } else { + return isStreamsTab(contentFilters.get(0)); + } + } + + @StringRes + private static int getShowTabKey(final String tab) { + switch (tab) { + case ChannelTabs.VIDEOS: + return R.string.show_channel_tabs_videos; + case ChannelTabs.TRACKS: + return R.string.show_channel_tabs_tracks; + case ChannelTabs.SHORTS: + return R.string.show_channel_tabs_shorts; + case ChannelTabs.LIVESTREAMS: + return R.string.show_channel_tabs_livestreams; + case ChannelTabs.CHANNELS: + return R.string.show_channel_tabs_channels; + case ChannelTabs.PLAYLISTS: + return R.string.show_channel_tabs_playlists; + case ChannelTabs.ALBUMS: + return R.string.show_channel_tabs_albums; + default: + return -1; + } + } + + @StringRes + private static int getFetchFeedTabKey(final String tab) { + switch (tab) { + case ChannelTabs.VIDEOS: + return R.string.fetch_channel_tabs_videos; + case ChannelTabs.TRACKS: + return R.string.fetch_channel_tabs_tracks; + case ChannelTabs.SHORTS: + return R.string.fetch_channel_tabs_shorts; + case ChannelTabs.LIVESTREAMS: + return R.string.fetch_channel_tabs_livestreams; + default: + return -1; + } + } + + @StringRes + public static int getTranslationKey(final String tab) { + switch (tab) { + case ChannelTabs.VIDEOS: + return R.string.channel_tab_videos; + case ChannelTabs.TRACKS: + return R.string.channel_tab_tracks; + case ChannelTabs.SHORTS: + return R.string.channel_tab_shorts; + case ChannelTabs.LIVESTREAMS: + return R.string.channel_tab_livestreams; + case ChannelTabs.CHANNELS: + return R.string.channel_tab_channels; + case ChannelTabs.PLAYLISTS: + return R.string.channel_tab_playlists; + case ChannelTabs.ALBUMS: + return R.string.channel_tab_albums; + default: + return R.string.unknown_content; + } + } + + public static boolean showChannelTab(final Context context, + final SharedPreferences sharedPreferences, + @StringRes final int key) { + final Set enabledTabs = sharedPreferences.getStringSet( + context.getString(R.string.show_channel_tabs_key), null); + if (enabledTabs == null) { + return true; // default to true + } else { + return enabledTabs.contains(context.getString(key)); + } + } + + public static boolean showChannelTab(final Context context, + final SharedPreferences sharedPreferences, + final String tab) { + final int key = ChannelTabHelper.getShowTabKey(tab); + if (key == -1) { + return false; + } + return showChannelTab(context, sharedPreferences, key); + } + + public static boolean fetchFeedChannelTab(final Context context, + final SharedPreferences sharedPreferences, + final ListLinkHandler tab) { + final List contentFilters = tab.getContentFilters(); + if (contentFilters.isEmpty()) { + return false; // this should never happen, but check just to be sure + } + + final int key = ChannelTabHelper.getFetchFeedTabKey(contentFilters.get(0)); + if (key == -1) { + return false; + } + + final Set enabledTabs = sharedPreferences.getStringSet( + context.getString(R.string.feed_fetch_channel_tabs_key), null); + if (enabledTabs == null) { + return true; // default to true + } else { + return enabledTabs.contains(context.getString(key)); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java deleted file mode 100644 index 7c87e664ba8..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.schabi.newpipe.util; - -import android.text.Layout; -import android.text.Selection; -import android.text.Spannable; -import android.text.Spanned; -import android.text.style.ClickableSpan; -import android.text.style.URLSpan; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.external_communication.InternalUrlsHandler; - -import io.reactivex.rxjava3.disposables.CompositeDisposable; - -public class CommentTextOnTouchListener implements View.OnTouchListener { - public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener(); - - @Override - public boolean onTouch(final View v, final MotionEvent event) { - if (!(v instanceof TextView)) { - return false; - } - final TextView widget = (TextView) v; - final Object text = widget.getText(); - if (text instanceof Spanned) { - final Spannable buffer = (Spannable) text; - - final int action = event.getAction(); - - if (action == MotionEvent.ACTION_UP - || action == MotionEvent.ACTION_DOWN) { - int x = (int) event.getX(); - int y = (int) event.getY(); - - x -= widget.getTotalPaddingLeft(); - y -= widget.getTotalPaddingTop(); - - x += widget.getScrollX(); - y += widget.getScrollY(); - - final Layout layout = widget.getLayout(); - final int line = layout.getLineForVertical(y); - final int off = layout.getOffsetForHorizontal(line, x); - - final ClickableSpan[] link = buffer.getSpans(off, off, - ClickableSpan.class); - - if (link.length != 0) { - if (action == MotionEvent.ACTION_UP) { - if (link[0] instanceof URLSpan) { - final String url = ((URLSpan) link[0]).getURL(); - if (!InternalUrlsHandler.handleUrlCommentsTimestamp( - new CompositeDisposable(), v.getContext(), url)) { - ShareUtils.openUrlInBrowser(v.getContext(), url, false); - } - } - } else if (action == MotionEvent.ACTION_DOWN) { - Selection.setSelection(buffer, - buffer.getSpanStart(link[0]), - buffer.getSpanEnd(link[0])); - } - return true; - } - } - } - return false; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java new file mode 100644 index 00000000000..9591beddb3c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java @@ -0,0 +1,51 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.content.SharedPreferences; + +import androidx.preference.PreferenceManager; + +import org.schabi.newpipe.R; + +/** + * For preferences with dependencies and multiple use case, + * this class can be used to reduce the lines of code. + */ +public final class DependentPreferenceHelper { + + private DependentPreferenceHelper() { + // no instance + } + + /** + * Option `Resume playback` depends on `Watch history`, this method can be used to retrieve if + * `Resume playback` and its dependencies are all enabled. + * + * @param context the Android context + * @return returns true if `Resume playback` and `Watch history` are both enabled + */ + public static boolean getResumePlaybackEnabled(final Context context) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + return prefs.getBoolean(context.getString( + R.string.enable_watch_history_key), true) + && prefs.getBoolean(context.getString( + R.string.enable_playback_resume_key), true); + } + + /** + * Option `Position in lists` depends on `Watch history`, this method can be used to retrieve if + * `Position in lists` and its dependencies are all enabled. + * + * @param context the Android context + * @return returns true if `Positions in lists` and `Watch history` are both enabled + */ + public static boolean getPositionsInListsEnabled(final Context context) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + return prefs.getBoolean(context.getString( + R.string.enable_watch_history_key), true) + && prefs.getBoolean(context.getString( + R.string.enable_playback_state_lists_key), true); + } +} 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/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 27009efd192..066d5f57047 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -20,12 +20,14 @@ package org.schabi.newpipe.util; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; +import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD; import android.content.Context; import android.util.Log; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.text.HtmlCompat; import androidx.preference.PreferenceManager; @@ -35,23 +37,21 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage; -import org.schabi.newpipe.extractor.ListInfo; import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.Page; -import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo; import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; -import org.schabi.newpipe.extractor.feed.FeedExtractor; -import org.schabi.newpipe.extractor.feed.FeedInfo; import org.schabi.newpipe.extractor.kiosk.KioskInfo; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.search.SearchInfo; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; -import org.schabi.newpipe.util.external_communication.TextLinkifier; +import org.schabi.newpipe.util.text.TextLinkifier; import java.util.Collections; import java.util.List; @@ -114,46 +114,43 @@ public static Single> suggestionsFor(final int serviceId, final Str public static Single getStreamInfo(final int serviceId, final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.STREAM, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.STREAM, Single.fromCallable(() -> StreamInfo.getInfo(NewPipe.getService(serviceId), url))); } public static Single getChannelInfo(final int serviceId, final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.CHANNEL, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.CHANNEL, Single.fromCallable(() -> ChannelInfo.getInfo(NewPipe.getService(serviceId), url))); } - public static Single> getMoreChannelItems(final int serviceId, - final String url, - final Page nextPage) { + public static Single getChannelTab(final int serviceId, + final ListLinkHandler listLinkHandler, + final boolean forceLoad) { checkServiceId(serviceId); - return Single.fromCallable(() -> - ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); + return checkCache(forceLoad, serviceId, + listLinkHandler.getUrl(), InfoCache.Type.CHANNEL_TAB, + Single.fromCallable(() -> + ChannelTabInfo.getInfo(NewPipe.getService(serviceId), listLinkHandler))); } - public static Single> getFeedInfoFallbackToChannelInfo( - final int serviceId, final String url) { - final Maybe> maybeFeedInfo = Maybe.fromCallable(() -> { - final StreamingService service = NewPipe.getService(serviceId); - final FeedExtractor feedExtractor = service.getFeedExtractor(url); - - if (feedExtractor == null) { - return null; - } - - return FeedInfo.getInfo(feedExtractor); - }); - - return maybeFeedInfo.switchIfEmpty(getChannelInfo(serviceId, url, true)); + public static Single> getMoreChannelTabItems( + final int serviceId, + final ListLinkHandler listLinkHandler, + final Page nextPage) { + checkServiceId(serviceId); + return Single.fromCallable(() -> + ChannelTabInfo.getMoreItems(NewPipe.getService(serviceId), + listLinkHandler, nextPage)); } - public static Single getCommentsInfo(final int serviceId, final String url, + public static Single getCommentsInfo(final int serviceId, + final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.COMMENT, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.COMMENTS, Single.fromCallable(() -> CommentsInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -167,11 +164,20 @@ public static Single> getMoreCommentItems( CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPage)); } + public static Single> getMoreCommentItems( + final int serviceId, + final String url, + final Page nextPage) { + checkServiceId(serviceId); + return Single.fromCallable(() -> + CommentsInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); + } + public static Single getPlaylistInfo(final int serviceId, final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.PLAYLIST, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.PLAYLIST, Single.fromCallable(() -> PlaylistInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -184,9 +190,10 @@ public static Single> getMorePlaylistItems(final i PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); } - public static Single getKioskInfo(final int serviceId, final String url, + public static Single getKioskInfo(final int serviceId, + final String url, final boolean forceLoad) { - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.PLAYLIST, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.KIOSK, Single.fromCallable(() -> KioskInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -198,7 +205,7 @@ public static Single> getMoreKioskItems(final int } /*////////////////////////////////////////////////////////////////////////// - // Utils + // Cache //////////////////////////////////////////////////////////////////////////*/ /** @@ -210,25 +217,26 @@ public static Single> getMoreKioskItems(final int * @param forceLoad whether to force loading from the network instead of from the cache * @param serviceId the service to load from * @param url the URL to load - * @param infoType the {@link InfoItem.InfoType} of the item + * @param cacheType the {@link InfoCache.Type} of the item * @param loadFromNetwork the {@link Single} to load the item from the network * @return a {@link Single} that loads the item */ private static Single checkCache(final boolean forceLoad, - final int serviceId, final String url, - final InfoItem.InfoType infoType, - final Single loadFromNetwork) { + final int serviceId, + @NonNull final String url, + @NonNull final InfoCache.Type cacheType, + @NonNull final Single loadFromNetwork) { checkServiceId(serviceId); final Single actualLoadFromNetwork = loadFromNetwork - .doOnSuccess(info -> CACHE.putInfo(serviceId, url, info, infoType)); + .doOnSuccess(info -> CACHE.putInfo(serviceId, url, info, cacheType)); final Single load; if (forceLoad) { - CACHE.removeInfo(serviceId, url, infoType); + CACHE.removeInfo(serviceId, url, cacheType); load = actualLoadFromNetwork; } else { - load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url, infoType), - actualLoadFromNetwork.toMaybe()) + load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url, cacheType), + actualLoadFromNetwork.toMaybe()) .firstElement() // Take the first valid .toSingle(); } @@ -239,18 +247,20 @@ private static Single checkCache(final boolean forceLoad, /** * Default implementation uses the {@link InfoCache} to get cached results. * - * @param the item type's class that extends {@link Info} - * @param serviceId the service to load from - * @param url the URL to load - * @param infoType the {@link InfoItem.InfoType} of the item + * @param the item type's class that extends {@link Info} + * @param serviceId the service to load from + * @param url the URL to load + * @param cacheType the {@link InfoCache.Type} of the item * @return a {@link Single} that loads the item */ - private static Maybe loadFromCache(final int serviceId, final String url, - final InfoItem.InfoType infoType) { + private static Maybe loadFromCache( + final int serviceId, + @NonNull final String url, + @NonNull final InfoCache.Type cacheType) { checkServiceId(serviceId); return Maybe.defer(() -> { //noinspection unchecked - final I info = (I) CACHE.getFromKey(serviceId, url, infoType); + final I info = (I) CACHE.getFromKey(serviceId, url, cacheType); if (MainActivity.DEBUG) { Log.d(TAG, "loadFromCache() called, info > " + info); } @@ -264,20 +274,27 @@ private static Maybe loadFromCache(final int serviceId, fina }); } - public static boolean isCached(final int serviceId, final String url, - final InfoItem.InfoType infoType) { - return null != loadFromCache(serviceId, url, infoType).blockingGet(); + public static boolean isCached(final int serviceId, + @NonNull final String url, + @NonNull final InfoCache.Type cacheType) { + return null != loadFromCache(serviceId, url, cacheType).blockingGet(); } + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + /** * Formats the text contained in the meta info list as HTML and puts it into the text view, * while also making the separator visible. If the list is null or empty, or the user chose not * to see meta information, both the text view and the separator are hidden - * @param metaInfos a list of meta information, can be null or empty - * @param metaInfoTextView the text view in which to show the formatted HTML + * + * @param metaInfos a list of meta information, can be null or empty + * @param metaInfoTextView the text view in which to show the formatted HTML * @param metaInfoSeparator another view to be shown or hidden accordingly to the text view - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class + * @param disposables disposables created by the method are added here and their lifecycle + * should be handled by the calling class */ public static void showMetaInfoInTextView(@Nullable final List metaInfos, final TextView metaInfoTextView, @@ -286,7 +303,7 @@ public static void showMetaInfoInTextView(@Nullable final List metaInf final Context context = metaInfoTextView.getContext(); if (metaInfos == null || metaInfos.isEmpty() || !PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - context.getString(R.string.show_meta_info_key), true)) { + context.getString(R.string.show_meta_info_key), true)) { metaInfoTextView.setVisibility(View.GONE); metaInfoSeparator.setVisibility(View.GONE); @@ -319,8 +336,9 @@ public static void showMetaInfoInTextView(@Nullable final List metaInf } metaInfoSeparator.setVisibility(View.VISIBLE); - TextLinkifier.createLinksFromHtmlBlock(metaInfoTextView, stringBuilder.toString(), - HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, disposables); + TextLinkifier.fromHtml(metaInfoTextView, stringBuilder.toString(), + HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, null, disposables, + SET_LINK_MOVEMENT_METHOD); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java index edcb565a04b..bc15f3f0242 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java @@ -7,6 +7,7 @@ import org.schabi.newpipe.R; +import java.util.regex.Matcher; import java.util.regex.Pattern; public final class FilenameUtils { @@ -51,7 +52,7 @@ public static String createFilename(final Context context, final String title) { final Pattern pattern = Pattern.compile(charset); - return createFilename(title, pattern, replacementChar); + return createFilename(title, pattern, Matcher.quoteReplacement(replacementChar)); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/InfoCache.java b/app/src/main/java/org/schabi/newpipe/util/InfoCache.java index a07f05828fe..b9c91f8a5b0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/InfoCache.java +++ b/app/src/main/java/org/schabi/newpipe/util/InfoCache.java @@ -27,7 +27,6 @@ import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.extractor.Info; -import org.schabi.newpipe.extractor.InfoItem; import java.util.Map; @@ -48,14 +47,27 @@ private InfoCache() { // no instance } + /** + * Identifies the type of {@link Info} to put into the cache. + */ + public enum Type { + STREAM, + CHANNEL, + CHANNEL_TAB, + COMMENTS, + PLAYLIST, + KIOSK, + } + public static InfoCache getInstance() { return INSTANCE; } @NonNull - private static String keyOf(final int serviceId, @NonNull final String url, - @NonNull final InfoItem.InfoType infoType) { - return serviceId + url + infoType.toString(); + private static String keyOf(final int serviceId, + @NonNull final String url, + @NonNull final Type cacheType) { + return serviceId + ":" + cacheType.ordinal() + ":" + url; } private static void removeStaleCache() { @@ -83,19 +95,22 @@ private static Info getInfo(@NonNull final String key) { } @Nullable - public Info getFromKey(final int serviceId, @NonNull final String url, - @NonNull final InfoItem.InfoType infoType) { + public Info getFromKey(final int serviceId, + @NonNull final String url, + @NonNull final Type cacheType) { if (DEBUG) { Log.d(TAG, "getFromKey() called with: " + "serviceId = [" + serviceId + "], url = [" + url + "]"); } synchronized (LRU_CACHE) { - return getInfo(keyOf(serviceId, url, infoType)); + return getInfo(keyOf(serviceId, url, cacheType)); } } - public void putInfo(final int serviceId, @NonNull final String url, @NonNull final Info info, - @NonNull final InfoItem.InfoType infoType) { + public void putInfo(final int serviceId, + @NonNull final String url, + @NonNull final Info info, + @NonNull final Type cacheType) { if (DEBUG) { Log.d(TAG, "putInfo() called with: info = [" + info + "]"); } @@ -103,18 +118,19 @@ public void putInfo(final int serviceId, @NonNull final String url, @NonNull fin final long expirationMillis = ServiceHelper.getCacheExpirationMillis(info.getServiceId()); synchronized (LRU_CACHE) { final CacheData data = new CacheData(info, expirationMillis); - LRU_CACHE.put(keyOf(serviceId, url, infoType), data); + LRU_CACHE.put(keyOf(serviceId, url, cacheType), data); } } - public void removeInfo(final int serviceId, @NonNull final String url, - @NonNull final InfoItem.InfoType infoType) { + public void removeInfo(final int serviceId, + @NonNull final String url, + @NonNull final Type cacheType) { if (DEBUG) { Log.d(TAG, "removeInfo() called with: " + "serviceId = [" + serviceId + "], url = [" + url + "]"); } synchronized (LRU_CACHE) { - LRU_CACHE.remove(keyOf(serviceId, url, infoType)); + LRU_CACHE.remove(keyOf(serviceId, url, cacheType)); } } 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..282a88b1eaf 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -1,7 +1,10 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.extractor.ServiceList.YouTube; + import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Resources; import android.net.ConnectivityManager; import androidx.annotation.NonNull; @@ -13,6 +16,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 +27,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 +41,42 @@ 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 priority. 0=lowest, n=highest + private static final List AUDIO_TRACK_TYPE_RANKING = + List.of(AudioTrackType.DESCRIPTIVE, AudioTrackType.SECONDARY, AudioTrackType.DUBBED, + AudioTrackType.ORIGINAL); + // Audio track types in order of priority when descriptive audio is preferred. + private static final List AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE = + List.of(AudioTrackType.SECONDARY, AudioTrackType.DUBBED, AudioTrackType.ORIGINAL, + 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 +86,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 +99,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 +112,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 +126,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))); + } - // 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); + public static int getDefaultAudioTrackGroup(final Context context, + final List> groupedAudioStreams) { + if (groupedAudioStreams == null || groupedAudioStreams.isEmpty()) { + return -1; } + + final Comparator cmp = getAudioTrackComparator(context); + final List highestRanked = groupedAudioStreams.stream() + .max((o1, o2) -> cmp.compare(o1.get(0), o2.get(0))) + .orElse(null); + return groupedAudioStreams.indexOf(highestRanked); + } + + public static int getAudioFormatIndex(final Context context, + final List audioStreams, + @Nullable final String trackId) { + 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 +169,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 +184,36 @@ 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, see {@link #SUPPORTED_ITAG_IDS} for more details. + * Torrent streams are also removed, because they cannot be retrieved, like OPUS streams using + * HLS as their delivery method, since they are not supported by ExoPlayer. + *

* - * @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 the service ID from which the streams' list comes from + * @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 + && (stream.getDeliveryMethod() != DeliveryMethod.HLS + || stream.getFormat() != MediaFormat.OPUS) + && (serviceId != youtubeServiceId + || stream.getItagItem() == null + || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); } /** @@ -186,6 +247,127 @@ public static List getSortedStreamVideosList( videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + /** + * Get a sorted list containing a set of default resolution info + * and additional resolution info if showHigherResolutions is true. + * + * @param resources the resources to get the resolutions from + * @param defaultResolutionKey the settings key of the default resolution + * @param additionalResolutionKey the settings key of the additional resolutions + * @param showHigherResolutions if higher resolutions should be included in the sorted list + * @return a sorted list containing the default and maybe additional resolutions + */ + public static List getSortedResolutionList( + final Resources resources, + final int defaultResolutionKey, + final int additionalResolutionKey, + final boolean showHigherResolutions) { + final List resolutions = new ArrayList<>(Arrays.asList( + resources.getStringArray(defaultResolutionKey))); + if (!showHigherResolutions) { + return resolutions; + } + final List additionalResolutions = Arrays.asList( + resources.getStringArray(additionalResolutionKey)); + // keep "best resolution" at the top + resolutions.addAll(1, additionalResolutions); + return resolutions; + } + + public static boolean isHighResolutionSelected(final String selectedResolution, + final int additionalResolutionKey, + final Resources resources) { + return Arrays.asList(resources.getStringArray( + additionalResolutionKey)) + .contains(selectedResolution); + } + + /** + * 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 + || (stream.getDeliveryMethod() == DeliveryMethod.HLS + && stream.getFormat() == MediaFormat.OPUS)) { + 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 +381,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 +392,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 +482,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 +533,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); } @@ -513,6 +645,7 @@ private static int getDefaultResolutionWithDefaultFormat(@NonNull final Context context.getString(R.string.best_resolution_key), defaultFormat, videoStreams); } + @Nullable private static MediaFormat getDefaultFormat(@NonNull final Context context, @StringRes final int defaultFormatKey, @StringRes final int defaultFormatValueKey) { @@ -521,18 +654,14 @@ private static MediaFormat getDefaultFormat(@NonNull final Context context, final String defaultFormat = context.getString(defaultFormatValueKey); final String defaultFormatString = preferences.getString( - context.getString(defaultFormatKey), defaultFormat); - - MediaFormat defaultMediaFormat = getMediaFormatFromKey(context, defaultFormatString); - if (defaultMediaFormat == null) { - preferences.edit().putString(context.getString(defaultFormatKey), defaultFormat) - .apply(); - defaultMediaFormat = getMediaFormatFromKey(context, defaultFormat); - } + context.getString(defaultFormatKey), + defaultFormat + ); - return defaultMediaFormat; + return getMediaFormatFromKey(context, defaultFormatString); } + @Nullable private static MediaFormat getMediaFormatFromKey(@NonNull final Context context, @NonNull final String formatKey) { MediaFormat format = null; @@ -566,7 +695,7 @@ private static int compareVideoStreamResolution(@NonNull final String r1, } } - private static boolean isLimitingDataUsage(final Context context) { + static boolean isLimitingDataUsage(@NonNull final Context context) { return getResolutionLimit(context) != null; } @@ -604,4 +733,150 @@ 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 preferred 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 preferred 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 preferred 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 preferred 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, Comparator.nullsLast( + Comparator.naturalOrder())); + } } 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..8f8ba596f06 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.MainActivity.DEBUG; + import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; @@ -8,9 +10,11 @@ import android.icu.text.CompactDecimalFormat; import android.os.Build; import android.text.TextUtils; +import android.text.format.DateUtils; 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 +25,9 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.localization.DateWrapper; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import java.math.BigDecimal; import java.math.RoundingMode; @@ -79,7 +86,7 @@ public static org.schabi.newpipe.extractor.localization.Localization getPreferre .fromLocale(getPreferredLocale(context)); } - public static ContentCountry getPreferredContentCountry(final Context context) { + public static ContentCountry getPreferredContentCountry(@NonNull final Context context) { final String contentCountry = PreferenceManager.getDefaultSharedPreferences(context) .getString(context.getString(R.string.content_country_key), context.getString(R.string.default_localization_key)); @@ -89,41 +96,43 @@ public static ContentCountry getPreferredContentCountry(final Context context) { return new ContentCountry(contentCountry); } - public static Locale getPreferredLocale(final Context context) { + public static Locale getPreferredLocale(@NonNull final Context context) { return getLocaleFromPrefs(context, R.string.content_language_key); } - public static Locale getAppLocale(final Context context) { + public static Locale getAppLocale(@NonNull final Context context) { return getLocaleFromPrefs(context, R.string.app_language_key); } - public static String localizeNumber(final Context context, final long number) { + public static String localizeNumber(@NonNull final Context context, final long number) { return localizeNumber(context, (double) number); } - public static String localizeNumber(final Context context, final double number) { + public static String localizeNumber(@NonNull final Context context, final double number) { final NumberFormat nf = NumberFormat.getInstance(getAppLocale(context)); return nf.format(number); } - public static String formatDate(final OffsetDateTime offsetDateTime, final Context context) { + public static String formatDate(@NonNull final Context context, + @NonNull final OffsetDateTime offsetDateTime) { return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(getAppLocale(context)).format(offsetDateTime .atZoneSameInstant(ZoneId.systemDefault())); } @SuppressLint("StringFormatInvalid") - public static String localizeUploadDate(final Context context, - final OffsetDateTime offsetDateTime) { - return context.getString(R.string.upload_date_text, formatDate(offsetDateTime, context)); + public static String localizeUploadDate(@NonNull final Context context, + @NonNull final OffsetDateTime offsetDateTime) { + return context.getString(R.string.upload_date_text, formatDate(context, offsetDateTime)); } - public static String localizeViewCount(final Context context, final long viewCount) { + public static String localizeViewCount(@NonNull final Context context, final long viewCount) { return getQuantity(context, R.plurals.views, R.string.no_views, viewCount, localizeNumber(context, viewCount)); } - public static String localizeStreamCount(final Context context, final long streamCount) { + public static String localizeStreamCount(@NonNull final Context context, + final long streamCount) { switch ((int) streamCount) { case (int) ListExtractor.ITEM_COUNT_UNKNOWN: return ""; @@ -137,7 +146,8 @@ public static String localizeStreamCount(final Context context, final long strea } } - public static String localizeStreamCountMini(final Context context, final long streamCount) { + public static String localizeStreamCountMini(@NonNull final Context context, + final long streamCount) { switch ((int) streamCount) { case (int) ListExtractor.ITEM_COUNT_UNKNOWN: return ""; @@ -150,12 +160,13 @@ public static String localizeStreamCountMini(final Context context, final long s } } - public static String localizeWatchingCount(final Context context, final long watchingCount) { + public static String localizeWatchingCount(@NonNull final Context context, + final long watchingCount) { return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, localizeNumber(context, watchingCount)); } - public static String shortCount(final Context context, final long count) { + public static String shortCount(@NonNull final Context context, final long count) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return CompactDecimalFormat.getInstance(getAppLocale(context), CompactDecimalFormat.CompactStyle.SHORT).format(count); @@ -176,55 +187,83 @@ public static String shortCount(final Context context, final long count) { } } - public static String listeningCount(final Context context, final long listeningCount) { + public static String listeningCount(@NonNull final Context context, final long listeningCount) { return getQuantity(context, R.plurals.listening, R.string.no_one_listening, listeningCount, shortCount(context, listeningCount)); } - public static String shortWatchingCount(final Context context, final long watchingCount) { + public static String shortWatchingCount(@NonNull final Context context, + final long watchingCount) { return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, shortCount(context, watchingCount)); } - public static String shortViewCount(final Context context, final long viewCount) { + public static String shortViewCount(@NonNull final Context context, final long viewCount) { return getQuantity(context, R.plurals.views, R.string.no_views, viewCount, shortCount(context, viewCount)); } - public static String shortSubscriberCount(final Context context, final long subscriberCount) { + public static String shortSubscriberCount(@NonNull final Context context, + final long subscriberCount) { return getQuantity(context, R.plurals.subscribers, R.string.no_subscribers, subscriberCount, shortCount(context, subscriberCount)); } - public static String downloadCount(final Context context, final int downloadCount) { + public static String downloadCount(@NonNull final Context context, final int downloadCount) { return getQuantity(context, R.plurals.download_finished_notification, 0, downloadCount, shortCount(context, downloadCount)); } - public static String deletedDownloadCount(final Context context, final int deletedCount) { + public static String deletedDownloadCount(@NonNull final Context context, + final int deletedCount) { return getQuantity(context, R.plurals.deleted_downloads_toast, 0, deletedCount, shortCount(context, deletedCount)); } - public static String getDurationString(final long duration) { - final String output; - - final long days = duration / (24 * 60 * 60L); /* greater than a day */ - final long hours = duration % (24 * 60 * 60L) / (60 * 60L); /* greater than an hour */ - final long minutes = duration % (24 * 60 * 60L) % (60 * 60L) / 60L; - final long seconds = duration % 60L; - - if (duration < 0) { - output = "0:00"; - } else if (days > 0) { - //handle days - output = String.format(Locale.US, "%d:%02d:%02d:%02d", days, hours, minutes, seconds); - } else if (hours > 0) { - output = String.format(Locale.US, "%d:%02d:%02d", hours, minutes, seconds); + public static String replyCount(@NonNull final Context context, final int replyCount) { + return getQuantity(context, R.plurals.replies, 0, replyCount, + String.valueOf(replyCount)); + } + + /** + * @param context the Android context + * @param likeCount the like count, possibly negative if unknown + * @return if {@code likeCount} is smaller than {@code 0}, the string {@code "-"}, otherwise + * the result of calling {@link #shortCount(Context, long)} on the like count + */ + public static String likeCount(@NonNull final Context context, final int likeCount) { + if (likeCount < 0) { + return "-"; } else { - output = String.format(Locale.US, "%d:%02d", minutes, seconds); + return shortCount(context, likeCount); } - return output; + } + + /** + * Get a readable text for a duration in the format {@code hours:minutes:seconds}. + * + * @param duration the duration in seconds + * @return a formatted duration String or {@code 00:00} if the duration is zero. + */ + public static String getDurationString(final long duration) { + return DateUtils.formatElapsedTime(Math.max(duration, 0)); + } + + /** + * Get a readable text for a duration in the format {@code hours:minutes:seconds+}. If the given + * duration is incomplete, a plus is appended to the duration string. + * + * @param duration the duration in seconds + * @param isDurationComplete whether the given duration is complete or whether info is missing + * @param showDurationPrefix whether the duration-prefix shall be shown + * @return a formatted duration String or {@code 00:00} if the duration is zero. + */ + public static String getDurationString(final long duration, final boolean isDurationComplete, + final boolean showDurationPrefix) { + final String output = getDurationString(duration); + final String durationPrefix = showDurationPrefix ? "⏱ " : ""; + final String durationPostfix = isDurationComplete ? "" : "+"; + return durationPrefix + output + durationPostfix; } /** @@ -238,7 +277,8 @@ public static String getDurationString(final long duration) { * @return duration in a human readable string. */ @NonNull - public static String localizeDuration(final Context context, final int durationInSecs) { + public static String localizeDuration(@NonNull final Context context, + final int durationInSecs) { if (durationInSecs < 0) { throw new IllegalArgumentException("duration can not be negative"); } @@ -261,24 +301,91 @@ 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(@NonNull 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()); + return context.getString(R.string.audio_track_name, name, trackType); + } + return name; + } + + @NonNull + private static String audioTrackType(@NonNull final Context context, + @NonNull final AudioTrackType trackType) { + return switch (trackType) { + case ORIGINAL -> context.getString(R.string.audio_track_type_original); + case DUBBED -> context.getString(R.string.audio_track_type_dubbed); + case DESCRIPTIVE -> context.getString(R.string.audio_track_type_descriptive); + case SECONDARY -> context.getString(R.string.audio_track_type_secondary); + }; + } + /*////////////////////////////////////////////////////////////////////////// // Pretty Time //////////////////////////////////////////////////////////////////////////*/ - public static void initPrettyTime(final PrettyTime time) { + public static void initPrettyTime(@NonNull final PrettyTime time) { prettyTime = time; // Do not use decades as YouTube doesn't either. prettyTime.removeUnit(Decade.class); } - public static PrettyTime resolvePrettyTime(final Context context) { + public static PrettyTime resolvePrettyTime(@NonNull final Context context) { return new PrettyTime(getAppLocale(context)); } - public static String relativeTime(final OffsetDateTime offsetDateTime) { + public static String relativeTime(@NonNull final OffsetDateTime offsetDateTime) { return prettyTime.formatUnrounded(offsetDateTime); } + /** + * @param context the Android context; if {@code null} then even if in debug mode and the + * setting is enabled, {@code textual} will not be shown next to {@code parsed} + * @param parsed the textual date or time ago parsed by NewPipeExtractor, or {@code null} if + * the extractor could not parse it + * @param textual the original textual date or time ago string as provided by services + * @return {@link #relativeTime(OffsetDateTime)} is used if {@code parsed != null}, otherwise + * {@code textual} is returned. If in debug mode, {@code context != null}, + * {@code parsed != null} and the relevant setting is enabled, {@code textual} will + * be appended to the returned string for debugging purposes. + */ + public static String relativeTimeOrTextual(@Nullable final Context context, + @Nullable final DateWrapper parsed, + final String textual) { + if (parsed == null) { + return textual; + } else if (DEBUG && context != null && PreferenceManager + .getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.show_original_time_ago_key), false)) { + return relativeTime(parsed.offsetDateTime()) + " (" + textual + ")"; + } else { + return relativeTime(parsed.offsetDateTime()); + } + } + public static void assureCorrectAppLanguage(final Context c) { final Resources res = c.getResources(); final DisplayMetrics dm = res.getDisplayMetrics(); @@ -287,7 +394,8 @@ public static void assureCorrectAppLanguage(final Context c) { res.updateConfiguration(conf, dm); } - private static Locale getLocaleFromPrefs(final Context context, @StringRes final int prefKey) { + private static Locale getLocaleFromPrefs(@NonNull final Context context, + @StringRes final int prefKey) { final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); final String defaultKey = context.getString(R.string.default_localization_key); final String languageCode = sp.getString(context.getString(prefKey), defaultKey); @@ -303,8 +411,10 @@ private static double round(final double value) { return new BigDecimal(value).setScale(1, RoundingMode.HALF_UP).doubleValue(); } - private static String getQuantity(final Context context, @PluralsRes final int pluralId, - @StringRes final int zeroCaseStringId, final long count, + private static String getQuantity(@NonNull final Context context, + @PluralsRes final int pluralId, + @StringRes final int zeroCaseStringId, + final long count, final String formattedCount) { if (count == 0) { return context.getString(zeroCaseStringId); 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 483f5067ae1..5dee32371b5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.util; -import static org.schabi.newpipe.util.external_communication.ShareUtils.installApp; +import static android.text.TextUtils.isEmpty; +import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import android.annotation.SuppressLint; import android.app.Activity; @@ -17,6 +18,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -29,8 +31,10 @@ import org.schabi.newpipe.about.AboutActivity; import org.schabi.newpipe.database.feed.model.FeedGroupEntity; import org.schabi.newpipe.download.DownloadActivity; +import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.DeliveryMethod; @@ -41,6 +45,7 @@ import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.fragments.list.comments.CommentRepliesFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; @@ -50,9 +55,9 @@ import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.local.subscription.SubscriptionFragment; import org.schabi.newpipe.local.subscription.SubscriptionsImportFragment; -import org.schabi.newpipe.player.PlayerService; import org.schabi.newpipe.player.PlayQueueActivity; import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.PlayerService; import org.schabi.newpipe.player.PlayerType; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.helper.PlayerHolder; @@ -63,8 +68,6 @@ import java.util.List; -import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; - public final class NavigationHelper { public static final String MAIN_FRAGMENT_TAG = "main_fragment_tag"; public static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag"; @@ -156,8 +159,7 @@ public static void playOnMainPlayer(final Context context, public static void playOnPopupPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) { - if (!PermissionHelper.isPopupEnabled(context)) { - PermissionHelper.showPopupEnablementToast(context); + if (!PermissionHelper.isPopupEnabledElseAsk(context)) { return; } @@ -183,8 +185,7 @@ public static void playOnBackgroundPlayer(final Context context, public static void enqueueOnPlayer(final Context context, final PlayQueue queue, final PlayerType playerType) { - if ((playerType == PlayerType.POPUP) && !PermissionHelper.isPopupEnabled(context)) { - PermissionHelper.showPopupEnablementToast(context); + if (playerType == PlayerType.POPUP && !PermissionHelper.isPopupEnabledElseAsk(context)) { return; } @@ -325,17 +326,15 @@ public static void playOnExternalPlayer(@NonNull final Context context, public static void resolveActivityOrAskToInstall(@NonNull final Context context, @NonNull final Intent intent) { - if (intent.resolveActivity(context.getPackageManager()) != null) { - ShareUtils.openIntentInApp(context, intent, false); - } else { + if (!ShareUtils.tryOpenIntentInApp(context, intent)) { if (context instanceof Activity) { new AlertDialog.Builder(context) .setMessage(R.string.no_player_found) - .setPositiveButton(R.string.install, - (dialog, which) -> ShareUtils.openUrlInBrowser(context, - context.getString(R.string.fdroid_vlc_url), false)) - .setNegativeButton(R.string.cancel, (dialog, which) - -> Log.i("NavigationHelper", "You unlocked a secret unicorn.")) + .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.")) .show(); } else { Toast.makeText(context, R.string.no_player_found_toast, Toast.LENGTH_LONG).show(); @@ -482,6 +481,35 @@ public static void openChannelFragment(@NonNull final Fragment fragment, item.getServiceId(), uploaderUrl, item.getUploaderName()); } + /** + * Opens the comment author channel fragment, if the {@link CommentsInfoItem#getUploaderUrl()} + * of {@code comment} is non-null. Shows a UI-error snackbar if something goes wrong. + * + * @param activity the activity with the fragment manager and in which to show the snackbar + * @param comment the comment whose uploader/author will be opened + */ + public static void openCommentAuthorIfPresent(@NonNull final FragmentActivity activity, + @NonNull final CommentsInfoItem comment) { + if (isEmpty(comment.getUploaderUrl())) { + return; + } + try { + openChannelFragment(activity.getSupportFragmentManager(), comment.getServiceId(), + comment.getUploaderUrl(), comment.getUploaderName()); + } catch (final Exception e) { + ErrorUtil.showUiErrorSnackbar(activity, "Opening channel fragment", e); + } + } + + public static void openCommentRepliesFragment(@NonNull final FragmentActivity activity, + @NonNull final CommentsInfoItem comment) { + defaultTransaction(activity.getSupportFragmentManager()) + .replace(R.id.fragment_holder, new CommentRepliesFragment(comment), + CommentRepliesFragment.TAG) + .addToBackStack(CommentRepliesFragment.TAG) + .commit(); + } + public static void openPlaylistFragment(final FragmentManager fragmentManager, final int serviceId, final String url, @NonNull final String name) { @@ -569,11 +597,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); @@ -686,32 +711,13 @@ public static Intent getChannelIntent(final Context context, return getOpenIntent(context, url, serviceId, StreamingService.LinkType.CHANNEL); } - /** - * Start an activity to install Kore. - * - * @param context the context - */ - public static void installKore(final Context context) { - installApp(context, context.getString(R.string.kore_package)); - } - - /** - * Start Kore app to show a video on Kodi. - *

- * For a list of supported urls see the - * - * Kore source code - * . - * - * @param context the context to use - * @param videoURL the url to the video - */ - public static void playWithKore(final Context context, final Uri videoURL) { - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setPackage(context.getString(R.string.kore_package)); - intent.setData(videoURL); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); + 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); } /** 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/PermissionHelper.java b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java index f47494770af..55193599e6f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java @@ -9,8 +9,6 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; -import android.view.Gravity; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.RequiresApi; @@ -128,18 +126,21 @@ public static boolean checkSystemAlertWindowPermission(final Context context) { } } - public static boolean isPopupEnabled(final Context context) { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.M - || checkSystemAlertWindowPermission(context); - } - - public static void showPopupEnablementToast(final Context context) { - final Toast toast = - Toast.makeText(context, R.string.msg_popup_permission, Toast.LENGTH_LONG); - final TextView messageView = toast.getView().findViewById(android.R.id.message); - if (messageView != null) { - messageView.setGravity(Gravity.CENTER); + /** + * Determines whether the popup is enabled, and if it is not, starts the system activity to + * request the permission with {@link #checkSystemAlertWindowPermission(Context)} and shows a + * toast to the user explaining why the permission is needed. + * + * @param context the Android context + * @return whether the popup is enabled + */ + public static boolean isPopupEnabledElseAsk(final Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || checkSystemAlertWindowPermission(context)) { + return true; + } else { + Toast.makeText(context, R.string.msg_popup_permission, Toast.LENGTH_LONG).show(); + return false; } - toast.show(); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java new file mode 100644 index 00000000000..9727c808300 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java @@ -0,0 +1,90 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.PreferenceManager; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.PlaylistControlBinding; +import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; +import org.schabi.newpipe.player.PlayerType; + +/** + * Utility class for play buttons and their respective click listeners. + */ +public final class PlayButtonHelper { + + private PlayButtonHelper() { + // utility class + } + + /** + * Initialize {@link android.view.View.OnClickListener OnClickListener} + * and {@link android.view.View.OnLongClickListener OnLongClickListener} for playlist control + * buttons defined in {@link R.layout#playlist_control}. + * + * @param activity The activity to use for the {@link android.widget.Toast Toast}. + * @param playlistControlBinding The binding of the + * {@link R.layout#playlist_control playlist control layout}. + * @param fragment The fragment to get the play queue from. + */ + public static void initPlaylistControlClickListener( + @NonNull final AppCompatActivity activity, + @NonNull final PlaylistControlBinding playlistControlBinding, + @NonNull final PlaylistControlViewHolder fragment) { + // click listener + playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener(view -> { + NavigationHelper.playOnMainPlayer(activity, fragment.getPlayQueue()); + showHoldToAppendToastIfNeeded(activity); + }); + playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener(view -> { + NavigationHelper.playOnPopupPlayer(activity, fragment.getPlayQueue(), false); + showHoldToAppendToastIfNeeded(activity); + }); + playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener(view -> { + NavigationHelper.playOnBackgroundPlayer(activity, fragment.getPlayQueue(), false); + showHoldToAppendToastIfNeeded(activity); + }); + + // long click listener + playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> { + NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.POPUP); + return true; + }); + playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener(view -> { + NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.AUDIO); + return true; + }); + } + + /** + * Show the "hold to append" toast if the corresponding preference is enabled. + * + * @param context The context to show the toast. + */ + private static void showHoldToAppendToastIfNeeded(@NonNull final Context context) { + if (shouldShowHoldToAppendTip(context)) { + Toast.makeText(context, R.string.hold_to_append, Toast.LENGTH_SHORT).show(); + } + + } + + /** + * Check if the "hold to append" toast should be shown. + * + *

+ * The tip is shown if the corresponding preference is enabled. + * This is the default behaviour. + *

+ * + * @param context The context to get the preference. + * @return {@code true} if the tip should be shown, {@code false} otherwise. + */ + public static boolean shouldShowHoldToAppendTip(@NonNull final Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.show_hold_to_append_key), true); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java b/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java deleted file mode 100644 index f96bb0d549f..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.schabi.newpipe.util; - -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.ListInfo; -import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; -import org.schabi.newpipe.extractor.stream.StreamInfo; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class RelatedItemInfo extends ListInfo { - public RelatedItemInfo(final int serviceId, final ListLinkHandler listUrlIdHandler, - final String name) { - super(serviceId, listUrlIdHandler, name); - } - - public static RelatedItemInfo getInfo(final StreamInfo info) { - final ListLinkHandler handler = new ListLinkHandler( - info.getOriginalUrl(), info.getUrl(), info.getId(), Collections.emptyList(), null); - final RelatedItemInfo relatedItemInfo = new RelatedItemInfo( - info.getServiceId(), handler, info.getName()); - final List relatedItems = new ArrayList<>(info.getRelatedItems()); - relatedItemInfo.setRelatedItems(relatedItems); - return relatedItemInfo; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt index 5a54b29d224..3ea19fa4f8b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -1,97 +1,39 @@ package org.schabi.newpipe.util import android.content.pm.PackageManager -import android.content.pm.Signature import androidx.core.content.pm.PackageInfoCompat import org.schabi.newpipe.App import org.schabi.newpipe.error.ErrorInfo import org.schabi.newpipe.error.ErrorUtil.Companion.createNotification import org.schabi.newpipe.error.UserAction -import java.security.MessageDigest -import java.security.NoSuchAlgorithmException -import java.security.cert.CertificateEncodingException -import java.security.cert.CertificateException -import java.security.cert.CertificateFactory -import java.security.cert.X509Certificate import java.time.Instant import java.time.ZonedDateTime import java.time.format.DateTimeFormatter object ReleaseVersionUtil { // Public key of the certificate that is used in NewPipe release versions - private const val RELEASE_CERT_PUBLIC_KEY_SHA1 = - "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15" - - @JvmStatic - fun isReleaseApk(): Boolean { - return certificateSHA1Fingerprint == RELEASE_CERT_PUBLIC_KEY_SHA1 - } - - /** - * Method to get the APK's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133. - * - * @return String with the APK's SHA1 fingerprint in hexadecimal - */ - private val certificateSHA1Fingerprint: String - get() { - val app = App.getApp() - val signatures: List = try { - PackageInfoCompat.getSignatures(app.packageManager, app.packageName) - } catch (e: PackageManager.NameNotFoundException) { - showRequestError(app, e, "Could not find package info") - return "" - } - if (signatures.isEmpty()) { - return "" - } - val x509cert = try { - val cf = CertificateFactory.getInstance("X509") - cf.generateCertificate(signatures[0].toByteArray().inputStream()) as X509Certificate - } catch (e: CertificateException) { - showRequestError(app, e, "Certificate error") - return "" - } - - return try { - val md = MessageDigest.getInstance("SHA1") - val publicKey = md.digest(x509cert.encoded) - byte2HexFormatted(publicKey) - } catch (e: NoSuchAlgorithmException) { - showRequestError(app, e, "Could not retrieve SHA1 key") - "" - } catch (e: CertificateEncodingException) { - showRequestError(app, e, "Could not retrieve SHA1 key") - "" - } - } - - private fun byte2HexFormatted(arr: ByteArray): String { - val str = StringBuilder(arr.size * 2) - for (i in arr.indices) { - var h = Integer.toHexString(arr[i].toInt()) - val l = h.length - if (l == 1) { - h = "0$h" - } - if (l > 2) { - h = h.substring(l - 2, l) - } - str.append(h.uppercase()) - if (i < arr.size - 1) { - str.append(':') - } - } - return str.toString() - } - - private fun showRequestError(app: App, e: Exception, request: String) { - createNotification( - app, ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, request) + private const val RELEASE_CERT_PUBLIC_KEY_SHA256 = + "cb84069bd68116bafae5ee4ee5b08a567aa6d898404e7cb12f9e756df5cf5cab" + + @OptIn(ExperimentalStdlibApi::class) + val isReleaseApk by lazy { + @Suppress("NewApi") + val certificates = mapOf( + RELEASE_CERT_PUBLIC_KEY_SHA256.hexToByteArray() to PackageManager.CERT_INPUT_SHA256 ) + val app = App.getApp() + try { + PackageInfoCompat.hasSignatures(app.packageManager, app.packageName, certificates, false) + } catch (e: PackageManager.NameNotFoundException) { + createNotification( + app, ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info") + ) + false + } } fun isLastUpdateCheckExpired(expiry: Long): Boolean { - return Instant.ofEpochSecond(expiry).isBefore(Instant.now()) + return Instant.ofEpochSecond(expiry) < Instant.now() } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java b/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java index e7fd2d4a4bc..69dc697fe89 100644 --- a/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -7,15 +9,15 @@ import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.VideoStream; -import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; +import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper; import java.util.List; public class SecondaryStreamHelper { private final int position; - private final StreamSizeWrapper streams; + private final StreamInfoWrapper streams; - public SecondaryStreamHelper(@NonNull final StreamSizeWrapper streams, + public SecondaryStreamHelper(@NonNull final StreamInfoWrapper streams, final T selectedStream) { this.streams = streams; this.position = streams.getStreamsList().indexOf(selectedStream); @@ -25,49 +27,42 @@ public SecondaryStreamHelper(@NonNull final StreamSizeWrapper streams, } /** - * Find the correct audio stream for the desired video stream. + * Finds an audio stream compatible with the provided video-only stream, so that the two streams + * can be combined in a single file by the downloader. If there are multiple available audio + * streams, chooses either the highest or the lowest quality one based on + * {@link ListHelper#isLimitingDataUsage(Context)}. * + * @param context Android context * @param audioStreams list of audio streams - * @param videoStream desired video ONLY stream - * @return selected audio stream or null if a candidate was not found + * @param videoStream desired video-ONLY stream + * @return the selected audio stream or null if a candidate was not found */ @Nullable - public static AudioStream getAudioStreamFor(@NonNull final List audioStreams, + public static AudioStream getAudioStreamFor(@NonNull final Context context, + @NonNull final List audioStreams, @NonNull final VideoStream videoStream) { final MediaFormat mediaFormat = videoStream.getFormat(); - if (mediaFormat == null) { - return null; - } - switch (mediaFormat) { - case WEBM: - case MPEG_4:// ¿is mpeg-4 DASH? - break; - default: - return null; - } + if (mediaFormat == MediaFormat.WEBM) { + return audioStreams + .stream() + .filter(audioStream -> audioStream.getFormat() == MediaFormat.WEBMA + || audioStream.getFormat() == MediaFormat.WEBMA_OPUS) + .max(ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, + ListHelper.isLimitingDataUsage(context))) + .orElse(null); - final boolean m4v = (mediaFormat == MediaFormat.MPEG_4); + } else if (mediaFormat == MediaFormat.MPEG_4) { + return audioStreams + .stream() + .filter(audioStream -> audioStream.getFormat() == MediaFormat.M4A) + .max(ListHelper.getAudioFormatComparator(MediaFormat.M4A, + ListHelper.isLimitingDataUsage(context))) + .orElse(null); - for (final AudioStream audio : audioStreams) { - if (audio.getFormat() == (m4v ? MediaFormat.M4A : MediaFormat.WEBMA)) { - return audio; - } - } - - if (m4v) { + } else { return null; } - - // retry, but this time in reverse order - for (int i = audioStreams.size() - 1; i >= 0; i--) { - final AudioStream audio = audioStreams.get(i); - if (audio.getFormat() == MediaFormat.WEBMA_OPUS) { - return audio; - } - } - - return null; } public T getStream() { diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java index acd019ba077..c712157b35b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java @@ -144,6 +144,19 @@ public static String getNameOfServiceById(final int serviceId) { .orElse(""); } + /** + * @param serviceId the id of the service + * @return the service corresponding to the provided id + * @throws java.util.NoSuchElementException if there is no service with the provided id + */ + @NonNull + public static StreamingService getServiceById(final int serviceId) { + return ServiceList.all().stream() + .filter(s -> s.getServiceId() == serviceId) + .findFirst() + .orElseThrow(); + } + public static void setSelectedServiceId(final Context context, final int serviceId) { String serviceName; try { diff --git a/app/src/main/java/org/schabi/newpipe/util/StateSaver.java b/app/src/main/java/org/schabi/newpipe/util/StateSaver.java index 3c901aacb51..61fdb602f28 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StateSaver.java +++ b/app/src/main/java/org/schabi/newpipe/util/StateSaver.java @@ -27,6 +27,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.os.BundleCompat; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.MainActivity; @@ -82,7 +83,8 @@ public static SavedState tryToRestore(final Bundle outState, final WriteRead wri return null; } - final SavedState savedState = outState.getParcelable(KEY_SAVED_STATE); + final SavedState savedState = BundleCompat.getParcelable( + outState, KEY_SAVED_STATE, SavedState.class); if (savedState == null) { return null; } @@ -309,7 +311,7 @@ public static void clearStateFiles() { } /** - * Used for describe how to save/read the objects. + * Used for describing how to save/read the objects. *

* Queue was chosen by its FIFO property. */ 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..2eeb14b1b41 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; + import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -11,21 +13,25 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import androidx.collection.SparseArrayCompat; import org.schabi.newpipe.DownloaderImpl; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.downloader.Response; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.SubtitlesStream; import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.extractor.utils.Utils; import java.io.Serializable; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; +import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; @@ -41,7 +47,7 @@ */ public class StreamItemAdapter extends BaseAdapter { @NonNull - private final StreamSizeWrapper streamsWrapper; + private final StreamInfoWrapper streamsWrapper; @NonNull private final SparseArrayCompat> secondaryStreams; @@ -53,7 +59,7 @@ public class StreamItemAdapter extends BaseA private final boolean hasAnyVideoOnlyStreamWithNoSecondaryStream; public StreamItemAdapter( - @NonNull final StreamSizeWrapper streamsWrapper, + @NonNull final StreamInfoWrapper streamsWrapper, @NonNull final SparseArrayCompat> secondaryStreams ) { this.streamsWrapper = streamsWrapper; @@ -63,7 +69,7 @@ public StreamItemAdapter( checkHasAnyVideoOnlyStreamWithNoSecondaryStream(); } - public StreamItemAdapter(final StreamSizeWrapper streamsWrapper) { + public StreamItemAdapter(final StreamInfoWrapper streamsWrapper) { this(streamsWrapper, new SparseArrayCompat<>(0)); } @@ -121,7 +127,7 @@ private View getCustomView(final int position, final TextView sizeView = convertView.findViewById(R.id.stream_size); final T stream = getItem(position); - final MediaFormat mediaFormat = stream.getFormat(); + final MediaFormat mediaFormat = streamsWrapper.getFormat(position); int woSoundIconVisibility = View.GONE; String qualityString; @@ -147,8 +153,6 @@ private View getCustomView(final int position, final AudioStream audioStream = ((AudioStream) stream); if (audioStream.getAverageBitrate() > 0) { qualityString = audioStream.getAverageBitrate() + "kbps"; - } else if (mediaFormat != null) { - qualityString = mediaFormat.getName(); } else { qualityString = context.getString(R.string.unknown_quality); } @@ -221,44 +225,58 @@ private boolean checkHasAnyVideoOnlyStreamWithNoSecondaryStream() { * * @param the stream type's class extending {@link Stream} */ - public static class StreamSizeWrapper implements Serializable { - private static final StreamSizeWrapper EMPTY = - new StreamSizeWrapper<>(Collections.emptyList(), null); + public static class StreamInfoWrapper implements Serializable { + private static final StreamInfoWrapper EMPTY = + new StreamInfoWrapper<>(Collections.emptyList(), null); + private static final int SIZE_UNSET = -2; + private final List streamsList; private final long[] streamSizes; + private final MediaFormat[] streamFormats; private final String unknownSize; - public StreamSizeWrapper(@NonNull final List streamList, + public StreamInfoWrapper(@NonNull final List streamList, @Nullable final Context context) { this.streamsList = streamList; this.streamSizes = new long[streamsList.size()]; this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content); - - Arrays.fill(streamSizes, -2); + this.streamFormats = new MediaFormat[streamsList.size()]; + resetInfo(); } /** - * Helper method to fetch the sizes of all the streams in a wrapper. + * Helper method to fetch the sizes and missing media formats + * of all the streams in a wrapper. * * @param the stream type's class extending {@link Stream} * @param streamsWrapper the wrapper * @return a {@link Single} that returns a boolean indicating if any elements were changed */ @NonNull - public static Single fetchSizeForWrapper( - final StreamSizeWrapper streamsWrapper) { + public static Single fetchMoreInfoForWrapper( + final StreamInfoWrapper streamsWrapper) { final Callable fetchAndSet = () -> { boolean hasChanged = false; for (final X stream : streamsWrapper.getStreamsList()) { - if (streamsWrapper.getSizeInBytes(stream) > -2) { + final boolean changeSize = streamsWrapper.getSizeInBytes(stream) <= SIZE_UNSET; + final boolean changeFormat = stream.getFormat() == null; + if (!changeSize && !changeFormat) { continue; } - - final long contentLength = DownloaderImpl.getInstance().getContentLength( - stream.getContent()); - streamsWrapper.setSize(stream, contentLength); - hasChanged = true; + final Response response = DownloaderImpl.getInstance() + .head(stream.getContent()); + if (changeSize) { + final String contentLength = response.getHeader("Content-Length"); + if (!isNullOrEmpty(contentLength)) { + streamsWrapper.setSize(stream, Long.parseLong(contentLength)); + hasChanged = true; + } + } + if (changeFormat) { + hasChanged = retrieveMediaFormat(stream, streamsWrapper, response) + || hasChanged; + } } return hasChanged; }; @@ -269,9 +287,149 @@ public static Single fetchSizeForWrapper( .onErrorReturnItem(true); } - public static StreamSizeWrapper empty() { + /** + * Try to retrieve the {@link MediaFormat} for a stream from the request headers. + * + * @param the stream type to get the {@link MediaFormat} for + * @param stream the stream to find the {@link MediaFormat} for + * @param streamsWrapper the wrapper to store the found {@link MediaFormat} in + * @param response the response of the head request for the given stream + * @return {@code true} if the media format could be retrieved; {@code false} otherwise + */ + @VisibleForTesting + public static boolean retrieveMediaFormat( + @NonNull final X stream, + @NonNull final StreamInfoWrapper streamsWrapper, + @NonNull final Response response) { + return retrieveMediaFormatFromFileTypeHeaders(stream, streamsWrapper, response) + || retrieveMediaFormatFromContentDispositionHeader( + stream, streamsWrapper, response) + || retrieveMediaFormatFromContentTypeHeader(stream, streamsWrapper, response); + } + + @VisibleForTesting + public static boolean retrieveMediaFormatFromFileTypeHeaders( + @NonNull final X stream, + @NonNull final StreamInfoWrapper streamsWrapper, + @NonNull final Response response) { + // try to use additional headers from CDNs or servers, + // e.g. x-amz-meta-file-type (e.g. for SoundCloud) + final List keys = response.responseHeaders().keySet().stream() + .filter(k -> k.endsWith("file-type")).collect(Collectors.toList()); + if (!keys.isEmpty()) { + for (final String key : keys) { + final String suffix = response.getHeader(key); + final MediaFormat format = MediaFormat.getFromSuffix(suffix); + if (format != null) { + streamsWrapper.setFormat(stream, format); + return true; + } + } + } + return false; + } + + /** + *

Retrieve a {@link MediaFormat} from a HTTP Content-Disposition header + * for a stream and store the info in a wrapper.

+ * @see + * + * mdn Web Docs for the HTTP Content-Disposition Header + * @param stream the stream to get the {@link MediaFormat} for + * @param streamsWrapper the wrapper to store the {@link MediaFormat} in + * @param response the response to get the Content-Disposition header from + * @return {@code true} if the {@link MediaFormat} could be retrieved from the response; + * otherwise {@code false} + * @param + */ + @VisibleForTesting + public static boolean retrieveMediaFormatFromContentDispositionHeader( + @NonNull final X stream, + @NonNull final StreamInfoWrapper streamsWrapper, + @NonNull final Response response) { + // parse the Content-Disposition header, + // see + // there can be two filename directives + String contentDisposition = response.getHeader("Content-Disposition"); + if (contentDisposition == null) { + return false; + } + try { + contentDisposition = Utils.decodeUrlUtf8(contentDisposition); + final String[] parts = contentDisposition.split(";"); + for (String part : parts) { + final String fileName; + part = part.trim(); + + // extract the filename + if (part.startsWith("filename=")) { + // remove directive and decode + fileName = Utils.decodeUrlUtf8(part.substring(9)); + } else if (part.startsWith("filename*=")) { + fileName = Utils.decodeUrlUtf8(part.substring(10)); + } else { + continue; + } + + // extract the file extension / suffix + final String[] p = fileName.split("\\."); + String suffix = p[p.length - 1]; + if (suffix.endsWith("\"") || suffix.endsWith("'")) { + // remove trailing quotes if present, end index is exclusive + suffix = suffix.substring(0, suffix.length() - 1); + } + + // get the corresponding media format + final MediaFormat format = MediaFormat.getFromSuffix(suffix); + if (format != null) { + streamsWrapper.setFormat(stream, format); + return true; + } + } + } catch (final Exception ignored) { + // fail silently + } + return false; + } + + @VisibleForTesting + public static boolean retrieveMediaFormatFromContentTypeHeader( + @NonNull final X stream, + @NonNull final StreamInfoWrapper streamsWrapper, + @NonNull final Response response) { + // try to get the format by content type + // some mime types are not unique for every format, those are omitted + final String contentTypeHeader = response.getHeader("Content-Type"); + if (contentTypeHeader == null) { + return false; + } + + @Nullable MediaFormat foundFormat = null; + for (final MediaFormat format : MediaFormat.getAllFromMimeType(contentTypeHeader)) { + if (foundFormat == null) { + foundFormat = format; + } else if (foundFormat.id != format.id) { + return false; + } + } + if (foundFormat != null) { + streamsWrapper.setFormat(stream, foundFormat); + return true; + } + return false; + } + + public void resetInfo() { + Arrays.fill(streamSizes, SIZE_UNSET); + for (int i = 0; i < streamsList.size(); i++) { + streamFormats[i] = streamsList.get(i) == null // test for invalid streams + ? null : streamsList.get(i).getFormat(); + } + } + + public static StreamInfoWrapper empty() { //noinspection unchecked - return (StreamSizeWrapper) EMPTY; + return (StreamInfoWrapper) EMPTY; } public List getStreamsList() { @@ -300,5 +458,13 @@ private String formatSize(final long size) { public void setSize(final T stream, final long sizeInBytes) { streamSizes[streamsList.indexOf(stream)] = sizeInBytes; } + + public MediaFormat getFormat(final int streamIndex) { + return streamFormats[streamIndex]; + } + + public void setFormat(final T stream, final MediaFormat format) { + streamFormats[streamsList.indexOf(stream)] = format; + } } } diff --git a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java index ea22e9368f5..ab74e0305cd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -41,6 +41,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.info_list.ItemViewMode; public final class ThemeHelper { private ThemeHelper() { @@ -332,7 +333,6 @@ public static void setDayNightMode(final Context context, final String selectedT } } - /** * Returns whether the grid layout or the list layout should be used. If the user set "auto" * mode in settings, decides based on screen orientation (landscape) and size. @@ -341,19 +341,8 @@ public static void setDayNightMode(final Context context, final String selectedT * @return true:use grid layout, false:use list layout */ public static boolean shouldUseGridLayout(final Context context) { - final String listMode = PreferenceManager.getDefaultSharedPreferences(context) - .getString(context.getString(R.string.list_view_mode_key), - context.getString(R.string.list_view_mode_value)); - - if (listMode.equals(context.getString(R.string.list_view_mode_list_key))) { - return false; - } else if (listMode.equals(context.getString(R.string.list_view_mode_grid_key))) { - return true; - } else /* listMode.equals("auto") */ { - final Configuration configuration = context.getResources().getConfiguration(); - return configuration.orientation == Configuration.ORIENTATION_LANDSCAPE - && configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE); - } + final ItemViewMode mode = getItemViewMode(context); + return mode == ItemViewMode.GRID; } /** @@ -367,6 +356,36 @@ public static int getGridSpanCountChannels(final Context context) { context.getResources().getDimensionPixelSize(R.dimen.channel_item_grid_min_width)); } + /** + * Returns item view mode. + * @param context to read preference and parse string + * @return Returns one of ItemViewMode + */ + public static ItemViewMode getItemViewMode(final Context context) { + final String listMode = PreferenceManager.getDefaultSharedPreferences(context) + .getString(context.getString(R.string.list_view_mode_key), + context.getString(R.string.list_view_mode_value)); + final ItemViewMode result; + if (listMode.equals(context.getString(R.string.list_view_mode_list_key))) { + result = ItemViewMode.LIST; + } else if (listMode.equals(context.getString(R.string.list_view_mode_grid_key))) { + result = ItemViewMode.GRID; + } else if (listMode.equals(context.getString(R.string.list_view_mode_card_key))) { + result = ItemViewMode.CARD; + } else { + // Auto mode - evaluate whether to use Grid based on screen real estate. + final Configuration configuration = context.getResources().getConfiguration(); + final boolean useGrid = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + && configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE); + if (useGrid) { + result = ItemViewMode.GRID; + } else { + result = ItemViewMode.LIST; + } + } + return result; + } + /** * Calculates the number of grid stream info items that can fit horizontally on the screen. The * width of a grid stream info item is obtained from the thumbnail width plus the right and left diff --git a/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java b/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java index bc08e6197fb..b2aebac426b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java @@ -1,18 +1,21 @@ package org.schabi.newpipe.util; import org.schabi.newpipe.streams.io.SharpInputStream; +import org.schabi.newpipe.streams.io.StoredFileHelper; import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; -import org.schabi.newpipe.streams.io.StoredFileHelper; - /** * Created by Christian Schabesberger on 28.01.18. * Copyright 2018 Christian Schabesberger @@ -34,73 +37,154 @@ */ public final class ZipHelper { - private ZipHelper() { } private static final int BUFFER_SIZE = 2048; + @FunctionalInterface + public interface InputStreamConsumer { + void acceptStream(InputStream inputStream) throws IOException; + } + + @FunctionalInterface + public interface OutputStreamConsumer { + void acceptStream(OutputStream outputStream) throws IOException; + } + + + private ZipHelper() { } + + /** - * This function helps to create zip files. - * Caution this will override the original file. + * This function helps to create zip files. Caution this will overwrite the original file. * - * @param outZip The ZipOutputStream where the data should be stored in - * @param file The path of the file that should be added to zip. - * @param name The path of the file inside the zip. - * @throws Exception + * @param outZip the ZipOutputStream where the data should be stored in + * @param nameInZip the path of the file inside the zip + * @param fileOnDisk the path of the file on the disk that should be added to zip */ - public static void addFileToZip(final ZipOutputStream outZip, final String file, - final String name) throws Exception { + public static void addFileToZip(final ZipOutputStream outZip, + final String nameInZip, + final String fileOnDisk) throws IOException { + try (FileInputStream fi = new FileInputStream(fileOnDisk)) { + addFileToZip(outZip, nameInZip, fi); + } + } + + /** + * This function helps to create zip files. Caution this will overwrite the original file. + * + * @param outZip the ZipOutputStream where the data should be stored in + * @param nameInZip the path of the file inside the zip + * @param streamConsumer will be called with an output stream that will go to the output file + */ + public static void addFileToZip(final ZipOutputStream outZip, + final String nameInZip, + final OutputStreamConsumer streamConsumer) throws IOException { + final byte[] bytes; + try (ByteArrayOutputStream byteOutput = new ByteArrayOutputStream()) { + streamConsumer.acceptStream(byteOutput); + bytes = byteOutput.toByteArray(); + } + + try (ByteArrayInputStream byteInput = new ByteArrayInputStream(bytes)) { + ZipHelper.addFileToZip(outZip, nameInZip, byteInput); + } + } + + /** + * This function helps to create zip files. Caution this will overwrite the original file. + * + * @param outZip the ZipOutputStream where the data should be stored in + * @param nameInZip the path of the file inside the zip + * @param inputStream the content to put inside the file + */ + public static void addFileToZip(final ZipOutputStream outZip, + final String nameInZip, + final InputStream inputStream) throws IOException { final byte[] data = new byte[BUFFER_SIZE]; - try (FileInputStream fi = new FileInputStream(file); - BufferedInputStream inputStream = new BufferedInputStream(fi, BUFFER_SIZE)) { - final ZipEntry entry = new ZipEntry(name); + try (BufferedInputStream bufferedInputStream = + new BufferedInputStream(inputStream, BUFFER_SIZE)) { + final ZipEntry entry = new ZipEntry(nameInZip); outZip.putNextEntry(entry); int count; - while ((count = inputStream.read(data, 0, BUFFER_SIZE)) != -1) { + while ((count = bufferedInputStream.read(data, 0, BUFFER_SIZE)) != -1) { outZip.write(data, 0, count); } } } + /** + * This will extract data from ZipInputStream. Caution this will overwrite the original file. + * + * @param zipFile the zip file to extract from + * @param nameInZip the path of the file inside the zip + * @param fileOnDisk the path of the file on the disk where the data should be extracted to + * @return will return true if the file was found within the zip file + */ + public static boolean extractFileFromZip(final StoredFileHelper zipFile, + final String nameInZip, + final String fileOnDisk) throws IOException { + return extractFileFromZip(zipFile, nameInZip, input -> { + // delete old file first + final File oldFile = new File(fileOnDisk); + if (oldFile.exists()) { + if (!oldFile.delete()) { + throw new IOException("Could not delete " + fileOnDisk); + } + } + + final byte[] data = new byte[BUFFER_SIZE]; + try (FileOutputStream outFile = new FileOutputStream(fileOnDisk)) { + int count; + while ((count = input.read(data)) != -1) { + outFile.write(data, 0, count); + } + } + }); + } + /** * This will extract data from ZipInputStream. - * Caution this will override the original file. * - * @param zipFile The zip file - * @param file The path of the file on the disk where the data should be extracted to. - * @param name The path of the file inside the zip. + * @param zipFile the zip file to extract from + * @param nameInZip the path of the file inside the zip + * @param streamConsumer will be called with the input stream from the file inside the zip * @return will return true if the file was found within the zip file - * @throws Exception */ - public static boolean extractFileFromZip(final StoredFileHelper zipFile, final String file, - final String name) throws Exception { + public static boolean extractFileFromZip(final StoredFileHelper zipFile, + final String nameInZip, + final InputStreamConsumer streamConsumer) + throws IOException { + try (ZipInputStream inZip = new ZipInputStream(new BufferedInputStream( + new SharpInputStream(zipFile.getStream())))) { + ZipEntry ze; + while ((ze = inZip.getNextEntry()) != null) { + if (ze.getName().equals(nameInZip)) { + streamConsumer.acceptStream(inZip); + return true; + } + } + + return false; + } + } + + /** + * @param zipFile the zip file + * @param fileInZip the filename to check + * @return whether the provided filename is in the zip; only the first level is checked + */ + public static boolean zipContainsFile(final StoredFileHelper zipFile, final String fileInZip) + throws Exception { try (ZipInputStream inZip = new ZipInputStream(new BufferedInputStream( new SharpInputStream(zipFile.getStream())))) { - final byte[] data = new byte[BUFFER_SIZE]; - boolean found = false; ZipEntry ze; while ((ze = inZip.getNextEntry()) != null) { - if (ze.getName().equals(name)) { - found = true; - // delete old file first - final File oldFile = new File(file); - if (oldFile.exists()) { - if (!oldFile.delete()) { - throw new Exception("Could not delete " + file); - } - } - - try (FileOutputStream outFile = new FileOutputStream(file)) { - int count = 0; - while ((count = inZip.read(data)) != -1) { - outFile.write(data, 0, count); - } - } - - inZip.closeEntry(); + if (ze.getName().equals(fileInZip)) { + return true; } } - return found; + return false; } } diff --git a/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java new file mode 100644 index 00000000000..acc515dd670 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java @@ -0,0 +1,15 @@ +package org.schabi.newpipe.util.debounce; + +import org.schabi.newpipe.error.ErrorInfo; + +public interface DebounceSavable { + + /** + * Execute operations to save the data.
+ * Must set {@link DebounceSaver#setIsModified(boolean)} false in this method manually + * after the data has been saved. + */ + void saveImmediate(); + + void showError(ErrorInfo errorInfo); +} diff --git a/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java new file mode 100644 index 00000000000..5bd5cdd55f4 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java @@ -0,0 +1,81 @@ +package org.schabi.newpipe.util.debounce; + +import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.UserAction; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.subjects.PublishSubject; + +public class DebounceSaver { + + private final long saveDebounceMillis; + + private final PublishSubject debouncedSaveSignal; + + private final DebounceSavable debounceSavable; + + // Has the object been modified + private final AtomicBoolean isModified; + + // Default 10 seconds + private static final long DEFAULT_SAVE_DEBOUNCE_MILLIS = 10000; + + + /** + * Creates a new {@code DebounceSaver}. + * + * @param saveDebounceMillis Save the object milliseconds later after the last change + * occurred. + * @param debounceSavable The object containing data to be saved. + */ + public DebounceSaver(final long saveDebounceMillis, final DebounceSavable debounceSavable) { + this.saveDebounceMillis = saveDebounceMillis; + debouncedSaveSignal = PublishSubject.create(); + this.debounceSavable = debounceSavable; + this.isModified = new AtomicBoolean(); + } + + /** + * Creates a new {@code DebounceSaver}. Save the object 10 seconds later after the last change + * occurred. + * + * @param debounceSavable The object containing data to be saved. + */ + public DebounceSaver(final DebounceSavable debounceSavable) { + this(DEFAULT_SAVE_DEBOUNCE_MILLIS, debounceSavable); + } + + public boolean getIsModified() { + return isModified.get(); + } + + public void setNoChangesToSave() { + isModified.set(false); + } + + public PublishSubject getDebouncedSaveSignal() { + return debouncedSaveSignal; + } + + public Disposable getDebouncedSaver() { + return debouncedSaveSignal + .debounce(saveDebounceMillis, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(ignored -> debounceSavable.saveImmediate(), throwable -> + debounceSavable.showError(new ErrorInfo(throwable, + UserAction.SOMETHING_ELSE, "Debounced saver"))); + } + + public void setHasChangesToSave() { + if (isModified == null || debouncedSaveSignal == null) { + return; + } + + isModified.set(true); + debouncedSaveSignal.onNext(System.currentTimeMillis()); + } +} 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 0df579d8814..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 @@ -1,6 +1,11 @@ package org.schabi.newpipe.util.external_communication; +import static org.schabi.newpipe.util.external_communication.ShareUtils.installApp; +import static org.schabi.newpipe.util.external_communication.ShareUtils.tryOpenIntentInApp; + import android.content.Context; +import android.content.Intent; +import android.net.Uri; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; @@ -8,7 +13,6 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.util.NavigationHelper; /** * Util class that provides methods which are related to the Kodi Media Center and its Kore app. @@ -29,13 +33,40 @@ public static boolean shouldShowPlayWithKodi(@NonNull final Context context, .getBoolean(context.getString(R.string.show_play_with_kodi_key), false); } - public static void showInstallKoreDialog(@NonNull final Context context) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setMessage(R.string.kore_not_found) - .setPositiveButton(R.string.install, (dialog, which) -> - NavigationHelper.installKore(context)) - .setNegativeButton(R.string.cancel, (dialog, which) -> { - }); - builder.create().show(); + /** + * Start an activity to install Kore. + * + * @param context the context to use + */ + public static void installKore(final Context context) { + installApp(context, context.getString(R.string.kore_package)); + } + + /** + * Start Kore app to show a video on Kodi, and if the app is not installed ask the user to + * install it. + *

+ * For a list of supported urls see the + * + * Kore source code + * . + * + * @param context the context to use + * @param streamUrl the url to the stream to play + */ + public static void playWithKore(final Context context, final Uri streamUrl) { + final Intent intent = new Intent(Intent.ACTION_VIEW) + .setPackage(context.getString(R.string.kore_package)) + .setData(streamUrl) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + if (!tryOpenIntentInApp(context, intent)) { + 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/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 9829ddd2e2e..7524e5413c5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -23,10 +23,13 @@ import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.extractor.Image; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; import java.io.File; import java.io.FileOutputStream; +import java.util.List; public final class ShareUtils { private static final String TAG = ShareUtils.class.getSimpleName(); @@ -41,125 +44,128 @@ private ShareUtils() { * second param (a system chooser will be opened if there are multiple markets and no default) * and falls back to Google Play Store web URL if no app to handle the market scheme was found. *

- * It uses {@link #openIntentInApp(Context, Intent, boolean)} to open market scheme - * and {@link #openUrlInBrowser(Context, String, boolean)} to open Google Play Store - * web URL with false for the boolean param. + * It uses {@link #openIntentInApp(Context, Intent)} to open market scheme and {@link + * #openUrlInBrowser(Context, String)} to open Google Play Store web URL. * * @param context the context to use * @param packageId the package id of the app to be installed */ public static void installApp(@NonNull final Context context, final String packageId) { // Try market scheme - final boolean marketSchemeResult = openIntentInApp(context, new Intent(Intent.ACTION_VIEW, + final Intent marketSchemeIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageId)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), false); - if (!marketSchemeResult) { + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (!tryOpenIntentInApp(context, marketSchemeIntent)) { // Fall back to Google Play Store Web URL (F-Droid can handle it) - openUrlInBrowser(context, - "https://play.google.com/store/apps/details?id=" + packageId, false); + openUrlInApp(context, "https://play.google.com/store/apps/details?id=" + packageId); } } /** - * Open the url with the system default browser. + * Open the url with the system default browser. If no browser is set as default, falls back to + * {@link #openAppChooser(Context, Intent, boolean)}. + *

+ * This function selects the package to open based on which apps respond to the {@code http://} + * schema alone, which should exclude special non-browser apps that are can handle the url (e.g. + * the official YouTube app). *

- * If no browser is set as default, fallbacks to - * {@link #openAppChooser(Context, Intent, boolean)} + * Therefore please prefer {@link #openUrlInApp(Context, String)}, that handles package + * resolution in a standard way, unless this is the action of an explicit "Open in browser" + * button. * - * @param context the context to use - * @param url the url to browse - * @param httpDefaultBrowserTest the boolean to set if the test for the default browser will be - * for HTTP protocol or for the created intent - * @return true if the URL can be opened or false if it cannot - */ - public static boolean openUrlInBrowser(@NonNull final Context context, - final String url, - final boolean httpDefaultBrowserTest) { - final String defaultPackageName; + * @param context the context to use + * @param url the url to browse + **/ + public static void openUrlInBrowser(@NonNull final Context context, final String url) { + // Resolve using a generic http://, so we are sure to get a browser and not e.g. the yt app. + // Note that this requires the `http` schema to be added to `` in the manifest. + final ResolveInfo defaultBrowserInfo; + final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + defaultBrowserInfo = context.getPackageManager().resolveActivity(browserIntent, + PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY)); + } else { + defaultBrowserInfo = context.getPackageManager().resolveActivity(browserIntent, + PackageManager.MATCH_DEFAULT_ONLY); + } + final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (httpDefaultBrowserTest) { - defaultPackageName = getDefaultAppPackageName(context, new Intent(Intent.ACTION_VIEW, - Uri.parse("http://")).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } else { - defaultPackageName = getDefaultAppPackageName(context, intent); + if (defaultBrowserInfo == null) { + // No app installed to open a web URL, but it may be handled by other apps so try + // opening a system chooser for the link in this case (it could be bypassed by the + // system if there is only one app which can open the link or a default app associated + // with the link domain on Android 12 and higher) + openAppChooser(context, intent, true); + return; } - if (defaultPackageName.equals("android")) { + final String defaultBrowserPackage = defaultBrowserInfo.activityInfo.packageName; + + if (defaultBrowserPackage.equals("android")) { // No browser set as default (doesn't work on some devices) openAppChooser(context, intent, true); } else { - if (defaultPackageName.isEmpty()) { - // No app installed to open a web url - Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); - return false; - } else { - try { - intent.setPackage(defaultPackageName); - context.startActivity(intent); - } catch (final ActivityNotFoundException e) { - // Not a browser but an app chooser because of OEMs changes - intent.setPackage(null); - openAppChooser(context, intent, true); - } + try { + intent.setPackage(defaultBrowserPackage); + context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // Not a browser but an app chooser because of OEMs changes + intent.setPackage(null); + openAppChooser(context, intent, true); } } - - return true; } /** - * Open the url with the system default browser. - *

- * If no browser is set as default, fallbacks to - * {@link #openAppChooser(Context, Intent, boolean)} - *

- * This calls {@link #openUrlInBrowser(Context, String, boolean)} with true - * for the boolean parameter + * Open a url with the system default app using {@link Intent#ACTION_VIEW}, showing a toast in + * case of failure. * * @param context the context to use - * @param url the url to browse - * @return true if the URL can be opened or false if it cannot be - **/ - public static boolean openUrlInBrowser(@NonNull final Context context, final String url) { - return openUrlInBrowser(context, url, true); + * @param url the url to open + */ + public static void openUrlInApp(@NonNull final Context context, final String url) { + openIntentInApp(context, new Intent(Intent.ACTION_VIEW, Uri.parse(url)) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } /** * Open an intent with the system default app. *

- * The intent can be of every type, excepted a web intent for which - * {@link #openUrlInBrowser(Context, String, boolean)} should be used. - *

- * If no app can open the intent, a toast with the message {@code No app on your device can - * open this} is shown. + * Use {@link #openIntentInApp(Context, Intent)} to show a toast in case of failure. * - * @param context the context to use - * @param intent the intent to open - * @param showToast a boolean to set if a toast is displayed to user when no app is installed - * to open the intent (true) or not (false) - * @return true if the intent can be opened or false if it cannot be + * @param context the context to use + * @param intent the intent to open + * @return true if the intent could be opened successfully, false otherwise */ - public static boolean openIntentInApp(@NonNull final Context context, - @NonNull final Intent intent, - final boolean showToast) { - final String defaultPackageName = getDefaultAppPackageName(context, intent); - - if (defaultPackageName.isEmpty()) { - // No app installed to open the intent - if (showToast) { - Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG) - .show(); - } - return false; - } else { + public static boolean tryOpenIntentInApp(@NonNull final Context context, + @NonNull final Intent intent) { + try { context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + return false; } - return true; } + /** + * Open an intent with the system default app, showing a toast in case of failure. + *

+ * Use {@link #tryOpenIntentInApp(Context, Intent)} if you don't want the toast. Use {@link + * #openUrlInApp(Context, String)} as a shorthand for {@link Intent#ACTION_VIEW} with urls. + * + * @param context the context to use + * @param intent the intent to + */ + public static void openIntentInApp(@NonNull final Context context, + @NonNull final Intent intent) { + if (!tryOpenIntentInApp(context, intent)) { + Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG) + .show(); + } + } + /** * Open the system chooser to launch an intent. *

@@ -206,31 +212,11 @@ private static void openAppChooser(@NonNull final Context context, chooserIntent.addFlags(permFlags); } } - context.startActivity(chooserIntent); - } - /** - * Get the default app package name. - *

- * If no app is set as default, it will return "android" (not on some devices because some - * OEMs changed the app chooser). - *

- * If no app is installed on user's device to handle the intent, it will return an empty string. - * - * @param context the context to use - * @param intent the intent to get default app - * @return the package name of the default app, an empty string if there's no app installed to - * handle the intent or the app chooser if there's no default - */ - private static String getDefaultAppPackageName(@NonNull final Context context, - @NonNull final Intent intent) { - final ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, - PackageManager.MATCH_DEFAULT_ONLY); - - if (resolveInfo == null) { - return ""; - } else { - return resolveInfo.activityInfo.packageName; + try { + context.startActivity(chooserIntent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); } } @@ -266,7 +252,7 @@ public static void shareText(@NonNull final Context context, // If loading of images has been disabled, don't try to generate a content preview if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !TextUtils.isEmpty(imagePreviewUrl) - && PicassoHelper.getShouldLoadImages()) { + && ImageStrategy.shouldLoadImages()) { final ClipData clipData = generateClipDataForImagePreview(context, imagePreviewUrl); if (clipData != null) { @@ -278,6 +264,29 @@ public static void shareText(@NonNull final Context context, openAppChooser(context, shareIntent, false); } + /** + * Open the android share sheet to share a content. + * + *

+ * For Android 10+ users, a content preview is shown, which includes the title of the shared + * content and an image preview the content, if the preferred image chosen by {@link + * ImageStrategy#choosePreferredImage(List)} is in the image cache. + *

+ * + * @param context the context to use + * @param title the title of the content + * @param content the content to share + * @param images a set of possible {@link Image}s of the subject, among which to choose with + * {@link ImageStrategy#choosePreferredImage(List)} since that's likely to + * provide an image that is in Picasso's cache + */ + public static void shareText(@NonNull final Context context, + @NonNull final String title, + final String content, + final List images) { + shareText(context, title, content, ImageStrategy.choosePreferredImage(images)); + } + /** * Open the android share sheet to share a content. * @@ -313,10 +322,15 @@ public static void copyToClipboard(@NonNull final Context context, final String return; } - clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text)); - if (Build.VERSION.SDK_INT < 33) { - // Android 13 has its own "copied to clipboard" dialog - Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT).show(); + try { + clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text)); + if (Build.VERSION.SDK_INT < 33) { + // Android 13 has its own "copied to clipboard" dialog + Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT).show(); + } + } catch (final Exception e) { + Log.e(TAG, "Error when trying to copy text to clipboard", e); + Toast.makeText(context, R.string.msg_failed_to_copy, Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java deleted file mode 100644 index 8b8eb265bb6..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java +++ /dev/null @@ -1,289 +0,0 @@ -package org.schabi.newpipe.util.external_communication; - -import android.content.Context; -import android.text.SpannableStringBuilder; -import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; -import android.text.style.URLSpan; -import android.text.util.Linkify; -import android.util.Log; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.text.HtmlCompat; - -import org.schabi.newpipe.extractor.Info; -import org.schabi.newpipe.extractor.stream.StreamInfo; -import org.schabi.newpipe.util.NavigationHelper; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import io.noties.markwon.Markwon; -import io.noties.markwon.linkify.LinkifyPlugin; -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.disposables.CompositeDisposable; -import io.reactivex.rxjava3.schedulers.Schedulers; - -import static org.schabi.newpipe.util.external_communication.InternalUrlsHandler.playOnPopup; - -public final class TextLinkifier { - public static final String TAG = TextLinkifier.class.getSimpleName(); - - // Looks for hashtags with characters from any language (\p{L}), numbers, or underscores - private static final Pattern HASHTAGS_PATTERN = - Pattern.compile("(#[\\p{L}0-9_]+)"); - - private TextLinkifier() { - } - - /** - * Create web links for contents with an HTML description. - *

- * This will call {@link TextLinkifier#changeIntentsOfDescriptionLinks(TextView, CharSequence, - * Info, CompositeDisposable)} after having linked the URLs with - * {@link HtmlCompat#fromHtml(String, int)}. - * - * @param textView the TextView to set the htmlBlock linked - * @param htmlBlock the htmlBlock to be linked - * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, int)} - * will be called - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class - */ - public static void createLinksFromHtmlBlock(@NonNull final TextView textView, - final String htmlBlock, - final int htmlCompatFlag, - @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { - changeIntentsOfDescriptionLinks( - textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfo, disposables); - } - - /** - * Create web links for contents with a plain text description. - *

- * This will call {@link TextLinkifier#changeIntentsOfDescriptionLinks(TextView, CharSequence, - * Info, CompositeDisposable)} after having linked the URLs with - * {@link TextView#setAutoLinkMask(int)} and - * {@link TextView#setText(CharSequence, TextView.BufferType)}. - * - * @param textView the TextView to set the plain text block linked - * @param plainTextBlock the block of plain text to be linked - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class - */ - public static void createLinksFromPlainText(@NonNull final TextView textView, - final String plainTextBlock, - @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { - textView.setAutoLinkMask(Linkify.WEB_URLS); - textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE); - changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables); - } - - /** - * Create web links for contents with a markdown description. - *

- * This will call {@link TextLinkifier#changeIntentsOfDescriptionLinks(TextView, CharSequence, - * Info, CompositeDisposable)} after creating an {@link Markwon} object and using - * {@link Markwon#setMarkdown(TextView, String)}. - * - * @param textView the TextView to set the plain text block linked - * @param markdownBlock the block of markdown text to be linked - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class - */ - public static void createLinksFromMarkdownText(@NonNull final TextView textView, - final String markdownBlock, - @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { - final Markwon markwon = Markwon.builder(textView.getContext()) - .usePlugin(LinkifyPlugin.create()).build(); - changeIntentsOfDescriptionLinks(textView, markwon.toMarkdown(markdownBlock), relatedInfo, - disposables); - } - - /** - * Add click listeners which opens a search on hashtags in a plain text. - *

- * This method finds all timestamps in the {@link SpannableStringBuilder} of the description - * using a regular expression, adds for each a {@link ClickableSpan} which opens - * {@link NavigationHelper#openSearch(Context, int, String)} and makes a search on the hashtag, - * in the service of the content. - * - * @param context the context to use - * @param spannableDescription the SpannableStringBuilder with the text of the - * content description - * @param relatedInfo used to search for the term in the correct service - */ - private static void addClickListenersOnHashtags(final Context context, - @NonNull final SpannableStringBuilder - spannableDescription, - final Info relatedInfo) { - final String descriptionText = spannableDescription.toString(); - final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText); - - while (hashtagsMatches.find()) { - final int hashtagStart = hashtagsMatches.start(1); - final int hashtagEnd = hashtagsMatches.end(1); - final String parsedHashtag = descriptionText.substring(hashtagStart, hashtagEnd); - - // don't add a ClickableSpan if there is already one, which should be a part of an URL, - // already parsed before - if (spannableDescription.getSpans(hashtagStart, hashtagEnd, - ClickableSpan.class).length == 0) { - spannableDescription.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - NavigationHelper.openSearch(context, relatedInfo.getServiceId(), - parsedHashtag); - } - }, hashtagStart, hashtagEnd, 0); - } - } - } - - /** - * Add click listeners which opens the popup player on timestamps in a plain text. - *

- * This method finds all timestamps in the {@link SpannableStringBuilder} of the description - * using a regular expression, adds for each a {@link ClickableSpan} which opens the popup - * player at the time indicated in the timestamps. - * - * @param context the context to use - * @param spannableDescription the SpannableStringBuilder with the text of the - * content description - * @param relatedInfo what to open in the popup player when timestamps are clicked - * @param disposables disposables created by the method are added here and their - * lifecycle should be handled by the calling class - */ - private static void addClickListenersOnTimestamps(final Context context, - @NonNull final SpannableStringBuilder - spannableDescription, - final Info relatedInfo, - final CompositeDisposable disposables) { - final String descriptionText = spannableDescription.toString(); - final Matcher timestampsMatches = - TimestampExtractor.TIMESTAMPS_PATTERN.matcher(descriptionText); - - while (timestampsMatches.find()) { - final TimestampExtractor.TimestampMatchDTO timestampMatchDTO = - TimestampExtractor.getTimestampFromMatcher( - timestampsMatches, - descriptionText); - - if (timestampMatchDTO == null) { - continue; - } - - spannableDescription.setSpan( - new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - playOnPopup( - context, - relatedInfo.getUrl(), - relatedInfo.getService(), - timestampMatchDTO.seconds(), - disposables); - } - }, - timestampMatchDTO.timestampStart(), - timestampMatchDTO.timestampEnd(), - 0); - } - } - - /** - * Change links generated by libraries in the description of a content to a custom link action - * and add click listeners on timestamps in this description. - *

- * Instead of using an {@link android.content.Intent#ACTION_VIEW} intent in the description of - * a content, this method will parse the {@link CharSequence} and replace all current web links - * with {@link ShareUtils#openUrlInBrowser(Context, String, boolean)}. - * This method will also add click listeners on timestamps in this description, which will play - * the content in the popup player at the time indicated in the timestamp, by using - * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder, Info, - * CompositeDisposable)} method and click listeners on hashtags, by using - * {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, Info)}, - * which will open a search on the current service with the hashtag. - *

- * This method is required in order to intercept links and e.g. show a confirmation dialog - * before opening a web link. - * - * @param textView the TextView in which the converted CharSequence will be applied - * @param chars the CharSequence to be parsed - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class - */ - private static void changeIntentsOfDescriptionLinks(final TextView textView, - final CharSequence chars, - @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { - disposables.add(Single.fromCallable(() -> { - final Context context = textView.getContext(); - - // add custom click actions on web links - final SpannableStringBuilder textBlockLinked = new SpannableStringBuilder(chars); - final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(), URLSpan.class); - - for (final URLSpan span : urls) { - final String url = span.getURL(); - final ClickableSpan clickableSpan = new ClickableSpan() { - public void onClick(@NonNull final View view) { - if (!InternalUrlsHandler.handleUrlDescriptionTimestamp( - new CompositeDisposable(), context, url)) { - ShareUtils.openUrlInBrowser(context, url, false); - } - } - }; - - textBlockLinked.setSpan(clickableSpan, textBlockLinked.getSpanStart(span), - textBlockLinked.getSpanEnd(span), textBlockLinked.getSpanFlags(span)); - textBlockLinked.removeSpan(span); - } - - // add click actions on plain text timestamps only for description of contents, - // unneeded for meta-info or other TextViews - if (relatedInfo != null) { - if (relatedInfo instanceof StreamInfo) { - addClickListenersOnTimestamps(context, textBlockLinked, relatedInfo, - disposables); - } - addClickListenersOnHashtags(context, textBlockLinked, relatedInfo); - } - - return textBlockLinked; - }).subscribeOn(Schedulers.computation()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - textBlockLinked -> setTextViewCharSequence(textView, textBlockLinked), - throwable -> { - Log.e(TAG, "Unable to linkify text", throwable); - // this should never happen, but if it does, just fallback to it - setTextViewCharSequence(textView, chars); - })); - } - - private static void setTextViewCharSequence(@NonNull final TextView textView, - final CharSequence charSequence) { - textView.setText(charSequence); - textView.setMovementMethod(LinkMovementMethod.getInstance()); - textView.setVisibility(View.VISIBLE); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java new file mode 100644 index 00000000000..da97179b640 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java @@ -0,0 +1,195 @@ +package org.schabi.newpipe.util.image; + +import static org.schabi.newpipe.extractor.Image.HEIGHT_UNKNOWN; +import static org.schabi.newpipe.extractor.Image.WIDTH_UNKNOWN; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.extractor.Image; + +import java.util.Comparator; +import java.util.List; + +public final class ImageStrategy { + + // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred + // image quality is to these values (H stands for "Height") + private static final int BEST_LOW_H = 75; + private static final int BEST_MEDIUM_H = 250; + + private static PreferredImageQuality preferredImageQuality = PreferredImageQuality.MEDIUM; + + private ImageStrategy() { + } + + public static void setPreferredImageQuality(final PreferredImageQuality preferredImageQuality) { + ImageStrategy.preferredImageQuality = preferredImageQuality; + } + + public static boolean shouldLoadImages() { + return preferredImageQuality != PreferredImageQuality.NONE; + } + + + static double estimatePixelCount(final Image image, final double widthOverHeight) { + if (image.getHeight() == HEIGHT_UNKNOWN) { + if (image.getWidth() == WIDTH_UNKNOWN) { + // images whose size is completely unknown will be in their own subgroups, so + // any one of them will do, hence returning the same value for all of them + return 0; + } else { + return image.getWidth() * image.getWidth() / widthOverHeight; + } + } else if (image.getWidth() == WIDTH_UNKNOWN) { + return image.getHeight() * image.getHeight() * widthOverHeight; + } else { + return image.getHeight() * image.getWidth(); + } + } + + /** + * {@link #choosePreferredImage(List)} contains the description for this function's logic. + * + * @param images the images from which to choose + * @param nonNoneQuality the preferred quality (must NOT be {@link PreferredImageQuality#NONE}) + * @return the chosen preferred image, or {@link null} if the list is empty + * @see #choosePreferredImage(List) + */ + @Nullable + static String choosePreferredImage(@NonNull final List images, + final PreferredImageQuality nonNoneQuality) { + // this will be used to estimate the pixel count for images where only one of height or + // width are known + final double widthOverHeight = images.stream() + .filter(image -> image.getHeight() != HEIGHT_UNKNOWN + && image.getWidth() != WIDTH_UNKNOWN) + .mapToDouble(image -> ((double) image.getWidth()) / image.getHeight()) + .findFirst() + .orElse(1.0); + + final Image.ResolutionLevel preferredLevel = nonNoneQuality.toResolutionLevel(); + final Comparator initialComparator = Comparator + // the first step splits the images into groups of resolution levels + .comparingInt(i -> { + if (i.getEstimatedResolutionLevel() == Image.ResolutionLevel.UNKNOWN) { + return 3; // avoid unknowns as much as possible + } else if (i.getEstimatedResolutionLevel() == preferredLevel) { + return 0; // prefer a matching resolution level + } else if (i.getEstimatedResolutionLevel() == Image.ResolutionLevel.MEDIUM) { + return 1; // the preferredLevel is only 1 "step" away (either HIGH or LOW) + } else { + return 2; // the preferredLevel is the furthest away possible (2 "steps") + } + }) + // then each level's group is further split into two subgroups, one with known image + // size (which is also the preferred subgroup) and the other without + .thenComparing(image -> + image.getHeight() == HEIGHT_UNKNOWN && image.getWidth() == WIDTH_UNKNOWN); + + // The third step chooses, within each subgroup with known image size, the best image based + // on how close its size is to BEST_LOW_H or BEST_MEDIUM_H (with proper units). Subgroups + // without known image size will be left untouched since estimatePixelCount always returns + // the same number for those. + final Comparator finalComparator = switch (nonNoneQuality) { + case NONE -> initialComparator; // unreachable + case LOW -> initialComparator.thenComparingDouble(image -> { + final double pixelCount = estimatePixelCount(image, widthOverHeight); + return Math.abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight); + }); + case MEDIUM -> initialComparator.thenComparingDouble(image -> { + final double pixelCount = estimatePixelCount(image, widthOverHeight); + return Math.abs(pixelCount - BEST_MEDIUM_H * BEST_MEDIUM_H * widthOverHeight); + }); + case HIGH -> initialComparator.thenComparingDouble( + // this is reversed with a - so that the highest resolution is chosen + i -> -estimatePixelCount(i, widthOverHeight)); + }; + + return images.stream() + // using "min" basically means "take the first group, then take the first subgroup, + // then choose the best image, while ignoring all other groups and subgroups" + .min(finalComparator) + .map(Image::getUrl) + .orElse(null); + } + + /** + * Chooses an image amongst the provided list based on the user preference previously set with + * {@link #setPreferredImageQuality(PreferredImageQuality)}. {@code null} will be returned in + * case the list is empty or the user preference is to not show images. + *
+ * These properties will be preferred, from most to least important: + *

    + *
  1. The image's {@link Image#getEstimatedResolutionLevel()} is not unknown and is close + * to {@link #preferredImageQuality}
  2. + *
  3. At least one of the image's width or height are known
  4. + *
  5. The highest resolution image is finally chosen if the user's preference is {@link + * PreferredImageQuality#HIGH}, otherwise the chosen image is the one that has the height + * closest to {@link #BEST_LOW_H} or {@link #BEST_MEDIUM_H}
  6. + *
+ *
+ * Use {@link #imageListToDbUrl(List)} if the URL is going to be saved to the database, to avoid + * saving nothing in case at the moment of saving the user preference is to not show images. + * + * @param images the images from which to choose + * @return the chosen preferred image, or {@link null} if the list is empty or the user disabled + * images + * @see #imageListToDbUrl(List) + */ + @Nullable + public static String choosePreferredImage(@NonNull final List images) { + if (preferredImageQuality == PreferredImageQuality.NONE) { + return null; // do not load images + } + + return choosePreferredImage(images, preferredImageQuality); + } + + /** + * Like {@link #choosePreferredImage(List)}, except that if {@link #preferredImageQuality} is + * {@link PreferredImageQuality#NONE} an image will be chosen anyway (with preferred quality + * {@link PreferredImageQuality#MEDIUM}. + *
+ * To go back to a list of images (obviously with just the one chosen image) from a URL saved in + * the database use {@link #dbUrlToImageList(String)}. + * + * @param images the images from which to choose + * @return the chosen preferred image, or {@link null} if the list is empty + * @see #choosePreferredImage(List) + * @see #dbUrlToImageList(String) + */ + @Nullable + public static String imageListToDbUrl(@NonNull final List images) { + final PreferredImageQuality quality; + if (preferredImageQuality == PreferredImageQuality.NONE) { + quality = PreferredImageQuality.MEDIUM; + } else { + quality = preferredImageQuality; + } + + return choosePreferredImage(images, quality); + } + + /** + * Wraps the URL (coming from the database) in a {@code List} so that it is usable + * seamlessly in all of the places where the extractor would return a list of images, including + * allowing to build info objects based on database objects. + *
+ * To obtain a url to save to the database from a list of images use {@link + * #imageListToDbUrl(List)}. + * + * @param url the URL to wrap coming from the database, or {@code null} to get an empty list + * @return a list containing just one {@link Image} wrapping the provided URL, with unknown + * image size fields, or an empty list if the URL is {@code null} + * @see #imageListToDbUrl(List) + */ + @NonNull + public static List dbUrlToImageList(@Nullable final String url) { + if (url == null) { + return List.of(); + } else { + return List.of(new Image(url, -1, -1, Image.ResolutionLevel.UNKNOWN)); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java b/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java similarity index 69% rename from app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java rename to app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java index ece0c7e8753..4b116bdf906 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java @@ -1,13 +1,16 @@ -package org.schabi.newpipe.util; +package org.schabi.newpipe.util.image; import static org.schabi.newpipe.MainActivity.DEBUG; -import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; +import static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.graphics.BitmapCompat; @@ -19,9 +22,11 @@ import com.squareup.picasso.Transformation; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.Image; import java.io.File; import java.io.IOException; +import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; @@ -41,13 +46,12 @@ private PicassoHelper() { @SuppressLint("StaticFieldLeak") private static Picasso picassoInstance; - private static boolean shouldLoadImages; public static void init(final Context context) { picassoCache = new LruCache(10 * 1024 * 1024); picassoDownloaderClient = new OkHttpClient.Builder() .cache(new okhttp3.Cache(new File(context.getExternalCacheDir(), "picasso"), - 50 * 1024 * 1024)) + 50L * 1024L * 1024L)) // this should already be the default timeout in OkHttp3, but just to be sure... .callTimeout(15, TimeUnit.SECONDS) .build(); @@ -87,47 +91,53 @@ public static void setIndicatorsEnabled(final boolean enabled) { picassoInstance.setIndicatorsEnabled(enabled); // useful for debugging } - public static void setShouldLoadImages(final boolean shouldLoadImages) { - PicassoHelper.shouldLoadImages = shouldLoadImages; - } - public static boolean getShouldLoadImages() { - return shouldLoadImages; + public static RequestCreator loadAvatar(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_person); } - - public static RequestCreator loadAvatar(final String url) { + public static RequestCreator loadAvatar(@Nullable final String url) { return loadImageDefault(url, R.drawable.placeholder_person); } - public static RequestCreator loadThumbnail(final String url) { + public static RequestCreator loadThumbnail(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_thumbnail_video); + } + + public static RequestCreator loadThumbnail(@Nullable final String url) { return loadImageDefault(url, R.drawable.placeholder_thumbnail_video); } - public static RequestCreator loadDetailsThumbnail(final String url) { - return loadImageDefault(url, R.drawable.placeholder_thumbnail_video, false); + public static RequestCreator loadDetailsThumbnail(@NonNull final List images) { + return loadImageDefault(choosePreferredImage(images), + R.drawable.placeholder_thumbnail_video, false); } - public static RequestCreator loadBanner(final String url) { - return loadImageDefault(url, R.drawable.placeholder_channel_banner); + public static RequestCreator loadBanner(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_channel_banner); } - public static RequestCreator loadPlaylistThumbnail(final String url) { + public static RequestCreator loadPlaylistThumbnail(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_thumbnail_playlist); + } + + public static RequestCreator loadPlaylistThumbnail(@Nullable final String url) { return loadImageDefault(url, R.drawable.placeholder_thumbnail_playlist); } - public static RequestCreator loadSeekbarThumbnailPreview(final String url) { + public static RequestCreator loadSeekbarThumbnailPreview(@Nullable final String url) { return picassoInstance.load(url); } - public static RequestCreator loadNotificationIcon(final String url) { + public static RequestCreator loadNotificationIcon(@Nullable final String url) { return loadImageDefault(url, R.drawable.ic_newpipe_triangle_white); } - public static RequestCreator loadScaledDownThumbnail(final Context context, final String url) { + public static RequestCreator loadScaledDownThumbnail(final Context context, + @NonNull final List images) { // scale down the notification thumbnail for performance - return PicassoHelper.loadThumbnail(url) + return PicassoHelper.loadThumbnail(images) .transform(new Transformation() { @Override public Bitmap transform(final Bitmap source) { @@ -174,19 +184,29 @@ public String key() { } @Nullable - public static Bitmap getImageFromCacheIfPresent(final String imageUrl) { + public static Bitmap getImageFromCacheIfPresent(@NonNull final String imageUrl) { // URLs in the internal cache finish with \n so we need to add \n to image URLs return picassoCache.get(imageUrl + "\n"); } - private static RequestCreator loadImageDefault(final String url, final int placeholderResId) { + private static RequestCreator loadImageDefault(@NonNull final List images, + @DrawableRes final int placeholderResId) { + return loadImageDefault(choosePreferredImage(images), placeholderResId); + } + + private static RequestCreator loadImageDefault(@Nullable final String url, + @DrawableRes final int placeholderResId) { return loadImageDefault(url, placeholderResId, true); } - private static RequestCreator loadImageDefault(final String url, final int placeholderResId, + private static RequestCreator loadImageDefault(@Nullable final String url, + @DrawableRes final int placeholderResId, final boolean showPlaceholderWhileLoading) { - if (!shouldLoadImages || isBlank(url)) { + // if the URL was chosen with `choosePreferredImage` it will be null, but check again + // `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case + // for URLs stored in the database) + if (isNullOrEmpty(url) || !ImageStrategy.shouldLoadImages()) { return picassoInstance .load((String) null) .placeholder(placeholderResId) // show placeholder when no image should load diff --git a/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java new file mode 100644 index 00000000000..7106359b36e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java @@ -0,0 +1,39 @@ +package org.schabi.newpipe.util.image; + +import android.content.Context; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.Image; + +public enum PreferredImageQuality { + NONE, + LOW, + MEDIUM, + HIGH; + + public static PreferredImageQuality fromPreferenceKey(final Context context, final String key) { + if (context.getString(R.string.image_quality_none_key).equals(key)) { + return NONE; + } else if (context.getString(R.string.image_quality_low_key).equals(key)) { + return LOW; + } else if (context.getString(R.string.image_quality_high_key).equals(key)) { + return HIGH; + } else { + return MEDIUM; // default to medium + } + } + + public Image.ResolutionLevel toResolutionLevel() { + switch (this) { + case LOW: + return Image.ResolutionLevel.LOW; + case MEDIUM: + return Image.ResolutionLevel.MEDIUM; + case HIGH: + return Image.ResolutionLevel.HIGH; + default: + case NONE: + return Image.ResolutionLevel.UNKNOWN; + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java new file mode 100644 index 00000000000..8a0363ecbce --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java @@ -0,0 +1,36 @@ +package org.schabi.newpipe.util.text; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.external_communication.ShareUtils; + +final class HashtagLongPressClickableSpan extends LongPressClickableSpan { + + @NonNull + private final Context context; + @NonNull + private final String parsedHashtag; + private final int relatedInfoServiceId; + + HashtagLongPressClickableSpan(@NonNull final Context context, + @NonNull final String parsedHashtag, + final int relatedInfoServiceId) { + this.context = context; + this.parsedHashtag = parsedHashtag; + this.relatedInfoServiceId = relatedInfoServiceId; + } + + @Override + public void onClick(@NonNull final View view) { + NavigationHelper.openSearch(context, relatedInfoServiceId, parsedHashtag); + } + + @Override + public void onLongClick(@NonNull final View view) { + ShareUtils.copyToClipboard(context, parsedHashtag); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java b/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java similarity index 98% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java rename to app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java index c46e6636d1f..066515d6b96 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; import android.content.Context; import android.util.Log; @@ -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/org/schabi/newpipe/util/text/LongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/LongPressClickableSpan.java new file mode 100644 index 00000000000..5c94a58508e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/LongPressClickableSpan.java @@ -0,0 +1,12 @@ +package org.schabi.newpipe.util.text; + +import android.text.style.ClickableSpan; +import android.view.View; + +import androidx.annotation.NonNull; + +public abstract class LongPressClickableSpan extends ClickableSpan { + + public abstract void onLongClick(@NonNull View view); + +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java b/app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java new file mode 100644 index 00000000000..bd57621cb73 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java @@ -0,0 +1,77 @@ +package org.schabi.newpipe.util.text; + +import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; + +import android.os.Handler; +import android.os.Looper; +import android.text.Selection; +import android.text.Spannable; +import android.text.method.LinkMovementMethod; +import android.text.method.MovementMethod; +import android.view.MotionEvent; +import android.view.ViewConfiguration; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +// Class adapted from https://stackoverflow.com/a/31786969 + +public class LongPressLinkMovementMethod extends LinkMovementMethod { + + private static final int LONG_PRESS_TIME = ViewConfiguration.getLongPressTimeout(); + + private static LongPressLinkMovementMethod instance; + + private Handler longClickHandler; + private boolean isLongPressed = false; + + @Override + public boolean onTouchEvent(@NonNull final TextView widget, + @NonNull final Spannable buffer, + @NonNull final MotionEvent event) { + final int action = event.getAction(); + + if (action == MotionEvent.ACTION_CANCEL && longClickHandler != null) { + longClickHandler.removeCallbacksAndMessages(null); + } + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + final int offset = getOffsetForHorizontalLine(widget, event); + final LongPressClickableSpan[] link = buffer.getSpans(offset, offset, + LongPressClickableSpan.class); + + if (link.length != 0) { + if (action == MotionEvent.ACTION_UP) { + if (longClickHandler != null) { + longClickHandler.removeCallbacksAndMessages(null); + } + if (!isLongPressed) { + link[0].onClick(widget); + } + isLongPressed = false; + } else { + Selection.setSelection(buffer, buffer.getSpanStart(link[0]), + buffer.getSpanEnd(link[0])); + if (longClickHandler != null) { + longClickHandler.postDelayed(() -> { + link[0].onLongClick(widget); + isLongPressed = true; + }, LONG_PRESS_TIME); + } + } + return true; + } + } + + return super.onTouchEvent(widget, buffer, event); + } + + public static MovementMethod getInstance() { + if (instance == null) { + instance = new LongPressLinkMovementMethod(); + instance.longClickHandler = new Handler(Looper.myLooper()); + } + + return instance; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java b/app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java new file mode 100644 index 00000000000..184b73304d8 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java @@ -0,0 +1,193 @@ +package org.schabi.newpipe.util.text; + +import android.graphics.Paint; +import android.text.Layout; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.text.HtmlCompat; + +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream.Description; + +import java.util.function.Consumer; + + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +/** + *

Class to ellipsize text inside a {@link TextView}.

+ * This class provides all utils to automatically ellipsize and expand a text + */ +public final class TextEllipsizer { + private static final int EXPANDED_LINES = Integer.MAX_VALUE; + private static final String ELLIPSIS = "…"; + + @NonNull private final CompositeDisposable disposable = new CompositeDisposable(); + + @NonNull private final TextView view; + private final int maxLines; + @NonNull private Description content; + @Nullable private StreamingService streamingService; + @Nullable private String streamUrl; + private boolean isEllipsized = false; + @Nullable private Boolean canBeEllipsized = null; + + @NonNull private final Paint paintAtContentSize = new Paint(); + private final float ellipsisWidthPx; + @Nullable private Consumer stateChangeListener = null; + @Nullable private Consumer onContentChanged; + + public TextEllipsizer(@NonNull final TextView view, + final int maxLines, + @Nullable final StreamingService streamingService) { + this.view = view; + this.maxLines = maxLines; + this.content = Description.EMPTY_DESCRIPTION; + this.streamingService = streamingService; + + paintAtContentSize.setTextSize(view.getTextSize()); + ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS); + } + + public void setOnContentChanged(@Nullable final Consumer onContentChanged) { + this.onContentChanged = onContentChanged; + } + + public void setContent(@NonNull final Description content) { + this.content = content; + canBeEllipsized = null; + linkifyContentView(v -> { + final int currentMaxLines = view.getMaxLines(); + view.setMaxLines(EXPANDED_LINES); + canBeEllipsized = view.getLineCount() > maxLines; + view.setMaxLines(currentMaxLines); + if (onContentChanged != null) { + onContentChanged.accept(canBeEllipsized); + } + }); + } + + public void setStreamUrl(@Nullable final String streamUrl) { + this.streamUrl = streamUrl; + } + + public void setStreamingService(@NonNull final StreamingService streamingService) { + this.streamingService = streamingService; + } + + /** + * Expand the {@link TextEllipsizer#content} to its full length. + */ + public void expand() { + view.setMaxLines(EXPANDED_LINES); + linkifyContentView(v -> isEllipsized = false); + } + + /** + * Shorten the {@link TextEllipsizer#content} to the given number of + * {@link TextEllipsizer#maxLines maximum lines} and add trailing '{@code …}' + * if the text was shorted. + */ + public void ellipsize() { + // expand text to see whether it is necessary to ellipsize the text + view.setMaxLines(EXPANDED_LINES); + linkifyContentView(v -> { + final CharSequence charSeqText = view.getText(); + if (charSeqText != null && view.getLineCount() > maxLines) { + // Note that converting to String removes spans (i.e. links), but that's something + // we actually want since when the text is ellipsized we want all clicks on the + // comment to expand the comment, not to open links. + final String text = charSeqText.toString(); + + final Layout layout = view.getLayout(); + final float lineWidth = layout.getLineWidth(maxLines - 1); + final float layoutWidth = layout.getWidth(); + final int lineStart = layout.getLineStart(maxLines - 1); + final int lineEnd = layout.getLineEnd(maxLines - 1); + + // remove characters up until there is enough space for the ellipsis + // (also summing 2 more pixels, just to be sure to avoid float rounding errors) + int end = lineEnd; + float removedCharactersWidth = 0.0f; + while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth + && end >= lineStart) { + end -= 1; + // recalculate each time to account for ligatures or other similar things + removedCharactersWidth = paintAtContentSize.measureText( + text.substring(end, lineEnd)); + } + + // remove trailing spaces and newlines + while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) { + end -= 1; + } + + final String newVal = text.substring(0, end) + ELLIPSIS; + view.setText(newVal); + isEllipsized = true; + } else { + isEllipsized = false; + } + view.setMaxLines(maxLines); + }); + } + + /** + * Toggle the view between the ellipsized and expanded state. + */ + public void toggle() { + if (isEllipsized) { + expand(); + } else { + ellipsize(); + } + } + + /** + * Whether the {@link #view} can be ellipsized. + * This is only the case when the {@link #content} has more lines + * than allowed via {@link #maxLines}. + * @return {@code true} if the {@link #content} has more lines than allowed via + * {@link #maxLines} and thus can be shortened, {@code false} if the {@code content} fits into + * the {@link #view} without being shortened and {@code null} if the initialization is not + * completed yet. + */ + @Nullable + public Boolean canBeEllipsized() { + return canBeEllipsized; + } + + private void linkifyContentView(final Consumer consumer) { + final boolean oldState = isEllipsized; + disposable.clear(); + TextLinkifier.fromDescription(view, content, + HtmlCompat.FROM_HTML_MODE_LEGACY, streamingService, streamUrl, disposable, + v -> { + consumer.accept(v); + notifyStateChangeListener(oldState); + }); + + } + + /** + * Add a listener which is called when the given content is changed, + * either from ellipsized to full or vice versa. + * @param listener The listener to be called, or {@code null} to remove it. + * The Boolean parameter is the new state. + * Ellipsized content is represented as {@code true}, + * normal or full content by {@code false}. + */ + public void setStateChangeListener(@Nullable final Consumer listener) { + this.stateChangeListener = listener; + } + + private void notifyStateChangeListener(final boolean oldState) { + if (oldState != isEllipsized && stateChangeListener != null) { + stateChangeListener.accept(isEllipsized); + } + } + +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java new file mode 100644 index 00000000000..1419ac85a04 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java @@ -0,0 +1,369 @@ +package org.schabi.newpipe.util.text; + +import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.style.URLSpan; +import android.text.util.Linkify; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.text.HtmlCompat; + +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream.Description; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.external_communication.ShareUtils; + +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import io.noties.markwon.Markwon; +import io.noties.markwon.linkify.LinkifyPlugin; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.disposables.CompositeDisposable; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public final class TextLinkifier { + public static final String TAG = TextLinkifier.class.getSimpleName(); + + // Looks for hashtags with characters from any language (\p{L}), numbers, or underscores + private static final Pattern HASHTAGS_PATTERN = Pattern.compile("(#[\\p{L}0-9_]+)"); + + public static final Consumer SET_LINK_MOVEMENT_METHOD = + v -> v.setMovementMethod(LongPressLinkMovementMethod.getInstance()); + + private TextLinkifier() { + } + + /** + * Create links for contents with an {@link Description} in the various possible formats. + *

+ * This will call one of these three functions based on the format: {@link #fromHtml}, + * {@link #fromMarkdown} or {@link #fromPlainText}. + * + * @param textView the TextView to set the htmlBlock linked + * @param description the htmlBlock to be linked + * @param htmlCompatFlag the int flag to be set if {@link HtmlCompat#fromHtml(String, int)} + * will be called (not used for formats different than HTML) + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable + */ + public static void fromDescription(@NonNull final TextView textView, + @NonNull final Description description, + final int htmlCompatFlag, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + switch (description.getType()) { + case Description.HTML: + TextLinkifier.fromHtml(textView, description.getContent(), htmlCompatFlag, + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + break; + case Description.MARKDOWN: + TextLinkifier.fromMarkdown(textView, description.getContent(), + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + break; + case Description.PLAIN_TEXT: default: + TextLinkifier.fromPlainText(textView, description.getContent(), + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + break; + } + } + + /** + * Create links for contents with an HTML description. + * + *

+ * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService, + * String, CompositeDisposable, Consumer)} after having linked the URLs with + * {@link HtmlCompat#fromHtml(String, int)}. + *

+ * + * @param textView the {@link TextView} to set the HTML string block linked + * @param htmlBlock the HTML string block to be linked + * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, + * int)} will be called + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable + */ + public static void fromHtml(@NonNull final TextView textView, + @NonNull final String htmlBlock, + final int htmlCompatFlag, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + changeLinkIntents( + textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfoService, + relatedStreamUrl, disposables, onCompletion); + } + + /** + * Create links for contents with a plain text description. + * + *

+ * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService, + * String, CompositeDisposable, Consumer)} after having linked the URLs with + * {@link TextView#setAutoLinkMask(int)} and + * {@link TextView#setText(CharSequence, TextView.BufferType)}. + *

+ * + * @param textView the {@link TextView} to set the plain text block linked + * @param plainTextBlock the block of plain text to be linked + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable + */ + public static void fromPlainText(@NonNull final TextView textView, + @NonNull final String plainTextBlock, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + textView.setAutoLinkMask(Linkify.WEB_URLS); + textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE); + changeLinkIntents(textView, textView.getText(), relatedInfoService, + relatedStreamUrl, disposables, onCompletion); + } + + /** + * Create links for contents with a markdown description. + * + *

+ * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService, + * String, CompositeDisposable, Consumer)} after creating a {@link Markwon} object and using + * {@link Markwon#setMarkdown(TextView, String)}. + *

+ * + * @param textView the {@link TextView} to set the plain text block linked + * @param markdownBlock the block of markdown text to be linked + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable + */ + public static void fromMarkdown(@NonNull final TextView textView, + @NonNull final String markdownBlock, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + final Markwon markwon = Markwon.builder(textView.getContext()) + .usePlugin(LinkifyPlugin.create()).build(); + changeLinkIntents(textView, markwon.toMarkdown(markdownBlock), + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + } + + /** + * Change links generated by libraries in the description of a content to a custom link action + * and add click listeners on timestamps in this description. + * + *

+ * Instead of using an {@link android.content.Intent#ACTION_VIEW} intent in the description of + * a content, this method will parse the {@link CharSequence} and replace all current web links + * with {@link ShareUtils#openUrlInBrowser(Context, String, boolean)}. + *

+ * + *

+ * This method will also add click listeners on timestamps in this description, which will play + * the content in the popup player at the time indicated in the timestamp, by using + * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder, + * StreamingService, String, CompositeDisposable)} method and click listeners on hashtags, by + * using {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, + * StreamingService)}, which will open a search on the current service with the hashtag. + *

+ * + *

+ * This method is required in order to intercept links and e.g. show a confirmation dialog + * before opening a web link. + *

+ * + * @param textView the {@link TextView} to which the converted {@link CharSequence} + * will be applied + * @param chars the {@link CharSequence} to be parsed + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable + */ + private static void changeLinkIntents(@NonNull final TextView textView, + @NonNull final CharSequence chars, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + disposables.add(Single.fromCallable(() -> { + final Context context = textView.getContext(); + + // add custom click actions on web links + final SpannableStringBuilder textBlockLinked = + new SpannableStringBuilder(chars); + final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(), + URLSpan.class); + + for (final URLSpan span : urls) { + final String url = span.getURL(); + final LongPressClickableSpan longPressClickableSpan = + new UrlLongPressClickableSpan(context, disposables, url); + + textBlockLinked.setSpan(longPressClickableSpan, + textBlockLinked.getSpanStart(span), + textBlockLinked.getSpanEnd(span), + textBlockLinked.getSpanFlags(span)); + textBlockLinked.removeSpan(span); + } + + // add click actions on plain text timestamps only for description of contents, + // unneeded for meta-info or other TextViews + if (relatedInfoService != null) { + if (relatedStreamUrl != null) { + addClickListenersOnTimestamps(context, textBlockLinked, + relatedInfoService, relatedStreamUrl, disposables); + } + addClickListenersOnHashtags(context, textBlockLinked, relatedInfoService); + } + + return textBlockLinked; + }).subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + textBlockLinked -> + setTextViewCharSequence(textView, textBlockLinked, onCompletion), + throwable -> { + Log.e(TAG, "Unable to linkify text", throwable); + // this should never happen, but if it does, just fallback to it + setTextViewCharSequence(textView, chars, onCompletion); + })); + } + + /** + * Add click listeners which opens a search on hashtags in a plain text. + * + *

+ * This method finds all timestamps in the {@link SpannableStringBuilder} of the description + * using a regular expression, adds for each a {@link LongPressClickableSpan} which opens + * {@link NavigationHelper#openSearch(Context, int, String)} and makes a search on the hashtag, + * in the service of the content when pressed, and copy the hashtag to clipboard when + * long-pressed, if allowed by the caller method (parameter {@code addLongClickCopyListener}). + *

+ * + * @param context the {@link Context} to use + * @param spannableDescription the {@link SpannableStringBuilder} with the text of the + * content description + * @param relatedInfoService used to search for the term in the correct service + */ + private static void addClickListenersOnHashtags( + @NonNull final Context context, + @NonNull final SpannableStringBuilder spannableDescription, + @NonNull final StreamingService relatedInfoService) { + final String descriptionText = spannableDescription.toString(); + final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText); + + while (hashtagsMatches.find()) { + final int hashtagStart = hashtagsMatches.start(1); + final int hashtagEnd = hashtagsMatches.end(1); + final String parsedHashtag = descriptionText.substring(hashtagStart, hashtagEnd); + + // Don't add a LongPressClickableSpan if there is already one, which should be a part + // of an URL, already parsed before + if (spannableDescription.getSpans(hashtagStart, hashtagEnd, + LongPressClickableSpan.class).length == 0) { + final int serviceId = relatedInfoService.getServiceId(); + spannableDescription.setSpan( + new HashtagLongPressClickableSpan(context, parsedHashtag, serviceId), + hashtagStart, hashtagEnd, 0); + } + } + } + + /** + * Add click listeners which opens the popup player on timestamps in a plain text. + * + *

+ * This method finds all timestamps in the {@link SpannableStringBuilder} of the description + * using a regular expression, adds for each a {@link LongPressClickableSpan} which opens the + * popup player at the time indicated in the timestamps and copy the timestamp in clipboard + * when long-pressed. + *

+ * + * @param context the {@link Context} to use + * @param spannableDescription the {@link SpannableStringBuilder} with the text of the + * content description + * @param relatedInfoService the service of the {@code relatedStreamUrl} + * @param relatedStreamUrl what to open in the popup player when timestamps are clicked + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + */ + private static void addClickListenersOnTimestamps( + @NonNull final Context context, + @NonNull final SpannableStringBuilder spannableDescription, + @NonNull final StreamingService relatedInfoService, + @NonNull final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables) { + final String descriptionText = spannableDescription.toString(); + final Matcher timestampsMatches = TimestampExtractor.TIMESTAMPS_PATTERN.matcher( + descriptionText); + + while (timestampsMatches.find()) { + final TimestampExtractor.TimestampMatchDTO timestampMatchDTO = + TimestampExtractor.getTimestampFromMatcher(timestampsMatches, descriptionText); + + if (timestampMatchDTO == null) { + continue; + } + + spannableDescription.setSpan( + new TimestampLongPressClickableSpan(context, descriptionText, disposables, + relatedInfoService, relatedStreamUrl, timestampMatchDTO), + timestampMatchDTO.timestampStart(), + timestampMatchDTO.timestampEnd(), + 0); + } + } + + private static void setTextViewCharSequence(@NonNull final TextView textView, + @Nullable final CharSequence charSequence, + @Nullable final Consumer onCompletion) { + textView.setText(charSequence); + textView.setVisibility(View.VISIBLE); + if (onCompletion != null) { + onCompletion.accept(textView); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java similarity index 78% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java rename to app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java index a13c66402d5..be603f41aa5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java @@ -1,4 +1,7 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,17 +18,18 @@ private TimestampExtractor() { } /** - * Get's a single timestamp from a matcher. + * Gets a single timestamp from a matcher. * - * @param timestampMatches The matcher which was created using {@link #TIMESTAMPS_PATTERN} - * @param baseText The text where the pattern was applied to / - * where the matcher is based upon - * @return If a match occurred: a {@link TimestampMatchDTO} filled with information.
- * If not null. + * @param timestampMatches the matcher which was created using {@link #TIMESTAMPS_PATTERN} + * @param baseText the text where the pattern was applied to / where the matcher is + * based upon + * @return if a match occurred, a {@link TimestampMatchDTO} filled with information, otherwise + * {@code null}. */ + @Nullable public static TimestampMatchDTO getTimestampFromMatcher( - final Matcher timestampMatches, - final String baseText) { + @NonNull final Matcher timestampMatches, + @NonNull final String baseText) { int timestampStart = timestampMatches.start(1); if (timestampStart == -1) { timestampStart = timestampMatches.start(2); diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java new file mode 100644 index 00000000000..f5864794a72 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java @@ -0,0 +1,78 @@ +package org.schabi.newpipe.util.text; + +import static org.schabi.newpipe.util.text.InternalUrlsHandler.playOnPopup; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.extractor.ServiceList; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.util.external_communication.ShareUtils; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +final class TimestampLongPressClickableSpan extends LongPressClickableSpan { + + @NonNull + private final Context context; + @NonNull + private final String descriptionText; + @NonNull + private final CompositeDisposable disposables; + @NonNull + private final StreamingService relatedInfoService; + @NonNull + private final String relatedStreamUrl; + @NonNull + private final TimestampExtractor.TimestampMatchDTO timestampMatchDTO; + + TimestampLongPressClickableSpan( + @NonNull final Context context, + @NonNull final String descriptionText, + @NonNull final CompositeDisposable disposables, + @NonNull final StreamingService relatedInfoService, + @NonNull final String relatedStreamUrl, + @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { + this.context = context; + this.descriptionText = descriptionText; + this.disposables = disposables; + this.relatedInfoService = relatedInfoService; + this.relatedStreamUrl = relatedStreamUrl; + this.timestampMatchDTO = timestampMatchDTO; + } + + @Override + public void onClick(@NonNull final View view) { + playOnPopup(context, relatedStreamUrl, relatedInfoService, + timestampMatchDTO.seconds(), disposables); + } + + @Override + public void onLongClick(@NonNull final View view) { + ShareUtils.copyToClipboard(context, getTimestampTextToCopy( + relatedInfoService, relatedStreamUrl, descriptionText, timestampMatchDTO)); + } + + @NonNull + private static String getTimestampTextToCopy( + @NonNull final StreamingService relatedInfoService, + @NonNull final String relatedStreamUrl, + @NonNull final String descriptionText, + @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { + // TODO: use extractor methods to get timestamps when this feature will be implemented in it + if (relatedInfoService == ServiceList.YouTube) { + return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds(); + } else if (relatedInfoService == ServiceList.SoundCloud + || relatedInfoService == ServiceList.MediaCCC) { + return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds(); + } else if (relatedInfoService == ServiceList.PeerTube) { + return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds(); + } + + // Return timestamp text for other services + return descriptionText.subSequence(timestampMatchDTO.timestampStart(), + timestampMatchDTO.timestampEnd()).toString(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java b/app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java new file mode 100644 index 00000000000..5c0db20a30b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java @@ -0,0 +1,38 @@ +package org.schabi.newpipe.util.text; + +import android.text.Layout; +import android.view.MotionEvent; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +public final class TouchUtils { + + private TouchUtils() { + } + + /** + * Get the character offset on the closest line to the position pressed by the user of a + * {@link TextView} from a {@link MotionEvent} which was fired on this {@link TextView}. + * + * @param textView the {@link TextView} on which the {@link MotionEvent} was fired + * @param event the {@link MotionEvent} which was fired + * @return the character offset on the closest line to the position pressed by the user + */ + public static int getOffsetForHorizontalLine(@NonNull final TextView textView, + @NonNull final MotionEvent event) { + + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= textView.getTotalPaddingLeft(); + y -= textView.getTotalPaddingTop(); + + x += textView.getScrollX(); + y += textView.getScrollY(); + + final Layout layout = textView.getLayout(); + final int line = layout.getLineForVertical(y); + return layout.getOffsetForHorizontal(line, x); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java new file mode 100644 index 00000000000..61c1a546d80 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java @@ -0,0 +1,41 @@ +package org.schabi.newpipe.util.text; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.util.external_communication.ShareUtils; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +final class UrlLongPressClickableSpan extends LongPressClickableSpan { + + @NonNull + private final Context context; + @NonNull + private final CompositeDisposable disposables; + @NonNull + private final String url; + + UrlLongPressClickableSpan(@NonNull final Context context, + @NonNull final CompositeDisposable disposables, + @NonNull final String url) { + this.context = context; + this.disposables = disposables; + this.url = url; + } + + @Override + public void onClick(@NonNull final View view) { + if (!InternalUrlsHandler.handleUrlDescriptionTimestamp( + disposables, context, url)) { + ShareUtils.openUrlInApp(context, url); + } + } + + @Override + public void onLongClick(@NonNull final View view) { + ShareUtils.copyToClipboard(context, url); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java b/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java index f79e1e3a3ff..91b5ebd07d7 100644 --- a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java +++ b/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java @@ -19,6 +19,9 @@ package org.schabi.newpipe.views; +import static org.schabi.newpipe.MainActivity.DEBUG; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.animation.ValueAnimator; import android.content.Context; import android.os.Parcelable; @@ -29,18 +32,15 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.evernote.android.state.State; +import com.livefront.bridge.Bridge; + import org.schabi.newpipe.ktx.ViewUtils; import java.lang.annotation.Retention; import java.util.ArrayList; import java.util.List; -import icepick.Icepick; -import icepick.State; - -import static java.lang.annotation.RetentionPolicy.SOURCE; -import static org.schabi.newpipe.MainActivity.DEBUG; - /** * A view that can be fully collapsed and expanded. */ @@ -207,12 +207,12 @@ public void removeListener(final StateListener listener) { @Nullable @Override public Parcelable onSaveInstanceState() { - return Icepick.saveInstanceState(this, super.onSaveInstanceState()); + return Bridge.saveInstanceState(this, super.onSaveInstanceState()); } @Override public void onRestoreInstanceState(final Parcelable state) { - super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state)); + super.onRestoreInstanceState(Bridge.restoreInstanceState(this, state)); ready(); } diff --git a/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java b/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java index 2adc28d0e5e..f0993055e70 100644 --- a/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java +++ b/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java @@ -13,9 +13,10 @@ /** * An {@link AppCompatEditText} which uses {@link ShareUtils#shareText(Context, String, String)} * when sharing selected text by using the {@code Share} command of the floating actions. + * *

- * This allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing text - * from {@link AppCompatEditText} on EMUI devices. + * This class allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing + * text from {@link AppCompatEditText} on EMUI devices. *

*/ public class NewPipeEditText extends AppCompatEditText { diff --git a/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java b/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java index 8fdac32db7e..dd3f20f404d 100644 --- a/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java +++ b/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.views; import android.content.Context; +import android.text.method.MovementMethod; import android.util.AttributeSet; import androidx.annotation.NonNull; @@ -13,9 +14,11 @@ /** * An {@link AppCompatTextView} which uses {@link ShareUtils#shareText(Context, String, String)} * when sharing selected text by using the {@code Share} command of the floating actions. + * *

- * This allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing text - * from {@link AppCompatTextView} on EMUI devices. + * This class allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing + * text from {@link AppCompatTextView} on EMUI devices and also to keep movement method set when a + * text change occurs, if the text cannot be selected and text links are clickable. *

*/ public class NewPipeTextView extends AppCompatTextView { @@ -34,6 +37,16 @@ public NewPipeTextView(@NonNull final Context context, super(context, attrs, defStyleAttr); } + @Override + public void setText(final CharSequence text, final BufferType type) { + // We need to set again the movement method after a text change because Android resets the + // movement method to the default one in the case where the text cannot be selected and + // text links are clickable (which is the default case in NewPipe). + final MovementMethod movementMethod = this.getMovementMethod(); + super.setText(text, type); + setMovementMethod(movementMethod); + } + @Override public boolean onTextContextMenuItem(final int id) { if (id == android.R.id.shareText) { diff --git a/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt b/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt index e3d14291694..8554e71943d 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt @@ -80,10 +80,10 @@ class CircleClipTapView(context: Context?, attrs: AttributeSet) : View(context, updatePathShape() } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - canvas?.clipPath(shapePath) - canvas?.drawPath(shapePath, backgroundPaint) + canvas.clipPath(shapePath) + canvas.drawPath(shapePath, backgroundPaint) } } diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt index d0782e1a18d..877070a916a 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -4,7 +4,6 @@ import android.content.Context import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater -import androidx.annotation.NonNull import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.END import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID @@ -127,7 +126,6 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : /** * Determines if the playback should forward/rewind or do nothing. */ - @NonNull fun getFastSeekDirection(portion: DisplayPortion): FastSeekDirection fun seek(forward: Boolean) 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..84e968b43bb 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java @@ -18,10 +18,10 @@ import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_FORBIDDEN; public class DownloadInitializer extends Thread { - private final static String TAG = "DownloadInitializer"; - final static int mId = 0; - private final static int RESERVE_SPACE_DEFAULT = 5 * 1024 * 1024;// 5 MiB - private final static int RESERVE_SPACE_MAXIMUM = 150 * 1024 * 1024;// 150 MiB + private static final String TAG = "DownloadInitializer"; + static final int mId = 0; + private static final int RESERVE_SPACE_DEFAULT = 5 * 1024 * 1024;// 5 MiB + private static final int RESERVE_SPACE_MAXIMUM = 150 * 1024 * 1024;// 150 MiB private final DownloadMission mMission; private HttpURLConnection mConn; @@ -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/io/CircularFileWriter.java b/app/src/main/java/us/shandian/giga/io/CircularFileWriter.java index dbceeb091d2..4473fa7f953 100644 --- a/app/src/main/java/us/shandian/giga/io/CircularFileWriter.java +++ b/app/src/main/java/us/shandian/giga/io/CircularFileWriter.java @@ -11,10 +11,10 @@ public class CircularFileWriter extends SharpStream { - private final static int QUEUE_BUFFER_SIZE = 8 * 1024;// 8 KiB - private final static int COPY_BUFFER_SIZE = 128 * 1024; // 128 KiB - private final static int NOTIFY_BYTES_INTERVAL = 64 * 1024;// 64 KiB - private final static int THRESHOLD_AUX_LENGTH = 15 * 1024 * 1024;// 15 MiB + private static final int QUEUE_BUFFER_SIZE = 8 * 1024;// 8 KiB + private static final int COPY_BUFFER_SIZE = 128 * 1024; // 128 KiB + private static final int NOTIFY_BYTES_INTERVAL = 64 * 1024;// 64 KiB + private static final int THRESHOLD_AUX_LENGTH = 15 * 1024 * 1024;// 15 MiB private final OffsetChecker callback; diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java index 7c248c2b66b..9b90fa14bbc 100644 --- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java @@ -30,9 +30,9 @@ public class DownloadManager { enum NetworkState {Unavailable, Operating, MeteredOperating} - public final static int SPECIAL_NOTHING = 0; - public final static int SPECIAL_PENDING = 1; - public final static int SPECIAL_FINISHED = 2; + public static final int SPECIAL_NOTHING = 0; + public static final int SPECIAL_PENDING = 1; + public static final int SPECIAL_FINISHED = 2; public static final String TAG_AUDIO = "audio"; public static final String TAG_VIDEO = "video"; 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 dc56ee20505..45211211f40 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -23,7 +23,6 @@ import android.os.Handler.Callback; import android.os.IBinder; import android.os.Message; -import android.os.Parcelable; import android.util.Log; import android.widget.Toast; @@ -33,8 +32,10 @@ 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.core.content.IntentCompat; import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; @@ -43,12 +44,12 @@ import org.schabi.newpipe.streams.io.StoredDirectoryHelper; import org.schabi.newpipe.streams.io.StoredFileHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PendingIntentCompat; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import us.shandian.giga.get.DownloadMission; import us.shandian.giga.get.MissionRecoveryInfo; @@ -146,7 +147,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); @@ -310,7 +311,7 @@ private void handleConnectivityState(boolean updateOnly) { } private void handlePreferenceChange(SharedPreferences prefs, @NonNull String key) { - if (key.equals(getString(R.string.downloads_maximum_retry))) { + if (getString(R.string.downloads_maximum_retry).equals(key)) { try { String value = prefs.getString(key, getString(R.string.downloads_maximum_retry_default)); mManager.mPrefMaxRetry = value == null ? 0 : Integer.parseInt(value); @@ -318,13 +319,13 @@ private void handlePreferenceChange(SharedPreferences prefs, @NonNull String key mManager.mPrefMaxRetry = 0; } mManager.updateMaximumAttempts(); - } else if (key.equals(getString(R.string.downloads_cross_network))) { + } else if (getString(R.string.downloads_cross_network).equals(key)) { mManager.mPrefMeteredDownloads = prefs.getBoolean(key, false); - } else if (key.equals(getString(R.string.downloads_queue_limit))) { + } else if (getString(R.string.downloads_queue_limit).equals(key)) { mManager.mPrefQueueLimit = prefs.getBoolean(key, true); - } else if (key.equals(getString(R.string.download_path_video_key))) { + } else if (getString(R.string.download_path_video_key).equals(key)) { mManager.mMainStorageVideo = loadMainVideoStorage(); - } else if (key.equals(getString(R.string.download_path_audio_key))) { + } else if (getString(R.string.download_path_audio_key).equals(key)) { mManager.mMainStorageAudio = loadMainAudioStorage(); } } @@ -359,29 +360,29 @@ public void updateForegroundState(boolean state) { */ public static void startMission(Context context, String[] urls, StoredFileHelper storage, char kind, int threads, String source, String psName, - String[] psArgs, long nearLength, MissionRecoveryInfo[] recoveryInfo) { - Intent intent = new Intent(context, DownloadManagerService.class); - intent.setAction(Intent.ACTION_RUN); - intent.putExtra(EXTRA_URLS, urls); - intent.putExtra(EXTRA_KIND, kind); - intent.putExtra(EXTRA_THREADS, threads); - intent.putExtra(EXTRA_SOURCE, source); - intent.putExtra(EXTRA_POSTPROCESSING_NAME, psName); - intent.putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs); - intent.putExtra(EXTRA_NEAR_LENGTH, nearLength); - intent.putExtra(EXTRA_RECOVERY_INFO, recoveryInfo); - - intent.putExtra(EXTRA_PARENT_PATH, storage.getParentUri()); - intent.putExtra(EXTRA_PATH, storage.getUri()); - intent.putExtra(EXTRA_STORAGE_TAG, storage.getTag()); + String[] psArgs, long nearLength, + ArrayList recoveryInfo) { + final Intent intent = new Intent(context, DownloadManagerService.class) + .setAction(Intent.ACTION_RUN) + .putExtra(EXTRA_URLS, urls) + .putExtra(EXTRA_KIND, kind) + .putExtra(EXTRA_THREADS, threads) + .putExtra(EXTRA_SOURCE, source) + .putExtra(EXTRA_POSTPROCESSING_NAME, psName) + .putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs) + .putExtra(EXTRA_NEAR_LENGTH, nearLength) + .putExtra(EXTRA_RECOVERY_INFO, recoveryInfo) + .putExtra(EXTRA_PARENT_PATH, storage.getParentUri()) + .putExtra(EXTRA_PATH, storage.getUri()) + .putExtra(EXTRA_STORAGE_TAG, storage.getTag()); context.startService(intent); } private void startMission(Intent intent) { String[] urls = intent.getStringArrayExtra(EXTRA_URLS); - Uri path = intent.getParcelableExtra(EXTRA_PATH); - Uri parentPath = intent.getParcelableExtra(EXTRA_PARENT_PATH); + Uri path = IntentCompat.getParcelableExtra(intent, EXTRA_PATH, Uri.class); + Uri parentPath = IntentCompat.getParcelableExtra(intent, EXTRA_PARENT_PATH, Uri.class); int threads = intent.getIntExtra(EXTRA_THREADS, 1); char kind = intent.getCharExtra(EXTRA_KIND, '?'); String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME); @@ -389,7 +390,9 @@ private void startMission(Intent intent) { String source = intent.getStringExtra(EXTRA_SOURCE); long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0); String tag = intent.getStringExtra(EXTRA_STORAGE_TAG); - Parcelable[] parcelRecovery = intent.getParcelableArrayExtra(EXTRA_RECOVERY_INFO); + final var recovery = IntentCompat.getParcelableArrayListExtra(intent, EXTRA_RECOVERY_INFO, + MissionRecoveryInfo.class); + Objects.requireNonNull(recovery); StoredFileHelper storage; try { @@ -404,15 +407,11 @@ private void startMission(Intent intent) { else ps = Postprocessing.getAlgorithm(psName, psArgs); - MissionRecoveryInfo[] recovery = new MissionRecoveryInfo[parcelRecovery.length]; - for (int i = 0; i < parcelRecovery.length; i++) - recovery[i] = (MissionRecoveryInfo) parcelRecovery[i]; - final DownloadMission mission = new DownloadMission(urls, storage, kind, ps); mission.threadCount = threads; mission.source = source; mission.nearLength = nearLength; - mission.recoveryInfo = recovery; + mission.recoveryInfo = recovery.toArray(new MissionRecoveryInfo[0]); if (ps != null) ps.setTemporalDir(DownloadManager.pickAvailableTemporalDir(this)); @@ -487,7 +486,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 bfb6a15e2cd..31e7f663de8 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 @@ -1,6 +1,5 @@ package us.shandian.giga.ui.adapter; -import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST; @@ -345,16 +344,7 @@ private void viewWithFileProvider(Mission mission) { intent.setDataAndType(resolveShareableUri(mission), mimeType); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION); - - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - intent.addFlags(FLAG_ACTIVITY_NEW_TASK); - } - - if (intent.resolveActivity(mContext.getPackageManager()) != null) { - ShareUtils.openIntentInApp(mContext, intent, false); - } else { - Toast.makeText(mContext, R.string.toast_no_player, Toast.LENGTH_LONG).show(); - } + ShareUtils.openIntentInApp(mContext, intent); } private void shareFile(Mission mission) { @@ -500,7 +490,7 @@ private void showError(@NonNull DownloadMission mission) { showError(mission, UserAction.DOWNLOAD_POSTPROCESSING, R.string.error_postprocessing_failed); return; case ERROR_INSUFFICIENT_STORAGE: - msg = R.string.error_insufficient_storage; + msg = R.string.error_insufficient_storage_left; break; case ERROR_UNKNOWN_EXCEPTION: if (mission.errObject != null) { @@ -548,7 +538,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..86a08c57f8a 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,10 @@ package us.shandian.giga.util; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; import android.os.Build; +import android.os.Environment; +import android.os.StatFs; import android.util.Log; -import android.widget.Toast; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; @@ -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-nodpi/placeholder_channel_banner.png b/app/src/main/res/drawable-nodpi/placeholder_channel_banner.png index 12e70bb6dae..cad11fa5041 100644 Binary files a/app/src/main/res/drawable-nodpi/placeholder_channel_banner.png and b/app/src/main/res/drawable-nodpi/placeholder_channel_banner.png 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_format_list_numbered.xml b/app/src/main/res/drawable/ic_format_list_numbered.xml deleted file mode 100644 index b11666c562c..00000000000 --- a/app/src/main/res/drawable/ic_format_list_numbered.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_menu_book.xml b/app/src/main/res/drawable/ic_menu_book.xml new file mode 100644 index 00000000000..4cd4fb3a4fe --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_book.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_subscriptions.xml b/app/src/main/res/drawable/ic_subscriptions.xml new file mode 100644 index 00000000000..f2ac7bec2dc --- /dev/null +++ b/app/src/main/res/drawable/ic_subscriptions.xml @@ -0,0 +1,10 @@ + + + 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-land/activity_player_queue_control.xml b/app/src/main/res/layout-land/activity_player_queue_control.xml index 7d3b43ecc34..a5df5e56629 100644 --- a/app/src/main/res/layout-land/activity_player_queue_control.xml +++ b/app/src/main/res/layout-land/activity_player_queue_control.xml @@ -123,7 +123,7 @@ android:scaleType="fitCenter" android:src="@drawable/exo_controls_rewind" android:tint="?attr/colorAccent" - tools:ignore="ContentDescription" /> + android:contentDescription="@string/rewind" /> + android:contentDescription="@string/pause" /> + android:contentDescription="@string/forward" /> + android:contentDescription="@string/previous_stream" /> + android:contentDescription="@string/notification_action_repeat" /> + android:contentDescription="@string/notification_action_shuffle" /> + android:contentDescription="@string/next_stream" /> diff --git a/app/src/main/res/layout-land/list_stream_card_item.xml b/app/src/main/res/layout-land/list_stream_card_item.xml new file mode 100644 index 00000000000..793942568e4 --- /dev/null +++ b/app/src/main/res/layout-land/list_stream_card_item.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + 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/channel_header.xml b/app/src/main/res/layout/channel_header.xml deleted file mode 100644 index 9d1304635d1..00000000000 --- a/app/src/main/res/layout/channel_header.xml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/comment_replies_header.xml b/app/src/main/res/layout/comment_replies_header.xml new file mode 100644 index 00000000000..ed5ba1a1084 --- /dev/null +++ b/app/src/main/res/layout/comment_replies_header.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_playlists.xml b/app/src/main/res/layout/dialog_playlists.xml index 18b08d93c81..ab4691fa944 100644 --- a/app/src/main/res/layout/dialog_playlists.xml +++ b/app/src/main/res/layout/dialog_playlists.xml @@ -34,11 +34,26 @@ tools:ignore="RtlHardcoded" /> + + diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml index 37bbf2b03d4..67aa1577c0c 100644 --- a/app/src/main/res/layout/download_dialog.xml +++ b/app/src/main/res/layout/download_dialog.xml @@ -71,11 +71,45 @@ android:minWidth="150dp" tools:listitem="@layout/stream_quality_item" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_channel.xml b/app/src/main/res/layout/fragment_channel.xml index 9e22575391d..f557e339696 100644 --- a/app/src/main/res/layout/fragment_channel.xml +++ b/app/src/main/res/layout/fragment_channel.xml @@ -1,80 +1,214 @@ - - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - - + + + + + android:layout_centerInParent="true" + android:indeterminate="true" + android:visibility="gone" + tools:visibility="visible" /> - - - - - - + android:layout_centerInParent="true" + android:orientation="vertical" + android:paddingTop="90dp" + android:visibility="gone" + tools:visibility="visible"> - + + + - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_channel_tab.xml b/app/src/main/res/layout/fragment_channel_tab.xml new file mode 100644 index 00000000000..62795c7da6d --- /dev/null +++ b/app/src/main/res/layout/fragment_channel_tab.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_channel_videos.xml b/app/src/main/res/layout/fragment_channel_videos.xml new file mode 100644 index 00000000000..77d14b020db --- /dev/null +++ b/app/src/main/res/layout/fragment_channel_videos.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml index b1b644d8c05..2a8c747cd63 100644 --- a/app/src/main/res/layout/fragment_comments.xml +++ b/app/src/main/res/layout/fragment_comments.xml @@ -9,7 +9,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" - tools:listitem="@layout/list_comments_item" /> + tools:listitem="@layout/list_comment_item" /> diff --git a/app/src/main/res/layout/fragment_kiosk.xml b/app/src/main/res/layout/fragment_kiosk.xml index 7e5385c16de..77ba9c26edd 100644 --- a/app/src/main/res/layout/fragment_kiosk.xml +++ b/app/src/main/res/layout/fragment_kiosk.xml @@ -42,6 +42,7 @@ tools:ignore="HardcodedText,UnusedAttribute" /> + tools:ignore="RtlHardcoded" /> @@ -616,7 +614,8 @@ android:gravity="center_vertical" android:paddingLeft="@dimen/video_item_search_padding" android:paddingRight="@dimen/video_item_search_padding" - android:scaleType="fitCenter" /> + android:scaleType="fitCenter" + tools:ignore="ContentDescription" /> + tools:ignore="RtlHardcoded" /> - - + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_channel_grid_item.xml b/app/src/main/res/layout/list_channel_grid_item.xml index 3112a849fb6..0aec4e6e06d 100644 --- a/app/src/main/res/layout/list_channel_grid_item.xml +++ b/app/src/main/res/layout/list_channel_grid_item.xml @@ -39,12 +39,24 @@ android:id="@+id/itemAdditionalDetails" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_below="@+id/itemTitleView" + android:layout_below="@id/itemTitleView" android:layout_centerHorizontal="true" android:lines="1" android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="@dimen/video_item_search_upload_date_text_size" tools:ignore="RtlHardcoded" - tools:text="10M subscribers" /> + tools:text="10M subscribers • 100 videos" /> + + diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comment_item.xml similarity index 62% rename from app/src/main/res/layout/list_comments_item.xml rename to app/src/main/res/layout/list_comment_item.xml index ad73c5ff43e..631ab204b3f 100644 --- a/app/src/main/res/layout/list_comments_item.xml +++ b/app/src/main/res/layout/list_comment_item.xml @@ -15,10 +15,8 @@ android:layout_width="42dp" android:layout_height="42dp" android:layout_alignParentStart="true" - android:layout_alignParentLeft="true" android:layout_alignParentTop="true" - android:layout_marginLeft="3dp" - android:layout_marginRight="@dimen/comment_item_avatar_right_margin" + android:layout_marginEnd="@dimen/comment_item_avatar_right_margin" android:focusable="false" android:src="@drawable/placeholder_person" app:shapeAppearance="@style/CircularImageView" @@ -29,83 +27,78 @@ android:layout_width="@dimen/video_item_detail_pinned_image_width" android:layout_height="@dimen/video_item_detail_pinned_image_height" android:layout_alignParentTop="true" - android:layout_marginRight="@dimen/video_item_detail_pinned_right_margin" + android:layout_marginEnd="@dimen/video_item_detail_pinned_right_margin" android:layout_toEndOf="@+id/itemThumbnailView" android:contentDescription="@string/detail_pinned_comment_view_description" - android:src="@drawable/ic_pin" - android:visibility="gone" - tools:visibility="visible" /> + android:src="@drawable/ic_pin" /> + tools:text="Author Name, Lorem ipsum • 5 months ago" /> - + tools:text="@tools:sample/lorem/random[1]" /> + android:src="@drawable/ic_heart" /> - + android:layout_alignParentEnd="true" + android:layout_marginStart="@dimen/video_item_detail_heart_margin" + android:minHeight="0dp" + tools:text="543 replies" /> diff --git a/app/src/main/res/layout/list_comments_mini_item.xml b/app/src/main/res/layout/list_comments_mini_item.xml deleted file mode 100644 index 606a237c5fc..00000000000 --- a/app/src/main/res/layout/list_comments_mini_item.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/list_playlist_bookmark_item.xml b/app/src/main/res/layout/list_playlist_bookmark_item.xml new file mode 100644 index 00000000000..10aa70837e9 --- /dev/null +++ b/app/src/main/res/layout/list_playlist_bookmark_item.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_playlist_card_item.xml b/app/src/main/res/layout/list_playlist_card_item.xml new file mode 100644 index 00000000000..c7dd4f17c5a --- /dev/null +++ b/app/src/main/res/layout/list_playlist_card_item.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_stream_card_item.xml b/app/src/main/res/layout/list_stream_card_item.xml new file mode 100644 index 00000000000..968dca08267 --- /dev/null +++ b/app/src/main/res/layout/list_stream_card_item.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_stream_playlist_card_item.xml b/app/src/main/res/layout/list_stream_playlist_card_item.xml new file mode 100644 index 00000000000..581a9d72e5a --- /dev/null +++ b/app/src/main/res/layout/list_stream_playlist_card_item.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/play_queue_item.xml b/app/src/main/res/layout/play_queue_item.xml index 2ad9d3e89bf..c6ba4aae790 100644 --- a/app/src/main/res/layout/play_queue_item.xml +++ b/app/src/main/res/layout/play_queue_item.xml @@ -39,6 +39,7 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="@color/duration_text_color" android:textSize="@dimen/video_item_search_duration_text_size" + android:contentDescription="@string/duration" app:layout_constraintBottom_toBottomOf="@+id/itemThumbnailView" app:layout_constraintEnd_toEndOf="@+id/itemThumbnailView" tools:text="1:09:10" /> diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 60cbcf7c46e..99b514bb090 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -115,7 +115,8 @@ android:src="@drawable/ic_close" android:visibility="gone" app:tint="@color/white" - tools:ignore="ContentDescription,RtlHardcoded" /> + android:contentDescription="@string/close" + tools:ignore="RtlHardcoded" /> + + + android:contentDescription="@string/open_play_queue" + tools:ignore="RtlHardcoded" /> + android:contentDescription="@string/chapters" + tools:ignore="RtlHardcoded" /> + android:contentDescription="@string/more_options" + tools:ignore="RtlHardcoded" /> @@ -352,9 +372,10 @@ android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitCenter" android:src="@drawable/ic_fullscreen" + android:contentDescription="@string/toggle_fullscreen" android:visibility="gone" app:tint="@color/white" - tools:ignore="ContentDescription,RtlHardcoded" + tools:ignore="RtlHardcoded" tools:visibility="visible" /> @@ -477,8 +498,9 @@ android:scaleType="fitCenter" android:src="@drawable/ic_fullscreen" android:visibility="gone" + android:contentDescription="@string/toggle_screen_orientation" app:tint="@color/white" - tools:ignore="ContentDescription,RtlHardcoded" + tools:ignore="RtlHardcoded" tools:visibility="visible" /> @@ -501,8 +523,8 @@ android:focusable="true" android:scaleType="fitCenter" android:src="@drawable/ic_previous" - app:tint="@color/white" - tools:ignore="ContentDescription" /> + android:contentDescription="@string/previous_stream" + app:tint="@color/white" /> + android:contentDescription="@string/pause" + app:tint="@color/white" /> + android:contentDescription="@string/next_stream" + app:tint="@color/white" /> @@ -579,7 +601,8 @@ android:scaleType="fitXY" android:src="@drawable/exo_controls_repeat_off" android:tint="?attr/colorAccent" - tools:ignore="ContentDescription,RtlHardcoded" /> + android:contentDescription="@string/notification_action_repeat" + tools:ignore="RtlHardcoded" /> + android:contentDescription="@string/notification_action_shuffle" + tools:ignore="RtlHardcoded" /> + android:contentDescription="@string/add_to_playlist" + tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/playlist_header.xml b/app/src/main/res/layout/playlist_header.xml index 9c038db3a66..c761240d978 100644 --- a/app/src/main/res/layout/playlist_header.xml +++ b/app/src/main/res/layout/playlist_header.xml @@ -80,10 +80,32 @@ tools:text="234 videos" /> + + + + + android:layout_below="@id/playlist_description_read_more"> - + android:id="@+id/summary" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:clickable="false" + android:focusable="false" + android:gravity="center" + android:text="@string/notification_actions_summary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + - + - + - + - + - + diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index 9e5cc862e57..2365c30e46a 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -5,19 +5,8 @@ - - + + + diff --git a/app/src/main/res/menu/menu_play_queue.xml b/app/src/main/res/menu/menu_play_queue.xml index e8c9ab0ec21..66825de7875 100644 --- a/app/src/main/res/menu/menu_play_queue.xml +++ b/app/src/main/res/menu/menu_play_queue.xml @@ -18,6 +18,14 @@ android:visible="true" app:showAsAction="ifRoom" /> + + + + diff --git a/app/src/main/res/values-aeb/strings.xml b/app/src/main/res/values-aeb/strings.xml new file mode 100644 index 00000000000..a6b3daec935 --- /dev/null +++ b/app/src/main/res/values-aeb/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ar-rLY/strings.xml b/app/src/main/res/values-ar-rLY/strings.xml index 1fd5b15c979..077cf1106ca 100644 --- a/app/src/main/res/values-ar-rLY/strings.xml +++ b/app/src/main/res/values-ar-rLY/strings.xml @@ -2,17 +2,860 @@ استخدم مشغل فيديو خارجي مشاركة مع - اعدادات + الإعدادات بحث تنزيل ملف البث - تحميل - مشاركه + تنزيل + إعادة النشر فتح في نافدة منبثقة افتح في المتصفح إلغاء تثبيت - لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله). + لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيلها). لم يتم العثور على مشغل بث. يرجى تثبيت VLC؟ تم النشر في %1$s - انقر على \"بحث\" للبدء + اضغط على عدسة المكبرة للبدء. + جودة الصورة + لا تتوفر تدفقات فيديو للاعبين الخارجيين + تعطيل تحديد النص في الوصف + + لم يتم حذف أي تنزيل + تم حذف تنزيل واحد + تم حذف تنزيلَيْن + تم حذف %1$s تنزيلات + تم حذف %1$s تنزيلاً + تم حذف %1$s تنزيل + + زر الإجراء الثاني + الافتراضي + الفيديوهات + إلغاء + تطبيق مجاني خفيف البث على أندرويد. + التاريخ + إيقاف التحميل مؤقتًا + قم بقص الصورة المصغرة للفيديو الموضحة في الإشعار من نسبة العرض إلى الارتفاع 16: 9 إلى 1: 1 + التحديثات + تعليق مثبت + إزالة ما تمت مشاهدته + استرد + قم بتشغيل \"وضع تقييد المحتوى\" في يوتيوب + + لا ساعة + ساعة واحدة + ساعتان + %d ساعات + %d ساعة + %d ساعة + + حذف سجل المشاهدة بالكامل؟ + تشغيل بواسطة كودي + تم حذف عنصر واحد. + ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. +\n +\nهل تريد الاستمرار؟ + إغلاق + يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. +\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. + + لاشيء مُحدّد + واحدة محددة + إثنتان محدَّدتان + %d محددة + %d محددة + %d محددة + + لا يوجد بث متاح للتنزيل + هل تريد استعادة الإعدادات الافتراضية؟ + تحميل المحتوى المطلوب + إضافة نموذج + تراخيص الجهات الخارجية + حذف كل مواقف التشغيل + عن التطبيق والأسئلة الشائعة + استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط + الملفات المحملة + لا يوجد مثل هذا الملف/مصدر المحتوى + الأكثر إعجابًا + بليون + تعذر تحميل موجز \'%s\'. + ؟ + التحقق من وجود تحديثات + مثيلات خوادم پيرتيوب + +100 فيديو + ألف + مثيل الخادم موجود بالفعل + طلب تأكيد قبل مسح قائمة الانتظار + المشتركون + تمت مشاهدتها جزئيا + إضافة إلى + رابط غير مدعوم + تبرَّع + الحصول على إشعار + إذاعة + + لا تنزيل اكتَمَل + اكتَمَل تنزيل واحد + تنزيلان اكتَمَلَا + %s تنزيلات اكتَمَلت + %s تنزيلًا اكتَمَل + %s تنزيل اكتَمَل + + سرعة الأداء + إزالة الإشارة المرجعية + تم إنشاء قائمة التشغيل + وحدة التخزين الخارجية غير متوفرة + عرض المعلومات + الشائعة + تم إلغاء الاشتراك في القناة + تخزين طلبات البحث محليًّا + تلوين الإشعارات + توليد تلقائي + لا يمكن التحقق من صحة المثال + عرض خيار التشغيل بواسطة كودي + الوضع السريع + إظهار الموجزات التالية + معظم الأحرف الخاصة + إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا + محو سجل البحث + إظهار تفاصيل القناة + + لا مُشاهِد + مُشاهِد واحد + مُشاهِدان + %s مُشاهِدين + %s مُشاهِدًا + %s مُشاهِد + + عرض تلميح عند الضغط على زر استخدام المشغل الخلفي أو النافذة المنبثقة في صفحة تفاصيل الفديو + نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا + انتهى وقت الاتصال + غير معروف + تشغيل تلقائي + الإجراء الافتراضي عند فتح المحتوى — %s + إعدادات الصوت + إشعارات أحداث البث الجديدة + الحد الأقصى لعدد المحاولات قبل إلغاء التحميل + تفضيل قائمة التشغيل + الألسنة التي سيتم عرضها على صفحات القناة + إزالة التكرارات؟ + تعليقك (باللغة الإنجليزية): + تصدير إلى + حساب التجزئة + إظهار/إخفاء الموجزات + مِن الأفضل فتحه بـ + الخصوصيّة + لا يمكن الكتابة فوق الملف + الفيديوهات + اسحب لإعادة ترتيب + إظهار \"تعطل المشغل\" + يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد. + تم وضع التالي على قائمة الانتظار + اسحب العناصر لإزالتها + معلومات: + حساب منشئ المحتوى قد تم إنهائه. +\nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل. +\nهل تريد إلغاء الاشتراك من هذه القناة؟ + تصغير إلى مشغل منبثق + تم إغلاق NewPipe أثناء العمل على الملف + مشغل الخلفية + وصفي + تذكر خصائص النوافذ المنبثقة + الإبلاغ عن طريق البريد الإلكتروني + عذرًا، لم ينبغِ أن يحدث ذلك. + إنشاء قائمة تشغيل جديدة + حدث خطأٌ ما: %1$s + لم يتم العثور على نتائج + فتح الموقع + + لا موجَزات + موجَز واحد + موجَزان + %s موجَزات + %s موجَزًا + %s موجز + + وضع الجهاز اللوحي + تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟ + تم مسح ملفات تعريف الارتباط reCAPTCHA + التفاصيل + تشغيل قائمة الانتظار + تعيين كصورة مصغرة لقائمة التشغيل + العدد الأقصى للمحاولات + عذرًا، حدث خطأ ما. + عرض على GitHub + التفاصيل: + تردد الصوت + هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). +\n +\nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: +\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. +\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل. +\n +\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. +\n +\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. +\n +\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. + تم حذف الملف + تنزيل + صفحة القناة + تصدير السجل، وقوائم تشغيل، والإعدادات، والاشتراكات + هل تريد حذف قائمة التشغيل هذه؟ + اللغة الإفتراضية للمحتوى + جاري المعالجة ... قد يستغرق لحظة + قراءة الرخصة + ألسنة القنوات + معاينة مصغرة على شريط التمرير + ما الجديد + آخر تحديث للموجز: %s + الخطأ + زر الإجراء الخامس + جديد وساخن + استعمال التقديم السريع الغير دقيق + التنزيل + امنح الإذن بالعرض فوق التطبيقات الأخرى + داخلي + مستوى الصوت + إزالة التكرارات + تبديل الكل + فشلت المعالجة الاولية + انقر للحصول على التفاصيل + اختر الاقتراحات التي تريد إظهارها عند البحث + إنشاء + الحروف والأرقام + هل تقصد \"%1$s\"؟ + عناصر الموجز الجديدة + المميزة + عرض المحتوى الذي يُحتمل أن يكون غير مناسب للأطفال لأن له حدًا عمريًا (مثل 18+) + بدأ التشغيل في الخلفية + ستتغير اللغة بمجرد إعادة تشغيل التطبيق + القصيرة + قوائم التشغيل + تنظيف + اختيار مثيل + كلها + مجموعات القنوات + جارٍ معالجة الموجز… + + لا فيديو + فيديو واحد + فيديوهاتان + %s فيديوهات + %s فيديوهات + %s فيديو + + جودة منخفضة (أصغر) + إظهار خطأ + عرض دقّات أعلى + تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. + تمت إضافتها إلى قائمة التشغيل + + اليوم + منذ يوم واحد + منذ يومَين + منذ %d أيام + منذ %d يومًا + منذ %d يوم + + تقرير على GitHub + أسود + بث جديد + معرفك, soundcloud.com/هويتك + ضغط مطول للإدراج الى قائمة الانتظار + خاص + اغلق التطبيق قسريا + تعذر استيراد الاشتراكات + إيقاف مؤقت + تعذر تحميل التعليقات + اقتراحات البحث عن بعد + استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer + يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا) + تعطل التطبيق / واجهة المستخدم + إعادة التسمية + لم يتبقى مساحة في الجهاز + تعذر إعداد قائمة التنزيل + اختر مجلد التنزيل لملفات الفيديو + تم تعطيل الإشعارات + هل تريد حذف هذه المجموعة؟ + المظهر + تشغيل + يحذف تاريخ البحث عن الكلمات الرئيسية + التنبيهات المتعلقة بالإبلاغ عن الأخطاء + نسخة احتياطية + حدث خطأ للمشغل غير قابل للاسترداد + زر الإجراء الرابع + القادمة + [غير معروف] + الحُلّة الليلية + داكن + المحتوى الإفتراضي حسب البلد + رافع الصورة الرمزية المصغرة + بدون + استمر عند إنهاء قائمة التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط + ملء الشاشة + لم يُختر أي اشتراك + + لا مشارك + مٌشارِك واحد + مُشارِكان + %s مشارِكين + %s مشارِكون + %s مشارك + + جلب البيانات الوصفية… + إظهار مؤشرات الصور + انقر للتنزيل %s + تعطيل الوضع السريع + , + صفحة قائمة التشغيل + تبديل تدوير الشاشة + تحديث NewPipe متاح! + تم حذف سجل البحث + قم بإيقاف التشغيل لإخفاء مربعات المعلومات الوصفية بمعلومات إضافية حول منشئ البث أو محتوى البث أو طلب البحث + إشعارات لتقدم تجزئة الفيديو + تحطيم المشغل + الصوت + بدء التنزيلات + مشترك + لا يمكن إنشاء المجلد الوجهة + يتم تخزين الملفات الصوتية التي تم تنزيلها هنا + لا شيء + الإطلاع على سياسة الخصوصية + يوفر YouTube \"وضع تقييد المحتوى\" الذي يخفي المحتوى المحتمل للكبار + عطّله لإخفاء التعليقات + واجه NewPipe خطأ، اضغط للتقرير + الكشك الافتراضي + اقتراحات البحث + تسريع إلى الأمام أثناء الصمت + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول + تمت إضافة وقت (أوقات) مكررة %d + فقط بعض الأجهزة تدعم تشغيل مقاطع فيديو 2K/4K + استيراد قاعدة البيانات + جودة منخفضة + موضع الألسنة الرئيسية + استخدم مشغل صوت خارجي + تعذر تغيير حالة الاشتراك + أحذف + فصول + استخدام منتقي مجلد النظام (SAF) + متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة) + اجعل أندرويد يخصص لون الإشعار وفقا للّون الرئيسي في الصورة المصغرة (لاحظ أن هذا غير متوفر على جميع الأجهزة) + يتم التشغيل في الخلفية + الخادم لا يقوم بإرسال البيانات + سياسة خصوصية NewPipe + طلب اختبار الكابتشا مطلوب + إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! + التحميلات + هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟ + قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات + تم فقد التقدم بسبب حذف الملف + التسمية + الانتقال إلى وضع ملئ الشاشة + لا يمكن الاتصال بالخادم + إظهار تسرب الذاكرة + + صفر ثانية + ثانية واحدة + ثانيتان + %d ثوانٍ + %d ثانية + %d ثانية + + سيتم سؤالك عن مكان حفظ كل تنزيل. +\nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية + استئناف التشغيل + جودة غير معروفة + هذا المحتوى غير متوفر في بلدك. + خطأ في الشبكة + محتوى الشاشة الرئيسية + إيقاف + الوسوم + المضيف + ابحث عن مثيلات الخوادم التي تناسبك على %s + مطلوب اتصال الشبكة + تشغيل التحقق من وجود تدفقات جديدة + دون مشاهدات + بدأ التشغيل في نافذة منبثقة + قائمة انتظار تلقائيّة + غير محمل: %d + قائمة الانتظار + هذا الفيديو مقيد بالفئة العمرية. +\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. + إضافة إلى قائمة التشغيل + القنوات + لا تظهر + أدخل عنوان للمثيل + ماذا:\\nطلب:\\nلغة المحتوى:\\nبلد المحتوى:\\nلغة التطبيق:\\nالخدمات:\\nتوقيت جرينتش:\\nالحزمة:\\nالإصدار:\\nOS نسخة: + يزيل الصوت في بعض الجودات + جلب ألسنة القنوات + جودة عالية (أكبر) + أسئلة مكررة + لم يتم تعيين مجلد التحميل، الرجاء اختيار مجلد التحميل الافتراضي الآن + عتبة تحديث الموجز + يمكنك اختيار نسقك الليلي المفضل أدناه + أنت تقوم بتشغيل أحدث إصدار من NewPipe + احذف + رفض + ابدأ + تحليل + إظهار الوصف + مرة واحدة فقط + الصور الرمزية + معدل البحث + قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية + تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة + وضع علامة تمت مشاهدته + اجراء الإيماءة اليمنى + الرموز المسموح بها في أسماء الملفات + %1$s %2$s + آخر ما تم تشغيله + استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + البث التالي + تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. + الصور الرمزية للقناة الفرعية + بث مباشر + هل تريد أيضا استيراد الإعدادات؟ + امسح البيانات الوصفيّة المخزّنة مؤقّتًا + حذف الملفات المحملة + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث +\n +\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة + موافق + تتبّع مقاطع الفيديو التي تمّت مشاهدتها + لم يتم العثور على أي بث صوتي + تم تغيير الصورة المصغرة لقائمة التشغيل. + توقف + فاتح + التاريخ + تشغيل في وضع منبثق + كتم الصوت + هذا الإذن مطلوب +\nللفتح في وضع النافذة المنبثقة + الموجز + ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. +\nهل أنت واثق؟ لا يمكن التراجع عن هذا! + عدم الإعجاب + مشاهدة على الموقع + هذا الخيار متاح فقط إذا تم تحديد %s للسمة + إعادة المحاولة + المشغل + الفنانين + بدأ التنزيل + يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث + هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. + الدقة الافتراضية للنوافذ المنبثقة + تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور + إشعار الإبلاغ عن الأخطاء + لغة التطبيق + تحميل الموجز… + التحقق يدويا من وجود إصدارات جديدة + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. +\nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين + إظهار خيار تعطل عند استخدام المشغل + يرجى مراجعة ما إذا توجد بالفعل مشكلة تناقش التحطم الموجود بالفعل. عند إنشاء تذاكر مكررة، فإنك تستغرق منا وقتًا يمكن أن نقضيه في إصلاح الخطأ الفعلي. + فتح قائمة انتظار التسغيل + قم بتحرير كل إشعار أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها لتظهر في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين + ماذا حدث: + ترجمات نصية توضيحية + الصورة الرمزية للقناة + جلب من موجز مخصص عندما يكون متاحًا + لا يمكن أن يكون اسم الملف فارغًا + حدد المسار الصوتي الأصلي بغض النظر عن اللغة + الإشعارات + الفيديو والصوت + جديد + إزالة مقاطع الفيديو التي تمت مشاهدتها؟ + الالبومات + المسارات + حدد مثيلات PeerTube المفضلة لديك + إشعار المشغل + خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق + متوقف + نافذة منبثقة + قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: +\n +\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) +\n2. انتقل إلى عنوان URL هذا: %1$s +\n3. تسجيل الدخول عندما يطلب منك +\n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. + اختر قائمة تشغيل + الحد العمري + لا يوجد تطبيق على جهازك يمكنه فتح هذا + يُرجى الإنتظار… + تبديل الخدمة، المحدد حاليًا: + سجل المشاهدة + لا تقم بتحميل الصور + الإخطار بأحداث البث الجديدة من الاشتراكات + اسم الملف + الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود + عرض مقاطع الفيديو \"التالية\" و \"المشابهة\" + الوقت بعد التحديث الأخير قبل اعتبار الاشتراك قديمًا — %s + استرداد المشغل من الخطأ + عالية الجودة + حدد الجودة للمشغلين الخارجيين + أُعجب بها منشئ المحتوى + عن + عرض نتائج ل: %s + افتح باستخدام + هل تريد حذف هذا العنصر من سجل البحث؟ + الأكثر تشغيلا + عرض الوقت الأصلي على العناصر + استعادة مِن + الدقة الافتراضية + استئناف التشغيل + تقديم المحتوى + قد يؤدي التبديل من مشغل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك + يتم تخزين ملفات الفيديو التي تم تنزيلها هنا + إشعار تجزئة الفيديو + حدد مسار الصوت للمشغلات الخارجية + استخدم الصورة المصغرة لكل من خلفية شاشة القفل والإشعارات + تراجع + تنسيق غير معروف + الألبومات + لا توجد تدفقات صوتية متاحة للمشغلات الخارجية + محلي + إعادة المحتوى + سيميتون + إعادة التشغيل + يوجد ملف بهذا الاسم مسبقاً + قم بإيقاف التشغيل لإخفاء وصف الفيديو والمعلومات الإضافية + صيغة الفيديو الافتراضية + زر الإجراء الثالث + لا يمكن التنزيل على بطاقة SD الخارجية. هل تريد إعادة تعيين موقع مجلد التنزيل؟ + تعذر تحميل كافة الصور المصغرة + التيارات ذات الصلة + لا يمكن استرداد هذا التنزيل + إظهار الاشتراكات غير المجمعة فقط + حذف محفوظات البثوث التي تم تشغيلها ومواقف التشغيل + في قائمة الانتظار + تمكين الوضع السريع + مدبلجة + اقتراحات البحث المحلية + اقتصاص الصورة المصغرة إلى نسبة العرض إلى الارتفاع 1:1 + تم تعطيل التعليقات + موقع الويب + سجل البحث + فتح الدرج + ∞ فيديو + الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1 + إعادة تعيين + تذكر آخر مكان وحجم للنافذة المنبثقة + تمت عملية التصدير + تعذر تحليل الموقع + الألسنة التي سيتم جلبها عند تحديث الموجز. ليس لهذا الخيار أي تأثير إذا تم تحديث القناة باستخدام الوضع السريع. + قم بإنشاء تنبيه بالخطأ + إشعارات لإصدار NewPipe الجديد + استعادة الضبط الافتراضي + المقاطعة على الشبكات المقيسة + هذا سوف يُزيل إعداداتك الحالية. + + لا مشاهدة + مشاهدة واحدة + مُشاهَدتان + %s مُشاهَدات + %s مُشاهَدةً + %s مُشاهَدة + + إستيراد + الأحداث + حذف مواقف التشغيل + زر الإجراء الأول + لاشيء + تلقائي (سمة الجهاز) + يتم الآن استخدام الألسنة الافتراضية بعد حدوث خطأ أثناء قراءة الألسنة المحفوظة + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول + المحتوى غير متوفر + دائماً + حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا + لا حدود + مدة, تشغيل الفيديو: + محو سجل المشاهدة + إجراء الإيماءة اليسرى + لاتوجد فيديوهات + تنبيهات NewPipe + محو جميع الملفات التي تم تنزيلها من القرص؟ + اضغط على \"تم\" عند حلها + لا أحد يستمع + تكرار + إضافة إلى قائمة الانتظار + يقوم نيوبايب بالتنزيل + النوعية متوسطة + يسمح \"Storage Access Framework\" بالتنزيل على بطاقة SD خارجية + تنبيه: تعذر استيراد كافة الملفات. + مجلد الصوتيات المحفوظة + الإشارات المرجعية + حذف كل مواقف التشغيل؟ + تفضل الصوت الوصفي + خلط + بدء التشغيل تلقائياً — %s + إغلاق الدرج + هذا المحتوى ليس مدعومًا من قبل NewPipe. +\n +\nنأمل أن يكون مدعومًا في التحديثات القادمة. + + لا دقيقة + دقيقة واحدة + دقيقتان + %d دقائق + %d دقيقة + %d دقيقة + + المشغل المنبثق + الصورة الرمزية للرفع + التوقيع + محتوى مقيد للبالغين + متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية) + عملية الاستعادة جارية … + قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي + تفضيل الصوت الأصلي + الإعجابات + خطأ + اختر مجلد التنزيل للملفات الصوتية + استيراد اشتراكات YouTube من Google takeout: +\n +\n1. انتقل إلى عنوان URL هذا: %1$s +\n2. تسجيل الدخول عند سؤالك +\n3. انقر على \"جميع البيانات المدرجة\"، ثم على \"إلغاء تحديد جميع\"، ثم حدد فقط \"الاشتراكات\" وانقر على \"موافق\" +\n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء التصدير\" +\n5. انقر على زر \"تحميل\" بعد ظهوره +\n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها +\n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج + جارٍ التحميل + هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. + فقط على شبكة Wi-Fi + إظهار الصورة المصغرة + ضوابط سرعة التشغيل + رد الجميل + تم حذف سجل المشاهدة + سجل المشاهَدة و ذاكرة التخزين المؤقتة + النسبة المئوية + تحدي الكابتشا + ليس هناك مشترِكون + يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe. + حديثة + تعذر تحديث الاشتراك + سيتم استبدال قائمة انتظار للمشغل النشط + التقسيم + اشتراك + أنشأها %s + الحرف الإستبدالي + وضع مظهر ”عرض القائمة“ + بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة + تصغير عند تبديل التطبيق + الصوت : %s + خطوة + حل + %s يقدم هذا السبب: + الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون + عن تطبيق نيوپايپ + تسريع إلى الأمام/-ترجيع وقت البحث + تم رفضها من قبل النظام + ليس هناك تعليقات + مليون + جاري التحقق من وجود تحديثات… + المحتوى + اسأل عن مكان التنزيل + معطل + خطأ في تحميل الخلاصة + الإخطارات حول التدفقات الجديدة للاشتراكات + لا توجد مشاهدة + الإنتقال إلى التشغيل في الخلفية + المستخدمين + القائمة + لا يمكن تشغيل هذا البث + امسح ملفات تعريف الارتباط reCAPTCHA + اللافتات + ساهم + الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s + قوائم التشغيل + عامة + قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو. + يوجد ملف تحميل بهذا الاسم موجود مسبقاً + تلقائي + هل تريد محو سجل التنزيل، أم تريد حذف جميع الملفات التي تم تنزيلها؟ + أفضل دقة + فرز + الشبكة + استعادة آخر موقف تشغيل + تم إنهاء الحساب + اختر إيماءة للنصف الأيمن من شاشة المشغل + الحصول على المعلومات… + الكتابة فوق + نقل الملف أو حذفه + الأغاني + تطبيق Kore غير موجود. هل تريد تثبيته؟ + هنالك تحميل قيد التقدم بهذا الاسم + الإنتقال إلى الرئيسية + صيغة الصوت الافتراضية + حدث خطأ، انظر للإشعار + الفيديو + مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات + انقل محدد اللسان الرئيسي إلى الأسفل + LeakCanary غير متوفر + عدد المشتركين غير متاح + حدد الاشتراكات + الاشتراكات + NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث. + اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi + قيد المعالجة + إعادة تسمية + لا يمكن إنشاء الملف + حد قائمة انتظار التنزيل + أي شبكة + فشل التنزيل + الافتراضي ExoPlayer + تنظيف تاريخ التحميل + هناك تنزيل معلق بهذا الاسم + انتهى + أُضيف مؤخرًا + يتم استبدال الرموز غير المسموح بها بهذه القيمة + لا شيء هنا سوى الصراصير + مُنشأة تلقائيًا (لم يتم العثور على رافع) + المسار الصوتي + مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة + المشغل الخارجي لا يدعم هذه الأنواع من الروابط + ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث + الإنتقال إلى التشغيل في النافذة المنبثقة + تعذر العثور على الخادم + تقرير الأخطاء خارج دورة الحياة + البطاقة + حدد كشك + لا يوفر وضع الموجز السريع مزيدًا من المعلومات حول هذا الموضوع. + يرجى تحديد مجلد التنزيل لاحقا في الإعدادات + سيتم سؤالك عن مكان حفظ كل تنزيل + لاتوجد بثوث مباشرة + صفحة فارغة + أبدا + فشل النسخ إلى الحافظة + من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. +\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. + فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها + ضبط إشعار مشغل البث الحالي + تصدير قاعدة البيانات + إلغاء تعيين الصورة المصغرة الدائمة + تعليقات + تكبير + الصنف + تناسب مع الشاشة + إظهار مؤشّرات وضع التشغيل في القوائم + اختر جودة الصور وما إذا كنت تريد تحميل الصور على الإطلاق، لتقليل استخدام البيانات والذاكرة. تؤدي التغييرات إلى مسح ذاكرة التخزين المؤقت للصور الموجودة في الذاكرة وعلى القرص — %s + حجم الفاصل الزمني لتحميل التشغيل + حذف سِجل البحث بالكامل؟ + اللغة + السلوك + لا يوجد مثل هذا المجلد + شغِّل + إلغاء الإرتباط (قد يسبب تشويه) + امسح البيانات + لا توجد إشارات مرجعية لقائمة التشغيل بعدُ + يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. + إظهار التعليقات + تم نسخه إلى الحافظة + المزيد من الخيارات + وضع البث القادم تلقائيا في قائمة الإنتظار + الدعم + ملف مضغوط ZIP غير صالح + غير موجود + حدد موضوعك الليلي المفضل — %s + صفحة الكشك + + لا مُستمِع + مُستَمِع واحد + مُستمِعان + %s مُستَمِعين + %s مُستَمِعًا + %s مستمع + + غير مدرج + المؤتمرات + إستيراد ملف + إظهار خطأ snackbar + قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات. + لم يتم الاشتراك في أي قناة بعد + لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة + تراخيص NewPipe + تحديث دائمًا + التراخيص + عملية التصدير جارية … + تصغير إلى مشغل الخلفية + تنبيهات مشغل NewPipe + تمَّت عملية الإستيراد + الصور المصغرة + تحميل تفاصيل البث… + إظهار تلميح \"اضغط للفتح\" + الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول + سيتم تشغيل تنزيل واحد في نفس الوقت + قبول + إعدادات ExoPlayer + تنبيه تحديث التطبيق + غير صامت + امسح ملفات تعريف الارتباط التي يخزنها NewPipe عند حل reCAPTCHA + نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية + أفضل ٥٠ + السطوع + تمكين تحديد نص في الوصف + شاهَدتَها بالكامل + بدون ترجمات نصية توضيحية + المواضع في القوائم + الملف + التحديثات + النظام الافتراضي + لا يتم عرض التدفقات التي لم يدعمها برنامج التنزيل بعد + لم يتم العثور على أي بث مرئي + وضع التالي على قائمة الانتظار + إظهار معلومات التعريف + اختر قناة + © %1$sبواسطة%2$sتحت%3$s + تعطيل نفق الوسائط + المسارات + اسم المجموعة فارغ + يتم دعم عناوين URL HTTPS فقط + المدة + لا يمكن تصدير الاشتراكات + لاتوجد بثوث + يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط! + إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! + اختار الألسنة التي تودّ ظهورها على الصفحة الرئيسية + مجلد تحميل الفيديو + هذا الفيديو مقيد بالفئة العمرية. +\n +\nقم بتفيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. + تجاهل أحداث ازرار الوسائط الأجهزة + اختر لسانًا + الصوت + تم حذف كل مواقف التشغيل + في الخلفية + القنوات + الرخصة + إلغاء الاشتراك + لقد اشتركت الآن في هذه القناة + بدءًا من Android 10، يتم دعم \"Storage Access Framework\" فقط + إنشاء اسم فريد + أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة + فشل الاتصال الآمن + يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. + البث السابق + تشغيل الكل + السمة + أبلِغ + اختر إيماءة للنصف الأيسر من شاشة المشغل + نسخ التقرير مُنسق + مباشر + إظهار تنبيه للمطالبة بتحديث التطبيق عندما يتوفر إصدار جديد + السؤال دائماً + منجز + تقرير عن المشكلة + أُضيفَ إلى قائمة الانتظار + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. +\nيرجى تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل + مشغل الفيديو + بواسطة %s + وصف + ريثما + شارك الرابط التشعبي للقائمة + شارِكها بالترجمات النصية + %1$s +\n%2$s + شارِك قائمة التشغيل + شارِك قائمة التشغيل بتفاصيليها مثل اسم قائمة التشغيل وعناوين الفيديو أو كقائمة بسيطة من عناوين تشعّبيّة للفيديوهات + - %1$s: %2$s \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d7bbcd9c0fd..3a6a567dbfd 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -18,11 +18,11 @@ اختر مجلد التنزيل لملفات الفيديو يتم تخزين ملفات الفيديو التي تم تنزيلها هنا مجلد تحميل الفيديو - تثبيت + ثبت تطبيق Kore غير موجود. هل تريد تثبيته؟ فاتح خطأ في الشبكة - لم يتم العثور على مشغل بث. تثبيت VLC؟ + لم يتم العثور على مشغل بث. تود تثبيت VLC؟ فتح في متصفح الويب الصوت تشغيل بواسطة كودي @@ -37,7 +37,7 @@ اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi عرض خيار التشغيل بواسطة كودي السمة - تم النشر بتاريخ %1$s + تم النشر في %1$s رابط غير مدعوم استخدام مشغل صوت خارجي استخدام مشغل فيديو خارجي @@ -45,7 +45,6 @@ تعذر تحميل كافة الصور المصغرة خطأ تعذر تحليل الموقع - تعذر فك تشفير توقيع رابط الفيديو اضغط على العدسة المكبرة للبدء. اشتراك مشترك @@ -64,7 +63,7 @@ حول التطبيق & الأسئلة الشائعة التاريخ التاريخ - فتح في وضع منبثق + فتح في الوضع المنبثق يزيل الصوت في بعض الجودات تم إلغاء الاشتراك في القناة تعذر تغيير حالة الاشتراك @@ -91,7 +90,7 @@ محتوى مقيد للبالغين بث مباشر تقرير عن المشكلة - متوقف + معطل تنظيف أفضل دقة تراجع @@ -105,7 +104,7 @@ حدث خطأ للمشغل غير قابل للاسترداد استرداد المشغل من الخطأ عذرًا، لم ينبغِ أن يحدث ذلك. - الإبلاغ عن هذا الخطأ عبر البريد الإلكتروني + الإبلاغ عن طريق البريد الإلكتروني عذرًا، حدث خطأ ما. أبلِغ معلومات: @@ -122,20 +121,20 @@ بليون ليس هناك مشترِكون - %s مشترك - %s l مشاركين - %s مشتركين - %s مشتركين - %s مشتركين - %s مشتركين + %s مشارك + %s مشارك + %s مشاركين + %s مشترك + %s مشترك + %s مشترك دون مشاهدات لاتوجد فيديوهات ابدأ إيقاف مؤقت - حذف + احذف التوقيع - حسناً + موافق اسم الملف التقسيم الخطأ @@ -158,9 +157,9 @@ ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! عرض على GitHub - تبرع + تبرَّع يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. - تبرع + رد الجميل موقع الويب قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات. تراخيص NewPipe @@ -174,7 +173,7 @@ الشائعة أفضل ٥٠ جديد وساخن - حذف + أحذف التفاصيل إعدادات الصوت بدأ التشغيل في نافذة منبثقة @@ -182,7 +181,7 @@ ضغط مطول للإدراج الى قائمة الانتظار %s مشاهد - %s مشاهدة + %s مشاهد %s مشاهدة %s مشاهدة %s مشاهدة @@ -243,7 +242,6 @@ الإشارات المرجعية استعمال التقديم السريع الغير دقيق خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق - تحميل الصور المصغرة تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور الملف لا يوجد مثل هذا المجلد @@ -260,7 +258,6 @@ عملية التصدير جارية … إستيراد ملف معرفك, soundcloud.com/هويتك - قم بإيقاف تشغيله لمنع تحميل الصور المصغرة وحفظ البيانات واستخدام الذاكرة. تمسح التغييرات كلاً من ذاكرة التخزين المؤقت للصورة الموجودة في الذاكرة والموجودة على القرص امسح البيانات الوصفيّة المخزّنة مؤقّتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة @@ -288,7 +285,6 @@ الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود لا يوجد بث متاح للتنزيل تم حذف عنصر واحد. - لم يتم تثبيت أي تطبيق لتشغيل هذا الملف NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث. آخر ما تم تشغيله الأكثر تشغيلا @@ -347,13 +343,9 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - استخدم إيماءات التحكم في صوت المشغّل - التحكم بإيماءات السطوع - استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف تنبيه تحديث التطبيق - إيماء التحكم بالصوت الأحداث إشعارات لإصدار NewPipe الجديد وحدة التخزين الخارجية غير متوفرة @@ -415,7 +407,7 @@ لا يمكن الكتابة فوق الملف هناك تنزيل معلق بهذا الاسم تم إغلاق NewPipe أثناء العمل على الملف - لم يتبقى مساحة في الجهاز + لم يتبقى مساحة في الجهاز تم فقد التقدم بسبب حذف الملف انتهى وقت الاتصال هل تريد محو سجل التنزيل، أم تريد حذف جميع الملفات التي تم تنزيلها؟ @@ -474,7 +466,7 @@ لغة التطبيق النظام الافتراضي اضغط على \"تم\" عند حلها - منجز + منجز الفيديوهات %d ثانية @@ -546,7 +538,7 @@ %d دقيقة نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية - إلغاء كتم الصوت + إلغاء الكتم كتم الصوت هذا المحتوى ليس مدعومًا من قبل NewPipe. \n @@ -592,7 +584,7 @@ خلط تكرار يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط! - قم بتحرير كل إشعار أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها لتظهر في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين + قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها ليتم عرضها في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين. زر الإجراء الخامس زر الإجراء الرابع زر الإجراء الثالث @@ -625,7 +617,7 @@ تعليقات قم بإيقاف التشغيل لإخفاء وصف الفيديو والمعلومات الإضافية إظهار الوصف - فتح مع + افتح باستخدام يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe. يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. @@ -633,7 +625,7 @@ هذا المحتوى غير متوفر في بلدك. اغلق التطبيق قسريا هذا الفيديو مقيد بالفئة العمرية. -\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـNewPipe الوصول إلى أي من مقاطع الفيديو الخاصة بها وبالتالي لا يمكن تشغيلها. +\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. إذاعة المميزة حل @@ -643,13 +635,12 @@ تلقائي (سمة الجهاز) الثيم الليلي إظهار تفاصيل القناة - تعطيل نفق الوسائط إذا واجهت شاشة سوداء أو التقطيع في تشغيل الفيديو + قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو. تعطيل نفق الوسائط داخلي خاص غير مدرج عامة - رابط الصورة المصغرة المضيف الدعم اللغة @@ -676,13 +667,12 @@ إيقاف تشغيل وضع الجهاز اللوحي - إظهار العناصر التي تمت مشاهدتها تم تعطيل التعليقات لا تظهر جودة منخفضة (أصغر) جودة عالية (أكبر) معاينة مصغرة على شريط التمرير - تعليم كفيديو تمت مشاهدته + وضع علامة على تمت مشاهدته أُعجب بها منشئ المحتوى أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة إظهار مؤشرات الصور @@ -710,7 +700,7 @@ وضع التالي على قائمة الانتظار تم وضع التالي على قائمة الانتظار جاري المعالجة ... قد يستغرق لحظة - التحقق من وجود تحديثات + التحقق من وجود تحديثات التحقق يدويا من وجود إصدارات جديدة جاري التحقق من وجود تحديثات… عناصر تغذية جديدة @@ -730,7 +720,6 @@ تعليق مثبت LeakCanary غير متوفر الافتراضي ExoPlayer - تغيير حجم الفاصل الزمني للتحميل (حاليا %s). قد تؤدي القيمة الأقل إلى تسريع تحميل الفيديو الأولي. تتطلب التغييرات إعادة تشغيل المشغل تكوين إشعار مشغل البث الحالي الإشعارات تحميل تفاصيل البث… @@ -767,9 +756,6 @@ تنسيق غير معروف جودة غير معروفة حجم الفاصل الزمني لتحميل التشغيل - عرض العناصر المستقبلية - إخفاء العناصر المستقبلية - إخفاء العناصر التي تمت مشاهدتها أسئلة مكررة إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! مشاهدة على الموقع @@ -778,4 +764,121 @@ انقر للتنزيل %s الوضع السريع استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط + هذا الخيار متاح فقط إذا تم تحديد %s للسمة + إلغاء تعيين الصورة المصغرة الدائمة + فشل النسخ إلى الحافظة + البطاقة + تمت إضافة وقت (أوقات) مكررة %d + تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. + مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة + تجاهل أحداث ازرار الوسائط الأجهزة + هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟ + إظهار/إخفاء التدفقات + تمت مشاهدته جزئيا + القادمة + إزالة التكرارات + إزالة التكرارات؟ + إظهار التدفقات التالية + شاهدت بالكامل + إجراء الإيماءة اليسرى + اجراء الإيماءة اليمنى + السطوع + بدون + اختر إيماءة للنصف الأيسر من شاشة المشغل + اختر إيماءة للنصف الأيمن من شاشة المشغل + مستوى الصوت + قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي + تفضل الصوت الوصفي + الصوت : %s + المسار الصوتي + يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث + حدد مسار الصوت للمشغلات الخارجية + غير معروف + إعدادات ExoPlayer + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول + استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + %1$s %2$s + الافتراضي + مدبلجة + وصفي + حدد المسار الصوتي الأصلي بغض النظر عن اللغة + تفضيل الصوت الأصلي + حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا + استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer + قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث +\n +\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة + انقل محدد علامة التبويب الرئيسي إلى الأسفل + موضع علامات التبويب الرئيسية + تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. + لاتوجد بثوث + لاتوجد بثوث مباشرة + الفيديوات + المشتركون + ما هي التبويبات المعروضة على صفحات القناة + تبويبات القنوات + الفديوهات القصيرة + جلب البيانات الوصفية… + تبديل تدوير الشاشة + الانتقال إلى وضع ملئ الشاشة + اجلب تبويبات القنوات + البث التالي + فتح قائمة انتظار التسغيل + حول + تقديم المحتوى + الألبومات + إعادة المحتوى + إعادة التشغيل + علامات التبويب لجلبها عند تحديث الخلاصة. ليس لهذا الخيار أي تأثير إذا تم تحديث القناة باستخدام الوضع السريع. + قوائم التشغيل + شغِّل + المزيد من الخيارات + المسارات + المدة + القنوات + البث السابق + مباشر + جودة الصورة + ؟ + جودة منخفضة + الصور الرمزية + الصور الرمزية للقناة الفرعية + لا تقم بتحميل الصور + عالية الجودة + النوعية متوسطة + الصورة الرمزية للرفع + اللافتات + اختر جودة الصور وما إذا كنت تريد تحميل الصور على الإطلاق، لتقليل استخدام البيانات والذاكرة. تؤدي التغييرات إلى مسح ذاكرة التخزين المؤقت للصور الموجودة في الذاكرة وعلى القرص — %s + الصور المصغرة + مشاركة عنوان القائمة + مشاركة العناوين + %1$s +\n%2$s + مشاركة قائمة التشغيل + شارك تفاصيل قائمة التشغيل مثل اسم قائمة التشغيل وعناوين الفيديو أو كقائمة بسيطة من عناوين URL للفيديو + - %1$s: %2$s + + رد %s + رد %s + ردان%s + ردود%s + ردود %s + ردود %s + + عرض المزيد + عرض أقل + قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. يتم تعيين الإجراءات الثلاثة الأولى (تشغيل/إيقاف مؤقت، السابق والتالي) بواسطة النظام ولا يمكن تخصيصها. + لا توجد مساحة خالية كافية على الجهاز + اعادة ضبط الإعداداتِ + النسخ الاحتياطيُّ والاستعادة + أعيدوا جميع الإعدادات إلى قيمهم الافتراضية + ستؤدي إعادة ضبط جميع الإعدادات إلى تجاهل جميع إعداداتك المفضلة وإعادة تشغيل التطبيق. +\n +\nهل انت متأكد انك تريد المتابعة؟ + نعم + يمكن لـ NewPipe البحث تلقائيًا عن الإصدارات الجديدة من وقت لآخر وإعلامك بمجرد توفرها. +\nهل تريد تمكين هذا؟ + لا + تستخدم الإعدادات الموجودة في عملية التصدير التي يتم استيرادها تنسيقًا عرضة للاختراق تم إهماله منذ NewPipe 0.27.0. تأكد من أن التصدير الذي يتم استيراده من مصدر موثوق به، ويفضل استخدام عمليات التصدير التي تم الحصول عليها من NewPipe 0.27.0 أو الأحدث في المستقبل فقط. سيتم قريبًا إزالة دعم استيراد الإعدادات بهذا التنسيق الضعيف تمامًا، وبعد ذلك لن تتمكن الإصدارات القديمة من NewPipe من استيراد إعدادات التصدير من الإصدارات الجديدة بعد الآن. \ No newline at end of file diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml new file mode 100644 index 00000000000..fc9d5b2b6ce --- /dev/null +++ b/app/src/main/res/values-as/strings.xml @@ -0,0 +1,99 @@ + + + কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\'ল (আপুনি ইয়াক বজাবলৈ VLC ইনষ্টল কৰিব পাৰে)। + ইনষ্টল + বাতিল কৰক + ঠিক আছে + ব্ৰাউজাৰত খোলক + POPUP অৱস্থাত খোলক + ...ৰ সৈতে খোলক + চেয়াৰ + %1$s ত প্ৰকাশ কৰা হৈছে + কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\'ল। VLC ইনষ্টল কৰক\? + ডাউনল’ড + ষ্ট্ৰিম কৰা ফাইল ডাউনলোড কৰক + সন্ধান কৰক + ছেটিংছ + %s ৰ বাবে ফলাফল দেখুৱা হৈছে + চেয়াৰ কৰক + কিছু ৰিজ’লিউচনত অডিঅ’ আঁতৰাওক + চাবস্ক্ৰাইব কৰা হ\'ল + আনচাবস্ক্ৰাইব + আৰম্ভ কৰিবলৈ মেগনিফাইং গ্লাছৰ চিহ্নত টিপক। + চাবস্ক্ৰাইব + চোৱা হ\'ল (চিহ্নিত কৰক) + আপুনি \"%1$s\" বুজাইছিল নেকি\? + বাহ্যিক ভিডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক + বাহ্যিক অডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক + Channel আনচাবস্ক্ৰাইব কৰা হ\'ল + subscription সলনি কৰিব পৰা নগ\'ল + subscription আপডেট কৰিব পৰা নগ\'ল + তথ্য দেখুৱাওক + চাবস্ক্ৰিপচন + বুকমাৰ্ক কৰা প্লেলিষ্ট + টেব নিৰ্বাচন কৰক + বেকগ্ৰাউণ্ড + পপ-আপ + স্থায়ী ৰিজ\'লিউচন + স্থায়ী পপআপ ৰিজোলিউচন + উচ্চ ৰিজ\'লিউচন দেখুৱাওক + কেৱল কিছুমান ডিভাইচেহে 2K/4K ভিডিঅ’ বজাব পাৰে + Kodi ৰ সৈতে বজাওক + Kode এপ ইনষ্টল\? + \"Kodi ৰ সৈতে খোলক\" বিকল্প দেখুৱাওক + Kodi মিডিয়া চেণ্টাৰৰ জৰিয়তে এটা ভিডিঅ\' চলাবলৈ এটা বিকল্প প্ৰদৰ্শন কৰক + প্লেয়াৰটো ক্ৰেচ কৰক + বাফাৰিং + নথিং + জাননী ৰ‌ঙিণ কৰক + অডিঅ\' + অডিঅ\' ৰ প্ৰকাৰ + ভিডিঅ\'ৰ প্ৰকাৰ + থিম + নিশাৰ থিম + পোহৰ + অন্ধকাৰ + ক\'লা + পপ-আপ বৈশিষ্ট্যসমূহ মনত ৰাখিব + পপ-আপৰ অন্তিম আকাৰ আৰু অৱস্থান মনত ৰাখিব + Inexact seek য়ে প্লেয়াৰটোক দ্ৰুত গতিত স্থান সলনি কৰিবলৈ অনুমতি দিয়ে। ৫, ১৫ বা ২৫ ছেকেণ্ড সলনি কৰিবলৈ বিচাৰিলে ইয়াৰ প্ৰয়োজন নহয় + ফাষ্ট-ফৰৱাৰ্ড/-ৰিৱাইণ্ড কৰিবলৈ বিচৰা সময়সীমা + প্লেবেক লোড কৰাৰ ব্যৱধানৰ আকাৰ + লোড ব্যৱধানৰ আকাৰ সলনি কৰক (বৰ্তমানে %s) । এটা কম মানে প্ৰাৰম্ভিক ভিডিঅ\' লোডিং দ্ৰুত কৰিব পাৰে। পৰিৱৰ্তনৰ বাবে এটা খেলুৱৈ পুনৰাৰম্ভৰ প্ৰয়োজন + থাম্বনেইলত থকা মূল ৰং অনুসৰি এণ্ড্ৰইডক জাননীৰ ৰং কাষ্টমাইজ কৰিবলৈ কওক (মন কৰিব যে এইটো সকলো ডিভাইচতে উপলব্ধ নহয়) + সক্ৰিয় প্লেয়াৰৰ queue সলনি কৰা হ’ব + মন্তব্য দেখুৱাওক + বিৱৰণ দেখুৱাওক + মেটা তথ্য দেখুৱাওক + সংৰক্ষিত ছবি মচি পেলোৱা হ\'ল + সংৰক্ষিত কৰি থোৱা মেটাডাটা মচি পেলাওক + সকলো সংৰক্ষণ কৰি ৰখা ৱেবপেজৰ তথ্য আঁতৰাওক + সংৰক্ষণ কৰি থোৱা মেটাডাটা মচি পেলোৱা হ\'ল + পৰৱৰ্তী ষ্ট্ৰিম স্বয়ংক্ৰিয়ভাৱে enque কৰক + সজোৱা + ভিডিঅ\' ডাউনলোড folder + যোগ কৰক + ডাউনলোড কৰা অডিঅ\' ফাইলসমূহ ইয়াত সংৰক্ষণ কৰা হয় + থাম্বনেইলক ১:১ অনুপাত লৈ ক্ৰপ কৰক + ডাউনলোড কৰা ভিডিঅ’ ফাইলসমূহ ইয়াত সংৰক্ষণ কৰা হয় + ভিডিঅ\' ফাইলসমূহৰ বাবে ডাউনলোড folder বাছক + অডিঅ\' ডাউনলোড folder + অডিঅ\' ফাইলসমূহৰ বাবে ডাউনলোড folder নিৰ্বাচন কৰক + জাননীত দেখুওৱা ভিডিঅ’ থাম্বনেইলটো ১৬:৯ৰ পৰা ১:১ অনুপাতলৈ ক্ৰপ কৰক + First action button + Fifth action button + Edit each notification action below by tapping on it. Select up to three of them to be shown in the compact notification by using the checkboxes on the right + Second action button + You can select at most three actions to show in the compact notification! + পুনৰাবৃত্তি + শ্বাফেল + দ্ৰুত inexact seek ব্যৱহাৰ কৰক + এটা queue বিলুপ্তি কৰাৰ আগতে নিশ্চিতকৰণৰ বাবে সুধিব + এটা প্লেয়াৰ পৰা আন এটালৈ সলনি কৰিলে আপোনাৰ queue সলনি হ\'ব পাৰে + Fourth action button + Third action button + ভিডিঅ\'ৰ বিৱৰণ আৰু অতিৰিক্ত তথ্য লুকুৱাবলৈ বন্ধ কৰক + মন্তব্য লুকুৱাবলৈ বন্ধ কৰক + \'পৰৱৰ্তী\' আৰু \'সাদৃশ্য থকা\' ভিডিঅ\' দেখুৱাওক + ষ্ট্ৰিমৰ সৃষ্টিকৰ্তা, ষ্ট্ৰিমৰ বিষয়বস্তু বা এটা সন্ধান অনুৰোধৰ বিষয়ে অতিৰিক্ত তথ্যৰ সৈতে মেটা তথ্যৰ বাকচসমূহ লুকুৱাবলৈ বন্ধ কৰক + \ 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 22f3ba5e51a..f4a930d7b24 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -1,21 +1,21 @@ - Başlamaq üçün böyüdücüyə toxun. + Başlamaq üçün böyüdücü lupaya toxun. %1$s tarixində yayımlanıb - Yayım oynadıcı tapılmadı. \"VLC\" yüklənilsin\? - Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC\'ni quraşdıra bilərsiniz). - Yüklə + 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). + 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 nəzərdə tuturdunuz: \"%1$s\"\? + \"%1$s\" nəzərdə tuturdunuz\? ilə paylaş Xarici video oynadıcı istifadə et - Bəzi qətnamələrdə səsi silir + Bəzi formatlarda səsi silir Xarici səs oynadıcı istifadə et Abunə Ol Abunə olundu @@ -25,58 +25,54 @@ Əlfəcinlənmiş Pleylistlər Yeniliklər Fon - Video endirmə qovluğu - Endirilmiş video fayllar burada saxlanılır - Video faylları üçün endirmə qovluğunu seç - Səs endirmə qovluğu - Endirilmiş səs faylları burada saxlanılır - Səs faylları üçün endirmə qovluğu seç - Defolt keyfiyyət - Daha böyük keyfiyyət seçimləri 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 - Videonu Kodi media mərkəzi ilə oynatmaq üçün seçim göstər + Kodi media mərkəzindən video oynatmaq üçün seçim göstər Səs - Defolt səs formatı - Defolt video formatı + Standart səs kodlayıcı + Standart video kodlayıcı Tema İşıqlı Qaranlıq Qara - Abunəlikdən çıxın - Ani pəncərə rejimində aç + Abunə olma + Ani görüntü rejimində aç Avtomatik oynat - Endir - Fasilələrdən sonra (məsələn, telefon zəngləri) oynatmağa davam etdir + Yüklə + Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam etdir Oynatmanı davam etdir Baxılmış videoların saxlanılması Məlumat təmizlə - Siyahılarda oynatma mövqelərini göstər + Siyahılarda oynatma mövqe göstəricilərini göstər Siyahılardakı mövqelər Son oynatma mövqeyini qaytar Oynatmanı davam etdir Baxış tarixçəsi Axtarış sorğularını yerli olaraq saxla Axtarış tarixçəsi - Axtarış edərkən göstəriləcək təklifləri seç + Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri - Oynadıcının parlaqlığını nizamlamaq üçün jestləri istifadə et - Parlaqlığı jestlə nizamlamaq - Oynadıcı səsini nizamlamaq üçün jestləri istifadə et - Səsi jestlə idarə etmək Avto-növbələ Növbəti Yayımı Avto-növbələ - Üst məlumat keşi silindi - Keşlənmiş bütün veb-səhifə məlumatlarını sil - Keşlənmiş üst məlumatı təmizlə - Şəkil keşi silindi + Üst məlumat qalığı silindi + Toplanmış bütün veb-səhifə məlumatlarını sil + Toplanmış üst məlumatı təmizlə + Şəkil qalığı silindi Şərhləri gizlətmək üçün bağla Şərhləri göstər - Aktiv oynadıcının növbəsi dəyişdiriləcək + Aktiv oynadıcı növbəsi dəyişdiriləcək Bir oynadıcıdan digərinə keçid növbənizi dəyişdirə bilər Növbəni təmizləməzdən əvvəl təsdiq üçün soruş - Sürətli qeyri-dəqiq axtarışdan istifadə et + Sürətli, qeyri-dəqiq axtarış istifadə et Qeyri-dəqiq axtarış oynadıcıya azaldılmış dəqiqliklə mövqeləri daha sürətli axtarmağa imkan verir. 5, 15 və ya 25 saniyəlik axtarış bununla işləmir Sürətli irəli/geri çəkmə axtarış müddəti Heç nə @@ -89,45 +85,45 @@ İkinci fəaliyyət düyməsi Birinci fəaliyyət düyməsi Yalnız bəzi cihazlar 2K/4K videoları oynada bilir - Defolt ani pəncərə keyfiyyəti + Standart ani görüntü formatı Əlavə Et - Ani Pəncərə + 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ç - Yaş həddi səbəbiylə (məsələn, 18+) uşaqlar üçün uyğun olmayan məzmunu göstər + Yaş həddi səbəbiylə (18+ kimi) uşaqlar üçün uyğun olmayan məzmunu göstər Yaş məhdudiyyətli məzmunu göstər Məzmun - Ani pəncərə rejimində oynadılır + Ani görüntü rejimində oynadılır Fonda oynadılır Yeniləmələr Sazlama Görünüş - Tarixçə və keş + Tarixçə və qalıq Video və səs Davranış Oynadıcı - Defolt məzmun dili - Defolt məzmun ölkəsi + Cari məzmun dili + Cari məzmun ölkəsi URL\'i tanımaq olmadı. Başqa tətbiqlə açılsın\? Dəstəklənməyən URL\'i \"Növbələmək üçün basılı saxla\" tövsiyəsin göstər - \"Növbəti\" və \"Bənzər\" videoları göstər - Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac edin + \"Növbəti\" və \"Oxşar\" videoları göstər + Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac et Cari tarixçənizi, abunəliklərinizi, pleylistlərinizi və (könüllü) tənzimləmələrinizi etibarsız edir - reCAPTCHA kukiləri təmizləndi - reCAPTCHA kukilərini təmizlə + reCAPTCHA bazaları təmizləndi + reCAPTCHA bazalarını təmizlə Məlumat bazasını ixrac et Məlumat bazasını idxal et Əsas Görünüşə Keçid - Ani Pəncərəyə Keçid + Ani Görüntüyə Keçid Fona Keçid [Naməlum] - Yeni \"NewPipe\" versiyası üçün bildirişlər + Yeni \"NewPipe\" versiyaları üçün bildirişlər Tətbiq yeniləmə bildirişi NewPipe oynadıcısı üçün bildirişlər Hamısı @@ -139,12 +135,11 @@ \n \nOnu görmək istəyirsinizsə, tənzimləmələrdə \"%1$s\" seçimini aktivləşdirin.
YouTube potensial yetkin məzmunu gizlədən \"Məhdud Rejim\" təmin edir - \"PeerTube\" nümunələri - Miniatürləri yüklə - Siz yığcam bildirişdə göstərilməsi üçün ən çoxu üç fəaliyyət seçə bilərsiniz! + \"PeerTube\" serverləri + Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz! Həmişə yenilə Axın - Yalnız qruplaşdırılmamış abunəlikləri göstər + Yalnız qrupsuz abunəlikləri göstər Yeni Bu qrupu silmək istəyirsiniz\? Boş qrup adı @@ -153,7 +148,7 @@ %d seçildi Abunəlik seçilməyib - Abunəlikləri seçin + Abunəlikləri seç Axın emal edilir… Axın yüklənir… Yüklənmədi: %d @@ -179,8 +174,8 @@ Xəta Axtarış tarixçəsi silindi Bütün axtarış tarixçəsi silinsin\? - Açar sözləri axtarışının tarixçəsini silir - Axtarış tarixçəsini silin + Açar sözlər axtarışı tarixçəsin silir + Axtarış tarixçəsini sil Oynatma mövqeləri silindi Bütün oynatma mövqeləri silinsin\? Bütün oynatma mövqelərini silir @@ -188,38 +183,38 @@ Baxış tarixçəsi silindi Bütün baxış tarixçəsi silinsin\? Baxış tarixçəsini təmizlə - reCAPTCHA həll edərkən NewPipe\'ın saxladığı kukiləri silin + reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil %s tərəfindən yaradıldı Yaxınlaşdır Doldur Uyğunlaşdır - Altyazı Yoxdur + Titrlər Yoxdur Sil Hələ ki, kanal abunəliyi yoxdur Kanal seç Kanal Səhifəsi - Defolt Köşk - Köşk Səhifəsi + Standart Bölmə + Kənar Səhifə Boş Səhifə Əsas səhifədə hansı tablar göstərilir - Əsas səhifənin məzmunu + Əsas səhifə məzmunu Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər Yeniləmələr - Mobil internet istifadə edərkən görüntü keyfiyyətini məhdudlaşdır + Mobil internet istifadə edərkən ayırdetməni məhdudlaşdır Limitsiz 1 element silindi. - Nümunə əlavə et - Sevimli \"PeerTube\" nümunələrinizi seçin - Endirilmiş faylları silin - Endirmə tarixçənizi təmizləmək və ya endirilmiş bütün faylları silmək istəyirsiniz\? + Server əlavə et + Sevimli \"PeerTube\" serverlərinizi seçin + Endirilmiş faylları sil + Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz\? Endirmə tarixçəsini təmizlə - Endirmələrə başla + Endirmələri başlat Endirmələri dayandır Haraya endiriləcəyini soruş Sizdən hər endirmənin harada saxlanılacağı soruşulacaq. \nXarici SD karta endirmək istəyirsinizsə, sistem qovluğu seçicisini (SAF) aktiv edin - \'Yaddaş Giriş Çərçivəsi \' xarici SD karta endirməyə imkan verir - Sistem defoltu + \'Yaddaş Giriş Quruluşu\' xarici SD karta endirməyə imkan verir + Sistem standartı Tətbiq dili %d gün @@ -238,50 +233,40 @@ %d saniyə Axın sonuncu dəfə yeniləndi: %s - Axın yeniləmə astanası + Axın yeniləmə aralığı Sürətli rejimi aktivləşdir - Sürətli rejimi deaktiv et - Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdən dəyişə və ya aşağıdakı düyməni basa bilərsiniz). -\n -\nNewPipe axını yükləmək üçün 2 metod təklif edir: -\n• Bütün abunəlik kanallarını gətirtmək, bu yavaş olsa da tamdır; -\n• Ayrılmış xidmət uc nöqtəsi istifadə etmək, bu sürətlidir, amma tam deyil. -\n -\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az element gətirir. -\n -\nYouTube öz RSS axını ilə bu sürətli metodu təklif edən xidmətlərdən biridir. -\n -\nBeləliklə, seçim sizin nəyə üstünlük verməyinizdən asılıdır: sürət yoxsa dəqiq məlumat. + Sürətli rejimi bağla + Axının çox yavaş yükləndiyini düşünürsünüz? \n Elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdə dəyişə və ya aşağıdakı düyməni basa bilərsiniz). \n \nNewPipe 2 axın yükləmə üsulu təklif edir: \n• Yavaş, lakin tam şəkildə bütün abunəlik kanalı gətirilir. \n• Ayrılmış xidmət uc nöqtəsi istifadə etmək, bu sürətlidir, amma tam deyil. \n \nİkisi arasında fərq budur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az elementlər gətirir. \n \nYouTube öz RSS axını ilə bu sürətli metodu təklif edən xidmətlərdən biridir. \n \nBeləliklə, seçim sizin nəyə üstünlük verməyinizdən asılıdır: sürət yoxsa dəqiq məlumat. Bu yayımı oynatmaq alınmadı Tətbiq/UI çökdü Endirmə menyusunu qurmaq mümkün olmadı Məzmun əlçatmazdır Bütün miniatürləri yükləmək alınmadı - Şəbəkə xətası + Şəbəkə səhvi Xarici SD karta endirmək mümkün deyil. Endirmə qovluğunun yeri sıfırlansın\? Xarici yaddaş əlçatan deyil Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir Üst məlumatı göstər - Video açıqlamasını və əlavə məlumatı gizlətmək üçün bağla + Video açıqlamanı və əlavə məlumatı gizlətmək üçün bağla Açıqlamanı göstər - Bildirişi rəngləndir + Bildirişi rənglə Belə qovluq yoxdur Əsas oynadıcını tam ekranda başlat - Xarici oynadıcılar bu cür linkləri dəstəkləmir + Xarici oynadıcılar bu növ linkləri dəstəkləmir Yerli axtarış təklifləri Video Əlaqəli elementlər Baxılmış kimi işarələ ilə aç - Gecə Teması + Gecə teması Ani pəncərə xüsusiyyətlərini xatırla Ani pəncərənin son ölçüsü və mövqeyini xatırla Video yayımı tapılmadı Şərhlər Açıqlama - Burada kriketlərdən başqa heç nə yoxdur + Burada sisəylərdən başqa heç nə yoxdur Nəticə yoxdur - İlkin tənzimləmələri qaytar + Standartları qaytar Fayl köçürüldü və ya silindi Oynadıcı xətası bərpa edilir Bərpa olunmayan oynatma xətası baş verdi @@ -291,28 +276,27 @@ Səs yayımı tapılmadı Digər tətbiqlərin üzərində göstərməyə icazə ver İlkin tənzimləmələri qaytarmaq istəyirsiniz\? - Miniatürlərin yüklənməsini, dataya qənaət etmək və yaddaşdan istifadəni azaltmaq üçün söndürün. Dəyişikliklər həm yaddaşdaxili, həm də diskdə olan təsvir keşini təmizləyir - Növbətini növbələ - Yenidən Cəhd Et + Növbəti sıraya sal + Təkrar Cəhd Et Cari oynatma yayımı bildirişini konfiqurasiya et Bildirişlər Video fayl xülasəsi bildirişi Abunəliklər üçün yeni yayımlar haqqında bildirişlər Xəta hesabatları üçün bildirişlər Fayl adı boş ola bilməz - Yadda saxlanmış tabları oxumaq mümkün olmadı, buna görə defolt tablardan istifadə edin + Saxlanmış səhifələri oxumaq alınmadı, ona görə standart səhifələr istifadə et NewPipe xəta ilə qarşılaşdı, bildirmək üçün toxun - Bağışlayın, o baş verməməli idi. - Bu xətanı e-poçt vasitəsilə bildirin - GitHub\'da Hesabat Ver - Zəhmət olmasa, xətanızı müzakirə edən məsələnin mövcud olub-olmadığını yoxlayın. Dublikat biletləri yaradarkən, bizdən faktiki səhvi düzəltməyə sərf edəcəyimiz vaxt alırsınız. - Hesabat Bildir + Bağışla, bu baş verməməli idi. + E-poçt- dan məlumat ver + GitHub\'da Məlumat Ver + Xahiş edirik, xətanızı müzakirə edən məsələnin mövcud olub-olmadığını yoxlayın. Dublikat biletləri yaradarkən, bizdən faktiki səhvi düzəltməyə sərf edəcəyimiz vaxtı alırsınız. + Məlumat Ver Məlumat: Nə baş verdi: Yükləyənin avatar miniatürü Bəyən Bəyənmə - Yenidən sıralamaq üçün sürüşdür + Yenidən sıralamaq üçün sürüklə min Mln Mlrd @@ -324,36 +308,36 @@ Video yoxdur Şərhlər qeyri-aktivdir Başlat - Fasilə + Dayandır Təsdiqləmə İmtina Xəta Detallar üçün toxun Zəhmət olmasa, gözləyin… - Hələ endirmə qovluğu təyin edilməyib, indi defolt endirmə qovluğunu seç + Hələ endirmə qovluğu təyin edilməyib, indi standart endirmə qovluğu seç reCAPTCHA çağırışı reCAPTCHA sorğusu göndərildi - Bitdi + Bitdi Etibarsız simvollar bu dəyərlə əvəz olunur - Əvəzedici xarakter + Əvəzedici simvol Ən xüsusi simvollar Üçüncü Tərəf Lisenziyaları Haqqında & T-TSS Töhfə Ver - Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kodun təmizlənməsi və ya real ağırlıqlı kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar! + Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kod təmizlənməsi və ya real ağır kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar! İanə Et Veb sayt - Əlavə məlumat və xəbərlər üçün NewPipe Veb saytına daxil olun. - NewPipe\'ın Məxfilik Siyasəti - NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Buna görə də, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır. -\nNewPipe\'ın məxfilik siyasəti qəza hesabatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir. - Məxfilik siyasətini oxu - NewPipe\'ın Lisenziyası + Əlavə məlumat və xəbərlər üçün NewPipe Veb saytını ziyarət et. + NewPipe Məxfilik Siyasəti + NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Nəticə etibarı ilə, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır. +\nNewPipe məxfilik siyasəti xəta məlumatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir. + Məxfilik Siyasətini Oxu + NewPipe Lisenziyası Tarixçə Bu elementi axtarış tarixçəsindən silmək istəyirsiniz\? Son Oynadılan Ən Çox Oynadılan - Köşk seç + Bölmə seç İdxal edildi Etibarlı ZIP faylı yoxdur Xəbərdarlıq: Bütün faylları idxal etmək mümkün olmadı. @@ -367,7 +351,7 @@ Oynatma növbəsi Detallar Kanal təfərrüatlarını göstər - Ani pəncərədə oynatmağa başla + Ani görüntüdə oynatmağa başla \"Açıq\" fəaliyyətə üstünlük verilir Fon oynadıcı Həmişə soruş @@ -384,13 +368,13 @@ Pleylist miniatürü dəyişdirildi. Avtomatik yaradıldı (heç bir yükləyici tapılmadı) Avtomatik yaradıldı - Altyazılar + Titrlər LeakCanary yoxdur Yaddaş sızma monitorinqi yığın boşaltma zamanı tətbiqin cavab verməməsinə səbəb ola bilər Yaddaş sızmalarını göstər - Utilizasiyadan sonra fraqment və ya fəaliyyətin yaşam dövründən kənarda çatdırıla bilməyən Rx istisnaları barədə hesabat verməyə məcbur et + Utilizasiyadan sonra fraqment və ya fəaliyyətin yaşam dövründən kənarda, çatdırıla bilməyən Rx istisnaları barədə məlumat verməsinə məcbur et Xidmətlərdən alınmış orijinal mətnlər yayım elementlərində görünəcək - Yeni yayımları yoxla + Yeni yayımları yoxlamanı işə sal URL və ya ID\'nizi daxil etməklə SoundCloud profilini idxal edin: \n \n1. Veb-brauzerdə \"iş masası rejimini\" aktiv edin (sayt mobil cihazlar üçün mövcud deyil) @@ -403,7 +387,7 @@ \nDavam etmək istəyirsiniz\? Səssizlik zamanı sürətlə irəli Yeni yayım bildirişləri - Abunəliklərdən yeni yayımlar haqqında bildiriş göndər + Abunəliklərdən yeni yayımlar haqqında bildir Yoxlama tezliyi Tələb olunan şəbəkə bağlantısı İstənilən şəbəkə @@ -417,8 +401,8 @@ Server çox iş parçalı endirmələri qəbul etmir, @string/msg_threads = 1 ilə yenidən cəhd edin Bütün endirilmiş fayllar diskdən silinsin\? Maksimum təkrar cəhdlər - Pleylistə əlavə olunandan əvvəl və sonra baxılmış videolar silinəcək. -\nSiz əminsiniz\? Bu geri qaytarıla bilməz! + Pleylistə əlavə olunandan əvvəl və sonrakı baxılmış videolar silinəcək. +\nSiz əminsiniz? Bu geri qaytarıla bilməz! Kanal qrupları Yeni axın elementləri Abunəlik köhnəlmiş hesab edilənə qədərki son yeniləmədən sonrakı vaxt — %s @@ -426,24 +410,24 @@ Bu məzmun hələ NewPipe tərəfindən dəstəklənmir. \n \nÜmid edirik ki, gələcək versiyada dəstəklənəcək. - Həm kilid ekranı fonu, həm də bildirişlər üçün miniatürdən istifadə et + 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 @@ -454,7 +438,7 @@ %s video %s video - Yeniləmələri yoxla + Yeniləmələri yoxla Axtarış çubuğunun miniatür önizləməsi Əməliyyat sistem tərəfindən ləğv edildi Avto @@ -462,16 +446,16 @@ Server məlumat göndərmir Bu endirməni bərpa etmək mümkün deyil Sizdən hər endirmənin harada saxlanılacağı soruşulacaq - \"Yaddaş Giriş Çərçivəsi\"yalnız Android 10\'dan başlayaraq dəstəklənir + \"Yaddaş Giriş Quruluşu\"yalnız Android 10\'dan başlayaraq dəstəklənir Kanalın avatar miniatürü Sevdiyiniz gecə temasını aşağıda seçə bilərsiniz Android\'in bildiriş rəngini miniatürdəki əsas rəngə uyğun fərdiləşdirməsini təmin et (qeyd edək ki, bu, bütün cihazlarda mövcud deyil) GitHub\'da Bax İanə Et - NewPipe, sizə ən yaxşı istifadəçi təcrübəsini göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin. + NewPipe, sizə ən yaxşı istifadəçi təcrübəsi göstərmək üçün boş vaxtını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçıların bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmasına ianə edərək kömək edin. Ən çox bəyənildi Növbəyə salındı - Məzmunu açarkən defolt hərəkət — %s + Məzmunu açarkən standart hərəkət — %s Ad Pleylist miniatürü kimi təyin et Yalnız Wi-Fi\'da @@ -488,20 +472,18 @@ Lisenziya Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. -\nBu kanala abunəlikdən çıxmaq istəyirsiniz\? - Baxılan elementləri göstər - Seçilmiş +\nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\?
+ 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ının 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ın yenidən başladılmasını tələb edir - Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndürün + 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 - Nümunə artıq mövcuddur - Videoları mini oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz + Server artıq mövcuddur + Videoları kiçik oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz 100+ video ∞ video Şərhlər yoxdur @@ -511,7 +493,7 @@ Trenddə olan Səs Tənzimləmələri Məlumat əldə edilir… - Elementlərdə orijinal əvvəlki vaxtı göstər + Elementlərdə orijinal, əvvəlki vaxtı göstər Yaşam dövrəsi xaricindəki xətaları bildir Şəkil göstəricilərini göstər Şəkillərin üzərində mənbəsini göstərən Picasso rəngli lentləri göstər: şəbəkə üçün qırmızı, disk üçün mavi və yaddaş üçün yaşıl @@ -524,15 +506,15 @@ 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 Etiketlər Planşet rejimi Bağla - Müəllifə ürəkləndi + Müəllifdən ürəkləndi Veb saytı aç %s baxış @@ -550,13 +532,13 @@ Endirmə tamamlandı %s endirmə tamamlandı - Defolt ExoPlayer + ExoPlayer standartı Mövcud olduqda xüsusi axından al Baxılmış videolar silinsin\? İzləniləni sil - Sistem qovluğu seçicisini (SAF) istifadə edin + Sistem qovluğu seçicisini (SAF) istifadə et Bağlantı fasiləsi - Cihazda yer qalmayıb + Cihazda yer yoxdur Fayl üzərində işləyərkən NewPipe bağlandı Emaldan sonra uğursuz oldu Serverə qoşulmaq mümkün deyil @@ -582,18 +564,17 @@ İdxal edilir… Pleylistə salındı Səsi bağla - Ani pəncərə oynadıcı + Ani görüntü oynadıcı Çəkməcəni Aç Növbələşdirmək üçün basılı tut Sil - Android\'də pulsuz yüngül yayımlayıcı. + Android\'də pulsuz, zərif yayımlayıcı. © %1$s, %2$s tərəfindən %3$s altında - Bu faylı oynatmaq üçün heç bir tətbiq quraşdırılmayıb Endirmə - Bu icazə, ani pəncərə rejimində + Bu icazə, ani görüntü rejimində \naçmaq üçün lazımdır - Buferə kopyalandı - Parçalar + Buferə köçürüldü + Kadrlar Adını dəyişdir Yarat @@ -602,28 +583,28 @@ Səs Təfərrüatlar: - Nə:\\nTələb:\\nMəzmun Dili:\\nMəzmun Ölkəsi:\\nTətbiq Dili:\\nXidmət:\\nGMT Saatı:\\nPaket:\\nVersiya:\\nƏS versiyası: - Bağışlayın, nəsə xəta baş verdi. - Formatlanmış hesabatı kopyala - Nümunə URL\'sini daxil et - Nümunəni doğrulamaq mümkün olmadı - %s-də bəyəndiyiniz nümunələri tapın - Video \"Təfsilatlar:\"səhifəsində fon və ya ani pəncərə düyməsini basarkən ipucu göstər - Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdirin. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur + Nə:\\nSorğu:\\nMəzmun Dili:\\nMəzmun Ölkəsi:\\nTətbiq Dili:\\nXidmət:\\nGMT Saatı:\\nPaket:\\nVersiya:\\nƏS versiyası: + Bağışlayın, nəsə səhv oldu. + Formatlanmış hesabatı köçür + Server URL\'sini daxil et + Serveri təsdiqləmək mümkün olmadı + %s-də bəyəndiyiniz serverləri tapın + Video \"Təfsilatlar\" səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər + Oynadıcı titr mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur Xəta baş verdi: %1$s Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur Veb saytı təhlil etmək alınmadı - Səs ucalığı + Ucalıq Radio \"Oynadıcını çökdür\" Göstər - Oynadıcıdan istifadə edərkən çökdürmə seçimini göstər + Oynadıcını istifadə edərkən çökdürmə seçimini göstər Xəta balonu göstər Xəta bildirişi yarat - Burdan idxal edin - Bura ixrac edin + Burdan idxal et + 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\'ın məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatını bizə göndərmək üçün onu 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. Xahiş edirik, diqqətlə oxuyun. \nXə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 @@ -638,12 +619,11 @@ Sahib Siyahıdan kənar Şəxsi - Miniatür URL Yaş həddi Dil İctimai Abunəçi sayı əlçatan deyil - Lisenziyanı oxuyun + Lisenziyanı Oxu Tarixçə Hərflər və rəqəmlər Oynadıcını çökdür @@ -651,39 +631,29 @@ Oynadıcı bildirişi Yeni yayımlar Xəta hesabatı bildirişi - Video URL\'i imzasının şifrəsi qırılmadı - Endirmək üçün heç bir yayım yoxdur - Xəta baş verdi, bildirişə baxın + Endirmək üçün yayım mövcud deyil + Xəta baş verdi, bildirişi gör Şərhiniz (İngiliscə): Video oynat, müddət: - Zəhmət olmasa, daha sonra tənzimləmələrdə endirmə qovluğunu təyin et + Zəhmət olmasa, endirmə qovluğunu daha sonra tənzimləmələrdə təyin et NewPipe Endirilir Hash hesablanır Fayl adlarında icazə verilən simvollar NewPipe Haqqında Lisenziyalar - NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziyanın şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz. + NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziya şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz. İxrac edildi Elementləri silmək üçün sürüşdür Hələ,əlfəcinlənmiş pleylistlər yoxdur Bu, cari quraşdırmanızı ləğv edəcək. Növbəyə qoy - Qara ekranla qarşılaşsanız və ya videonu oynatdıqda səs qırılarsa, media tunelini deaktiv edin + Qara ekranla qarşılaşsanız və ya videonu oynatdıqda donarsa, media girişin qeyri-aktiv edin. Növbəti sıraya salındı Fonda oynatmağa başla Yayım təfərrüatları yüklənir… - Media tunelini deaktiv et + Media girişin qeyri-aktiv et Tətbiq çökdü - YouTube abunəliklərini Google takeout\'dan -\nidxal edin: -\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 + YouTube abunəliklərin Google Takeout-dan idxal et: \n \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 @@ -693,37 +663,145 @@ %1$s endirmə silindi Dayandır - Nümunə seç + Server seç Sürətli axın rejimi bu barədə əlavə məlumat vermir. ExoPlayer məhdudiyyətlərinə görə axtarış müddəti %d saniyəyə təyin edildi Bəzi xidmətlərdə mövcuddur, adətən daha sürətli olur, lakin məhdud sayda elementləri və çox vaxt natamam məlumatı qaytara bilər (məsələn, müddət, element növü, canlı status yoxdur) - Bu əməliyyat üçün uyğun fayl meneceri tapılmadı. -\nZəhmət olmasa, fayl menecerini quraşdırın və ya endirmə tənzimləmələrində \'%s\'-i deaktiv etməyə çalışın + Bu əməliyyat üçün uyğun fayl meneceri tapılmadı. Zəhmət olmasa, fayl menecerini quraşdır və ya endirmə tənzimləmələrində \'%s\'-i qeyri-aktiv etməyə çalış \'%s\' üçün axın yükləmək mümkün olmadı. - 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 fəaliyyət üçün uyğun fayl meneceri tapılmadı.\nXahiş olunur, Yaddaş Giriş Quruluşuna uyğun fayl meneceri 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ı bildiriş fəaliyyətini hər birinin üzərinə toxunaraq redaktə edin. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərilməsi üçün onların üçə qədərini seç + Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə edin. Sağdakı təsdiq qutuların istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seçin. Belə fayl/məzmun mənbəyi yoxdur - Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir + 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ətbiqdən istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabların yoxlanıldığına əmin olun! + 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 Çeşidlə NewPipe\'ın ən son versiyasın işlədirsiniz Sürətli rejim - 3 nöqtə menyudan abunələri idxal və ya ixrac et + 3 nöqtə menyudan abunəlikləri idxal və ya ixrac et %s endirmək üçün toxun + Bu seçim yalnız tema üçün %s seçildikdə əlçatandır + Daimi miniatürü ləğv et + Kart + Buferə köçürmək alınmadı + Boz rəngdəki pleylistlərdə artıq bu element var. + Dublikat %d dəfə əlavə edildi + Cihaz daxili media düyməsi problemlərinə məhəl qoyma + Məsələn, fiziki düymələri qırılan qulaqlıq işlədirsinizsə faydalıdır + Dublikatları sil + Dublikatlar silinsin\? + Aşağıdakı yayımları göstər + Yayımları Göstər/Gizlə + Tam baxılıb + Qismən baxılıb + Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\? + Yaxınlaşan + Sol jest fəaliyyəti + Oynadıcı ekranının sağ yarısı üçün jest seç + Sağ jest fəaliyyə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ı artıq 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 vasitəsilə bu problemli bəzi cihazlarda istifadə olunur, bu tənzimləmə təsiri yalnız Android 6 və daha yüksəkdə var.\n\nBu seçimi işlətmə cari video oynadıcı dəyişəndə və ya tam ekrana keçəndə oynatma xətaların düzəldə 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 + Yayım yoxdur + Canlı yayım yoxdur + Media dövrələmə cihazınızda standart olaraq qeyri-aktiv edilib, çünki cihazınızın modelinin bunu dəstəkləmədiyi məlumdur. + %1$s %2$s + Əsas səhifə mövqeyi + Əsas səhifə seçicini aşağıya köçür + Üst Məlumat Yüklənir… + Kanal səhifələrin əldə et + Avatarlar + Alt kanal avatarları + Axın yenilənərkən əldə edilən səhifələr.Kanal sürətli rejim istifadə edərək yenilənirsə, bu seçimin heç bir təsiri yoxdur. + Yükləyici avatarları + Miniatürlər + Aşağıdakı hər bildiriş fəaliyyətin ona toxunub redaktə edin. İlk üç fəaliyyət (oynatma/fasilə, əvvəlki və növbəti) sistem tərəfindən tənzimlənib və dəyişdirilə bilməz. + Xeyr + Nüsxələ və bərpa et + NewPipe arabir avtomatik şəkildə yeni versiyaları yoxlaya və onlar mövcud olduqda sizə bildirə bilər. +\nBunu aktivləşdirmək istəyirsiniz? + Bəli + Tənzimləmələri sıfırla + Bütün tənzimləmələri standart dəyərlərinə sıfırla + Cihazda yetərlik boş yer yoxdur + Abunəliklər + Geri çevir + Ekran səmtini dəyişin + İdxal edilən ixracdakı tənzimləmələr NewPipe 0.27.0-dan bəri köhnəlmiş zəif formatı işlədir. İdxal edilən ixracın etibarlı mənbədən olduğuna əmin olun və gələcəkdə yalnız NewPipe 0.27.0 və ya daha yeni versiyadan əldə edilmiş ixracları istifadə etməyə üstünlük verin. Bu zəif formatda tənzimləmələrin idxalına dəstək tezliklə tamamilə silinəcək və sonra NewPipe-in köhnə versiyaları daha yeni versiyalardan ixrac tənzimləmələrin idxal edə bilməyəcək. + Əvvəlki yayım + Növbəti yayım + Şəkilləri yükləmə + Lövhələr + Videolar + Axınlar + Kanallar + Haqqında + Kanal səhifələri + Pleylistlər + Shorts + + %s cavab + %s cavab + + Kanal səhifələrində hansı səhifələr göstərilir + Oynatma növbəsin aç + Tam ekrana keçid + Oynat + Təkrar oynat + Daha çox seçim + Müddət + İrəli çevir + Aşağı keyfiyyət + Orta keyfiyyət + Yüksək keyfiyyət + \? + Oynatma siyahısın paylaş + Pleylist adı və video başlıqları kimi təfsilatlar və ya video URL-lərin sadə siyahısı olaraq pleylist paylaş + Başlıqlarla paylaşın + - %1$s: %2$s + %1$s +\n%2$s + Daha çox göstər + Daha qısa göstər + Bütün tənzimləmələri sıfırlama üstünlük verdiyiniz seçimlərin hamısın ləğv edəcək və tətbiq yenidən açılacaq. +\n +\n +\nDavam etmək istədiyinizə əminsiniz? + Canlı + Albomlar + Şəkil keyfiyyəti + Məlumat və yaddaş istifadəsini azaltmaq üçün şəkillərin keyfiyyətini və ya şəkillərin əsla yüklənib-yüklənilməməsini seçin. Dəyişikliklər həm yaddaşdaxili, həm də diskdə olan təsvir qalığın təmizləyir — %s + URL siyahısını paylaşın + ikinci dərəcəli \ 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 12739ba411d..5cc516f4619 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -25,7 +25,6 @@ En direuto Fallu Nun pudieron cargase toles miniatures - Nun pudo sabese la robla de la URL del videu Nun pudo analizase\'l sitiu web Buff… Esto nun debió asoceder. Perdona mas asocedió daqué malo. @@ -150,8 +149,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 @@ -174,7 +171,7 @@ Yá esiste un ficheru baxáu con esti nome nun pue sobrecribise\'l ficheru Hai una descarga pendiente con esti nome - Nun queda espaciu nel preséu + Nun queda espaciu nel preséu Escosó\'l tiempu d\'espera de la conexón Nun pudieron importase les soscripciones Sotítulos @@ -208,8 +205,6 @@ \n3. Anicia sesión cuando se te pida \n4. Copia la URL del perfil al que te redirixeron. soundcloud.com/LaToID - Cargar les miniatures - Desactiva esta opción pa eviar la carga de miniatures y aforrar datos y usu de memoria. Los cambeos llimpien la caché d\'imáxenes temporal y permanente. Minimizar al cambiar d\'aplicación Minimizar al reproductor en segundu planu Minimizar al reproductor en ventanu @@ -226,8 +221,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. @@ -277,7 +270,7 @@ Desanicia tolos datos na caché de les páxines web Llimpiar los metadatos de la caché Llimpióse la caché d\'imáxenes - ¿Instalar Kore\? + ¿Instalar Kode\? Qué asocedió:\\nSolicitú:\\nLlingua del conteníu:\\nPaís del conteníu:\\nLlingua de l\'aplicación:\\nServiciu:\\nHora en GMT:\\nPaquete:\\nVersión de l\'aplicación:\\nVersión del SO: Nun s\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos). Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos @@ -425,10 +418,9 @@ El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\'aplicación nun recueye nengún datu ensin el to consentimientu. \nLa política de privacidá de NewPipe desplica en detalle los datos que s\'unvien y atroxen cuando unvies un informe de casque. Un aplicación llibre pa ver/sentir plataformes de tresmisión n\'Android. - Nun hai nenguna aplicación pa reproducir esti ficheru Caráuteres de troquéu Los caráuteres que nun son válidos van trocase por esti valor - Fecho + Fecho Primi «Fecho» al resolvelu Desanicióse 1 elementu. Defini una capeta de descargues dempués, nos axustes de 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 323dda73dce..c3c18789180 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 @@ -28,10 +24,8 @@ Barcha keshlangan veb-sahifa ma\'lumotlarini olib tashlash Keshlangan metadatalarni o\'chirish Rasm keshi o\'chirildi - Eskizlarni yuklash, ma\'lumotlarni tejash va xotiradan foydalanishni oldini olish uchun o\'chirib qo\'ying. O\'zgarishlar xotiradagi va diskdagi rasm keshini tozalaydi. sharhlarni yashirishni o\'chirish Izohlarni ko\'rsatish - Eskizlarni yuklang Aktiv ijro etish navbati almashtiriladi Bir ijro etishdan boshqasiga o\'tish sizning navbatingizni almashtirishi mumkin Navbatni tozalashdan oldin tasdiqlashni so\'rash @@ -64,7 +58,7 @@ Kodi bilan ijro etish Faqat ba\'zi qurilmalar 2K / 4K videolarni ijro etishi mumkin Yuqori o\'lchamlarni ko\'rsatish - "Standart pop-up o\'lchamlari" + Standart pop-up o\'lchamlari Standart o\'lchamlari Audio fayllar uchun yuklab olish papkasini tanlash Yuklab olingan videofayllar shu yerda saqlanadi @@ -214,14 +208,13 @@ © %1$s tomonidan %2$s gacha %3$s Uchinchi tomon litsenziyalari NewPipe haqida - Ushbu faylni ijro etish uchun dastur o\'rnatilmagan Ko\'pchilik maxsus belgilar Yozuvlar va raqamlar O\'zgartirish belgisi Noto\'g\'ri belgilar ushbu qiymat bilan almashtiriladi Fayl nomidagi ruxsat berilgan belgilar Yuklab olish - Bajarildi + Bajarildi reCAPTCHA muammosi so\'raldi Hal etilganda \"Bajarildi\" tugmasini bosing reCAPTCHA muammosi @@ -319,7 +312,6 @@ Yuklab olish menyusi sozlanmadi Tarkib mavjud emas Veb-saytni tahlil qilib bo\'lmadi - Videoning URL manzilini o\'chirib bo\'lmadi Barcha eskizlarni yuklab bo\'lmadi Tarmoqda xato Tashqi SD-kartaga yuklab olishning iloji yo\'q. Yuklash papkasining joylashuvi tiklansinmi\? @@ -424,7 +416,7 @@ Ushbu yuklab olishni tiklab bo\'lmaydi Ulanish vaqti tugadi Siljish yo\'qoldi, chunki fayl o\'chirildi - Qurilmada bo\'sh joy qolmadi + Qurilmada bo\'sh joy qolmadi NewPipe fayl ustida ishlash paytida yopilgan Keyingi ishlov berilmadi Topilmadi diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8ed10b12682..bfa19a3737b 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,9 +1,9 @@ - Націсніце \"Пошук\", каб пачаць + Націсніце «Пошук», каб пачаць. Апублікавана %1$s - Патокавы плэер не знойдзены. Усталяваць VLC? - Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). + Патокавы прайгравальнік не знойдзены. Усталяваць VLC? + Патокавы плэер не знойдзены (можна ўсталяваць VLC). Усталяваць Скасаваць Адкрыць у браўзеры @@ -13,10 +13,10 @@ Загрузка файла прамой трансляцыі Пошук Налады - Магчыма, вы мелі на ўвазе \"%1$s\"\? + Магчыма, вы мелі на ўвазе «%1$s»? Падзяліцца з дапамогай Знешні відэаплэер - Прыбірае гук у некаторых разрозненнях + Адключае гук для некаторых раздзяленнях Знешні аўдыяплэер Падпісацца Вы падпісаныя @@ -30,19 +30,19 @@ У фоне У акне Дадаць да - Каталог для спампаванага відэа - Папка для спампаванга відэа - Увядзіце шлях да папкі для спампавання відэа + Тэчка загрузкі відэа + Загружаныя відэафайлы захоўваюцца тут + Абярыце тэчку загрузкі для відэафайлаў Тэчка загрузкі аўдыё - Папка для спампаванага аўдыя - Увядзіце шлях да папкі для спампавання аўдыя + Загружаныя аўдыёфайлы захоўваюцца тут + Абярыце тэчку загрузкі для аўдыёфайлаў Разрознянне па змаўчанні - Разрозненне усплываючага акна + Разрозненне ўсплываючага акна Высокія разрозненні Толькі некаторыя прылады могуць прайграваць відэа ў 2K/4K Прайграць у Kodi - Дадатак Kore не знойдзены. Усталяваць яго? - \"Прайграць у Kodi\" + Усталяваць адсутную праграму Kore? + Паказаць опцыю «Прайграць у Kodi» Паказаць опцыю прайгравання відэа праз медыяцэнтр Kodi Аўдыё Фармат аўдыё па змаўчанні @@ -52,29 +52,27 @@ Цёмная Чорная Аднавіць акно - Запамінаць памер і становішча ўсплываючага акна + Памятаць апошнія памер і пазіцыю ўсплывальнага акна Хуткі пошук пазіцыі - Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна. Не працуе для перамоткі на 5, 15 ці 25 секунд - Загружаць мініяцюры - Адключыце, каб не загружаць мініяцюры і зэканоміць трафік і памяць. Змена налады ачысьціць кэш малюнкаў + Недакладны пошук дазваляе плэеру знаходзіць пазіцыі хутчэй са зніжанай дакладнасцю. Пошук цягам 5, 15 ці 25 секунд пры гэтым немажлівы Кэш малюнкаў ачышчаны Ачысціць кэш метададзеных Выдаліць усе загружаныя дадзеныя вэб-старонак Кэш метададзеных ачышчаны - Аўтадапаўненне чаргі + Аўта- чарга наступнага патока Дадаваць падобныя патокі ў чаргу пры прайграванні апошняга, калі не ўключаны паўтор Варыянты пошуку - Адлюстроўваць падказкі пры пошуку + Выберыце прапановы для паказу пры пошуку Гісторыя пошуку - Захоўваць пошукавыя запыты лакальна + Захоўваць запыты пошуку (лакальна) Гісторыя праглядаў Запамінаць прагледжаныя відэа - Аднавіць пры фокусе - Аднаўляць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў) - Спампаваць - \"Наступнае\" и \"Прапанаванае\" відэа - \"Зацісніце, каб дадаць\" - Паказаць падказку пры націсканні \"У акне\" ці \"У фоне\" на старонцы звестак аб відэа + Аднавіць прайграванне + Працягваць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў) + Загрузіць + «Наступнае» і «Прапанаванае» відэа + Паказаць падказку «Зацісніце, каб дадаць» + Паказаць падказку пры націску «У акне» або «У фоне» на старонцы звестак аб відэа URL не падтрымліваецца Краіна кантэнту па змаўчанні Мова кантэнту па змаўчанні @@ -87,15 +85,15 @@ Прайграванне ў фонавым рэжыме Прайграванне ва ўсплываючым акне Кантэнт - Кантэнт 18+ + Паказаць кантэнт 18+ Трансляцыя Загрузкі Загрузкі Справаздача пра памылку - Усё + Усе Каналы Плэйлісты - Дарожкі + Трэкі Карыстальнікі Адключана Ачысціць @@ -106,27 +104,26 @@ Толькі цяпер Файл Апавяшчэнне NewPipe - Апавяшчэнні для NewPipe ў фоне і ва ўсплываючым акне + Апавяшчэнні для прайгравальніка NewPipe [Невядома] Перайсці ў фон Перайсці ў акно Перайсці ў галоўнае акно Імпарт дадзеных Экспарт дадзеных - Бягучыя падпіскі, плэйлісты і гісторыя будуць заменены - Экспарт гісторыі, падпісак і плэйлістоў + Перавызначае вашу бягучую гісторыю, падпіскі, плэйлісты і (неабавязкова) налады + Экспарт гісторыі, падпісак, плэйлістоў і налад Ачысціць гісторыю праглядаў - Выдаліць гісторыю прайграных патокаў + Выдаліць гісторыю прайграных патокаў і пазіцыі прайгравання Выдаліць усю гісторыю праглядаў\? - Гісторыя праглядаў выдалена. + Гісторыя праглядаў выдалена Ачысціць гісторыю пошуку Выдаліць гісторыю пошукавых запытаў Выдаліць усю гісторыю пошуку\? - Гісторыя пошуку выдалена. + Гісторыя пошуку выдалена Памылка Памылка сеткі Не атрымалася загрузіць усе мініяцюры - Не атрымалася расшыфраваць подпіс URL у відэа Не атрымалася разабраць вэб-сайт Кантэнт недаступны Не атрымалася стварыць меню загрузкі @@ -142,22 +139,22 @@ Файл не існуе або няма дазволу на яго чытанне або запіс Імя файла не можа быць пустым Адбылася памылка: %1$s - Няма патокаў, даступных для загрузкі + Няма трансляцый, даступных для загрузкі Прабачце, гэта не павінна было адбыцца. - Адправіць справаздачу па e-mail - Прабачце, адбыліся памылкі. - СПРАВАЗДАЧА + Паведаміць па электроннай пошце + На жаль, нешта пайшло не так. + Справаздача Інфармацыя: Што адбылося: - Што:\\nЗапыт:\\nМова кантэнту:\\nСэрвіс:\\nЧас па Грынвічы:\\nПакет:\\nВерсія:\\nВерсія АС: + Што:\\nЗапыт:\\nМова кантэнту:\\nКраіна кантэнту:\\nМова праграмы:\\nСэрвіс:\\nЧас GMT:\\nПакет:\\nВерсія:\\nВерсія АС: Ваш каментар (English): Падрабязнасці: - Мініяцюра відэа-прэв\'ю + Прайграць відэа, працягласць: Мініяцюра аватара карыстальніка Спадабалася Не спадабалася Няма вынікаў - Нічога няма + Нічога няма, акрамя цвыркуноў Перацягніце, каб змяніць парадак Відэа Аўдыё @@ -182,6 +179,7 @@ %s Відэа %s відэа %s відэа + %s відэа Пачаць Паўза @@ -210,18 +208,17 @@ Сімвал для замены Літары і лічбы Большасць спецзнакаў - Прыкладанне для прайгравання гэтага файла не ўстаноўлена Аб NewPipe Іншыя ліцэнзіі © %1$s %2$s пад ліцэнзіяй %3$s - Аб дадатку + Аб праграме Ліцэнзіі Свабоднае легкавагавае патокавае прайграванне на Android. Дапамога праекту Вітаецца ўсё - ідэі, пераклад, змены дызайну, чыстка кода або велізарныя змены ў кодзе. Чым больш зроблена, тым лепш! Адкрыць на GitHub Ахвяраваць - Распрацоўшчыкі NewPipe цаной свайго вольнага часу робяць ваша жыццё крышачку зручней. Адплаціце ім тым жа - атрымліваючы асалоду ад кубачка кавы, яны змогуць зрабіць NewPipe яшчэ лепей. + NewPipe распрацаваны добраахвотнікамі, якія праводзяць свой вольны час, забяспечваючы лепшы карыстацкі досвед. Дапамажыце распрацоўшчыкам зрабіць NewPipe яшчэ лепшым, пакуль яны атрымліваюць асалоду ад кавы. Аддаць належнае Вэб-сайт Дзеля атрымання больш падрабязнай інфармацыі і апошніх навін аб NewPipe наведайце наш вэб-сайт. @@ -230,7 +227,7 @@ \nПалітыка прыватнасці NewPipe падрабязна тлумачыць, якія дадзеныя адпраўляюцца і захоўваюцца пры адпраўцы справаздачы аб збоях.
Прачытаць палітыку Ліцэнзія NewPipe - NewPipe - свабоднае праграмнае забеспячэнне: вы можаце выкарыстоўваць, вывучаць і паляпшаць яго па сваім меркаванні. У прыватнасці, вы можаце распаўсюджваць і / або змяняць яго ў адпаведнасці з умовамі GNU General Public License, апублікаванай Free Software Foundation, альбо версіі 3, альбо (па вашаму выбару) любой больш позняй версіі. + NewPipe - гэта праграмнае забеспячэнне, свабоднае ад копілефта: вы можаце выкарыстоўваць, вывучаць, дзяліцца і паляпшаць яго па жаданні. У прыватнасці, вы можаце распаўсюджваць і/ці змяняць яго ў адпаведнасці з умовамі Агульнай грамадскай ліцэнзіі GNU, апублікаванай Фондам свабоднага праграмнага забеспячэння, альбо версіі 3 Ліцэнзіі, альбо (на ваш выбар) любой пазнейшай версіі. Прачытаць ліцэнзію Гісторыя Гісторыя @@ -256,16 +253,16 @@ Выдаліць Падрабязнасці Налады аўдыё - Утрымлівайце, каб дадаць у чаргу + Зацісніце, каб дадаць у чаргу Пачаць адсюль у фоне - Пачаць адсюль у акне + Пачніце гуляць ва ўсплываючым акне Адкрыць бакавую панэль Зачыніць бакавую панэль Пры адкрыцці кантэнту Пры адкрыцці спасылкі на кантэнт — %s Відэаплэер Фонавы плэер - Плэер у акне + Аконны прайгравальнік Заўсёды пытацца Атрыманне звестак… Загрузка запытанага кантэнту @@ -273,42 +270,46 @@ Перайменаваць Імя Дадаць у плэйліст - На мініяцюру плэйліста + Усталяваць як мініяцюру плэйліста Дадаць плэйліст у закладкі Выдаліць закладку Выдаліць плэйліст\? Плэйліст створаны Дададзена ў плэйліст - Мініяцюра плэйліста зменена + Мініяцюра плэйліста зменена. Без тытраў Падагнаць Запоўніць Наблізіць Створаны аўтаматычна Тытры - Змяніць памер тэкста і фон тытраў. Патрэбен перазапуск + Змяніць маштаб тэксту субтытраў гульца і стылі фону. Патрабуецца перазапуск праграмы, каб яна ўступіла ў сілу Маніторынг уцечкі памяці можа прывесці да завісання прыкладання Паведамляць пра памылкі жыццёвага цыклу Прымусова паведамляць пра недастаўляемыя Rx-выключэнні па-за фрагментам або жыццёвым цыкле пасля выдалення Імпарт Імпарт з - Экспарт у + Экспарт ў Імпарт… Экспарт… Імпарт файла Папярэдні экспарт Не атрымалася імпартаваць падпіскі Не атрымалася экспартаваць падпіскі - Імпарт падпісак з YouTube загрузкай файла экспарту: -\n -\n1. Перайдзіце на: %1$s -\n2. Увайдзіце, калі неабходна -\n3. Павінна пачацца загрузка (гэта будзе файл экспарту) - Імпарт падпісак з SoundCloud набраўшы альбо URL, альбо ваш ID: -\n -\n1. Уключыце \"рэжым працоўнага стала\" у браўзэры (сайт недаступны на тэлефоне) -\n2. Перайдзіце на: %1$s -\n3. Увайдзіце, калі неабходна + Імпарт падпісак YouTube з Google Takeout: +\n +\n1. Перайдзіце па гэтым URL: %1$s +\n2. Увядзіце, калі вас папросяць +\n3. Націсніце на «Усе дадзеныя ўключаны», затым на «Адмяніць выбар усіх», затым выберыце толькі «падпіскі» і націсніце «ОК» +\n4. Націсніце на «Наступны крок», а затым на «Стварыць экспарт» +\n5. Націсніце на кнопку «Спампаваць» пасля таго, як яна з\'явіцца +\n6. Націсніце на ФАЙЛ ІМПАРТУВАЦЬ ніжэй і выберыце спампаваны файл .zip +\n7. [Калі імпарт .zip не ўдаецца] Распакуйце файл .csv (звычайна ў раздзеле «YouTube і YouTube Music/subscriptions/subscriptions.csv»), націсніце ФАЙЛ ІМПАРТУВАЦЬ ніжэй і выберыце выняты файл CSV + Імпарт падпісак з SoundCloud набраўшы альбо URL, альбо ваш ID: +\n +\n1. Уключыце «Версія для ПК» у браўзэры (сайт не падтрымліваецца мабільнымі прыладамі) +\n2. Перайдзіце на: %1$s +\n3. Увядзіце, калі неабходна \n4. Скапіруйце адрас з адраснага радка. вашID, soundcloud.com/вашID Гэтае дзеянне можа выклікаць вялікі расход трафіку. @@ -317,11 +318,11 @@ Кіраванне хуткасцю прайгравання Тэмп Тон - Незалежна (скажэнні) + Адчапіць (можа выклікаць скажэнне) Прапускаць цішыню Крок Скід - У адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. + У адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. \nВам неабходна прыняць яе ўмовы, каб адправіць нам справаздачу пра памылку. Прыняць Адмовіцца @@ -330,26 +331,22 @@ Пры згортванні плэера Дзеянне пры пераключэнні са стандартнага плэера на іншае прыкладанне — %s Нічога не рабіць - Фонавы плэер - Плэер у акне + Згарнуць у фонавы плэер + Плэер ў акне Адпісацца Абярыце ўкладку - Жэст гучнасці - Мяняць гучнасць плэера жэстам - Жэст яркасці - Мяняць яркасць плэера жэстам Абнаўленні Файл выдалены - Апавяшчэнне аб абнаўленні - Апавяшчэння аб новай версіі NewPipe + Апавяшчэнне аб абнаўленні праграмы + Апавяшчэнні пра новыя версіі NewPipe Знешняе сховішча недаступна Загрузка на знешнюю SD-карту немагчымая. Скінуць размяшчэнне тэчкі загрузкі\? Памылка чытання захаваных укладак. Выкарыстоўваюцца ўкладкі па змаўчанні Аднавіць значэнні па змаўчанні Аднавіць значэнні па змаўчанні\? Колькасць падпісчыкаў недаступная - Ўкладкі, бачныя на галоўнай старонцы - Абнаўлення + Укладкі, бачныя на галоўнай старонцы + Абнаўленні Паказаць апавяшчэнне пры наяўнасці новай версіі Выгляд спісу Спіс @@ -359,20 +356,20 @@ Скончана У чарзе прыпынена - у чарзе + дададзены ў чаргу постапрацоўка - Чарга + Дадаць у чаргу Дзеянне забаронена сістэмай Памылка загрузкі Стварыць унікальнае імя Перазапісаць - Загрузка з такім імем ужо выконваецца + Загрузка з такім імем ўжо выконваецца Паказаць тэкст памылкі - Тэчка прызначэння не можа быць створана - Файл не можа быць створаны - Немагчыма ўсталяваць абароненае злучэнне + Немагчыма стварыць папку прызначэння + Немагчыма стварыць файл + Не атрымалася ўсталяваць бяспечнае злучэнне Сервер не знойдзены - Немагчыма злучыцца з серверам + Немагчыма падключыцца да сервера Не атрымалася атрымаць дадзеныя з сервера Сервер не падтрымлівае шматструменную загрузку, паспрабуйце з @string/msg_threads = 1 Не знойдзена @@ -391,18 +388,18 @@ Каментарыі не атрымалася загрузіць Зачыніць Працягваць прайграванне - Аднаўляць з апошняй пазіцыі + Аднаўляць апошнюю пазіцыю Пазіцыі ў спісах Адлюстроўваць індыкатары пазіцый прагляду ў спісах Ачысціць дадзеныя Пазіцыі прайгравання выдалены Файл перамешчаны ці выдалены - Файл з такім імем ужо існуе - Файл з такім імем ужо існуе + Файл з такім імем ўжо існуе + Файл з такім імем ўжо існуе немагчыма перазапісаць файл У чарзе ўжо ёсць загрузка з такім імем NewPipe была зачынена падчас працы над файлам - Скончылася вольнае месца на прыладзе + Скончылася вольнае месца на прыладзе Прагрэс страчаны, так як файл быў выдалены Час злучэння выйшла Вы ўпэўнены\? @@ -411,34 +408,34 @@ Пачаць загрузку Прыпыніць загрузку Запытваць тэчку загрузкі - Для кожнай загрузкі запытваць тэчку для захавання - Выкарыстоўваць SAF - Storage Framework Access дазваляе захоўваць файлы на вонкавым назапашвальніку. -\nПадтрымліваецца не ўсімі прыладамі + Вам будзе прапанавана указаць месца захавання кожнай загрузкі. +\nУключыце сістэмны выбарнік тэчкі (SAF), калі вы хочаце загружаць файлы на знешнюю SD-картку + Выкарыстоўвайце сродак выбару сістэмных тэчак (SAF) + \'Storage Access Framework\' дазваляе загружаць на знешнюю SD-картку Пераключыць службу, выбраную ў дадзены момант: - Выдаліць ўсе пазіцыі прайгравання - Абмежаваны рэжым YouTube + Выдаліць усе пазіцыі прайгравання + Уключыце «Абмежаваны рэжым» YouTube Падтрымліваюцца толькі адрасы URL HTTPS Дадаць экзэмпляр Экзэмпляры PeerTube Вынікі для: %s - Мініяцюра відэа ў 1:1 - Мініяцюра відэа ў апавяшчэнні з 16:9 да 1:1 (магчымі скажэнні) + Абрэжце мініяцюру да прапорцый 1:1 + Абрэжце мініяцюру відэа паказванае ў апавяшчэнні з прапорцый 16:9 да 1:1 Кнопка чацвёртага дзеяння Кнопка трэцяга дзеяння Кнопка другога дзеяння Кнопка першага дзеяння Групы каналаў - Як у сістэме + Як ў сістэме Мова прылады Выберыце экзэмпляр Выдаліць загружаныя файлы Арыгінальныя тэксты з сэрвісаў будуць бачны ў ленце элементаў Ачысціце cookie, якія NewPipe захоўвае пры рашэнні reCAPTCHA - Экзэмпляр ужо існуе + Інстанцыя ўжо існуе Немагчыма праверыць экзэмпляр - Увесці URL экзэмпляра - Абярыце любімыя экзэмпляры PeerTube + Увядзіце URL-адрас сервера + Выбярыце улюбёныя інстанцыі PeerTube Актыўны плэер быў зменены Змена плэера можа замяніць вашу чаргу Запытаць, перш чым ачысціць чаргу @@ -448,23 +445,23 @@ Уключыць гук Цішына Дадаць у чаргу - Даданае у чаргу + Даданае ў чаргу Чарга прайгравання Найбольш папулярнае Лакальнае Нядаўна дададзенае - Няма закладак у плейлісце - Абярыце плэйліст + Няма закладак ў плейлісце + Выберыце плэйліст Кіёск па змаўчанні - Так - Націсніце \"Так\" калі вырашана + Так + Па завяршэнні націсніце «Гатова» ∞ відэа 100+ відэа Багрэпарт на GitHub Скапіруйце адфарматаваны багрэпарт Дайце дазвол на адлюстраванне паверх іншых праграм Выдаліць усе пазіцыі прайгравання\? - Выдаліць пазіцыі прайгравання + Выдаліць пазіцыю прайгравання Ачысціць reCAPTCHA cookies reCAPTCHA cookies былі ачышчаны Выканаўцы @@ -472,7 +469,7 @@ Песні Відэа Аўтаматычная чарга - Працягласць перамоткі ўперад/назад + Крок перамотвання Каляровыя апавяшчэнні Нічога Буферызацыя @@ -481,5 +478,377 @@ Кнопка пятага дзеяння Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымваецца не ўсімі прыладамі У кампактным апавяшчэнні дасяжна не больш за тры дзеянні! - Дзеянні можна змяніць, націснуўшы на іх. Адзначце не больш за трох для адлюстравання ў кампактным апавяшчэнні + Адрэдагуйце кожнае дзеянне апавяшчэння, націснуўшы на яго. Выберыце да трох з іх, якія будуць адлюстроўвацца ў кампактным апавяшчэнні, выкарыстоўваючы сцяжкі справа. + Не ўдалося распазнаць URL-адрас. Адкрыць у іншай праграме\? + Апавяшченне плэера + Апавяшчэнні + Новыя трансляцыі + Апавяшчэнні пра новыя трансляцыі ў падпісках + Апісанне + Падобныя матэрыялы + Ніхто не праглядае + аднаўленне + + %s глядач + %s глядача + %s глядачоў + %s глядачоў + + Падпіскі не выбраны + Апошняе абнаўленне: %s + Аўтаматычна (тэма прылады) + Выберыце любімую начную тэму - %s + Дазвол вылучэння тэксту ў апісанні + Вы можаце выбраць сваю любімую начную тэму ніжэй + Гэта опцыя даступна толькі тады, калі %s будзе выбранай тэмаю + Загрузка пачалась + Апавяшчэнні адключаныя + Рэжым планшета + Адключыць + Няма аўдыётрансляцый даступных для знешніх плэераў + Апавяшчаць + Няма даступных відэатрансляцый для знешніх плэераў + Выбраная трансляцыя не падтрымліваецца знешнімі плэерамі + Выберыце якасць для знешніх плэераў + Невядомая якасць + Невядомы фармат + Сартаваць + З-за абмежаванняў ExoPlayer працягласць пошуку была ўсталявана на %d сякундаў + Раздзелы + Пазначыць прагледжаным + Адкрыць з дапамогай + Начная тэма + Адкрыць вэб-сайт + Цяпер Вы можаце вылучаць тэкст у апісанні. Звярніце ўвагу, што ў рэжыме вылучэння старонка можа мігацець, а спасылкі могуць быць недаступныя для націскання. + Запусціць галоўны прайгравальнік у поўнаэкранным рэжыме + Паказаць дэталі канала + Нізкая якасць (менш) + Апавяшчэнне пра відэахэшуванне + Памер інтэрвалу загрузкі прайгравання + Паказаць апісанне + Каментары адключаны + + %s слухач + %s слухача + %s слухачоў + %s слухачоў + + + %d сякунда + %d сякунды + %d сякундаў + %d сякундаў + + + %d гадзіна + %d гадзіны + %d гадзін + %d гадзін + + + %d дзень + %d дня + %d дзён + %d дзён + + Ачысціць гісторыю загрузак + Мова зменіцца пасля перазапуску праграмы + Ніхто не слухае + Уключыць + Апавяшчэнні пра ход відэахэшування + Стварыць паведамленне пра памылку + Выберыце падпіскі + Імпарт ці экспарт падпісак з 3-кропкавага меню + Забарона вылучэння тэксту ў апісанні + Хуткі рэжым + Калі ў Вас узніклі праблемы з выкарыстаннем праграмы, абавязкова азнаёмцеся з адказамі на пашыраныя пытанні! + Адключыць тунэляванне медыя + Прагляд мініяцюры над паўзунком часу + Высокая якасць (больш) + Не паказваць + Вы выкарыстоўваеце апошнюю версію NewPipe + Немажліва аднавіць гэту загрузку + + Выдалена %1$s зазагрузка + Выдалена %1$s зазагрузкі + Выдалена %1$s зазагрузак + Выдалена %1$s зазагрузак + + Выдаліць усе загружаныя файлы з дыска? + + %d хвіліна + %d хвіліны + %d хвілінаў + %d хвілінаў + + Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (у цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку + Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю + Прапановы лакальнага пошуку + Наладзіць апавяшчэнне аб бягучым прайграванні патоку + Гэта відэа абмежавана па ўзросце. +\n +\nУключыце «%1$s» у наладах, калі хочаце бачыць гэта. + Апавяшчэнне аб памылцы + Апавяшчэнні для паведамлення аб памылках + NewPipe выявіў памылку, націсніце, каб паведаміць + Запускаць відэа ва ўвесь экран, калі адключаны аўтапаварот. Міні-плэер даступны пры выхадзе з поўнаэкраннага рэжыму + Знайдзіце асобнікі, якія вам падабаюцца, на %s + Паказаць метаінфармацыю + Ігнараваць падзеі апаратных медыякнопак + Паказваць змесціва, магчыма непрыдатнае для дзяцей, таму што яно мае ўзроставыя абмежаванні (напрыклад, 18+) + Калі ласка, праверце, ці існуе ўжо праблема з абмеркаваннем вашага збою. Пры стварэнні дублікатаў тыкетаў вы забіраеце ў нас час, які мы маглі б патраціць на выпраўленне фактычнай памылкі. + Адбылася памылка, глядзіце апавяшчэнне + Збой плэера + Карысна, напрыклад, калі вы карыстаецеся гарнітурай са зламанымі фізічнымі кнопкамі + Адключыце, каб схаваць поля метаінфармацыі з дадатковай інфармацыяй пра стваральніка патоку, змесціва патоку або пошукавы запыт + Прапановы аддаленага пошуку + Гэта відэа абмежавана па ўзросце. +\nУ сувязі з новай палітыкай YouTube у дачыненні да відэа з узроставымі абмежаваннямі, NewPipe не можа атрымаць доступ ні да аднаго са сваіх відэапатокаў і, такім чынам, не можа іх прайграваць. + YouTube забяспечвае «Абмежаваны рэжым», які хавае патэнцыйна змесціва для дарослых + Разлік хэша + Вырашана + Створана аўтаматычна (запампавальнік не знойдзены) + Плэйлісты, якія пазначаны шэрым, ужо ўтрымліваюць гэты элемент. + + %s новы стрым + %s новыя стрымы + %s новых стрымаў + %s новых стрымаў + + Каментарыі + У чаргу далей + У чарзе наступны + Загрузка звестак аб стрыме… + Апрацоўка... Можа заняць некаторы час + Дублікат дададзены %d раз + LeakCanary недаступны + Паказаць уцечкі памяці + Адключыце мультымедыйнае тунэляванне, калі ў вас з\'яўляецца чорны экран або заіканне падчас прайгравання відэа. + Не ўдалося скапіяваць у буфер абмену + Папка спампоўкі пакуль не ўстаноўлена, выберыце папку спампоўкі па змаўчанні + Часта задаюць пытанні + Перайсці на вэбсайт + Правядзіце пальцам па элементах, каб выдаліць іх + Адмяніць пастаянную мініяцюру + Паказаць індыкатары выявы + Паказваць каляровыя стужкі Пікаса на выявах, якія пазначаюць іх крыніцу: чырвоная для сеткі, сіняя для дыска і зялёная для памяці + Апрацоўка стужкі… + Вам будзе прапанавана, дзе захоўваць кожную спампоўку + Загрузка стужкі… + Выдаліць прагледжаныя відэа\? + Ды і відэа часткова прагледзеў + Працэнт + Відэа, якія былі прагледжаны да і пасля дадання ў спіс прайгравання, будуць выдалены. +\nВы ўпэўнены\? Гэта не можа быць адменена! + Паказвае варыянт збою пры выкарыстанні плэера + Выдаліць прагледжанае + Паказаць панэль памылак + Паўтон + Любая сетка + Не загружана: %d + Пачынаючы з Android 10 падтрымліваецца толькі «Storage Access Framework» + Праверка абнаўленняў… + Выдаліць дублікаты\? + Выдаліць дублікаты + Вы хочаце выдаліць усе паўтаральныя стрымы ў гэтым плэйлісце? + Новыя элементы стужкі + + %d выбраны + %d выбраныя + %d выбраных + %d выбраных + + Пустая назва групы + Вы хочаце выдаліць гэту групу\? + Новы + Паказаць толькі разгрупаваныя падпіскі + Маючыя адбыцца + Паказаць «Збой плэера» + Запусціце праверку новых патокаў + Збой праграмы + Апавяшчэнні аб новых стрымах + Апавяшчаць аб новых стрымах з падпісак + Частата праверкі + Патрабуецца падключэнне да сеткі + Праверце наяўнасць абнаўленняў + Праверце новыя версіі ўручную + Аўтаматычны запуск прайгравання — %s + Картка + Націсніце, каб спампаваць %s + + Загрузка скончана + %s загрузкі скончаны + %s загрузак скончана + %s загрузак скончана + + Заўсёды абнаўляць + Парог абнаўлення стужкі + Немагчыма загрузіць канал для «%s». + Стужка + Час пасля апошняга абнаўлення, перш чым падпіска лічыцца састарэлай — %s + Памылка загрузкі стужкі + Уліковы запіс аўтара быў спынены. +\nNewPipe не зможа загрузіць гэты канал у будучыні. +\nВы хочаце адмовіцца ад падпіскі на гэты канал? + Рэжым хуткай загрузкі стужкі не дае дадатковай інфармацыі аб гэтым. + Атрымлівайце са спецыяльнага канала, калі ён даступны + Уключыць хуткі рэжым + Катэгорыя + Тэгі + Ліцэнзія + Хост + Не ў спісе + Прыватная + , + Пераключыць усе + Стрымы, якія яшчэ не падтрымліваюцца загрузчыкам, не адлюстроўваюцца + Мініяцюра аватара канала + Аўтар: %s + Аўтару відэа спадабалася гэта + Створана %s + Адключыць хуткі рэжым + Публічная + Замацаваны каментар + Вы падпісаліся на канал + Апошнія + Радыё + Паказаць наступныя стрымы + Паказаць/схаваць стрымы + Гэты кантэнт яшчэ не падтрымліваецца NewPipe. +\n +\nСпадзяюся, ён будзе падтрымлівацца ў наступных версіях. + Старонка плэйліста + Паказаць мініяцюру + Выкарыстоўвайце мініяцюру як для фону экрана блакіроўкі, так і для апавяшчэнняў + Для гэтага дзеяння не знойдзены адпаведны дыспетчар файлаў. +\nКалі ласка, усталюйце файлавы мэнэджар або паспрабуйце адключыць «%s» у наладах загрузкі + Гэты кантэнт недаступны ў вашай краіне. + Гэта трэк SoundCloud Go+, прынамсі ў вашай краіне, таму NewPipe не можа трансляваць ці спампоўваць яго. + Гэта змесціва з\'яўляецца прыватным, таму NewPipe не можа яго трансляваць або спампоўваць. + Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго трансляваць або спампоўваць. + Уліковы запіс спынены + %s дае наступную прычыну: + Рэкамендаваны + Унутраная + Цалкам прагледзеў + Гэты кантэнт даступны толькі для аплачаных карыстальнікаў, таму NewPipe не можа яго трансляваць або спампоўваць. + Даступны ў некаторых службах, звычайна нашмат хутчэй, але можа вяртаць абмежаваную колькасць элементаў і часта няпоўную інфармацыю (напрыклад, без працягласці, тыпу элемента, без актыўнага стану) + Узроставае абмежаванне + Для гэтага дзеяння не знойдзены адпаведны дыспетчар файлаў. +\nКалі ласка, усталюйце файлавы менеджэр, сумяшчальны з Storage Access Framework + Ніякая праграма на вашай прыладзе не можа адкрыць гэта + Стандартнае значэнне ExoPlayer + Часткова прагледжана + Як вы думаеце, загрузка корму адбываецца занадта павольна? Калі так, паспрабуйце ўключыць хуткую загрузку (гэта можна змяніць у наладах або націснуўшы кнопку ніжэй). +\n +\nNewPipe прапануе дзве стратэгіі загрузкі корму: +\n• Атрыманне ўсяго канала падпіскі павольнае, але поўнае. +\n• Выкарыстанне спецыяльнай канчатковай кропкі абслугоўвання, якая працуе хутка, але звычайна не поўная. +\n +\nРозніца паміж імі заключаецца ў тым, што хуткаму звычайна не хапае некаторай інфармацыі, напрыклад, працягласці або тыпу элемента (не можа адрозніць жывыя відэа ад звычайных), і ён можа вяртаць менш элементаў. +\n +\nYouTube з\'яўляецца прыкладам сэрвісу, які прапануе гэты хуткі метад са сваім RSS-каналам. +\n +\nТакім чынам, выбар зводзіцца да таго, што вы аддаеце перавагу: хуткасць або дакладная інфармацыя. + Прыватнасць + Мова + Падтрымка + Дзеянне левага жэсту + Дзеянне правага жэсту + Яркасць + Нічога + Выбраць жэст для левай часткі экрана прайгравання + Гук + Выбраць жэст для правай часткі экрана прайгравання + Выбіраць зыходную гукавую дарожку незалежна ад мовы + Аддаць перавагу арыгінальнаму гуку + Аддаць перавагу апісальнаму гуку + Выберыце гукавую дарожку з апісаннем для людзей са слабым зрокам, калі яна ёсць + Аўдыё: %s + Гукавая дарожка + Выберыце гукавую дарожку для знешніх прайгравальнікаў + Невядомая + Налады ExoPlayer + Выкарыстоўваць функцыю рэзервовага дэкодэра ExoPlayer + Заўсёды выкарыстоўваць спосаб абыходу налад паверхні відэавываду ExoPlayer + %1$s %2$s + арыгінальны + дубляваны + апісальны + Гукавая дарожка ўжо павінна прысутнічаць у гэтай плыні + Уключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў + Кіраванне некаторымі наладамі ExoPlayer. Каб гэтыя змены ўступілі ў сілу, патрабуецца перазапуск гульца + Гэты абыходны шлях вызваляе і паўторна стварае відэакодэкі, калі адбываецца змяненне паверхні, замест таго, каб усталёўваць паверхню непасрэдна для кодэка. ExoPlayer ужо выкарыстоўваецца на некаторых прыладах з гэтай праблемай, гэты параметр мае ўплыў толькі на прыладах з Android 6 і вышэй +\n +\nУключэнне гэтай опцыі можа прадухіліць памылкі прайгравання пры пераключэнні бягучага відэаплэера або пераключэнні ў поўнаэкранны рэжым + Якасць выявы + Відэа + \? + Падпісчыкі + Якія ўкладкі паказаны на старонках канала + Падзяліцца спісам URL-адрасоў + Падзяліцца назвамі + %1$s +\n%2$s + Укладкі канала + Shorts + Загрузка метаданых… + Змяніць арыентацыю экрана + Нізкая якасць + Размяшчэнне асноўных укладак + Пераключыцца ў поўнаэкранны рэжым + Атрыманне ўкладак канала + Аватары + Наступны стрым + Медыятунэляванне было адключана па змаўчанні на вашай прыладзе, таму што ваша мадэль не падтрымлівае яго. + Аватары падканалаў + Адкрыйце чаргу прайгравання + Не загружаць выявы + Высокая якасць + Аб канале + Падзеліцца падборкай + Пераматаць наперад + Альбомы + Пераматаць назад + Паўтарыць + Атрыманыя ўкладкі пры абнаўленні стужкі. Гэты параметр не прымяняецца, калі канал абнаўляецца ў хуткім рэжыме. + Падзяліцца падборкай з такімі дэталямі, як назва спіса прайгравання і назвы відэа, або проста спіс URL-адрасоў відэа + Сярэдняя якасць + Загрузнік аватараў + Банеры + Падборкі + - %1$s: %2$s + Перамясціць селектар галоўнай укладкі ўніз + Няма жывых трансляцый + Выберыце якасць выявы і ці спампоўваць выявы ўвогуле, каб паменшыць выкарыстанне дадзеных і памяці. Змены ачышчаюць кэш малюнкаў як у памяці, так і на дыску - %s + Прайграць + Іншыя опцыі + Мініяцюры + Трэкі + Працягласць + Няма трансляцый + Каналы + Папярэдні стрым + Стрымы + + %s адказ + %s адказы + %s адказаў + %s адказаў + + Паказаць больш + Паказаць менш + Адрэдагуйце кожнае дзеянне апавяшчэння, націснуўшы на яго. Першыя тры дзеянні (прайграванне/паўза, папярэдняе і наступнае) задаюцца сістэмай і не могуць быць зменены. + Недастаткова вольнага месца на прыладзе + Так + NewPipe можа аўтаматычна правяраць наяўнасць абнаўленняў і паведаміць вам, калі яны будуць даступныя. +\nЖадаеце ўключыць гэтую функцыю? + Налады ў імпартаваным экспарце выкарыстоўваюць уразлівы фармат, які састарэў з версіі NewPipe 0.27.0. Пераканайцеся, што імпартаваны экспарт атрыманы з надзейнай крыніцы, і ў будучыні пераважней выкарыстоўваць толькі экспарт, атрыманы з NewPipe 0.27.0 ці навей. Падтрымка імпарту налад у гэтым уразлівым фармаце хутка будзе цалкам выдаленая, і тады старыя версіі NewPipe больш не змогуць імпартаваць наладкі з экспарту з новых версій. + Не + Рэзервовае капіраванне і аднаўленне + Скінуць наладкі + Скінуць усе налады на іх значэння па змаўчанні + Скід усіх налад прывядзе да скіду ўсіх вашых налад і перазапуску праграмы. +\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 0c1ce484f42..7cabc373593 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,6 +1,6 @@ - Докоснете лупата, за да започнете + Докоснете лупата, за да започнете. Публикувано на %1$s Не е намерен стрийм плейър. Инсталиране на VLC\? Инсталиране @@ -36,7 +36,7 @@ Покажи по-високи резолюции Само някои устройства могат да възпроизвеждат 2K/4K видео Въпроизвеждане с Kodi - Инсталиране на липсващото приложение \"Kore\"\? + Инсталиране на липсващо приложение Kore? Покажи „Възпроизвеждане с Kodi“ Показване на опция за възпроизвеждане на видео чрез „Kodi media center“ Аудио @@ -49,7 +49,7 @@ Помни размера и позицията на прозореца Използвай размера и позицията на прозореца от предишния път Предложения за търсене - Показвай предложения за търсене + Изберете предложенията, които да се показват при търсене История на търсенията Съхранявай заявките за търсене локално История на гледане @@ -57,20 +57,20 @@ Възобновяване Продължавай възпроизвеждането след прекъсване (например телефонно обаждане) Изтегли - Показвай „следващ“ и „подобни“ - Показвай съвет „задръж за добавяне“ + Покажи „следващ“ и „подобни“ + Покажи съвет „Задръжте за поставяне в опашка“ Непознат URL Език на съдържанието по подразбиране Плейър Поведение - Видео & аудио + Видео и аудио История и кеш Външност Възпроизвеждане във фонов режим Възпроизвеждане в подпрозорец Съдържание - Съдържание за възрастни - НА ЖИВО + Покажи съдържание с възрастови ограничения + На живо Изтегляния Изтегляния Съобщение за грешка @@ -81,7 +81,7 @@ Отмени Възпроизведи всички Известия от NewPipe - Известия за Фонов плейър и плейъра в Отделен прозорец на NewPipe + Известия за плейъра на NewPipe [Неизвестен] Грешка Проблем с мрежата @@ -94,14 +94,14 @@ Критичен проблем с плейъра Опит за възстановяване от възникналия проблем с плейъра Съжаляваме, това не би трябвало да се случва. - Докладвай за грешката чрез имейл - Съжаляваме, възникнаха някои грешки. + Докладвай чрез имейл + Съжалявам, нещо се обърка. Доклад Инфо: Какво се случи: Вашият коментар (на английски): Подробности: - Миниатюра на видео + Възпроизвеждане на видео, продължителност: Миниатюра на аватара на качилия видео Харесвания Нехаресвания @@ -121,8 +121,8 @@ Няма клипове - %s Клип - %s Клипове + %s видеоклип + %s видеоклипове Пауза Изтрий @@ -141,23 +141,22 @@ Букви и цифри За NewPipe Лицензи от трети страни - Относно приложението + За приложението Лицензи Безплатно и леко поточно предаване за Android. Виж в GitHub Изтегляне на стрийм файл - Покажи инфо + Покажи информация Отметнати плейлисти Добавяне към Използвай бързо, но неточно превъртане По-бързо превъртане с по-ниска прецизност. Превъртане с по 5, 15 или 25 секунди няма да работи с тази опция - Зареждай миниатюри Кеш-паметта с изображения е изтрита - Изтрий кешираните метаданни + Изтрий кешираните мета данни Премахни всички метаданни за уебстраници от кеш-паметта Кеш-паметта с метаданни бе изтрита - Автоматично нареди на опашка следващия - Автоматично прибавяне на сродно съдържание при неповтарящ се преглед + Автоматично поставяне на следващия поток в опашка + Добавете подобни потоци към опашката при възпроизвеждане на последния поток, освен ако повторението не е активирано Държава, за която да бъде показвано съдържание Отстраняване на грешки Винаги @@ -166,18 +165,17 @@ Мини във фонов режим Мини към нов прозорец Мини в основен режим - Импортиране на база данни - Експортиране на база данни - Замества текущите история и абонаменти - Експортиране на историята, абонаментите и плейлистите + Внасяне на база данни + Изнасяне на база данни + Замества текущата ви история, абонаменти, списъци за възпроизвеждане и (по избор) настройки + Изнасяне на история, абонаменти, плейлисти и настройки Изтрий историята с изгледани Изтрий цялата история с изгледани\? Историята с изгледани е изтрита Изтрий историята на търсенията Изтрива историята с въвежданите за търсене ключови думи Изтрий цялата история на търсенията\? - Историята на търсенията е изтрита. - URL подписът на клипа не можа да бъде дешифрован + Историята на търсене е изтрита Външните плейъри не поддържат този вид линкове Невалидна директория Невалиден файл или източник на съдържание @@ -191,7 +189,6 @@ Няма абонати Създай Откажи - Няма инсталирано приложение, което да изпълни този файл © %1$s от %2$s под лиценза %3$s Съдействайте За всичко, което се сетите: превод, промени по дизайна, изчистване на кода или много сериозни промени по кода – помощта е винаги добре дошла. Колкото повече развитие, толкова по-добре! @@ -206,16 +203,15 @@ Прочетете нашата политика за поверителност Лицензът на NewPipe Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма). - Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита - Показвай подсказка при избор на фоновия режим или режим в прозорец от екрана за „Детайли“ към видео + Покажи съвет при натискане на фона или изскачащия бутон във видеоклипа „Подробности:“ Изтрива историята на възпроизвежданите стриймове и позицията на възпроизвеждането Не са намерени видео стриймове Не са намерени аудио стриймове - Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nУслуга:\\nВреме по GMT:\\nПакет:\\nВерсия:\\nОС версия: + Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nДържава на съдържанието:\\nЕзик на приложението:\\nУслуга:\\nGMT Време:\\nПакет:\\nВерсия:\\nВерсия на ОС: Пренареди чрез плъзгане Начало Преименувай - Моля, изберете достъпна папка за изтегляния + Моля, определете папка за изтегляне по-късно в настройките Това разрешение се изисква за \nвъзпроизвеждане в отделен прозорец 1 елемент е изтрит. @@ -223,7 +219,7 @@ Изисква се въвеждане на reCAPTCHA Изтегляне Повечето специални символи - NewPipe е безплатен „copyleft“ софтуер: Можете да го използвате, изучавате, споделяте и подобрявате по желание. В частност, Вие можете да препубликувате и/или модифицирате приложението според правилата на Главния обществен лиценз на ГНУ, издаден от Фондацията за свободен софтуер – версия 3 на лиценза или по-нова. + NewPipe е свободен софтуер с авторски права: можете да го използвате, изучавате, споделяте и подобрявате по желание. По-конкретно можете да го разпространявате и/или променяте съгласно условията на Общия публичен лиценз на GNU, публикуван от Фондацията за свободен софтуер, версия 3 на лиценза или (по ваш избор) която и да е по-късна версия. Прочетете лиценза История История @@ -237,12 +233,12 @@ Изберете канал За момента нямате абонаменти Изберете павилион - Експортирането приключи - Импортирането приключи + Изнасянето приключи + Внасянето приключи Невалиден ZIP файл - Внимание: не всички файлове бяха импортирани успешно. + Внимание: не всички файлове бяха внесени успешно. Това ще замени текущата Ви инсталация. - Желаете ли също да импортирате настройките? + Искате ли да внесете и настройки? Набиращи популярност Топ 50 Ново и горещо @@ -251,14 +247,14 @@ Аудио настройки Задръжте, за да поставите на опашката Възпроизвеждане от тук при фонов режим - Възпроизвеждане от тук при прозорец + Започнете да възпроизвеждате в изскачащ прозорец Отвори навигационната лента Затвори навигационната лента Действие при повикване от друго приложение Действие по подразбиране при отваряне на съдържание — %s Видео плейър Във фонов режим - В прозорец + Изскачащ плейър Винаги питай Получаване на инфо… Зареждане на заявеното съдържание @@ -282,32 +278,17 @@ Модифицирай текстовия мащаб на надписите и стила на техния фон. За промените се изисква рестарт на приложението Следенето за пропускане на памет може да направи приложението нестабилно Докладвай за извънредни грешки - Импортирай - Импортирай от - Експортирай в - Импортиране… - Експортиране… - Файл с данни за импортиране - Предишно експортиране - Неуспешно импортиране на абонатите - Неуспешно експортиране на абонатите - Импортирайте вашите YouTube абонаменти чрез Google takeout: -\n -\n1. Посетете следната връзка: %1$s -\n2. Влезте в акаунта си, когато това се изиска -\n3. За продукти изберете „Премахване на избора от всички“ -\n4. Превъртете до YouTube и YouTube Music и отбележете тази опция -\n5. Изберете „Включени са всички данни“, след това „Премахване на избора от всички“. Отбележете само „абонаменти“ и изберете OK -\n6. Изберете „Следваща стъпка“, след това „Създаване на експортиране“ -\n5. Изберете бутона „Изтегляне“ след като той се появи -\n6. Изберете ВНЕСИ ФАЙЛ по-долу и посочете изтегления ZIP-файл -\n7. [В случай, че внасянето се провали] Разархивирайте .csv файла (обичайно в подпапка \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), изберете ВНЕСИ ФАЙЛ по-долу и посочете разархивирания CSV-файл - Импортирайте SoundCloud профил чрез въвеждане на хипервръзката към него или чрез вашия ID: -\n -\n1. Включете „десктоп режим“ в браузър (сайтът е недостъпен за мобилни устройства) -\n2. Посетете връзката: %1$s -\n3. Влезте в профила си, ако се изисква -\n4. Копирайте хипервръзката на профилната страница, към която сте насочени. + Внасяне + Внасяне от + Изнеси в + Внасяне… + Изнасяне… + Файл с данни за внасяне + Предишно изнасяне + Неуспешно внасяне на абонатите + Неуспешно изнасяне на абонатите + Внасяне на абонаменти в YouTube от Google Takeout: \n \n1. Отидете на този URL: %1$s \n2. Влезте, когато бъдете помолени \n3. Щракнете върху „Всички включени данни“, след това върху „Демаркиране на всички“, след това изберете само „абонаменти“ и щракнете върху „OK“ \n4. Кликнете върху „Следваща стъпка“ и след това върху „Създаване на износ“ \n5. Кликнете върху бутона \"Изтегляне\", след като се появи \n6. Кликнете върху ВНАСЯНЕ НА ФАЙЛ по-долу и изберете изтегления .zip файл \n7. [Ако внасянето на .zip е неуспешно] Разархивирайте .csv файла (обикновено под „YouTube и YouTube Music/subscriptions/subscriptions.csv“), щракнете върху ВНАСЯНЕ НА ФАЙЛ по-долу и изберете извлечения csv файл + Внесете профил в SoundCloud, като въведете или URL адреса, или вашия ID: \n \n1. Включете „десктоп режим“ в браузър (сайтът е недостъпен за мобилни устройства) \n2. Посетете връзката: %1$s \n3. Влезте в профила си, ако се изисква \n4. Копирайте хипервръзката на профилната страница, към която сте насочени. вашиятID, soundcloud.com/вашиятID Това действие може да изразходва голямо количество данни от вашия трафик. \n @@ -316,8 +297,8 @@ Темпо Височина Бързо превъртане при тишина - От съображения към Общия европейски регламент относно защитата на данните, Ви привличаме вниманието към политиката за поверителност на NewPipe. Моля, прочетете я внимателно. -\nТрябва да сте съгласни с условията, за да ни изпратите доклада за грешката. + За да се съобразим с Европейския общ регламент за защита на данните (GDPR), с настоящото обръщаме внимание на политиката за поверителност на NewPipe. Моля, прочетете го внимателно. +\nТрябва да го приемете, за да ни изпратите доклада за грешка. Приеми Откажи Без ограничения @@ -336,16 +317,12 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Контрол на звука с жестове - Използвай жестове за контрол на звука - Контрол на яркостта с жестове - Използвай жестове за контрол на яркостта Файлът е изтрит Събития - Показвай коментари - Изключване за скриване на коментарите + Покажи коментари + Изключете за скриване на коментарите Автоматично пускане - Избери раздел + Избор на раздел Промени Възобнови възпроизвеждането Изтрии данни @@ -362,8 +339,8 @@ Няма зрители Изтрива всички позиции на възпроизвеждане - URL адресът не можа да бъде разпознат. Да се отвори ли с друго приложение\? - Показване на описание + URL адресът не можа да бъде разпознат. Да се отвори ли с друго приложение? + Покажи описание Нощна тема Оцветяване на известие Нищо @@ -381,7 +358,7 @@ Не показвай Местни предложения за търсене Моля проверете дали има създадена дискусия за срив като този. Постъпилите дубликати са в ущърб на така ценното време за разработка. - Показване на метаданни + Покажи мета данни Мрежа Списък Четвърто действие @@ -429,7 +406,6 @@ Поддръжка Сървър Публичен - Миниатюра линк Език на интерфейса Спри звука пост-обработката @@ -454,12 +430,12 @@ Отбелязан със сърце от автора Конференции Най-харесвани - Готово + Готово Коментари Езикът ще се смени след рестартиране на приложението Скрит Частен - Предложения от сървъра + Предложения за отдалечено търсене Добави инстанция Видеа Доклад в GitHub @@ -476,7 +452,7 @@ Изберете инстанция Коментарите са изключени Кои раздели се показват на началната страница - Няма свободно място на устройството + Няма свободно място на устройството %d секунда %d секунди @@ -487,7 +463,7 @@ Прекъсване Максимален брой опити преди отменяне на изтеглянето Създай - Искате ли да изтриете тази група\? + Искате ли да изтриете тази група? Това съдържание не се поддържа от NewPipe. \n \nЕвентуално може да бъде поддържано в бъдещи версии. @@ -504,7 +480,7 @@ Изтеглянето се провали Възстанови първоначалните настройки Позиции в списъци - Изтеглянето във външна SD-карта не е възможно. Нулиране на местоположението на папката за изтегляне\? + Изтеглянето от външна SD карта не е възможно. Нулиране на местоположението на папката за изтегляне? Пусни звука Песни Изпълнители @@ -527,7 +503,7 @@ %d ден %d дни - Създадено от %s + Създаден от %s Съдържанието е достъпно само за хора, които са си платили, затова не може да бъде гледано или изтеглено с NewPipe. Това видео е достъпно за абонати на YouTube Music Premium, затова не може да бъде гледано или изтеглено с NewPipe. Премахни изгледаните видеа\? @@ -548,20 +524,293 @@ Това видео е с възрастова граница. \n \nВключете „%1$s“ в настройките ако искате да го пуснете. - Показвай цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) + Покажи цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) Автоматична (тази на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) - Покажи гледани Избете плейлист Известия Изчистване на бисквитките от reCAPTCHA Бисквитките от reCAPTCHA бяха почистени - Проверяване за актуализации… + Провери за актуализации… , - Провери за актуализации + Провери за актуализации Процент Неизвестно качество Неизвестен формат Наскоро добавено Буфериране + Разбийте плейъра + Изключете, за да скриете полетата с мета информация с допълнителна информация за създателя на потока, съдържанието на потока или заявка за търсене + Автоматично поставяне в опашка + Редактирайте всяко действие за известяване по-долу, като го докоснете. Изберете до три от тях, които да бъдат показани в компактното известие, като използвате квадратчетата за отметка вдясно. + Изберете оригиналния аудио запис независимо от езика + Превключването от един плейър на друг може да замени вашата опашка + Изберете аудиозапис с описания за хора с увредено зрение, ако има такъв + Действие с жест наляво + Предпочитай описателно аудио + Променете размера на интервала на зареждане на прогресивно съдържание (в момента %s). По-ниска стойност може да ускори първоначалното им зареждане + Предпочитай оригинално аудио + Опашката на активния плейър ще бъде заменена + Полезно, например, ако използвате слушалки със счупени физически бутони + Размер на интервала на зареждане при възпроизвеждане + Игнорирайте събитията с хардуерни медийни бутони + Изберете жест за лявата половина на екрана на плейъра + Покажи индикатори за позиция на възпроизвеждане в списъци + Редактирайте всяко действие за известяване по-долу, като щракнете върху него. Първите три действия (възпроизвеждане/пауза, предишно и следващо) се задават от системата и не могат да бъдат конфигурирани. + Изберете жест за дясната половина на екрана на плейъра + Действие с жест на дясно + Стартирайте основния плейър на цял екран + Известия за нови видеоклипове в абонаментите + Известявайте за нови видеоклипове в абонаментите + Да + Не + Яркост + Сила на звука + Нищо + За канала + Покажи по-малко + Покажи повече + Ръчно проверяване за нови версии + Добавено в опашка + Нови неща в емисията + %1$s %2$s + Зареждане на емисия… + Полутон + Ползвате най-новата в ерсия на NewPipe + Цъкнете да изтеглите %s + Добавяне в опашка + Сървърът не предостави данни + Премахни повторения? + Група от канали + Неуспешно зареждане на емисия за \'%s\'. + Акаунтът на автора е бил отстранен. +\nNewPipe няма да може да зареди тази емисия вече. +\nИскате ли да махнете абонамента от този канал? + Винаги опреснявай + Грешка при зареждане на емисия + Покажи/Скрий потоци + Съдържанието е лично, затова не може да бъде възпроизведено или изтеглено от NewPipe. + Можете да изберете любимата си тъмна тема по-долу + Режим таблет + Абонати + Избраният поток не се поддъжа от външни плеъри + Настройки на ExoPlayer + Подредба + Предстоящи + оригинално + Видеа + дублирано + Отваряне на опашка + Времетраене + Повече настройки + Качество на изображенията + \? + Сподели плейлиста + + %s отговор + %s отговора + + %1$s +\n%2$s + - %1$s: %2$s + Може да си харесате инстанции на %s + Инстанцията не можа да бъде потвърдена + Известие на плеъра + Неуспешно копиране в клипборда + Често задавани въпроси + Отвори уеб страницата + Възпроизвеждане на опашка + LeakCanary не е открито + Покажи къде изтича паметта + Спиране на бърз режим + Име на празна група + Използване на декодера на ExoPlayer като резервен + описателно + Напълно изгледани + Конфигуриране на известивето за текущо възпроизвеждания поток + Избор на аудио пътечка за външни плеъри + Няма налични потоци за външни плеъри + Бързият режим на емисията не предостави повече информация за това. + Тази настройка е налична само ако %s е избран за тема + Няма налични аудио потоци за външни плеъри + Аватари + Бърз режим + Избраната директорие не можа да бъде създадена + Честота на проверка + Следващ поток + Емисия + Резервно копие и възстановяване + Зареждане на метаданни… + Искате ли да възстановите настройките по подразбиране? + Покажи съдържание, което вероятно е неподходящо за деца, защото има възрастово ограничение (например 18+) + Възникна грешка, погледнете известието + Не е избрана директория за теглене. Изберете директорията за теглене по подразбиране сега + Аудио поток + Добави в опашка + Управление на някои настройки за ExoPlayer. Тези промени изискват рестартиране на плеъра, за да се отразят + Избор на качество за външни плеъри + Известията са спрени + ExoPlayer по подразбиране + Смятате ли, че емисията зарежда прекалено бавно? Ако смятате така, може да пробвате да включите режима за бързо зареждане (може да го промените от настройките или чрез бутона по-долу). +\n +\nNewPipe предлага два режима за зареждане: +\n• Зареждане на цялата страница на абонамента, което е бавно, но и пълно. +\n• Изпозване на специална страница, предоставена от услугата, което е бързо, но обичайно е и непълно. +\n +\nРазликата между двете е, че бързият режим няма пълна информация, например времетраенето и вида (не може да различава между видеа на живо и обикновени) и може да върне по-малко видеа. +\n +\nYoutube е примерна услуга, която предоставя този метод чрез RSS емисия. +\n +\nНакратко, изборът се свежда до предпочинанието ви: бързина или точна информация. + Емисията е последно обновявана: %s + Налично за някои услуги, обичайно е много по-бързо, но връща ограничено количество видеа и често пъти непълна информация (например няма времетраене, вид на видеото, дали е на живо) + Въведете URL адреса на инстанцията + Аудио: %s + Покажи информация за канала + Автоматично генерирани (не е намерен ъплоудер) + Създай известие за грешка + NewPipe може автоматично да проверява за нови версии от време на време и да ви известява при наличие. +\nИскате ли да го включите? + Не е намерено + Няма достатъчно свободно пространство на устройвството + NewPipe бе затворен, докато обработваше файла + Частично гледани + Неизвестен + Абонирахте се за този канал + Получавай известия + Обработване на емисия… + Време, след което се смята, че един абонамент е остарял — %s + Пускане на бърз режим + Високо качество + Ниско качество + Средно качество + Не зареждай изображения + Предишен поток + Албуми + Плейлисти + Канали + На живо + Прогресът е загубен, защото файлът е изтрит + Карта + Изтрий всички изтеглени файлове от диска? + Едно изтегляне ще се изпълнява едновременно + Попитайте къде да изтеглите + Система по подразбиране + Премахване на дубликати + Искате ли да премахнете всички дублиращи се потоци в този плейлист? + Покажи само на негрупирани абонаменти + Покажи следните потоци + Не е намерен подходящ файлов мениджър за това действие. +\nМоля, инсталирайте файлов мениджър или опитайте да деактивирате „%s“ в настройките за изтегляне + Не е намерен подходящ файлов мениджър за това действие. +\nМоля, инсталирайте файлов мениджър, съвместим с Storage Access Framework + Разрешете избирането на текст в описанието + Миниатюри + Аватари на качващите + Превключване на всички + Аудиозапис трябва вече да присъства в този поток + Записи + Какви раздели се показват на страниците на канала + Превключване на цял екран + Възпроизвеждане + Повторение + Превъртане назад + Напред + Споделете плейлист с подробности, като име на плейлист и заглавия на видеоклипове или като обикновен списък с URL адреси на видеоклипове + Споделяне на списък с URL + Изтрии всички позиции на възпроизвеждане? + Позициите за възпроизвеждане са изтрити + Позиция на основните раздели + Няма налично външно хранилище + Не можах да прочета запазените раздели, така че използвах тези по подразбиране + Дайте разрешение за показване върху други приложения + Подобни продукти + Внасяне или изнасяне на абонаменти от менюто с 3 точки + Няма потоци на живо + + %s нов поток + %s нови потоци + + Натиснете „Готово“, когато решите + Ако имате проблеми с използването на приложението, не забравяйте да проверите тези отговори на често задавани въпроси! + Плъзнете елементи, за да ги премахнете + Kiosk по подразбиране + Наредете следващия + Следващ в опашка + Подробностите за потока се зареждат… + Плейлистите, които са оцветени в сиво, вече съдържат този елемент. + Добавен дубликат %d път(а) + Показване на оригиналното време преди на елементите + Покажи \"Сриване на плейъра\" + Показва опция за срив при използване на плейъра + Стартирайте проверка за нови потоци + Покажи бърза лента за грешка + Местен + Максимален брой повторни опити + Ограничете опашката за изтегляне + Извличане от специална емисия, когато е налична + Премахване на постоянното миниизображение + Известия за нови потоци + Всяка мрежа + Покажи известие за актуализация на приложението, когато е налична нова версия + Акаунтът е прекратен + Фиксиран коментар + Потоци, които все още не се поддържат от програмата за изтегляне, не се показват + Това е песен на SoundCloud Go+, поне във вашата страна, така че не може да бъде предавана поточно или изтеглена от NewPipe. + Вече можете да изберете текст в описанието. Имайте предвид, че страницата може да трепти и връзките може да не могат да се кликват, докато сте в режим на избор. + Не стартирайте видеоклипове в миниплейъра, а директно превключете в режим на цял екран, ако автоматичното завъртане е заключено. Все още можете да получите достъп до миниплейъра, като излезете от цял екран + Известия за докладване на грешки + Оригиналните текстове от услугите ще се виждат в елементите на потока + Деактивирайте медийното тунелиране, ако имате черен екран или заекване при възпроизвеждане на видео. + Мултимедийното тунелиране е деактивирано по подразбиране на вашето устройство, тъй като е известно, че моделът на вашето устройство не го поддържа. + Изчакване на връзката + Ще бъдете попитани къде да запазите всяко изтегляне. +\nАктивирайте инструмента за избор на системна папка (SAF), ако искате да изтеглите на външна SD карта + Започвайки от Android 10, се поддържа само „Storage Access Framework“ + Ще бъдете попитани къде да запазите всяко изтегляне + Праг за актуализиране на емисия + Раздели за извличане при актуализиране на емисията. Тази опция няма ефект, ако каналът се актуализира чрез бърз режим. + Активирайте тази опция, ако имате проблеми с инициализацията на декодера, което се връща към декодери с по-нисък приоритет, ако инициализацията на първичните декодери е неуспешна. Това може да доведе до лоша производителност при възпроизвеждане, отколкото при използване на първични декодери + Кратки видеоклипове + Това заобиколно решение освобождава и инстанцира отново видео кодеци, когато възникне промяна на повърхността, вместо директно да зададе повърхността на кодека. Вече се използва от ExoPlayer на някои устройства с този проблем, тази настройка има ефект само върху Android 6 и по-нова версия +\n +\nАктивирането на тази опция може да предотврати грешки при възпроизвеждане при превключване на текущия видеоплейър или превключване на цял екран + Раздели на канали + Превключване на ориентацията на екрана + Изберете качеството на изображенията и дали изобщо да се зареждат изображения, за да намалите използването на данни и памет. Промените изчистват както кеша на изображенията в паметта, така и на диска — %s + Споделяне със заглавия + Извличане на раздели на канали + Настройките в изнасяния файл, който се внася, използват уязвим формат, който е отпаднал от NewPipe 0.27.0. Уверете се, че внесеният износ е от надежден източник, и предпочитайте в бъдеще да използвате само изнасяния, получени от NewPipe 0.27.0 или по-нова версия. Поддръжката за внасяне на настройки в този уязвим формат скоро ще бъде напълно премахната и тогава старите версии на NewPipe вече няма да могат да внасят настройки на изнесени от нови версии. + Видео хеш известие + Изчистете бисквитките, които NewPipe съхранява, когато разрешите reCAPTCHA + Необходима мрежова връзка + Нулирайте настройките + Нулирайте всички настройки до техните стойности по подразбиране + Нулирането на всички настройки ще отхвърли всички ваши предпочитани настройки и ще рестартира приложението. +\n +\nСигурни ли сте, че искате да продължите? + Решете + Известия за напредъка на хеширането на видео + Нови потоци + Известие за доклад за грешка + Преместете основния селектор на раздели най-долу + NewPipe откри грешка, докоснете, за да докладвате + Няма потоци + Деактивиране на медийното тунелиране + Покажи индикатори за изображения + В очакване + Неуспешна последваща обработка + Прекъсване на мрежи с измерване + Използване на системата за избор на папки (SAF) + Миниатюра на аватара на канала + Покажи миниатюра + Използване на миниатюри за фон на заключения екран и за известия + Представено + Изберете любимата си нощна тема — %s + Деактивирайте избора на текст в описанието + Аватари за подканали + Банери + Винаги използвайте заобикаляне на настройката на повърхността на видеоизхода на ExoPlayer + Изтрий позиции за възпроизвеждане + вторичен \ 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 34d507ee346..3f0d65c8239 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -61,7 +61,6 @@ ত্রুটি নেটওয়ার্ক ত্রুটি সব থাম্বনেইল লোড করা যায়নি - ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি ওয়েবসাইট বিশ্লেষন করা যায়নি কন্টেন্ট উপলব্ধ নয় ডাউনলোড মেনু সেটআপ করা যায়নি @@ -140,17 +139,11 @@ দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল মন্তব্যসমূহ লুকাতে বন্ধ করুন মন্তব্যসমূহ দেখাও - থাম্বনেইল লোড করো - থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে। ছবির ক্যাশ মোছা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো ক্যাশ করা মেটাডেটা মোছ মেটাডেটা ক্যাশ মোছা হয়েছে পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ সম্পন্ন তালিকা তালিকা আকারে সাজাও @@ -172,7 +165,7 @@ বন্ধ করুন ডাউনলোড করা ফাইলগুলো ডিলিট করুন ডাওন লোড ইতিহাস মুছুন - ডিভাইস এ স্পেস নেই + ডিভাইস এ স্পেস নেই পাওয়া যায় নি সার্ভার পাওয়া যায় নি এরর দেখান @@ -264,7 +257,7 @@ পিয়ার টিউব এর ইন্সটান্স সমূহ ছক স্থানীয় - হয়েছে + হয়েছে ইভেন্টগুলো আপডেট কোনোটি না @@ -303,9 +296,8 @@ প্রথম ক্রিয়া বোতাম থাম্বনেল ১:১ অনুপাতে সেট করো সিস্টেম ডিফল্ট - এ ফাইলটি চালানোর জন্য কোন অ্যাপ ইন্সটলকৃত নেই প্লেলিস্ট বুকমার্ক করুন - "যখন পর্যাপ্ত নিবেদিত ফিড থেকে ডাটা সংগ্রহ করুন" + যখন পর্যাপ্ত নিবেদিত ফিড থেকে ডাটা সংগ্রহ করুন সবসময় হালনগাদ করুন শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s ফিড হালনাগাদ প্রবেশস্থল @@ -325,11 +317,11 @@ চ্যানেল গ্রুপ %d দিন - "%d দিন" + %d দিন %d ঘন্টা - "%d ঘন্টা" + %d ঘন্টা %d মিনিট @@ -409,7 +401,7 @@ কনটেন্টের জন্য পূর্বনির্ধারিত দেশ বাইরের প্লেয়ারসমূহ এ ধরনের লিঙ্কসমূহ সমর্থন করে না হ্যাশ হিসাব করা হচ্ছে - আপডেট চেক করো + আপডেট চেক করো %s জন দেখছে %s জন দেখছে diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 096674cce38..29522f6ad14 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -44,7 +44,6 @@ ডাউনলোড মেনু সেটআপ করা যায়নি কন্টেন্ট উপলব্ধ নয় ওয়েবসাইট বিশ্লেষন করা যায়নি - ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি সব থাম্বনেইল লোড করা যায়নি নেটওয়ার্ক ত্রুটি ত্রুটি @@ -74,19 +73,13 @@ ডাউনলোড ইতিহাস খোজ ইতিহাস - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো ক্যাশ করা মেটাডেটা মুছো ছবির ক্যাশ মুছে ফেলা হয়েছে - থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন মতামত প্রদর্শন করুন - থাম্বনেইল লোড করুন দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল অনির্দিষ্ট সন্ধান প্লেয়ারকে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না ৷ দ্রুত টানা ব্যাবহার করুন @@ -101,7 +94,7 @@ অডিও Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর দেখাও \"Kodi এর মাধ্যমে চালাও \" বিকল্প - হারানো কোর ইনস্টল করবেন\? + অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন\? Kodi এর মাধ্যমে চালান শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে উচ্চ রেজোল্যুশন দেখাও @@ -148,7 +141,7 @@ অ্যাপ এর ভাষা বন্ধ করুন ডাওন লোড ইতিহাস মুছুন - ডিভাইস এ স্পেস নেই + ডিভাইস এ স্পেস নেই পাওয়া যায় নি সার্ভার পাওয়া যায় নি ডাউন লোড হয় নি @@ -246,7 +239,7 @@ যোগদান নিউ পাইপ এর সম্বন্ধে শব্দ ও নম্বর - হয়েছে + হয়েছে কোন মন্তব্য নেই কোন সাবস্ক্রাইবার নেই ডাউন লোড এর জন্য কোন স্ট্রিম নেই @@ -282,7 +275,7 @@ নিউ পাইপ ওয়েব সাইট এ যান বিস্তারিত বিবরণ ও খবর এর জন্য ১০০+ ভিডিও - "%s শ্রোতা" + %s শ্রোতা %s শ্রোতা গন বিবরণ diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 899103c9d5d..853b04b64f7 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -10,7 +10,7 @@ বন্ধ করুন ডাউনলোড করা ফাইলগুলো ডিলিট করুন ডাওন লোড ইতিহাস মুছুন - ডিভাইস এ স্পেস নেই + ডিভাইস এ স্পেস নেই পাওয়া যায় নি সার্ভার পাওয়া যায় নি এরর দেখান @@ -78,7 +78,7 @@ নিউপাইপ এর সম্বন্ধে শব্দ ও নম্বর ডাউনলোড - হয়েছে + হয়েছে reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে reCAPTCHA চ্যালেঞ্জ একটি আইটেম ডিলিট হয়েছে। @@ -140,7 +140,6 @@ ডাউনলোড মেনু সেটআপ করা যায়নি কন্টেন্ট উপলব্ধ নয় ওয়েবসাইট বিশ্লেষন করা যায়নি - ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি সব থাম্বনেইল লোড করা যায়নি নেটওয়ার্ক ত্রুটি বাহ্যিক স্টোরেজ নেই @@ -220,19 +219,13 @@ খোজ ইতিহাস সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো ক্যাশ করা মেটাডেটা মুছো ছবির ক্যাশ মুছে ফেলা হয়েছে - থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন মতামত প্রদর্শন করুন - থাম্বনেইল লোড করুন দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল অনির্দিষ্ট সন্ধান, চালককে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না। দ্রুত টানা ব্যাবহার করুন @@ -250,17 +243,17 @@ প্রথম ক্রিয়া বোতাম থাম্বনেলে ১:১ অনুপাতে করো Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর - \"Kodi দ্বারা চালান\" বিকল্পটি প্রদর্শন কর - হারানো কোর ইনস্টল করবে\? - Kodi দ্বারা চালাও + \"Kodi-তে প্লে করুন\" দেখান + Kodi ইনস্টল করবেন? + Kodi-তে প্লে করুন শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে - উচ্চতর রেজুলেশন প্রদর্শন করা হবে - সহজাত ভাসমান আকার - সহজাত আকার - অডিও ফাইলগুলির জন্য ডাউনলোডের ফোল্ডার নির্বাচন করুন - ডাউনলোড করা অডিও ফাইলগুলি এখানে সঞ্চিত থাকে + উচ্চতর রেজুলেশন দেখান + স্বাভাবিক পপ-আপ রেজুলেশন + স্বাভাবিক রেজুলেশন + অডিও ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন + ডাউনলোড করা অডিও এখানে থাকবে অডিও ডাউনলোড ফোল্ডার - ভিডিওগুলি ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন + ভিডিও ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন ডাউনলোড করা ভিডিওগুলো এখানে থাকে ভিডিও ডাউনলোড করার ফোল্ডার যুক্ত করুন @@ -268,33 +261,33 @@ ব্যাকগ্রাউন্ড ট্যাব পছন্দ করুন বুকমার্ক করা প্লেলিস্টসমূহ - সদস্যতা + সাবস্ক্রিবশন তথ্য দেখুন - সদস্যতা হালনাগাদে ব্যর্থ - সদস্যতা পরিবর্তন করা যায়নি - চ্যানেল থেকে আনসাবস্ক্রাইব্ড + সাবস্ক্রিবশন হালনাগাদ করা সম্ভব হয়নি + সাবস্ক্রিবশন পরিবর্তন করা সম্ভব হয়নি + চ্যানেল আনসাবস্ক্রাইব করা হয়েছে আনসাবস্ক্রাইব - সাবস্ক্রাইব করা আছে + পূর্ব-সাবস্ক্রাইবকৃত সাবস্ক্রাইব - বহির্গত অডিও প্লেয়ার ব্যবহার করুন - কিছু রেজোলিউশনে অডিও অপসারণ করে দেয় - বাইরের ভিডিও প্লেয়ার ব্যবহার করুন + অন্যান্য অডিও প্লেয়ার ব্যবহার করুন + কিছু কিছু রেজুলেশনে অডিও ঠিকঠাক থাকবে না + অন্যান্য ভিডিও প্লেয়ার ব্যবহার করুন শেয়ার করুন - রেজাল্ট দেখানো হচ্ছেঃ %s - তুমি কি বুঝিয়েছো ‘%1$s’\? + ফলাফল দেখানো হচ্ছেঃ %s + আপনি কি ‘%1$s’ বোঝাচ্ছেন? সেটিংস খুঁজুন - স্ট্রিম ফাইল ডাউনলোড করুন - ডাউনলোউড + ডাউনলোড করুন + ডাউনলোড শেয়ার - ভাসমান অবস্থায় খুলো - ব্রাউজারে খুলো + পপআপ মুডে চালু করুন + ব্রাউজারে চালু করুন বাতিল ইনস্টল - কোনো ধারা চালক পাওয়া যায়নি (প্লে করতে VLC ইন্সটল করতে পারো)। - কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান\? + কোনো মিডিয়া প্লেয়ার পাওয়া যায়নি (মিডিয়া প্লে করতে VLC ইন্সটল করতে পারেন)। + কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান কি? প্রকাশকাল %1$s - আতশী কাঁচে টিপ দিয়ে শুরু করো। + আতশ কাঁচে চাপ দিয়ে শুরু করো। বাফারিং সাফল পঞ্চম অ্যাকশন বাটন @@ -349,7 +342,7 @@ রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে - "স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে" + স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে একটি পপ-আপে প্লে শুরু করো পটভূমিতে প্লে শুরু করো অ্যান্ড্রয়েডে মুক্তভাবে ও সহজে প্রচার দেখার অ্যাপ। @@ -439,7 +432,7 @@ অধ্যায় মতামত বর্ণনা - দিয়ে খুলো + অন্য অ্যাপে ওপেন করুন ফিড হালনাগাদ সীমা খালি গ্রুপ নাম কোনো সদস্যতা নির্বাচিত হয়নি @@ -491,7 +484,6 @@ শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s তুমি কি এ গ্রুপটি মুছতে চাও\? আরও তথ্য এবং খবরের জন্য নিউপাইপ ওয়েবসাইট দেখো। - এ ফাইলটি চালানোর জন্য কোন অ্যাপ ইন্সটলকৃত নেই এতে তোমার বর্তমান অবস্থা সরানো হবে। সতর্কতা: সব তথ্য আনা যায়নি। © %3$s এর মাধ্যমে %2$s দিয়ে %1$s @@ -539,7 +531,8 @@ রিক্যাপচা পূরণ করলে নিউপাইপ যেসব কুকি রাখে তা মুছো ধারা ভুক্তিতে সেবাগুলোর মূল লেখা দৃশ্যমান হবে অনুসন্ধান ইতিহাস থেকে এই ভুক্তিটি মুছবে\? - প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে + প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে। +\nমেমোরি কার্ডে ডাউনলোড করতে সিস্টেম ফোল্ডার পিকার (SAF) এনেবল করুন এই নামের একটি ডাউনলোড চলমান অ্যাপ আবার শুরু হলে ভাষা পাল্টাবে মিডিয়া সুরঙ্গকরণ অক্ষম @@ -555,7 +548,6 @@ প্রক্রিয়াকরণ ফিডে ত্রুটি ওয়েবসাইট খুলুন অ্যাকাউন্ট ধ্বংসকৃত - প্রতিচ্ছবি সংযোগ বয়সসীমা অভ্যন্তরীণ ব্যক্তিগত @@ -571,15 +563,14 @@ মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে। \n \nচালিয়ে যাবে\? - দেখা ভুক্তি দেখাও ট্যাবলেট অবস্থা বন্ধ চালু - ডাউনলোড সমাপ্ত - %sটি ডাউনলোড সমাপ্ত + ডাউনলোড শেষ + %sটি ডাউনলোড শেষ - দেখা হয়েছে চিহ্নিত করো + দেখা হয়েছে বলে চিহ্নিত করুন চালক বিজ্ঞপ্তি নিম্ন মান(ছোট) মূল তৈরিকারকের পছন্দ করা @@ -605,7 +596,7 @@ পিনকৃত মন্তব্য বিজ্ঞপ্তি হালনাগাদ দেখা হচ্ছে … - হালনাগাদ আছে কিনা দেখো + হালনাগাদ আছে কিনা দেখো মূল প্লেয়ার ফুল স্ক্রীন এ শুরু করুন ধারার নতুন ভুক্তি ত্রুটি প্রতিবেদন এর বিজ্ঞপ্তি @@ -633,15 +624,13 @@ ত্রুটি স্ন্যাকবার দেখাও নতুন সংস্করণের জন্য নিজে দেখো - %1$sটি ডাউনলোড মুছা হয়েছে - %1$sটি ডাউনলোড মুছা হয়েছে + %1$sটি ডাউনলোড মোছা হয়েছে + %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 e865f3c22ce..4921a6aa828 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -28,7 +28,7 @@ Otkazana pratnja kanala Nije moguće promijeniti pratnju Nije moguće ažurirati pratnju - Instalirajte nedostajeću Kore aplikaciju\? + Instalirajte nedostajeću Kode aplikaciju\? Obilježeni Popisi Iskačni prozor Izaberite Podprozor @@ -70,11 +70,9 @@ 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 - Isključite kako bi ste spriječili učitavanje sličica, sto če vam spasiti korištenje podataka i memorije. Promjene čiste slike oboje u memoriji i predmešiju na disku Prikažite komentare Pokažite \'Sljedeće\' i \'Slične\' video zapise Prikažite opis @@ -89,13 +87,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 @@ -120,5 +114,4 @@ Pokrenite s KODI-jem Vrijeme premotavanja naprijed/nazad Aktivni pokretni red će biti zamijenjen - Učitajte sličice \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ae4e4f018b9..eb8757e6206 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -61,7 +61,7 @@ Error Baixades Llicències de tercers - Quant a + Quant a i PMF Llicències Col·labora-hi Lloc web @@ -121,7 +121,6 @@ Recorda la darrera mida i posició del reproductor emergent Cerca ràpida poc precisa La cerca poc precisa permet que el reproductor cerqui una posició més ràpidament amb menys precisió. Cerques de 5, 15 o 25 segons no funcionaran - Carrega les miniatures S\'ha eliminat la memòria cau d\'imatges Elimina les metadades de la memòria cau S\'ha esborrat la memòria cau de metadades @@ -138,7 +137,6 @@ Notificació de NewPipe Notificacions per al reproductor de NewPipe No s\'han pogut carregar totes les miniatures - No s\'ha pogut desxifrar la signatura de l\'URL del vídeo No s\'ha pogut processar el lloc web Contingut no disponible No s\'ha pogut configurar el menú de baixades @@ -153,7 +151,7 @@ El fitxer no existeix o bé no teniu permisos de lectura/escriptura El nom del fitxer no pot estar en blanc S\'ha produït un error: %1$s - Informeu de l\'error per correu electrònic + Informeu per correu electrònic S\'han produït alguns errors. Informe Informació: @@ -217,7 +215,6 @@ Toca \"Cerca\" per començar. Elimina l\'àudio en algunes resolucions Reproductor d\'àudio extern - Desactiveu-ho per no guardar miniatures i estalviar dades i memòria. Canviant aquesta opció, s\'eliminarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge Emmagatzema les cerques localment Crea un historial de vídeos visualitzats Reprèn la reproducció @@ -299,7 +296,6 @@ No hi ha vídeos que es puguin baixar Subtítols Modifica la mida i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis - No s\'ha trobat cap aplicació instal·lada que pugui reproduir aquest fitxer Neteja l\'historial de reproduccions Neteja l\'historial dels vídeos reproduïts i les posicions de reproducció Voleu suprimir tot l\'historial de reproduccions\? @@ -334,10 +330,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 @@ -393,7 +385,7 @@ Reprèn la reproducció No es pot sobreescriure el fitxer Hi ha una baixada pendent amb aquest nom - No hi ha espai disponible al dispositiu + No hi ha espai disponible al dispositiu S\'ha perdut el progrés perquè s\'ha eliminat el fitxer S\'ha excedit el temps d\'espera de la connexió Esteu segurs que voleu esborrar el vostre historial de baixades o esborrar-ne tots els fitxers\? @@ -543,7 +535,7 @@ Local Encara no hi ha llistes de reproducció favorites Sel·leccioneu una llista de reproducció - Fet + Fet Calculant-ne la funció de verificació Si us plau, comproveu abans si el problema que ha causat aquesta fallada ja ha estat informat. Els tiquets per duplicat fan que perdem temps que podríem aprofitar resolent-los. Avisa del problema a GitHub @@ -569,14 +561,14 @@ Mescla Repeteix El màxim d\'accions que poden aparèixer en una notificació compacta és de tres! - Editeu cada acció de la notificació tocant el botó corresponent. Podeu seleccionar-ne fins a tres, que es mostraran a les notificacions en format compacte + Editeu cada acció de la notificació tocant el botó corresponent. Podeu seleccionar-ne fins a tres, que es mostraran a les notificacions en format compacte. Cinquè botó d\'acció Quart botó d\'acció 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ó @@ -607,7 +599,6 @@ Privat Descatalogat Públic - URL de la miniatura Amfitrió Suport Idioma @@ -625,7 +616,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\? @@ -650,7 +640,7 @@ Si la rotació automàtica està bloquejada, no inicieu vídeos al mini reproductor, sinó que aneu directament al mode de pantalla completa. Podeu accedir igualment al mini reproductor sortint de pantalla completa Notificació d\'informe d\'error Tancar abruptament el reproductor - Comprovar si hi ha actualitzacions + Comprovar si hi ha actualitzacions Comprovar manualment si hi ha noves versions Baixada finalitzada @@ -701,4 +691,41 @@ Format desconegut Cualitat desconeguda Ordenar + Configura la notificació de reproducció actual. + Canvia la mida de l\'interval de càrrega en continguts progressius (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. + 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ó + Acció de gest esquerra + Editeu cada acció de notificació de sota tocant-la. Les tres primeres accions (reproduir/pausa, anterior i següent) són establertes pel sistema i no es poden personalitzar. + Tria un gest per a la meitat dreta del reproductor + Acció del gest dret + Brillantor + Volum + Cap + Mou el selector de pestanya principal a la part inferior + Posició de les pestanyes principals + Prefereix àudio descriptiu + Seleccioneu la pista d\'àudio original independentment de l\'idioma + Prefereix l\'àudio original + Mode ràpid + Carregant Metadades… + Seleccioneu una pista d\'àudio amb descripcions per a persones amb discapacitat visual si està disponible + Nous streams + Notificacions sobre nous streams per a subscripcions + Ha fallat en copiar al porta-retalls + + Còpia de seguretat i restauració + Cap retransmissió en directe + Importa o exporta les subscripcions des del menú de 3 punts + + %s retransmissió nova + %s retransmissions noves + %s retransmissions noves + + Àudio: %s + Pista d\'àudio + No + Cap emissió \ 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 00ac35aff08..e6e375a4cc6 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -16,13 +16,12 @@ پڕۆژەی نیوپایپ زانیارییە تایبەتییەکانت بە وردی دەپارێزێت. هەروەها به‌رنامه‌كه‌ هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات. \n‫سیاسەتی تایبەتی نیوپایپ بە وردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێت و بەکاریاندەبات. ناتوانرێت لە بیرگەی دەرەکیدا داببەزێنرێت . شوێنی فۆڵده‌ری دابه‌زاندنەکان ڕێکبخرێتەوە؟ - ناکارای بكه‌ بۆ وەستاندنی باركردنی وێنۆچكه‌كان، داتا دەپارێزێت و کەمتر بیرگە بەکاردەبات, گۆڕینی ئه‌مه‌ ده‌بێته‌ هۆی سڕینه‌وه‌یان له‌سه‌ر بیرگه‌ی مۆبایله‌كه‌ت - ئایا مەبەستت ئه‌مه‌یه‌ \"%1$s\"؟ + مەبەستت لە ئەمەیە ٪1$s ؟ ماوەی نوێكردنه‌وه‌ی فیید هێڵەکی به‌رده‌وامبوون له‌ (به‌بێ دووباره‌كردنه‌وه‌) نۆبه‌تی کارپێکەر به‌پێی په‌خشی هاوشێوه‌ سنووردانانی نۆرەی دابەزاندن - بیرگەی ناوەکیت پڕ بووە + بیرگەی ناوەکیت پڕ بووە ژمارەی بەژداری نادیارە ناتوانرێت لەسەر ئەو فایله‌وه‌ جێگیر بکرێت په‌ڕه‌ هەڵبژێرە @@ -34,7 +33,7 @@ ناو چارەسەرکردن هه‌ره‌سی هێنا بچوکبوونەوە لەکاتی گۆڕینی به‌رنامه‌ - فایلی ڤیدیۆ دابه‌زێنراوەکان لێرەدا هەڵدەگیرێن + فایلی ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن هەناردە کردنی مێژوو ، بەژدارییه‌كان ، خشته‌لێدانه‌كان و ڕێكخستنه‌كان بردنەپێشی ناتەواوی خێرا وا لە لێدەرەکە دەکات کە بەخێرایی شوێنەکە بگۆڕێت. بردنەپێشی ٥ یان ١٥ یان ٢٥ چرکەیی لەگەڵ ئەمەدا کارناکات سکاڵاکردن لەسەر نەگەیاندنی Rx ی پەسەندنەکرا لە دەرەوەی پارچە یان چالاکی لەدوای پوختەکردن @@ -91,7 +90,7 @@ لێدان به‌ Kodi ناتوانرێت لێدوانەکان باربکرێن بەستەری دۆخ دابنێ - فایلی دەنگە دابه‌زێنراوەکان لێرەدا هەڵدەگیرێن + فایلی دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن ببورە، هەندێك کێشە ڕوویدا. هەناردە کردن بۆ ڕەفتار @@ -106,14 +105,13 @@ لادانی نیشانه‌كراو مۆڵەتەکان ناتوانرێت به‌ژداریكردنه‌كه‌ نوێبكرێته‌وه‌ - پاشبنەما + پشت شاشە بێ ئەنجامه‌ زمان دەگۆڕدرێت لەدوای داگیرساندنەوەی به‌رنامه‌كه‌ لادانی سەیرکراو پیشاندانی نیشانەکەری شوێنی کارپێکەر لە خشتەکاندا - باركردنی وێنۆچكه‌كان شوێنەکان لە خشتەکاندا - به‌ژداریت + به‌ژداریتکرد بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە به‌رنامه‌كه‌ دابگیرسێنیته‌وه‌ %d دیار کراوه‌ @@ -134,8 +132,8 @@ ‫%s بینراو ‫%s بینراوان - ڕاگرتن - فۆڵدەری دابه‌زاندنی فایله‌ دەنگییەکان هەڵبژێرە + وەستاندن + فۆڵدەری داگرتنی فایله‌ دەنگییەکان هەڵبژێرە نوێ سڕینەوەی مێژووی سەیرکراو بەردەوام بوونی کارپێکەر @@ -148,7 +146,6 @@ پیشاندانی کێشە هەرده‌م نوێ بكرێته‌وه‌ ناتوانرێت بەژدارییەکان هاورده‌ بكرێنه‌وه‌ - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە دیمه‌ن هاوردە كردنی داتابه‌یس مێژووی گه‌ڕان @@ -161,7 +158,7 @@ لێدانی گشتی هەمان فایل/بابەت بوونی نییە دەستپێکردن - به‌ژداری + به‌ژداریکردن بژاردەی ”لێدان بە Kodi“ پیشانبدرێت به‌ژدارییه‌كان پەڕەی بەتاڵ @@ -172,7 +169,6 @@ دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن دابه‌زاندن ژێرنووسەکان - کۆنترۆڵی دەنگ بەجوڵەی پەنجە خستنه‌ نۆبه‌تی-خۆكاری په‌خشی دواتر لێده‌ره‌ دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن کردار ڕەتکرایەوە لەلایەن سیستەمەوە @@ -203,12 +199,12 @@ وێنۆچکەی سه‌روێنه‌ی کەناڵ دەتەوێت ڕێکخستنەکانیش هاوردە بكرینه‌وه‌؟ هیچ لێدەرێکی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟ - فۆڵده‌ری دابه‌زاندنی ڤیدیۆ + فۆڵده‌ری داگرتنی ڤیدیۆ کردنەوەی پلیکانە ڕووناك ئەو پێشنیازکراوانە هەڵبژێرە کە پیشان دەدرێن لەکاتی گەڕاندا کردارەکە هه‌ره‌سی هێنا, چونکە ئەو فایله‌ سڕاوەتەوە - زیادکردن بۆ + زیادی بکە بۆ به‌ژداری نییه‌ دۆخی پێرتووب خشتەلێدان سازکرا @@ -218,7 +214,7 @@ ∞ ڤیدیۆ بەکارهێنانی بردنەپێشی ناتەواوی خێرا هەڵەیەک ڕوویدا : %1$s - فۆڵده‌ری دابه‌زاندن بۆ فایلی ڤیدیۆکان هەڵبژێرە + فۆڵده‌ری داگرتن بۆ فایلی ڤیدیۆکان هەڵبژێرە ساز کراوه‌ لەلایەن %s بەکارهێنەران بابەت @@ -232,7 +228,7 @@ سیاسەتی تایبەتی نیوپایپ دابه‌زاندن ناكاراکردنی دۆخی خێرا - كردنه‌وه‌ له‌ وێبگه‌ر + ئەم بڕگەی پێڕستە ڤیدیۆیەک یان ستریمێکی دەنگی دەکاتەوە لە وێبگەڕێکدا ڕاژەکە هیچ داتایەک نانێرێت شوێنی کارپێکراوەکان سڕانەوە پەیامەکانی وەشانە نوێیەکانی نیوپایپ @@ -265,7 +261,7 @@ %d ڕۆژان ناولێنانه‌وه‌ - دابه‌زاندن + داگرتن باشە سڕینه‌وه‌ی پاشماوەی مێتاداتا ناتوانرێت ئەمه‌ داببه‌زێنرێته‌وه‌ @@ -297,7 +293,7 @@ دابه‌زاندنێكی دیكه‌ له‌ نۆره‌دایه‌ بەهەمان ناو هیچ بەژدارییەک دیار نەکراوە ناوی کۆمەڵە بەتاڵە - كرا + كرا بەدڵه‌كان بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ سازکردن @@ -319,7 +315,6 @@ کرداری بنەڕەتی لەکاتی کردنەوەی بابەتدا — %s هکیۆسکێک دیار بکە کۆنفرانسەکان - هیچ به‌رنامه‌یه‌ك دانەمەزراوە بۆ لێدانی ئەم فایله‌ كردنه‌وه‌ له‌ دۆخی په‌نجه‌ره‌ سنووری قەبارە لەکاتی بەکارهێنانی ڕایه‌ڵه‌ی مۆبایل داخستنی پلیکانە @@ -330,9 +325,8 @@ ناتوانیت گۆڕانكاری له‌م به‌ژدارییه‌دا بكه‌یت قه‌باره‌ی بنەڕەتی بچووککردنەوە بۆ پەنجەرە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما گۆرانییەکان - دابه‌زاندنی فایلی پەخش + داگرتنی فایلی پەخش شێوازی پیشاندانی خشتە زیادکردنی دۆخ پەسەند @@ -345,11 +339,10 @@ فایل نەدۆزرایەوە چارەسەردەکرێت - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ بابەتی پەڕەی سەرەکی دیار کردنی بەژدارییەکان هاورده‌كردنی فایل - فۆڵده‌ری دابه‌زاندنی ده‌نگ + فۆڵده‌ری داگرتنی ده‌نگ هه‌ندێك له‌ قه‌باره‌كان ده‌نگیان تێدا نامێنێته‌وه‌ ڕووداوەکان وێنۆچکەی کەسی بەرزکەرەوە @@ -390,7 +383,6 @@ هەمان فۆڵدەر بوونی نییە نیشانه‌كردنی خشته‌لێدان ناوی فایل ناکرێت بەتاڵ بێت - ناتوانرێت واژووی بەستەری ڤیدیۆ بخوێنرێتەوە پیشاندانی پەیامێک بۆ ئامادەبوونی به‌رنامه‌ لەکاتی بەردەست بوونی وەشانی نوێ مێژووی سەیرکردن سکاڵا لەسەر کێشەکان @@ -398,7 +390,7 @@ دەستپێکردنی لێدان لە پاشبنەماوە ناوفایل دانان لەسەر وێنۆچکەی خشتەلێدان - دەربارەی نیوپایپ + دەربارەی NewPipe زیادکردن بۆ خشتەلێدان (نەزانراو) زمانی به‌رنامه‌ @@ -477,7 +469,7 @@ سڕینەوەی پاشماوەی هەموو ماڵپه‌ڕه‌كان بەرنامەکە نه‌دۆزرایه‌وه‌. دابمه‌زرێت؟ ناتوانرێ پشتگیری دۆخەکە بکرێ - دامەزراندن + دابەزاندن ڤیدیۆکان بەستەرەکە پشتگیری نەکراوە قیڕ @@ -492,7 +484,7 @@ لەیەک کاتدا تەنیا یەک بابەت دادەبەزێنرێت دەتەوێت بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟ وەستاندنی دابەزاندنەکان - دەربارە + دەربارە و پرسیارەکان پیشاندانی لێدوانەکان بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی نیوپایپ. تکایە بەئاگادارییەوە بیخوێنەره‌وە. \nپێویستە په‌سه‌ندی بکەیت بۆ ناردنی سکاڵاکانت. @@ -510,7 +502,7 @@ کاتی دوای دواین نوێکردنەوە پێش بەژداربوون ڕەچاوکراوە — %s بیرگەی دەرەکی بەردەست نییە گێڕانەوەی کارپێکەر بۆ شوێنی پێشووتر - پاشگه‌زبوونه‌وه‌ + هەڵوەشاندنەوه تراکەکان ڕێکخستنەکانی دەنگ پرست پێ دەکرێت بۆ شوێنی دابەزاندنی هەر بابەتێک. @@ -549,7 +541,7 @@ تێکەڵکردن دووبارە دەتوانیت تا سێ كردار دیار بكه‌یت تا پیشان بدرێن له‌ پەیامەکەدا! - ده‌ستكاری هه‌ر یه‌كێك له‌م كردارانه‌ی خواره‌وه‌ بكه‌ له‌ڕێگه‌ی كرته‌ له‌سه‌ریان. ده‌توانیت تا زیاتر له‌ سێ دانه‌یان هه‌ڵبژێریت له‌ ڕێگای چوارگۆشه‌كانی لای ڕاسته‌وه‌یان، تا پیشان بدرێن له‌ پەیامەکاندا + دەستکاریکردنی هەر کردارێکی ئاگادارکەرەوە لە خوارەوە بە دەستلێدان. ۳- دانە هەڵبژێرە لە ڕێگەی بەکارهێنانی سندوقەبچوکەکە لای ڕاستەوە نیشان دەدرێت پێنجه‌م كرداری دوگمه‌ چواره‌م كرداری دوگمه‌ سێیه‌م كرداری دوگمه‌ @@ -563,7 +555,7 @@ پیشاندانی زانیاری مێتا ناكارایبكه‌ بۆ شاردنه‌وه‌ی دیسکریپشن له‌سه‌ر ڤیدیۆ و زانیاری زیاتر پیشاندانی دیسکریپشن - ڕووكاری شه‌و + ڕووكاری تاریک ئه‌ندرۆید ڕه‌نگی پەیام دڵخواز ده‌كات به‌پێی ڕه‌نگی سه‌ره‌كی وێنۆچكه‌كه‌ ( ڕه‌چاوی ئه‌وه‌ بكه‌ كه‌ ئه‌م تایبه‌تمه‌ندییه‌ هه‌موو ئامێرێك ناگرێته‌وه‌ ) ڕه‌نگكردنی پەیام یوتوب ”دۆخی قه‌ده‌غه‌كراو” پێشكه‌ش ده‌كات كه‌ بابەتە نه‌شیاوه‌كان ده‌شارێته‌وه‌ @@ -590,12 +582,11 @@ \nجا ده‌ته‌وێت به‌ژداری لابده‌یت له‌م كه‌ناڵه‌؟ ناتوانرێت فیید باربکرێت تا ً`%s` . هه‌ڵه‌ له‌ باركردنی فیید - ئه‌م تایبه‌تمه‌ندییه‌ كارابكه‌ گه‌ر ڕوونمای ڕه‌ش یاخوود جامبوونی کارپێکەرت ئه‌زموون كرد + ئەگەر تووشی شاشەی ڕەش یان لکەلکە بوویت لە کاتی پەخشکردنی ڤیدیۆدا، تونێلکردنی میدیا لەکاربخە. ناوەکی تایبەتی خشتەنەکراو گشتی - بەستەری وێنۆچکە هۆست پشتگیری زمان @@ -619,7 +610,6 @@ دواین وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و پەیامەکان به‌كاردەهێنرێن پیشاندانی وێنۆچكه‌ - تەماشاکراوەکان پیشان بدرێن بۆ دابه‌زاندنی هه‌ر بابه‌تێك پرست پێ ده‌كرێت له‌باره‌ی شوێنی دابه‌زاندنیان ناكاراكردنی تونێلكردنی میدیا ئه‌و بابه‌تانه‌ی نه‌گونجاون بۆ منداڵان پیشان بدرێن كه‌ سنووری ته‌مه‌ن ده‌یانگرێته‌وه‌ (وه‌ك +18) @@ -668,18 +658,18 @@ نیوپایپ تووشی کێشەیەک بوو ، کرتە بکە بۆ سکاڵاکردن پیشاندانی ”کڕاش کردنی لێدەرەکە“ سازاندنی پەیامی کێشەیەک - پشکنین بۆ نوێکردنەوە + پشکنین بۆ نوێکردنەوە کێشە لە سکاڵا کردنی پەیام پەیامەکانی سکاڵاکردن لە کێشەکان بابەتە نوێیەکانی فیید لێدوانی هەڵواسراو کڕاش کردنی لێدەر پیشاندانی هەڵەی سناکباڕ - هیچ ڕێکخەرێکی فایلی گونجاو نەدۆزرایەوە بۆ ئەم کردارە. -\nتکایە ڕێکخەری فایلییەک دابمەزرێنە لۆ هەوڵدانی ناکاراکردنی \'%s\' لە ڕێکخستنەکانی دابەزاندندا. + هیچ FileManager پەڕگەی گونجاو بۆ ئەم کردارە نەدۆزراوەتەوە. +\nتکایە بەڕێوەبەری پەڕگەیەک دابمەزرێنە یان هەوڵبدە \'%s\' لە Settings بڕۆ Download لەکاربخە LeakCanary بەردەست نییە - هیچ ڕێکخەرێکی فایلی گونجاو نەدۆزرایەوە بۆ ئەم کردارە. -\nتکایە ڕێکخەرێکی فایلی دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە. + هیچ FileManager گونجاو نەدۆزرایەوە بۆ ئەم کردارە. +\nتکایە FileManager دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە. پشکنین کردن بۆ پەخشی نوێ پەیامەکانی پەخشە نوێیەکان پەیام بکرێم لەکاتی هەبوونی پەخشی نوێی بەژدارییەکان @@ -701,8 +691,15 @@ هەموو فایلە دابەزێنراوەکان لە دیسک بسڕدرێتەوە؟ پەیامەکان ناکاراکراون پەیامم بکە - "قەبارەی نێوان بارکردنەکە بگۆڕە (لە ئێستادا %s) . بەهایەکی کەمتر لەوانەیە بارکردنی ڤیدیۆی سەرەتایی خێراتر بکات. گۆڕانکارییەکان پێویستیان بە داگیرساندنەوەی لێدەر هەیە" لەسەدا نیمچەتەن بنەڕەتی ExoPlayer + دیاریکردنی تراکی دەنگی ئەسڵی بێ گوێدانە زمانەکە + دەستکاریکردنی هەر کردارێکی ئاگادارکەرەوە لە خوارەوە بە دەستلێدان. یەکەم سێ کردار (لێدان/وەستان، پێشوو و دواتر) لەلایەن سیستەمەکەوە دانراوە و ناتوانرێت دەستکاری بکرێت. + پەسەند کردنی دەنگی وەسفکراو + گۆڕینی قەبارەی ماوەی لۆد لەسەر ناوەڕۆکی پێشکەوتوو (ئێستا ٪s). بەهایەکی کەمتر لەوانەیە بارکردنی سەرەتا خێراتر بکات + پەسەندکردنی دەنگی ئەسڵی + بەسوودە، بۆ نموونە، ئەگەر هێدسێتێک بەکاربهێنیت لەگەڵ دوگمەی فیزیکی شکاو + قەبارەی نێوان بارکردنی پەخشکردن + دوگمەی ڕووداوەکانی میدیای هاردوێر بەجێبهێڵە \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fdbc81d43d7..570137a009e 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,7 +1,7 @@ - Publikováno %1$s - Nenalezen žádný streamový přehrávač. Nainstalovat VLC\? + Publikováno na %1$s + Nenalezen žádný přehrávač. Nainstalovat VLC? Instalovat Zrušit Otevřít v prohlížeči @@ -11,16 +11,16 @@ Nastavení Mysleli jste „%1$s“\? Sdílet s - Použít externí video přehrávač + Použít externí přehrávač videí Použít externí audio přehrávač - Stažené audio je uloženo zde + Sem bude ukládáno stažené audio Zvolte adresář pro stažené audio soubory Adresář pro stažené audio Výchozí rozlišení Přehrát pomocí Kodi Nainstalovat chybějící aplikaci Kore\? Adresář pro stažená videa - Stažená videa jsou uložena tady + Sem budou ukládána stažená videa Zvolte adresář pro stažená videa Zobrazit možnost „Přehrát pomocí Kodi“ Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi @@ -39,7 +39,6 @@ Chyba Chyba sítě Nebylo možné nahrát všechny náhledy - Nebylo možné dekódovat URL videa Nebylo možné analyzovat stránku Obsah není k dispozici Přehrát video, délka: @@ -67,7 +66,7 @@ Co se stalo: Nahlásit Omlouváme se, tohle se nemělo stát. - Nahlásit tuto chybu přes e-mail + Nahlásit přes e-mail Omlouváme se, něco se pokazilo. Aplikace/UI spadlo Nepodařilo se nastavit menu stahování @@ -115,10 +114,10 @@ Pokračovat v přehrávání po přerušení (např. hovor) Přehrávač Chování - Historie a mezipamět + Historie a mezipaměť Přehrávání v okně - Vypnuto - Vyčistit + Zakázáno + Vymazat Nejlepší rozlišení Vrátit Oznámení NewPipe @@ -153,7 +152,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 @@ -163,7 +162,7 @@ Podílet se Historie Historie - Zobrazit tip „Podržet pro vložení do fronty“ + Zobrazit tip „Podržte pro zařazení do fronty“ Zobrazit tip po klepnutí na pozadí nebo na vyskakovací tlačítko v „Podrobnostech“ videa Přehrát vše Tento stream nelze přehrát @@ -183,7 +182,7 @@ Odebrat Podrobnosti Nastavení zvuku - Podrž pro zařazení do fronty + Podržte pro zařazení do fronty [Neznámý] Začít přehrávat na pozadí Začít přehrávat v pop-upu @@ -213,13 +212,13 @@ Žádný platný soubor ZIP Upozornění: Nelze importovat všechny soubory. Tímto se anuluje vaše aktuální nastavení. - Video přehrávač + Přehrávač videa Přehrávač na pozadí Přehrávač v okně Získávám informace… Načítání požadovaného obsahu Stáhnout soubor streamu - Ukázat informace + Zobrazit informace Uložené playlisty Přidat do Táhnout pro přeskupení @@ -251,11 +250,9 @@ Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění Použít rychlé nepřesné hledání Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností. Posouvání po 5, 15 nebo 25 vteřinách s tímto nefunguje - Načítat náhledy - Vypnout, aby se zabránilo načítání náhledů a tím se ušetřily data a používání paměti. Změna tohoto nastavení vyčistí mezipamět obrázků v paměti i na disku Mezipaměť obrázků vymazána Vymazat metadata v mezipaměti - Odebrat všechna data uložená v mezipaměti + Odstranit všechna data webových stránek v mezipaměti Mezipaměť metadat vymazána Další stream automaticky vložit do fronty Pokračovat konečnou (neopakující se) frontu playbacku připojením souvisejícího streamu @@ -298,11 +295,10 @@ Výška tónu Odpojit (může způsobit zkreslení) Ke stažení nejsou dostupné žádné streamy - Preferovaná \'otevřít\' akce + Preferovaná akce „otevření“ Výchozí chování při otevírání obsahu — %s Titulky Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace - K přehrání tohoto souboru chybí vhodná aplikace Vymazat historii sledování Vymaže historii přehraných streamů pozic playbacku Vymazat celkovou historii sledování\? @@ -313,7 +309,7 @@ Historie vyhledávání smazána Jedna položka smazána. NewPipe je svobodný software s copyleft licencí: Můžete jej libovolně používat, studovat, sdílet a vylepšovat. Konkrétně jej můžete šířit a/nebo upravovat za podmínek Obecné veřejné licence GNU (GNU GPL) vydané nadací Free Software Foundation, a to buď za podmínek Licence verze 3 nebo (dle vaší volby) jakékoli pozdější verze. - kanály + Kanály Playlisty Stopy Uživatelé @@ -338,10 +334,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 @@ -361,8 +353,8 @@ Mřížka Automaticky Aktualizace NewPipe je k dispozici! - Hotovo - Vyčkávání + Dokončeno + Čekání Pozastaveno ve frontě zpracování @@ -371,7 +363,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 @@ -404,7 +396,7 @@ soubor nelze přepsat Soubor s tímto názvem již čeká na stažení NewPipe byl ukončen v průběhu zpracovávání souboru - V zařízení nezbývá žádné místo + V zařízení nezbývá žádné místo Postup ztracen, protože soubor byl smazán Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů\? Omezit frontu stahování @@ -459,7 +451,7 @@ Jazyk aplikace Jazyk systému Po vyřešení klepněte na „Hotovo“ - Hotovo + Hotovo Videa %d vteřina @@ -525,15 +517,15 @@ 100+ videí Umělci Alba - Písně + Skladby Toto video má věkové omezení. \n \nPokud jej chcete vidět, povolte „%1$s“ v nastavení. - Ano, i zčásti shlédnutá videa - Odstranit shlédnutá videa\? - Odstranit shlédnutá - Videa, která jste shlédli před a po jejich doplnění do playlistu, budou odstraněna. -\nJste se jisti\? Nelze zvrátit! + Ano, i zčásti zhlédnutá videa + Odstranit zhlédnutá videa? + Odstranit zhlédnutá + Videa, která jste zhlédli před a po jejich přidání do playlistu, budou odstraněna. +\nJste se jisti? Tato akce je nevratná! Původní texty služeb budou viditelné u položek streamů U položek zobrazit původní čas Zapnout „Omezený režim“ YouTube @@ -541,7 +533,7 @@ Vytvořil %s Ikona kanálu Strana playlistů - Ukázat jen neseskupené objednávky + Zobrazit jen neseskupené odběry Zatím žádné záložky playlistů Vybrat playlist Prosím, ověřte, zda chyba již existuje. Pokud založíte duplikovaný tiket, obíráte nás o čas, který bychom mohli věnovat řešení skutečných chyb. @@ -550,10 +542,10 @@ Ukazuji výsledky pro: %s Nikdy Pouze na Wi-Fi - Zahájit playback automaticky — %s - Přehrát frontu - Nelze rozpoznat zadané URL. Otevřít pomocí jiné aplikace\? - Auto-fronta + Automaticky zahájit přehrávání — %s + 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 Při přechodu z jednoho přehrávače do druhého může dojít k smazání fronty Žádat potvrzení před vyklizením fronty @@ -562,7 +554,7 @@ Promíchat Opakovat Do kompaktního oznámení lze vybrat nejvíce tři akce! - Upravte každou akci oznámení níže poklepáním. Pomocí zaškrtávacích políček vpravo vyberte až tři z nich, které se mají zobrazit v kompaktním oznámení + Upravte každou akci oznámení níže poklepáním. Pomocí zaškrtávacích políček vpravo vyberte až tři z nich, které se mají zobrazit v kompaktním oznámení. Páté akční tlačítko Čtvrté akční tlačítko Třetí akční tlačítko @@ -570,7 +562,7 @@ První akční tlačítko Oříznout miniaturu videa zobrazenou v oznámení z poměru stran 16:9 na 1:1 Oříznout poměr stran miniatury na 1:1 - Ukázat memory leaks + Zobrazit úniky paměti Zařazeno do fronty Zařadit do fronty Vymazat cookies, které NewPipe uloží, po vyřešení reCAPTCHA @@ -598,7 +590,7 @@ Vypnout pro skrytí popisu videa a doplňkové informace Zbořit aplikaci Stahování bylo zahájeno - Můžete si zvolit svůj oblíbený motiv níže + Níže si můžete zvolit svůj oblíbený motiv Zvolte si svůj oblíbený noční motiv - %s Automatický (motiv zařízení) Radio @@ -613,14 +605,13 @@ Toto video je věkově omezeno. \nKvůli novým pravidlům YouTube ohledně věkově omezených videí nemůže NewPipe získat přístup na streamy videa, a tak je nemůže přehrát. Noční motiv - Vypněte media-tunelling, pokud zaznamenáte temnou obrazovku nebo zadrhávání během playbacku + Vypněte media-tunelling, pokud během přehrávání zaznamenáte temnou obrazovku nebo zadrhávání. Vypnout media-tunelling Přejít na website Interní Soukromé Neuvedeno v seznamu Veřejné - URL miniatury Server Podpora Jazyk @@ -646,7 +637,6 @@ Vypnuto Zapnuto Režim tabletu - Ukázat přehrané položky Nezobrazovat Nízká kvalita (menší) Vysoká kvalita (větší) @@ -664,18 +654,18 @@ %s stahování dokončena %s stahováních dokončeno - Ukázat zabarvené stužky Picasso na obrázcích k indikaci zdroje: červená indikuje síť, modrá disk a zelená paměť - Ukázat indikátory obrázků + Zobrazit barevné pásky Picasso na obrázcích označujících jejich zdroj: červená pro síť, modrá pro disk a zelená pro paměť + Zobrazit indikátory obrázků Vzdálené návrhy vyhledávání Lokální návrhy vyhledávání - Pokud je vypnuté automatické otáčení, nespouštějte video v mini přehrávači, ale přepněte se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky + Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky Další ve frontě Přidat do fronty (další) Tažením položky odstraníte Spustit hlavní přehrávač na celé obrazovce Zpracovávám... může trvat moment Ručně zkontrolovat zda je k dispozici nová verze - Kontrola aktualizací + Kontrola aktualizací NewPipe narazil na problém, klikněte pro nahlášení Došlo k chybě, více v oznámení Vytvořit oznámení o chybě @@ -689,10 +679,9 @@ Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nNainstalujte správce souborů nebo zkuste vypnout \'%s\' v nastavení stahování Ukáže volbu pro zřícení během používání přehrávače - Ukázat krátké oznámení o chybě + 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 @@ -700,7 +689,7 @@ Oznámit o nových streamech od vašich odběrů Frekvence kontroly Jakákoli síť - Nutné síťové připojení + Požadované síťové připojení Smazat všechny stažené soubory z disku\? Objednali jste si nyní tento kanál Všechny přepnout @@ -725,12 +714,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 dostupné žádné video streamy - Skrýt zhlédnuté položky - Skrýt nadcházející položky + U externích přehrávačů nejsou k dispozici žádné videostreamy Č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 @@ -739,4 +725,119 @@ Rychlý režim Používáte nejnovější verzi NewPipe Import nebo export odběrů z 3-tečkové nabídky + Tato možnost je dostupná pouze při vybraném motivu %s + Zrušení nastavení trvalého náhledu + Karta + Kopírování do schránky se nezdařilo + Zašedlé playlisty již obsahují tuto položku. + Duplikát přidán %dkrát + Ignorovat události hardwarových tlačítek médií + Užitečné například v případě, že používáte sluchátka s rozbitými fyzickými tlačítky + Odstranit duplicity\? + Zobrazit následující streamy + Zobrazit/skrýt streamy + Celé zhlédnuto + Částečně zhlédnuto + 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 + %1$s %2$s + původní + dabovaná + popisná + Zvuková stopa + V tomto streamu by již měla být přítomna zvuková stopa + Vyberte zvukovou stopu pro externí přehrávače + Toto obejití uvolní a znovu nainstaluje kodeky videa, když dojde ke změně povrchu, místo aby se povrch nastavil přímo na kodek. Toto nastavení, které již bylo použito v přehrávači ExoPlayer na některých zařízeních s tímto problémem, má vliv pouze na Android 6 a vyšší. +\n +\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí na celou obrazovku + Zvuk: %s + Pozice hlavních karet + Přesunout výběr hlavní karty dolů + Na vašem zařízení byl zakázán media tunelling, protože model vašeho zařízení jej nepodporuje. + Žádná videa + Žádné živé přenosy + Načítání metadat… + Karty kanálu k načtení + Karty, které načíst při aktualizaci odběrů. Tato možnost nemá žádný účinek, pokud je kanál aktualizován pomocí rychlého režimu. + Nahrané avatary + Náhledy + Kvalita obrázků + Videa + \? + Odběratelé + Které karty mají být zobrazeny na stránkách kanálů + Sdílet URL seznamu + Sdílet s názvy + %1$s +\n%2$s + Karty kanálu + Shorts + Přepnout orientaci obrazovky + Nízká kvalita + Přepnout celou obrazovku + Avatary + Další stream + Subkanálové avatary + Otevřít frontu přehrávání + Nenačítat obrázky + Vysoká kvalita + Informace + Sdílet playlist + Přetočení vpřed + Alba + Přetočení zpět + Znovu přehrát + Sdílejte playlist s podrobnostmi jako je jeho název a názvy videí, nebo jako jednoduchý seznam adres videí + Střední kvalita + Bannery + Playlisty + - %1$s: %2$s + Zvolte si kvalitu obrázků a volbu, zda se mají obrázky vůbec načítat, abyste snížili spotřebu dat a paměti. Změny vymažou mezipaměť obrázků v paměti i na disku — %s + Přehrát + Další možnosti + Skladby + Trvání + Kanály + Předchozí stream + Živě + + %s odpověď + %s odpovědi + %s odpovědí + + Zobrazit více + Upravte každou akci oznámení níže poklepáním. První tři akce (přehrání/pozastavení, předchozí a další) jsou nastaveny systémem a nemohou být přizpůsobeny. + Zobrazit méně + Nedostatek volného místa v zařízení + Záloha a obnovení + Obnovit nastavení + Obnovení všech nastavení na výchozí hodnoty + Obnovením nastavení se zruší všechna preferovaná nastavení a aplikace se restartuje. +\n +\nJste si jisti, že chcete pokračovat? + Ano + Ne + NewPipe může čas od času automaticky kontrolovat nové verze a upozornit vás na jejich dostupnost. +\nChcete tuto funkci povolit? + Nastavení v importovaném exportu používají zranitelný formát. NewPipe používá nový formát od verze 0.27.0. Ujistěte se, že export importujete z důvěryhodného zdroje a v budoucnu upřednostňujte používání exportů získaných z NewPipe 0.27.0 nebo novějších. Podpora importu nastavení v tomto zranitelném formátu bude brzy kompletně odstraněna, kvůli čemuž staré verze NewPipe nebudou moci importovat nastavení z exportů z nových verzí. + sekundární \ No newline at end of file diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml new file mode 100644 index 00000000000..a6b3daec935 --- /dev/null +++ b/app/src/main/res/values-cy/strings.xml @@ -0,0 +1,2 @@ + + \ 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 96ae5299d7c..53462e24024 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,74 +1,68 @@ Tryk på forstørrelsesglasset for at komme i gang. - Udgivet den %1$s - Ingen streamafspiller blev fundet. Installér VLC\? - Ingen streamafspiller fundet (du kan installere VLC for at afspille den). + Udgivet d. %1$s + Ingen streamafspiller blev fundet. Installer VLC? + Ingen streamafspiller blev fundet (du kan installere VLC for at afspille den). Installer Annuller Åbn i browser - Åbn i pop op-tilstand + Åbn i popup-tilstand Del - Download - Download stream-fil + Hent + Hent stream-fil Søg Indstillinger Mente du \"%1$s\"\? Del med - Benyt ekstern videoafspiller + Brug ekstern videoafspiller Fjerner lyd ved nogle opløsninger Brug ekstern lydafspiller Abonner Abonnerer - Afmeld abonnement - Abonnement afmeldt + Afmeld + Kanal afmeldt Kunne ikke ændre abonnement Kunne ikke opdatere abonnement Vis info Abonnementer - Gemte spillelister - Vælg fane + Gemte Playlister + Vælg Fane Nyheder Baggrund - Pop op + Popup Føj til - Placering af videodownloads - Downloadede videoer gemmes her - Angiv downloadmappe for videofiler - Downloadmappe for lydfiler - Downloadede lydfiler gemmes her - Angiv downloadmappe for lydfiler + Lagringsmappe til videoer + Hentede videoer gemmes her + Vælg lagringsmappe til videofiler + Lagringsmappe til lydfiler + Hentede lydfiler gemmes her + Vælg lagringsmappe til lydfiler Standardopløsning - Standardopløsning for pop op + Standardopløsning til popup Vis højere opløsninger Kun nogle enheder kan afspille 2K-/4K-videoer Afspil med Kodi - Installer manglede Kore-app\? + Installer manglende Kore-app? Vis valgmuligheden \"Afspil med Kodi\" - Vis en knap til at afspille en video via Kodi + Vis en mulighed for at afspille en video via Kodi-mediecenter Lyd - Standardformat for lydfiler - Standardformat for videofiler + Standard lydformat + Standard videoformat Tema - Lyst - Mørkt + Lys + Mørk Sort - Husk størrelse og placering af pop op - Husk sidste størrelse og placering af pop op-afspiller + Husk popup-egenskaber + Husk sidste størrelse og placering af popup-afspiller Brug hurtig og upræcis søgning - Upræcis søgning lader afspilleren finde placeringer hurtigere, men mindre præcist. Søgninger på 5, 15 eller 25 sekunder fungerer ikke med denne indstilling, slået til - Indlæs miniaturebilleder - Slå fra for at undgå indlæsning af billeder, hvorved der spares data og hukommelse. Ændringer sletter billedcachen i både ram og lager - Billedcache slettet - Slet metadata-cachen - Slet alle websidedata fra cachen - Metadata-cache slettet - Føj automatisk næste stream til køen - Fortsæt nedlukningen af en (ikke-gentagende) playback kø ved at tilføje et relateret 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 + Upræcis søgning lader afspilleren finde positioner hurtigere, men med nedsat præcision. Søgning i 5, 15 eller 25 sekunder fungerer ikke med dette + Billedcache ryddet + Ryd metadata-cache + Fjern alle cached websidedata + Metadata-cache ryddet + Føj automatisk næste stream til kø + Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream Søgeforslag Vælg forslagene, der vises, når der søges Søgehistorik @@ -77,22 +71,22 @@ Husk sete videoer Fortsæt afspilning Fortsæt afspilning efter afbrydelser (fx telefonopkald) - Download + Hent Vis \'Næste\' og \'Lignende\' videoer Vis \"Hold for at sætte i kø\"-tip - Vis et tip når der trykkes på baggrunds- eller pop op-knappen på siden med videodetaljer - Denne webadresse er ikke understøttet + Vis tip, når du trykker på baggrunden eller popup-knappen i video \"Detaljer:\" + Ikke-understøttet URL Standardland for indhold Standardsprog for indhold Afspiller - Opførsel + Adfærd Video og lyd Historik og cache Udseende Fejlretning Opdateringer Afspiller i baggrunden - Afspiller i pop op-tilstand + Afspiller i popup-tilstand Indhold Vis aldersbegrænset indhold Live @@ -108,69 +102,68 @@ Numre Brugere - Slået fra - Slet + Deaktiveret + Ryd Bedste opløsning Fortryd Fil slettet - Afspil alle + Afspil Alle Altid - Kun én gang + Kun Én Gang Fil - NewPipe notifikation + NewPipe-notifikation Notifikationer for NewPipes afspiller - Notifikation om opdatering af app - Notifikationer for nye NewPipe versioner + Notifikation om app-opdatering + Notifikationer for nye NewPipe-versioner [Ukendt] Skift til baggrund - Skift til pop op + Skift til popup Skift til hovedafspiller - Importer database - Eksporter database - Overskriver din nuværende historik, abonnementer, spillelister og (hvis det ønskes) indstillinger - Eksporter historik, abonnementer, spillelister og indstillinger - Slet visningshistorik - Sletter historikken og positioner af tidligere viste videoer + Importér database + Eksportér database + Overskriver din nuværende historik, abonnementer, playlister og (hvis det ønskes) indstillinger + Eksportér historik, abonnementer, playlister og indstillinger + Ryd visningshistorik + Sletter historikken over afspillede streams og afspilningspositionerne Slet hele visningshistorikken\? - Visningshistorikken blev slettet - Slet søgehistorik - Sletter historikken for søgeord - Slet hele søgehistorikken\? - Søgehistorikken blev slettet + Visningshistorik slettet + Ryd søgehistorik + Sletter historik for søgeord + Slet hele søgehistorik? + Søgehistorik slettet Fejl Eksternt lager utilgængeligt - Det er endnu ikke muligt at downloade til et eksternt SD-kort. Nulstil download-mappens placering\? + Det er endnu ikke muligt at hente til et eksternt SD-kort. Nulstil lagringsmappens placering? Netværksfejl Kunne ikke indlæse alle miniaturebilleder - Kunne ikke dekryptere URL-signatur for video - Kunne ikke analysere websted - Indhold ikke tilgængeligt - Kunne ikke oprette downloadmenu - App/brugergrænseflade gik ned + Kunne ikke analysere webside + Indhold utilgængeligt + Kunne ikke opsætte download-menu + App/UI gik ned Kunne ikke afspille denne stream Uoprettelig afspillerfejl opstod - Prøver at genoprette efter afspillerfejl + Genopretter efter afspillerfejl Eksterne afspillere understøtter ikke disse typer af links Ingen videostreams fundet Ingen lydstreams fundet Mappen findes ikke Fil eller indholdskilde findes ikke - Filen eksister ikke eller der mangler rettigheder til at læse eller skrive til den - Filavnet kan ikke være tomt - Der opstod en fejl: %1$s - Ingen streams er tilgængelige for download - Bruger standardfaner pga. fejl ved indlæsning af gemte faner - Genskab standardindstillinger - Vil du genoprette standardindstillingerne\? + Filen findes ikke, ellers mangler der tilladelse til at læse eller skrive til den + Filnavn må ikke være tomt + En fejl opstod: %1$s + Ingen streams tilgængelige til hentning + Kunne ikke læse gemte faner, så bruger standardfaner + Gendan standardindstillinger + Vil du gendanne standardindstillinger? Undskyld, dette skulle ikke være sket. - Rapporter denne fejl via e-mail + Rapportér via e-mail Beklager, noget gik galt. - Rapporter - Information: + Rapportér + Info: Hvad skete der: Din kommentar (på engelsk): Detaljer: - Afspil video, længde: + Afspil video, varighed: Uploaders profilbillede Synes godt om Kan ikke lide @@ -180,7 +173,7 @@ Lyd Prøv igen Ingen abonnenter - Antallet af abonnenter er ikke tilgængeligt + Antal abonnenter utilgængeligt Ingen visninger %s visning @@ -197,50 +190,49 @@ Filnavn Tråde Fejl - NewPiper downloader + NewPipe henter Tryk for detaljer Vent venligst… - Kopieret til udklipsholderen - Vælg senere en tilgængelig downloadmappe i indstillingerne - Denne tilladelse behøves for -\nat åbne i pop op-tilstand + Kopieret til udklipsholder + Angiv venligst en lagringsmappe senere i indstillinger + Denne tilladelse er nødvendig for +\nat åbne i popup-tilstand 1 element slettet. reCAPTCHA-udfordring - Der blev anmodet om en reCAPTCHA-udfordring - Download + reCAPTCHA-udfordring anmodet + Hent Tilladte tegn i filnavne - Ugyldige tegn bliver erstattet med denne værdi + Ugyldige tegn erstattes med denne værdi Erstatningstegn Bogstaver og cifre De fleste specialtegn - Der ingen app installeret der kan afspille denne fil Om NewPipe Tredjepartslicenser © %1$s af %2$s under %3$s - Om + Om & Ofte Stillede Spørgsmål Licenser - Åben letvægtsstreaming på Android. - Bidrag til projektet - Hvad enten du har idéer til oversættelse, designændringer, kodeoprydning eller virkelig tunge kodeændringer, så er hjælp altid velkommen. Jo mere der bliver gjort, jo bedre bliver det! + Fri letvægtsstreaming på Android. + Bidrag + Uanset om du har idéer til oversættelse, designændringer, oprydning i koden eller virkelig store kodeændringer, er hjælp altid velkommen. Jo mere der bliver gjort, jo bedre bliver det! Se på GitHub - Doner - NewPipe er udviklet af frivillige, der bruger deres fritid på at give dig den bedst mulige brugeroplevelse. Giv noget tilbage for at hjælpe NewPipes udviklere til at gøre appen endnu bedre, mens de nyder en kop kaffe. - Giv noget tilbage - Websted - Besøg NewPipes websted for mere information og nyheder. - NewPipes fortrolighedspolitik - Læs fortrolighedspolitik - NewPipes licens - NewPipe er copyleft, fri software: Du kan bruge, studere, dele og forbedre den som du vil. Specifikt kan du redistribuere og/eller ændre den under betingelserne i GNU General Public License som udgivet af Free Software Foundation, enten version 3 af licensen eller (efter dit ønske) en vilkårlig senere version. + Donér + NewPipe er udviklet af frivillige, der bruger deres fritid på at give dig den bedste brugeroplevelse. Giv noget tilbage og hjælp udviklerne med at gøre NewPipe endnu bedre, mens de nyder en kop kaffe. + Giv tilbage + Hjemmeside + Besøg NewPipe\'s hjemmeside for flere oplysninger og nyheder. + NewPipe\'s Privatlivspolitik + Læs privatlivspolitik + NewPipe\'s Licens + NewPipe er copyleft, fri software: Du kan bruge, studere, dele og forbedre den, som du vil. Specifikt kan du redistribuere og/eller ændre den under betingelserne i GNU General Public License som udgivet af Free Software Foundation, enten version 3 af licensen eller (efter dit ønske) en vilkårlig senere version. Læs licens Historik Historik Vil du slette dette element fra søgehistorikken\? - Sidst afspillet - Mest spillede - Indhold af hovedsiden + Sidst Afspillet + Mest Afspillet + Indhold af hovedside Hvilke faner vises på hovedsiden - Tom side + Tom Side Kioskside Kanalside Vælg en kanal @@ -248,7 +240,7 @@ Vælg en kiosk Eksporteret Importeret - Ikke en gyldig ZIP-fil + Ingen gyldig ZIP-fil Advarsel: Kunne ikke importere alle filer. Dette vil overskrive dine nuværende indstillinger. Vil du også importere indstillinger\? @@ -258,48 +250,48 @@ Fjern Detaljer Lydindstillinger - Hold for at føje til kø - Foretrukket \'åbn\'-handling + Hold for at sætte i kø + Foretrukken \'åbn\'-handling Videoafspiller Baggrundsafspiller - Pop op-afspiller + Popup-afspiller Spørg altid - Henter info … + Henter info… Indlæser det ønskede indhold - Ny spilleliste + Ny Playliste Omdøb Navn - Føj til spilleliste - Slet denne spilleliste\? - Spilleliste oprettet - Ingen undertekster + Føj til playliste + Slet denne playliste? + Playliste oprettet + Ingen Undertekster Tilpas Udfyld Zoom Autogenereret Undertekster - Eksporter til + Eksportér til Nulstil - Accepter + Acceptér Afvis Ingen begrænsning - Begræns opløsning når der bruges mobildata + Begræns opløsning, når mobildata bruges Opdateringer Listevisning Liste Gitter Automatisk Færdig - Afventning + Afventer efterbehandling - Læg i kø + Sæt i kø Handling afvist af systemet - Download fejlede - Generer unikt navn + Hentning mislykkedes + Generér unikt navn Overskriv En fil med dette navn eksisterer allerede - En downloadet fil med dette navn eksisterer allerede - Der er en download i gang med dette navn + En hentet fil med dette navn eksisterer allerede + En download med dette navn er i gang Vis fejl Filen kan ikke oprettes Destinationsmappen kan ikke oprettes @@ -309,10 +301,10 @@ Serveren sender ikke data Serveren accepterer ikke multitrådede downloads; prøv igen med @string/msg_threads = 1 Ikke fundet - Efterbehandling fejlede + Efterbehandling mislykkedes Stop Hændelser - Intet at se her + Ikke andet end fårekyllinger her t mio. mia. @@ -324,81 +316,81 @@ Kunne ikke importere abonnementer Kunne ikke eksportere abonnementer Konferencer - Start afspilningen i baggrunden - Start afspilning i et pop op - Åbn skuffe - Luk skuffe - Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nAppsprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version: - Standardhandling når indhold åbnes – %s - Anvend som playlistens miniature - Bogmærk spilleliste - Fjern bogmærke - Føjet til spillelisten - Miniaturebillede for spilleliste ændret. + Start afspilning i baggrunden + Start afspilning i et popup + Åbn Skuffe + Luk Skuffe + Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nApp-sprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version: + Standardhandling ved åbning af indhold — %s + Anvend som playlistens miniaturebillede + Bogmærk Playliste + Fjern Bogmærke + Føjet til playliste + Ændret playlistens miniaturebillede. Ændr undertekststørrelse og baggrundsstil. Kræver genstart af appen for at træde i kraft - Monitorering for hukommelseslækager kan få appen til ikke at svare under heap dumping - Rapporter out-of-lifecycle-fejl - Importer - Importer fra - Importerer … - Eksporterer … - Importer fil + Overvågning af hukommelseslækager kan medføre, at appen ikke reagerer, når heap-dumpning udføres + Rapportér out-of-lifecycle-fejl + Importér + Importér fra + Importerer… + Eksporterer… + Importér fil Forrige eksport - Importer YouTube-abonnementer ved at downloade eksportfilen: + Importér YouTube-abonnementer ved at hente eksportfilen: \n \n1. Gå til denne webadresse: %1$s -\n2. Log ind når du bliver bedt om det -\n3. Klik på \"Alle Youtube-data medtages\" og fravælg alt bortset fra \"abonnementer\". -\n4. Klik på \"Næste trin\" og derefter \"Opret eksport\". -\n5. Klik på \"Download\" knappen efter den popper frem. -\n6. Klik på \"IMPORTER FIL\" nederst på denne side og vælg den downloadede .zip fil. -\n7. [Såfremt .zip-importeringen slår fejl] Uddrag .csv filen (som normalt findes i \"YouTube og YouTube Music/abonnementer/abonnementer.csv\"). Klik på \"IMPORTER FIL\" nederst på denne side, og vælg den uddragede .csv fil +\n2. Log ind, når du bliver bedt om det +\n3. Klik på \"Alle Youtube-data medtages\", og fravælg alt bortset fra \"abonnementer\". +\n4. Klik på \"Næste trin\", og derefter \"Opret eksport\". +\n5. Klik på \"Download\"-knappen efter den popper frem. +\n6. Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den hentede .zip-fil. +\n7. [Såfremt .zip-importeringen slår fejl] Uddrag .csv-filen (som normalt findes i \"YouTube og YouTube Music/abonnementer/abonnementer.csv\"). Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den uddragede .csv-fil ditID, soundcloud.com/ditID - Bemærk at denne operation kan kræve meget netværkstrafik. + Bemærk, at denne operation kan kræve meget netværkstrafik. \n -\nVil du fortsætte\? - Knapper for afspilningshastighed +\nVil du fortsætte? + Knapper for Afspilningshastighed Tempo Tonehøjde Spol forbi stilhed Skridt Vis en notifikation for at foreslå opdatering af appen, når en ny version er tilgængelig Minimer ved appskift - Handling når der skiftes til en anden app fra hovedvideoafspilleren — %s + Handling ved skift til anden app fra hovedvideoafspiller — %s Ingen Minimer til baggrundsafspiller - Minimer til pop op-afspiller + Minimer til popup-afspiller En NewPipe-opdatering er tilgængelig! sat på pause sat i kø - Maksimalt antal genforsøg - Maksimalt antal forsøg før downloaden opgives + Maks. antal genforsøg + Maks. antal forsøg, før downloaden annulleres Afbryd på forbrugsafregnede netværk Nyttigt ved skift til mobildata, selv om nogle downloads ikke kan sættes på pause - Kun HTTPS adresser understøttes + Kun HTTPS-URL\'er understøttes Instansen findes allerede Kunne ikke validere instansen - Skriv instansens adresse + Indtast instans-URL Tilføj instans - Find de instanserne du kan lide på %s + Find de instanser, du kan lide på %s Vælg dine yndlings PeerTube-instanser PeerTube-instanser Afspil automatisk Ryd data Positioner i lister - Genopret forrige afspilningsposition + Gendan sidste afspilningsposition Fortsæt afspilning Slå fra for at skjule kommentarer Vis kommentarer Ingenting Gentag - Femte handlingstast - Fjerde handlingstast - Første handlingstast - Anden handlingstast - Tredje handlingstast + Femte handlingsknap + Fjerde handlingsknap + Første handlingsknap + Anden handlingsknap + Tredje handlingsknap Viser resultater for: %s - Åben med + Åbn med LeakCanary er ikke tilgængelig Markér som set Beskrivelse @@ -432,140 +424,138 @@ %1$s download slettet %1$s downloads slettet - Slet alle downloadede filer fra drevet\? + Slet alle hentede filer fra drevet? Sæt downloads på pause - Start hovedafspilleren i fuldskærmstilstand - Downloadmappe endnu ikke valgt. Vælg standardmappen nu - Læg automatisk i kø - Konfigurer det spillende streams notifikation - Vis aldersbegrænset indhold (f.eks. 18+) - Slå YouTube \"begrænset tilstand\" til - YouTube har en \"begrænset tilstand\" der skjuler videoer som potientielt er skadelige for børn + Start hovedafspiller i fuld skærm + Lagringsmappe endnu ikke valgt; vælg standardmappen nu + Sæt automatisk i kø + Konfigurer notifikation om igangværende stream + Vis indhold, der muligvis er uegnet for børn, fordi det har en aldersgrænse (fx 18+) + Slå YouTubes \"Begrænset Tilstand\" til + YouTube tilbyder en \"Begrænset Tilstand\", som skjuler potentielt voksenindhold Denne video er aldersbegrænset. \n -\nSlå \"%1$s\" fra i indstillingerne hvis du vil se den. +\nSlå \"%1$s\" til i indstillingerne, hvis du vil se den. Nye streams Notifikationer om nye streams fra abonnementer - reCAPTCHA cookies er ryddet - Slet alle playback positioner\? + reCAPTCHA-cookies blev ryddet + Slet alle afspilningspositioner\? Filen er flyttet eller slettet - NewPipe stødte ind i en fejl, tryk for at rapportere - Rapporter på GitHub + NewPipe stødte ind i en fejl; tryk for at rapportere + Rapportér på GitHub Høj kvalitet (større) Begræns downloadkøen - Ryd de cookies som NewPipe opbevarer når du løser en reCAPTCHA - Farvelæg notifikationen - Afspillernotifikation - En fejl opstod, se notifikationen - Slå fra for at skjule videobeskrivelsen og yderligere information - Slå fra for at gemme metainformationskasser med yderligere information om streammets skaber, streammets indhold eller en søgeforespørgsel + Ryd de cookies, som NewPipe opbevarer, når du løser en reCAPTCHA + Farvelæg notifikation + Afspiller-notifikation + En fejl opstod; se notifikationen + Slå fra for at skjule videobeskrivelse og yderligere information + Slå fra for at skjule metainfo-bokse med yderligere information om streamskaberen, streamindhold eller en søgeforespørgsel Download fuldført %s downloads fuldført - Lav indlæsningsintervallets størrelse, (som nu ligger på %s) om. En højere værdi kan øge videoindlæsningshastigheden. Ændringer af værdien kræver genstart. - Den aktive spilleliste bliver udskiftet - At skifte fra en afspiller til en anden kan udskifte din kø - Vis metainformation + Den aktive afspillerkø bliver udskiftet + Ændring fra én afspiller til en anden kan erstatte din kø + Vis metainfo Lokale søgeforslag - Fjerne søgeforslag - Start ikke videoer i miniafspilleren, men gå direkte til fuldskærmstilstand, hvis automatisk rotering er låst. Du kan stadig se miniafspilleren, hvis du går ud af fuldskærmstilstand - Kunne ikke genkende addressen. Vil du åbne den i en anden app\? - Videohashfunktion notifikation - Notifikationer om videohashfunktioners status + Forslag til fjernsøgning + Start ikke videoer i miniafspilleren, men skift direkte til fuldskærmstilstand, hvis automatisk rotation er låst. Du kan stadig få adgang til miniafspilleren ved at forlade fuldskærm + Kunne ikke genkende URL. Åbn med en anden app? + Videohash-notifikation + Notifikationer om videohashing fremskridt Fejlrapport-notifikation Notifikationer for at rapportere fejl - Slet playback positioner - Sletter alle playback positioner - Spørg hvor filen skal downloades - Et download ad gangen - Slet downloadede filer - Vil du rydde din download historik eller slette alle downloadede filer\? + Slet afspilningspositioner + Sletter alle afspilningspositioner + Spørg, hvor filen skal hentes + Ét download ad gangen + Slet hentede filer + Vil du rydde din downloadhistorik eller slette alle hentede filer? Kan ikke gendanne dette download - Ryd download historik - NewPipe projektet tager dit privatliv seriøst. Derfor samler appen intet data uden dit samtykke. -\nNewPipes fortrolighedspolitik forklarer i detaljer, hvilke data der bliver sendt og opbevaret når du sender en nedbrudsrapport. - Kopier en formatteret rapport + Ryd downloadhistorik + NewPipe-projektet tager dit privatliv meget alvorligt. Derfor indsamler appen ikke nogen data uden dit samtykke. +\nNewPipe\'s privatlivspolitik forklarer i detaljer, hvilke data der sendes og gemmes, når du sender en nedbrudsrapport. + Kopiér formateret rapport Giv tilladelse til at vise over andre apps - Vis playback positionsvisere i lister - Playback positioner slettet - Ryd reCAPTCHA cookies - Der er en afventende download med dette navn + Vis indikatorer for afspilningsposition i lister + Afspilningspositioner slettet + Ryd reCAPTCHA-cookies + En download med dette navn afventer Start downloads - Skaler miniaturebilledet til 1:1 format - Skaler notifikationsminiaturebillederne fra 16:9 til 1:1 format (dette kan medføre forvrængninger) - Rediger hver eneste varselshandling nedenunder ved at trykke på dem. Vælg op til tre af dem som bliver vist i den lille notifikation, via kasserne til højre - Du kan kun vælge op til tre handlinger som kan vises i den lille notifikation! - Buffer + Beskær miniaturebillede til 1:1 format + Beskær video-miniaturebillede i notifikationen fra 16:9 til 1:1 format + Rediger hver notifikationshandling nedenfor ved at trykke på den. Vælg op til tre af dem, der skal vises i den lille notifikation, via afkrydsningsfelterne til højre. + Du kan kun vælge op til tre handlinger, der kan vises i den lille notifikation! + Buffering Få Android til at vælge notifikationens farve ud fra den primære farve i miniaturebilledet (virker ikke på alle enheder) - Nattetema - Frem- og tilbagesøgningstid + Nat-tema + Søgningsvarighed for spole frem/tilbage Denne video er aldersbegrænset. -\nPga. YouTubes politik om aldersbegrænsede videoer har NewPipe ikke adgang til videoen. +\nGrundet nye YouTube-politikker om aldersbegrænsede videoer har NewPipe ikke adgang til nogen af dens videostreams og kan derfor ikke afspille dem. Crash afspilleren - Spørg om bekræftelse før du tømmer en kø - Forhåndsvisning af miniaturebilleder på statuslinjen + Spørg om bekræftelse, før du rydder en kø + Forhåndsvisning af miniaturebilleder på statuslinje Sæt i kø som næste - Er sat som næste i køen + Sat i kø som næste Download er begyndt Vis miniaturebilleder på både låseskærmen og notifikationer Nylige Notifikationer er slået fra Kommentarer - Relaterede objekter + Relaterede emner Stryg på elementer for at fjerne dem Vælg en playliste - Ingen playliste bogmærker endnu - Sproget ændres når appen genstarter - Spillekø + Ingen playliste-bogmærker endnu + Sproget ændres, når appen genstarter + Afspillerkø Vis kanalens detaljer Sæt i kø Sat i kø - Loader streamets detaljer… - Processere... Det kan tage et øjeblik - Vis hukommelsestab - Deaktiver medietunneler + Indlæser streamdetaljer… + Behandler… Det kan tage et øjeblik + Vis hukommelseslækager + Deaktivér medietunneling Vis billedindikatorer Netværkskrav Alle netværk Kontrolfrekvens Notifikationer ved nye streams - Notifikationer om ny streams fra abonnomenter + Underret om nye streams fra abonnementer Tjek manuelt efter opdateringer Tjekker efter opdateringer… - Gendanner - \"Hurtig feed\"-tilstand viser ikke mere information om dette. - Tjek efter opdateringer + gendanner + \"Hurtig feed\"-tilstand oplyser ikke mere info om dette. + Tjek efter opdateringer Fjern sete videoer\? - Deaktiver medietunneler hvis du oplever en sort skærm eller hak ved videoafspilning - Venligst tjek om der allerede eksisterer en problemrapport som diskuterer dit crash. Hvis du opretter duplikatrapporter, tager du tid fra os som vi kunne bruge på at fikse fejlen. + Deaktivér medietunneling, hvis du oplever en sort skærm eller hakken ved videoafspilning. + Tjek venligst, om der allerede findes et problem, der diskuterer dit nedbrud. Når du opretter flere tickets, tager du tid fra os, som vi kunne bruge på at løse den faktiske fejl. Tjek efter nye streams Lav en fejlnotifikation Lokale - Udgiverens bruger er blevet slettet. -\nNewpipe kan ikke indlæse dette feed i fremtiden. -\nVil du fjerne dit abonnement på denne kanal\? - Feedet blev sidst opdateret for %s + Udgiverens konto er blevet lukket. +\nNewPipe vil ikke være i stand til at indlæse dette feed i fremtiden. +\nØnsker du at afmelde denne kanal? + Feed sidst opdateret: %s Ikke indlæst: %d Indlæser feed… - Nye feed elementer - Tid siden sidste opdatering for at et abonnoment bliver forældet - %s - Altid opdater + Nye feed-elementer + Tid efter sidste opdatering, før et abonnement betragtes som forældet — %s + Opdater altid Vælg abonnementer - Vis sete elementer Dette indhold er ikke tilgængeligt i dit land. Af %s - Videoer på playlisten som allerede er blevet set fjernes. -\nDette kan ikke fortrydes! + Videoer, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. +\nEr du sikker? Dette kan ikke fortrydes! Vis miniaturebillede Tags Aldersbegrænsning - Dette indhold er ikke understøttet af NewPipe. + Dette indhold understøttes endnu ikke af NewPipe. \n \nVi håber at kunne understøtte det i en fremtiden. - Dette indhold er kun tilgængeligt for brugere som har betalt for det. Det kan ikke blive streamet eller downloadet af NewPipe. - Bruger slettet - Dette indhold er privat, så det jan ikke blive streamet eller downloadet af NewPipe. + Dette indhold er kun tilgængeligt for brugere, som har betalt for det, så det kan ikke streames eller hentes af NewPipe. + Konto lukket + Dette indhold er privat, så det kan ikke streames eller hentes af NewPipe. Nyligt tilføjede Fremhævede %s giver denne grund: @@ -580,10 +570,10 @@ Vil du slette denne gruppe\? Licens - %s nyt stream + %s ny stream %s nye streams - Semitone + Halvtone %d time %d timer @@ -593,16 +583,16 @@ %d dage Lavet af %s - Slå hurtigtilstand fra - Slå hurtigtilstand til - Hent fra det dedikerede feed når det er muligt + Deaktivér hurtig-tilstand + Aktivér hurtig-tilstand + Hent fra dedikeret feed, når det er tilgængeligt Feed opdateringsgrænse Feed %d valgt %d valgte - Processerer feed… + Behandler feed… Kanalgrupper %d minut @@ -611,27 +601,27 @@ Fjern sete Vælg en instans Forbindelse afbrudt - Fremskridt tabt fordi filen blev slettet + Fremskridt tabt, fordi filen blev slettet NewPipe blev lukket under arbejde på filen - Kan ikke overskrive filen - For at være i overenstemmelse med GDPR fanger vi din opmærksomhed hentil NewPipes privatpolitik. Venligst læs den med omhu. -\nDu skal acceptere den for at sende os en fejlrapport. + kan ikke overskrive filen + For at overholde den europæiske databeskyttelsesforordning (GDPR) henviser vi hermed din opmærksomhed til NewPipes privatlivspolitik. Læs den venligst omhyggeligt. +\nDu skal acceptere den for at kunne sende os fejlrapporten. Aflænk (kan skabe forvrængning) - Importer en SoundCloud profil ved at skrive enten dit URL eller ID: + Importér en SoundCloud-profil ved at skrive enten dit URL eller ID: \n -\n1. Slå \"desktop-version\" til i mobilbrowsere. +\n1. Slå \"desktop-tilstand\" til i mobilbrowsere. \n2. Gå til denne adresse: %1$s -\n3. Log ind når du bliver spurgt -\n4. Kopier adressen på den profil du bliver henstillet til. - Vis den oprindelige tidsforskel på elementer +\n3. Log ind, når du bliver bedt om det +\n4. Kopiér adressen på den profil, du bliver omdirigeret til. + Vis oprindelig tid siden på elementer Autogenereret (ingen uploader fundet) Slå lyd til Sæt på lydløs Mest likede Kunne ikke indlæse kommentarer Standard Kiosk - Færdig - Tryk på \"Færdig\" når den er løst + Færdig + Tryk på \"Færdig\", når den er løst Ingen kommentarer ∞ videoer Ingen lyttere @@ -640,17 +630,199 @@ %s seere Ingen seere - Skift service, nuværende valg: + Skift service. Nuværende valg: Kommentarer er slået fra - Ingen apps på din enhed kan åbne dette - Ingen ledig plads på enheden - App sprog + Ingen app på din enhed kan åbne dette + Ingen ledig plads på enheden + App-sprog Ja, og delvist sete videoer Fejl ved indlæsning af feed Kunne ikke indlæse feed for \'%s\'. - Vis \"crash afspilleren\" + Vis \"Crash afspilleren\" Crash appen - Vis et crash alternativ når afspilleren er i brug + Vis en crash mulighed, når afspilleren er i brug Vis en fejl snackbar - Brug system mappevælger (SAF) + Brug systemets mappevælger (SAF) + Kanalens avatar-miniaturebillede + Dette er et SoundCloud Go+-nummer, i hvert fald i dit land, så det kan ikke streames eller hentes af NewPipe. + Ingen passende filhåndtering blev fundet til denne handling. +\nInstaller venligst en Storage Access Framework-kompatibel filhåndtering. + Ingen passende filhåndtering blev fundet til denne handling. +\nInstaller venligst en filhåndtering, eller prøv at deaktivere \'%s\' i downloadindstillingerne. + Aktivér valg af tekst i beskrivelsen + Automatisk (enhedstema) + Deaktivér valg af tekst i beskrivelsen + Fastgjort kommentar + Du abonnerer nu på denne kanal + , + Få besked + Du vil blive spurgt, hvor du vil gemme hver enkelt download + Tilgængelig i nogle tjenester og er normalt meget hurtigere, men kan returnere en begrænset mængde elementer og ofte ufuldstændige oplysninger (fx ingen varighed, elementtype, ingen live-status) + Ukendt format + Ukendt kvalitet + Hjertemarkeret af skaber + Størrelse på afspilningsinterval + ExoPlayer-standard + Tomt gruppenavn + Du vil blive spurgt, hvor du vil gemme hver enkelt download. +\nAktivér systemets mappevælger (SAF), hvis du vil hente til et eksternt SD-kort + Originaltekster fra tjenester vil være synlige i stream-elementer + Ingen videostreams er tilgængelige for eksterne afspillere + Fra + Tablet-tilstand + Denne video er kun tilgængelig for YouTube Musik Premium-medlemmer, så den kan ikke streames eller hentes af NewPipe. + \"Storage Access Framework\" gør det muligt at hente til et eksternt SD-kort + Tving rapportering af ikke-levérbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse + Tryk for at hente %s + Fra og med Android 10 understøttes kun \"Storage Access Framework\" + Synes du, at feed-indlæsning er for langsom? Hvis det er tilfældet, så prøv at aktivere hurtig indlæsning (du kan ændre det i indstillingerne eller ved at trykke på knappen nedenfor). +\n +\nNewPipe tilbyder to strategier til feed-indlæsning: +\n- Hentning af hele abonnementskanalen, hvilket er langsomt, men komplet. +\n- Brug af et dedikeret service endpoint, hvilket er hurtigt, men normalt ikke komplet. +\n +\nForskellen mellem de to, er, at den hurtige metode normalt mangler nogle oplysninger, f.eks. elementets varighed eller type (kan ikke skelne mellem livevideoer og normale videoer), og den returnerer muligvis færre elementer. +\n +\nYouTube er et eksempel på en tjeneste, der tilbyder denne hurtige metode med sit RSS-feed. +\n +\nValget er altså et spørgsmål om, hvad du foretrækker: hastighed eller præcise oplysninger. + Den valgte stream understøttes ikke af eksterne afspillere + Denne indstilling er kun tilgængelig, hvis %s er valgt som tema + Du kan nu vælge tekst inde i beskrivelsen. Bemærk, at siden kan flimre, og links muligvis ikke kan klikkes på, mens du er i markeringstilstand. + Streams, som endnu ikke understøttes af downloaderen, vises ikke + Hurtig tilstand + Importér eller eksportér abonnementer fra 3-punktsmenuen + Ofte stillede spørgsmål + Hvis du har problemer med at bruge appen, bør du tjekke disse svar på almindelige spørgsmål! + Se på hjemmesiden + Vis Picasso-farvede bånd oven på billeder, der angiver deres kilde: rød for netværk, blå for disk og grøn for hukommelse + Du kører den nyeste version af NewPipe + Grundet ExoPlayer-begrænsninger blev søgevarigheden sat til %d sekunder + Vis kun ugrupperede abonnementer + Playlisteside + Du kan vælge dit foretrukne nattema nedenfor + Vælg dit foretrukne nattema — %s + Support + Vært + Offentlig + Ikke oplyst + Privat + Intern + Til + Skift alle + Ingen lydstreams er tilgængelige for eksterne afspillere + Vælg kvalitet til eksterne afspillere + Sorter + Ignorer hændelser med hardware-medieknap + Nyttigt, hvis du fx bruger et headset med ødelagte fysiske knapper + Playlisterne, der er nedtonede, indeholder allerede dette element. + Fjern permanent miniaturebillede + Kunne ikke kopiere til udklipsholder + Brug det originale lydspor uanset sprog + Foretræk lydbeskrivelser + Foretræk original lyd + Hvis tilgængeligt, brug lydbeskrivelser for personer med nedsat syn + Rediger hver notifikationshandling nedenfor ved at trykke på den. De første tre handlinger (afspil/pause, forrige og næste) er indstillet af systemet og kan ikke tilpasses. + Indlæser Metadata… + Fjern duplikater? + Vælg kvaliteten af billeder, og om billeder overhovedet skal indlæses, for at reducere data- og hukommelsesforbrug. Ændringer rydder både billedcachen i hukommelsen og på disken — %s + Middel kvalitet + Høj kvalitet + Ingen + Set helt + Ingen streams + Vis/skjul streams + Lysstyrke + Lydstyrke + Vælg bevægelse til venstre halvdel af afspillerens skærm + Vælg bevægelse til højre halvdel af afspillerens skærm + Højre bevægelseshandling + Ingen livestreams + Lyd: %s + Lydspor + Fjern duplikater + Vis følgende streams + Hent kanal-faner + Faner, der skal hentes, når feedet opdateres. Denne indstilling har ingen effekt, hvis en kanal opdateres i hurtig-tilstand. + Miniaturebilleder + Vælg lydspor til eksterne afspillere + Ukendt + Delvist set + Kommende + original + Videoer + Numre + Live + Kanaler + Playlister + Album + Om + Kanal-faner + Hvilke faner vises på kanalsiderne + Åbn afspilningskø + Skift til fuldskærm + Skift skærmretning + Forrige stream + Næste stream + Afspil + Afspil igen + Varighed + Spol tilbage + Billedkvalitet + Indlæs ikke billeder + Lav kvalitet + Del Playliste + Del playliste med detajler såsom playlistenavn og videotitler eller som en simpel liste over video-URL\'er + Del med Titler + Del URL-liste + + %s svar + %s svar + + Vis mere + Vis mindre + Skift intervalstørrelsen for indlæsning af progressivt indhold (i øjeblikket %s). En lavere værdi kan fremskynde den første indlæsning + Ønsker du at fjerne alle duplikerede streams i denne playliste? + Spol frem + Venstre bevægelseshandling + ExoPlayer-indstillinger + Administrer nogle ExoPlayer-indstillinger. Disse ændringer kræver genstart af afspilleren for at træde i kraft + Position for hovedfaner + Flyt hovedfanens vælger til bunden + Duplikat tilføjet %d gang(e) + Medietunneling var som standard deaktiveret på din enhed, fordi din enhedsmodel er kendt for ikke at understøtte det. + Uploader-avatars + Underkanal-avatars + Avatars + Bannere + Abonnenter + Et lydspor bør allerede være til stede i denne stream + Brug ExoPlayers fallback-funktion til dekoderen + oversat + beskrivende + Shorts + Flere muligheder + \? + - %1$s: %2$s + %1$s +\n%2$s + Aktivér denne indstilling, hvis du oplever initialiseringsproblemer med dekodere, som falder tilbage til dekodere af lavere prioritet, hvis de primære dekoderes initialisering fejler. Dette kan resultere i dårligere afspilningsydelse end ved brug af primære dekodere + Denne løsning frigiver og genindstiller video-codecs, når en overflade ændres, i stedet for at indstille overfladen til codec\'en direkte. Denne indstilling bruges allerede af ExoPlayer på nogle enheder med dette problem, men har kun effekt på Android 6 og nyere. +\n +\nAktivering af denne indstilling kan forhindre afspilningsfejl, når du skifter den aktuelle videoafspiller eller skifter til fuld skærm + Brug altid ExoPlayers overfladeindstilling til video-output som løsning + Kort + %1$s %2$s + Ikke nok ledig plads på enheden + Ja + Nej + Nulstil indstillinger + Nulstil alle indstillinger til deres standardværdier + NewPipe kan automatisk tjekke efter nye versioner indimellem og give dig besked, når de er tilgængelige. +\nØnsker du at aktivere dette? + Hvis du nulstiller alle indstillinger, kasseres alle dine foretrukne indstillinger, og appen genstartes. +\n +\nEr du sikker på, at du vil fortsætte? + Indstillingerne i den eksport, der importeres, bruger et sårbart format, der er blevet forældet siden NewPipe 0.27.0. Sørg for, at den eksport, der importeres, er fra en pålidelig kilde, og brug helst kun eksport fra NewPipe 0.27.0 eller nyere i fremtiden. Understøttelse af import af indstillinger i dette sårbare format fjernes snart helt, og så vil gamle versioner af NewPipe ikke længere være i stand til at importere indstillinger fra eksport fra nye versioner. + Sikkerhedskopiering og gendannelse \ 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 7d8e64475d3..6099fe4cae3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -27,7 +27,7 @@ Video und Audio Bevorzugte Sprache des Inhalts Video abspielen, Dauer: - Avatarbild des Benutzers + Profilbild des Benutzers Gefällt mir nicht Gefällt mir Externen Video-Player verwenden @@ -43,13 +43,12 @@ Aussehen Fehler Konnte nicht alle Vorschaubilder laden - Konnte Video-URL-Signatur nicht entschlüsseln Konnte Webseite nicht analysieren Inhalt nicht verfügbar Inhalt Altersbeschränkte Inhalte anzeigen Konnte Downloadmenü nicht einrichten - Fehler via E-Mail melden + Per E-Mail melden Formatierten Fehlerbericht kopieren Über GitHub melden Melden @@ -75,7 +74,7 @@ Mrd. Dateiname Fehler - Bitte warten … + Bitte warten … In Zwischenablage kopiert Bitte gib später in den Einstellungen einen Downloadordner an Starten @@ -100,12 +99,12 @@ Nur manche Geräte können Videos in 2K/4K abspielen Hintergrund Pop-up - Pop-up Eigenschaften merken + Eigenschaften des Pop-ups merken Entfernt Tonspur bei manchen Auflösungen Letzte Größe und Position des Pop-ups merken Suchvorschläge - Wähle die Vorschläge aus, die bei der Suche angezeigt werden sollen - Löschen + Vorschläge auswählen, die bei der Suche angezeigt werden sollen + löschen Beste Auflösung Über NewPipe Lizenzen @@ -136,7 +135,7 @@ Verlauf Abonnement konnte nicht geändert werden Abonnement konnte nicht aktualisiert werden - Nach Unterbrechungen (z.B. Telefonaten) Wiedergabe fortsetzen + Nach Unterbrechungen (z. B. Telefonaten) Wiedergabe fortsetzen NewPipe-Benachrichtigung Benachrichtigungen für den NewPipe-Player Verhalten @@ -172,17 +171,17 @@ Audio-Einstellungen Konnte diesen Stream nicht abspielen Inhalt der Hauptseite - Kanal-Seite + Kanalseite Details Top 50 Nicht behebbarer Wiedergabefehler aufgetreten Wiederherstellen nach einem Wiedergabefehler Kiosk-Seite Kiosk auswählen - Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Knopf „Details:“ im Video gedrückt wird + Tipp anzeigen, wenn die Hintergrundwiedergabe- oder Pop-up-Schaltfläche „Details:“ im Video gedrückt wird Neu und Heiß Halten, um zur Wiedergabeliste hinzuzufügen - „Halten zum Einreihen“ Tipp anzeigen + „Halten zum Einreihen“-Tipp anzeigen [Unbekannt] Wiedergabe im Hintergrund starten Wiedergabe in einem Pop-up starten @@ -205,8 +204,8 @@ Navigationsleiste schließen Video-Player Wiedergabe im Hintergrund - Popup-Player - Informationen werden abgerufen … + Pop-up-Player + Erhalte Informationen … Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren @@ -253,7 +252,6 @@ Beachte, dass diese Aktion das Netzwerk stark belasten kann. \n \nMöchtest du fortfahren\? - Vorschaubilder laden Bilder-Cache gelöscht Zwischengespeicherte (Metadaten) löschen Alle zwischengespeicherten Website-Daten entfernen @@ -270,7 +268,6 @@ Geschwindigkeit Tonhöhe Entkoppeln (kann zu Verzerrungen führen) - Deaktiviere diese Option, um das Laden von Vorschaubildern zu verhindern, was Daten- und Speicherverbrauch spart. Änderungen löschen den Bildzwischenspeicher sowohl im Arbeitsspeicher als auch auf dem internen Speicher Nächsten Stream automatisch einreihen Wiedergabe durch Anhängen eines verwandten Streams an die Warteschlange (ohne Wiederholungsschleife) fortsetzen Wiedergabeliste mit Lesezeichen versehen @@ -295,13 +292,12 @@ \n2. Gehe zu dieser URL: %1$s \n3. Melde dich an, falls du dazu aufgefordert wirst \n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest. - yourID, soundcloud.com/yourid + deineID, soundcloud.com/deineid Keine Streams zum Download verfügbar Bevorzugte „Öffnen“-Aktion Standardaktion beim Öffnen von Inhalten — %s Untertitel Textgröße und Hintergrund der Untertitel im Player anpassen. Erfordert Neustart der App - Keine App zum Abspielen dieser Datei installiert Wiedergabeverlauf löschen Den Verlauf der wiedergegebenen Streams und die Wiedergabepositionen löschen Den ganzen Wiedergabeverlauf löschen\? @@ -319,7 +315,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 @@ -337,10 +333,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 @@ -413,7 +405,7 @@ Datei kann nicht überschrieben werden Es ist ein ausstehender Download mit diesem Namen vorhanden NewPipe wurde während der Verarbeitung der Datei geschlossen - Kein Speicherplatz mehr auf dem Gerät + Kein Speicherplatz mehr auf dem Gerät Vorgang abgebrochen, da die Datei gelöscht wurde Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen\? Downloadwarteschlange begrenzen @@ -433,7 +425,7 @@ Niemand schaut zu %s Zuschauer - %s Zuschauer + %s Zuschauende Niemand hört zu @@ -463,7 +455,7 @@ Sprache der App Systemstandard „Fertig“ drücken, wenn es gelöst wurde - Fertig + Fertig Videos %d Sekunde @@ -502,15 +494,15 @@ Zeit nach der letzten Aktualisierung, bevor ein Abonnement als veraltet angesehen wird — %s Schnellmodus aktivieren Schnellmodus deaktivieren - Abos zuletzt aktualisiert: %s + Feed zuletzt aktualisiert: %s Grenzwert für Feed-Aktualisierung - Aus fest zugeordnetem Feed abholen wenn verfügbar + Aus fest zugeordnetem Feed abrufen wenn verfügbar Steht in manchen Diensten zur Verfügung, ist meist viel schneller, liefert aber eventuell eine eingeschränkte Anzahl an Elementen und oft unvollständige Informationen (z. B. keine Videolänge, keinen Elementtyp, keinen Live-Status) - Glaubst du, dass das Laden von Feeds zu langsam ist\? Wenn ja, versuche den Schnelllademodus einzuschalten (du kannst ihn in den Einstellungen oder über die Schaltfläche unten ändern). + Glaubst du, dass das Laden von Feeds zu langsam ist? Wenn ja, versuche den Schnelllademodus einzuschalten (du kannst ihn in den Einstellungen oder über die Schaltfläche unten ändern). \n \nNewPipe bietet zwei Feed-Ladestrategien: -\n• die Abholung des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. -\n• die Verwendung eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich inkomplett ist. +\n• das Abrufen des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. +\n• das Verwenden eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich unvollständig ist. \n \nDer Unterschied zwischen den beiden ist, dass der schnellen normalerweise einige Informationen fehlen, wie die Dauer oder der Typ des Elements (keine Unterscheidung zwischen Live-Videos und normalen) und sie eventuell weniger Elemente liefert. \n @@ -549,7 +541,7 @@ Nur über WLAN Nie Du kannst maximal drei Aktionen auswählen, die in der Kompaktbenachrichtigung angezeigt werden sollen! - Bearbeite jede Benachrichtigungsaktion unten, indem du darauf tippst. Wähle mithilfe der Kontrollkästchen rechts bis zu drei aus, die in der Kompaktbenachrichtigung angezeigt werden sollen + Bearbeite jede Benachrichtigungsaktion unten, indem du auf sie tippst. Wähle mithilfe der Kontrollkästchen rechts bis zu drei aus, die in der Kompaktbenachrichtigung angezeigt werden sollen. Konnte die angegebene URL nicht erkennen. Mit einer anderen Anwendung öffnen\? Fünfte Aktionstaste Vierte Aktionstaste @@ -573,7 +565,7 @@ Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst reCAPTCHA-Cookies wurden gelöscht reCAPTCHA-Cookies löschen - Inhalte mit Altersbegrenzung (z. B. ab 18) anzeigen, die für Kinder möglicherweise ungeeignet sind + Für Kinder möglicherweise ungeeignete Inhalte anzeigen (bspw. ab 18) In Wiedergabe einreihen Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist) Benachrichtigung farblich anpassen @@ -581,10 +573,10 @@ Vorschaubild anzeigen Hash wird berechnet Benachrichtigungen über den Hashing-Fortschritt von Videos - Video-Hash Benachrichtigung + Video-Hash-Benachrichtigung Letzte Metadaten anzeigen - Deaktiviere diese Option, um Meta-Infofelder mit zusätzlichen Informationen zum Stream-Ersteller, zum Stream-Inhalt oder zu einer Suchanforderung auszublenden + Ausschalten, um Metadaten-Felder mit zusätzlichen Informationen zu Stream-Ersteller, -Inhalten oder einer Suchanfrage auszublenden Kapitel Beschreibung Verwandte Elemente @@ -606,11 +598,11 @@ Lösen Download hat begonnen Du kannst dein bevorzugtes Nachtdesign unten auswählen - Wähle dein bevorzugtes Nachtdesign – %s + Wähle dein bevorzugtes Nachtdesign — %s Automatisch (Gerätedesign) Nachtdesign - Kanal-Details anzeigen - Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt + Kanaldetails anzeigen + Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt. Media-Tunneling deaktivieren Intern Privat @@ -622,9 +614,9 @@ Schlagwörter Kategorie Nicht gelistet - Vorschaubild-URL Server Unterstützung + Abonnenten Auswählen von Text in der Beschreibung deaktivieren Auswählen von Text in der Beschreibung aktivieren Du kannst nun Text innerhalb der Beschreibung auswählen. Beachte, dass die Seite flackern kann und Links im Auswahlmodus möglicherweise nicht anklickbar sind. @@ -632,7 +624,7 @@ \nNewPipe wird diesen Feed in Zukunft nicht mehr laden können. \nMöchtest du dich von diesem Kanal abmelden\? Konto geschlossen - Der Schnelllademodus liefert hierzu keine weiteren Informationen. + Der Schnellmodus liefert hierzu keine weiteren Informationen. Noch kein Downloadordner festgelegt, wähle jetzt den Standard-Downloadordner Webseite öffnen Ab Android 10 wird nur noch „Storage Access Framework“ unterstützt @@ -643,7 +635,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 @@ -664,14 +655,14 @@ Als Nächstes eingereiht Als Nächstes in Wiedergabe einreihen Verarbeite … Kann einen Moment dauern - Nach Aktualisierungen suchen + Nach Aktualisierungen suchen Suche nach Aktualisierungen … Manuelle Prüfung auf neue Versionen Neue Feed-Elemente \"Player abstürzen lassen\" anzeigen Player abstürzen lassen Zeigt eine Absturzoption an, wenn der Player verwendet wird - Benachrichtigung über Fehlerberichte + Fehlerbericht-Benachrichtigung Benachrichtigungen zur Meldung von Fehlern Bei NewPipe ist ein Fehler aufgetreten. Zum Melden antippen Ein Fehler ist aufgetreten, siehe die Benachrichtigung @@ -683,7 +674,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 @@ -692,7 +682,7 @@ %s neuer Stream %s neue Streams - Stream-Details laden … + Lade Stream-Details … Über neue Streams aus Abonnements benachrichtigen , Jedes Netzwerk @@ -715,15 +705,125 @@ 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! Sortieren - Schneller Modus + Schnellmodus Du verwendest die neueste Version von NewPipe Antippen um %s herunterzuladen Importieren oder Exportieren von Abonnements über das 3-Punkte-Menü + Diese Option ist nur verfügbar, wenn %s als Design ausgewählt wird + Dauerhaftes Vorschaubild aufheben + Kopieren in die Zwischenablage fehlgeschlagen + Karte + Duplikat %d mal hinzugefügt + Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits. + Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird + Ereignisse der Hardware-Medientasten ignorieren + Duplikate entfernen + Duplikate entfernen\? + Möchtest du alle doppelten Streams in dieser Wiedergabeliste entfernen\? + Streams anzeigen/ausblenden + Folgende Streams anzeigen + 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 + Originaltonspur unabhängig von der Sprache wählen + Beschreibendes Audio bevorzugen + Wenn möglich Audiospur mit Beschreibungen für sehbehinderte Menschen wählen + Audio: %s + Audiospur + Einige ExoPlayer-Einstellungen steuern. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden + Die Decoder-Fallback-Funktion von ExoPlayer verwenden + Immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung verwenden + 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 + Einschalten, wenn es Probleme mit der Decoderinitialisierung gibt, 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 + %1$s %2$s + 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. + Keine Live-Streams + Keine Streams + Videos + Live + Shorts + Wiedergabelisten + Kanäle + Alben + Tabs auf den Kanalseiten + Welche Tabs auf den Kanalseiten angezeigt werden + Lade Metadaten … + Über + Tabs der Kanalseiten abrufen + Tabs, die beim Aktualisieren des Feeds abgerufen werden. Diese Option hat keine Auswirkungen, wenn ein Kanal im Schnellmodus aktualisiert wird. + Titel + Bildschirmausrichtung umschalten + Vollbildmodus umschalten + Wiedergabewarteschlange öffnen + Vorspulen + Zurückspulen + Wiederholen + Abspielen + Nächster Stream + Mehr Optionen + Dauer + Vorheriger Stream + Bildqualität + \? + Geringe Qualität + Bilder nicht laden + Hohe Qualität + Mittlere Qualität + Banner + Vorschaubilder + Profilbilder + Profilbilder des Unterkanals + Profilbilder des Benutzers + Wähle die Bildqualität und ob überhaupt Bilder geladen werden sollen, um die Daten- und Speichernutzung zu reduzieren. Änderungen löschen sowohl den Bilder-Cache im Speicher als auch auf der Festplatte — %s + URL-Liste teilen + Mit Titeln teilen + %1$s +\n%2$s + Wiedergabeliste teilen + Teile die Wiedergabeliste mit Details wie dem Namen der Wiedergabeliste und den Videotiteln oder als einfache Liste von Video-URLs + - %1$s: %2$s + + %s Antwort + %s Antworten + + Mehr zeigen + Weniger zeigen + Bearbeite jede Benachrichtigungsaktion unten, indem du auf sie tippst. Die ersten drei Aktionen (Abspielen/Pause, Zurück und Weiter) sind vom System vorgegeben und können nicht angepasst werden. + Nicht genug freier Speicher auf dem Gerät + Einstellungen zurücksetzen + Setzt alle Einstellungen auf ihre Standardwerte zurück + Ja + Nein + Sichern und Wiederherstellen + NewPipe kann von Zeit zu Zeit automatisch nach neuen Versionen suchen und dich benachrichtigen, sobald sie verfügbar sind. +\nMöchtest du dies aktivieren? + Wenn du alle Einstellungen zurücksetzt, werden alle deine bevorzugten Einstellungen verworfen und die App wird neu gestartet. +\n +\nMöchtest du wirklich fortfahren? + Die Einstellungen in dem zu importierenden Export verwenden ein angreifbares Format, das seit NewPipe 0.27.0 veraltet ist. Stellen Sie sicher, dass der zu importierende Export aus einer vertrauenswürdigen Quelle stammt, und verwenden Sie in Zukunft nur noch Exporte, die aus NewPipe 0.27.0 oder neuer stammen. Die Unterstützung für den Import von Einstellungen in diesem angreifbaren Format wird bald vollständig entfernt werden, und dann werden alte Versionen von NewPipe nicht mehr in der Lage sein, Einstellungen von Exporten aus neuen Versionen zu importieren. + Sekundär \ 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 ae9571aa12f..379ebc8645b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -90,13 +90,11 @@ Ενθύμηση του τελευταίου μεγέθους και θέσης του παραθύρου Χρήση γρήγορης ανακριβούς αναζήτησης Η μην ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια. Δε λειτουργεί για διαστήματα των 5, 15 ή 25 δευτερολέπτων - Φόρτωση μικρογραφιών - Με την απενεργοποίηση δε φορτώνονται οι μικρογραφίες, εξοικονομώντας δεδομένα και μνήμη. Οι αλλαγές σβήνουν τις προσωρινά αποθηκευμένες εικόνες στη μνήμη και στον δίσκο Εκκαθαρίστηκε η προσωρινή μνήμη εικόνων Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε - Αυτόματη πρόσθεση της επόμενης ροής στην ουρά + Αυτόματη προσθήκη της επόμενης ροής στην ουρά Συνέχεια της τρέχουσας (μη επαναλαμβανόμενης) ουράς μετά τη λήξη της, με την προσθήκη μιας σχετικής ροής Επιλογή των προτάσεων που εμφανίζονται κατά την αναζήτηση Αποθήκευση αναζητήσεων στη συσκευή @@ -147,7 +145,6 @@ Διαγραφή ολόκληρου του ιστορικού αναζητήσεων; Το ιστορικό αναζητήσεων διαγράφηκε Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων - Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής της URL του βίντεο Δεν ήταν δυνατή η ανάλυση του ιστοτόπου Το περιεχόμενο δεν είναι διαθέσιμο Δεν ήταν δυνατή η ρύθμιση του μενού λήψεων @@ -165,7 +162,7 @@ Προέκυψε ένα σφάλμα: %1$s Δεν υπάρχουν διαθέσιμες ροές για λήψη Λυπούμαστε, αυτό δεν έπρεπε να έχει συμβεί. - Αναφορά αυτού του σφάλματος μέσω ηλεκτρονικού ταχυδρομείου + Αναφορά μέσω ηλεκτρονικού ταχυδρομείου Συγγνώμη, κάτι πήγε στραβά. Τι:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΧώρα περιεχομένου:\\nΓλώσσα εφαρμογής:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού συστήματος: Κανένα αποτέλεσμα @@ -210,7 +207,6 @@ Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή Αντικαταστάτης χαρακτήρας Οι περισσότεροι ειδικοί χαρακτήρες - Δεν υπάρχει εγκατεστημένη εφαρμογή για την αναπαραγωγή αυτού του αρχείου Σχετικά με το NewPipe Άδειες Τρίτων © %1$s από %2$s υπό %3$s @@ -335,10 +331,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Έλεγχος ήχου με χειρονομιές - Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου - Έλεγχος φωτεινότητας με χειρονομίες - Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις Συμβάντα Το αρχείο διαγράφηκε @@ -403,7 +395,7 @@ δεν είναι δυνατή η αντικατάσταση του αρχείου Υπάρχει μια εκκρεμής λήψη με αυτό το όνομα Το NewPipe τερματίστηκε ενώ επεξεργάζονταν το αρχείο - Δεν υπάρχει αρκετός χώρος στη συσκευή + Δεν υπάρχει αρκετός χώρος στη συσκευή Η πρόοδος χάθηκε, επειδή το αρχείο διαγράφηκε Λήξη χρονικού ορίου σύνδεσης Θέλετε να διαγράψετε το ιστορικό λήψεων σας ή να διαγράψετε όλα τα αρχεία που έχετε λάβει; @@ -467,7 +459,7 @@ Αναπαραγωγή ουράς Δεν υπάρχουν σελιδοδείκτες λίστας αναπαραγωγής ακόμα Επιλέξτε μια λίστα αναπαραγωγής - Τέλος + Τέλος Πατήστε «Τέλος» όταν επιλυθεί ∞ βίντεο 100+ βίντεο @@ -490,7 +482,7 @@ Ανάμιξη Επανάληψη Μπορείτε να επιλέξετε το πολύ τρεις ενέργειες για εμφάνιση στη σύντομη ειδοποίηση! - Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας πάνω της. Επιλέξτε έως και τρεις από αυτές για να εμφανίζονται στη σύντομη ειδοποίηση, χρησιμοποιώντας τα πλαίσια ελέγχου στα δεξιά + Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας πάνω της. Επιλέξτε έως και τρεις από αυτές για να εμφανίζονται στη σύντομη ειδοποίηση, χρησιμοποιώντας τα πλαίσια ελέγχου στα δεξιά. Κουμπί πέμπτης ενέργειας Κουμπί τέταρτης ενέργειας Κουμπί τρίτης ενέργειας @@ -603,13 +595,12 @@ Αυτόματο (θέμα συσκευής) Νυχτερινό θέμα Εμφάνιση λεπτομερειών καναλιού - Απενεργοποιήστε το media tunneling, αν εμφανίζεται μαύρη οθόνη ή διακοπτόμενος ήχος κατά την αναπαραγωγή βίντεο + Απενεργοποιήστε το media tunneling, αν παρατηρείτε μαύρη οθόνη ή διακοπές κατά την αναπαραγωγή βίντεο. Απενεργοποίηση media tunneling Εσωτερικό Ιδιωτικό Εκτός λίστας Δημόσιο - URL εικονιδίου Υποστήριξη Γλώσσα Όριο ηλικίας @@ -636,7 +627,6 @@ Ανενεργό Ενεργό Κατάσταση tablet - Εμφάνιση αναπαραχθέντων Τα σχόλια είναι απενεργοποιημένα Απόκρυψη Χαμηλή ποιότητα (μικρότερο) @@ -664,7 +654,7 @@ Επεξεργασία... Μπορεί να πάρει λίγο χρόνο Έλεγχος αναβάθμισης… Χειροκίνητος έλεγχος για νέα έκδοση - Έλεγχος αναβάθμισης + Έλεγχος αναβάθμισης Νέα αντικείμενα τροφοδοσίας Εμφάνιση «Κατάρρευσης αναπαραγωγέα» Εμφανίζει μια επιλογή κατάρρευσης κατά τη χρήση του αναπαραγωγέα @@ -682,7 +672,6 @@ Καρφιτσωμένο σχόλιο Το LeakCanary δεν είναι διαθέσιμο Εξ\' ορισμού ExoPlayer - Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής Ειδοποιήσεις %s νέα ροή @@ -715,9 +704,6 @@ Άγνωστος τύπος αρχείου Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής - Εμφάνιση μελλοντικών αντικειμένων - Απόκρυψη θεαθέντων - Απόκρυψη μελλοντικών αντικειμένων Συχνές ερωτήσεις Προβολή στην ιστοσελίδα Εάν αντιμετωπίζετε προβλήματα με τη χρήση της εφαρμογής, φροντίστε να ελέγξετε αυτές τις απαντήσεις σε συνήθεις ερωτήσεις! @@ -726,4 +712,118 @@ Εισάγετε ή εξάγετε συνδρομές από το μενού 3 κουκκίδων Πατήστε για λήψη %s Έχετε την πιο πρόσφατη έκδοση του NewPipe + Αυτή η επιλογή είναι διαθέσιμη μόνο εάν έχει επιλεγεί %s για Θέμα + Κατάργηση μόνιμης μικρογραφίας + Αποτυχία αντιγραφής στο πρόχειρο + Κάρτα + Οι λίστες αναπαραγωγής που είναι γκριζαρισμένες περιέχουν ήδη αυτό το στοιχείο. + Προστέθηκε διπλότυπο %d φορά(ες) + Αγνοήστε τα συμβάντα κουμπιών πολυμέσων υλικού + Χρήσιμο, για παράδειγμα, εάν χρησιμοποιείτε ακουστικά με χαλασμένα φυσικά κουμπιά + Εμφάνιση των ακόλουθων ροών + Θεαθέντα πλήρως + Προσεχή + Εμφάνιση/Απόκρυψη ροών + Αφαίρεση διπλοτύπων; + Θέλετε να καταργήσετε όλες τις διπλότυπες ροές σε αυτήν τη λίστα αναπαραγωγής; + Αφαίρεση διπλοτύπων + Θεαθέντα μερικώς + Επιλέξτε χειρονομία για το αριστερό μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια αριστερής χειρονομίας + Επιλέξτε χειρονομία για το δεξί μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια δεξιάς χειρονομίας + Φωτεινότητα + Ένταση + Καμία + Προτίμηση πρωτότυπου ήχου + Επιλογή του πρωτότυπου κομματιού ήχου ανεξάρτητα από τη γλώσσα + Προτίμηση του περιγραφικού ήχου + Ήχος: %s + Κομμάτι ήχου + Ένα κομμάτι ήχου θα πρέπει να υπάρχει ήδη σε αυτήν τη ροή + Επιλογή ήχου για εξωτερικές συσκευές αναπαραγωγής + Άγνωστο + Ρυθμίσεις ExoPlayer + Διαχειριστείτε ορισμένες ρυθμίσεις του ExoPlayer. Αυτές οι αλλαγές απαιτούν επανεκκίνηση του προγράμματος αναπαραγωγής για να τεθεί σε ισχύ + Χρησιμοποιήστε την δυνατότητα εναλλακτικού αποκωδικοποιητή του ExoPlayer + Ενεργοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με την προετοιμασία του αποκωδικοποιητή, η οποία επιστρέφει σε αποκωδικοποιητές χαμηλότερης προτεραιότητας εάν αποτύχει η προετοιμασία του πρωτεύοντος αποκωδικοποιητή. Αυτό μπορεί να έχει ως αποτέλεσμα κακή απόδοση αναπαραγωγής από ότι όταν χρησιμοποιείτε κύριους αποκωδικοποιητές + Χρησιμοποιείτε πάντα τον εναλλακτικό τρόπο ρύθμισης της επιφάνειας εξόδου βίντεο του ExoPlayer + Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση. +\n +\nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη + %1$s %2$s + αρχικό + μεταγλωττισμένο + περιγραφικό + Αλλάξτε το μέγεθος του διαστήματος φόρτωσης σε προοδευτικά περιεχόμενα (προς το παρόν %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική τους φόρτωση + Επιλογή ήχου με περιγραφές για άτομα με προβλήματα όρασης, εάν είναι διαθέσιμος + Μετακινήστε τον επιλογέα κύριας καρτέλας στο κάτω μέρος + Θέση κύριων καρτελών + Το media tunneling απενεργοποιήθηκε από προεπιλογή στη συσκευή σας, επειδή το μοντέλο της συσκευής σας είναι γνωστό ότι δεν το υποστηρίζει. + Καμία ζωντανή ροή + Καμία ροή + Φόρτωση μεταδεδομένων… + Βίντεο + Συνδρομητές + Ποιες καρτέλες εμφανίζονται στις σελίδες των καναλιών + Καρτέλες καναλιών + Σύντομα + Λήψη καρτελών καναλιών + Σχετικά + Άλμπουμ + Καρτέλες για ανάκτηση κατά την ενημέρωση της ροής. Αυτή η επιλογή δεν έχει καμία επίδραση εάν ένα κανάλι ενημερώνεται χρησιμοποιώντας τη γρήγορη λειτουργία. + Λίστες + Κομμάτια + Κανάλια + Ζωντανά + Εναλλαγή προσανατολισμού οθόνης + Λειτουργία πλήρους οθόνης + Επόμενη ροή + Άνοιγμα ουράς αναπαραγωγής + Εμπρός + Πίσω + Επανάληψη + Αναπαραγωγή + Περισσότερες επιλογές + Διάρκεια + Προηγούμενη ροή + Ποιότητα εικόνας + ; + Χαμηλή ποιότητα + Άβαταρ + Άβαταρ υπο-καναλιών + Μη φόρτωση εικόνων + Υψηλή ποιότητα + Μέτρια ποιότητα + Άβαταρ δημιουργών + Επιλέξτε την ποιότητα των εικόνων και εάν δε θέλετε να φορτώσετε εικόνες, για να μειώσετε τη χρήση δεδομένων και μνήμης. Οι αλλαγές εκκαθαρίζουν την κρυφή μνήμη εικόνων, τόσο στη μνήμη όσο και στον δίσκο — %s + Μικρογραφίες + Ταμπέλες + Κοινοποίηση λίστας URL + Κοινοποίηση με τίτλους + %1$s +\n%2$s + Κοινοποίηση λίστας + Μοιραστείτε τη λίστα αναπαραγωγής με λεπτομέρειες όπως το όνομα της λίστας αναπαραγωγής και τους τίτλους βίντεο ή ως μια απλή λίστα διευθύνσεων URL βίντεο + - %1$s: %2$s + + %s απάντηση + %s απαντήσεις + + Εμφάνιση περισσοτέρων + Εμφάνιση λιγότερων + Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας σε αυτήν. Οι τρεις πρώτες ενέργειες (αναπαραγωγή/παύση, προηγούμενηο και επόμενο) ορίζονται από το σύστημα και δεν μπορούν να τροποποιηθούν. + Δεν υπάρχει αρκετός ελεύθερος χώρος στη συσκευή + Όχι + Ναι + Αντίγραφο ασφαλείας και επαναφορά + Το NewPipe μπορεί να ελέγχει αυτόματα για νέες εκδόσεις και να σας ειδοποιεί μόλις είναι διαθέσιμες. +\nΘέλετε να το ενεργοποιήσετε; + Επαναφορά ρυθμίσεων + Επαναφορά όλων των ρυθμίσεων στις αρχικές τιμές τους + Η επαναφορά όλων των ρυθμίσεων θα απορρίψει όλες τις τροποποιημένες ρυθμίσεις σας και θα επανεκκινήσει την εφαρμογή. +\n +\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε; + Οι ρυθμίσεις στην εξαγωγή που εισάγεται χρησιμοποιούν μια ευάλωτη μορφή που είχε καταργηθεί από το NewPipe 0.27.0. Βεβαιωθείτε ότι η εξαγωγή που εισάγεται προέρχεται από αξιόπιστη πηγή και προτιμήστε να χρησιμοποιείτε μόνο εξαγωγές που λαμβάνονται από το NewPipe 0.27.0 ή νεότερο στο μέλλον. Η υποστήριξη για εισαγωγή ρυθμίσεων σε αυτήν την ευάλωτη μορφή θα καταργηθεί σύντομα εντελώς και, στη συνέχεια, οι παλιές εκδόσεις του NewPipe δεν θα μπορούν πλέον να εισάγουν ρυθμίσεις εξαγωγών από νέες εκδόσεις. + δευτερεύων \ 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..808aa25736c 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -76,8 +76,12 @@ Behaviour Select your favourite PeerTube instances Continue playing after interruptions (e.g. phone calls) - Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disc image cache. 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 f822442468b..a396f359f3e 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -36,7 +36,6 @@ Ĉu instali la mankan aplikaĵon Kore\? Montri \'Sekvajn\' kaj \'Similajn\' videojn Ĉiuj bildetoj ne ŝargeblas - La subskribo de la ligilo de la filmeto ne malĉifreblas La retejo ne analizeblas Ludi filmeton, daŭro: Bildeto de la alŝutinto @@ -80,7 +79,6 @@ Memori lastan grandon kaj pozicion de ŝprucfenestro Uzi rapidan malekzaktan serĉon Malekzakta serĉo permesas ke, la ludilo serĉi poziciojn pli rapide sed kun malpli ekzakto. Serĉi por 5, 15 aŭ 25 sekundoj ne funckias kun ĉi tio opcio - Ŝarĝi bildetojn Ne povis konstrui la dosierujon de elŝuto Enhavo limigita al aĝo Nuna @@ -113,8 +111,8 @@ Konservi la historio de serĉo lokale Rigardu historion Spuri la viditajn filmetojn - NewPipe Sciigo - Sciigoj por NewPipe fonaj kaj ŝprucfenestraj ludiloj + Sciigo de NewPipe + Sciigoj por ludilo de NewPipe Ludilo Konduto Historio kaj kaŝmemoro @@ -181,13 +179,11 @@ \n2. Iru tien: %1$s \n3. Ensalutu kiam oni petas vin \n4. Kopiu la ligilon de profilo ke oni kondikis vin. - Malŝaltu por malebligi ŝarĝajn bildetojn por konservi datumuzadon kaj memoruzadon. Ŝanĝoj vakigi ambaŭ en memoran kaj en diskan bildkaŝmemoron Bildokaŝmemoro vakigis Vakigi kaŝmemorigitajn metadatumojn Vakigi tutajn kaŝmemorigitajn retpaĝajn datumojn Kaŝmemorojn de metadatumojn vakigis Neniuj torentoj haveblaj por elŝuti - Neniu apo instalita por ludi ĉi tiun dosieron Forviŝi vidohistorion Forviŝi la historion de viditaj filmetojn kaj ludajn poziciojn Ĉu vi volas forviŝi la tutan historion \? @@ -203,14 +199,10 @@ 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 - Sciigo por nova versio de NewPipe + Sciigo por ĝisdatigo de apo + Sciigo por novaj versioj de NewPipe Ekstera konservejo malhavebla Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon \? viciĝita @@ -414,7 +406,7 @@ Elŝutita dosieron kun ĉi tiu nomo jam ekzistas Estas pritraktata elŝuto kun ĉi tiu nomo NewPipe estis fermita dum laborante sur la dosiero - Neniu spaco havebla sur la aparato + Neniu spaco havebla sur la aparato Progreso perdita, ĉar la dosiero estis forviŝita Eltempiĝo de Konekto Ŝangi la servon, nuntempe elektita: @@ -453,7 +445,7 @@ Preferata aplingvo Sistemnormo Premu “Finita” kiam solvita - Finita + Finita %d sekundo %d sekundoj @@ -554,4 +546,71 @@ Kraŝi la ludilo Envicigita Envicigi + Laŭteco + Neniu + Permesi al Android agordi koloron de sciigo laŭ la precipa koloro de videaĵminiaturo (noti, ke ĉi tio ne disponeblas en ĉiuj iloj) + Aŭtomata vicigado + Ago de dekstra gesto + Redakti ĉiun agon de sciigo per tuŝi gin. Elekti maksimume tri agon por montri en la kompakta sciigo per markobutonoj dekstre. + Elekti la originalan aŭdiotrakon malgraŭ lingvo + Elekti aŭdiotrakon kun priskriboj por vidmalkapabluloj kiam ebla + Ago de maldekstra gesto + Preferi priskribajn aŭdiotrakojn + Ŝangi la grandecon de elŝuta intervalo por progresiva enhavo (aktuale %s). Malplia valoro eble povas rapidigi ĝian komencan ŝargadon + Preferi originalan aŭdaĵon + Elekti geston por dekstra duono de ludil-ekrano + Utila, ekzemple, se vi uzas kaptelefonon, kiu havas difektajn fizikajn butonojn + Grandeco de intervalo de legada elŝuto + Heleco + Vi povas elekti maksimume tri agoj por montri en la kompakta sciigo! + Ignori eventoj de aparataroj plurmediaj butonoj + Elekti geston por maldekstra duono de ludil-ekrano + Ŝalti \"Limigitan Reĝimon\" de YouTube + Rapida reĝimo + Ne eblas rekoni la ligilon. Ĉu malfermi per alia apo\? + Kuketojn de reCAPTCHA estis forigita + Montri enhavon, kiu eble maltaŭgas por infanoj, ĉar ĝi havas aĝo-limon (kiel \"18+\") + Novaj fluoj + Foraj serĉsugestoj + Sciigoj por raporti erarojn + Ŝargante metadatumoj… + Sciigo por kreado de haketaĵoj de videoj + YouTube provizas \"Limigitan Reĝimon\", kiu kaŝas enhavon, kiu potence maltaŭgas por infanoj + Ĉi tiu video estas aĝo-limigita. +\nPro novaj reguloj de YouTube, kiuj aplikas al aĝo-limigitaj videoj, NewPipe ne povas atingi iun ajn video-fluoj de ĉi tiu video kaj konsekvence ne povas ludi ĝin. + Sciigo por erar-raportoj + Sciigoj + Ludila sciigo + Sciigo por haketado de videoj + Lokaj serĉsugestoj + Ŝalti ĉefan ludilon plenekrane + Sciigo por novaj fluoj de abonoj + Forigi kuketojn de reCAPTCHA + Agordi la sciigon por ĉi-momente ludantaj datumtorentoj + Ne komenci ludi videojn en la mini-ludilo, sed ŝalti plenekranan reĝimon rekte, se aŭtomata rotacio ŝlositas. Vi ankoraŭ povus atingi mini-ludilon, se vi elirus plenekranan reĝimon. + Forigi kuketojn, kiujn NewPipe konservas, kiam vi solvas reCAPTCHA-taskojn + NewPipe renkontis eraron, tuŝi por raporti + Pozicio de la ĉefaj langetoj + Transloki la ĉefan langet-elektilon al la malsupro + + %s nova fluo + %s novaj fluoj + + Raporti per GitHub + Komentoj malŝaltitas + Eraro okazis, vidu sciigon + Neniuj tujelsendoj + Neniuj fluoj + Kopii formatitan raporton + Importi aŭ eksporti abonojn per la tri-punkta menuo + Kalkulado de haketaĵo + Oftaj demandoj + Neniu dosierujo por elŝutoj agordita, bonvolu elekti la defaŭltan elŝuto-dosierujon nun + Bonvolu certigi, ĉu erarraporto, kiu diskutas pri via eraro, jam ekzistas. Kreado de duoblaĵaj erarraportoj forprenas tempon el ni, kiun ni povus uzi por ripari la veran eraron. + Rilatajn erojn + Solvi + Malsukcesis kopii al la tondujo + Oni petos al vi kien salvi ĉiujn elŝutojn + Jes + Ne \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 48e96ebecef..57f3a8f7382 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,6 +1,6 @@ - Publicado el %1$s + Publicado en %1$s No se encontró ningún reproductor de retransmisiones. ¿Instalar VLC\? Instalar Cancelar @@ -16,7 +16,7 @@ Elija la carpeta de descarga para los archivos de vídeo Resolución predefinida Reproducir con Kodi - ¿Instalar la aplicación Kore que falta\? + ¿Instalar la aplicación Kode que falta\? Mostrar opción «Reproducir con Kodi» Mostrar una opción para reproducir un vídeo a través de Kodi media center Audio @@ -38,7 +38,6 @@ Error Error de conexión No se pudo cargar las miniaturas - No se pudo descifrar la URL del vídeo No se pudo analizar el sitio web Mostrar vídeos \'Siguientes\' y \'Similares\' Idioma predefinido del contenido @@ -48,14 +47,14 @@ Miniatura del avatar del usuario Contenido Mostrar contenido con restricción de edad - Pulsa la lupa para empezar. + Toca la lupa para empezar. En directo Descargas Descargas Informe de error No se pudo configurar el menú de descarga Lo siento, esto no debería haber ocurrido. - Informar de este error vía correo electrónico + Informar por correo electrónico Lo siento, algo salió mal. Informar Información: @@ -108,7 +107,7 @@ Acerca de NewPipe Licencias de terceros © %1$s por %2$s, bajo %3$s - FAQ & Acerca de + FAQ y Acerca de Licencias Reproducción de transmisiones ligera y libre para Android. Ver en GitHub @@ -170,7 +169,7 @@ Página del canal Seleccione un canal No hay suscripciones a canales todavía - Seleccione un kiosco + Seleccione un quiosco Tendencias 50 mejores Mostrar sugerencia al pulsar el botón de segundo plano o emergente en la página «Detalles:» del vídeo @@ -220,7 +219,7 @@ Esto reemplazará tu configuración actual. Descargar archivo de retransmisión Mostrar información - Playlists de marcadores + Listas de reproducción marcadas Añadir a Arrastrar para reordenar Crear @@ -288,8 +287,6 @@ Esta operación puede causar un uso intensivo de la red. \n \n¿Quieres continuar\? - Cargar miniaturas - Desactivar para evitar la carga de miniaturas y ahorrar datos y memoria. Se vaciará la caché de imágenes en la memoria volátil y en el disco Se vació la caché de imágenes Vaciar metadatos en memoria caché Quitar todos los datos guardados de páginas web @@ -301,7 +298,6 @@ No hay streams disponibles para descargar Acción de apertura preferida Acción predefinida al abrir contenido: %s - No se encontró ninguna aplicación que reproduzca este archivo Subtítulos Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la aplicación para que surta efecto Vaciar historial de reproducciones @@ -332,7 +328,7 @@ Minimizar al reproductor emergente Avance rápido durante el silencio Paso - Reiniciar + Restablecer Canales Usuarios Listas de reproducción @@ -380,7 +376,7 @@ No encontrado Falló el posprocesamiento NewPipe se cerró mientras se trabajaba en el archivo - No hay suficiente espacio disponible en el dispositivo + No hay suficiente espacio disponible en el dispositivo Progreso perdido, porque el archivo fue borrado El tiempo de conexión expiro No se puede recuperar esta descarga @@ -391,16 +387,12 @@ 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 Notificaciones de nuevas versiones de NewPipe Almacenamiento externo no disponible - No es posible descargar a una tarjeta SD externa. \¿Restablecer la ubicación de la carpeta de descarga\? + No es posible descargar a una tarjeta SD externa. ¿Restablecer la ubicación de la carpeta de descarga? No se pudo leer las pestañas guardadas, se usarán las pestañas predefinidas Restaurar valores predefinidos ¿Quieres restaurar los valores predefinidos\? @@ -462,7 +454,7 @@ Idioma de aplicación Predefinido del sistema Pulsa en «Hecho» al resolverlo - Hecho + Hecho Vídeos %d segundo @@ -500,9 +492,9 @@ %d seleccionados Nombre de grupo vacío - ¿Borrar este grupo\? + ¿Quieres borrar este grupo? Nuevo - Contenido + Fuente Velocidad de actualización del contenido Tiempo para que una suscripción se considere desactualizada — %s Actualizar siempre @@ -545,7 +537,7 @@ Activar el «Modo restringido» de YouTube Página de lista de reproducción Mostrar solo suscripciones desagrupadas - Sin marcadores de lista de reproducción aún + Aún no hay marcadores para listas de reproducción Selecciona una lista de reproducción Por favor revisa si ya existe una discusión sobre tu problema. Al crear entradas duplicadas, toma tiempo de nosotros que podríamos usar para arreglar tal problema. Informe en GitHub @@ -566,7 +558,7 @@ Almacenar en memoria (búfer) Repetir ¡Puedes seleccionar como máximo tres acciones para mostrar en la notificación compacta! - Edite cada una de las acciones de notificación que aparecen a continuación pulsando sobre ellas. Seleccione hasta tres de ellas para que se muestren en la notificación compacta utilizando las casillas de verificación de la derecha + Edite cada acción de notificación pulsando sobre ella. Seleccione hasta tres de ellas para que se muestren en la notificación compacta utilizando las casillas de verificación de la derecha. Botón de quinta acción Botón de cuarta acción Botón de tercera acción @@ -611,7 +603,7 @@ La descarga ha comenzado Solucionar Puedes seleccionar tu tema nocturno favorito a continuación - Modo oscuro + tema para la noche Selecciona tu tema nocturno favorito — %s Automático (tema del dispositivo) Mostrar detalles del canal @@ -621,7 +613,6 @@ Privado No listado Público - URL de la miniatura Soporte Lenguaje Límite de edad @@ -636,20 +627,17 @@ No fue posible cargar el muro por \'%s\'. Cuenta cancelada El modo de muro rápido no arroja más información sobre esto. - La cuenta del autor ha sido cancelada. -\nNewPipe no podrá acceder a ella en el futuro. -\n¿Desea desuscribirse de este canal\? + La cuenta del autor ha sido cancelada.\nNewPipe no podrá acceder a ella en el futuro.\n¿Quieres desuscribirte de este canal? 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) @@ -677,7 +665,7 @@ Añadido el siguiente vídeo a la cola Añadir el siguiente vídeo a la cola Procesando… Podría tomar un momento - Buscar actualizaciones + Buscar actualizaciones Buscar nuevas versiones manualmente Buscando actualizaciones… Nuevos elementos en el muro @@ -697,7 +685,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 @@ -730,10 +717,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! @@ -742,4 +726,119 @@ Importa o exporta las suscripciones desde el menú con los tres puntos Está ejecutando la última versión de NewPipe Pulsa para descargar %s + Esta opción sólo está disponible si %s está seleccionado para el tema + Desactivar las miniaturas permanente + Error al copiar al portapapeles + Tarjeta + Duplicado añadido %d vez/veces + Las listas de reproducción que están en gris ya contienen este elemento. + Útil, por ejemplo, si está utilizando un auricular con botones físicos rotos + Ignorar eventos para botones multimedia de hardware + ¿Eliminar los duplicados\? + ¿Quieres eliminar todas las secuencias duplicadas de esta lista de reproducción? + Mostrar las siguientes secuencias + Mostrar/Ocultar secuencias + Próximamente + 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 + %1$s %2$s + original + doblado + descriptivo + Cambia el tamaño del intervalo de carga en contenidos progresivos (actualmente %s). Un valor más bajo puede acelerar la carga inicial + Ajustes de 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. + Sin retransmisiones + Sin transmisiones en directo + Vídeos + Suscriptores + Qué pestañas se muestran en las páginas de los canales + Pestañas del canal + Shorts + Cargando metadatos… + Recuperar las fichas del canal + Acerca de + Álbumes + Pestañas para recuperar al actualizar el canal. Esta opción no tiene efecto si el canal se actualiza en modo rápido. + Listas de reproducción + Pistas + Canales + En directo + Alternar la orientación de la pantalla + Alternar a pantalla completa + Siguiente retransmisión + Abrir la cola de reproducción + Avanzar + Rebobinar + Volver a reproducir + Reproducir + Más opciones + Duración + Retransmisión anterior + Calidad de la imagen + \? + Baja calidad + Avatares + Avatares de los subcanales + No cargar las imágenes + Calidad alta + Calidad media + avatares subidos + Banners + Elige la calidad de las imágenes y si cargar imágenes en su totalidad, para reducir el uso de datos y memoria. Los cambios borran la caché de las imágenes en la memoria y en el disco - %s + Miniaturas + Compartir la lista de la dirección URL + Compartir con los títulos + %1$s +\n%2$s + Compartir la lista de reproducción + Compartir las listas de reproducción con los detalles como el nombre de la lista y los títulos de los vídeos o como una simple lista de una dirección URL con los vídeos + - %1$s: %2$s + + %s respuesta + %s respuestas + %s respuestas + + Ver más + Mostrar menos + Edite cada acción de notificación pulsando sobre ella. Las tres primeras acciones (reproducir/pausa, anterior y siguiente) las establece el sistema y no se pueden personalizar. + No hay suficiente espacio libre en el dispositivo + Respaldar y restaurar + Restablecer ajustes + Restablecer todos los ajustes a sus valores predeterminados + Restablecer todos los ajustes descartará todos sus ajustes preferidos y reiniciará la aplicación. +\n +\n¿Estas seguro que deseas continuar? + + No + NewPipe puede buscar automáticamente nuevas versiones de vez en cuando y notificarle cuando estén disponibles. +\n¿Quieres habilitar esto? + La configuración de la exportación que se importa utiliza un formato vulnerable que quedó obsoleto desde NewPipe 0.27.0. Asegúrese de que la exportación que se está importando provenga de una fuente confiable y prefiera usar solo exportaciones obtenidas de NewPipe 0.27.0 o posterior en el futuro. La compatibilidad con la importación de configuraciones en este formato vulnerable pronto se eliminará por completo y, luego, las versiones antiguas de NewPipe ya no podrán importar configuraciones de exportaciones desde las nuevas versiones. + secundaria \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 7f2691b77e6..023894d5075 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -41,7 +41,7 @@ Kuva kõrgemaid lahutusi Ainult mõned seadmed suudavad esitada 2K/4K videoid Esita Kodi abil - Kas paigaldada puuduv Kore rakendus\? + Kas paigaldame puuduva Kore rakenduse\? Kuva valik \"Esita Kodi abil\" Kuva valik video esitamiseks Kodi meediakeskuse kaudu Heli @@ -55,8 +55,6 @@ Pea hüpikakna viimane suurus ja asukoht meeles Kasuta ebatäpset kerimist Ebatäpne kerimine lubab meediamängijal otsida asukohta kiiremini täpsuse arvel. Sellega ei tööta 5, 15 või 25 sekundi kaupa kerimine - Laadi pisipildid - Lülita välja, et keelata pisipiltide laadimist, andmete salvestamist ja mälukasutust. Muutmine puhastab vahemälu nii kettal kui ka mälus Pildid kustutati vahemälust Kustuta metaandmed vahemälust Kustuta veebilehtede andmed vahemälust @@ -121,7 +119,6 @@ Viga Võrgu viga Kõiki pisipilte ei õnnestunud laadida - Video URLi dekrüptimine nurjus Veebilehe töötlemine nurjus Sisu pole saadaval Allalaadimismenüü seadistamine nurjus @@ -139,7 +136,7 @@ Ilmnes viga: %1$s Allalaaditavaid videovooge pole Vabandust, seda poleks pidanud juhtuma. - Teata sellest veast e-posti kaudu + Teata e-posti teel Vabandust, midagi läks valesti. Teata Info: @@ -181,7 +178,7 @@ Kustuta Kontrollsumma Loobu - Nimeta ümber + Muuda nime OK Faili nimi Lõimed @@ -200,7 +197,6 @@ Asendustähemärk Tähed ja numbrid Erimärgid - Selle faili esitamiseks puudub rakendus NewPipe rakendusest Kolmanda osapoole litsentsid Rakenduse teave ja KKK @@ -252,7 +248,7 @@ Info hankimine… Soovitud sisu laadimine Uus esitusloend - Nimeta ümber + Muuda nime Nimi Lisa esitusloendisse Määra esitusloendi pisipildiks @@ -335,10 +331,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 @@ -419,7 +411,7 @@ Aja segi Korda Sa saad valida kuni kolm tegevust, mida kuvatakse lühiteavituses! - Muuda iga teavituse tegevusi sellel toksates. Vali märkekastides paremal kuni kolm teavitust, mida kuvada lühiteates + Muuda iga teavituse tegevusi sellel toksates. Vali märkekastides paremal kuni kolm teavitust, mida kuvada lühiteates. Viies tegevusnupp Neljas tegevusnupp Kolmas tegevusnupp @@ -502,7 +494,7 @@ Esitusloendi järjehoidjaid veel pole Vali esitusloend Vaikimisi seadistatud kiosk - Valmis + Valmis Kui oled lõpetanud, siis vajuta „Valmis“ nuppu Kommentaare pole ∞ videot @@ -513,7 +505,7 @@ Kustuta allalaadimiste ajalugu Seda allalaadimist ei saa uuesti alustada Ühendus aegus - Seadmes pole enam ruumi + Seadmes pole enam ruumi Sellise nimega allalaadimine on juba pooleli faili asendamine ei õnnestu Uus @@ -565,7 +557,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. @@ -591,7 +583,6 @@ Sisemine Privaatne Avalik - Pisipildi URL Kasutajatugi Keel Vanusepiir @@ -614,7 +605,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 @@ -663,7 +653,7 @@ Lisa esitamiseks järgmisena Töötlen andmeid… Võib kuluda mõni hetk Kontrollin uuendusi… - Kontrolli uuendusi + Kontrolli uuendusi Kontrolli uuendusi käsitsi Uued andmevoo kirjed Näita „Jooksuta meediamängija kokku“ nupukest @@ -682,7 +672,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 @@ -715,9 +704,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 @@ -726,4 +712,118 @@ Kiirrežiim Tellimusi saad importida või eksportida 3 punktiga menüüst Sa kasutad NewPipe\'i uusimat versiooni + See valik on kasutusel vaid %s teema puhul + Lõikelauale kopeerimine ei õnnestunud + Eemalda püsiv pisipilt + Kaart + Hallina kuvatud esitusloendid juba sisaldavad seda kirjet. + Topeltkirje lisatud %d kord(a) + Kasulik näiteks kui olukorras kui kõrvaklappide nupud on katki + Eira nutiseadmes asuvate või seotud seadmete meedianuppude vajutusi + Eemalda topeltkirjed + Kas eemaldame topeltkirjed\? + Kas sa soovid eemaldada kõik topelt meediavood sellest esitusloendist\? + Näita järgmisi meediavooge + Näita/peida meediavood + 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 + %1$s %2$s + algne + dubleeritud + kirjeldav + Heliriba + Vali heliriba väliste meediamängijate jaoks + Teadmata + ExoPlayer\'i seadistused + Järgnevas saad hallata mõningaid ExoPlayer\'i seadistusi. Need muudatused vajavad jõustumiseks meediamängija uuesti käivitamist + Kasuta seda võimalust, kui põhidekooder ei käivitu korralikult. Selle asemel laaditakse alternatiivne dekooder, kuid tulemuseks võib olla kehvem taasesituse kvaliteet + Video väljundpinna muutumisel see alternatiivne lahendus eemaldab videokodekid kasutusest ja laadib nad uuesti ega ürita videokodeke uue väljundpinnaga sobitada. See seadistus toimib vaid Android 6 ja uuemates versioonides ning mõne seadme puhul on juba automaatselt kasutusel +\n +\nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel + 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. + Meediavoogusid ei leidu + Otseeetris meediavoogusid ei leidu + Pildikvaliteet + Videod + \? + Tellijad + Kanali lehel kuvatavad kaardid + Kanali kaardid + Lühivideod + Laadime metateavet… + Vaheta ekraani paigutust + Madal kvaliteet + Lülita täisekraan sisse/välja + Laadi kanali kaardid + Tunnuspildid + Järgmine meediavoog + Alamkanali tunnuspilt + Ava esitusjärjekord + Ära laadi pilte + Parim kvaliteet + Kanali teave + Keri edasi + Albumid + Keri tagasi + Korda esitust + Andmevoo uuendamisel laaditavad kanali kaardid. Kui kanalite uuendamine toimub kiirrežiimis, siis see eelistus ei ole kasutusel. + Keskmine kvaliteet + Üleslaadija tunnuspilt + Reklaampildid + Esitusloendid + Vali soovitud pildikvaliteet või sootuks ära luba piltide laadimist ning nii saad muuta võrguliikluse ja mälu mahtu. Muudatusega eemaldatakse puhverdatud pildid nii mälust kui andmekandjalt — %s + Esita + Lisavalikud + Pisipildid + Palad + Kestus + Kanalid + Eelmine meediavoog + Otseeeter + Jaga url\'ide loendina + Jagamisel lisa pealkirjad + %1$s +\n%2$s + Jaga esitusloendit + Jaga esitusloendit kas väga detailse teabega palade kohta või lihtsa url\'ide loendina + - %1$s: %2$s + Näita veel + + %s vastus + %s vastust + + Näita vähem + Muuda iga teavituse tegevust sellel toksates. Kolm esimest tegevust (esita/peata esitus, eelmine video, järgmine video) on süsteemsed ja neid ei saa muuta. + Varundus ja taastamine + NewPipe võib aeg-ajalt automaatselt kontrollida uute versioonide olemasolu ning sind vastavalt teavitada. +\nKas sa soovid sellist võimalust kasuutada? + Lähtesta seadistused + Lähtesta kõik seadistused nende vaikimisi väärtusteks + Seadmes pole enam piisavalt vaba ruumi + Kui lähtestad kõik seadistused, siis kõik sinu muudetud seadistused asendatakse vaikimisi väärtustega ja rakendus käivitub uuesti. +\n +\nKas sa soovid jätkata? + Jah + Ei + Imporditavad andmed kasutavad turvaprobleemidega vormingut, mida alates versioonist 0.27.0 NewPipe enam luua ei suuda. Palun kontrolli, et impordifail on loodud usaldusväärse osapoole poolt ning edaspidi loo ekspordifailid NewPipe versiooniga 0.27.0 või uuemaga. Tugi sellise vana vormingu kasutamisele kaob õige pea ja seejärel NewPipe uuemad ja vanemad versioonid ei saa omavahel andmeid enam vahetada. + täiendav \ 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 4bbacf7b5d2..cca30599428 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -14,7 +14,7 @@ Aukeratu bideoak deskargatzeko karpeta Lehenetsitako bereizmena Jo Kodirekin - Kore aplikazioa instalatu\? + Falta den Kore aplikazioa instalatu nahi duzu? Erakutsi \"Jo Kodirekin\" aukera Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera Audioa @@ -28,7 +28,7 @@ Igotzailearen abatarraren iruditxoa Ez dute gustoko Gustoko dute - Ez da jario erreproduzigailurik aurkitu. VLC instalatu\? + Ez da igorpen-erreproduzigailurik aurkitu. VLC instalatu? \"%1$s\" esan nahi al zenuen\? Erabili kanpo bideo-erreproduzigailua Erabili kanpo audio-erreproduzigailua @@ -68,13 +68,12 @@ Errorea Sare-errorea Ezin izan dira iruditxo guztiak deskargatu - Ezin izan da bideoaren URL sinadura deskodetu Ezin izan da webgunea analizatu Edukia ez dago eskuragarri Ezin izan da deskargen menua ezarri Aplikazioa/interfazea kraskatu da Hori ez litzateke gertatu behar. - Eman errore honen berri e-posta bidez + Eman honen berri e-posta bidez Barkatu, zerbait gaizki atera da. Salatu Informazioa: @@ -108,9 +107,9 @@ NewPipe aplikazioari buruz Hirugarrengoen lizentziak © %1$s %2$s. %3$s - Honi buruz + Honi buruz eta ohiko galderak Lizentziak - Androiderako streaming libre eta arina. + Igorpen libre eta arinak Android-en. Ikusi GitHub zerbitzarian NewPipe Lizentzia Ideiak, itzulpenak, diseinu aldaketak, kode garbiketak, kode aldaketa sakonak badituzu, laguntza beti da ongi etorria. Eginaz hobetzen da! @@ -168,7 +167,7 @@ Aldatu bigarren planora Aldatu laster-leihora Aldatu nagusira - Ezin izan da jario hau erreproduzitu + Ezin izan da igorpen hau erreproduzitu Erreproduzigailuaren errore berreskuraezina gertatu da Erreproduzigailuaren erroretik berreskuratzen Dohaintza @@ -195,29 +194,28 @@ Laster-leihoan erreproduzitzen hasi Ireki tiradera Itxi tiradera - Ez da jario erreproduzigailurik aurkitu (VLC instalatu dezakezu edukia ikusi ahal izateko). + Ez da igorpen-erreproduzigailurik aurkitu (VLC instalatu dezakezu erreproduzitzeko). Beti Behin besterik ez Kanpo erreproduzigailuek ez dituzte mota honetako estekak onartzen - Ez da bideo jariorik aurkitu - Ez da audio jariorik aurkitu + Ez da bideo-igorpenik aurkitu + Ez da audio-igorpenik aurkitu Bideo erreproduzigailua Bigarren planoko erreproduzigailua Laster-leiho erreproduzigailua Informazioa eskuratzen… Kargatzen eskatutako edukia - Deskargatu jario fitxategia + Deskargatu igorpen-fitxategia Erakutsi informazioa Gogoko erreprodukzio-zerrendak Gehitu hona Erabili bilaketa azkar ez zehatza - Kargatu iruditxoak Irudien cachea ezabatuta Ezabatu cacheko metadatuak Kendu cachetik webguneen datu guztiak Metadatuen cachea ezabatuta - Gehitu hurrengo jarioa ilarara - Jarraitu bukaerako (errepikapenik gabe) ilara erlazionatutako jario bat gehituz + Gehitu automatikoki hurrengo igorpena ilarara + Gehitu ilararen amaieran lotutako igorpen bat errepikatu gabe Arazketa Fitxategia Inportatu datu-basea @@ -225,7 +223,7 @@ Zure uneko historiala, harpidetzak eta (aukeran) ezarpenak gainidazten ditu Esportatu historiala, harpidetzak, erreprodukzio-zerrendak eta ezarpenak Garbitu ikusitakoaren historiala - Jotako jarioen historiala eta erreprodukzio puntuak ezabatzen ditu + Erreproduzitutako igorpen-historia eta erreprodukzio-kokapenak ezabatzen ditu Ezabatu ikusitakoaren historia osoa\? Ikusitakoaren historiala ezabatuta Garbitu bilaketa historiala @@ -237,13 +235,12 @@ Fitxategia ez dago edo ez dago baimenik irakurri edo idazteko Fitxategi izena ezin da hutsik egon Errore bat gertatu da: %1$s - Ez dago jariorik deskargatzeko eskuragarri + Ez dago igorpenik eskuragarri deskargatzeko Arrastatu ordena aldatzeko Sortu Baztertu Aldatu izena Elementu 1 ezabatuta. - Ez dago fitxategi hau erreproduzitzeko aplikaziorik instalatuta Jotako azkena Ikusiena Esportatuta @@ -263,7 +260,7 @@ Kendu gogokoa Erreprodukzio zerrenda hau ezabatu\? Erreprodukzio-zerrenda sortuta - Erreprodukzio-zerrendatua + Zerrendara gehitua Erreprodukzio zerrendaren iruditxoa aldatuta. Azpititulurik ez Doitu @@ -308,7 +305,6 @@ Desaktibatu (distortsioa sor lezake) Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du. 5, 15 edo 25 segundo bilatzea ez du honekin funtzionatzen - Desgaitu koadro txikiak ez kargatzeko, datuak eta memoria aurreztuz. Aldaketak memoria eta diskoko irudien cacheak garbituko ditu NewPipe Software Librea eta Copyleft da: Erabili, ikertu, partekatu eta hobetu dezakezu. Zehazki, elkarbanatzea eta aldatzea Free Software Foundation-ek argitaratutako GNU General Public License-ren 3. bertsioa edo berriagoren baten terminoen arabera egiteko baimena duzu. Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena NewPipe pribatutasun politika @@ -335,10 +331,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 @@ -404,7 +396,7 @@ Ezin da fitxategia gainidatzi Badago izen bereko deskarga bat burutzeke NewPipe itxi egin da fitxategian lanean zegoela - Ez dago lekurik gailuan + Ez dago lekurik gailuan Progresioa galdu da, fitxategia ezabatu delako Zure deskargen historiala garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu\? Mugatu deskargen ilara @@ -454,7 +446,7 @@ Aplikazioaren hizkuntza Sistemaren lehenetsia Sakatu \"Egina\" konponduta dagoenean - Egina + Egina Bideoak segundu %d @@ -565,9 +557,9 @@ %s bilaketaren erantzunak erakusten Ilaran jarri da Jarri ilaran - Zerbitzuen jatorrizko testuak transmisioko elementuetan ikusgai egongo dira + Zerbitzuen jatorrizko testuak igorpenaren elementuetan ikusgai egongo dira Erakutsi «orain dela» jatorrizko denbora elementuetan - Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz + Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz. Androidek miniaturako kolore nagusiaren arabera jakinarazpenaren kolorea pertsonalizatzea baimendu (kontuan izan ez dagoela gailu guztietan erabilgarri) Koloreztatu jakinarazpena Erabili miniatura blokeo pantaila eta jakinarazpenentzako @@ -576,7 +568,7 @@ Bideo hash jakinarazpena Hash-a kalkulatzen Azkenak - Desgaitu jario sortzailearen informazio gehigarria, jarioaren edukia edo bilaketa eskaera duten informazio koadroak ezkutatzeko + Desgaitu igorpen-sortzailearen informazio gehigarria, igorpenaren edukia edo bilaketa-eskaera duten metadatuen informazio-koadroak ezkutatzeko Erakutsi meta informazioa Ez dago zure gailuan hau ireki dezakeen aplikaziorik Kapituluak @@ -588,22 +580,22 @@ Ireki honekin Irratia Nabarmenduak - Eduki hau ordaindu duten erabiltzaileentzat soilik dago eskuragarri, eta NewPipe-k ezin du tramsmititu edo deskargatu. - Bideo hau YouTube Music Premium kideentzako soilik eskuragarri dago, eta NewPipe-k ezin du transmititu edo deskargatu. - Eduki hau pribatua da, eta NewPipe-k ezin du transmititu edo deskargatu. - Hau SoundCloud Go+ pista bat da, zure herrialdean gutxienez, eta NewPipe-k ezin du transmititu edo deskargatu. + Eduki hau ordaindu duten erabiltzaileentzat soilik dago erabilgarri, eta NewPipe-k ezin du igorri edo deskargatu. + Bideo hau YouTube Music Premium kideentzako soilik erabilgarri dago, eta NewPipe-k ezin du igorri edo deskargatu. + Eduki hau pribatua da, eta NewPipe-k ezin du igorri edo deskargatu. + Hau SoundCloud Go+ zerbitzuko pista bat da, zure herrialdean behintzat, eta NewPipe-k ezin du igorri edo deskargatu. Eduki hau ez dago eskuragarri zure herrialdean. Aplikazioa kraskatu Ebatzi Bideo hau adinez mugatua dago. -\nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideo hauek atzitu eta ezin ditu erreproduzitu. +\nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideoen igorpen hauek atzitu eta erreproduzitu. Deskarga hasi da Behean gaueko gai gogokoena hauta dezakezu Hautatu zure gaueko gai gogokoena — %s Automatikoa (gailuaren gaia) - Gau Gaia + Gauaren gaia kanalaren xehetasunak erakutsi - Desaktibatu hedabideen tunela bideo-erreprodukzioan pantaila beltz bat edo totelka ari bada + Desgaitu edukien tunela bideo-erreprodukzioan pantaila beltza badago edo bideoa totelka ari bada. Hedabideen tunela desaktibatu Itzalita Piztuta @@ -629,10 +621,8 @@ 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 Barnekoa Zerrendatu gabea Ostalaria @@ -660,14 +650,14 @@ Ez hasi bideoak mini erreproduzitzailean eta hasi bideoak pantaila osoan zuzenean, auto biraketa blokeatuta badago. Mini erreproduzitzailea erabili dezakezu pantaila osotik irtetzean Hasi erreproduzitzaile nagusia pantaila osoan Isatsari bideo hau erantsita - Gehitu bideo hau isatsari + Gehitu jarraian Erakutsi \"Itxi erreproduzigailua\" Prozesatzen... Itxoin mesedez Erroreen txostenen jakinarazpena Jakinarazpenak erroreen berri emateko NewPipe-k errore bat aurkitu du, sakatu berri emateko Errore bat gertatu da, ikusi jakinarazpena - Bilatu eguneraketak + Bilatu eguneraketak Bilatu bertsio berriak eskuz Elementu berriak jarioan Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. @@ -680,42 +670,160 @@ Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du Erakutsi errore barra bat Sortu errore jakinarazpen bat - Konfiguratu uneko erreprodukzioaren jakinarazpenak + Konfiguratu unean erreproduzitzen ari den igorpenaren jakinarazpena Jakinarazpenak Erreproduzigailuaren jakinarazpenak - Jario berriak - Egiaztatu jario berriak - Jario berrien jakinarazpenak + Igorpen berriak + Bilatu igorpen berriak + Igorpen berrien jakinarazpenak Edozein sare Jakinarazpenak desgaituta daude 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 + Harpidetzen igorpen berriei buruz jakinarazi Ezabatu deskargatutako fitxategi guztiak biltegitik\? - Harpidetzentzako jario berrien jakinarazpenak - Jarioaren xehetasunak kargatzen… + Harpidetzen igorpen berrien jakinarazpenak + Igorpenaren xehetasunak kargatzen… - jario berri %s - %s jario berri + igorpen berri %s + %s igorpen berri LeakCanary ez dago eskuragarri Egiaztapen maiztasuna Jakinarazi ExoPlayer lehenetsia - Beharrezko sare konexioa + Beharrezko sareko konexioa Portzentaia Semitonoa Erreprodukzioaren kargatze-tartearen tamaina - Deskargatzaileak onartzen ez dituen jarioak ez dira erakusten - Hautatutako jarioa ez dago kanpoko erreproduzigailu batengatik onartuta - Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen audio jariorik - Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik + Deskargatzaileak onartzen ez dituen igorpenak ez dira erakusten + Hautatutako igorpena ez dute kanpoko erreproduzitzaileek onartzen + Ez dato erabilgarri audio-igorpenik kanpoko erreproduzitzaileentzat + Ez dago erabilgarri bideo-igorpenik kanpoko erreproduzitzaileentzat 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 + Arazoren bat baduzu aplikazioa erabiltzerakoan, irakur itzazu ohiko galdera hauen erantzunak! + Betiko miniatura kendu + NewPipe-en azken bertsioa erabiltzen ari zara + Sakatu %s deskargatzeko + Kopia %d aldiz gehitu da + Txartela + Aukera hau Gaiarako %s aukeratua badago soilik dago erabilgarri + Ordenatu + Modu azkarra + Hiru-puntutako menutik harpidetzak inportatu edo esportatu + Maiz galdetutako galderak + Ezikusi hardware multimedia botoien gertaerak + Erabilgarria, adibidez, botoi fisiko hautsiak dituen entzungailua erabiltzen ari bazara + Kendu bikoiztuak + Kendu bikoiztuak\? + Igorpen bikoiztu guztiak kendu nahi dituzu zerrenda honetatik? + Erakutsi hurrengo igorpenak + Erakutsi/Ezkutatu igorpenak + Partzialki ikusita + Guztiz ikusia + Laster agertzeko + Harpidedunak + Ezezaguna + Bolumena + Erabili ExoPlayer-en deskodetzailearen ordezko eginbidea + Bat ere ez + Metadatuak kargatzen… + Kudeatu ExoPlayer-en ezarpen batzuk. Aldaketa hauek eragina izan dezaten, erreproduzitzailea berrabiarazi behar da + Fitxa nagusien kokapena + Lortu kanalaren fitxak + Abatarrak + Gaitu aukera hau deskodetzailea hasieratzeko arazoak badituzu, hala nola, lehentasun gutxiago duen deskodetzailetara igarotzea deskodetzaile nagusiaren hasieratzeak huts egiten badu. Aukera honek erreprodukzioak kalitate urria izatea ekar dezake, deskodetzaile nagusiak erabiltzean ez bezala + Eskuineko keinuaren ekintza + Erabili beti ExoPlayer-en bideo-irteeraren interfazeko ezarpenaren konponbidea + Hurrengo igorpena + Edukien tunela desgaitu da lehenespenez gailuan, gailuaren modeloak ez du onartzen eta. + Azpikanalen abatarrak + Audio-pista bat egon behar da igorpen honetan jada + Hautatu jatorrizko audioaren pista hizkuntza zein den kontuan hartu gabe + Hautatu kanpoko erreproduzitzailearen audio-pista + Lortuko diren fitxak jarioa eguneratzean. Aukera honek ez du eraginik kanal bat modu azkarra erabiliz eguneratzen bada. + Hautatu ikusmen-urritasuna dutenentzako azalpenak dituzten audio-pista bat erabilgarri badago + Ezkerreko keinuaren ekintza + Hobetsi audio deskribatzailea + Igotako abatarrak + Aldatu eduki progresiboen kargatze-tartearen tamaina (oraingoa: %s). Balio baxu batek hasierako kargatzea bizkortu dezake + Hobetsi jatorrizko audioa + Audioa: %s + Bannerrak + Aukeratu erreproduzigailuaren pantailaren eskuin erdiaren keinua + Mugitu fitxa-hautatzaile nagusia azpira + Audio-pista + Zuzeneko igorpenik ez + Miniaturak + ExoPlayer-en ezarpenak + Distira + Igorpenik ez + Aurreko igorpena + Aukeratu erreproduzitzailearen pantailaren ezker erdiaren keinua + Zuzenekoa + deskriptiboa + %1$s %2$s + Honi buruz + Ez + Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Lehen hiru ekintzak (erreproduzitu/pausatu, aurrekoa eta hurrengoa) sistemarengatik ezarrita daude eta ezin dira pertsonalizatu. + Atzera egin + Irudiaren kalitatea + Partekatu erreprodukzio-zerrenda xehetasunekin, esate baterako, erreprodukzio-zerrendaren izena eta bideo-izenburuak edo bideo-URLen zerrenda soil gisa + Aukera gehiago + Iraupena + Aurrera egin + jatorrizkoa + \? + Inportatzen den esportazioko ezarpenek NewPipe 0.27.0 geroztik zaharkituta zegoen formatu ahula erabiltzen dute. Ziurtatu inportatzen ari den esportazioa iturri fidagarri batekoa dela, eta etorkizunean NewPipe 0.27.0 edo berriagoa den esportazioak soilik erabili. Formatu ahul honetan ezarpenak inportatzeko euskarria erabat kenduko da laster, eta NewPipe-ren bertsio zaharrek ezin izango dituzte bertsio berrietatik esportazioen ezarpenak inportatu. + - %1$s: %2$s + %1$s +\n%2$s + Bai + Babeskopia eta berrezarpena + NewPipe-k bertsio berriak bilatu ditzake eta eskuragarri daudenean jakinarazi. +\nHau gaitu nahi duzu? + Berrezarri ezarpenak + Berrezarri ezarpen guztiak lehenetsitako baliotara + Ezarpenak berrezartzeak zure ezarpen gogokoenak baztertzen ditu eta aplikazioa berrabiarazten du. +\n +\nAurrera egin nahi duzu? + Ez dago nahikoa lekurik gailuan + Konponbide honek azal aldaketa bat gertatzean bideo kodekak askatu eta berrezartzen ditu, azalaren kodeka zuzenean ezarri ordez. ExoPlayer-ek dagoeneko erabiltzen du arazoak dituzten gailu batzuetan. Ezarpen honek Android 6 eta berriagotan funtzionatzen du soilik +\n +\nAukera hau gaitzeak erreprodukzio erroreak saihestu ditzake bideo-erreproduktorea aldatzean edo pantaila osoan jartzean + bikoiztua + Bideoak + Pistak + Shorts + Kanalak + Erreprodukzio-zerrendak + Albumak + Kanalaren fitxak + Ze fitxa erakusten diren kanal-orrietan + Ireki erreprodukzio-ilara + Aldatu pantaila osora + Aldatu pantailaren orientazioa + Erreproduzitu + Berriro erreproduzitu + Aukeratu irudien kalitatea eta irudiak kargatu nahi dituzun ala ez, datuen eta memoriaren erabilera murrizteko. Aldaketek memoriako zein diskoko irudien cachea garbitzen dute — %s + Ez kargatu irudiak + Kalitate baxua + Kalitate ertaina + Kalitate altua + Partekatu erreprodukzio-zerrenda + Erakutsi gehiago + Partekatu tituluekin + Partekatu URL zerrenda + + erantzun %s + %s erantzun + + Erakutsi gutxiago + bigarren mailako \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 123c3b2014b..3f8a28c765a 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -46,12 +46,11 @@ خطا خطای شبکه نمی‌توان تمام بندانگشتی‌ها را بار کرد - نمی‌توان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد نمی‌توان پایگاه وب را تجزیه کرد محتوا در دسترس نیست نمی‌توان فهرست بارگیری را برپا ساخت ببخشید! نباید این اتّفاق زخ می‌داد. - این خطا را با رایانامه گزارش کنید + گزارش با رایانامه ببخشید، چیزی به درستی پیش نرفت. گزارش اطّلاعات: @@ -96,7 +95,6 @@ تنها برخی دستگاه‌ها توانایی پخش ویدیوهای 2K و 4K را دارند قالب ویدیویی پیش‌گزیده سیاه - بار کردن بندانگشتی‌ها قرار دادن خودکار جریان بعدی در صف پیشنهادهای جستجو گزینش پیشنهادها برای نمایش هنگام جست‌وجو @@ -154,17 +152,17 @@ M B - ۱ مشترک + %s مشترک %s مشترک بدون بازدید - ۱ بازدید + %s بازدید %s بازدید بدون ویدیو - ۱ ویدیو + %s ویدیو %s ویدیو ایجاد @@ -176,7 +174,6 @@ نویسه جایگزین حروف و اعداد مهم‌ترین نویسه‌های خاص - کاره‌ای برای پخش این پرونده نصب نشده است درباره نیوپایپ درباره و سوالات‌متداول پروانه‌ها @@ -271,7 +268,6 @@ پخش ادامه یابد ذخیره محلی نتایج جستجو صف پخش در حال پایان (بدون تکرار) را با افزودن یک جریان مرتبط ادامه دهید - برای پیش‌گیری از بار کردن بندانگشتی‌ها و ذخیرهٔ داده و فضای ذخیره، خاموش کنید. تغییرات، انبارهٔ تصاویر روی حافظه و دیسک را پاک می‌کند ادامه پخش بازگرداندن آخرین موقعیت پخش موقعیت در فهرست‌ها @@ -281,10 +277,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - کنترل اشاره ای صدا - از اشارات برای کنترل حجم صدا استفاده شود - کنترل روشنایی اشاره ای - از اشارات برای کنترل روشنایی استفاده شود بازگردانی چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: چالش ری‌کپچا @@ -392,7 +384,7 @@ ناتوانی در بازنویسی پرونده یک بارگیری دیگر با همین نام در صف قرار دارد نیوپایپ در خلال کار روی پرونده، بسته شد - فضایی روی دستگاه باقی نمانده است + فضایی روی دستگاه باقی نمانده است پیشرفت کار متوفق شد زیرا پرونده پاک شده است پایان زمان اتصال می‌خواهید تاریخچه بارگیری را پاک کنید یا همه پرونده‌هایی که بارگیری شده‌اند؟ @@ -437,7 +429,7 @@ جدید می‌خواهید این گروه را پاک کنید؟ - ۱ مورد گزیده + %d مورد گزیده %d مورد گزیده پردازش خوراک… @@ -445,19 +437,19 @@ بارگیری نشده: %d آخرین به‌روزرسانی خوراک: %s - ۱ روز + %d روز %d روز - ۱ ساعت + %d ساعت %d ساعت - ۱ دقیقه + %d دقیقه %d دقیقه - ۱ ثانیه + %d ثانیه %d ثانیه بله، و ویدیوهای ناقص دیده شده @@ -479,17 +471,17 @@ محلی با آغاز دوبارهٔ کاره، زبان تغییر خواهد کرد کیوسک پیش‌فرض - انجام شد + انجام شد وقتی انجام شد، «Done» یا «انجام شد» را بفشارید ∞ ویدیو بیش از ۱۰۰ ویدیو - ۱ شنونده + %s شنونده %s شنونده کسی در حال شنیدن نیست - ۱ بیننده + %s بیننده %s بیننده کسی در حال مشاهده نیست @@ -549,7 +541,7 @@ بُرزنی تکرار می‌توانید تا سه کنش را برای نمایش در آگاهی فشرده برگزینید! - هر کنش آگاهی را با لمس کردنش ویرایش کنید. با استفاده از جعبه‌های تیک، تا سه کنش را برای نمایش در آگاهی فشرده بگزینید + هر کنش آگاهی را با لمس کردنش ویرایش کنید. با استفاده از جعبه‌های تیک، تا سه کنش را برای نمایش در آگاهی فشرده بگزینید. پنجمین دکمه کنشی چهارمین دکمه کنشی سومین دکمه کنشی @@ -560,7 +552,6 @@ کیفیت پایین (کوچک‌تر) کیفیت بالا (بزرگ‌تر) نظرها از کار افتاده‌اند - نمایش موارد دیده‌شده خطا در بار کردن خوراک از کار انداختن تونل‌زنی رسانه نمایش جزییات کانال @@ -575,7 +566,6 @@ حالت رایانک گشودن پایگاه وب حساب از بین رفت - نشانی بندانگشتی کرانهٔ عمر موارد مرتبط نمایش شرح @@ -630,7 +620,7 @@ این محتوا فقط برای کاربرانی که پول داده‌اند در دسترس است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود. زمینهٔ شب محبوبتان را برگزینید — %s در زیر می‌توانید زمینهٔ شب محبوبتان را برگزینید - اگر هنگام پخش ویدیو با صفحهٔ سیاه یا وقفه مواجه شدید، تونل‌زنی رسانه را از کار بیندازید + اگر هنگام پخش ویدیو با صفحهٔ سیاه یا وقفه مواجه شدید، تونل‌زنی رسانه را از کار بیندازید. اکنون می‌توانید متن درون شرخ را برگزینید. به یاد داشته باشید که در حالت گزینش، ممکن است صفحه چشمک زده و پیوندها قابل کلیک نباشند. هنوز شاخهٔ بارگیری‌ای تنظیم نشده. اکنون شاخهٔ بارگیری پیش‌گزیده را برگزینید برای ذخیرهٔ هر بارگیری از شما پرسیده خواهد شد @@ -662,7 +652,7 @@ بعدی در صف گذاشته شد در صف گذاشتن بعدی در حال پردازش… ممکن است کمی طول بکشد - بررسی به‌روز رسانی‌ها + بررسی به‌روز رسانی‌ها بررسی دستی برای نگارش‌های جدید بررسی کردن به‌روز رسانی‌ها… موارد خوراک جدید @@ -681,7 +671,6 @@ خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده لیک‌کاناری موجود نیست - تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند پیش‌گزیدهٔ اگزوپلیر آگاهی‌ها بار کردن جزییات جریان… @@ -691,7 +680,7 @@ تغییر وضعیت همه جریان‌های جدید - ۱ جریان جدید + %s جریان جدید %s جریان جدید پیکربندی آگاهی جریان در حال پخش کنونی @@ -715,9 +704,6 @@ قالب ناشناخته کیفیت ناشناخته اندازهٔ دورهٔ بار کردن پخش - نمایش موارد آینده - نهفتن موارد آینده - نهفتن موارد دیده شده سوالات متداول اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید! نمایش در وبسایت @@ -726,4 +712,56 @@ حالت سریع ضربه برای بارگیری %s از جدیدترین نگارش نیوپایپ استفاده می‌کنید + این گزینه تنها هنگامی موجود است که %s به عنوان زمینه گزیده باشد + کارت + شکست در رونوشت به تخته‌گیره + ناتنظیم بندانگشتی ثابت + چشم‌پوشی از رخدادهای دکمهٔ رسانهٔ سخت‌افزاری + برداشتن تکراری‌ها + برداشتن تکراری‌ها؟ + نمایش یا نهفتن جریان‌ها + نمایش جریان‌های زیر + پیش رو + کامل دیده شده + نیمه دیده شده + بدون جریان + صدا: %s + پیشروی + تنظیمات اگزوپلیر + جریان بعدی + ناشناخته + اصلی + دوبله + کوتاه‌ها + زنده + تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد + بار کردن فراداده… + قطعهٔ صوتی + بله + نه + روشنایی + حجم صدا + هیچ‌کدام + فضای آزاد ناکافی روی افزاره + بندانگشتی‌ها + چهرک‌ها + بیرق‌ها + مشترکان + مشروح + ویدیوها + قطعه‌ها + کانال‌ها + سیاهه‌های پخش + آلبوم‌ها + درباره + پخش + بازپخش + %1$s%2$s + زبانهٔ کانال‌ها + تغییر حالت تمام‌صفحه + جریان پیشین + گزینه‌های بیش‌تر + مدّت + پسروی + ؟ \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b0e6b2abab0..7af526fb6ec 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -82,13 +82,12 @@ Virhe Verkkovirhe Kaikkia esikatselukuvia ei voitu ladata - Videon URL-allekirjoituksen salausta ei voitu purkaa Verkkosivua ei voitu jäsentää Sisältö ei ole saatavilla Latausvalikkoa ei voitu asettaa Sovellus/UI kaatui Pahoittelut, noin ei olisi pitänyt käydä. - Raportoi tämä virhe sähköpostin kautta + Raportoi sähköpostin kautta Pahoittelut, jokin meni vikaan. Raportti Mitä tapahtui: @@ -146,7 +145,7 @@ Suurin osa erikoismerkeistä Tietoja NewPipe Kolmannen osapuolen Lisenssit - Tietoja + Tietoja & UKK Lisenssit Vapaata ja kevyttä suoratoistoa Androidilla. Näytä GitHub:ssa @@ -196,8 +195,6 @@ Lisää soittolistaan Käytä nopeampaa epätarkkaa pikakelausta Epätarkka kelaus mahdollistaa videon kelauksen nopeammin huonommalla tarkkuudella. Kelaaminen 5, 15 tai 25 sekunnin hyppäyksin ei toimi tämän kanssa - Lataa esikatselukuvat - Poista käytöstä estääksesi esikatselukuvien lataus. Tämä säästää dataa ja vähentää muistin käyttöä. Asetuksen muuttaminen poistaa muistissa ja levyllä olevan kuvavälimuistin Kuvavälimuisti tyhjennetty Poista tallennettu metatieto Poista kaikki tallennettu sivutieto @@ -240,7 +237,6 @@ Hylkää Nimeä uudelleen 1 poistettu. - Ohjelmaa tämän toistamiseen ei ole asennettu NewPipen tietosuojakäytäntö NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi. \nNewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä. @@ -344,7 +340,7 @@ Kieli vaihtuu, kun sovellus uudelleenkäynnistetään Kommentteja ei voitu ladata Mitkä välilehdet näytetään pääsivulla - Valmis + Valmis Paina ”Valmis”, kun ratkaistu ∞ videota 100+ videota @@ -392,10 +388,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\? @@ -489,7 +481,7 @@ Tätä latausta ei voi palauttaa Yhteys aikakatkaistiin Eteneminen menetettiin, koska tiedosto poistettiin - Laitteella ei ole tilaa + Laitteella ei ole tilaa NewPipe suljettiin, kun se käsitteli tiedostoa Jälkikäsittely epäonnistui Ei löytynyt @@ -552,14 +544,14 @@ Sekoita Toista uudelleen Voit valita enintään kolme toimintoa ilmoituksessa näytettäväksi! - Muokkaa ilmoitustoimintoja näpäyttämällä niitä. Valitse ilmoituksessa näytettäväksi enintään kolme käyttämällä oikealla olevia valintaruutuja + Muokkaa ilmoitustoimintoja näpäyttämällä niitä. Valitse ilmoituksessa näytettäväksi enintään kolme käyttämällä oikealla olevia valintaruutuja. Viides toimintopainike Neljäs toimintopainike Kolmas toimintopainike Toinen toimintopainike Ensimmäinen toimintopainike - Skaalaa ilmoituksessa näytettävä videon esikatselukuva kuvasuhteesta 16:9 kuvasuhteeseen 1:1 (saattaa aiheuttaa vääristymiä) - Skaalaa esikatselukuva 1:1-kuvasuhteeseen + Rajaa ilmoituksessa näytettävä videon esikatselukuva kuvasuhteesta 16:9 kuvasuhteeseen 1:1 + Rajaa esikatselukuva 1:1-kuvasuhteeseen Näytä muistivuodot Lisätty jonoon Lisää jonoon @@ -602,12 +594,11 @@ Tämä video on ikärajoitettu. \nYouTuben uusien ikärajoitusperiaatteiden mukaisesti NewPipella ei ole pääsyä videoon eikä sitä voida toistaa. Yöteema - Pienoiskuvakkeen osoite Poista käytöstä tekstinvalinta kuvauskentän sisältä Voit nyt valita tekstin kuvauskentän sisältä. Huomioithan, että valintatilan aikana sivu voi vilkkua ja linkit eivät ehkä ole klikattavia. %s tuo tämän syyn: Säätövivun kuvakkeen esikatselu - Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa + Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa. Poista median tunnelointi käytöstä Nopea syötetila ei tarjoa enempää tietoa tästä. \'Storage Access Framework\' on tuettu vain Android 10:stä alkaen @@ -630,7 +621,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\? @@ -662,7 +652,7 @@ Poistettu %1$s latausta Käsitellään… Voi kestää hetken - Tarkista päivitykset + Tarkista päivitykset Tarkista manuaalisesti onko uusia versioita saatavilla Tarkistetaan päivityksiä… Ilmoitukset, joilla raportoidaan virheistä @@ -677,9 +667,147 @@ Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. \nAsenna tiedostonhallintaohjelma, joka on yhteensopiva Storage Access Frameworkin kanssa. Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. -\nAsenna tiedostonhallintaohjelma tai kokeile asettaa \'%s\' pois käytöstä latausasetuksista. +\nAsenna tiedostonhallintaohjelma tai kokeile asettaa \'%s\' pois käytöstä latausasetuksista Näytä soitinta käytettäessä soittimen kaatamisen vaihtoehto Näytä virheen ponnahdusilmoitus Uudet syötteet Ilmoitukset + Käytä aina ExoPlayerin videolähtöpinnan asetusta + kuvaileva + dubattu + %1$s %2$s + alkuperäinen + Soittimen ilmoitus + Määritä toistettavan lähetysvirran ilmoitus + Vasemman eleen toiminto + Valitse soitinnäytön oikean puoliskon ele + Oikean eleen toiminto + Kirkkaus + Äänenvoimakkuus + Ei mitään + Toiston latausvälin koko + Ohita laitteiston mediapainikkeiden tapahtumat + Suosi alkuperäistä ääntä + Valitse alkuperäinen ääniraita kielestä riippumatta + Suosi kuvailutulkkausta + Valitse näkövammaisille tarkoitetun kuvailutulkkauksen sisältävä ääniraita, mikäli saatavilla + Valitse soitinnäytön vasemman puoliskon ele + Uusia lähetysvirtoja + Muuta progressiivisen sisällön latausvälin kokoa (tällä hetkellä %s). Pienempi arvo saattaa nopeuttaa ensimmäistä latausta. + Tästä on hyötyä esim. silloin, jos käyttämiesi kuulokkeiden fyysiset painikkeet eivät toimi. + Kuvanlaatu + Ulkoisille soittimille ei ole saatavilla videostriimiä + Videot + Tuo tai vie tilauksia kolmen pisteen valikosta + Tilaajat + Osittain katsottu + Nopea tila + Näytä seuraavat streamit + Tuntematon + Ilmoitukset uusista streameista + Mitä välilehtiä kanavasivuilla näytetään + Poistetaanko kaksoiskappaleet\? + Näytä/piilota streamit + Jaa URL-luettelo + + %s uusi streami + %s uudet streamit + + Jaa otsikoiden kanssa + Poista kaksoiskappaleet + Shortsit + Harmaana näkyvät soittolistat sisältävät jo tämän kohteen. + Käytä ExoPlayerin dekooderin varatoimintoa + Ilmoitukset on poistettu käytöstä + Tuleva + Ladataan Metadata… + Lataa %s napauttamalla + , + Vaihda näytön suuntaa + Hallitse joitain ExoPlayer-asetuksia. Nämä muutokset edellyttävät soittimen uudelleenkäynnistystä tullakseen voimaan + Kopio lisätty %d kertaa + Heikkolaatu + Päävälilehtien sijainti + Jos sinulla on ongelmia sovelluksen käytössä, muista katsoa nämä vastaukset yleisiin kysymyksiin! + Koko näyttö päälle/pois + Tuntematon laatu + Vaadittu verkkoyhteys + Suorita uusien streamien tarkistaminen + Hae kanavavälilehdet + Usein Kysytyt Kysymykset + Käytät uusinta NewPipen versiota + Avatarit + Ota tämä vaihtoehto käyttöön, jos sinulla on dekooderin alustusongelmia, jotka liittyvät alemman prioriteetin dekooderiin, jos ensisijaisen dekooderin alustus epäonnistuu. Tämä voi heikentää toiston suorituskykyä kuin käytettäessä ensisijaisia dekoodeja + Seuraava stream + Mediatunnelointi oli oletuksena poistettu käytöstä laitteessasi, koska laitemallisi ei tue sitä. + Alikanavan avatarit + Katso verkkosivuilla + Tämä vaihtoehto on käytettävissä vain, jos %s on valittu teemaksi + Tässä streamissa pitäisi jo olla ääniraita + Avaa soittojono + Älä lataa kuvia + Ilmoita tilausten uusista streameista + Korkealaatu + Valitse laatu ulkoisille soittimille + Tietoja + Jaa soittolista + Eteenpäin + Valitse ääniraita ulkoisille soittimille + Tuntematon muoto + Albumit + Ulkoisille soittimille ei ole saatavilla äänistreameja + Kelaa taaksepäin + Noudettavat välilehdet syötettä päivitettäessä. Tällä valinnalla ei ole vaikutusta, jos kanava päivitetään käyttämällä nopeaa tilaa. + Poistetaanko kaikki ladatut tiedostot levyltä\? + Jaa soittolista, jossa on tietoja, kuten soittolistan nimi ja videon nimi, tai yksinkertainen luettelo videoiden URL-osoitteista + Keskilaatu + Lataajan avatarit + Prosentti + Audio: %s + Ulkoiset soittimet eivät tue valittua suoratoistoa + Ilmoitukset uusista tilausten striimeistä + Bannerit + Soittolistat + Järjestä + Siirrä päävälilehden valitsin alas + Mikä tahansa verkko + ExoPlayer oletusarvo + Ääniraita + Kortti + Ei live streamejä + Kopioiminen leikepöydälle epäonnistui + Poista pysyvä pikkukuva + Valitse kuvien laatu ja lataako kuvia ollenkaan, jotta tiedon- ja muistin käyttö vähenee. Muutokset tyhjentävät sekä muistin että levyn kuvavälimuistin – %s + Toista + Lisää vaihtoehtoja + Pikkukuvat + Ladataan streamin tietoja… + ExoPlayerin asetukset + Täysin katsottu + Kesto + Ei streamejä + Kanavat + Olet nyt tilannut tämän kanavan + Edellinen stream + Live + Haluatko poistaa kaikki ylimääräiset identtiset suoratoistot tästä soittolistasta\? + Suoratoistot, joita lataaja ei vielä tue, ei näytetä + + %s vastaus + %s vastausta + + Näytä lisää + Näytä vähemmän + Kanavan välilehdet + Kyllä + Ei + Kaikkien asetusten nollaaminen hävittää kaikki valitsemasi asetukset ja käynnistää sovelluksen uudelleen. +\n +\nOletko varma, että haluat jatkaa? + Varmuuskopiointi ja palauttaminen + Nollaa asetukset + Palauta kaikki asetukset oletusarvoihin + NewPipe voi automaattisesti tarkistaa päivitysten saatavuuden silloin tällöin ja ilmoittaa kun niitä on saatavilla. +\nHaluatko ottaa tämän käyttöön? + Laitteella ei ole riittävästi vapaata tilaa \ 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 b1529c7f7aa..00ce782576b 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -1,6 +1,6 @@ - Pindutin ang magnifying glass upang magsimula. + Pindutin ang magnifying glass para magsimula. Inilathala noong %1$s Walang nakitang stream player. I-install ang VLC\? Walang nakitang stream player (pwede mong i-install ang VLC para ma-play ito). @@ -16,20 +16,20 @@ \"%1$s\" ba ang tinutukoy mo\? Ibahagi sa Gumamit ng ibang video player - Natatanggal ang tunog sa ilang mga resolusyon + Nawawala ang tunog sa ilang resolusyon Gumamit ng ibang audio player Sumubaybay - Sinusubaybayan - Ihinto ang pagsubaybay + Sumusubaybay + Tumigil sa pagsubaybay Hininto ang pagsubaybay sa channel Hindi mabago ang pagsubaybay Hindi ma-update ang pagsubaybay Ipakita ang impormasyon Mga Pagsubaybay - Mga naka-bookmark na playlist + Nakabookmark na Playlists Pumili ng Tab Anong Bago - Background + Likuran Palutangin Idagdag Sa Folder ng mga na-download na video @@ -47,9 +47,7 @@ Ipakita ang \"I-play gamit Kodi\" 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 + 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 Piliin ang mga mungkahing ipapakita habang naghahanap Patayin para itago ang paglalarawan ng video at karagdagang impormasyon I-edit ang bawat action sa abiso sa baba sa pamamagitan ng pagpindot sa mga ito. Pumili ng hanggang tatlong ipapakita sa siksik na abiso gamit ang mga checkbox sa kanan @@ -58,7 +56,7 @@ Tema Lokal na mungkahi Remote na mungkahi - Markahan bilang napanood + Markahan bilang napanood na Kusang ipila Ulitin Halo-halo @@ -71,7 +69,6 @@ Kumpirmahin muna bago linisin ang pila Maaaring mapalitan ang pila mo kung magpapalit ka ng player Papalitan ang aktibong pila sa player - I-load ang mga thumbnail Ipakita ang paglalarawan Ipakita ang meta info Patayin para itago ang mga meta infobox na may karagdagang impormasyon tungkol sa creator ng stream, laman nito o ng hinanap @@ -79,7 +76,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 +86,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 @@ -104,7 +97,7 @@ Tandaan ang mga property ng popup Panimulang linaw ng popup Mape-play lang ng ilang device ang mga video na 2K/4K - I-install ang nawawalang Kore app\? + I-install ang nawawalang Kode app\? I-scale ang thumbnail sa 1:1 aspect ratio I-scale ang thumbnail ng video sa abiso mula 16:9 papuntang 1:1 aspect ratio (pwedeng magkaroon ng distortion) Unang action button @@ -164,7 +157,6 @@ Lisensya Wika Pribado - URL ng Thumbnail Hindi nakalista Nakapatay Bago at patok @@ -259,4 +251,15 @@ Hangganan ng Edad Oo, pati na rin ang mga napanood nang video Kusa (tema ng device) + Tanggalin ang kabuuan ng watch history? + Walang mga stream na maaaring i-download + I-import o i-export ang mga subskripsyon galing sa 3-dot menu + Impormasyon: + Paumanhin, hindi dapat iyon nangyari. + Paumanhin, mayroon nagkamali. + Hindi maisaayos ang download menu + Ang search history ay tinanggal + Walang nanonood + Wala dito + Walang folder na ganoon \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d9cfaa8e966..4eb45b683f1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -51,9 +51,8 @@ Afficher le contenu avec limite d’âge En direct Impossible de charger toutes les miniatures - Impossible de déchiffrer la signature URL de la vidéo Désolé, cela n’aurait pas dû se produire. - Signaler cette erreur par courriel + Signaler par courriel Information : Ce qui s’est passé : Votre commentaire (en anglais) : @@ -244,8 +243,6 @@ Zoomer Utiliser la recherche rapide approximative Permet au lecteur d’accéder plus rapidement à une position au détriment de la précision. Se déplacer de 5, 15 ou 25 secondes est impossible avec cette option - Charger les miniatures - Désactivez pour empêcher le chargement des miniatures afin de réduire l’utilisation de la bande passante et de la mémoire. La modification de cette option vide le cache en mémoire vive et sur le disque Images en cache effacées Effacer les métadonnées en cache Efface toutes les données des pages Web en cache @@ -257,7 +254,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 @@ -302,7 +299,6 @@ Sous-titres Modifier la taille du texte et les styles d’arrière-plan des sous-titres du lecteur. Le redémarrage de l’application est requis pour appliquer les changements Ton - Aucune application installée pour lire ce fichier Effacer l’historique des vues Supprime l’historique des flux lus et des positions de reprise de lecture Voulez-vous supprimer entièrement l’historique des vues \? @@ -338,10 +334,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 @@ -403,7 +395,7 @@ impossible d’écraser le fichier Il y a un téléchargement en attente avec ce nom NewPipe a été fermé alors qu’il travaillait sur le fichier - Aucun espace disponible sur l’appareil + Aucun espace disponible sur l’appareil Progression perdue car le fichier a été supprimé Voulez-vous effacer l’historique de téléchargement ou supprimer tous les fichiers téléchargés \? Limiter la file d’attente de téléchargement @@ -459,7 +451,7 @@ Langue de l’application Prédéfini par le système Appuyez sur « Terminé » une fois résolu - Terminé + Terminé Vidéos En raison des contraintes d’ExoPlayer, le pas de déplacement a été réglée à %d secondes Couper le son @@ -555,9 +547,9 @@ Jamais Uniquement en Wi-Fi Démarrer la lecture automatiquement — %s - Liste de lecture + File 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 @@ -565,7 +557,7 @@ Lire aléatoirement Répéter Vous pouvez sélectionner au maximum trois actions à faire figurer dans la notification compacte ! - Modifiez chaque action de notification ci-dessous en appuyant dessus. Sélectionnez jusqu’à trois d’entre elles pour les faire apparaitre dans la notification compacte en utilisant les cases à cocher à droite + Modifiez chaque action de notification ci-dessous en appuyant dessus. Sélectionnez jusqu’à trois d’entre elles pour les faire apparaître dans la notification compacte en utilisant les cases à cocher à droite. Cinquième bouton d’action Quatrième bouton d’action Troisième bouton d’action @@ -608,14 +600,14 @@ 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 Vous pouvez sélectionner votre thème de nuit favori ci-dessous Le téléchargement a démarré Afficher les détails de la chaîne - Désactivez la tunnelisation multimédia si vous constatez un écran noir ou un bégaiement lors de la lecture d’une vidéo + Désactivez la tunnelisation multimédia si vous constatez un écran noir ou un bégaiement lors de la lecture d’une vidéo. Désactiver la tunnelisation média Désactiver la sélection de texte dans la description Permettre la sélection de texte dans la description @@ -623,7 +615,6 @@ Privé Non répertorié Public - URL de la miniature Hôte Support Langue @@ -643,7 +634,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 \? @@ -667,8 +657,8 @@ 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 @@ -678,7 +668,7 @@ Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… - Vérifier les mises à jours + Vérifier les mises à jour Nouveaux éléments du flux Faire planter le lecteur Afficher « Faire planter le lecteur » @@ -695,7 +685,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 @@ -722,17 +711,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 ! @@ -741,4 +727,118 @@ Importer ou exporter des abonnements à partir du menu Vous utilisez la dernière version de NewPipe Appuyez pour télécharger %s + Échec de la copie dans le presse-papiers + 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, 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 \? + Afficher les flux suivants + Entièrement vu + Partiellement vu + À venir + 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 + %1$s %2$s + original + doublée + descriptif + Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. +\n +\nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran + Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible + Sélectionner la piste audio pour les lecteurs externes + Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires + Déplacer le sélecteur d\'onglet principal en bas + Position des onglets principaux + La tunnelisation multimédia a été désactivée par défaut sur votre appareil car votre modèle d\'appareil est connu pour ne pas la supporter. + Aucun flux + Aucun direct + Qualité de l’image + Vidéos + Onglets de chaîne + Chargement des métadonnées … + Basse qualité + Avatars + Flux suivant + Ne pas charger d’images + Haute qualité + À propos + Albums + Qualité moyenne + Bannières + Listes de lecture + Plus d’options + Miniatures + Pistes + Durée + Chaînes + Flux précédent + Direct + \? + Abonnés + Shorts + Onglets de chaîne à récupérer + Onglets à récupérer lors de la mise à jour du flux. Cette option n’a aucun effet si une chaîne est mise à jour en utilisant le mode rapide. + Partager une liste d\'URLs + %1$s +\n%2$s + Partager la liste de lecture + - %1$s : %2$s + Choisir quels onglets seront visibles sur les pages de chaîne + Changer l’orientation de l’écran + Basculer en plein écran + Partager avec les noms + Avatars de sous-chaîne + Ouvrir la file de lecture + Avancer + Rembobiner + Rejouer + Partager la liste de lecture avec des détails tel que son nom et le titre de ses vidéos ou simplement la liste des URLs des vidéos + Avatars du téléverseur + Sélectionnez la qualité des images et si les images doivent être chargées, pour réduire l\'utilisation de la mémoire et de données. Les modifications vident à la fois le cache des images en mémoire et sur le disque — %s + Lire + + %s réponse + %s réponses + %s réponses + + Modifiez chaque action de notification ci-dessous en appuyant dessus. Les trois premières actions (lire/pause, précédent, suivant) sont définies par le système et ne peuvent pas être personnalisées. + Afficher plus + Afficher moins + Réinitialiser tous les paramètres à leurs valeurs par défaut + Non + La réinitialisation de tous les paramètres va supprimer toutes vos préférences de paramètres et redémarrer l\'application. +\n +\nÊtes-vous sûr de vouloir poursuivre ? + Sauvegarde et restauration + Oui + NewPipe peut automatiquement vérifier la disponibilité de nouvelles versions de temps en temps et vous notifier lorsqu\'elles sont disponibles. +\nVoulez-vous activer cette vérification ? + Réinitialiser les paramètres + Pas assez d\'espace disponible sur l\'appareil + Les paramètres de l\'export en cours d\'importation utilisent un format vulnérable qui a été déprécié depuis NewPipe 0.27.0. Assurez-vous que l\'export en cours d\'importation provient d\'une source fiable. Privilégiez les exports obtenues à partir de NewPipe 0.27.0 ou des versions plus récentes à l\'avenir. Le support pour l\'importation des paramètres dans ce format vulnérable sera bientôt complètement supprimé et les anciennes versions de NewPipe ne pourront plus importer les paramètres des exports des nouvelles versions. \ No newline at end of file diff --git a/app/src/main/res/values-frc/strings.xml b/app/src/main/res/values-frc/strings.xml new file mode 100644 index 00000000000..5b919711cc6 --- /dev/null +++ b/app/src/main/res/values-frc/strings.xml @@ -0,0 +1,20 @@ + + + aucun streamer trouvé . Installez VLC? + non + ouvrir dans le browser + ouvrir dans le popup mode + ouvrir avec + partagez + installer le fichier stream + chercher + parameters + installer + Installer + marquer comme vu + "publié le %1$s" + aucun joueur de stream n\'est trouvé ( vous pouvez installez VLC pour jouer) + Annuler + OK + Oui + \ 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 fcabbd95bde..5a9f4daceca 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -55,10 +55,8 @@ Lembrar o tamaño e a posición anteriores do «popup» Usar un salto inexacto mais inexacto A busca inexacta permite ao reprodutor procurar posicións máis rápidas con precisión reducida. A busca de 5, 15 ou 25 segundos non funciona con isto - Carregar miniaturas - Desactíveo para evitar a carga de miniaturas e poupar datos e memoria. Modificar esta opción limpa a caché de imaxes da memoria e do disco A caché de imaxes foi limpada - Os metadatos da caché foron eliminados + Limpar metadatos da cache Eliminar todos os datos de páxinas en caché Os metadatos da caché foron eliminados Colocar a seguinte emisión na fila automaticamente @@ -125,7 +123,6 @@ Erro Erro de rede Non foi posíbel carregar todas as miniaturas - Non foi posíbel descifrar a asinatura do vídeo Non foi posíbel procesar o sitio web Contido non dispoñíbel Non foi posíbel configurar o menú de descargas @@ -143,7 +140,7 @@ Ocorreu un erro: %1$s Non hai emisións para descargar Deculpe, isto non debería ter acontecido. - Informar deste erro por enderezo electrónico + Informar por correo electrónico Desculpe, algo foi mal. Informe Información: @@ -206,7 +203,6 @@ Carácter de substitución Letras e díxitos A maioría dos caracteres especiais - Non hai ningún aplicativo instalado para reproducir este ficheiro Sobre o NewPipe Licenzas de terceiros © %1$s de %2$s, so %3$s @@ -334,7 +330,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 @@ -344,7 +339,7 @@ NewPipe aínda non é compatible con este contido. \n \nCon toda esperanza será compatible cunha futura versión. - Cres que a carga de alimentación é demasiado lenta\? En caso afirmativo, intente habilitar a carga rápida (pode cambiala na configuración ou premendo o botón a continuación). + Cres que a carga de contidos é demasiado lenta? En caso afirmativo, intente habilitar a carga rápida (pode cambiala na configuración ou premendo o botón a continuación). \n \nNewPipe ofrece dúas estratexias de carga de fontes: \n• Obtendo toda a canle de subscrición, que é lenta pero completa. @@ -424,7 +419,7 @@ Non se pode recuperar esta descarga O tempo de espera da conexión Perdeuse o progreso porque se eliminou o ficheiro - Non queda espazo no dispositivo + Non queda espazo no dispositivo NewPipe pechouse mentres se traballaba no ficheiro Fallou o post-procesamento Non se atopou @@ -455,7 +450,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 @@ -475,7 +469,7 @@ Seleccionar unha lista de reprodución Quiosco predeterminado Que lapelas se amosan na páxina principal - Feito + Feito Prema \"Feito\" cando o resolva Ningún comentario ∞ vídeos @@ -531,8 +525,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 @@ -554,7 +546,6 @@ Interno Privado Público - URL da miniatura Apoio Idioma Límite de idade @@ -597,7 +588,7 @@ Desactíveo para ocultar a descrición do vídeo e a información adicional Ver descrición Pedir confirmación antes de baleirar unha cola - Tema Escuro + Tema escuro Nada Abrir con Non listado @@ -607,7 +598,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 @@ -638,7 +628,7 @@ Miniatura na barra de busca Mostrar indicadores de imaxe - Desactive o túnel multimedia se experimentaren unha pantalla en negro ou interrupcións na reprodución + Desactive o túnel multimedia se experimentar unha pantalla en negro ou interrupcións na reprodución. Desactivar túnel multimedia Engadido á cola Cartafol de descarga aínda non definido, escolla o cartafol agora @@ -650,7 +640,7 @@ A cola de reprodución activa será substituída Cambiar dun reprodutor a outro pode substituír a súa cola Barallar - Edite cada acción da notificación premendo nela. Seleccione ata tres delas para seren mostradas na notificación compacta usando as checkboxes da dereita + Edite cada acción da notificación premendo nela. Seleccione ata tres delas para seren mostradas na notificación compacta usando as checkboxes da dereita. Enfileirar o seguinte vídeo Inciar reprodutor principal en pantalla completa Non iniciar vídeos no reprodutor mini, mais cambiar a pantalla completa directamente, se a rotación estiver bloqueada. Aínda pode acceder o reprodutor mini ao saír da pantalla completa @@ -668,11 +658,10 @@ NewPipe atopou un erro, presione para reportar Comentario fixado Enfileirado - Procurar actualizacións + Procurar actualizacións 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 @@ -714,16 +703,122 @@ 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! Ordenar Modo rápido - Estás executandola última versión de NewPipe + Estás executando a última versión de NewPipe Toca para descargar %s Importa ou exporta subscricións dende o menú dos 3 puntos + Esta opción só está dispoñible se %s está seleccionado para o tema + Produciuse un erro ao copiar no portapapeis + Desactivala miniatura permanente + Tarxeta + As listas de reprodución que se atopan atenuadas xa conteñen este elemento. + Duplicado engadido %d vez/veces + Mostrar/Ocultar emisións + Ignorar eventos con botóns multimedia físicos + Útil, por exemplo, se estiver usando un auricular con botóns rotos + Eliminar duplicados + Eliminar duplicados\? + Desexa eliminar todas as emisións duplicadas nesta lista de reprodución\? + Mostrar os seguintes vídeos + 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 + %1$s %2$s + orixinal + dobrado + descritivo + Altera o tamaño do intervalo de carregamento progresivo (o actual é %s). Un valor menor pode acelerar o carregamento inicial do vídeo + Preferir o audio orixinal + Seleccionar o audio orixinal independentemente do idioma + Seleciona o audio con descrición para persoas con dificuldades de visión, se estar dispoñíbel + Prefirir o audio descritivo + Escolla o xesto para a metade esquerda da pantalla do reprodutor + Mova o selector da lapela principal para a parte inferior + Posición prinicipal das lapelas + A tunelización da multimedia foi deshabilitada por defecto, porque o seu modelo de dispositivo carece de soporte. + Sen emisións + Sen emisións en directo + Miniaturas + Avatares do publicador + Avatares + Vídeos + Alternar a pantalla completa + Alternar a orientación da pantalla + Emisión anterior + Seguinte emisión + Calidade da imaxe + Abrir ringleira de reprodución + Non carregar imaxes + Baixa calidade + Calidade media + Compartillar lista de reprodución + Compartillar os títulos + - %1$s: %2$s + %1$s +\n%2$s + Amosar máis + + %s resposta + %s respostas + + Amosar menos + Edite cada acción de notificación premendo nela. As primeiras tres accións (reproducir/pausar, anterior e seguinte) están definidas polo sistema e non é posíbel personalizalas. + Avatar da subcanle + Subscritores + A cargar metadatos… + Copia de seguranza e restauración + Si + Non + NewPipe pode revisar automaticamente por actualizacións periodicamente e notificalo unha vez estean dispoñíbeis. +\nDesexa habilitar isto? + Restaurar configuracións + Restabelecer todas as configuracións aos seus valores por defecto + Non hai espazo suficiente no dispositivo + Curtos + En directo + Canles + Listas de reprodución + Álbums + Sobre + Lapelas da canle + Reproducir + Reproducir de novo + Máis opcións + Duración + Recuar + Avanzar + Calidade alta + \? + Restablecer todos os axustes rexeitará todas as túas preferencias e reiniciará a aplicación.\n\nQueres continuar? + Recuperar as lapelas da canle + Encabezados + Lapelas a mostrar nas páxinas das canles + Escolla da calidade das imaxes e se cargar as imaxes na súa totalidade, para reducir o uso de datos e memoria. Os cambios limpan a caché das imaxes na memoria e no disco - %s + Compartir a lista de reprodución con detalles como o nome da lista e os títulos dos videos ou como unha lista sinxela cos enlaces URL dos videos + Compartir lista de URLs + A configuración da exportación a ser importada emprega un formato vulnerable que fica obsoleto dende NewPipe 0.27.0. Comprobe que a exportación que está a importar proveña dunha fonte fiable e preferibelmente empregue exportacións de NewPipe 0.27.0 ou posterior. A compatibilidade coa importación deste formato vulnerable será eliminada por completo próximamente e as versión antigas de NewPipe non poderán importar configuracións de exportacións dende novas versións. + Pistas + Lapelas a recuperar ao actualizar o feed. Esta opción non ten efecto se a canle se actualiza no modo rápido. + Esta solución alternativa libera os códecs de video e os re-instancia cando muda a máscara, no canto de configurar a máscara directamente no códec. ExoPlayer xa emprega esta configuración nalgúns dispositivos con este problema e só afecta a Android 6 e versións posteriores.\n\nActivar esta opción pode minimizar erros de reprodución ao mudar o reprodutor de video actual ou mudar ao modo de pantalla completa \ No newline at end of file diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 2b43cbf1481..e910db9cc0d 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -24,7 +24,7 @@ સૂચનામાં 16: 9 થી 1: 1 અસ્પેક્ટ રેશિયોમાં બતાવેલ વિડિઓ થંબનેલને સ્કેલ કરો (વિકૃતિ રજૂ કરી શકે છે) સ્કેલ થંબનેલથી 1: 1 પાસા રેશિયો કોડી મીડિયા સેન્ટર દ્વારા વિડિઓ ચલાવવાનો વિકલ્પ દર્શાવો - અનુપસ્થિત Kore એપ્લિકેશન ઇન્સ્ટોલ કરીએ\? + અનુપસ્થિત Kode એપ્લિકેશન ઇન્સ્ટોલ કરીએ\? ફક્ત થોડા ઉપકરણો 2K / 4K વિડિઓઝ ચલાવી શકે છે ઉચ્ચ રીઝોલ્યુશન બતાવો ડિફોલ્ટ પોપઅપ રીઝોલ્યુશન diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 6d21a5943ed..b7db90a6b4f 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -29,7 +29,7 @@ הצגת רזולוציות גבוהות יותר רק חלק מהמכשירים יכולים לנגן סרטונים ב־2K/4K נגינה ב־Kodi - להתקין את יישומון Kore החסר\? + להתקין את יישומון Kode החסר\? הצגת האפשרות לניגון עם Kodi הצגת אפשרות לנגן סרטון דרך מרכז המדיה Kodi שמע @@ -63,13 +63,12 @@ שגיאה שגיאת רשת אין אפשרות לטעון את כל התמונות הממוזערות - לא ניתן לפענח את חתימת כתובת הסרטון ניתוח האתר לא התאפשר תוכן אינו זמין לא הייתה אפשרות להכין את תפריט ההורדה היישומון או מנשק המשתמש קרסו זה לא אמור היה לקרות, עמך הסליחה. - דיווח על השגיאה דרך דוא״ל + דיווח דרך דוא״ל משהו השתבש, עמך הסליחה. דיווח מידע: @@ -225,7 +224,6 @@ התעלמות שינוי שם פריט אחד נמחק. - לא מותקן יישומון שמתאים לנגינת הקובץ הזה הייצוא הסתיים הייבוא הסתיים אין קובץ ZIP תקין @@ -269,8 +267,6 @@ קצב שימוש בחיפוש מהיר ולא מדויק חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת - טעינת תמונות ממוזערות - כיבוי האפשרות מונע את טעינת התמונות הממוזערות, חוסך בתקשורת נתונים ובניצולת הזיכרון. שינויים באפשרות זו מוחקים את המטמון בזיכרון ובכונן הסרת כל נתוני העמודים שבמטמון הוספת התזרים הבא לרשימת הנגינה אוטומטית להמשיך תור נגינה סופית (בלתי מחזורית) על ידי הוספת תזרים קשור @@ -328,10 +324,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - מחוות בקרת עצמת שמע - שימוש במחוות כדי לשלוט בעצמת השמע של הנגן - מחוות בקרת בהירות - שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים קובץ נמחק התראת עדכון יישומון @@ -409,7 +401,7 @@ לא ניתן לשכתב את הקובץ כבר יש הורדה ממתינה בשם הזה NewPipe נסגר בזמן העבודה על הקובץ - לא נשאר מקום במכשיר + לא נשאר מקום במכשיר התהליך אבד כיוון שהקובץ נמחק החיבור המתין זמן רב מדי למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת\? @@ -464,7 +456,7 @@ שפת היישומון ברירת המחדל של המערכת יש ללחוץ על „סיום” לאחר הפתירה - סיום + סיום סרטונים שנייה אחת @@ -561,7 +553,7 @@ אף פעם לא רק עם רשת אלחוטית להתחיל לנגן אוטומטית — %s - לנגן את התור + תור נגינה לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? סידור אוטומטי בתור התור מהנגן הפעיל יוחלף @@ -572,7 +564,7 @@ ערבוב חזרה ניתן לבחור עד שלוש פעולות בלבד שתופענה בהתראות המצומצמות! - ניתן לערוך כל התראה להלן בלחיצה עליה. מותר לבחור עד שלוש מהן שתופענה בהתראה המצומצמת באמצעות תיבות הסימן שמשמאל + ניתן לערוך כל התראה להלן בלחיצה עליה. מותר לבחור עד שלוש מהן שתופענה בהתראה המצומצמת באמצעות תיבות הסימן שמשמאל. כפתור פעולה חמישי כפתור פעולה רביעי כפתור פעולה שלישי @@ -623,13 +615,12 @@ לפתור ערכת עיצוב לילית להציג את פרטי הערוץ - כדאי להשבית תיעול מדיה אם הופיעה תופעה של מסך שחור או גמגום בנגינת וידאו + כדאי להשבית תיעול מדיה אם הופיעה תופעה של מסך שחור או גמגום בנגינת וידאו. השבתת תיעול מדיה פנימי פרטי לא מופיע ברשימות ציבורי - כתובת תמונה ממוזערת אירוח תמיכה שפה @@ -656,7 +647,6 @@ כבוי פעיל מצב מחשב לוח - הצגת פריטים שנצפו תגובות מושבתות לא להציג איכות נמוכה (קטן יותר) @@ -686,7 +676,7 @@ נוסף כהבא בתור הוספה כהבא בתור מתבצע עיבוד… נא להמתין רגע קט - איתור עדכונים + איתור עדכונים מתבצע איתור עדכונים… לנסות לאתר גרסאות חדשות ידנית פריטים חדשים בהזנה @@ -706,7 +696,6 @@ הערה ננעצה LeakCanary אינה זמינה ברירת מחדל של ExoPlayer - שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית. שינויים דורשים את הפעלת הנגן מחדש התראות על תזרימים חדשים להרשמה תדירות בדיקה נדרש חיבור לרשת @@ -741,9 +730,6 @@ בחירת איכות לנגנים חיצוניים תצורה לא מוכרת גודל משך טעינת נגינה - הצגת פריטים עתידיים - הסתרת פריטים במעקב - הסתרת פריטים עתידיים מיון הצגה באתר תשובות לשאלות נפוצות @@ -752,4 +738,118 @@ נגיעה כאן תוריד את %s מצב מהיר זאת הגרסה העדכנית ביותר של NewPipe + אפשרות זאת זמינה רק אם נבחרה ערכת נושא %s + ביטול הגדרת תמונה ייצוגית קבועה + כרטיס + ההעתקה ללוח הגזירים נכשלה + רשימות הנגינה שבוטלו וסומנו באפור כבר מכילות את הפריט הזה. + הכפיל נוסף %d פעמים + התעלמות מאירועי כפתורי מדיה חומרתיים + שימושי, למשל, אם יש לך אוזניות עם כפתורי חומרה מקולקלים + פעולת מחווה שמאלית + פעולת מחווה ימנית + עוצמת שמע + בלי + להסיר את כל השידורים הכפולים ברשימת הנגינה\? + נצפו חלקית + בקרוב + בהירות + נא לבחור מחווה לחצי השמאלי של מסך הנגן + נא לבחור מחווה לחצי הימני של מסך הנגן + הסרת כפילויות + להסיר כפילויות\? + נצפו במלואם + להציג את השידורים הבאים + להציג/להסתיר שידורים + להעדיף שמע מקורי + לבחור את רצועת השמע המקורית ללא תלות בשפה + להעדיף שמע מפורט + לבחור רצועת שמע עם תיאורים לכבדי ראייה אם ניתן + שמע: %s + רצועת שמע + רצועת שמע כבר אמורה להיות כחלק מהתזרים + לא ידועה + הגדרות ExoPlayer + להשתמש ביכולת הגיבוי של המפענח של ExoPlayer + מקורי + מדובב + בחירת רצועת שמע לנגנים חיצוניים + מפורט + ניהול חלק מהגדרות של ה־ExoPlayer שלך. השינויים האלו דורשים את הפעלת הנגן מחדש כדי להיכנס לתוקף + שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית + יש להפעיל את האפשרות הזאת אם נתקלת בבעיות עם אתחול מפענח, מה שגורם להנחתה למפענחים עם עדיפות נמוכה יותר אם אתחול המפענחים העיקריים נכשל. עלול לגרום לביצועי נגינה נחותים לעומת מפענחים ראשיים + תמיד להשתמש במעקף הגדרות משטח פלט הווידאו של ExoPlayer + המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד +\n +\nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא + מקום לשוניות ראשיות + להעביר את בורר הלשוניות הראשי לתחתית + %1$s %2$s + תיעול מדיה הושבת כברירת מחדל במכשיר שלך כיוון שדגם המכשיר ידוע בכך שאינו תומך בזה. + אין תזרימים חיים + אין תזרימים + סרטונים + מנויים + אין לשוניות מופיעות בעמודי הערוץ + לשוניות ערוץ + Shorts‎ + נתוני העל נטענים… + משיכת לשוניות הערוץ + על אודות + אלבומים + לשוניות למשיכה בעת עדכון ערוץ העדכונים. לאפשרות זו אין השפעה אם הערוץ מתעדכן במצב מהיר. + רשימות נגינה + רצועות + ערוצים + שידור חי + החלפת כיוון מסך + מילוי המסך/רגיל + התזרים הבא + פתיחת תור נגינה + דילוג קדימה + החזרה אחורה + נגינה חוזרת + נגינה + אפשרויות נוספות + משך + התזרים הקודם + איכות תמונה + \? + איכות נמוכה + תמונות ייצוגיות + תמונות ייצוגיות של תת־ערוצים + לא לטעון תמונות + איכות גבוהה + איכות בינונית + תמונות ייצוגיות של מעלים + כרזות + נא לבחור את איכות התמונות והאם בכלל להוריד אותן כדי לחסוך בצריכת נתונים ושימוש בזיכרון. השינויים מפנים הן את מטמון השמירה בזיכרון והן בכונן — %s + תמונות ממוזערות + שיתוף רשימת כתובות + שיתוף עם כותרות + %1$s +\n%2$s + שיתוף רשימת נגינה + שיתוף רשימת נגינה עם פרטים כגון שם רשימת נגינה וכותרות סרטונים או כרשימה פשוטה של כתובות סרטונים + - %1$s: %2$s + להציג עוד + להציג פחות + + תשובה %s + %s תשובות + %s תשובות + + אפשר לערוך כל פעולה בהתראה להלן על ידי נגיעה בה. שלוש הפעולות הראשונות (נגינה/השהיה, הקודם והבא) מוגדרות על ידי המערכת ונעולות לעריכה. + NewPipe יכול לבדוק אוטומטית אם יש גרסאות חדשות מעת לעת ולהודיע כאשר הן זמינות. +\nלהפעיל את היכולת הזאת? + איפוס הגדרות + איפוס כל ההגדרות לערכי ברירת המחדל שלהן + כן + לא + גיבוי ושחזור + איפוס כל ההגדרות ימחק את כל ההגדרות המועדפות שלך ויפעיל את היישומון מחדש. +\n +\nלהמשיך? + אין מספיק מקום פנוי במכשיר + ההגדרות בייצוא המיובא משתמשות בתסדיר פגיע שהוצא משימוש מאז NewPipe 0.27.0. יש לוודא שהייצוא המיובא הוא ממקור מהימן, ועדיף להשתמש רק בייצוא שהושג מ־NewPipe 0.27.0 ומעלה בעתיד. תמיכה בייבוא הגדרות בתסדיר פגיע זה תוסר בקרוב לחלוטין, ואז גרסאות ישנות של NewPipe לא יוכלו לייבא עוד הגדרות של ייצוא מגרסאות חדשות. \ 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 b4f9fadc044..ee8a077ea1d 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,12 +1,12 @@ %1$s पे प्रकाशित हुआ - स्ट्रीमिंग के लिए चालक नहीं मिला। क्या आप VLC इंस्टॉल करना चाहेंगे\? - स्थापित करें + स्ट्रीमिंग के लिए प्लेयर नहीं मिला। क्या आप वीएलसी इंस्टॉल करना चाहेंगे\? + इंस्टॉल करें ब्राउज़र में खोलें पॉपअप मोड में खोलें शेयर करें - डाउनलोड करे + डाउनलोड करें खोजें सेटिंग्स सब्सक्राइब करें @@ -15,133 +15,132 @@ सब्सक्रिप्शनस बैकग्राउंड पॉपअप - ध्वनि + ऑडियो रौशनी काला देखे हुए वीडियोज़ का इतिहास - डाउनलोड करे + डाउनलोड करें वीडियो और ऑडियो इतिहास और कैश बैकग्राउंड में चल रहा है - कोई दर्शक नहीं - कोई वीडियो नहीं है - न्यूपाइप के बारे में जाने + कोई विऊ नहीं + कोई वीडियो नहीं + न्यूपाइप के बारे में जानें तृतीय-पक्ष लाइसेंस ऐप के बारे में और सामान्य प्रश्न लाइसेंस - गिटहब में देखें + गिटहब पर देखें न्यूपाइप का लाइसेंस लाइसेंस पढ़ें योगदान करें इतिहास इतिहास फ़िलहाल चर्चा में है - ऑडियो सेटिंग + ऑडियो सेटिंग्स आरंभ करने के लिए आवर्धक कांच को स्पर्श करें। रद्द करें क्या आप का मतलब \"%1$s\" था\? - के साथ शेयर करे - कोई दूसरा वीडियो चालक प्रयोग करें - कुछ वीडियो गुणवत्ता स्तर पर ध्वनि हट सकती है - कोई दूसरा ध्वनि चालक उपयोग करें + के साथ शेयर करें + बाहरी वीडियो प्लेयर का उपयोग करें + कुछ रिजॉल्युशनों पर ध्वनि हट सकती है + बाहरी ऑडियो प्लेयर का उपयोग करें सब्सक्रिप्शन बदली नहीं जा सकी सब्सक्रिप्शन अपडेट नहीं किया जा सका - देखें कि क्या नया है - वीडियो डाउनलोड का फ़ोल्डर - डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहीत हैं + क्या नया है + वीडियो के लिए डाउनलोड फ़ोल्डर + डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहित होती हैं वीडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें - ध्वनि डाउनलोड फ़ोल्डर - डाउनलोड की गई ध्वनि फ़ाइलें यहां संग्रहीत हैं - ध्वनि फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें - प्रथम स्थापित गुणवत्ता स्तर - पॉपअप का प्रथम स्थापित गुणवत्ता स्तर - उच्च गुणवत्ता स्तर दिखाएं - केवल कुछ ही यंत्र 2K/4K मे वीडियो चला सकते हैं - Kodi मे चलाए - Kore ऐप नहीं मिली, इसे स्थापित करें\? - \"Kodi मे चलाएं\" वाला विकल्प दिखाएँ - कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें - प्रथम स्थापित ध्वनि फॉर्मेट - प्रथम स्थापित वीडियो फॉर्मेट - ऐप थीम + ऑडियो के लिए डाउनलोड फ़ोल्डर + डाउनलोड की गई ऑडियो फ़ाइलें यहां संग्रहित होती हैं + ऑडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें + डिफ़ॉल्ट रिजॉल्युशन + पॉपअप का डिफ़ॉल्ट रिजॉल्युशन + उच्च रिजॉल्युशन दिखाएं + केवल कुछ ही डिवाईस 2K/4K में वीडियो चला सकते हैं + Kodi में चलाएं + गैर- मौजूदा Kore ऐप इंस्टॉल करें\? + \"Kodi में चलाएं\" वाला विकल्प दिखाएँ + Kodi मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें + डिफ़ॉल्ट ऑडियो फॉर्मेट + डिफ़ॉल्ट वीडियो फॉर्मेट + थीम गहरा - वीडियो पॉपअप का आकार और उसकी स्थिति को याद रखें + वीडियो पॉपअप के गुणस्वभाव को याद रखें वीडियो पॉपअप की अंतिम स्थिति और आकार को याद रखें खोज में सुझाव - खोज के दौरान दिखाये जाने वाले सुझाव चुने + खोज के दौरान दिखाये जाने वाले सुझाव चुनें खोज का इतिहास - खोज के डेटा को सिर्फ डिवाइस मेमोरी में रखे + खोज क्वेरीज़ को स्थानीय रूप से संग्रहित करें देखे गए वीडियोज़ की सूची रखें प्लेबैक फिर से शुरू करें - रुकावटें खत्म होने के बाद वीडियो प्ले करें (जैसे - फ़ोन कॉल) - \'अगला\' और \'समान\' वीडियो दिखाए + रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें + \'अगले\' और \'सबंधित\' वीडियो दिखाएं \"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाएं जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं असमर्थित URL - डिफ़ॉल्ट विषय की भाषा + डिफ़ॉल्ट सामग्री की भाषा प्लेयर - चाल चलन + व्यवहार दिखावट - वीडियो पॉपअप के अंदाज में चल रहा + वीडियो पॉपअप के अंदाज में चल रहा है विषयवस्तु आयु प्रतिबंधित सामग्री दिखाएं लाइव - डाउनलोड - डाउनलोड + डाउनलोडस + डाउनलोडस त्रुटी की रिपोर्ट - सारे - बंद करे - साफ़ - बेहतर वीडियो की क्वालिटी - वापस जाएँ - सारे प्ले करे - NewPipe की सूचनापत्र - न्यूपाइप के बैकग्राउंड में चल रहे वीडियो और पॉपअप वीडियो के लिए सूचनापत्र - [नहीं जानते] + सभी + बंद किया + साफ करें + उत्तम रिजॉल्युशन + वापिस + सभी प्ले करें + न्यूपाइप की नोटीफिकेशन + न्यूपाइप के प्लेयर के लिए नोटीफिकेशन + [अज्ञात] त्रुटी नेटवर्क में त्रुटी - सारे thumbnail(फोटो जो फ़ोन की मेमोरी में है ) भरे नहीं जा सकते - वीडियो के URL हस्ताक्षर को डीऑबफस्केट नहीं कर सकते - इस website का निरंक्षण नहीं कर सकते + सभी थंमनेल लोड नहीं किए जा सके + वैबसाइट parse नहीं हो सकी विषय वस्तु उपलब्ध नहीं है - डाउनलोड मेनू को स्थापित नहीं कर सकते - APP/UI टूट गया + डाउनलोड मेनू स्थापित नहीं किया जा सका + APP/UI करैश हो गई इस वीडियो को चलाने में असफल हुए - कभी ठीक न होने वाले वीडियो प्लेयर की त्रुटी आ रही है + अनचाही वीडियो प्लेयर त्रुटी आयी है वीडियो प्लेयर त्रुटी से ठीक हो रहा है - खेद है की, ऐसा होना नहीं चाहिए था. - त्रुटी की रिपोर्ट को ईमेल से भेजे - माफ़ करे , कुछ त्रुटियाँ हो रही है + खेद है, कि ऐसा होना नहीं चाहिए था। + रिपोर्ट को ईमेल से भेजें + माफ़ करें, कुछ त्रुटि हो गई। रिपोर्ट करें जानकारी: क्या हुआ: क्या:\\nअनुरोध:\\nसामग्री भाषा:\\nसामग्री देश:\\nऐप भाषा:\\nसेवा:\\nजीएमटी समय:\\nपैकेज:\\nसंस्करण:\\nOS संस्करण: - आपकी टिप्पणी: + आपकी टिप्पणी(अंग्रेजी में): विवरण: - वीडियो चलाये, समय : - अपलोडर के thumbnail वाले फोटो + वीडियो चलाएं, अवधि : + अपलोडर का अवतार थंमनेल पसंद नापसंद - कोई परिणाम नहीं मिला - यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें + कोई परिणाम नहीं + यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें और प्लेलिसट बनाकर उसमें वीडियो जोड़ें वीडियो ऑडियो - फिर से कोशिश करे + फिर से कोशिश करें हज़ार - करोड़ + मिलियन अरब - कोई सब्सक्राइबर नहीं है + कोई सब्सक्राइबर नहीं %s सब्सक्राइबर - %s सब्सक्राइबर + %s सब्सक्राइबर्स - %s दर्शक - %s दर्शके + %s विऊ + %s विऊज़ %s वीडियो - %s वीडियो + %s वीडियोज़ शुरू रोकें @@ -149,75 +148,75 @@ चेकसम ठीक है फाइल का नाम - मेसेज के thread + थ्रेड्स त्रुटी - न्यूपाइप डाउनलोड हो रहा है - विवरण देखने के लिए दबाये + न्यूपाइप डाउनलोड कर रही है + विवरण के लिए टैप करें कृपया प्रतीक्षा करें… क्लिपबोर्ड पर कॉपी हो गया है - कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुने - पॉपअप के तरीके में खोलने के लिए + कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुनें + पॉपअप मोड में खोलने के लिए \nइस अनुमति की जरुरत है reCAPTCHA चुनौती reCAPTCHA चुनौती का अनुरोध किया डाउनलोड - फाइल के नाम के लिए आवश्यक कैरेक्टर (जैसे - १२३, abc) की अनुमति है - अमान्य कैरेक्टर्स इस संख्या से बदल जायेंगे + फ़ाइल नाम में अनुमत कैरेक्टर + अमान्य कैरेक्टर्स इस संख्या से बदल दिए जायेंगे रिप्लेसमेंट करैक्टर वर्ण और अंक - विशेष कैरेक्टर्स - %2$s के द्वारा © %1$s जो %3$s के अधीन आते है + सबसे विशेष कैरेक्टर्स + %2$s के द्वारा © %1$s जो %3$s के अधीन आते हैं एंड्राइड के लिए हल्का और मुफ्त स्ट्रीमिंग एप्लिकेशन। - अगर आपके पास कोई सुझाव हो जैसे -अनुवाद , डिजाईन में बदलाव ,code को साफ़ रखना , या फिर code में जायदा बदलाव लाना हो तो - साहयता के लिए आपका स्वागत है . जितना ज्यादा होगा उतना बेहतर होगा ! - क्या आप इसको खोज इतिहास के मिटाना चाहते है ? - मुख्य पेज की विषयवस्तु + अगर आपके पास कोई सुझाव हो जैसे कि - अनुवाद करना, डिजाईन में बदलाव करना, कोड को साफ़ रखना, या फिर कोड में जायदा बदलाव लाना हो तो - सहायता के लिए आपका स्वागत है। जितना ज्यादा होगा उतना बेहतर होगा ! + क्या आप इसको खोज इतिहास से मिटाना चाहते हैं \? + मुख्य पृष्ठ की विषयवस्तु खाली पन्ना - kiosk पन्ना - चैनल वाला पन्ना - चैनल को चुने - अभी तक किसी भी चैनल के सदस्य नहीं है - kiosk को चुने - टॉप 50 - नया और प्रचलित - निकाले + कियोस्क पन्ना + चैनल पन्ना + चैनल चुनें + अभी तक किसी चैनल की सब्सक्रिप्शन नहीं है + कियोस्क चुनें + शीर्ष 50 + नए और प्रचलित + निकालें विवरण - जोड़ने के लिए पकड़ें रहे - पृष्टभूमि में चलाना शुरू करे - पॉपअप में चलाना शुरू करे - स्ट्रीमिंग करने के लिए कोई चालक उपलब्ध नहीं है (आप इसे चलाने के लिए VLC चालक स्थापित कर सकते हैं)। + कतार में जोड़ने के लिए दबाकर रखें + बैकग्राउंड में चलाना शुरू करें + पॉपअप में चलाना शुरू करें + स्ट्रीमिंग करने के लिए प्लेयर नहीं मिला (आप इसे चलाने के लिए वीएलसी प्लेयर इंस्टॉल कर सकते हैं)। स्ट्रीम फाइल डाउनलोड करें जानकारी दिखाएं बुकमार्क की गई प्लेलिस्टें में शामिल करें - डिफ़ॉल्ट देश का विषय + सामग्री का डिफ़ॉल्ट देश हमेशा - सिर्फ एक बार के लिए - बैकग्राउंड में स्विच करें - पॉपअप मोड में जाएं + सिर्फ एक बार + बैकग्राउंड मोड में चलाएं + पॉपअप मोड में चलाएं मुख्य पर स्विच करें डेटाबेस आयात करें डेटाबेस निर्यात करें - आपके वर्तमान इतिहास, सब्सक्रिप्शनस, प्लेलिस्ट और (वैकल्पिक रूप से) सेटिंग्स को अधिभावी करेगा + आपके वर्तमान इतिहास, सब्सक्रिप्शनस, प्लेलिस्ट और (वैकल्पिक रूप से) सेटिंग्स को ओवरराइड करता है इतिहास, सब्सक्रिप्शन, प्लेलिस्ट और सेटिंग निर्यात करें - एक्सटर्नल प्लेयर इन प्रकार के लिंक सपोर्ट नहीं करता + बाहरी प्लेयर्स इन प्रकार के लिंक सपोर्ट नहीं करते कोई वीडियो स्ट्रीम नहीं मिला - कोई ऑडियो स्ट्रीम नहीं मिली + कोई ऑडियो स्ट्रीम नहीं मिला फिर से क्रम देने के लिए खींचें बनाइये ख़ारिज करें नाम बदलें दान करें - न्यूपाइप स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय व्यतीत करते हैं। स्वयंसेवको को मदद भेजे, ताकि वह न्यूपाइप को और अच्छा बना सके। + न्यूपाइप स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय इस एप्लिकेशन को देते हैं। स्वयंसेवको को मदद भेजे, ताकि वह न्यूपाइप को और अच्छा बना सके। वापस दें वेबसाइट अधिक जानकारी और खबरों के लिए न्यूपाइप की वेबसाइट पर जाएं। पिछला चलाया गया अधिकतम चलाए गए - निर्यात किए गए - आयातित - कोई मांय ज़िप फ़ाइल नहीं + निर्यात संपन्न हुआ + आयात संपन्न हुआ + कोई वैध ज़िप फ़ाइल नहीं है चेतावनी: सभी फ़ाइलों को आयात नहीं किया जा सका। - यह आपके वर्तमान सेटअप को ओवरराइड करेगा । + यह आपके वर्तमान सेटअप को ओवरराइड कर देगा। ड्रावर खोलें ड्रावर बंद करें वीडियो प्लेयर @@ -230,164 +229,157 @@ नाम बदलें नाम प्लेलिस्ट में जोड़ें - प्लेलिस्ट थंमनेल के रूप में सेट करें + प्लेलिस्ट थंमनेल के रूप में सैंट करें प्लेलिस्ट बुकमार्क करें बुकमार्क हटायें - प्लेलिस्ट को हटाना चाहते हैं\? - सूची बना दी गई + प्लेलिस्ट को मिटाना चाहते हैं\? + प्लेलिस्ट बना दी गई प्लेलिस्ट में जोड़ा गया - प्लेलिस्ट का थंमनेल बदल दिया गया है। - कोई अनुशीर्षक नहीं है + प्लेलिस्ट का थंमनेल बदल दिया गया। + कोई अनुशीर्षक नहीं फिट भरें - ज़ूम करें + ज़ूम डीबग करें - ऑटो-जनरेटेड + अपने-आप बनी हीप डंप करने के दौरान मेमोरी लीक मॉनिटरिंग ऐप को अनुत्तरदायी बना सकता है - Out-of-Lifecycle त्रुटियों की रिपोर्ट करें - थंमनेल लोड करें + चक्र से बाहर त्रुटियों की रिपोर्ट करें तेज और अनिश्चित तलाश का प्रयोग करें - अनिश्चित खोज से प्लेयर में कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता हैं। 5,15 या 25 सेकंड की तलाश में यह काम नहीं करता - थंमनेल लोड करने, डेटा और मेमोरी उपयोग को रोकने के लिए बंद करें। इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को बदलता है + अनिश्चित खोज से प्लेयर कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता है। इससे 5, 15 या 25 सेकंड आगे पीछे लिजाना काम नहीं करता चित्र कैश मिटाया गया कैश मेटाडेटा मिटाएं - कैश किए गए सभी वेबपेज का डेटा हटाएं + वेबपेजों का कैश किया तमाम डेटा हटाएं मेटाडाटा कैश मिटाया गया - अगली स्ट्रीम को अपने आप जोड़े - गैर-दोहराने वाली कतार में अंतिम स्ट्रीम चलाते समय संबंधित स्ट्रीम को स्वतः संलग्न करें + अगली स्ट्रीम को ऑटो-कतारबद्ध करें + खत्म होने वाली पर ना-दोहराने वाली प्लेबैक कतार को संबंधित स्ट्रीम जोड़ते हुए जारी रखें फाइल चेनल्स - सूची - क्स + प्लेलिस्ट + ट्रैकस उपभोगता देखे हुए वीडियो की सूची साफ करें - चलाये गए स्ट्रीम के इतिहास और प्लेबैक स्थानों को साफ करता है - देखे गए सभी का इतिहास साफ करें\? - देखा हुआ इतिहास साफ कर दिया गया - ढूंढने के इतिहास को साफ करें - ढूंढे गए शब्दो का इतिहास साफ करता है - पूरे खोज इतिहास को मिटा दे \? - खोज के इतिहास को साफ कर दिया - एसी कोई भी फ़ोल्डर मौजूद नहीं है + चलाई गए स्ट्रीमों के इतिहास और प्लेबैक स्थानों को मिटाता है + क्या देखा गया सब इतिहास मिटा दिया जाए\? + देखा हुआ इतिहास मिटा दिया गया + खोज इतिहास को साफ करें + खोजे गए शब्दों का इतिहास साफ करता है + पूरे खोज इतिहास को मिटा दें\? + खोज इतिहास मिटाया गया + ऐसा कोई फ़ोल्डर मौजूद नहीं अमान्य फाइल/विषय - वस्तु का स्रोत - फ़ाइल मौजूद नहीं है या उसे पढ़ने या लिखने की पर्याप्त अनुमति नही़ं है + फ़ाइल मौजूद नहीं है या उसे पढ़ने या लिखने की पर्याप्त अनुमति नहीं है फ़ाइल का नाम खाली नहीं हो सकता - एक भूल हुई: %1$s - डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नही है - एक चीज़ साफ कर दी गई। - इस फ़ाइल को चलाने के लिए कोई ऐप स्थापित नही है + एक त्रुटी उत्पन्न हुई: %1$s + डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नहीं है + एक आइटम मिटा दी गई। न्यूपाइप की गोपनीयता नीति - न्यूपाइप परियोजना आपकी गोपनीयता को बहोत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नही करता। -\nन्यूपाइप की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। - गोपनीयता नीति पढ़े - क्या आप सेटिंग्स भी आयात करना चाहते है? - पसंदीदा \'खोलने\' की प्रक्रिया + न्यूपाइप परियोजना आपकी गोपनीयता को बहुत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नहीं करता। +\nन्यूपाइप की गोपनीयता नीति विस्तार से समझाती है कि कौनसा डेटा भेजा और संग्रह किया जाता है जब आप क्रेश विवरण भेजते हैं। + गोपनीयता नीति पढें + क्या आप सेटिंग्स भी आयात करना चाहते हैं\? + \'खोलने\' पर तरजीही एक्शन सामग्री खोलते समय डिफ़ॉल्ट कारवाही — %s अनुशीर्षक - प्लेयर अनुशीर्षक के शब्दों का परिमाण और पृष्ठभूमि शैलियों को बदले। लागू करने के लिए ऐप को पुनः प्रारम्भ करना जरूरी है + प्लेयर कैप्शन टेक्स्ट स्केल और पृष्ठभूमि शैलियों को संशोधित करें। प्रभावी होने के लिए ऐप को पुनरारंभ करना आवश्यक है आयात - से आयात करे + से आयात करें पर निर्यात करे आयात किया जा रहा है… निर्यात किया जा रहा है… - फाइल आयात करे + फाइल आयात करें पहले वाला निर्यात - सब्सक्रिप्शन आयात नही कर सके - सब्सक्रिप्शन निर्यात नही कर सके + सब्सक्रिप्शन आयात नहीं कर सके + सब्सक्रिप्शन निर्यात नहीं कर सके गूगल टेकआउट से यूट्यूब सदस्यता आयात करें: \n -\n1. इस URL पर जाएं:%1$s +\n1. इस यूआरएल पर जाएं: %1$s \n2. पूछे जाने पर लॉग इन करें -\n3. \"सभी डेटा शामिल करें\" पर क्लिक करें, फिर \"सभी को अचयनित करें\" पर, फिर केवल \"सदस्यताएँ\" चुनें और \"ओके\" पर क्लिक करें +\n3. \"सभी डाटा शामिल करें\" पर क्लिक करें, फिर \"सभी को अचयनित करें\" पर, फिर केवल \"सदस्यताएँ\" चुनें और \" ठीक है\" पर क्लिक करें \n4. \"अगला चरण\" पर क्लिक करें और फिर \"निर्यात बनाएं\" \n5. प्रकट होने के बाद \"डाउनलोड\" बटन पर क्लिक करें \n6. नीचे आयात फ़ाइल पर क्लिक करें और डाउनलोड की गई .zip फ़ाइल चुनें -\n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"YouTube और YouTube Music/subscriptions/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई csv फ़ाइल चुनें - आपका आई डी, soundcloud.com/(आपका आई डी) - ध्यान रखे, यह तरीका नेटवर्क साधनो के लिए मंहगा हो सकता है। +\n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"यूट्यूब और यूट्यूब म्युज़िक/सब्सक्रिपशन/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई सीएसवी फ़ाइल चुनें + आपका आईडी, soundcloud.com/(आपका आईडी) + ध्यान रखें, यह तरीका नेटवर्क खर्चीला हो सकता है। \n -\nक्या आप आगे बढ़ना चाहते है? - चलाने की गति के नियंत्रण - गति - ऊंचाई - अनहुक (बिगाड़ सकता है) - खामोशी के समय तेज़ी से आगे बढ़े +\nक्या आप आगे बढ़ना चाहते हैं\? + प्लेबैक स्पीड कंट्रोल + ताल + पिच + अनहुक (आवाज़ में बिगाड़ पड़ सकता है) + खामोशी के समय तेज़ी से आगे बढ़ें कदम - रिसेट - स्वीकारे - अस्वीकार करे + रीसेट करें + स्वीकार करें + अस्वीकार करें असीमित - मोबाइल डेटा उपयोग करते समय रेसॉल्युसेन को सिमित करे - ऐप बदलते समय उसे मिनिमाइज करे - मुख्य वीडियो चालक से दूसरी ऐप पर जाने पर — %s - कोई नही - बैकग्राउंड प्लेयर में बदले - पॉप अप प्लेयर में बदले + मोबाइल डेटा उपयोग करते समय रिजॉल्युशन को सीमित करें + ऐप बदलते समय उसे मिनिमाइज करें + मुख्य वीडियो प्लेयर से दूसरी ऐप पर जाने पर कार्रवाई — %s + कोई नहीं + बैकग्राउंड प्लेयर में बदलें + पॉपअप प्लेयर में बदलें न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। अनसब्सक्राईब करें - टैब चुने - ध्वनि नियंत्रण इशारा + टैब चुनें कतारबद्ध करें - वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे - रोशनी स्तर नियंत्रण के इशारे - वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें - अपडेट + अपडेटस फाइल मिटा दी गयी - ऐप अपडेट अधिसूचना - नए NewPipe अपडेट की सूचनापत्र + ऐप अपडेट नोटीफिकेशन + नए नयूपाईप अपडेट का नोटीफिकेशन एक्सटर्नल स्टोरेज अनुपलब्ध - SD कार्ड पर डाउनलोड करना संभव नहीं।डाउनलोड स्थान पुनः चुने\? - सामान्य चुनाव पर लौटें - क्या आप सामान्य चुनाव पर लौटना चाहते है\? - सब्सक्राइबर स॔ख्या अनुपलब्ध + SD कार्ड पर डाउनलोड करना संभव नहीं। डाउनलोड स्थान पुनः चुनें\? + डिफ़ॉल्टस पुन: स्थापित करें + क्या आप डिफ़ॉल्टस पर लौटना चाहते है\? + सब्सक्राइबर संख्या अनुपलब्ध मुख्य पृष्ठ पर कौन से टैब दिखाए जाते हैं - अपडेट + अपडेटस सूची न्यूपाइप अपडेट उपलब्ध! समाप्त अपूर्ण रोका हुआ कतार में - प्रक्रिया के बाद + पोस्ट-प्रोसेसिंग कार्य सिस्टम द्वारा अस्वीकार डाउनलोड विफल रहा - अनोखा नाम बनाये - ऊपर लिखना + अनोखा नाम बनायें + ओवरराइट करें इस नाम का एक डाउनलोड चालू है - गंतव्य फ़ोल्डर नहीं बनाया जा सकता + डेस्टीनेशन फ़ोल्डर नहीं बनाया जा सकता फ़ाइल नहीं बनाई जा सकती सुूरक्षित कनेक्शन विफल सर्वर नहीं ढूँढ सका सर्वर से जुड़ नहीं सकता सर्वर डेटा नहीं भेजता है नहीं मिला - प्रक्रिया के बाद का कार्य विफल रहा - रुको + पोसट प्रोसेसिंग विफल रही + रोकें अधिकतम पुनर्प्रयास डाउनलोड रद्द करने से पहले प्रयासों की अधिकतम संख्या - मीटर्ड नेटवर्क पर रोके - मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परन्तु कुछ डौन्लोडस रोके नहीं जा सकते है + मीटर्ड नेटवर्क पर रोकें + मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परंतु कुछ डाउन्लोड रोके नहीं जा सकते है घटनायें - सम्मेलनों + कॉन्फ्रेंस टिप्पणियां दिखाएं टिप्पणियां छिपाने के लिए इसे बंद करे - ऑटोप्ले करे + ऑटोप्ले कोई टिपण्णी नहीं - टिप्पणियाँ लोड नहीं कर सका - बंद करे + टिप्पणियाँ लोड नहीं हो पाई + बंद करें प्लेबैक वापस चालू करें आखिरी प्लेबैक पोजिशन पर वापस लौटे सूचियों में स्थान - प्लेबैक पोजिशन के निशान सूचियों में दिखाए + प्लेबैक पोजिशन के निशान सूचियों में दिखाएं डाटा मिटायें प्लेबैक स्थान मिटा दिए गए फाइल की जगह बदली गयी या फिर फाइल मिटा दी गयी इस नाम की कोई फ़ाइल पहले से मौजूद है - इस नाम की एक डाउनलोड की गई फ़ाइल पहले से मौजूद है - फाइल के ऊपर नहीं लिख सकते + इस नाम की डाउनलोड फ़ाइल पहले से मौजूद है + फाइल को ओवरराइट नहीं कर सकते इस नाम का एक डाउनलोड बाकी है - फ़ाइल पर कार्य करते समय NewPipe बंद किया गया - डिवाइस पर जगह समाप्त + फ़ाइल पर कार्य करते समय न्यूपाइप बंद किया गया + डिवाइस पर जगह समाप्त प्रगति खो गई, क्योंकि फ़ाइल मिटा दी गई थी कनेक्शन का समय समाप्त क्या आप अपना डाउनलोड इतिहास मिटाना चाहते हैं या सभी डाउनलोड की गई फ़ाइलों को हटाना चाहते हैं\? @@ -395,38 +387,38 @@ एक ही समय में एक डाउनलोड चलेगा डाउनलोड प्रारंभ करें डाउनलोड रोकें - डाउनलोड कहाँ करने के लिए पूछे + डाउनलोड कहाँ करना है, के लिए पूछें आपको हर डाउनलोड का स्थान पूछा जाएगा \nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (SAF) को सक्षम करें - सिस्टम फोल्डर पिकर (एसएएफ) का प्रयोग करें - प्लेबैक स्थानों को मिटाये - सारे प्लेबैक स्थानों को मिटाये - सारे प्लेबैक स्थानों को मिटाये\? - फ्रेगमेंट या एक्टिविटी लाइफसाइकिल के बाद Rx सन्देश ना पहुँचाया जा सके तोह ज़रूर कोशिश करे - SoundCloud प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: + सिस्टम फोल्डर पिकर (SAF) का प्रयोग करें + प्लेबैक स्थानों को मिटाएं + सारे प्लेबैक स्थानों को मिटाता है + सारे प्लेबैक स्थानों को मिटाएं\? + निपटान के बाद खंड या गतिविधि जीवन चक्र के बाहर अविभाज्य आरएक्स अपवादों की रिपोर्टिंग को बलपूर्वक लागू करें + साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n -\n1. अपने वेब ब्राउज़र मैं \"डेस्कटॉप मोड\" चालू करे (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) -\n2. इस युआरएल को खोले: %1$s -\n3. लोग इन करे -\n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते है उसे कॉपी करे। - यूरोप के जनरल डाटा प्रोटेक्शन रेगुलेशन (जी डी पी आर) का पालन करने के लिए, हम आपका ध्यान न्यूपाइप की नयी प्राइवेसी पालिसी पी डालना चाहते है।इसे बारीकी से पढ़िए। -\nआपको अगर हमें किसी मुसीबत का सन्देश भेजना हो तो इसे स्वीकार करे। - सामान्य टैब्स का इस्तेमाल, सहेजे टैब्स को पढ़ने में रूकावट - जब इस ऐप के लिए अपडेट उपलब्ध हो, अधिसूचना दिखाई जाये +\n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) +\n2. इस युआरएल को खोलें: %1$s +\n3. लॉग इन करें +\n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते हैं उसे कॉपी करें। + यूरोपीय जनरल डेटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का अनुपालन करने के लिए, हम आपका ध्यान न्यूपाइप की गोपनीयता नीति पे डालना चाहते हैं। इसे बारीकी से पढ़िए। +\nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करना होगा। + सहेजे टैब्स को पढ़ने में रूकावट, इसलिए सामान्य टैब्स का इस्तेमाल हो रहा है + जब नई अपडेट उपलब्ध हो, तब एप अपडेट करने के लिए अधिसूचना दिखाई जाये सूचि देखने वाला ढंग ग्रिड ऑटो - मुसीबत दिखाए + त्रुटि दिखाएं सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ - स्टोरेज एक्सेस फ्रेमवर्क (एस ऐ ऍफ़) आपको एस डी कार्ड पर डाउनलोड करने देता है - सेवा चुने, वर्तमान चुनाव : - सामान्य कीओस्क - कोई नहीं देख रहा है + \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है + सेवा चुनें, वर्तमान चुनाव : + डिफ़ॉल्ट कियोस्क + कोई दर्शक नहीं देख रहा - %s आदमी देख रहा है - %s आदमी देख रहे है + %s दर्शक है + %s दर्शक हैं - कोई नहीं सुन रहा है + कोई श्रोता नहीं सुन रहा %s श्रोता %s श्रोता @@ -436,28 +428,28 @@ तेज मोड अक्षम करें क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है\? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)। \n -\nNewPipe दो फीड लोडिंग रणनीति प्रदान करता है: +\nन्यूपाइप दो फीड लोडिंग रणनीति प्रदान करता है: \n• संपूर्ण सदस्यता चैनल प्राप्त करना, जो धीमा है लेकिन पूरा होता है। \n• एक समर्पित सेवा के समापन बिंदु का उपयोग करना, जो तेज़ है लेकिन आमतौर पर पूरा नहीं होता है। \n \nदोनों के बीच अंतर यह है कि तेज वाली रणनीति में आमतौर पर कुछ जानकारी का अभाव होता है, जैसे कि आइटम की अवधि या प्रकार (लाइव वीडियो और सामान्य वीडियो के बीच अंतर पता नहीं लगा सकते हैं) और ऐसा भी हो सकता है कि ये कम आइटम दिखाए। \n -\nYouTube उस सेवा का एक उदाहरण है जो RSS फ़ीड के साथ तेज़ विधि प्रदान करता है। +\nयूट्यूब ऐसी सेवा का एक उदाहरण है जो आरएसएस फ़ीड के साथ ये तेज़ विधि प्रदान करता है। \n \nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी। - यह सामग्री फिलहाल NewPipe सपोर्ट नहीं करता है। + यह सामग्री फिलहाल न्यूपाइप सपोर्ट नहीं करता है। \n -\nइसे आशा से भविष्य के संस्करणों में सपोर्ट किया जायेगा। +\nआशा है कि भविष्य के संस्करणों में सपोर्ट किया जायेगा। चैनल का अवतार थंमनेल %s के द्वारा %s के द्वारा बनाया गया - प्लेलिस्ट पृष्ठ - %s : के लिए परिणाम दिखया जा रहा है - हो गया + प्लेलिस्ट पन्ना + %s : के लिए परिणाम दिखाए जा रहे हैं + संपन्न कलाकार - गाने + गीत कभी नहीं - reCAPTCHA कुकीज़ को साफ़ कर दिए गए हैं + reCAPTCHA कुकीज़ साफ़ कर दिए गए ReCAPTCHA कुकीज़ साफ़ करें एल्बम वीडियो @@ -466,33 +458,33 @@ \nयदि आप इसे देखना चाहते हैं तो सेटिंग में \"%1$s\" चालू करें। यूट्यूब एक \"प्रतिबंधित मोड\" प्रदान करता है जो संभावित रूप से परिपक्व सामग्री को छुपाता है यूट्यूब का \"प्रतिबंधित मोड\" चालू करें - बच्चों के लिए अनुपयुक्त सामग्री दिखाएं क्योंकि इसकी आयु सीमा है (जैसे 18) + वह सामग्री भी दिखाएं जो आयु सीमा की वजह से शायद बच्चों के लिए अनुपयुक्त हो (जैसे 18+) केवल HTTPS यूआरएल ही समर्थित हैं URL की पहचान नहीं हो सकी। दूसरे ऐप से खोलें\? - अपने आप कतार में जोड़े + ऑटो-कतारबद्ध करें कतार को मिटाने से पहले सत्यापन के लिए पूछें - तलाश अवधि फास्ट-फ़ॉरवर्ड /- रिवाइंड करे - एंड्रॉइड को थंमनेल में मुख्य रंग के अनुसार अधिसूचना रंग को अनुकूलित करें (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) - सूचनापत्र को रंगीन करें + फास्ट-फॉरवर्ड/-रिवाइंड सीक अवधि + एंड्रॉइड को थंमनेल में मुख्य रंग के अनुसार नोटीफिकेशन रंग को अनुकूलित करने की अनुमति दें (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) + नोटीफिकेशन को रंगीन करें कुछ नहीं बफरिंग - Shuffle करे + शफल करें दोहराएं - आप संछिप्त सूचनापत्र में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! - नीचे दी गई प्रत्येक अधिसूचना क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कॉम्पैक्ट अधिसूचना में दिखाया जाना है + आप कंपैकट नोटीफिकेशन में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! + नीचे दी गई प्रत्येक नोटीफिकेशन क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कंपैकट नोटीफिकेशन में दिखाया जाना है। पांचवा एक्शन बटन चतुर्थी एक्शन बटन तृतीय एक्शन बटन द्वितीय एक्शन बटन प्रथम एक्शन बटन - नोटिफिकेशन में दिखाए गए वीडियो थंमनेल को 16: 9 के बजाय 1: 1 के अनुपात में दिखाए - थंमनेल को 1:1 के अनुपात में दिखाएं + नोटीफिकेशन में दिखाए गए वीडियो थंमनेल को 16:9 के बजाय 1:1 के अनुपात में दिखाएँ + थंमनेल को 1:1 के अनुपात में करें %d घंटा %d घंटे - %d सेकेड + %d सेकेंड %d सेकंड्स देखे गए वीडियो हटायें\? @@ -504,14 +496,14 @@ केवल वाईफाई पर स्वचालित रूप से प्लेबैक शुरू करें —%s मेमरी लीक दर्शाएँ - मौन हटायें - मौन + अवाज चालू करें + अवाज बंद करें सबसे पसंद किए गए हाल ही में जोड़ा स्थानीय - अभी कोई प्लेलिस्ट का बुक्मार्क नहीं है - प्लेलिस्ट का चयन करें - ∞ विडीओज़ + अभी कोई प्लेलिस्ट बुक्मार्क नहीं की हुई + प्लेलिस्ट चुनें + अनगिनत विडीओज़ 100+ विडीओज़ विवरण संबंधित स्ट्रीमस @@ -519,18 +511,18 @@ कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं। गिटहब पर रिपोर्ट करें अन्य ऐप्स पर प्रदर्शित करने की अनुमति दें - विडीओ हैशिंग की प्रगति की सूचना - वीडियो हैश अधिसूचना - स्ट्रीम निर्माता, स्ट्रीम सामग्री या खोज अनुरोध के बारे में अतिरिक्त जानकारी के साथ मेटा जानकारी बक्से को छिपाने के लिए बंद करें - मेटा जानकारी दिखाएँ + विडीओ हैशिंग की प्रगति का नोटीफिकेशन + वीडियो हैश नोटीफिकेशन + स्ट्रीम निर्माता, स्ट्रीम सामग्री या खोज अनुरोध के बारे में अतिरिक्त जानकारी देते मेटा जानकारी बक्से को छिपाने के लिए बंद करें + मेटा जानकारी दिखाएं वीडियो का विवरण और अतिरिक्त जानकारी छिपाने के लिए इसे बंद करें विवरण दिखाएं - सक्रिय चालक की क़तार बदल दी जाएगी - एक चालक से दूसरे चालक में जाने से आपकी कतार बदल सकती है + सक्रिय प्लेयर की क़तार बदल दी जाएगी + एक प्लेयर से दूसरे प्लेयर में जाने से आपकी कतार बदल सकती है इसमें खोलें थंमनेल दिखाएं - लॉक स्क्रीन और नोटिफिकेशन दोनों के लिए थंमनेल का इस्तेमाल करे - पाठ + लॉक स्क्रीन और नोटिफिकेशन दोनों के लिए थंमनेल का इस्तेमाल करें + चैप्टर आपके डिवाइस का कोई भी ऐप इसे नहीं खोल सकता है यह सामग्री आपके देश में उपलब्ध नहीं है। यह एक साउंडक्लाउड गो+ ट्रैक है, कम से कम आपके देश में, इस कारण इसे न्यूपाइप द्वारा स्ट्रीम या डाउनलोड नहीं किया जा सकता है। @@ -540,36 +532,36 @@ रेडियो ऑटोमैटिक (डिवाइस थीम) अपनी पसंदीदा नाइट थीम चुने — %s - आप अपनी पसंदीदा नाइट थीम नीचे चुन सकते है - डाउलोड शुरू हो गया है + आप अपनी पसंदीदा नाइट थीम नीचे चुन सकते हैं + डाउनलोड शुरू हो गया है यह वीडियो आयु-प्रतिबंधित है। \nयूट्यूब की नई नीतियों के कारण न्यूपाइप किसी भी आयु प्रतिबंधित वीडियो स्ट्रीम का इस्तेमाल नहीं कर सकता है और इस कारण इसे वीडियो को प्ले करने में असमर्थ है। - पियरट्यूब उदाहरण - विशेष रुप से प्रदर्शित + पियरट्यूब इंसटैंस + फीचर्ड रात्रि थीम - हैश की गणना - स्वरूपित रिपोर्ट कॉपी करें - कुकी साफ़ करें जिसे न्यूपाइप आपके द्वारा रीकैप्चा हल करने पर संग्रहीत करता है - उदाहरण पहले से मौजूद है + हैश की गणना कर रहा है + फार्मेट की हूई रिपोर्ट कॉपी करें + कुकी साफ़ करें जिसे न्यूपाइप आपके द्वारा रीकैप्चा हल करने पर संग्रहित करता है + इंसटैंस पहले से मौजूद है इंसटैंस मान्य नहीं किया जा सका इंसटैंस यूआरएल दर्ज करें - उदाहरण जोड़ें + इंसटैंस जोड़ें %s पर अपनी पसंद के इंसटैंस ढूँढ़ें अपने पसंदीदा पीयर ट्यूब इंसटैंस चुनें मुख्य प्लेयर को पूर्ण स्क्रीन में शुरू करें - मिनी प्लेयर में वीडियो शुरू न करें, लेकिन ऑटो रोटेशन लॉक होने पर सीधे फुल स्क्रीन मोड पर जाएं। आप अब भी फ़ुलस्क्रीन से बाहर निकलकर मिनी प्लेयर तक पहुंच सकते हैं + मिनी प्लेयर में वीडियो शुरू न करें, बलकि अगर ऑटो रोटेशन लॉक है तो सीधे फुल स्क्रीन मोड पर चलाएं। आप अब भी फ़ुलस्क्रीन से बाहर निकलकर मिनी प्लेयर तक पहुंच सकते हैं टिप्पणियाँ करना बंद है देखा हुआ चिह्नित करें - चालक सूचनापत्र - सूचनापत्र - चालक असफल हुआ + प्लेयर नोटीफिकेशन + नोटीफिकेशन + प्लेयर क्रैश करें स्थानीय खोज सुझाव सार्वजनिक - अभी चल रही स्ट्रीम अधिसूचना को कॉन्फ़िगर करें + चल रही स्ट्रीम की नोटीफिकेशन को कॉन्फ़िगर करें नई स्ट्रीमें - सब्सक्रिप्शनस के नई स्ट्रीमों के बारे में अधिसूचनाएं - त्रुटि रिपोर्ट अधिसूचना - त्रुटियों की रिपोर्ट करने के लिए अधिसूचनाएं + सब्सक्रिप्शनस की नई स्ट्रीमों के नोटीफिकेशन + त्रुटि रिपोर्ट नोटीफिकेशन + त्रुटियों की रिपोर्ट करने के लिए नोटीफिकेशन न्यूपाइप को एक त्रुटि का सामना करना पड़ा, रिपोर्ट करने के लिए टैप करें हल करें कतारबद्ध करें @@ -587,49 +579,47 @@ नेटवर्क कनेक्शन आवश्यक नई स्ट्रीम अधिसूचनाएं कोई भी नेटवर्क - अपडेट के लिए जाँच करें + अपडेट के लिए जाँच करें निम्न गुणवत्ता (छोटा) सीकबार थंमनेल पूर्वावलोकन उच्च गुणवत्ता (बड़ा) - अपडेट्स के लिए जांच हो रही है… - ठीक हो रहा है + अपडेटस के लिए जांच हो रही है… + पुन: प्राप्ति हो रही डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं\? एंड्रॉइड 10 से शुरू होकर केवल \'स्टोरेज एक्सेस फ्रेमवर्क\' समर्थित है एक इंस्टेंस चुनें हां, और आंशिक रूप से देखे गए वीडियो भी - फीड लोड हो रही है… + फ़ीड लोड हो रही है… फ़ीड अपडेट चरणसीमा - फ़ीड लोड करने में गड़बड़ी - \'%s\' के लिए फ़ीड लोड नहीं कर सका। - रीसैंट + फ़ीड लोड करने में त्रुटि हूई + \'%s\' के लिए फ़ीड लोड नहीं हो सकी। + हाल ही के विवरण में पाठ का चयन सक्षम करें गोपनीयता अब आप विवरण के अंदर पाठ का चयन कर सकते हैं। ध्यान दें कि पृष्ठ झिलमिला सकता है और चयन मोड में लिंक क्लिक करने योग्य नहीं हो सकते हैं। आयु सीमा सहायता होसट - अधिसूचनाएं अक्षम हैं + नोटीफिकेशन अक्षम हैं गैर-सूचीबद्ध - संयुक्त टॉगल करें - सूचना पायें + सबको टॉगल करें + अधिसूचना पायें , - नए संस्करणों के लिए मैन्युअल रूप से जांचें - एकसोप्लेयर की कमी के कारण खोज की अवधि %d सेकंड पर सेट की गई - खाता समाप्त किया गया - स्ट्रीम जो अभी तक डाउनलोडर द्वारा समर्थित नहीं हैं, नहीं दिखाई जाती हैं + नई अपडेट के लिए मैन्युअल रूप से जांचें + एक्सोप्लेयर की बंदिश के कारण सीक करने की अवधि %d सेकंड पर सेट की गई + खाता बंद किया गया + जो स्ट्रीम अभी तक डाउनलोडर द्वारा समर्थित नहीं हैं, वो नहीं दिखाई जाती बाहरी प्लेयरस के लिए क्वालिटी का चयन करें - अज्ञात प्रारूप + अज्ञात फार्मेट अज्ञात क्वालिटी ऐप को क्रैश करें श्रेणी आपसे पूछा जाएगा कि प्रत्येक डाउनलोड को कहां सहेजना है - देखे गए आइटम दिखाएं - थंमनेल यूआरएल ऑफ़ हमेशा अपडेट करें विवरण में पाठ का चयन अक्षम करें मत दिखाओ - दूरस्थ खोज सुझाव + रिमोट खोज सुझाव %s नई स्ट्रीम %s नई स्ट्रीमें @@ -637,8 +627,8 @@ प्रतिशत सैमीटोन - डाउनलोड समाप्त - %s डाउनलोड समाप्त + डाउनलोड संपूर्ण + %s डाउनलोड संपूर्ण %d दिन @@ -646,7 +636,7 @@ %d चयनित - %d चयनित + %d चयनित हुए एक्सोप्लेयर डिफ़ॉल्ट प्लेबैक लोड अंतराल आकार @@ -655,48 +645,45 @@ क्या आप इस समूह को हटाना चाहते हैं\? नया फ़ीड - भविष्य की आइटम दिखाएं - नई फ़ीड आइटम - फ़ीड संसाधित हो रही है … + नये फ़ीड आइटम + फ़ीड प्रोसेस हो रही है … वेबसाइट खोलें उपलब्ध होने पर समर्पित फ़ीड से प्राप्त करें भाषा - आन + ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - देखे गए आइटम छुपाएं - भविष्य की आइटम छुपाएं - बार बार पूछे जाने वाले प्रश्न + अक्सर पूछे जाते प्रश्न वेबसाइट पर देखें आइटम हटाने के लिए स्वाइप करें मीडिया टनलिंग अक्षम करें \"क्रैश द प्लेयर\" दिखाएं - लोड नहीं हुआ: %d + लोड नहीं हुआ: %d %s इसका कारण प्रदान करता है: टैग लाइसेंस यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें! कतार में आगे जोड़ें - लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान आरंभिक वीडियो लोडिंग को गति दे सकता है। परिवर्तन के लिए प्लेयर को पुनः आरंभ करने की आवश्यकता होती है - लीककैनरी उपलब्ध नहीं है - एक त्रुटी हुई है, अधिसूचना देखें - यदि आप काली स्क्रीन या वीडियो प्लेबैक खड़खड़ाते हुए चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें + प्रगतिशील सामग्री पर लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान उनकी आरंभिक लोडिंग को गति दे सकता है + लीक-कैनरी उपलब्ध नहीं है + एक त्रुटी हुई है, नोटीफिकेशन देखें + यदि वीडियो प्लेबैक पर आप काली स्क्रीन या रुक-रुक कर वीडियो चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें। छवियों के शीर्ष पर पिकासो रंगीन रिबन दिखाएँ जो उनके स्रोत को दर्शाता है: नेटवर्क के लिए लाल, डिस्क के लिए नीला और मेमोरी के लिए हरा - गड़बड़ी की सूचना बनाएं + त्रुटी की नोटीफिकेशन बनाएं इस डाउनलोड को पुनर्प्राप्त नहीं किया जा सकता अभी तक कोई डाउनलोड फ़ोल्डर सेट नहीं किया गया है, अब डिफ़ॉल्ट डाउनलोड फ़ोल्डर चुनें हल होने पर \"संपन्न\" दबाएं चैनल विवरण दिखाएं आइटम्स का असल अपलोड समय दिखाएं सेवाओं से मूल पाठ स्ट्रीम आइटम में दिखाई देंगे - प्लेलिस्ट में जोड़े गए पहले और बाद में देखे गए वीडियो हटा दिए जाएंगे। + प्लेलिस्ट में शामिल, पहले और बाद में देखे जा चुके वीडियो हटा दिए जाएंगे। \nक्या यक़ीनन आप ऐसा चाह्ते हैं\? इसे असंपादित नहीं किया जा सकेगा! %d मिनट - %d मिनट + %d मिनट्स - अंतिम अपडेट फ़ीड: %s - कोई सदस्यता चयनित नहीं है + फ़ीड आख़िरी दफा %s को अपडेट हुई + कोई सब्सक्रिप्शन नहीं चुनी हूई केवल असमूहीकृत सब्सक्रिप्शनस दिखाएं फ़ास्ट फ़ीड मोड इस पर अधिक जानकारी प्रदान नहीं करता है। अपडेट अंतराल जब सब्सक्रिप्शन फ़ीड दोबारा अपडेट किये जा सकें — %s @@ -705,25 +692,138 @@ \nक्या आप इस चैनल की सदस्यता समाप्त करना चाहते हैं\? चयनित स्ट्रीम बाहरी प्लेयरस द्वारा समर्थित नहीं है इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। -\nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक स्थापित करें +\nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक इंस्टॉल करें निजी आंतरिक पिन की हुई टिप्पणी निर्माता द्वारा दिया दिल टैबलेट मोड - आपने इस चैनल को अब सब्सक्राइब किया है + आपने इस चैनल को अभी सब्सक्राइब किया है बाहरी प्लेयरस के लिए कोई वीडियो स्ट्रीम उपलब्ध नहीं है बाहरी प्लेयरस के लिए कोई ऑडियो स्ट्रीम उपलब्ध नहीं है - कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में आइटम और अक्सर अधूरी जानकारी (जैसे कोई अवधि नहीं, आइटम प्रकार, कोई लाइव स्थिति नहीं) लौटा सकता है + कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में जानकारी प्रदान कर पाता है और वह भी अक्सर अधूरी जानकारी (जैसे कि अवधि, आइटम की किसम, स्ट्रीम लाइव है, नहीं बता पाता) इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। -\nकृपया फ़ाइल प्रबंधक स्थापित करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें +\nकृपया फ़ाइल प्रबंधक इंस्टॉल करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें
%1$s डाउनलोड हटाए गए - %1$s डाउनलोड हटाए गए + %1$s डाउनलोड्स हटाए गए क्रमबद्ध करें तेज मोड 3-बिंदु वाले मेन्यू से सब्सक्रिप्शनस आयात या निर्यात करें आप न्यूपाइप का नवीनतम संस्करण चला रहे हैं %s डाउनलोड करने के लिए टैप करें + यह विकल्प केवल तभी उपलब्ध होता है जब थीम के लिए %s का चयन किया जाता है + स्थायी थंमनेल अनसैंट करें + कार्ड + क्लिपबोर्ड पर कॉपी करने में विफल + धुंधली की गई प्‍लेलिस्‍ट में पहले से ही यह आइटम है। + डुप्लीकेट जोड़ा गया %d बार + डुप्लीकेट हटाएं + डुप्लीकेट हटाए जाएं\? + क्या आप इस प्लेलिस्ट में मौजूद सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं\? + निम्नलिखित स्ट्रीम दिखाएँ + आगामी + हार्डवेयर मीडिया बटन घटनाओं की अनदेखी करें + उपयोगी है, उदाहरण के लिए, यदि आप टूटे हुए भौतिक बटन वाले हेडसेट का उपयोग कर रहे हैं + स्ट्रीम दिखाएँ / छिपाएँ + पूरा देखा + आंशिक रूप से देखा गया + बाएँ इशारा क्रिया + चमक + आवाज़ + कोई नहीं + प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें + प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें + दाएँ इशारा क्रिया + मूल ऑडियो को प्राथमिकता दें + यदि उपलब्ध हो तो दृष्टिबाधित लोगों के लिए विवरण के साथ एक ऑडियो ट्रैक का चयन करें + वर्णनात्मक ऑडियो को प्राथमिकता दें + भाषा की परवाह किए बिना मूल ऑडियो ट्रैक का चयन करें + ऑडियो: %s + ऑडियो ट्रैक + बाहरी प्लेयर्स के लिए ऑडियो ट्रैक का चयन करें + अज्ञात + एक्सोप्लेयर सेटिंग्स + एक्सोप्लेयर के डिकोडर फॉलबैक फीचर का उपयोग करें + हमेशा एक्सोप्लेयर के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें + मूल + डब की हूई + वर्णनात्मक + एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए + इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती है। इससे प्राथमिक डिकोडर का उपयोग करने की तुलना में खराब प्लेबैक प्रदर्शन हो सकता है + कुछ एक्सोप्लेयर सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए प्लेयर को पुनरारंभ करने की आवश्यकता होती है + सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है +\n +\nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है + मुख्य टैब की स्थिति + मुख्य टैब सिलेक्टर को नीचे ले जाएँ + %1$s %2$s + आपके डिवाइस पर मीडिया टनलिंग डिफ़ॉल्ट रूप से अक्षम कर दी गई थी क्योंकि यह ज्ञात है कि आपका डिवाइस मॉडल इसका समर्थन नहीं करता। + कोई स्ट्रीम नहीं + कोई लाइव स्ट्रीम नहीं + वीडियोज़ + सब्सक्राइबर्स + चैनल पेजों पर कौन से टैब दिखाए जाते हैं + चैनल टैब्स + शॉर्ट्स + मेटाडेटा लोड हो रहा है… + चैनल टैब प्राप्त करें + बारे में + एल्बम्स + फ़ीड अपडेट करते समय प्राप्त करने वाले टैब। यदि किसी चैनल को तेज़ मोड का उपयोग करके अपडेट किया जाता है तो इस विकल्प का कोई प्रभाव नहीं पड़ता है। + प्लेलिस्ट्स + ट्रैक्स + चैनल्स + लाइव + स्क्रीन ओरिएंटेशन टॉगल करें + फ़ुलस्क्रीन टॉगल करें + अगली स्ट्रीम + प्ले कतार खोलें + फॉरवर्ड करें + रिवाइंड करें + पुनः चलाएं + चलाएं + अधिक विकल्प + अवधि + पिछली स्ट्रीम + छवि की गुणवत्ता + \? + कम गुणवत्ता + अवतार + उप-चैनल अवतार + छवियाँ लोड न करें + उच्च गुणवत्ता + मध्यम गुणवत्ता + अपलोडर अवतार + बैनर + डेटा और मेमोरी उपयोग को कम करने के लिए छवियों की गुणवत्ता और छवियों को लोड करना है या नहीं, चुनें। परिवर्तन इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को साफ़ करते हैं - %s + थंमनेल + URL सूची साझा करें + शीर्षकों के साथ साझा करें + %1$s +\n%2$s + प्लेलिस्ट साझा करें + प्लेलिस्ट को प्लेलिस्ट नाम और वीडियो शीर्षक जैसे विवरण के साथ या वीडियो यूआरएल की एक सरल सूची के रूप में साझा करें + - %1$s: %2$s + + %s जवाब + %s जवाब + + और दिखाओ + नीचे दी गई प्रत्येक अधिसूचना कार्रवाई पर टैप करके उसे संपादित करें। पहली तीन क्रियाएँ (चलाएँ/रोकें, पिछली और अगली) सिस्टम द्वारा निर्धारित की जाती हैं और इन्हें अनुकूलित नहीं किया जा सकता है। + कम दिखाएं + न्यूपाइप समय-समय पर स्वचालित रूप से नए संस्करणों की जांच कर सकती है और उपलब्ध होने पर आपको सूचित कर सकती है। +\nक्या आप इसे सक्षम करना चाहते हैं? + सेटिंग्स रीसेट करें + सभी सेटिंग्स को उनके डिफ़ॉल्ट मानों पर रीसेट करें + सभी सेटिंग्स को रीसेट करने से आपकी सभी पसंदीदा सेटिंग्स खारिज हो जाएंगी और ऐप पुनः प्रारंभ हो जाएगा। +\n +\nक्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं? + हाँ + नहीं + डिवाइस पर पर्याप्त खाली स्थान नहीं है + बैकअप और रिस्टोर + आयात किए जा रहे निर्यात में सेटिंग्स एक कमजोर प्रारूप का उपयोग करती हैं जिसे न्यूपाइप 0.27.0 के बाद से हटा दिया गया था। सुनिश्चित करें कि आयात किया जा रहा निर्यात किसी विश्वसनीय स्रोत से है, और भविष्य में केवल न्यूपाइप 0.27.0 या नए से प्राप्त निर्यात का उपयोग करना पसंद करें। इस असुरक्षित प्रारूप में सेटिंग्स आयात करने के लिए समर्थन जल्द ही पूरी तरह से हटा दिया जाएगा, और फिर न्यूपाइप के पुराने संस्करण अब नए संस्करणों से निर्यात की सेटिंग्स आयात नहीं कर पाएंगे। + सेकेंडरी \ 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 bc35866e3e4..419f4619ed6 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -15,7 +15,7 @@ Dijeli s Koristi vanjski video player Uklanja audiosnimku pri nekim rezolucijama - Koristi vanjski audio player + Koristi eksterni audio player Pretplati se Pretplaćeno Pretplata na kanal otkazana @@ -36,7 +36,7 @@ Prikaži veće rezolucije Samo neki uređaji podržavaju reprodukciju 2K/4K videa Reproduciraj s Kodijem - Instalirati nedostajući Kore program\? + Instalirati nedostajuću Kore aplikaciju? Prikaži opciju „Reproduciraj pomoću Kodija” Prikaži opciju za reproduciranje videozapisa putem Kodija Audiosnimka @@ -56,7 +56,7 @@ Prati gledana videa Nastavi reprodukciju Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi) - Preuzmi + Preuzimanje Prikaži videa „Sljedeći” i „Slični” URL nije podržan Zadani jezik sadržaja @@ -69,7 +69,7 @@ Uživo Preuzimanja Preuzimanja - Prijavi grešku + Izvještaj o grešci Sve Isključeno Očisti @@ -77,18 +77,17 @@ Greška Greška u mreži Nije bilo moguće učitati sve sličice - Nije bilo moguće dešifrirati URL potpis videozapisa Nije bilo moguće obraditi stranicu Sadržaj nije dostupan Nije bilo moguće postaviti izbornik za preuzimanje - Program/korisničko sučelje su preknuli raditi + Aplikacija/korisničko sučelje su preknuli raditi Oprosti, ovo se nije trebalo dogoditi. - Prijavi pogrešku putem e-maila + Prijavi putem e-maila Žao nam je, došlo je do neke greške. Prijavi Informacije: Što se dogodilo: - Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik programa:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: + Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: Tvoj komentar (na engleskom): Detalji: Pokreni video, trajanje: @@ -129,7 +128,7 @@ © %1$s od %2$s pod %3$s O aplikaciji i ČPP Licence - Slobodan i mali YouTube program za Android. + Slobodan i mali streaming na Android uređaju. Pogledaj na GitHubu NewPipe licenca Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo! @@ -182,8 +181,8 @@ Novi i popularni Ukloni Detalji - Postavke za audiosnimke - Drži pritisnuto za dodavanje u popis izvođenja + Postavke za audio snimke + Drži pritisnuto za dodavanje u popis [Nepoznato] Doniraj Web-stranica @@ -213,12 +212,11 @@ Ispuni Zumiraj Automatski generirani - Praćenje curenja memorije može uzrokovati greške u radu programa prilikom odlaganje gomile + Praćenje curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile Izvijesti o krajevima životnog ciklusa Prikaži informacije Zabilježene playliste Dodaj u - Učitaj sličice Slikovna predmemorija obrisana Izbriši metapodatke iz predmemorije Kanali @@ -250,7 +248,6 @@ Odbaci Preimenuj 1 stavka izbrisana. - Nijedan program nije instaliran za reprodukciju ove datoteke Vrati Posjeti NewPipe web-stranicu za više informacija i vijesti. NewPipe pravila o privatnosti @@ -305,28 +302,23 @@ Datoteka obrisana Obavijest za nove NewPipe verzije Briše povijest ključnih riječi pretraživanja - Vanjska pohrana nije dostupna + Eksterna memorija nije dostupna Aktualiziranja - Prikaži obavijest i zatraži aktualiziranje programa kad je dostupna nova verzija + Prikaži obavijest za aktualiziranje aplikacije kad je dostupna nova verzija Popis - Popločeno - Dostupna je nova verzija za NewPipe! + Mreža + Dostupna je nova NewPipe verzija! Preuzimanje nije uspjelo Prikaži pogrešku - Isključi za sprečavanje učitavanja sličica, čime se štedi korištenje podataka i memorije. Promjene čiste predmemoriju slika radne memorije i diska Izbriši sve podatke web-stranica iz predmemorije Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis 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 - Preuzimanje na vanjsku SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje\? - Vanjski playeri ne podržavaju ove vrste poveznica + Obavijest o novoj verziji aplikacije + Preuzimanje na eksternu SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje? + Eksterni playeri ne podržavaju ove vrste poveznica Nije pronađen nijedan videozapis Nije pronađena nijedna audiosnimka Nema takve datoteke/izvora sadržaja @@ -336,13 +328,13 @@ Obnovi standardne vrijednosti Želiš li obnoviti standardne vrijednosti\? Broj pretplatnika nije dostupan - NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. + NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem korisničkom iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. Koje su kartice prikazane na glavnoj stranici Konferencije Željena radnja za otvaranje Zadana radnja pri otvaranju sadržaja — %s Titlovi - Promijeni veličinu podnaslova i pozadinske stilove playera. Zahtijeva ponovno pokretanje programa + Promijeni veličinu titlova i stilove pozadine playera. Zahtijeva ponovno pokretanje aplikacije Prisilno izvijesti o neisporučivim Rx iznimaka izvan fragmenta ili životnog ciklusa aktivnosti nakon odlaganja Uvezi SoundCloud profil upisom URL-a ili svog ID-a: \n @@ -353,8 +345,8 @@ Brzina Visina tona Odspoji (može prouzročiti izobličenje) - Smanji prilikom mijenjanje programa - Radnja prilikom prebacivanja na drugi program iz glavnog video playera – %s + Smanji prilikom mijenjanje aplikacije + Radnja prilikom prebacivanja na drugu aplikaciju iz glavnog video playera – %s Smanji na pozadinski player Smanji na skočni player Način prikaza kao popis @@ -364,7 +356,7 @@ pauzirano stavljeno u popis izvođenja naknadna obrada - Popis izvođenja + Dodaj u popis Sustav je odbio radnju Generiraj jedinstveni naziv Prepiši @@ -392,8 +384,8 @@ Nije bilo moguće učitati komentare Zatvori NewPipe je copyleft libre softver: Može se koristiti, proučavati i poboljšavati po volji. Konkretno, može se redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila zaklada Free Software Foundation, pod verzijom 3 licence, ili (po vlastitom izboru) bilo koje kasnije verzije. - Projekt NewPipe ozbiljno shvaća tvou privatnost. Stoga program ne prikuplja nikakve podatke bez tvog pristanka. -\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada programa. + Projekt NewPipe ozbiljno shvaća temu o privatnosti. Stoga aplikacija ne prikuplja podatke bez tvog pristanka. +\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada aplikacije. Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), ovime upozoravamo na NewPipe politiku privatnosti. Pažljivo je pročitaj. \nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti. Nastavi reprodukciju @@ -414,7 +406,7 @@ Izbrisati sve pozicije reprodukcije\? Nitko ne gleda Nitko ne sluša - Jezik će se promijeniti nakon ponovnog pokretanja programa + Jezik će se promijeniti nakon ponovnog pokretanja aplikcije Standardni kiosk Podržani su samo HTTP URL-ovi Lokalni @@ -422,8 +414,8 @@ Automatski generirano (prenositelj nedefiniran) Očisti povijest preuzimanja Izbriši preuzete datoteke - Dopusti prikaz iznad drugih programa - Jezik programa + Dopusti prikaz preko drugih aplikacija + Jezik aplikacije Zadani sustav Videa Isključi zvuk @@ -432,22 +424,22 @@ Želiš li izbrisati ovu grupu\? Nova Uvijek aktualiziraj - Omogući brz način - Onemogući brz način - Memorija uređaja je popunjena + Uključi brzi način + Isključi brzi način + Memorija uređaja je popunjena Najomiljeniji Pritisni „Gotovo” kad je riješeno - Gotovo + Gotovo ∞ videa Više od 100 videa Prijavi grešku na GitHub-u - Umjetnici + Izvođači Albumi Pjesme Stvoren od %s Nikada Ograniči popis preuzimanja - Koristi birač mapa sustava (SAF) + Koristi sustavksi birač mapa (SAF) Ukloni pregledano Ukloni pogledana videa\? @@ -479,12 +471,12 @@ Gumb druge radnje Gumb prve radnje Prikazuju se rezultati za: %s - Nije bilo moguće prepoznati URL. Želiš li otvoriti s drugim programom\? + Nije bilo moguće prepoznati URL. Otvoriti s jednom drugom aplikacijom? Odreži sličicu na omjer 1:1 Učitavanje u predmemoriju Istovremeno se pokreće jedno preuzimanje Dodano u popis izvođenja - Dodaj u popis izvođenja + Dodaj u popis Reproduciraj popis izvođenja Automatski popis izvođenja Popis izvođenja aktivnog playera će se zamijeniti @@ -517,7 +509,7 @@ Da, i djelomično pogledana videa Odaberi jednu instancu Aplikacija će te pitati kamo spremati preuzimanja. -\nOmogući birač mapa sustava (SAF), ako želiš preuzimati na vanjsku SD karticu +\nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu Nije moguće obnoviti ovo preuzimanje Napredak je izgubljen, jer je datoteka izbrisana NewPipe se zatvorio tijekom rada s datotekom @@ -558,7 +550,7 @@ Promiješaj Ponovi Provjeri je li problem već postoji. Prijavljivanje istog već prijavljenog problema krade nam vrijeme koje bismo mogli utrošiti na ispravljanje greške. - Za uređivanje radnji u obavijestima, dodirni ih. Označi do tri radnje za prikaz u kompaktnoj obavijesti koristeći oznake na desnoj strani + Uredi radnje obavijesti dodirom. Označi do tri radnje za prikaz u kompaktnoj obavijesti koristeći potvrdna polja na desnoj strani. Zbog ograničenja ExoPlayera, trajanje premotavanja postavljeno je na %d s Neka Android prilagodi boju obavijesti prema glavnoj boji sličice (ovo nije dostupno na svim uređajima) Oboji obavijest @@ -568,7 +560,7 @@ Koristi sličicu za pozadinu zaključanog ekrana i za obavijesti Prikaži sličicu Prikaži izvorno vrijeme stavki - „Storage Access Framework” omogućuje preuzimanje na SD karticu + „Storage Access Framework” dozvoljava preuzimanje na eksternu SD karticu Izvorni tekstovi usluga bit će vidljivi u stavkama prijenosa Dostupno je u nekim uslugama. Obično je puno brže, ali može dohvatiti ograničenu količinu stavki i često nepotpune podatke (npr. bez trajanja, vrste stavke, bez stanja uživo) Misliš da je učitavanje feeda presporo\? Ako da, pokušaj omogućiti brzo učitavanje (možeš ga promijeniti u postavkama ili pritiskom na donji gumb). @@ -582,14 +574,14 @@ \nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom. \n \nDakle, izbor se svodi na ono što više voliš: brzinu ili precizne informacije. - Izračunavanje šifriranja + Izračunavanje šifre Obavijest šifriranja videa Obavijesti o napretku šifriranja videa Nedavni Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru streama, sadržaju streama ili zahtjevu za pretraživanje Prikaži metapodatke Povezane stavke - Nijedan program na tvom uređaju ovo ne može otvoriti + Nijedna aplikacija na tvom uređaju ovo ne može otvoriti Poglavlja Opis Komentari @@ -609,12 +601,12 @@ Ovaj je video dostupan samo za „YouTube Music Premium” članove, stoga ga NewPipe ne može emitirati ili preuzeti. Ovaj sadržaj je privatan, stoga ga NewPipe ne može emitirati ili preuzeti. Ovaj sadržaj nije dostupan u tvojoj zemlji. - Prekini program + Prekini aplikaciju Riješi - Noćna tema + Tamna tema Prikaži detalje kanala - Isključi tuneliranje medija ako doživiš crni ekran ili isprekidanu reprodukciju videa - Iskljuci medija tuneling + Isključi tuneliranje medija ako doživiš crni ekran ili isprekidanu reprodukciju videa. + Isključi tuneliranje medija Isklj. Uklj. Način rada na tabletu @@ -623,18 +615,16 @@ Privatno Nenavedeno Javno - URL sličice - Poslužitelj + Računalo Podrška Jezik Dobna granica Licenca Oznake Kategorija - Onemogući biranje teksta u opisu + Isključ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\? @@ -647,7 +637,7 @@ Visoka kvaliteta (veća) Pregled sličica premotavanja Mapa za preuzimanje još nije postavljena, odaberi standardnu mapu za preuzimanje - Komentari su onemogućeni + Komentari su isključeni Označi kao pogledano Način rada brzog feeda ne pruža više informacija o ovome. Interno @@ -656,15 +646,15 @@ %s pruža ovaj razlog: Obrada u tijeku … Može malo potrajati Za ukljanjanje stavki povuci ih - Prikazati indikatore slike + Prikaži indikatore slike Preuzimanje je gotovo %s preuzimanja su gotova %s preuzimanja su gotova Pokreni glavni player u cjeloekranskom prikazu - Reproduciraj sljedeći - Sljedeći u popisu izvođenja + Dodaj u popis kao sljedeći + Dodano u popis kao sljedeći Prikaži Picassove vrpce u boji na slikama koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju Izbrisano %1$s preuzimanje @@ -675,7 +665,7 @@ Ručno traži nove verzije Traženje novih verzija … Prijedlozi lokalne pretrage - Traži nove verzije + Traži nove verzije Nemoj pokretati videa u mini playeru, već izravno pokreni cjeloekranski prikaz, ako je automatsko okretanje zaključano. Mini playeru i dalje možeš pristupiti napuštanjem cjeloekranskog prikaza Nove stavke feeda Obavijest o prijavi greške @@ -690,7 +680,7 @@ Novi videozapisi Obavijesti novih streamova od pretplaćenih kanala Želiš li izbrisati sve preuzete datoteke\? - Obavijesti su onemogućene + Obavijesti su isljučene Pretplatio/la si se na ovaj kanal , Uključi/isključi sve @@ -705,16 +695,16 @@ Potrebna mrežna veza Primaj obavijesti Za ovu radnju nije pronađen odgovarajući upravljač datoteka. -\nInstaliraj upravljač datoteka ili pokušaj onemogućiti „%s” u postavkama preuzimanja +\nInstaliraj upravljač datoteka ili pokušaj isključiti „%s” u postavkama preuzimanja
Prikvačeni komentar Prikazuje opciju prekida rada kad se player koristi Prikaži „Prekini rad playera” ExoPlayer standard Posto Poluton - Streamovi koje program za preuzimanje još ne podržava se ne prikazuju - Vanjski playeri ne podržavaju odabrani stream - Promijeni veličinu intervala učitavanja (trenutačno %s). Niža vrijednost može ubrzati početno učitavanje videa. Promjene zahtijevaju ponovno pokretanje playera + Streamovi koje aplikacija za preuzimanje još ne podržava se ne prikazuju + Eksterni playeri ne podržavaju odabrani stream + Promijenite veličinu intervala učitavanja progresivnog sadržaja (trenutno %s). Niža vrijednost može ubrzati učitavanje %s novi stream %s nova streama @@ -723,12 +713,124 @@ Veličina intervala učitavanja reprodukcije Nepoznat format Nepoznata kvaliteta - Nijedan stream audiosnimaka nije dostupan za vanjske playere - Nijedan video stream nije dostupan za vanjske playere - Odaberi kvalitetu za vanjske playere - Prikaži buduće stavke + Nema audio prijenosa za eksterne playere + Nema video prijenosa za eksterne playere + Odaberi kvalitetu za eksterne playere Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka - Sakrij buduće stavke - Sakrij pogledane stavke + Uredite neke ExoPlayer postavke. Ove promjene zahtjevaju ponovo pokretanje aplikacije + Desna gesta + Odaberite gestu za lijevu polovicu zaslona + Lijeva gesta + Svjetlina + ExoPlayer postavke + Uredite svaku radnju obavijesti ispod tako da je dodirnete. Prve tri akcije (reprodukcija/pauza, prethodna i sljedeća) postavlja sustav i ne mogu se prilagoditi. + Odaberite gestu za desnu polovicu zaslona + Glasnoća + Ništa + Pregledano + Djelomično pregledano + Najava + Razvrstaj + Koristi razervnu funkciju ExoPlayer dekodera + Ignoriraj događaje hardverskih medijskih gumba + Korisno, na primjer, ako koristite slušalice s pokvarenim fizičkim gumbima + Odaberite zvučni zapis s opisima za slabovidne osobe ako je dostupan + Preferiraj originalni zvuk + Odaberite izvorni audio zapis bez obzira na jezik + Preferirajte opisni zvuk + Odaberi audio snimku za eksterne playere + Nepoznato + %1$s %2$s + Nema prijenosa + Položaj glavnih kartica + Premjesti glavni birač kartica dolje + Nema prijenosa uživo + Neuspjelo kopiranje u međuspremnik + Često postavljena pitanja + Ako imaš problema s korištenjem aplikacije, pogledaj odgovore na česta pitanja! + Pogledaj na web stranici + Audio snimka: %s + Traka audio snimke + Zasivljene playliste već sadrže ovu stavku. + Poništi stalni prikaz sličica + Duplikat je dodan %d put(a) + Kartica + Koristiš najnoviju NewPipe verziju + Dodirani za preuzimanje %s + Ukloni duplikate + Ukloniti duplikate? + Želiš li ukloniti sve duple prijenose iz ove playliste? + Pokaži sljedeće prijenose + Pokaži/Sakrij prijenose + Kartice za dohvaćanja kanala + Ova je opcija dostupna samo ako je %s odabrano za temu + Minijature + Avatari + Avatari prenositelja + Avatari podkanala + Pretplatnici + Natpisi + Audio zapis bi već trebao biti prisutan u ovom prijenosu + original + Uživo + Videa + Snimke + Kratka videa + sinkronizirano + opisno + Albumi + Kanali + Playliste + Kartice koje se prikazuju na stranici kanala + Uključi/Isključi položaj ekrana + Informacije + Kartice kanala + Uključi cjeloekranski prikaz + Prethodni prijenos + Sljedeći prijenos + Reproduciraj ponovo + Natrag + Naprijed + Kvaliteta slike + Više opcija + Odaberi kvalitetu slika i da li uopće učitati slike kako bi se smanjilo korištenje podataka i memorije. Promjene brišu predmemoriju slika u memoriji i na disku – %s + Ne učitavaj slike + Niska kvaliteta + Srednja kvaliteta + Visoka kvaliteta + \? + Dijeli playlistu s detaljima kao što su ime playliste i naslovi videa ili kao jednostavan popis URL-ova videa + Dijeli s naslovima + Dijeli popis URL-ova + – %1$s: %2$s + Pokaži više + Pokaži manje + Brzi modus + Učitavanje metapodataka … + Trajanje + Uvezi ili izvezi pretplate iz izbornika s 3 točke + Otvori popis reprodukcije + Reproduciraj + Dijeli playlistu + %1$s +\n%2$s + + %s odgovor + %s odgovora + %s odgovora + + Tuneliranje medija je standardno deaktivirano na tvom uređaju jer je poznato da model tvog uređaja to ne podržava. + Da + Ne + Aktiviraj ovu opciju ako imaš problema s inicijaliziranjem dekodera, što vraća dekodere nižeg prioriteta ako inicijaliziranje primarnih dekodera ne uspije. To može rezultirati lošijim performansama reprodukcije u odnosu na korištenje primarnih dekodera + Nedovoljno memorije na uređaju + Spremanje sigurnosne kopije i obnavljanje + NewPipe može automatski tražiti nove verzije i obavijestiti te. +\nŽeliš li aktivirati tu mogućnost? + Obnovi postavke + Obnovi sve postavke na zadane vrijednosti + Obnavljanje svih postavki odbacit će sve tvoje postavljene postavke i aplikacija će se ponovo pokrenuti. +\n +\nStvarno želiš nastaviti? \ 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 8a518bda633..1e0f9c60c92 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -11,18 +11,18 @@ Beállítások Erre gondolt: „%1$s”\? Megosztás ezzel - Videofájlok letöltési mappája + Videófájlok letöltési mappája A letöltött videófájlok itt lesznek tárolva Válasszon letöltési mappát a videófájloknak Alapértelmezett felbontás Lejátszás Kodival - Telepíti a hiányzó Kore alkalmazást\? + Telepíti a hiányzó Kore alkalmazást? A „Lejátszás Kodival” lehetőség megjelenítése A videók Kodi médiaközponttal történő lejátszásának megjelenítése Hang Alapértelmezett hangformátum Letöltés - Nem támogatott URL + Nem támogatott webcím Külső videólejátszó használata Külső hanglejátszó használata Válassza ki a hangfájlok letöltési helyét @@ -51,11 +51,10 @@ 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 Videó Hang @@ -73,7 +72,7 @@ Fájlnév Szálak Hiba - NewPipe letöltés folyamatban + A NewPipe letölt Koppintson a részletekért Kis türelmet… Vágólapra másolva @@ -86,7 +85,7 @@ Újdonságok Háttér Felugró ablak - Nem található lejátszó a közvetítéshez (feltelepítheti a VLC-t a lejátszáshoz). + Nem található lejátszó a közvetítéshez (a lejátszásához telepítheti a VLC-t). Megnyitás felugró módban Néhány felbontásnál eltávolítja a hangot Feliratkozás @@ -95,7 +94,7 @@ Felugró ablak alapértelmezett felbontása Magasabb felbontások megjelenítése Csak bizonyos eszközök tudnak 2K/4K-s videókat lejátszani - Alapértelmezett videoformátum + Alapértelmezett videóformátum Fekete Felugró ablak tulajdonságainak megjegyzése A felugró ablak előző helyének és méretének megjegyzése @@ -109,7 +108,7 @@ Működés Előzmények és gyorsítótár Hibaelhárítás - Lejátszás felugró ablakban + Lejátszás felugró módban Összes Letiltva Törlés @@ -136,9 +135,7 @@ Hozzáadás ehhez Gyorsabb, de pontatlan tekerés használata A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kisebb pontossággal. Az 5, 15, vagy 25 másodperces tekerés nem működik ebben a módban - Bélyegképek betöltése - Kapcsolja ki, hogy a megelőzze a bélyegképek betöltését, így csökkentve az adat- és memóriahasználatot. A megváltoztatása törli a memóriában és a meghajtón lévő képgyorsítótárat - A bélyegkép gyorsítótár törölve + A bélyegkép gyorsítótára törölve Gyorsítótárazott metaadatok törlése Minden gyorsítótárazott weboldaladat törlése A metaadatok gyorsítótára törölve lett @@ -197,10 +194,9 @@ Letöltés Fájlnevekben engedélyezett karakterek Az érvénytelen karakterek erre az értékre lesznek lecserélve - Csere karakter + Cserekarakter Betűk és számok Legtöbb speciális karakter - Nincs a fájl lejátszásához szükséges alkalmazás telepítve A NewPipe névjegye Névjegy és GYIK Licencek @@ -226,11 +222,11 @@ Legtöbbet lejátszott Főoldal tartalma Üres oldal - Újságárus oldal + Kioszk oldal Csatornaoldal Válasszon egy csatornát Még nincs csatornafeliratkozás - Válasszon egy újságárust + Válasszon egy kioszkot Exportálva Importálva Nem érvényes ZIP-fájl @@ -245,7 +241,7 @@ Hangbeállítások Alapértelmezett tevékenység „%s” típusú tartalom megnyitásakor Videólejátszó - Lejátszás háttérben + Háttérbeli lejátszó Felugró ablakos lejátszás Mindig kérdezzen Információk gyűjtése… @@ -285,19 +281,19 @@ \n5. Kattintson a „Letöltés” gombra, amikor megjelenik, \n6. Kattintson a lenti FÁJL IMPORTÁLÁSA gombra, és válassza ki a letöltött ZIP-fájlt \n7. [Ha a ZIP-fájl importálása nem sikerül] Bontsa ki a .csv fájlt (általában: „YouTube és YouTube Music/feliratkozások/feliratkozások.csv\"), majd kattintson lent a FÁJL IMPORTÁLÁSA gombra, és válassza az exportált CSV-fájlt - SoundCloud-profil importálása az URL vagy az azonosítójának begépelésével: + SoundCloud-profil importálása a webcím vagy az azonosítójának begépelésével: \n \n1. A webböngészőben engedélyezze az „asztali módot” (az oldal nem érhető el mobileszközökön) -\n2. Navigáljon erre az URL-re: %1$s +\n2. Navigáljon erre a webcímre: %1$s \n3. Jelentkezzen be, ha kéri -\n4. Másolja ki a profil URL-t, ahova át lett irányítva. +\n4. Másolja ki a profil webcímét, ahova át lett irányítva. saját azonosítója, soundcloud.com/azonosító Ez a művelet adatforgalom-igényes lehet. \n \nBiztos, hogy folytatja\? Ütem Hangmagasság - Előrepörgetés csend alatt + Előretekerés csend alatt Lépés Visszaállítás Elfogadás @@ -333,10 +329,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 @@ -356,7 +348,7 @@ A letöltést nem lehet helyrehozni Kapcsolati időtúllépés Az előrehaladás elveszett, mert a fájlt törölték - Nincs hely az eszközön + Nincs hely az eszközön A NewPipe leállt a fájl feldolgozása közben Utófeldolgozás sikertelen Nincs talalat @@ -394,7 +386,7 @@ Összes lejátszási pozíció törlése Lejátszási pozíciók törlése Találatok a következőre: %s - Bélyegkép méretezése 1:1-es arányra + Bélyegkép 1:1-es képarányra vágása Értesítés színezése Semmi Keverés @@ -402,7 +394,7 @@ Leírás megjelenítése Pufferelés Megnyitás ezzel - Az URL-t nem lehetett felismerni. Megnyitja másik alkalmazással\? + A webcím nem felismerhető. Megnyitja másik alkalmazással? Automatikus sorba állítás Kapcsolja ki, hogy elrejtse a videó leírását és a további információkat Visszaállítja az alapértelmezéseket\? @@ -465,7 +457,7 @@ Feliratkozások kiválasztása © %1$s %2$s, %3$s licenc alatt Harmadik féltől származó licencek - Kész + Kész Nincs megjegyzés ∞ videó 100+ videó @@ -483,7 +475,7 @@ \n \nEngedélyezze a(z) „%1$s” beállítást, ha meg szeretné tekinteni. Gyermekek számára esetlegesen nem megfelelő, korhatáros tartalom megjelenítése (például 18+) - Csak a HTTPS URL-ek támogatottak + Csak a HTTPS webcímek támogatottak Metainformációk megjelenítése A jelenleg aktív lejátszási sor le lesz cserélve Megerősítés kérése a lejátszási sor törlése előtt @@ -531,7 +523,7 @@ Ez a tartalom nem érhető el az országában. Ez a tartalom privát, így nem tekinthető meg és nem tölthető le a NewPipe-pal. A letöltés elkezdődött - Értesítésben megjelenő bélyegkép átméretezése 16:9-es helyett 1:1-es arányra (torzítással járhat) + Az értesítésben megjelenő bélyegkép levágása 16:9-es helyett 1:1-es képarányra Fejezetek Bélyegkép megjelenítése Lejátszás indítása felugró ablakban @@ -545,9 +537,9 @@ A YouTube „Korlátozott módjának” bekapcsolása A példány már létezik A példány érvényesítése nem sikerült - Adja meg a példány URL-ét + Adja meg a példány webcímét Példány hozzáadása - Találjon önnek tetsző példányokat itt: %s + Találjon Önnek tetsző példányokat itt: %s Válassza ki a kedvenc PeerTube példányait PeerTube példányok Életciklusából kifutott hibák jelentése @@ -556,7 +548,7 @@ Fiók megnyitása Csatorna részleteinek megjelenítése Tartsa a sorba állításhoz - Alapértelmezett újságárus + Alapértelmezett kioszk A NewPipe egy copyleft szabad szoftver: tetszése szerint felhasználhatja, tanulmányozhatja, megoszthatja és fejlesztheti. Egész pontosan a Free Software Foundation által kiadott GNU General Public License 3-as, vagy (választható módon) újabb verziójának feltételei szerint módosíthatja vagy adhatja tovább. Megoldás Nyomja meg a „Kész” gombot, ha megoldotta @@ -577,7 +569,7 @@ Feldolgozás… Ez eltarthat egy ideig Az eltávolítás utáni, fragment vagy activity életcikluson kívüli, nem kézbesíthető Rx kivételek jelentésének kényszerítése Eredeti „ennyi ideje” megjelenítése az elemeken - Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor + Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor. Picasso színes szalagok megjelenítése a képek fölött, megjelölve a forrásukat: piros a hálózathoz, kék a lemezhez, zöld a memóriához Minden letöltésnél meg fogja kérdezni, hogy hova mentse el Válasszon egy példányt @@ -612,7 +604,6 @@ Licenc Korhatár Kiszolgáló - Bélyegkép URL Nyilvános Nem listázott Ki @@ -625,12 +616,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 @@ -671,7 +661,7 @@ A „lejátszó összeomlasztása” lehetőség megjelenítése Megjeleníti az összeomlasztási lehetőséget a lejátszó használatakor Hangmagasság megtartása (torzítást okozhat) - Frissítések keresése + Frissítések keresése Ne jelenítse meg Megnézettek eltávolítása Eltávolítja a megnézett videókat\? @@ -682,14 +672,14 @@ Rögzített megjegyzés LeakCanary nem elérhető Lejátszó értesítés - Módosítsa a betöltési intervallum méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a videó kezdeti betöltését. A változtatásokhoz a lejátszó újraindítása szükséges - Az aktuális lejátszás konfigurálása értesítés + 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. + Jelenleg játszott közvetítés értesítésének testreszabása Értesítések Új élő közvetítések Értesítések új élő közvetítésekről a feliratkozott csatornák esetén - Élő közvetítés betöltése.… + Közvetítés részleteinek betöltése.… Keressen új élő közvetítést - Új élő közvetítés értesítések + Új közvetítésértesítések Értesítésen új élő közvetítés esetén a feliratkozott csatornákhoz Ellenőrzési gyakoriság Szükséges hálózati kapcsolat @@ -697,11 +687,11 @@ Törli az összes letöltött fájlt a lemezről\? Értesítsen Értesítéstek kikapcsolva - Lejátszási intervallum mérete + Lejátszás betöltési intervallumának mérete Százaléka %s új elő közvetítés - %s új elő közvetítések + %s új elő közvetítés ExoPlayer alapértelmezett Feliratkoztál erre a csatornára @@ -715,15 +705,125 @@ 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. + %1$s %2$s + szinkronizált + leíró + Hasznos, ha olyan fülhallgatót használ, melyen meghibásodtak a fizikai gombok + Eredeti hang előnyben részesítése + Leíró hanganyag előnyben részesítése + Válasszon gesztust a lejátszóképernyő jobb feléhez + Hang: %s + Hangsáv + Eltávolítja az ismétlődéseket\? + Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? + eredeti + Kezdőlap pozíciója + A médiacsatornázás alapértelmezés szerint le van tiltva az Ön készülékén, mivel az Ön készülékmodellje nem támogatja azt. + Kezdőlapválasztó alulra helyezése + Nincs élő közvetítés + Nincs adatfolyam + Az alábbi értesítési műveletek szerkesztéséhez koppintson rá. Az első három műveletet (lejátszás/szünet, előző és következő) a rendszer állítja be, és nem szabhatók testre. + Csatornalapok lekérése + A hírcsatorna frissítésekor lekérendő lapok. Ennek az opciónak nincs hatása, ha egy csatorna frissítése gyors módban történik. + Miniatűrök + Feltöltő avatarjai + Alcsatorna avatarok + Avatarok + Bannerek + Feliratkozók + Csatornák + Lejátszási listák + Albumok + Névjegy + Csatorna fülek + Milyen lapok jelennek meg a csatornaoldalakon + Lejátszási sor megnyitása + Képernyő tájolásának váltása + Teljes képernyőre váltás + Következő közvetítés + Előző közvetítés + Lejátszás + Visszajátszás + További opciók + Időtartam + Visszatekerés + Előre + Képminőség + Az adat- és memóriahasználat csökkentése érdekében válassza ki a képek minőségét valamint azt, hogy a képek egyáltalán betöltésre kerüljenek. A változtatások törlik a memóriában és a lemezen lévő képgyorsítótárat – %s + Ne töltsön be képeket + Alacsony minőség + Közepes minőség + Magas minőségű + \? + Lejátszási lista megosztása + Lejátszási lista megosztása olyan részletekkel, mint például a lejátszási lista neve és a videó címe, vagy a videó webcímek egyszerű listájaként + Megosztás címekkel + %1$s +\n%2$s + + %s válasz + %s válasz + + Továbbiak + Mutass kevesebbet + Metaadatok betöltése… + Webcímlista megosztása + - %1$s: %2$s + Videók + Dalok + Rövidek + Élő + Nincs elég szabad hely az eszközön + Igen + Nem + Biztonsági mentés és helyreállítás + A NewPipe időről időre automatikusan ellenőrzi az új verziókat, és értesít, amint azok elérhetővé válnak. +\nSzeretné engedélyezni ezt? + Beállítások alaphelyzetbe állítása + Minden beállítás visszaállítása alapértelmezett értékre + Az összes beállítás visszaállítása elveti az összes preferált beállítást, és újraindítja az alkalmazást. +\n +\nBiztosan folytatja? + Az importálandó exportban lévő beállítások sérülékeny formátumot használnak, amely a NewPipe 0.27.0-s verziója óta elavult. Győződjön meg arról, hogy megbízható forrásból importálja, és a jövőben csak a NewPipe 0.27.0-s vagy újabb verziójából származó exportokat használjon. A beállítások ebből a sérülékeny forrásból történő importálása hamarosan végleg el lesz távolítva, és a NewPipe régi verziói nem fogják tudni importálni az újabb verziókból származó exportokat. + másodlagos \ No newline at end of file diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 033e93c0ec3..365bfe9ea23 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -151,7 +151,7 @@ Մեծացնել Գեներացված Ներմուծել ֆայլ - Ստուգել թարմացումները + Ստուգել թարմացումները Ինքնին Բարձր որակ (մեծ) Ցածր որակ (փոքր) @@ -192,7 +192,7 @@ Նշել նվագացանկ Տառեր և թվեր Բեռնումներ - Եղավ + Եղավ Նվագել ամենը Ուղիղ Շարունակել նվագարկումը @@ -219,4 +219,26 @@ Ոչինչ բացի դատարկությունից Կրկին փորձել Հոսքի նորերը + Լեզու + Բացել… + Արտոնագիր + Անհյատ ֆորմատ + Նվագացանկեր + Միջին որակ + Դասավորել + Գամված մեկնաբանություն + Հաշիվը կասեցված է + + Ալբոմներ + Այո + Ոչ + Պակաս + Ավելին + Բարձր որակ + Ցածր որակ + Նկարները չներբեռնել + Պատկերի որակ + Ալիքներ + Ուղիղ + Անհայտ \ 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..55520e58ed0 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -29,7 +29,7 @@ Initiar discargas Pausar le discargas Seliger un instantia - Non poteva connecter con le servitor + Non pote connecter con le servitor Publicate le %1$s Discargar le file de fluxo Resolution predefinite @@ -104,7 +104,7 @@ Vacuar le chronologia de reproductiones Videos Dele le chronologia del contenido observate e positiones de reproduction - Positiones de reproduction delite. + Positiones de reproduction delite Vacuar le chronologia de cerca Error de rete Contento non disponibile @@ -127,7 +127,7 @@ NewPipe discargante A proposito de NewPipe © %1$s per %2$s sub %3$s - A proposito de + FAQ e A proposito de Licentias Contribuer Vider in GitHub @@ -140,7 +140,7 @@ Le plus reproducite Contento del pagina principal Selige un canal - Preste + Preste Rememorar ultime grandor e position del reproductor emergente Rememorar grandor e position del fenestra emergente @@ -160,7 +160,7 @@ Chronologia Dele le chronologia de parolas clave de cerca Deler omne chronologia de cerca\? - Chronologia de cerca delite. + Chronologia de recerca delite Exportar le chronologia, subscriptiones, listas de reproduction e configurationes Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente Le videos jam observate ante e post de esser addite al lista de reproduction essera removite. @@ -173,7 +173,7 @@ %s visualisationes Nemo is observante - Chronologia de reproductiones vacuate. + Chronologia de reproductiones vacuate Deler omne chronologia de reproductiones\? Pardono, qualcosa vadeva incorrecte. Pardono, illo non deberea haber ocurrite. @@ -227,7 +227,6 @@ Interne Aperir con Suggestiones de recerca remote - Cargar miniaturas Monstrante resultatos pro: %s Solmente alicun apparatos pote reproducer videos 2K/4K Initiar le reproductor principal in schermo plen @@ -241,7 +240,16 @@ Private Aperir le sito web Per %s - Monstrar le videos futur Radio Create per %s + Marcar como reguardate + OK + Usar reproductor de video externe + Monstrar plus + Si + Non + Monstrar minus + Configurar le notification del fluxo in reproduction + Notification de reproductor + Facer un copia de securitate e restaurar \ 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 a5b9a3ff2db..f72dea1583d 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -1,26 +1,26 @@ - Ketuk kaca pembesar untuk segera memulai. - Dipublikasikan pada tanggal %1$s - Pasang + Ketuk kaca pembesar untuk memulai. + Diterbitkan pada %1$s + Instal Batal - Buka di browser + Buka di peramban Bagikan Unduh - Telusuri + Telusur Pengaturan Bagikan dengan Gunakan pemutar video eksternal Gunakan pemutar audio eksternal - Folder unduhan Video + Folder unduhan video Berkas video yang diunduh akan disimpan di sini Pilih folder unduhan untuk berkas video - Folder unduhan Audio + Folder unduhan audio Berkas audio yang diunduh akan disimpan di sini Pilih folder unduhan untuk berkas audio Pilih kualitas Putar dengan Kodi - Instal aplikasi Kore yang hilang\? + Pasang aplikasi Kore yang hilang? Tampilkan opsi \"Putar dengan Kodi\" Tampilkan opsi untuk memutar video via Kodi Audio @@ -38,7 +38,7 @@ Tampilkan konten yang dibatasi usia Galat jaringan Tidak bisa memuat semua thumbnail - Apakah maksud Anda \"%1$s\"\? + Mungkin yang kamu maksud \"%1$s\"? Langsung Unduhan Unduhan @@ -48,7 +48,7 @@ Konten tidak tersedia Tidak bisa menyiapkan menu unduh Maaf, hal tersebut seharusnya tidak terjadi. - Laporkan kesalahan via surel + Laporkan via surel Maaf, telah terjadi kesalahan. Lapor Info: @@ -66,16 +66,15 @@ Mulai Jeda Ceksum - OK + Oke Nama berkas Galat NewPipe Sedang Mengunduh - Sentuh untuk detail + Sentuh untuk melihat detail Mohon tunggu… Disalin ke papan klip Silakan pilih folder unduhan di pengaturan - Pemutar stream tidak ditemukan. Pasang VLC\? - Tidak bisa dekripsi tanda tangan URL video + Pemutar penjaliran tidak ditemukan. Pasang VLC? App/UI rusak Apa:\\nPermintaan:\\nBahasa Konten:\\nNegara Konten:\\nBahasa Apl:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS: Thread @@ -86,21 +85,21 @@ r J T - Buka dalam mode popup + Buka pada mode sembulan Izin ini dibutuhkan untuk \nmembuka di mode sembul Memutar dalam mode sembul Dinonaktifkan Format video - Pilih kualitas mode popup + Kualitas mode sembulan bawaan Tampilkan kualitas yang lebih tinggi Hanya perangkat tertentu saja yang bisa memutar video 2K/4K Latar Belakang - Munculan + Sembulan Bersihkan Menghapus audio pada beberapa resolusi - Ingat properti popup - Ingat ukuran dan posisi terakhir popup + Ingat ciri-ciri sembulan + Ingat ukuran dan posisi terakhir sembulan Saran pencarian Menampilkan saran pencarian saat mencari Resolusi terbaik @@ -113,16 +112,16 @@ Tentang NewPipe Lisensi pihak ketiga © %1$s oleh %2$s di bawah %3$s - Tentang & FAQ + Tentang & SSD Lisensi - Aplikasi video daring yang bebas dan ringan untuk Android. + Aplikasi video penjaliran daring yang bebas dan ringan untuk Android. Lihat di GitHub Lisensi NewPipe - Terlepas apakah Anda memiliki ide untuk; terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu diterima. Semakin banyak akan semakin baik jadinya! + Terlepas apakah kamu memiliki ide: terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu kami terima. Semakin banyak ide akan semakin baik jadinya! Baca lisensi Kontribusi Berlangganan - Disubscribe + Dilanggani Apa Yang Baru Lanjutkan pemutaran Melanjutkan pemutaran setelah interupsi (mis. panggilan telepon) @@ -132,12 +131,10 @@ Notifikasi NewPipe Riwayat Riwayat - Muat thumbnail - Matikan agar thumbnail tidak dimuat, menghemat penggunaan data dan memori. Perubahan menghapus cache gambar baik di memori dan disk - Cache gambar dihapus - Hapus cache metadata - Hapus semua data cache halaman web - Cache metadata dihapus + Tembolok gambar dihapus + Hapus metadata tembolok + Hapus semua data laman web tembolok + Tembolok metadata dihapus Melanjutkan akhir dari antrean pemutaran (tak berulang) dengan menambahkan video terkait Simpan daftar video yang telah ditonton Tip \"Tahan untuk menambahkan\" @@ -188,19 +185,19 @@ Abaikan Ubah nama Donasi - NewPipe dikembangkan oleh relawan yang menyisihkan waktu untuk memberi Anda pengalaman terbaik. Segala dukungan kepada pengembang akan membuat NewPipe menjadi lebih baik sambil menikmati secangkir kopi. + NewPipe dikembangkan oleh relawan yang menyisihkan waktu luang untuk memberi kamu sebuah pengalaman terbaik. Segala dukungan yang diberikan kepada para pengembang akan membuat NewPipe menjadi lebih baik sembari mereka menikmati secangkir kopi. Beri dukungan Situs Web - Kunjungi situs web NewPipe untuk info dan berita. + Kunjungi situs web NewPipe untuk melihat info dan berita lebih lanjut. Apakah Anda ingin menghapus item ini dari riwayat pencarian\? Terakhir Diputar Sering Diputar Konten halaman utama Halaman Kosong - Halaman Kiosk - Halaman Channel - Pilih channel - Belum ada langganan saluran + Halaman Kedai + Halaman saluran + Pilih saluran + Belum ada saluran langganan Pilih kiosk Diekspor Diimpor @@ -220,7 +217,7 @@ Tutup Laci Pemutar video Pemutar latar belakang - Pemutar popup + Pemutar sembulan Selalu bertanya Mendapatkan info… Memuat konten yang diminta @@ -234,17 +231,17 @@ Hapus daftar putar ini\? Daftar putar dibuat Terdaftar putar - Thumbnail daftar putar diubah. + Keluku daftar putar diubah. Tanpa Teks Pas Isi Perbesar Otomatis dibuat - Pemutar stream tidak ditemukan (Anda bisa memasang VLC untuk memutarnya). - Unduh berkas stream - Tidak bisa mengubah langganan + Pemutar penjaliran tidak ditemukan (kamu dapat menginstal VLC agar penjaliran dapat diputar). + Unduh berkas penjaliran + Tidak dapat mengubah langganan Tampilkan info - Tambahkan Ke + Tambah Ke Hapus riwayat tontonan Hapus riwayat video yang diputar dan posisi pemutaran Hapus seluruh riwayat tontonan\? @@ -255,18 +252,17 @@ Riwayat pencarian dihapus Tidak ada video yang tersedia untuk diunduh 1 item dihapus. - Tidak ada aplikasi terpasang untuk memutar berkas ini Daftar Putar Putar otomatis video berikutnya - Berhenti berlanggan channel - Tidak bisa memperbarui langganan + Berhenti berlangganan saluran + Tidak dapat memperbarui langganan Langganan Gunakan tinjau cepat tak pasti Memungkinkan pengguna memilih posisi waktu video dengan cepat tetapi dengan tingkat presisi yang rendah. Mencari 5, 15 atau 25 detik tidak berhasil dengan ini NewPipe adalah perangkat lunak libre copyleft: Anda bisa menggunakannya, mempelajarinya, berbagi, dan meningkatkannya. Secara khusus Anda bisa mendistribusikan ulang dan/atau memodifikasinya dibawah syarat Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru. Apakah Anda juga ingin mengimpor pengaturan\? Tindakan \'buka\' yang diinginkan - Tindakan baku ketika membuka konten — %s + Tindakan bawaan ketika membuka konten — %s Teks Ubah skala teks takarir pemutar dan gaya latar belakang. Perlu memulai ulang apl Pemantauan kebocoran memori dapat menyebabkan apl menjadi tidak responsif saat heap dumping @@ -309,8 +305,8 @@ Trek Pengguna Kebijakan Privasi NewPipe - Proyek NewPipe sangat memperhatikan privasi Anda. Oleh karena itu, aplikasi initidak mengumpulkan data apa pun tanpa persetujuan Anda. -\nKebijakan privasi NewPipe menjelaskan secara detail data apa saja yang dikirim dan disimpan ketika Anda mengirimkan laporan kerusakan. + Proyek NewPipe sangat memperhatikan privasi kamu. Oleh karena itu, aplikasi ini tidak mengumpulkan data apa pun tanpa persetujuan Anda. +\nKebijakan privasi NewPipe menjelaskan secara detail data apa saja yang dikirim dan disimpan ketika kamu mengirimkan laporan kerusakan aplikasi. Baca kebijakan privasi Percepat saat diam Langkah @@ -320,19 +316,15 @@ Setuju Tolak Tanpa batas - Resolusi saat menggunakan data seluler + Batasi resolusi ketika menggunakan data seluler Minimalkan saat beralih apl Tindakan ketika beralih ke apl lain dari pemutar video utama — %s Nihil Minimalkan ke pemutar latar belakang Minimalkan ke pemutar popup - Berhenti Berlanggan + Berhenti Berlangganan 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 @@ -348,7 +340,7 @@ Konferensi Pembaruan Tampilkan pemberitahuan untuk meminta pembaruan aplikasi saat versi baru tersedia - Mode tampilan daftar + Mode tampilan berdaftar Daftar Kisi Otomatis @@ -357,7 +349,7 @@ Tertunda dijeda antri - pengolahan-pasca + pasca-pengolahan Antre Tindakan ditolak oleh sistem Pengunduhan gagal @@ -377,7 +369,7 @@ Pengolahan-pasca gagal Berhenti Percobaan maksimum - Jumlah upaya maksimum sebelum membatalkan unduhan + Jumlah upaya maksimum sebelum unduhan dibatalkan Berhenti pada jaringan terbatas Berguna saat beralih ke data seluler, walaupun beberapa unduhan tidak bisa ditangguhkan Tampilkan komentar @@ -397,7 +389,7 @@ tidak bisa menimpa ulang berkas Ada unduhan yang dijeda dengan nama ini NewPipe telah ditutup saat sedang memproses berkas - Tidak ada ruang kosong tersisa pada perangkat + Tidak ada ruang kosong tersisa pada perangkat Kehilangan laju, karena berkas telah dihapus Apakah Anda yakin ingin menghapus semua riwayat unduhan dan berkas yang telah diunduh\? Batasi antrean unduhan @@ -423,9 +415,9 @@ Tidak ada yang mendengarkan - %s mendengarkan + %s pendengar - Bahasa akan diterapkan setelah aplikasi dimulai ulang + Bahasa yang diubah akan diterapkan setelah aplikasi dimulai ulang Situs PeerTube Pilih situs PeerTube favorit Anda Temukan situs yang Anda suka di %s @@ -441,13 +433,13 @@ memulihkan Tidak bisa memulihkan unduhan ini Pilih situs - Kiosk Default + Kedai Bawaan Hapus riwayat unduhan Hapus berkas yang diunduh Izinkan untuk ditampilkan di atas aplikasi lain Bahasa apl Default sistem - Selesai + Selesai Durasi maju/mundur cepat Tekan \"Selesai\" saat selesai Video @@ -523,7 +515,7 @@ Harap periksa apakah masalah yang sama sudah ada atau belum. Ketika laporan Anda ternyata sudah ada, Anda membuat kami menghabiskan waktu yang seharusnya bisa kami gunakan untuk meningkatkan aplikasi menjadi lebih baik. Laporkan di GitHub Salin laporan dengan format - Menampilkan hasil untuk: %s + Menampilkan hasil: %s Halaman daftar putar Hanya tampilkan langganan tanpa grup Belum ada markah daftar putar @@ -536,19 +528,19 @@ Otomatis antre Antrean dari pemutar yang aktif akan digantikan Beralih ke pemutar yang lain mungkin akan mengganti antrean Anda - Konfirmasi sebelum mengosongkan antrean + Konfirmasikan sebelum mengosongkan antrean Tidak ada Bufer Aduk Ulangi Anda bisa memilih hingga tiga tindakan untuk ditampilkan dalam notifikasi ringkas! - Sentuh untuk menyunting tindakan notifikasi di bawah. Pilih hingga tiga diantaranya untuk ditampilkan dalam notifikasi ringkas dengan menggunakan kotak centang di sebelah kanan + Sentuh untuk menyunting tindakan notifikasi di bawah. Pilih hingga tiga di antaranya untuk ditampilkan dalam notifikasi ringkas dengan menggunakan kotak centang di sebelah kanan. Tombol tindakan kelima Tombol tindakan keempat Tombol tindakan ketiga Tombol tindakan kedua Tombol tindakan pertama - Ubah ukuran thumbnail yang ditampilkan di notifikasi dari rasio aspek 16:9 ke 1:1 + Ubah ukuran keluku yang ditampilkan pada notifikasi dari rasio aspek 16:9 ke 1:1 Ubah ukuran thumbnail ke rasio aspek 1:1 Tampilkan kebocoran memori Ditambahkan @@ -562,7 +554,7 @@ Warnai notifikasi Gunakan thumbnail untuk latar layar penguncian dan notifikasi Tampilkan thumbnail - Mengkalkulasi hash + Menghitung pilah Baru-baru ini Nonaktifkan untuk menyembunyikan kotak info dengan informasi tambahan tentang kreator, konten stream atau pencarian Tampilkan info meta @@ -578,7 +570,7 @@ Buka dengan Konten ini hanya tersedia untuk pengguna yang telah membayar, sehingga tidak bisa diputar atau diunduh oleh NewPipe. Video ini hanya tersedia untuk anggota YouTube Music Premium, sehingga tidak bisa diputar atau diunduh oleh NewPipe. - Konten ini privat, sehingga tidak bisa diputar atau diunduh oleh NewPipe. + Konten ini bersifat privat, sehingga tidak dapat diputar atau diunduh oleh NewPipe. Ini adalah sebuah trek SoundCloud Go +, setidaknya di negara Anda, sehingga tidak bisa diputar atau diunduh oleh NewPipe. Konten ini tidak tersedia di negara Anda. Hentikan aplikasi @@ -593,13 +585,12 @@ Tema malam Pengunduhan dimulai Tampilkan detail channel - Nonaktifkan terowongan media (tunnel) jiaka anda mengalami sebuah layar hitam atau kerusakan dalam memutar video + Nonaktifkan terowongan media (tunnel) jika anda mengalami sebuah layar hitam atau kerusakan dalam memutar video. Nonaktifkan terowongan media (tunnel) Internal Privasi Tidak didaftar Publik - Alamat URL gambar mini/thumbnail Host Dukungan Bahasa @@ -622,22 +613,21 @@ Galat memuat langganan Mulai Android 10, hanya \'Storage Access Framework\' yang didukung Anda akan ditanya lokasi penyimpanan berkas unduhan - Belum ada folder unduhan, pilih folder unduhan sekarang + Belum ada folder unduhan terpasang, pilih folder unduhan sekarang Nonaktif Aktif Mode tablet - Tampilkan item yang sudah ditonton Jangan tampilkan Kualitas rendah (lebih kecil) Kualitas tinggi (lebih besar) Komentar dinonaktifkan Pratinjau thumbnail bilah laju - Tandai ditonton + Tandai sebagai \'sudah ditonton\' Buka pemutar utama dalam layar penuh %s unduhan selesai - Geser item untuk membuangnya + Geser agar item terbuang Disukai oleh kreator Saran pencarian lokal Saran pencarian remote @@ -650,13 +640,13 @@ Tampilkan Ribon bewarna Picasso di atas gambar yang mengindikasikan asalnya: merah untuk jaringan, biru untuk disk dan hijau untuk memori Jangan memulai memutar video di mini player, tapi nyalakan langsung di mode layar penuh, jika rotasi otomatis terkunci. Anda tetap dapat mengakses mini player dengan keluar dari layar penuh Memproses… Mungkin butuh waktu sebentar - Periksa Pembaruan - Periksa manual untuk versi baru + Periksa Pembaruan + Periksa secara manual untuk melihat aplikasi versi baru Memeriksa pembaruan… Item feed baru Tampilkan \"Mogokkan pemutar\" Menampilkan opsi penghentian ketika menggunakan pemain video - Hentikan pemain video + Hentikan pemutar video Notifikasi untuk melaporkan kegalatan Notifikasi laporan kegalatan Sebuah kegalatan terjadi, lihat notifikasinya @@ -669,9 +659,8 @@ \nSilakan pasang pengelola berkas yang kompatibel dengan Storage Access Framework Komentar dipin LeakCanary tidak tersedia - Default ExoPlayer - Ubah ukuran interval pemuatan (saat ini %s). Nilai yang rendah mungkin dapat membuat pemuatan video awal lebih cepat. Perubahan membutuhkan pemutar dimulai ulang - Memuat detail stream… + ExoPlayer bawaan + Memuat detail penjaliran … Frekuensi pemeriksaan Dibutuhkan koneksi jaringan Jaringan apa saja @@ -701,16 +690,126 @@ Tidak ada stream audio yang tersedia untuk pemain eksternal Pilih kualitas untuk pemain eksternal Format tidak diketahui - Ukuran interval pemuatan playback - Tampilkan item mendatang - Sembunyikan item yang telah ditonton - Sembunyikan item mendatang + Ukuran selang pemuatan putar balik Pertanyaan yang sering diajukan - Jika Anda mengalami masalah menggunakan aplikasi, pastikan untuk melihat jawaban untuk pertanyaan yang umum! + Jika kamu mengalami masalah dalam penggunaan aplikasi, pastikan untuk melihat jawaban soal sering ditanya (SSD)! Tampilkan di situs web Urutan Mode cepat Impor atau ekspor langganan dari menu 3 titik Anda menjalankan NewPipe versi terkini Ketuk untuk mengunduh %s + Opsi ini hanya tersedia jika %s dipilih untuk Tema + Batalkan penetapan gambar kecil permanen + Gagal menyalin ke papan klip + Kartu + Daftar putar yang bewarna abu-abu sudah berisi item ini. + Duplikat ditambahkan %d kali + Berguna, misalnya, jika kamu menggunakan sebuah set kepala dengan tombol fisik yang rusak + Abaikan peristiwa tombol media perangkat keras + Hapus duplikat + Ditonton secara lengkap + Ditonton sebagian + Mendatang + Tampilkan/Sembunyikan saluran + Hapus duplikat\? + Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\? + Tampilkan saluran berikut + Pilih gestur untuk bagian kiri 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 selang pemuatan pada konten progresif (saat ini %s). Nilai yang lebih rendah dapat mempercepat pemuatan awal konten + Pilih audio asli + Pilih trek audio asli apa pun bahasanya + PIlih 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 + %1$s %2$s + Terowongan media dinonaktifkan secara bawaan di perangkat Anda karena model perangkat Anda tidak mendukungnya. + Tidak ada siaran langsung + Video + Pelanggan + Tab apa saja yang ditampilkan di halaman saluran + Tab saluran + Shorts + Memuat Metadata… + Dapatjan tab saluran + Tentang + Album + Tab untuk didapatkan ketika memperarui umpan. Opsi ini tidak memiliki efek jika saluran diperbarui menggunakan mode cepat. + Daftar putar + Trek + Tidak ada saluran + Saluran + Langsung + Saklar orientasi layar + Saklar layar penuh + Saluran berikutnya + Buka antrean pemain + Maju + Mundur + Putar ulang + Putar + Pilihan tambahan + Durasi + Penjaliran sebelumnya + Kualitas gambar + \? + Kualitas rendah + Avatar + Avatar sub-channel + Jangan tampilkan gambar + Kualitas tinggi + Kualitas sedang + Avatar pengunggah + Pilih kualitas dan visibilitas gambar, untuk mengurangi penggunaan data dan memori. Perubahan menghapus cache dalam diska dan memori - %s + Keluku + Bagikan daftar URL + Bagikan dengan Judul + %1$s +\n%2$s + Bagikan Daftar Putar + Bagikan daftar putar dengan detail seperti nama daftar putar dan judul video atau sebagai daftar video URL yang sederhana + Panji + - %1$s: %2$s + Sentuh untuk menyunting tindakan notifikasi di bawah. Tiga tindakan pertama (mainkan/jeda, sebelumnya dan selanjutnya) disetel oleh sistem dan tidak bisa dikustomisasi. + Tampilkan lebih sedikit + Tampilkan lebih banyak + + %s balasan + + Tidak ada ruang yang cukup pada perangkat + Ya + Tidak + Atur ulang pengaturan + Atur ulang pengaturan ke nilai bawaan + Mengatur ulang semua pengaturan akan mengabaikan pengaturan Anda yang disukai dan memulai ulang aplikasi. +\n +\nApakah Anda yakin ingin melanjutkan? + NewPipe dapat memeriksa versi baru secara berkala dan memberi tahu Anda ketika ada yang baru. +\nApakah Anda ingin mengaktifkan ini? + Cadangkan dan pulihkan + Pengaturan dalam ekspor yang diimpor menggunakan format rentan yang tidak digunakan lagi sejak NewPipe 0.27.0. Pastikan ekspor yang diimpor berasal dari sumber tepercaya, dan lebih memilih hanya menggunakan ekspor yang diperoleh dari NewPipe 0.27.0 atau yang lebih baru di masa mendatang. Dukungan untuk mengimpor pengaturan dalam format rentan ini akan segera dihapus sepenuhnya, dan NewPipe versi lama tidak akan dapat lagi mengimpor pengaturan ekspor dari versi baru. + sekunder \ 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 ffb0b59d1d2..2908cf49a25 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -1,19 +1,19 @@ - Pikkaðu á stækkunarglerið til að byrja. + Ýttu á stækkunarglerið til að byrja. Hætta við Leita - Nota ytri myndspilara + Nota utanaðkomandi myndspilara Í lagi Opna í vafra Opna með - Sækja straumskrá + Sækja streymisskrá Stillingar Birt %1$s - Enginn straumspilari fannst. Setja upp VLC\? - Opna í sprettiglugga + Enginn streymisspilari fannst. Setja upp VLC? + Opna í sprettglugga Sækja - Enginn straumspilari fannst (þú getur sett upp VLC til að spila það). + Enginn streymisspilari fannst (þú getur sett upp VLC til að spila það). Setja upp Núverandi áskriftum, spilunarlistum, feril og (valfrjálst) stillingum verður skipt út Flytja út feril, áskriftir, spilunarlista og stillingar @@ -26,7 +26,7 @@ Áttirðu við „%1$s\?“ Niðurstöður fyrir: %s Áskriftir - Tilkynningar um nýja strauma fyrir áskriftir + Tilkynningar um ný streymi fyrir áskriftir Ekki tókst að flytja út áskriftir Engar áskriftir ennþá Ekki tókst að flytja inn áskriftir @@ -39,7 +39,7 @@ \n5) Smelltu á \"Sækja\" hnappinn eftir að hann birtist. \n6) Smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu .zip skrána. \n7) [Ef .zip innflutningur mistekst] Taktu út .csv skrána (venjulega undir „YouTube og YouTube Music/subscriptions/subscriptions.csv“), smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu þá skrá. - Nota ytri hljóðspilara + Nota utanaðkomandi hljóðspilara Frjáls og léttur streymisspilari fyrir Android. Um NewPipe Áskrift hætt @@ -52,23 +52,23 @@ Tilkynningar fyrir spilara NewPipe Tilkynningar fyrir nýjar útgáfur NewPipe Hreinsa vefkökur sem NewPipe geymir þegar þú leysir reCAPTCHA - NewPipe rakst á villu, pikkaðu til að tilkynna + NewPipe rakst á villu, ýttu til að tilkynna hana Um okkur og algengar spurningar Gerast áskrifandi - Aðeins sum tæki geta spilað 2K/4K myndbönd + Aðeins sum tæki geta spilað 2K/4K myndskeið Spila með Kodi - Sýna hnapp til að spila myndband í gegnum fjölmiðlamiðstöð Kodi + Birta hnapp til að spila myndskeið í gegnum Kodi margmiðlunarmiðstöð Láta spilarann hrynja Sjálfgefið hljóðsnið Að skipta úr einum spilara í annan getur ruglað röðina þína Slökktu á til að fela ummæli - Sýna „Næstu“ og „Svipuð“ myndbönd + Sýna „Næstu“ og „Svipuð“ myndskeið 1:1 smámyndir - Allt að þrem aðgerðum er hægt að birta í þéttum tilkyningum. Pikkaðu til að breyta þeim + Breyttu hverri tilkynningu hér fyrir neðan með því að ýta á hana. Veldu í gátreitunum hægra megin allt að þrjár þeirra til að birta í samþjöppuðum tilkynningum. Engin slík mappa Gefðu leyfi til að birta yfir önnur forrit Villa kom upp, sjáðu tilkynninguna - Sjálfgefið myndbandssnið + Sjálfgefið skráasnið myndskeiða Næturþema Muna síðustu stærð og stöðu sprettiglugga Sýna lýsingu @@ -78,7 +78,7 @@ %s að horfa Еnginn еr að horfa - ∞ myndbönd + ∞ myndskeið Leyfðir stafir í skráarnöfnum Bókstafir og tölustafir Hvaða flipar eru sýndir á aðalsíðunni @@ -104,7 +104,7 @@ Hljóð Byrja Hunsa - Veldu möppu fyrir sótt myndbönd + Veldu möppu fyrir sótt myndskeið Veldu möppu fyrir sóttar hljóðskrár Sóttar hljóðskrár fara hingað Sjálfgefin upplausn sprettiglugga @@ -114,7 +114,7 @@ Eyða Endurnefna Skráarnafn - Þetta efni er ekki opinbert — það er ekki hægt að streyma eða sækja það með NewPipe. + Þetta efni er ekki opinbert — það er ekki hægt að streyma því eða sækja með NewPipe. Opna vefsíðu Niðurhal Hegðun @@ -141,7 +141,7 @@ Sprettiglugga Endurtaka Svört - Setja næsta straum í biðröð sjálfkrafa + Setja næsta streymi sjálfkrafa í biðröð Stokka Innihald Ekkert @@ -157,37 +157,36 @@ Sýna upplýsingar Í bakgrunni Veldu flipa - Mappa fyrir sótt myndbönd - Sótt myndbönd fara hingað + Mappa fyrir sótt myndskeið + Sótt myndskeið fara hingað Mappa fyrir sóttar hljóðskrár Sjálfgefin upplausn Kore forritið fannst ekki, setja það upp\? Sýna \"Spila með Kodi\" hnapp - Skera myndskeiðssmámyndina sem sýnd er í tilkynningum úr 16:9 í 1:1 myndhlutfall + Skera smámynd myndskeiðs sem sýnd er í tilkynningum úr 16:9 niður í 1:1 stærðarhlutföll Þriðji aðgerðahnappur Annar aðgerðahnappur Fyrsti aðgerðahnappur Fjórði aðgerðahnappur Fimmti aðgerðahnappur - Allt að þrem aðgerðum er hægt að birta í þéttum tilkyningum! + Þú getur valið mest þrjár aðgerðir til að birta í samþjöppuðum tilkynningum.! Í vinnslu Litaðar tilkynningar Láta Android sérsníða lit tilkynningarinnar í samræmi við aðallitinn í smámyndinni (athugaðu að þetta er ekki fáanlegt í öllum tækjum) Muna eiginleika sprettiglugga - Nota hraða en ónákvæma leit - Lengd skrefs + Nota hröð en ónákvæm hopp + Lengd hopps Biðja um staðfestingu áður en röð er hreinsuð - Sækja smámyndir Sýna ummæli Sjálfvirk biðröð Hreinsa gögn Sækja - Útsending + Í beinni Sótt gögn Allt Rásir Spilunarlistar - Myndbönd + Myndskeið Spor Notendur Viðburðir @@ -207,7 +206,7 @@ Endurheimta sjálfgefnar stillingar Viltu endurheimta sjálfgefnar stillingar\? Æi, þetta ætti ekki að gerast. - Tilkynna þessa villu með tölvupósti + Tilkynna með tölvupósti Tilkynna Upplýsingar: Athugaðu hvort vandamál sem fjallar um hrun þitt sé þegar til staðar. Þegar þú býrð til tvítekna miða eyðir þú tíma okkar sem við gætum eytt í að laga villuna. @@ -217,7 +216,7 @@ Hvað:\\nBeiðni:\\nTungumál Efnis:\\nLand Efnis:\\nTungumál forrits:\\nÞjónusta:\\nGMT Tími:\\nPakki:\\nÚtgáfa:\\nÚtgáfu Stýrikerfis: Athugasemd þín (á ensku): Engar niðurstöður - Myndband + Myndskeið ma. Engin áhorf @@ -235,25 +234,24 @@ %s að hlusta %s að hlusta - Engin myndbönd - 100+ myndbönd + Engin myndskeið + 100+ myndskeið - %s myndband - %s myndbönd + %s myndskeið + %s myndskeið Engin ummæli Ummæli eru óvirk Gátsumma Þræðir Villa - Pikkaðu á til að fá nánari upplýsingar + Ýttu til að fá nánari upplýsingar Bíddu aðeins… Afritað á klemmuspjald 1 atriði eytt. Leysa - Lokið + Lokið Beðið eftir þraut reCAPTCHA - Ekkert forrit er uppsett til að spila þessa skrá Leyfi þriðja aðila Hugbúnaðarleyfi © %1$s • %2$s • %3$s @@ -283,9 +281,9 @@ Setja í röð Í röð Sýna upplýsingar um rás - Hleður upplýsingar um straum… + Hleður inn upplýsingum um streymi… Þegar hlekkur er opnaður - Myndbandsspilari + Myndspilari Bakgrunnsspilari Sprettigluggaspilari Nýr spilunarlisti @@ -356,7 +354,7 @@ Merki NewPipe er þróað af sjálfboðaliðum sem eyða frítíma sínum í að færa þér bestu notendaupplifunina. Gefðu til baka til að hjálpa forriturum að gera NewPipe enn betri á meðan þeir njóta kaffibolla. millj. - Slökktu á til að fela myndbandslýsingu og viðbótarupplýsingar + Slökktu á til að fela lýsingu og viðbótarupplýsingar myndskeiðs Villa kom upp: %1$s Þraut reCAPTCHA Fjöldi áskrifenda ekki tiltækur @@ -434,22 +432,22 @@ Spóla áfram í þögn Engin takmörk Takmarka upplausn þegar farsímagögn eru notuð - Tilkynningar um nýtt efni + Tilkynningar um nýtt efni streyma Senda tilkynningar um nýtt efni áskrifta Hversu oft á að athuga Tegund tengingar Allar Sýna tilkynningu þegar ný útgáfa er fáanleg - Leita að uppfærslum + Leita að uppfærslum Leita handvirkt fyrir uppfærslum Fela þegar skipt er um forrit Nota bakgrunnsspilara Nota sprettigluggaspilara Sjálfvirk spilun — %s - Aðgerð þegar skipt er yfir í annað forrit frá aðal myndspilara — %s + Aðgerð þegar skipt er yfir í annað forrit frá aðalmyndspilara — %s Aðeins Wi-Fi Listasýn - Smámynd spilunarstiku + Forskoðun á smámynd hoppstiku Hágæða (stærra) Lágæða (minna) Ekki sýna @@ -478,7 +476,7 @@ Hvað er nýtt Rásarhópar Hleður… - Straumur + Streymi Veldu áskriftir %d valin @@ -487,7 +485,6 @@ Frá %s Reikningi lokað Aldurstakmark - Vefslóð smámyndar Fest ummæli Spjaldtölvuhamur Virkt @@ -502,29 +499,19 @@ „Geymsluaðgangsrammi“ (SAF) gerir þér kleift að vista skrár á ytra SD-kort Veldu netþjón Sýna aðeins óflokkaðar áskriftir - Villa við að hlaða straumi - Gat ekki hlaðið straumi fyrir ‚%s.‘ - Fáanlegt fyrir sumar þjónustur. Það er venjulega miklu hraðari en getur skilað ófullnægjandi upplýsingum, t.d. engin lengd, tegund, staða - Ef áskriftir eru uppfærðar of hægt máttu prófa hraðstraumsham (kveiktu á honum í stillingunum eða með hnappinum að neðan). -\n -\nNewPipe getur uppfært áskriftir á tvo vegu: -\n• Sækja alla áskriftarrásina — hægt en veitir allar upplýsingar. -\n• Nota sérstakt forritaskil — fljótt en upplýsingar verða færi. -\n -\nHraðstraumshamur getur veitt ófullnægjandi upplýsingum, t.d. engin lengd, tegund, staða og getur skilað færi atriðum. -\n -\nYouTube er dæmi um þjónustu sem býður upp á þetta með RSS-straumi sínum. -\n -\nValið er hraði eða nákvæmar upplýsingar. + Villa við að hlaða streymi + Gat ekki hlaðið streymi fyrir ‚%s.‘ + Fáanlegt fyrir sumar þjónustur. Það er venjulega miklu hraðari en getur skilað ófullnægjandi upplýsingum (t.d. engin lengd, tegund, staða beinna útsendinga) + Ef áskriftir eru uppfærðar of hægt máttu prófa hraðstreymissham (kveiktu á honum í stillingunum eða með hnappnum hér að neðan). \n \nNewPipe getur uppfært áskriftir á tvo vegu: \n• Sækja alla áskriftarrásina - hægvirkt en veitir allar upplýsingar. \n• Nota sérstök forritaskil - fljótvirkt en upplýsingar verða minni. \n \nHraðstreymishamur getur veitt ófullnægjandi upplýsingar, t.d. engin lengd, tegund, staða og getur skilað færri atriðum. \n \nYouTube er dæmi um þjónustu sem býður upp á þetta með RSS-streymi sínu. \n \nValið er því á milli hraða eða nákvæmra upplýsinga. Smámynd rásar - Þetta er SoundCloud Go+ lag að minnsta kosti í þínu landi — það er ekki hægt að streyma eða sækja það með NewPipe. - Þetta myndband er aðeins í boði fyrir YouTube Tónlist Premium meðlima — það er ekki hægt að streyma eða sækja það með NewPipe. + Þetta er SoundCloud Go+ lag að minnsta kosti í þínu landi — það er ekki hægt að streyma því eða sækja með NewPipe. + Þetta myndskeið er aðeins í boði fyrir YouTube Tónlist Premium meðlimi, það er ekki hægt að streyma því eða sækja með NewPipe. Þú getur nú valið texta inni í lýsingunni. Athugaðu að síðan getur flöktað og mögulega er ekki hægt að smella á tengla í valhami. Geyma leitarfyrirspurnir í tæki Ræsa aðalspilara í fullskjásstillingu Sprettigluggaspilun - Þetta myndband er með aldurstakmark. -\nVegna nýrra reglna YouTube er ekki hægt að streyma eða sækja það með NewPipe. + Þetta myndskeið er með aldurstakmörk. +\nVegna nýrra reglna YouTube er ekki hægt að streyma því eða sækja með NewPipe. Eyða öllum spilunarstaðsetningum\? Spilunarstaðsetningum eytt Hreinsa leitarferil @@ -534,21 +521,21 @@ Gat ekki hlaðið inn öllum smámyndum Gat ekki túlkað vefsíðu Gat ekki sett upp niðurhalsvalmynd - Ekki tókst að spila þennan straum + Ekki tókst að spila þetta streymi Banvæn villa í spilaranum Að jafna sig eftir villu í spilara - Ytri spilarar styðja ekki þessar tegundir tengla - Engir myndstraumar fundust - Engir hljóðstraumar fundust + Utanaðkomandi spilarar styðja ekki þessar tegundir tengla + Engin myndstreymi fundust + Engin hljóðstreymi fundust Ekkert slíkt efni fanst - Engir straumar til að sækja + Engin streymi til að sækja Gat ekki lesið vistaða flipa þannig að mun nota sjálfgefna - Spila myndband, lengd: + Spila myndskeið, lengd: Smámynd höfundar Víxla þjónustu. Nú valin: - %s nýr straumur - %s nýir straumar + %s nýtt streymi + %s ný streymi Vinsamlega veldu niðurhalsmöppu síðar í stillingunum Engin niðurhalsmappa er stillt ennþá. Veldu sjálfgefna niðurhalsmöppu núna @@ -566,23 +553,19 @@ \nVirkjaðu kerfismöppuval (SAF) ef þú vilt nota ytra SD-kort Þú verður spurð(ur) hvert ætti að sækja skrár í hvert skipti Virkja kerfismöppuval (SAF) - Fjarlægja myndbönd sem horft var á\? - Straumur síðast uppfærður: %s + Fjarlægja áhorfð myndskeið? + Streymi síðast uppfært %s Ekki hlaðið: %d - Ný atriði í straumi + Ný atriði í streymi Engar áskriftir valdar Tómt hópsnafn Viltu eyða þessum hóp\? - Hversu oft á að uppfæra straum — %s - Bil á uppfærslu straums - Reikningi höfundar er lokaður. -\nNewPipe getur ekki sótt þennan straum lengur. -\nViltu segja upp áskrift\? - Hraðstraumshamurinn veitir ekki frekari upplýsingar um þetta. - Virkja hraðstraumsham - Afvirkja hraðstraumsham - Sýna spiluð atriði - Fela spiluð atriði + Hversu oft á að uppfæra streymi áður en áskrift er talin útrunnin — %s + Takmörk á uppfærslu streymis + Reikningur höfundar er lokaður.\nNewPipe getur ekki sótt þetta streymi lengur.\nViltu segja upp áskrift? + Hraðstreymishamurinn veitir ekki frekari upplýsingar um þetta. + Virkja hraðstreymisham + Afvirkja hraðstreymisham NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. @@ -595,68 +578,61 @@ \nVinsamlegast settu upp skráarstjóra sem styður Geymsluaðgangsramma (SAF) Þetta efni er ekki fáanlegt í þínu landi. %s gefur þessa ástæðu: - Þetta efni er aðeins í boði fyrir notendur sem hafa greitt — það er ekki hægt að streyma eða sækja það með NewPipe. + Þetta efni er aðeins í boði fyrir notendur sem hafa greitt — það er ekki hægt að streyma því eða sækja með NewPipe. Sjálfvirk (þema tækis) Veldu uppáhalds næturþemu þína — %s Þú getur valið uppáhalds næturþemu þína hér að neðan Niðurhal hafið Virkja valham fyrir lýsinguna Afvirkja valham fyrir lýsinguna - Ónákvæm leit gerir leikmanninum kleift að leita hraðar í stöður með minni nákvæmni. Að leita í 5, 15 eða 25 sekúndur virkar ekki með þessu + Ónákvæm hopp gerir leikmanninum kleift að leita hraðar í stöður með minni nákvæmni. Að leita í 5, 15 eða 25 sekúndur virkar ekki með þessu Geyma áhorfsferil Halda áfram að spila eftir hlé (t.d. símtöl) - Ekki byrja myndbönd í smáspilaranum heldur fara í skjáfylliham ef sjálfvirkur snúningur er læstur. Þú getur samt fengið aðgang að smáspilaranum með því að fara úr skjáfylliham - Byrja leit að nýjum straumum + Ekki byrja myndskeið í smáspilaranum heldur fara í skjáfylliham ef sjálfvirkur snúningur er læstur. Þú getur samt fengið aðgang að smáspilaranum með því að fara úr skjáfylliham + Byrja leit að nýjum streymum get ekki skrifað yfir skrána 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 + Engin myndstreymi eru í boði fyrir utanaðkomandi spilara Eyða vefkökum reCAPTCHA Vefkökum reCAPTCHA eytt Stærð forhleðslu - Breyta stærð forhleðslu (nú %s). Lægra gildi gæti flýtt fyrir upphaflegu hleðslu myndbands. Breytingar krefjast endurræsingar spilara + Breyta stærð millibils forhleðslu (núna %s). Lægra gildi gæti flýtt fyrir hleðslu myndskeiðs í upphafi Biðröð spilarans verður skipt út - Slökktu á til að hlaða ekki niður smámyndum til að spara bandbreidd og vinnsluminni. Breytingar eyða myndskyndiminni í bæði vinnsluminni og geymslu - Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni + Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um höfund streymis, efni streymis 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 + Bæta svipuðum streymum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð Veldu tillögur til að sýna þegar leitað er Endurheimta síðustu spilunarstöðu Spilunarstöður í listum Sýna spilunarstöður í listum Sýna ábendinguna „Haltu niðri til að bæta við spilunarröð“ - Sýna ábendingu þegar ýtt er á bakgrunninn eða sprettihnappin í „Nánar:“ myndbandsins + Sýna ábendingu þegar ýtt er á bakgrunninn eða sprettihnappinn í „Nánar:“ á myndskeiðinu Óþekkt slóð. Opna með öðru forriti\? Veldu uppáhalds PeerTube tilvik þín Þú mátt finna tilviki á %s Gat ekki staðfest tilvik Aðeins HTTPS vefslóðir eru studdar - Stilla tilkynningu fyrir spilandi straum + Stilla tilkynningu fyrir spilandi streymi Sýna aldurstakmarkað efni Sýna efni sem hugsanlega hentar ekki börnum vegna þess að það hefur aldurstakmark (t.d. 18+) Kveikja á öryggisham YouTube YouTube býður upp á öryggisham sem felur efni sem gæti hugsanlega verið óviðeigandi fyrir börn - Þetta myndband er aldurstakmark. + Þetta myndskeið er með aldurstakmörk. \n \nKveiktu á „%1$s“ í stillingunum ef þú vilt sjá það. - Myndbandsathugunarsummutilkynning - Tilkynning um framvindu myndbandsathugunarsummu + Tilkynning um gátsummu myndskeiðs + Tilkynning um framvindu gátsummu myndskeiðs Villuskýrslutilkynning Tilkynningar um villur Skipta yfir í bakgrunn Skipta yfir í sprettiglugga Skipta yfir í aðalspilara - Eyðir feril spilaðra strauma og spilunarstöðum + Eyðir ferli spilaðra streyma og stöðum í spilun Eyða áhorfsferil\? Áhorfsferli eytt Eyða spilunarstöðum Eyðir öllum spilunarstöðum - Mistókst að afkóða vefslóð myndbandar Niðurhal á SD kort er ekki mögulegt. Endurstilla niðurhalsmöppu\? Strjúktu til að fjarlægja Engir spilunarlistar bókamerktir ennþá @@ -666,9 +642,9 @@ Haltu niðri til að bæta við spilunarröð Hleður umbeðið efni Sýna upprunatíma á atriðum - Upprunalegir textar frá þjónustu verða sýnilegir í atriðum - Slökkva á fjölmiðlagöngum - Slökktu á fjölmiðlagöngum ef þú finnur fyrir svörtum skjá eða stami við spilun myndbandar + Upprunalegir textar frá þjónustu verða sýnilegir í streymisatriðum + Slökkva á margmiðlagöngum + Slökktu á margmiðlunargöngum (media tunneling) ef vart verður við svartan skjá eða hökt við spilun myndskeiða. Sýna myndvísa Sýna Picasso litaða borða ofan á myndum sem gefa til kynna uppruna þeirra: rauðan fyrir netið, bláan fyrir disk og grænan fyrir minni Sýna „Hrynja spilara“ @@ -692,7 +668,7 @@ Netþjónninn sendir ekki gögn Netþjónninn styður ekki fjölþráðuð niðurhöl, reyndu aftur með @string/msg_threads = 1 NewPipe var lokað á meðan unnið var að skrá - Ekkert pláss eftir á tæki + Ekkert pláss eftir á tæki Framvinda tapaðist vegna þess að skránni var eytt Get ekki endurheimt þetta niðurhal Hreinsa niðurhalsferil @@ -702,20 +678,131 @@ %1$s sóttum skrám eytt Fjöldi tilrauna áður en hætt er við niðurhal - Myndböndum sem skoðuð var áður eða eftir að þeim var bætt við spilunaristann verður eytt. -\nErtu viss\? Það er ekki hægt að afturkalla þetta! + Myndskeiðum sem skoðuð voru áður eða eftir að þeim var bætt við spilunarlistann verður eytt. +\nErtu viss? Það er ekki hægt að afturkalla þetta! Já og skoðuð að hluta Nota RSS ef tiltækt Hjartað af höfunda Slökkt er á tilkynningum Þú ert nú áskrifandi - Straumar sem ekki eru enn studdir af niðurhalaranum eru ekki sýndir - 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 + Streymi sem ekki eru enn studd af niðurhalaranum eru ekki sýnd + Valið streymi er ekki stutt af utanaðkomandi spilurum + Engin hljóðstreymi eru í boði fyrir utanaðkomandi spilara + Veldu gæði fyrir utanaðkomandi spilara 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 Raða + Birtustig + Engin streymi + Engin streymi í beinni + Óþekkt + Veldu hljóðspor fyrir utanaðkomandi spilara + Þú ert að keyra nýjustu útgáfuna af NewPipe + Ertu viss um að þú viljir fjarlægja öll tvítekin streymi í þessum spilunarlista? + Sækja flipa rásar + Birta eftirfarandi streymi + Auðkennismyndir + Borðar + Auðkennismyndir undirrása + Sýslaðu með sumar stillingar ExoPlayer. Breytingar á þessu krefjast endurræsingar spilarans til að taka gildi + Stillingar ExoPlayer + Fyrra streymi + yfirtalað + lýsandi + + %s svar + %s svör + + Mistókst að afrita á klippispjald + Nei + Velja frekar upprunalegt hljóð + Hljóðstyrkur + Ekkert + Hljóð: %s + Uppfærsla á NewPipe er tiltæk! + Ýttu til að sækja %s + Frumstilla stillingar + Fjarlægja tvítök? + Smámyndir + Áskrifendur + Búið að horfa + Á næstunni + Myndskeið + Spor + Stuttmyndir + Spilunarlistar + Albúm + Um hugbúnaðinn + Rásaflipar + Opna spilunarröð + Víxla stefnu skjás + Spila + Endurspila + Fleiri valkostir + Tímalengd + Spóla til baka + Áfram + Myndgæði + Ekki hlaða inn myndum + Lággæða + Meðalgæði + Hágæða + \? + Deila spilunarlista + Deila með titlum + Deila lista yfir slóðir + - %1$s: %2$s + %1$s +\n%2$s + Sýna meira + Sýna minna + Þessi valkostur er aðeins tiltækur ef %s er valið sem þema + Hljóðspor ætti þegar að vera til staðar í þessu streymi + Skoðað að hluta + %1$s %2$s + upprunalegt + Birta/Fela streymi + Hleð inn lýsigögnum… + Spjald + Í beinni + Rásir + Hljóðspor + + Öryggisafrita og endurheimta + Staðsetning aðalflipa + Tvítaki bætt við %d sinnum + Ekkert pláss eftir á tæki + Frumstilla allar stillingar á sjálfgefin gildi + Fjarlægja tvítök + Auðkennismyndir innsendenda + Hvaða flipar eru sýndir á rásasíðunum + Víxla skjáfylli af/á + Næsta streymi + Hraðstreymishamur + Flytja áskriftir inn eða út með 3-punkta valmyndinni + Hunsa atvik frá margmiðlunarhnöppum vélbúnaðar + Velja upprunalegt hljóðspor án tillits til tungumáls + Velja frekar lýsandi hljóð + Hægri bendingaraðgerð + Veldu bendingu fyrir vinstri helming spilaraskjás + Vinstri bendingaraðgerð + Veldu bendingu fyrir hægri helming spilaraskjás + Spilunarlistarnir sem eru gráir innihalda þegar þetta atriði. + Losa varanlega smámynd + Breyttu hverri tilkynningu hér fyrir neðan með því að ýta á hana. Fyrstu þrjár aðgerðirnar (spila/bíða, fyrra og næsta) eru skilgreindar af kerfinu og er því ekki hægt að sérsníða. + Flipar sem á að sækja við uppfærslu þessa streymis. Þetta hefur engin áhrif ef rás er uppfærð með hraðstreymisham. + Deildu spilunarlista með atriðum eins og heiti spilunarlistans og titlum myndskeiða eða sem einföldum lista yfir slóðir á myndskeið + Nota varaeiginleika ExoPlayer-afkóðarans + Vegna takmarkana í ExoPlayer-spilaranum var tímalengd hoppa sett á %d sekúndur + Margmiðlunargöng (media tunneling) voru gerð óvirk á tækinu þínu þar sem þessi gerð tækja er þekkt fyrir að styðja ekki þennan eiginleika. + NewPipe getur athugað sjálfkrafa hvort nýjar útgáfur séu í boði og láta þig vita þegar slíkt gerist.\nViltu virkja þetta? + Frumstilling allra stillinga mun henda öllum áður skilgreindum stillingum og endurræsa forritið.\n\nErtu viss um að þú viljir halda áfram? + Nytsamlegt ef þú til dæmis þarft að nota heyrnartól með biluðum tökkum + Alltaf nota framhjáhlaupsstillingar ExoPlayer-spilarans fyrir frálagsflöt myndmerkis + Veldu hljóðspor með lýsingum fyrir sjónskerta, ef slíkt er tiltækt + Færa veljara aðalflipa neðst + Sýna villustiku + Veldu gæði mynda og hvort eigi að hlaða myndum inn yfirhöfuð, til að minnka notun gagna og minnis. Breytingar munu hreinsa bæði vinnsluminni og diskminni - %s + auka \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d2b0d10fe93..a109c907630 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -43,7 +43,6 @@ Errore Errore di connessione Impossibile caricare tutte le copertine - Impossibile decriptare la firma dell\'URL del video Contenuto non disponibile Impossibile analizzare il sito web Impossibile impostare il menu di download @@ -52,7 +51,7 @@ Tocca la lente d\'ingrandimento per iniziare. In diretta Spiacenti, non sarebbe dovuto succedere. - Segnala l\'errore via e-mail + Segnala via e-mail Spiacente, qualcosa è andato storto. Segnala Info: @@ -287,8 +286,6 @@ Tieni presente che questa operazione può consumare una grande quantità di traffico dati. \n \nVuoi continuare? - Carica copertine - Disabilita per prevenire il caricamento delle copertine, risparmiando dati e memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco Cache immagini svuotata Svuota la cache dei metadati Elimina i dati delle pagine web memorizzati nella cache @@ -302,7 +299,6 @@ Azione predefinita all\'apertura del contenuto — %s Sottotitoli Modifica dimensione e stile dei sottotitoli. Riavviare per applicare le modifiche - Nessuna app installata per riprodurre questo file Elimina la cronologia delle visualizzazioni Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione Eliminare la cronologia delle visualizzazioni\? @@ -338,10 +334,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 @@ -407,7 +399,7 @@ impossibile sovrascrivere il file C\'è un download in corso con questo nome NewPipe è stato chiuso mentre lavorava sul file - Spazio insufficiente sul dispositivo + Spazio insufficiente sul dispositivo Progresso perso poiché il file è stato eliminato Vuoi cancellare la cronologia dei download o eliminare tutti i file scaricati\? Sarà avviato un solo download per volta @@ -459,7 +451,7 @@ Lingua dell\'applicazione Predefinita di sistema Premere \"Fatto\" quando risolto - Fatto + Fatto Video %d secondo @@ -557,7 +549,7 @@ La coda del lettore attivo sarà sostituita Chiedi prima di svuotare la coda Cambiare tipo di riproduzione potrebbe sostituire gli elementi in coda - Le azioni dei pulsanti della notifica possono essere modificate qua sotto. Selezionane fino a 3, utilizzando le caselle di controllo sulla destra. Verranno visualizzate nella notifica compatta + Le azioni dei pulsanti della notifica possono essere modificate qua sotto. Selezionane fino a tre da mostrare nella notifica compatta, usando le caselle di controllo sulla destra. Azione pulsante 5 Azione pulsante 4 Azione pulsante 3 @@ -613,13 +605,12 @@ 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 Non in elenco Pubblico - URL copertina Host Supporto Lingua @@ -646,7 +637,6 @@ Disattivata Attiva Modalità tablet - Mostra elementi visti Non mostrare Qualità bassa (più piccola) Qualità alta (più grande) @@ -674,7 +664,7 @@ Aggiunto alla coda come prossimo Accoda come prossimo Elaborazione… Potrebbe volerci un attimo - Controlla aggiornamenti + Controlla aggiornamenti Verifica manualmente la presenza di nuove versioni Controllo aggiornamenti… Nuovi elementi feed @@ -694,7 +684,6 @@ Commento in primo piano LeakCanary non è disponibile Predefinito ExoPlayer - Cambia la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video. La modifica richiede il riavvio del lettore Notifiche di nuovi contenuti dalle iscrizioni Frequenza controllo Connessione di rete richiesta @@ -728,15 +717,126 @@ 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 Visualizza sul sito Recupero veloce Premi per scaricare %s - L\'ultima versione di NewPipe è già in esecuzione + Stai già usando l\'ultima versione di NewPipe Importa o esporta iscrizioni dal menu a 3 punti + Questa opzione è disponibile solo se %s è selezionato come Tema + Copia negli appunti non riuscita + Schede + Disattiva copertina permanente + Le playlist in grigio contengono già questo elemento. + Doppione aggiunto %d volta/e + Ignora eventi dei pulsanti multimediali hardware + Utile usando cuffie con tasti fisici rotti + Rimuovi elementi doppi + Rimuovere gli elementi doppi\? + Rimuovere tutti gli elementi doppi di questa playlist\? + Mostra gli elementi seguenti + Mostra/Nascondi elementi + 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 + %1$s %2$s + originale + doppiato + descrittivo + Per questo elemento dovrebbe già essere presente una traccia audio + Attivare questa opzione in caso di problemi di inizializzazione del decodificatore. Verranno usati decodificatori di priorità inferiore se l\'inizializzazione di quelli primari fallisce. Le prestazioni di riproduzione potrebbero essere inferiori rispetto all\'uso di quelli primari + Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive +\n +\nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero + 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. + Nessuna trasmissione + Nessuna trasmissione in diretta + Video + Iscritti + Quali schede mostrare nelle pagine del canale + Schede canale + Shorts + Caricamento metadati… + Recupera schede del canale + Informazioni + Album + Schede da recuperare quando si aggiorna il feed. Questa opzione non ha effetto se un canale viene aggiornato usando la modalità veloce. + Playlist + Tracce + Canali + Dirette + Qualità immagine + \? + Cambia orientamento schermo + Qualità bassa + Attiva/disattiva schermo intero + Avatar + Video successivo + Avatar del sotto-canale + Apri coda di riproduzione + Non caricare immagini + Qualità alta + Avanti + Riavvolgi + Ricomincia + Qualità media + Avatar dell\'autore + Banner + Scegli la qualità delle immagini e se caricarle o meno, per ridurre l\'utilizzo di dati e memoria. Le modifiche svuotano la cache immagini sia in memoria che su disco — %s + Riproduci + Altre opzioni + Miniature + Durata + Video precedente + Condividi elenco URL + Condividi con i titoli + %1$s +\n%2$s + Condividi playlist + Condividi la playlist con dettagli come il suo nome e i titoli video o come un semplice elenco di URL video + - %1$s: %2$s + + %s risposta + %s risposte + %s risposte + + Mostra altro + Le azioni dei pulsanti della notifica possono essere modificate qua sotto. Le prime tre (riproduci/pausa, precedente e successivo) sono impostate dal sistema e non possono essere cambiate. + Mostra meno + Non abbastanza spazio libero sul dispositivo + Backup e ripristino + Azzera le impostazioni + L\'azzeramento di tutte le impostazioni eliminerà tutte le proprie impostazioni e riavvierà l\'app. +\n +\nSei sicuro di voler procedere? + Azzera tutte le impostazioni ai loro valori predefiniti + + No + NewPipe può cercare automaticamente nuove versioni di tanto in tanto e avvisarti quando sono disponibili. +\nVuoi attivarlo? + Le impostazioni nell\'export che viene importato usano un formato vulnerabile che è stato deprecato dalla versione 0.27.0 di NewPipe. Assicuratevi che l\'export importato venga da una fonte fidata, sarebbe preferibile usare solo exports ottenuti da NewPipe 0.27.0 o superiori, nel futuro. Il supporto all\'importazione di Impostazioni in questo formato vulnerabile sarà presto rimosso completamente, da quel momento le versioni di NewPipe più vecchie non saranno più in grado di importare impostazioni tramite export di versioni più recenti. \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index fcf2d3c9457..e8655688b85 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,7 +16,7 @@ 動画ファイルをダウンロードするフォルダーを選択して下さい デフォルトの画質 Kodi で再生 - Kore をインストールしますか? + インストールされてない Kore アプリをインストールしますか? 「Kodi で再生」オプションを表示 Kodi メディアセンター経由で動画を再生するための設定を表示します 音声 @@ -43,14 +43,13 @@ 音楽ファイルをダウンロードするフォルダーを選択して下さい エラー 全てのサムネイルを読み込めませんでした - 動画のURLを復号できませんでした ウェブサイトを解析できませんでした コンテンツが利用できません 保存メニューを設定できませんでした コンテンツ 年齢制限のあるコンテンツを表示 申し訳ありません。想定外のエラーが発生しました。 - 不具合をメールで報告 + メールで送る 申し訳ありません、不具合が発生しました。 報告 情報: @@ -108,7 +107,7 @@ NewPipe について サードパーティー ライセンス © %1$s 作者 %2$s ライセンス %3$s - このアプリについて + バージョン情報とよくある質問 ライセンス Android 向けのフリーで軽量なストリーミング。 GitHub で表示 @@ -170,13 +169,13 @@ バックグラウンド再生を開始 ポップアップ再生を開始 メイン再生に切り替え - 動画プレイヤーが見つかりません (VLCをインストールして再生できます)。 + 動画プレイヤーが見つかりませんでした(VLCをインストールすることで再生できます)。 デフォルトの地域設定 常に 一度だけ データベースをインポート データベースをエクスポート - 既存の履歴、登録リスト、プレイリストおよび (任意) 設定は上書きされます + 既存の履歴、登録チャンネル一覧、プレイリストおよび (任意) 設定は上書きされます 再生履歴、登録チャンネル一覧、プレイリストおよび設定をエクスポートします エラーから回復中です 外部プレイヤーは、これらのタイプのリンクをサポートしていません @@ -196,7 +195,6 @@ 動画をダウンロード 情報を表示 ブックマークしたプレイリスト - サムネイルを読み込む 画像キャッシュを消去しました キャッシュを消去 アプリ内のキャッシュデータをすべて削除します @@ -245,7 +243,6 @@ 検索履歴を消去 検索キーワードの履歴を削除します 検索履歴を削除しました - このファイルを再生するためのアプリがインストールされていません 設定もインポートしますか? 字幕 チャンネル @@ -255,7 +252,6 @@ プライバシーポリシーを確認 おおまかなシーク おおまかなシークを使用することで精度が下がる代わりに高速にシークができます。5 秒、15 秒または 25 秒間隔のシークはできません - サムネイルの読み込みと保存を無効化します。(このオプションを切り替えるとメモリとディスク上の画像キャッシュが消去されます) キューに関連動画を追加して再生を続ける (繰り返ししない場合) すべての再生履歴を削除しますか? すべての検索履歴を削除しますか? @@ -369,10 +365,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - 音量のジェスチャー制御 - ジェスチャーを使用して、プレイヤーの音量を制御します - 明るさのジェスチャー制御 - ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました アプリの更新通知 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? @@ -398,7 +390,7 @@ ファイルを上書きできません 同じファイル名のダウンロードが既に進行中です ファイルの作業中に NewPipe が閉じられました - デバイスに空き容量がありません + デバイスに空き容量がありません ファイルが削除されたため、進行状況が失われました ダウンロード履歴、またはダウンロードしたファイルを消去しますか\? ダウンロード キューの制限 @@ -438,7 +430,7 @@ インスタンスはすでに存在しています ローカル 最近追加された - 高評価 + 最も評価された 修復中 ダウンロードが修復できません インスタンスを選択 @@ -449,7 +441,7 @@ アプリの言語 システムの既定 解けたら「完了」を押してください - 完了 + 完了 動画 %d 秒 @@ -539,7 +531,7 @@ URL を認識できませんでした。他のアプリで開きますか? 通知に表示されるサムネイルを 16:9 から正方形にします サムネイルを正方形にする - 以下をタップして通知のアクションを編集します。右側にあるチェックボックスを使用してコンパクトな通知に表示するものを 3 つまで選択します + 以下をタップして通知のアクションを編集します。右側にあるチェックボックスを使用してコンパクトな通知に表示するものを3つまで選択します。 コンパクトな通知に表示されるアクションは 3 つまで選ぶことができます! 5 番目のアクションボタン 4 番目のアクションボタン @@ -593,7 +585,7 @@ チャンネルの詳細を表示 ラジオ おすすめ - ビデオ再生が止まったり出ない場合はメディアトンネリングを無効にしてください + 動画の再生が止まったり動画が出ない場合はメディアトンネリングを無効にしてください。 マルチメディアトンネリングを無効にする 公開 限定公開 @@ -607,7 +599,6 @@ 言語 サポート ホスト - サムネイルの URL ウェブサイトを開く ダウンロードのたびに保存する場所を尋ねます ダウンロードフォルダーがまだ設定されていません。今すぐデフォルトのフォルダーを選択してください @@ -626,7 +617,6 @@ オン タブレットモード %s がこの理由を提示: - 視聴したアイテムを表示 表示しない 低品質 (小) 高品質 (大) @@ -642,14 +632,14 @@ %1$s つのダウンロードを削除しました - %s つのダウンロードが完了しました + %s 個のダウンロードが完了しました ピカソは、画像の上に、画像の出所を識別する色彩記章を表示します: 赤はネットワーク、青はディスク、緑はメモリ 画像に標識を表示 処理中… 少し時間がかかるかもしれません 新しいバージョンを手動で確認します アップデートを確認中… - アップデートを確認 + アップデートを確認 次をキューに追加 次をキューに追加しました クリエイターの心をこめて @@ -689,7 +679,6 @@ 新しいストリーム 通知 現在再生しているストリームの通知を構成 - 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です 必要なネットワークの種類 パーセント 半音 @@ -702,7 +691,124 @@ 外部プレイヤーで利用可能な音声ストリームがありません 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 - 次のアイテムを表示する - 再生済みを隠す - 次のアイテムを隠す + 並び替え + ウェブサイトを表示 + タップして%sをダウンロード + あなたはNewPipeの最新版を起動しています + よくある質問 + アプリの使い方に困ったときは、よくある質問に答えていますので、ぜひご覧ください! + %sがテーマに選択された場合のみ、この選択肢が利用可能です + 高速モード + 3点メニューから登録チャンネルの読み込みまたは書き出しが可能 + カード + クリップボードへのコピーに失敗しました + 灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。 + %d 回重複追加されました + 固定サムネイルの設定を解除 + 重複を削除しますか\? + たとえば、物理ボタンが壊れたヘッドセットを使用している場合に便利です + この再生リスト内の重複したストリームをすべて削除しますか\? + ハードウェア メディア ボタン イベントを無視する + 重複を削除 + 次のストリームを表示 + ストリームの表示/非表示 + 完全に視聴済み + 一部視聴済み + 今後 + 再生画面の左半分用にジェスチャーを選択 + 左のジェスチャー動作 + 再生画面の右半分用のジェスチャーを選択 + 右のジェスチャー動作 + 明るさ + 音量 + + ExoPlayer 設定 + ExoPlayer の設定を管理します。これらの変更を反映するにはプレイヤーの再起動が必要です + ExoPlayer のデコーダ フォールバック機能を使用する + 常に ExoPlayer の映像出力 サーフェス設定の解決策を使用する + 吹き替え + 音声解説 + 音声解説を優先する + 利用可能な場合に視覚障害者向けの音声解説トラックを選択する + オーディオ: %s + 不明 + 外部プレイヤー用のオーディオトラックを選択 + オリジナル + オリジナル音声を優先する + 言語に関係なくオリジナルのオーディオトラックを選択する + オーディオトラック + デコーダの初期化に問題がある場合は、このオプションを有効化してプライマリ デコーダ初期化失敗時に低い優先度のデコーダにフォールバックします。プライマリ デコーダ使用時よりパフォーマンスが悪化する可能性があります + この解決策は直接コーデックをサーフェスに設定する代わりに、サーフェスが変更された際に映像コーデックを開放し再インスタンス化します。すでにいくつかのデバイスでこの解決策が使用されていますが、Android 6 以降でのみ機能します +\n +\nこのオプションを有効化することでプレイヤーを切り替えたり、フルスクリーンに切り替えたりする際の再生エラーを防ぎます + 読み込み間隔を変更します。(現在 %s)この値を小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です + オーディオトラックは既にこのせせらぎに存在している必要があります + メインタブの場所 + メインタブセレクタを下に移動 + %1$s %2$s + お使いのデバイスのモデルではメディアトンネリングがサポートされていないため、このデバイスではメディアトンネリングがデフォルトで無効になっています。 + ストリームはありません + ライブ配信はありません + 登録者 + メタ情報を読み込んでいます… + 動画 + チャンネルページに表示されるタブ + チャンネルタブ + ショート + チャンネルタブを取得する + 詳細 + アルバム + フィードを更新するときに取得するタブ。 高速モードを使用してチャンネルを更新する場合は、効果がありません。 + プレイリスト + トラック + チャンネル + ライブ + 画面の向きを切り替える + フルスクリーンに切り替える + 次のストリーム + 再生キューを開く + フォワード + 巻き戻し + リプレイ + 再生 + その他のオプション + 期間 + 前のストリーム + 品質 + + 低品質 + アバター + サブチャンネルのアバター + 画像を読み込まない + 高品質 + 中品質 + アップローダーのアバター + バナー + 画像の品質と画像を読み込むかどうかを選択して、データとメモリの使用量を削減します。 変更により、メモリ内とディスク上の画像キャッシュの両方がクリアされます — %s + サムネイル + URLリストで共有 + タイトル付きで共有 + %1$s +\n%2$s + プレイリストを共有 + プレイリスト名やビデオタイトルなどの詳細を含むプレイリスト、またはビデオURLのみのシンプルなリストとしてプレイリストを共有します + - %1$s: %2$s + + %sの返信 + + もっと見る + 表示を少なくする + 以下の通知アクションをタップして編集します。 最初の3つのアクション (再生/一時停止、前へ、次へ)はシステムによって設定されており、カスタマイズすることはできません。 + デバイスの空き容量が不足しています + バックアップと復元 + はい + いいえ + NewPipe は定期的に新しいバージョンを自動的にチェックし、更新可能になると通知します。 +\n有効にしますか? + 設定をリセット + 全ての設定をデフォルト状態にリセットします + 全ての設定をリセットすると、優先設定が全て破棄され、アプリが再起動します。 +\n +\n続行しますか? + インポートされているエクスポートの設定は、NewPipe 0.27.0以降は非推奨であった脆弱な形式を使用します。 インポートされているエクスポートは信頼できる情報源からであり、将来的にはNewPipe 0.27.0かこれより新しいバージョンから得られるエクスポートのみを優先して使用します。 この脆弱な形式で設定をインポートするための対応はすぐに完全に削除され、新しいバージョンからエクスポートの設定をインポートすることは出来ません。 \ 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..7f71a2f4188 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -6,18 +6,13 @@ 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 Busak kabeh sampah ora kanggo - Pateni ben gambar cilik ora ketok, ora boros data lan memori. Iku bakal ngresiki sampah gambar. Sampah gambar wes resik Pateni gawe ngumpetke komentar Duduhke komentar - Duduhke gambar cilik Durasi cepet maju/mundure Eling-eling ukuran lan posisi ngambang terakhir Eling-eling ukuran lan posisi ngambang diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 1d5d42cace7..ecb2a8495b7 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,17 @@ გააგრძელეთ დაკვრა გააგრძელეთ დაკვრა შეფერხებების შემდეგ (მაგ. სატელეფონო ზარები დაიწყეთ მთავარი მოთამაშე სრულ ეკრანზე - "URL-ის ამოცნობა ვერ მოხერხდა. სხვა აპით გახსნა\?" + URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით\? ნაგულისხმევი აუდიო ფორმატი აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები დაკვრის დატვირთვის ინტერვალის ზომა - "შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას" + შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას მოითხოვეთ დადასტურება რიგის გასუფთავებამდე - "არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს" + არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა ერთი მოთამაშიდან მეორეზე გადართვამ შესაძლოა შეცვალოს თქვენი რიგი - გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება ძიების შეთავაზებები წაშალეთ ყველა ქეშირებული ვებგვერდის მონაცემები - გამოიყენეთ ჟესტები მოთამაშის ხმის გასაკონტროლებლად შემდეგი ნაკადის ავტომატური შეყვანა გააგრძელეთ დაკვრის რიგის (არაგანმეორებადი) დასრულება შესაბამისი ნაკადის დამატებით მეტამონაცემების ქეში წაშლილია @@ -58,14 +56,14 @@ ჩამოტვირთვა თვალყური ადევნეთ ნანახ ვიდეოებს არ დაიწყოთ ვიდეოები მინი პლეერში, არამედ პირდაპირ გადადით სრულეკრანიან რეჟიმში, თუ ავტომატური როტაცია დაბლოკილია. თქვენ კვლავ შეგიძლიათ მინი პლეერზე წვდომა სრულეკრანიდან გასვლით - დასაწყებად შეეხეთ გამადიდებელ შუშას. - გამოქვეყნდა%1$s - დაინსტალირება + დასაწყებად შეეხეთ გამადიდებელს. + გამოქვეყნების თარიღი: %1$s + დაყენება კარგი - გახსენით ბრაუზერში + გახსენი ვებგვერდად მონიშნეთ ნანახად - გახსენით popup რეჟიმში - გახსნა როგორც + გახსენი ამომხტარ მდგომარეობაში + გახსენი რაღაცით გაზიარება გადმოწერა ნაკადის ფაილი ჩამოტვირთვა @@ -84,12 +82,12 @@ გამოწერები ფონი ამომხტარი ფანჯარა - დამატება: + დამატება ვიდეოს ჩამოტვირთვის საქაღალდე გადმოწერილი ვიდეო ფაილები ინახება აქ აუდიოს ჩამოტვირთვის საქაღალდე უფრო მაღალი რეზოლუციის ჩვენება - დააინსტალიროთ დაკარგული Kore აპი\? + დავაყენო აუცილებელი Kore აპი\? აჩვენეთ \"დაუკარი კოდით\" ვარიანტი აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით @@ -108,7 +106,6 @@ შავი დამახსოვრება ამომხტარი ფანჯრის თვისებები აქტიური მოთამაშის რიგი შეიცვლება - ჩატვირთეთ ესკიზები კომენტარების ჩვენება გამორთეთ კომენტარების დასამალად \"შემდეგი\" და \"მსგავსი\" ვიდეოების ჩვენება @@ -116,18 +113,15 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - ხმის ჟესტების კონტროლი - სიკაშკაშის ჟესტების კონტროლი - გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად ნახვის ისტორია განაახლეთ დაკვრა აღადგინეთ დაკვრის ბოლო პოზიცია Ავტომატური ჩართვა - აჩვენეთ წვერი \"შეაჩერე რიგში\". + აჩვენეთ წვერი \"შეაჩერე რიგში\" რჩევის ჩვენება ფონზე ან ამომხტარ ღილაკზე დაჭერისას ვიდეოში \"დეტალები:\" URL მხარდაუჭერელია - ნაგულისხმევი კონტენტის ქვეყანა + ჩანაწერის სასურველი ქვეყანა ნაგულისხმევი შინაარსის ენა PeerTube-ის შემთხვევები იპოვეთ თქვენთვის სასურველი შემთხვევები %s-ზე @@ -145,9 +139,9 @@ მიმდინარე დამკვრელი ნაკადის შეტყობინების კონფიგურაცია ვუკრავ ფონზე ვუკრავ ამომხტარი ფანჯარაში - კონტენტი - ასაკით შეზღუდული კონტენტის ჩვენება - ბავშვებისთვის შესაძლოა შეუფერებელი კონტენტის ჩვენება, რადგან მას აქვს ასაკობრივი ზღვარი (როგორიცაა 18+) + მასალა + მაჩვენე ასაკით შეზღუდული მასალა + მაჩვენე ბავშვებისთვის შეუფერებელი მასალა (თუნდაც 18 წლის ქვევით შეზღუდული) YouTube გთავაზობთ „შეზღუდულ რეჟიმს“, რომელიც მალავს პოტენციურად ზრდასრულთა კონტენტს ჩამოტვირთვები ჩამოტვირთვები @@ -201,9 +195,8 @@ გარე მეხსიერება მიუწვდომელია Ქსელის შეცდომა ყველა ესკიზის ჩატვირთვა ვერ მოხერხდა - ვიდეოს URL-ის ხელმოწერის დებფუსირება ვერ მოხერხდა ვებსაიტის გარჩევა ვერ მოხერხდა - კონტენტი მიუწვდომელია + მასალა ხელმიუწვდომელია ჩამოტვირთვის მენიუს დაყენება ვერ მოხერხდა აპი/UI გათიშულია ამ ნაკადის დაკვრა ვერ მოხერხდა @@ -223,7 +216,7 @@ NewPipe-ს შეექმნა შეცდომა, შეეხეთ შეტყობინებისთვის მოხდა შეცდომა, იხილეთ შეტყობინება უკაცრავად, ეს არ უნდა მომხდარიყო. - შეატყობინეთ ამ შეცდომის შესახებ ელფოსტით + ელფოსტით შეტყობინება დააკოპირეთ ფორმატირებული ანგარიში მოხსენება GitHub-ზე Ბოდიში, რაღაც არ არის რიგზე. @@ -292,13 +285,14 @@ ჰეშის გაანგარიშება გთხოვთ მოიცადოთ… კოპირებულია ბუფერში - ეს ნებართვა საჭიროა ამომხტარი ფანჯრის რეჟიმში გასახსნელად + ეს უფლება აუცილებელია +\nმხტუნარა რეჟიმში გასახსნელად 1 ელემენტი წაიშალა. reCAPTCHA გამოწვევა როდესაც მოგვარდება, დააჭირეთ შესრულებულია მოთხოვნილია reCAPTCHA გამოწვევა ამოხსნა - შესრულებულია + შესრულებულია შემცვლელი პერსონაჟი ასოები და ციფრები NewPipe-ის შესახებ @@ -312,8 +306,8 @@ საიტი ეწვიეთ NewPipe ვებსაიტს დამატებითი ინფორმაციისა და სიახლეებისთვის. NewPipe-ის კონფიდენციალურობის პოლიტიკა - "NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. -\n NewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას." + NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. +\nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას. წაიკითხეთ კონფიდენციალურობის პოლიტიკა NewPipe-ის ლიცენზია წაიკითხეთ ლიცენზია @@ -324,7 +318,7 @@ ისტორია გსურთ წაშალოთ ეს ელემენტი ძიების ისტორიიდან\? ბოლოს დაუკრა - უმეტესად დაკვრილი + ხშირად დაკრული მთავარი გვერდის შინაარსი რა ჩანართებია ნაჩვენები მთავარ გვერდზე გადაფურცლეთ ელემენტები მათი ამოსაშლელად @@ -364,7 +358,7 @@ ფონური დამკვრელი ამომხტარი დამკვრელი ყოველთვის იკითხე - მოთხოვნილი კონტენტის ჩატვირთვა + მოთხოვნილი მასალა მზადდება გადარქმევა სახელი დასაკრავ სიაში დამატება @@ -432,7 +426,7 @@ ნებისმიერი ქსელი განახლებები მაჩვენე შეტყობინება აპის განახლების მოთხოვნით, როდესაც ხელმისაწვდომი იქნება ახალი ვერსია - Შეამოწმოთ განახლებები + Შეამოწმოთ განახლებები ხელით შეამოწმეთ ახალი ვერსიები მინიმიზაცია აპის გადამრთველზე მოქმედება სხვა აპზე გადასვლისას მთავარი ვიდეო დამკვრელიდან — %s @@ -467,7 +461,7 @@ სერვერი არ იღებს მრავალ ნაკადის ჩამოტვირთვებს, ხელახლა სცადეთ @string/msg_threads = 1 არ მოიძებნა შემდგომი დამუშავება ვერ მოხერხდა - მოწყობილობაზე არ არის დარჩენილი თავისუფალი ადგილი + მოწყობილობაზე არ არის დარჩენილი თავისუფალი ადგილი Კავშირის დრო ამოიწურა ამ ჩამოტვირთვის აღდგენა შეუძლებელია გადმოწერილი ფაილების წაშლა @@ -539,8 +533,6 @@ მიიღეთ გამოყოფილი არხიდან, როცა ხელმისაწვდომია ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა - ნანახი ნივთების ჩვენება - ნანახი ნივთების დამალვა ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. @@ -554,11 +546,11 @@ თქვენს მოწყობილობაზე არცერთ აპლიკაციას არ შეუძლია ამის გახსნა ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ Storage Access Framework თავსებადი ფაილ მენეჯერი - ეს კონტენტი მიუწვდომელია თქვენს ქვეყანაში. - ეს კონტენტი პირადია, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. + ეს ხელმიუწვდომელია თქვენი ქვეყნიდან. + ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია. ანგარიში შეწყვეტილია - %s იძლევა ამ მიზეზს - ეს კონტენტი ხელმისაწვდომია მხოლოდ მომხმარებლებისთვის, რომლებმაც გადაიხადეს, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. + %s იძლევა ამ მიზეზს: + ეს მასალა ხელმისაწვდომია მხოლოდ გადამხდელებისთვის, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია. გამორჩეული რადიო აირჩიეთ თქვენი საყვარელი ღამის თემა — %s @@ -572,7 +564,6 @@ Ასაკობრივი შეზღუდვა Ენა მასპინძელი - მინიატურების URL საჯარო დამალული პირადი @@ -595,14 +586,13 @@ აირჩიეთ ხარისხი გარე დამკვრელებისთვის უცნობი ფორმატი უცნობი ხარისხი - მომავალი ელემენტების ჩვენება - სამომავლო ნივთების დამალვა დალაგება ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა ჩართეთ YouTube-ის „შეზღუდული რეჟიმი“ - "ეს ვიდეო ასაკობრივი შეზღუდულია. -\n თუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში." + ეს ვიდეო ასაკობრივი შეზღუდულია. +\n +\nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში. ლაივი ეს ვიდეო ასაკობრივად შეზღუდულია. \n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას. @@ -619,7 +609,7 @@ გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები - რა:\\nმოითხოვეთ:\\შინაარსის ენა:\\nშინაარსის ქვეყანა:\\nაპლიკაციის ენა:\\nმომსახურება:\\nGMT დრო:\\პაკეტი:\\ვერსია:\\nOS ვერსია: + რა:\\nმოითხოვეთ:\\nშემცველობის ენა:\\nშემცველობის ქვეყანა:\\nაპლიკაციის ენა:\\nსერვისი:\\nGMT დრო:\\nპაკეტი:\\nვერსია:\\nOS ვერსია: ამტვირთველის ავატარის ესკიზი კომენტარები გამორთულია Შექმნა @@ -633,7 +623,6 @@ დაშვებული სიმბოლოები ფაილის სახელებში არასწორი სიმბოლოები ჩანაცვლებულია ამ მნიშვნელობით შესახებ & ხშირად დასმული კითხვები - ამ ფაილის დასაკრავად აპი არ არის დაინსტალირებული მესამე მხარის ლიცენზიები © %1$s მიერ %2$s %3$s-ის ქვეშ NewPipe შემუშავებულია მოხალისეების მიერ, რომლებიც ატარებენ თავისუფალ დროს და მოგაქვთ საუკეთესო მომხმარებლის გამოცდილება. დაეხმარეთ დეველოპერებს, გააუმჯობესონ NewPipe, სანამ ფინჯანი ყავით ტკბებიან. @@ -645,7 +634,7 @@ \n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“ \n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ \n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი -\n 7. [თუ .zip-ის იმპორტი ვერ მოხერხდა] ამოიღეთ. +\n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ მოედანი ახალი ნაკადების შეტყობინებები მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ. @@ -689,7 +678,7 @@ დამუშავება… შეიძლება რამდენიმე წუთი დასჭირდეს წაშალოთ ეს დასაკრავი სია\? მეხსიერების გაჟონვის ჩვენება - აღდგენა. + აღდგენა რიგი გამოწერების იმპორტი ვერ მოხერხდა შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს @@ -699,7 +688,7 @@ „%s“-ის არხის ჩატვირთვა ვერ მოხერხდა. ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი) გამოიყენეთ ესკიზი როგორც ჩაკეტილი ეკრანის ფონისთვის, ასევე შეტყობინებებისთვის - "როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). + როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). \n \n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას: \n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია. @@ -709,7 +698,7 @@ \n \n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით. \n -\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია." +\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია. ეს არის SoundCloud Go+ სიმღერა, ყოველ შემთხვევაში თქვენს ქვეყანაში, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \'%s\' ჩამოტვირთვის პარამეტრებში @@ -719,4 +708,38 @@ ახლა შეგიძლიათ აირჩიოთ ტექსტი აღწერილობაში. გაითვალისწინეთ, რომ გვერდი შეიძლება ციმციმდეს და ბმულები არ იყოს დაწკაპუნებული შერჩევის რეჟიმში. მხარდაჭერა აუდიო ნაკადები არ არის ხელმისაწვდომი გარე დამკვრელებისთვის + მარცხენა ჟესტის ქმედება + მარჯვენა ჟესტის ქმედება + სიკაშკაშე + ბუფერში კოპირების შეცდომა + ბარათი + გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან\? + ასლი დამატებულია %d-ჯერ + %s-ის გადმოსაწერად დაატყაპუნეთ + აპარატურული მედია ღილაკების მოვლენების გამოტოვება + ნაკადების ჩვენება/დამალვა + შემდეგი ნაკადების ჩვენება + სრულად ნანახი + ეს პარამეტრი ხელმისაწვდომია მხოლოდ როცა თემისთვის %s-ა მონიშნული + სასარგებლოა, მაგალითად, თუ იყენებთ ყურსაცვამდებს, რომლის ფიზიკური ღილაკებიც დაზიანებულია + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარცხენა ნახევრისთვის + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარჯვენა ნახევრისთვის + არაფერი + სწრაფი რეჟიმი + მომავალი + ხმა + ხელმისაწვდომია NewPipe-ის განახლება! + გამოწერების შეტანა/გამოტანა სამწერტილიანი მენიუდან + განაცრისფერებული დასაკრავი სიები ამ ელემენტს უკვე შეიცავენ. + თქვენი NewPipe-ის ვერსია უახლესია + დუბლიკატების წაშლა + მუდმივი მინიატურის მოხსნა + წავშალო დუბლიკატები\? + ნაწილობრივ ნანახი + მზადდება ზედაპირული მახასიათებლები… + თავდაპირველი ხმის ჩანაწერი აირჩიე ენის მიუხედავად + აირჩიე მხედველობადაქვეითებულებისათვის დახასიათებული ხმის ჩანაწერი, თუ არის + არჩიე თავდაპირველი ხმის ჩანაწერი + ხმა: %s + ხმის ჩანაწერი \ No newline at end of file diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index ed4ef0f3b9a..4c40518a976 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -69,7 +69,7 @@ Iẓiki Immed Adigan - Immed + Immed Wennez Snulfu-d Qbel diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index a6b3daec935..c248c35f4e7 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -1,2 +1,7 @@ - \ No newline at end of file + + Бастау үшін үлкейткіш әйнекті басыңыз. + %1$s жарияланды + Ағындық ойнатқыш табылмады (оны ойнату үшін VLC орнатуға болады). + Ағындық ойнатқыш табылмады. VLC орнату керек пе\? + \ 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 f2baecb0a54..b55be410d6a 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -98,7 +98,6 @@ Menuya dakêşanê nehat saz kirin Naverok tune Malperê nekare parsek bike - Nekarî îmzeya URL-ya vîdyoyê deobfuscate bike Nekarî hemî wêneyan barkir Çewtiya torê Dakêşandin ji karta SD ya derveyî re ne gengaz e. Cihê peldanka dakêşanê ji nû ve were çêkirin\? @@ -228,10 +227,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 @@ -246,8 +241,6 @@ Vîdyoyên \'Pêş\' û \'Bi vî rengî\' nîşan bidin Zivirandin da ku şîroveyan veşêrin Şîroveyan nîşan bide - Ji bo pêşîgirtina li barkirina nîgarkêşan, daneya daneyê û karanîna bîranînê xilas bibe vemirînin. Guherandinên kaşeya wêneyê hem di bîra û hem jî li ser dîskê paqij dikin. - Nîgarên barkêş Dê rêza lîstikvanê çalak were guhertin Guhertina ji lîstikvanek bi yeke din dibe ku dewsa dorê we bigire Berî paqijkirina dorê ji pejirandinê bipirsin @@ -395,7 +388,7 @@ Vê dakêşanê nikare paşde bibe Dema girêdanê Pêşkeftin winda bû, ji ber ku pel hate jêbirin - Cih li cîhazê namîne + Cih li cîhazê namîne Dema ku pel dixebitî NewPipe hate girtin Pêvajoya şûnda têk çû Peyda nebû @@ -538,14 +531,13 @@ Paraxwe dayin Li Android-ê veguhastina ronahiya sivik. Derbarê NewPipe - Ji bo lîstina vê pelê tu bername nehat saz kirin Pir karakterên taybetî Name û reqem Karaktera guheztinê Karakteyên nederbasdar bi vê nirxê têne veguheztin Di navên pelan de tîpan destûr dan Dakêşînin - Kirî + Kirî reCAPTCHA dijwarî xwestin Dema ku çareser bibe \"Kirî\" çap bikin Tevlêbûnên YouTube-ê ji barkirina Google-ê bikişînin: 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..2ba73e1781f --- /dev/null +++ b/app/src/main/res/values-kn/strings.xml @@ -0,0 +1,45 @@ + + + ಗೆ ಸೇರಿಸಿ + ಮಾಹಿತಿಯನ್ನು ತೋರಿಸಿ + ಚಾನಲ್ ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಲಾಗಿದೆ + ಪಾಪ್‌ಅಪ್ ಮೋಡ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ + ನೀವು \"%1$s\" ಎಂದು ಅರ್ಥೈಸಿದ್ದೀರಾ? + ಬಳಸಿ ಹಂಚಿಕೊಳ್ಳಿ + ವೀಡಿಯೊ ಫೈಲ್‌ಗಳಿಗಾಗಿ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ + ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಲಾಗಿದೆ + ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಆಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ + ಬಾಹ್ಯ ಆಡಿಯೊ ಪ್ಲೇಯರ್ ಬಳಸಿ + ಚಂದಾದಾರಿಕೆಯನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ + ಪ್ರಾರಂಭಿಸಲು ಭೂತಗನ್ನಡಿಯನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ. + ಕೆಲವು ರೆಸಲ್ಯೂಶನ್‌ಗಳಲ್ಲಿ ಆಡಿಯೊವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ + %1$s ರಂದು ಪ್ರಕಟಿಸಲಾಗಿದೆ + ವೀಕ್ಷಿಸಲಾಗಿದೆ ಎಂದು ಗುರುತಿಸಿ + ಯಾವುದೇ ಸ್ಟ್ರೀಮ್ ಪ್ಲೇಯರ್ ಕಂಡುಬಂದಿಲ್ಲ (ಅದನ್ನು ಪ್ಲೇ ಮಾಡಲು ನೀವು VLC ಅನ್ನು ಸ್ಥಾಪಿಸಬಹುದು). + ಸರಿ + ಬ್ರೌಸರ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ + ಪಾಪ್ಅಪ್ + ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ + ಇದಕ್ಕೆ ಫಲಿತಾಂಶಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ: %s + ಇದರೊಂದಿಗೆ ತೆರೆಯಿರಿ + ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ವೀಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ + ಸ್ಟ್ರೀಮ್ ಫೈಲ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ + ರದ್ದುಗೊಳಿಸಿ + ಆಡಿಯೋ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ + ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಲಾದ ಪ್ಲೇಪಟ್ಟಿಗಳು + ಚಂದಾದಾರಿಕೆಯನ್ನು ನವೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ + ಸಬ್‌ಸ್ಕ್ರೈಬ್ + ಹುಡುಕಿ + ಚಂದಾದಾರಿಕೆಗಳು + ಸೆಟ್ಟಿಂಗ್‌ಗಳು + ಬಾಹ್ಯ ವೀಡಿಯೊ ಪ್ಲೇಯರ್ ಬಳಸಿ + ಸ್ಥಾಪಿಸಿ + ಯಾವುದೇ ಸ್ಟ್ರೀಮ್ ಪ್ಲೇಯರ್ ಕಂಡುಬಂದಿಲ್ಲ. VLC ಸ್ಥಾಪಿಸುವುದೇ? + ಶೇರ್ ಮಾಡಿ + ವೀಡಿಯೊ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ + ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಿ + ಹಿನ್ನೆಲೆ + ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಿ + ಹೌದು + ಇಲ್ಲ + \ 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 d7503a94122..17eb5fb05c9 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 앱이 발견되지 않았습니다. Kore를 설치할까요\? + 누락된 Kore 앱을 설치하겠습니까\? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -36,8 +36,8 @@ 다운로드된 오디오 파일이 이 곳에 저장됩니다 오디오 파일이 다운로드 될 폴더를 선택하세요 테마 - 어두운 테마 - 밝은 테마 + 다크 테마 + 라이트 테마 외관 백그라운드에서 재생 중 네트워크 오류 @@ -47,12 +47,11 @@ 라이브 오류 모든 썸네일을 불러올 수 없습니다 - 비디오 URL 서명을 복호화할 수 없습니다 웹사이트를 가져올 수 없습니다 컨텐츠를 사용할 수 없습니다 다운로드 메뉴를 설정할 수 없습니다 죄송합니다. 오류가 발생했습니다. - 이메일을 통해 이 오류 보고 + 이메일을 통해 보고 죄송합니다. 문제가 발생했습니다. 보고 정보: @@ -64,7 +63,7 @@ 재시도 다운로드 다운로드 - 재생 + 시작 일시정지 삭제 체크섬 @@ -73,9 +72,9 @@ 구독 구독중 구독 취소됨 - 구독을 변경할 수 없습니다 + 구독을 변경할 수 없음 구독을 업데이트할 수 없음 - 구독 + 구독목록 새로운 영상 백그라운드 팝업 @@ -83,7 +82,7 @@ 높은 해상도 표시 일부 기기에서만 2K/4K 해상도 재생이 지원됩니다 기본 비디오 형식 - 검은 테마 + 블랙 테마 팝업 크기 및 위치 기억 마지막으로 사용한 팝업 위치 및 크기를 기억합니다 검색 제안 @@ -131,7 +130,7 @@ 비디오 없음 OK 파일명 - 쓰레드 + 스레드 오류 NewPipe 다운로드 중 터치해서 상세 정보 확인 @@ -150,7 +149,7 @@ NewPipe에 대해서 제3자 라이센스 © %3$s 하에서 %2$s 에 의한 %1$s - 정보 및 자주 묻는 질문들 + 정보 및 자주 묻는 질문 라이센스 가볍고 빠른 자유 안드로이드 스트리밍 앱입니다. 기여 @@ -181,16 +180,16 @@ 오디오 설정 눌러서 대기열에 추가 백그라운드에서 재생 - 팝업에서 재생 시작 + 팝업으로 재생 스트림 플레이어를 찾을 수 없습니다 (VLC를 설치하여 동영상을 재생할 수 있습니다). 스트림 파일 다운로드하기 정보 보기 재생목록 북마크 이곳에 추가 - 정확하지는 않지만 빠른 탐색 - 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다. 5, 15 또는 25초 탐색기능은 같이 동작하지 않음 - 다음 스트림을 자동 대기열에 추가 - 이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생 + 정확하지 않은 빠른 탐색 사용 + 정확하지 않은 탐색을 사용하면 정확도가 떨어지는 대신 더 빠르게 위치를 탐색할 수 있습니다. 5초, 15초 또는 25초 탐색 기능은 이 기능과 같이 동작하지 않습니다 + 다음 스트림을 자동으로 대기열에 추가 + 관련 스트림을 추가하여 (반복되지 않는) 재생 대기열을 계속 종료 기본 콘텐츠 국가 디버그 항상 @@ -259,15 +258,15 @@ 이전 내보내기 구독 목록 가져오기 실패 구독 목록 내보내기 실패 - 구글 테이크아웃에서 유튜브 구독 가져오기: + Google 테이크아웃에서 YouTube 구독목록 가져오기: \n -\n1. 다음 URL로 이동: %1$s -\n2. 요청 시 로그인 -\n3. \"모든 데이터 포함\"을 클릭한 다음 \"모두 선택 취소\"를 클릭한 후 \"구독\"만 선택하고 \"확인\" 클릭 -\n4. \"다음 단계\"를 클릭한 다음 \"내보내기 만들기\" 클릭 -\n5. \"다운로드\" 버튼이 나타나면 클릭 -\n6. 아래 파일 가져오기를 클릭하고 다운로드한 .zip 파일 선택 -\n7. [.zip 가져오기가 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/subscriptions/subscriptions.csv\" 아래에 있음)의 압축을 풀고, 아래 파일 가져오기를 클릭하고 압축을 푼 csv 파일 선택 +\n1. 이 URL로 이동합니다: %1$s +\n2. 요청에 따라 로그인 합니다 +\n3. \"모든 데이터 포함됨\"을 클릭한 뒤, \"모두 선택 해제\"를 클릭한 후 \"구독정보\"만 선택하고 \"확인\"을 클릭합니다 +\n4. \"다음 단계\"를 클릭한 다음 \"내보내기 생성\"을 클릭합니다 +\n5. \"다운로드\" 버튼이 나타나면 클릭합니다 +\n6. 아래의 \"파일 가져오기\"를 클릭하고 다운로드한 .zip 파일을 선택합니다 +\n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/구독정보/구독정보.csv\")을 압축해제한 다음, 아래의 \"파일 가져오기\"를 클릭한 후 압축해제한 csv 파일을 선택합니다 URL 또는 ID를 입력하여 SoundCloud 프로필을 가져옵니다: \n \n1. 웹 브라우저에서 \"데스크톱 모드\"를 활성화합니다(모바일 장치에서는 사이트를 사용할 수 없습니다) @@ -278,8 +277,6 @@ 경고: 데이터가 많이 소모될 수 있습니다. \n \n계속하시겠습니까\? - 썸네일 로드하기 - 동영상 썸네일을 로드하지 않으며, 데이터와 메모리 사용을 최대한 줄입니다. 이 옵션을 선택 시 모든 메모리 캐시와 저장소 캐시를 삭제합니다 이미지 캐시 지워짐 캐시된 메타데이터 지우기 캐시된 모든 웹페이지 데이터 지우기 @@ -289,7 +286,6 @@ 피치 영상과 소리 분리 (왜곡이 발생할 수 있음) 다운로드 가능한 스트림이 없습니다 - 이 파일을 재생할 수 있는 플레이어 앱이 없습니다 선호하는 열기 동작 컨텐츠를 열 때 사용할 기본 동작 — %s 자막 @@ -319,10 +315,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처 음량 조작 - 제스처를 사용하여 재생기 볼륨 제어하기 - 제스처 밝기 조작 - 제스처를 사용하여 플레이어 밝기 제어 업데이트 트랙 사용자 @@ -340,8 +332,8 @@ 팝업 플레이어로 최소화 단계 초기화 - 저장된 탭을 읽을 수 없으므로, 기본 탭을 사용합니다 - 초기화 + 저장된 탭을 불러올 수 없었으므로, 기본 탭을 사용합니다 + 기본설정으로 되돌리기 초기 설정으로 복원하시겠습니까\? 구독자 수를 가져올 수 없습니다 메인 화면에 표시할 탭을 설정합니다 @@ -387,7 +379,7 @@ 댓글 없음 댓글을 불러올 수 없음 닫기 - 재생 재개 + 재생 위치 기억 마지막 재생 위치부터 재생 리스트 내 위치 표시 리스트에서 재생 위치를 표시합니다 @@ -397,7 +389,7 @@ 파일을 덮어쓰기할 수 없습니다 해당 이름으로 대기된 다운로드가 있습니다 파일 작업 중에 Newpipe가 종료되었습니다 - 남은 저장공간이 없습니다 + 남은 저장공간이 없습니다 파일이 삭제되어 진행이 중지되었습니다 연결시간 초과 모든 다운로드 기록과 파일을 삭제합니다.확실합니까\? @@ -467,7 +459,7 @@ 이 비디오는 연령제한이 있습니다. \n \n만약, 시청을 원한다면 설정에 \"%1$s\"를 활성화 하세요. - 완료 + 완료 아티스트 앨범 비디오 @@ -481,16 +473,16 @@ 썸네일 보기 그룹 이름이 없음 - %d 일 + %d일 - %d 시간 + %d시간 - %d 분 + %d분 - %d 초 + %d초 시청 기록을 지우겠습니까\? 시청 기록 지우기 @@ -511,10 +503,10 @@ 시청한 것으로 처리 비활성화하면 비디오 설명과 추가 정보를 표시하지 않습니다 설명 표시하기 - 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있음 + 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있습니다 어두운 테마 - 최대 3개까지 축소 알림에 표시될 항목을 고를 수 있습니다! - 아래의 각 알림 작업을 눌러 편집하세요. 오른쪽에 있는 확인란을 사용하여 압축 알림에 표시할 항목을 최대 3개까지 선택 + 축소된 알림에서 최대 3개까지 표시될 항목을 고를 수 있습니다! + 아래의 각 알림 동작을 탭하여 편집합니다. 오른쪽의 체크박스를 사용하여 최대 3개까지 선택하여 압축 알림에 표시합니다. YouTube의 \'제한 모드\' 켜기 비디오 해싱 진행 알림 새로운 스트림 @@ -523,7 +515,7 @@ reCAPTCHA 쿠키를 비웠습니다 플레이어 알림 알림 - 유튜브는 잔인할 수 있는 컨텐츠를 숨겨주는 \"제한 모드\"를 제공합니다 + YouTube는 잠재적으로 성인용 콘텐츠를 숨기는 \'제한 모드\'를 제공합니다 reCAPTCHA 쿠키 비우기 플레이어 크래시 발생 존재하지 않음 @@ -533,7 +525,7 @@ 다음에 대기열에 추가됨 다음 대기열에 넣기 현재 재생 중인 스트림 알림 구성 - 연령 제한(예: 18세 이상)이 있으므로 어린이에게 적합하지 않을 수 있는 콘텐츠 표시 + 연령 제한(예: 18세 이상)이 있어 어린이에게 적합하지 않을 수 있는 콘텐츠 표시 오류 보고 알림 NewPipe에 오류가 발생했습니다. 보고하려면 탭하세요 오류가 발생했습니다. 알림을 참조하세요 @@ -552,7 +544,7 @@ 스트림 세부정보 불러오는 중… 미디어 터널링 비활성화 서비스의 원본 텍스트가 스트림 항목에 표시됩니다 - 비디오 재생 시 검은색 화면이나 끊김 현상이 발생하는 경우 미디어 터널링을 비활성화합니다 + 동영상 재생 시 검은 화면이 나타나거나 끊김 현상이 발생하면 미디어 터널링을 비활성화하세요. 이미지 표시기 표시 원본을 나타내는 이미지 위에 피카소 컬러 리본 표시: 네트워크는 빨간색, 디스크는 파란색, 메모리는 녹색 \"플레이어 충돌\" 표시 @@ -562,17 +554,17 @@ 오류 스낵바 표시 새로운 스트림 알림 구독에서 새로운 스트림에 대해 알림 - 주파수 확인 + 확인 빈도 필요한 네트워크 연결 모든 네트워크 - 업데이트 확인 + 업데이트 확인 새로운 버전을 수동으로 확인 자동으로 재생 시작 — %s Wi-Fi에서만 - 절대 + 사용하지 않음 탐색막대 썸네일 미리보기 고품질 (크게) - 저품질 (작음) + 저품질 (작게) 표시하지 않음 업데이트 확인 중… 디스크에서 다운로드한 모든 파일을 지우겠습니까\? @@ -589,14 +581,13 @@ 지역 검색 제안 원격 검색 제안 이 동영상은 연령 제한이 있습니다. -\n연령 제한 동영상에 대한 새로운 유튜브 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다. +\n연령 제한 동영상에 대한 새로운 YouTube 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다. reCAPTCHA를 해결할 때 NewPipe가 저장하는 쿠키 지우기 설명 - 코멘트 + 댓글 해결 잠금 화면 배경과 알림 모두에 썸네일 사용 선택한 구독이 없습니다 - 시청 항목 표시 자동 대기열에 추가 %s 다운로드 완료 @@ -605,8 +596,8 @@ 예, 부분적으로 본 비디오 카테고리 %s에 의해 - 아래에서 좋아하는 밤 테마를 선택할 수 있습니다 - 이 영상은 유튜브 뮤직 프리미엄 회원만 볼 수 있어 뉴파이프에서 스트리밍이나 다운로드가 불가능합니다. + 아래에서 선호하는 어두운 테마를 선택할 수 있습니다 + 이 영상은 YouTube Music Premium 회원만 볼 수 있기 때문에 NewPipe에서 스트리밍이나 다운로드가 불가능합니다. 이 콘텐츠는 비공개이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다. 내부 처리 중... 시간이 걸릴 수 있습니다 @@ -628,12 +619,11 @@ 지원 언어 연령 제한 - 개인 + 공개상태 라이센스 창작자의 마음 - 개인 + 비공개 비공개 - 썸네일 URL 호스트 이제 이 채널을 구독했습니다 알림 받기 @@ -656,7 +646,7 @@ 빠른 모드 활성화 %s에 의해 제작 채널의 아바타 썸네일 - + 챕터 최근 계정이 해지됨 %s은(는) 다음과 같은 이유를 제공: @@ -664,12 +654,11 @@ 자동 (장치 테마) 고정된 댓글 추천 - 향후 항목 표시하기 알 수 없는 형식 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 스트림 작성자, 스트림 콘텐츠 또는 검색 요청에 대한 추가 정보가 있는 메타 정보 상자를 숨기려면 끄세요 - 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 비디오 로딩 속도가 빨라질 수 있습니다. 변경하려면 플레이어를 다시 시작해야 합니다 + 프로그레시브 콘텐츠의 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 로딩 속도가 빨라질 수 있음 충돌에 대해 논의하는 문제가 이미 존재하는지 확인하세요. 중복 티켓을 생성할 때 실제 버그를 수정하는 데 시간을 할애할 수 있습니다. 오류 알림 생성 구독 선택 @@ -677,36 +666,149 @@ 안드로이드 10부터 \'저장영역 접속 프레임워크\'만 지원됩니다 재생 목록에 추가되기 전과 후에 시청한 동영상은 제거됩니다. \n확실합니까\? 이것은 취소 할 수 없습니다! - 미니 플레이어에서 동영상을 시작하지 말고 자동 회전이 잠겨 있는 경우 전체 화면 모드로 직접 전환하십시오. 전체 화면을 종료하여 미니 플레이어에 계속 접속할 수 있습니다 + 화면 자동 회전이 잠겨 있는 경우 미니 플레이어에서 동영상을 시작하지 말고 바로 전체 화면 모드로 재생하세요. 전체 화면을 종료해서 미니 플레이어를 이용할 수도 있습니다 공식 라디오 설명에서 텍스트 선택 활성화 이 콘텐츠는 귀하의 국가에서 사용할 수 없습니다. - 좋아하는 밤 테마 선택 — %s + 선호하는 어두운 테마 선택 — %s 다운로드가 시작되었습니다 이제 설명 내에서 텍스트를 선택할 수 있습니다. 선택 모드에서는 페이지가 깜박이고 링크를 클릭할 수 없는 경우가 있습니다. 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. \n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. \n파일 관리자를 설치하거나 다운로드 설정에서 \'%s\'을(를) 비활성화하십시오 - 피드 로딩이 너무 느리다고 생각하십니까\? 그렇다면 빠른 로딩을 활성화해 보십시오 (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다). + 피드 로딩이 너무 느리다고 생각하시나요\? 그렇다면 빠른 로딩을 활성화해 보세요. (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다) \n \nNewPipe는 두 가지 피드 로딩 전략을 제공합니다: -\n• 느리지만 완전한 전체 구독 채널을 가져옵니다. -\n• 빠르지만 일반적으로 완전하지는 않은 전용 서비스 엔드포인트를 사용합니다. +\n• 전체 구독 채널 가져오기: 느리지만 완전합니다. +\n• 전용 서비스 엔드포인트 사용: 빠르지만 일반적으로 완전하지 않습니다. \n -\n둘의 차이점은 빠른 동영상은 일반적으로 항목의 길이나 유형(라이브 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 것입니다. +\n이 두 가지의 차이점은 빠른 방식이 일반적으로 항목의 길이나 유형(실시간 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 점입니다. \n -\n유튜브는 RSS 피드로 이 빠른 방법을 제공하는 서비스의 한 예입니다. +\nYouTube는 RSS 피드를 통해 이 빠른 방법을 제공하는 서비스의 예입니다. \n -\n따라서 선택은 속도 또는 정확한 정보 중에서 선호하는 것으로 귀결됩니다. +\n따라서 선택은 속도와 정확한 정보 중 무엇을 선호하느냐에 달려 있습니다. 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. - 감시한 항목 숨기기 - 향후 항목 숨기기 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 웹사이트에서 보기 정렬 + 빠른 모드 + 점 3개 메뉴에서 구독 가져오기 또는 내보내기 + 최신 버전의 NewPipe를 실행 중입니다 + %s를 다운로드하려면 탭하세요 + 영구 썸네일 설정 해제 + 이 옵션은 %s가 테마로 선택되었을 경우에만 사용할 수 있습니다 + 중복 추가 %d 번 + 회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다. + 카드 + 클립보드 복사 실패 + 복제 삭제 + 복제를 삭제하시겠습니까\? + 이 재생목록의 모든 스트림 복사본을 삭제하겠습니까\? + 다음 스트림 표시 + 부분적 시청 + 완전 시청 + 예정 + 하드웨어 미디어 버튼 이벤트 무시 + 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 + 스트림 보이기/숨기기 + 플레이어 화면 왼쪽 절반에 대한 제스처 선택 + 원본 오디오 선호 + 언어에 관계없이 원본 오디오 트랙 선택 + 가능한 경우 시각 장애인을 위한 설명이 포함된 오디오 트랙 선택 + 설명이 포함된 오디오 선호 + 플레이어 화면 오른쪽 절반에 대한 제스처 선택 + 오른쪽 제스처 동작 + 밝기 + 왼쪽 제스처 동작 + 볼륨 + 없음 + 오디오: %s + 오디오 트랙 + 이 스트림에 오디오 트랙이 이미 존재해야 함 + 외부 플레이어용 오디오 트랙 선택 + 알 수 없음 + ExoPlayer 설정 + ExoPlayer 설정을 관리합니다. 이러한 변경 사항을 적용하려면 플레이어를 다시 시작해야 함 + ExoPlayer의 디코더 폴백 기능 사용 + 항상 ExoPlayer의 비디오 출력 표면 설정 해결 방법 사용 + 원본 + 더빙됨 + 설명 + 디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음 + 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 +\n +\n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 + 메인 탭 선택기를 하단으로 이동 + %1$s %2$s + 메인 탭 위치 + 장치 모델에서 미디어 터널링을 지원하지 않는 것으로 알려져 있기 때문에 장치에서 기본적으로 미디어 터널링이 비활성화되었습니다. + 이미지 품질 + 동영상 + \? + 구독자 + 채널 페이지에 표시되는 탭 + URL 목록 공유 + 타이틀로 공유 + %1$s +\n%2$s + 채널 탭 + 쇼츠 + 메타데이터 불러오기 중… + 화면 방향 전환 + 낮은 품질 + 전체화면 전환 + 채널 탭 가져오기 + 아바타 + 다음 스트림 + 하위 채널 아바타 + 재생 대기열 열기 + 이미지를 불러오지 마세요 + 높은 품질 + 정보 + 재생목록 공유 + 앞으로 + 앨범 + 되감기 + 다시 재생 + 피드를 업데이트할 때 가져올 탭입니다. 빠른 모드를 사용하여 채널을 업데이트하는 경우 이 옵션은 효과가 없습니다. + 재생목록 이름, 동영상 제목 등의 세부정보 또는 간단한 동영상 URL 목록으로 재생목록을 공유하세요 + 중간 품질 + 업로더 아바타 + 배너 + 재생목록 + - %1$s: %2$s + 실시간 스트림 없음 + 데이터 및 메모리 사용량을 줄이기 위해 이미지 품질과 이미지 불러오기 여부를 선택하세요. 변경 사항이 메모리 내 및 디스크 내 이미지 캐시를 모두 지움 — %s + 재생 + 추가 옵션 + 썸네일 + 트랙 + 지속 + 스트림 없음 + 채널 + 이전 스트림 + 실시간 + 아래의 각 알림 작업을 탭하여 편집하세요. 처음 세 가지 작업(재생/일시 중지, 이전 및 다음)은 시스템에 의해 설정되며 사용자 정의할 수 없습니다. + 더보기 + 아니오 + 기기에 저장공간이 충분하지 않습니다 + 덜보기 + 백업 및 복원 + NewPipe에서 자동으로 새 버전을 확인하고 업데이트가 있으면 알려줍니다. +\n이 기능을 켜시겠습니까? + 모든 설정을 초기화하면 설정해둔 사항이 모두 삭제되며 앱을 다시 시작합니다. +\n +\n정말 계속하시겠습니까? + 가져오려는 설정 파일이 NewPipe 0.27.0 이상에서는 권장하지 않는 취약한 형식으로 작성되어 있습니다. 설정 파일의 출처를 신뢰할 수 있는지 꼭 확인하시기 바라며, 다음부터는 가급적 NewPipe 0.27.0 이후의 설정 파일만 이용하시기 바랍니다. 이 취약한 형식의 설정 파일은 곧 더 이상 지원되지 않으며, 오래된 버전의 NewPipe에서 새 버전의 설정 파일을 가져오는 것도 불가능해질 예정입니다. + + 답글 %s개 + + + 설정 초기화 + 모든 설정을 기본값으로 초기화 \ 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 c7dfd05d2bb..cc59938b43a 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -53,9 +53,6 @@ ڕه‌ش بیرهاتنه‌وه‌ی شوێن و قه‌باره‌ی په‌نجه‌ره‌ بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ی بچووك - باركردنی وێنۆچكه‌كان - ناچالاكی بكه‌ بۆ ڕاگرتنی وێنۆچكه‌كان له‌ باركردن و پاشه‌كه‌وتبوون له‌سه‌ر بیرگه‌ی ئامێره‌كه‌ت. -\nگۆڕینی ئه‌مه‌ ده‌بێته‌ هۆی سڕینه‌وه‌یان له‌سه‌ر بیرگه‌ی مۆبایله‌كه‌ت. پاشماوه‌ی وێنۆچكه‌كان سڕایه‌وه‌ بەکارهێنانی گەڕانی ناوردی خێرا خاوێنکردنەوەی پاشماوەی داتا @@ -256,7 +253,6 @@ هیچ پەخشێک نییە بۆ دابەزاندن ژێرنووسەکان بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە ئەپەکە دابخەیت و دیسانەوە بیکەیتەوە. - هیچ ئەپێک دانەمەزراوە بۆ کارپێکردنی ئەم فایلە سڕینەوەی مێژووی تەماشاکردن مێژوو دەسڕێتەوە لەگەڵ ڤیدیۆ کارپێکراوەکان و شوێنی لیستە ڤیدیۆییەکان تەواوی مێژووی تەماشاکردن بسڕدرێتەوە؟ @@ -277,10 +273,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - کۆنترۆڵی دەنگ بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان فایل سڕایەوە @@ -335,7 +327,6 @@ پیشاندانی ڕێنمایی ”داگرتن تا پاشکۆ” پیشاندانی ڕێنمایی کاتێ لە پاشبنەما یاخوود پەنجەرەدا گرتە دەکرێ لەسەر وردەکاری ڤیدیۆیەک پەرەسەندوو - ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە نەگێڕانەوەی کارپێکەر بۆ پێش کێشە ڕوویدا گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە هەمان فۆڵدەر بوونی نییە @@ -427,7 +418,7 @@ بەسوودە بۆ کاتی گۆڕینی هێڵ بۆ داتای مۆبایل, لەگەڵ ئەوەشدا زۆربەی دابەزاندنەکان ڕاناگرێت داخستن ئەپ داخرا لەکاتی کارکردن لەسەر ئەو پەڕگەیە - بیرگەی ناوەکیت پڕبووە + بیرگەی ناوەکیت پڕبووە کردارەکە شکستی هێنا, چونکە ئەو پەڕگەیە سڕاوەتەوە هێڵی ئینتەرنێت نەما ئایا دەتەوێ مێژووی دابەزاندنەکانت بسڕدرێنەوە یان هەموو فایلە دابەزێنراوەکانت بسڕدرێنەوە؟ @@ -453,7 +444,7 @@ زمانی ئەپ بنەڕەتی سیستەم گرتە بکە لەسەر ”تەواو” کاتێ کە چارەسەرکرا - تەواو + تەواو ڤیدیۆکان %d چرکە diff --git a/app/src/main/res/values-la/strings.xml b/app/src/main/res/values-la/strings.xml index 42b619efca9..16961c30b30 100644 --- a/app/src/main/res/values-la/strings.xml +++ b/app/src/main/res/values-la/strings.xml @@ -93,7 +93,7 @@ %d secundus %d secundi - Factum + Factum Quaere semper Index Nullus limus diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml index 77e18695d3e..46244b3c9c6 100644 --- a/app/src/main/res/values-land/dimens.xml +++ b/app/src/main/res/values-land/dimens.xml @@ -32,7 +32,6 @@ 16sp 14sp 14sp - 14sp 14sp 42dp diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 0da729ba823..de6417dc280 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -29,7 +29,7 @@ Rodyti didesnes raiškas Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą Groti su Kodi - Įdiegti nereastą Kore programėlę\? + Įdiegti nereastą Kode programėlę\? Rodyti „Peržiūra su Kodi“ pasirinkimą Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą Garso įrašas @@ -64,13 +64,12 @@ Klaida Tinklo klaida Negalima įkelti visų miniatiūrų - Negalima iššifruoti vaizdo įrašo skaitmeninio parašo Negalima apdoroti tinklapio Turinys neprieinamas 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: @@ -97,14 +96,14 @@ Pradėti Pauzė - Ištrinti + Naikinti Kontrolinė suma Gerai Failo pavadinimas Gijos Klaida - NewPipe Atsiunčiama - Palieskite, kad peržiūrėtumėte išsamią informaciją + NewPipe atsisiunčiama + Bakstelėkite, kad peržiūrėtumėte išsamią informaciją Prašome palaukti… Nukopijuota į iškarpinę Prašome pasirinkti galimą atsisiuntimų aplankalą @@ -190,7 +189,7 @@ Išsami informacija Garso nustatymai Laikykite, kad įtrauktumėte į eilę - Pradėti groti foniniame rėžime + Pradėti groti foniniame režime Pradėti groti langelio grotuve Nerastas srauto grotuvas (galite įdiegti VLC kad grotumėte). Parsisiųsti srauto failą @@ -212,9 +211,9 @@ Nerasta video srautų Nerasta audio srautų Tempti kad perrūšiuoti - Sukurti + Kurti Nutraukti - Pervadinti + Pervardyti Vėliausiai žiūrėta Dažniausiai žiūrėta Eksportavimas baigtas @@ -230,7 +229,7 @@ Visada klausti Gauname informaciją… Įkeliamas pasirinktas turinys - Naujas grojaraštį + Naujas grojaraštis Pervadinti Pavadinimas Pridėti į grojaraštį @@ -311,7 +310,7 @@ Pranešimas apie naują NewPipe versiją Programos atnaujinimo pranešimas Failą - Failas pašalintas + Failas panaikintas Atlikėjai Albumai Dainos @@ -341,10 +340,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ę @@ -363,7 +358,7 @@ Kraunama Maišyti Galite pasirinkit iki trijų veiksmų kompaktiškame pranešime! - Norėdami pakeisti kiekvieną pranešimo veiksmą paspauskite ant jo. Pasirinkite iki trijų norėdami kompaktiškos peržiūros + Redaguokite kiekvieną toliau pateiktą pranešimo veiksmą bakstelėdami jį. Naudodami dešinėje esančius žymimuosius langelius pasirinkite iki trijų iš jų, kurie bus rodomi kompaktiškame pranešime. Penktas veiksmo mygtukas Ketvirtas veiksmo mygtukas Trečias veiksmo mygtukas @@ -378,8 +373,6 @@ Atstatyti paskutinį atkūrimo laiką Tęsti atkūrimą Rodyti aprašymą - Norėdami taupyti duomenų srautą, atminties naudojimą išjunkite. Pakeitimai išvalys duomenis atmintyje ir diske - Įkelti miniatiūras Aktyvaus grotuvo eilė bus pakeista Perjungimas iš vieno grotuvo į kitą gali pakeisti jūsų eilę Prieš išvalant eilę prašyti patvirtinimo @@ -403,7 +396,7 @@ \n4. Nukopijuokite profilio URL, į kurį buvote nukreipti. Šis turinys prieinamas tik sumokėjusiems naudotojams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti. Šis vaizdo įrašas prieinamas tik \"YouTube Music Premium\" nariams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti. - Išjunkite medijos tuneliavimą, jei vaizdo įrašo atkūrimo metu atsiranda juodas ekranas arba užstrigimas + Išjunkite medijos tuneliavimą, jei vaizdo įrašo atkūrimo metu atsiranda juodas ekranas arba užstrigimas. Pakeiskite grotuvo subtitrų teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą Šis turinys yra privatus, todėl \"NewPipe\" jo negali transliuoti ar atsisiųsti. Ar norite išvalyti atsisiuntimų istoriją ar ištrinti visus atsisiųstus failus\? @@ -452,7 +445,7 @@ %d sekundžių Sistemos numatytoji - Kalba + Programos kalba Naudoti sistemos aplanko parinktuką (SAP) Sustabdyti siuntimus Nerasta @@ -512,8 +505,7 @@ NewPipe į jūsų privatumą žiūri labai rimtai. Programa be jūsų sutikimo nerenka jokių duomenų. \nNewPipe privatumo politika išsamiai parodo kokie duomenys siunčiami ir saugomi pranešant apie problemą. NewPipe privatumo politika - Šio failo atkūrimui nėra įdiegtos programos - Atlikta + Atlikta Išspręsta Paspauskite \"atlikta\" kai išspręsta Patikrinkite ar apie problemą su kuria susidūrėte dar nėra pranešta. Sukurdami kelis pranešimus apie tą pačią problemą atimate iš mūsų laiką kurį galėtume skirti klaidų taisymui. @@ -561,7 +553,7 @@ Elementams rodyti orginalų \"prieš\" laiką Nepavyksta prisijungti prie serverio Failo sukurti nepavyko - Įrenginyje nebėra vietos + Įrenginyje nebėra vietos Nepavyko rasti serverio Sistema uždraudė veiksmą Rodyti tik negrupuotas prenumeratas @@ -624,7 +616,6 @@ Viešas Privatus Neįtrauktas į sąrašą - Paveikslėlio URL Serveris Pagalba Kalba @@ -638,7 +629,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. @@ -674,7 +664,7 @@ Sekantis pridėtas į eilę Įtraukti į eilę sekantį Apdorojama… tai gali užtrukti - Tikrinti ar yra atnaujinimų + Tikrinti ar yra atnaujinimų Tikrinti ar yra atnaujinimų rankiniu būdu Tikrinti ar yra atnaujinimų… Nauji sklaidos kanalo elementai @@ -686,7 +676,7 @@ \nĮdiekite „Storage Access Framework“ suderinamą su šia failų tvarkykle Pranešimai pranešimui apie klaidas Rodyti „Grotuvas užlūžo“ - Sukurti klaidos pranešimą + Kurti klaidos pranešimą NewPipe susidūrė su klaida, paspauskite norėdami pranešti Šiam veiksmui nebuvo rasta tinkama failų tvarkyklė. \nĮdiekite failų tvarkyklę arba pabandykite išjungti \"%s\" atsisiuntimo nustatymuose @@ -708,18 +698,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 @@ -727,7 +715,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ė @@ -739,4 +726,117 @@ 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 + Jokių gyvų transliacijų + Jokių transliacijų + Parsiųsti kanalo skirtukus + Kokius skirtukus parsiųsti atnaujinant srauta. Ši parinktis neturi efekto jei kanalas yra atnaujintas greituoju rėžimu. + Gyva transliacija + Trumpi + Rodyti daugiau + Visų nustatymų atstatymas į numatytasias reikšmes panaikins visus jūsų pasirinkimus ir iš naujo paleis programą. +\n +\nAr norite tęsti? + Metaduomenų įkėlimas… + Baneriai + Prenumeratoriai + Paleisti + Įkėlėjo avataras + Importuojamo eksporto nustatymuose naudojamas pažeidžiamas formatas, kurio atsisakyta nuo NewPipe 0.27.0. Įsitikinkite, kad importuojamas eksportas yra iš patikimo šaltinio, ir ateityje verčiau naudokite tik \"NewPipe 0.27.0\" ar naujesnės versijos eksportą. Šio pažeidžiamo formato nustatymų importavimo palaikymas netrukus bus visiškai panaikintas ir senos \"NewPipe\" versijos nebegalės importuoti nustatymų iš naujų versijų. + Taip + Ne + Pagrindinio skirtuko parinkiklio perkėlimas į apačią + Medijos tuneliavimas buvo išjungtas pagal numatytuosius nustatymus jūsų prietaise, nes žinoma, kad jūsų prietaiso modelis jo nepalaiko. + \"NewPipe\" gali automatiškai patikrinti, ar yra naujų versijų, ir pranešti jums, kai jos pasirodys. +\nAr norite tai įjungti? + Neįkelti paveikslėlių + %1$s %2$s + Redaguokite kiekvieną toliau pateiktą pranešimo veiksmą bakstelėdami jį. Pirmi trys veiksmai (groti/pauzė, ankstensnis ir paskesnis) yra sistemos numatytieji ir negali būti pakeisti. + Atsarginės kopijos + Pagrindinio skirtuko pozicija + Nustatymų atstatymas + Atstatyti visus nustatymus į numatytasias reikšmes + Nepakanka laisvos vietos įrenginyje + Miniatiūra + Sub-Kanalo avatarai + Avatarai + Vaizdo kokybė + Pirmyn + Trukmė + Pakeisti ekrano orientaciją + Perjungti į pilną ekraną + Kanalų skirtukai + Kokie skirtukai rodomi kanalų puslapiuose + Pakartoti + Daugiau parinkčių + Kanalai + Grojaraščiai + Albumai + Apie + Paleisti eilę + Ankstesnė transliacija + Sekanti transliacija + Prasukti + Žema kokybė + Vidutinė kokybė + Aukšta kokybė + Vaizdo įrašai + Takeliai + Pasirinkite paveikslėlių kokybę ir ar apskritai įkelti paveikslėlius, kad sumažintumėte duomenų ir atminties naudojimą. Pakeitimai išvalo atmintyje ir diske esančių vaizdų talpyklą - %s + Dalintis grojaraščiu su tokia informacija kaip grojaraščio pavadinimas ir vaizdo įrašo pavadinimas arba paprastas vaizdo įrašų nuorodų sąrašas + Dalintis su pavadinimais + Dalintis grojaraščiu + Dalintis nuorodų sąrašu + Rodyti mažiau + + %s atsakymas + %s atsakymai + %s atsakymų + + %1$s +\n%2$s + \? + - %1$s: %2$s \ 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 86c756ecbd8..0698f89d3ac 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -68,17 +68,16 @@ Atbalstiet Libre, viegla atskaņošana uz Android. Licences - Par + Par un BUJ Trešo pušu Licences Par NewPipe - Nav instalētu aplikāciju, lai atskaņotu šo failu Lielākā daļa īpašo rakstzīmju Burti un cipari Aizvietošanas rakstzīme Nederīgas rakstzīmes tiks aizvietotas ar šo Atļautās rakstzīmes failu nosaukumos Lejupielādēt - Pabeigts + Pabeigts reCAPTCHA izaicinājums dots Nospiediet \"Pabeigts\", kad to atrisinat reCAPTCHA izaicinājums @@ -94,7 +93,7 @@ Kļūda Procesi Faila nosaukums - OK + Labi Pārsaukt Atcelt Kontrolsumma @@ -156,13 +155,13 @@ 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 - Atcerēties pēdējo popup izmēru un pozīciju - Atcerēties popup īpašības - Noklusējuma popup izšķirtspēja - Popup - Atvērt popup režīmā + Paziņojumi video apstrādes progresam + Video haša paziņojums + Atcerēties pēdējo uznirstošā loga izmēru un pozīciju + Atcerēties uznirstošā loga īpašības + Uznirstošā loga noklusējuma izšķirtspēja + Uznirstošs logs + Atvērt uznirstošā logā Kas notika: Informācija: Ziņot @@ -170,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\? @@ -193,7 +192,6 @@ Nevarēja iestatīt lejupielādes izvēlni Saturs nav pieejams Nevarēja apstrādāt mājaslapu - Nevarēja saprast video URL parakstu Nevarēja ielādēt visus video attēlus Tīkla kļūda Lejupielādēt uz SD karti nav iespējams. Atiestatīt lejupielāžu mapes lokāciju\? @@ -222,10 +220,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 @@ -244,7 +242,7 @@ Videoklipi Atskaņošanas saraksts Kanāli - Viss + Visi Kļūdas ziņojums Lejupielādes Lejupielādes @@ -273,7 +271,7 @@ Pievienot instanci Atrodiet instances, kas jums patīk ar %s Izvēlaties jūsu mīļākās PeerTube instances - PeerTube instances + PeerTube serveri (instances) Valoda nomainīsies, kad aplikāciju restartēs Neviena lietotne jūsu ierīcē nevar šo atvērt Nodaļas @@ -307,7 +305,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 @@ -373,7 +371,7 @@ Nevar atgūt šo lejupielādi Savienojums pārtraukts Progress zaudēts, jo fails tika izdzēsts - Ierīcē nav vietas + Ierīcē nav vietas Strādājot ar failu, NewPipe tika aizvērts Pēcapstrāde neizdevās Nav atrasts @@ -409,22 +407,14 @@ Aizvērt Atvilkni Atvērt Atvilkni Vispopulārākais - yourID, soundcloud.com/yourid + jūsuID , soundcloud.com/jūsuID Importējiet SoundCloud profilu, ierakstot URL vai ID: \n \n1. Tīmekļa pārlūkprogrammā ieslēdziet \"datoru vietni\" (vietne nav pieejama mobilajām ierīcēm) \n2. Dodieties uz šo URL:%1$s \n3. Ierakstaties, kad tiek prasīts \n4. Nokopējiet profila URL, uz kuru tikāt novirzīts. - YouTube abonementu importēšana no Google TakeOut: -\n -\n1. Dodieties uz šo URL:%1$s -\n2. Ierakstaties, kad tiek prasīts -\n3. Noklikšķiniet uz \"Visi dati iekļauti\", pēc tam uz \"Atcelt visu atlasi\", pēc tam atlasiet tikai \"Abonementi\" un noklikšķiniet uz \"Labi\" -\n4. Noklikšķiniet uz \"Nākamais solis\" un pēc tam uz \"Izveidot eksportu\" -\n5. Pēc tam, kad tā parādās, noklikšķiniet uz pogas \"Lejupielādēt\" -\n6. Noklikšķiniet \"Importēt failu\" apakšā un izvēlaties lejupielādēto zip failu -\n7. [Ja zip faila imports neizdodas] No lejupielādētā izņemšanas zip izvelciet .csv failu (parasti sadaļā “YouTube un YouTube mūzika / abonementi / abonementi.csv\"), noklikšķiniet uz \"Importēt failu\" apakšā un izvēlaties iegūto csv failu + YouTube abonementu importēšana no Google Takeout:\n\n1. Dodieties uz šo vietni: %1$s\n2. Autorizējieties, ja nepieciešams\n3. Noklikšķiniet uz \"Visi dati iekļauti\", pēc tam uz \"Atcelt visu atlasi\", pēc tam atlasiet tikai \"Abonementi\" un noklikšķiniet uz \"Labi\"\n4. Noklikšķiniet uz \"Nākamais solis\" un pēc tam uz \"Izveidot eksportu\"\n5. Pēc tam, kad tā parādās, noklikšķiniet uz pogas \"Lejupielādēt\"\n6. Noklikšķiniet IMPORTĒT DATNI zemāk un izvēlaties lejupielādēto .zip failu\n7. [Ja .zip failu neizdodas importēt] Izvelciet .csv failu (parasti zem \"YouTube un YouTube Music/subscriptions/subscriptions.csv\") no arhīva, tad noklikšķiniet uz IMPORTĒT DATNI zemāk un izvēlaties tikko izvilkto csv failu Noklusējuma darbība, kad atver saturu — %s Pakalpojumu oriģinālteksti būs redzami video vienumos Pēc izdzēšanas, piespiedu kārtā ziņot par nepiegādātiem Rx izņēmumiem, ārpus fragmenta vai darbības dzīves cikla @@ -442,7 +432,7 @@ Tendences © %1$s no %2$s zem %3$s Lejupielāde neizdevās - Rinda + Pievienot rindai Pausēts Gaida Pabeigts @@ -500,14 +490,10 @@ Saglabāt pēdējo atskaņošanas pozīciju Atsākt atskaņošanu Skatīšanās vēsture - Glabāt meklēšanas vēsturi atmiņā + Glabāt meklēšanas vēsturi lokāli (ierīces krātuvē) 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 @@ -515,55 +501,53 @@ Izdzēst visus kešatmiņā glabātos mājaslapu datus Notīrīt kešatmiņas metadatus Attēlu kešatmiņa notīrīta - Izslēdziet, lai paslēptu informācijas zīmes ar papildus ziņām par video autoru, video saturu vai meklēšanas rezultātu + Izslēdziet, lai paslēptu papildus informācijas laukus par video autoru, video saturu vai meklēšanas vaicājuma rezultātu Rādīt papildus informāciju - Izslēdziet, ja nevēlaties redzēt video aprakstus un papildus informāciju + Izslēdziet, ja nevēlaties redzēt video aprakstu un papildus informāciju Rādīt video aprakstu Rādīt \'Nākošos\' un \'Līdzīgos\' videoklipus Izslēdziet, lai paslēptu komentārus Rādīt komentārus - Izslēdziet, ja vēlaties nelādēt video attēlus, ietaupot datus un atmiņu. Opcija notīra kešatmiņu, izdzēšot visus saglabātos video attēlus - Ielādēt video attēlus Tagadējā atskaņošanas rinda tiks aizvietota - Mainoties vienam video uz citu, iespējams, notīrīsies jūsu atskaņošanas rinda + Mainot vienu atskaņotāju uz citu, jūsu atskaņošanas rinda var tikt aizstāta/pārrakstīta Prasīt apstiprinājumu, pirms notīrīt atskaņošanas rindu - Uz priekšu/atpakaļ meklētāja ilgums - Neprecīzs meklētājs atļauj video atskaņotājam atrast pozīciju ātrāk, bet ar zemāku precizitāti. Meklēšana 5, 15 vai 25 sekundes uz priekšu vai atpakaļ, nestrādā ar šo opciju - Izmantot ātru, neprecīzu meklētāju - Melna - Tumša - Balta - Aplikācijas krāsa + Ātrās uz priekšu/atpakaļ tīšanas solis + Ar neprecīzo tīšanu video atskaņotājs var ātrāk sasniegt aptuveno atskaņošanas pozīciju, bet ar zemāku precizitāti. Tīšana pa 5, 15 vai 25 sekundēm uz priekšu vai atpakaļ nedarbojas ar šo opciju + Izmantot ātro, neprecīzo tīšanu + Melns + Tumšs + Gaišs + Motīvs 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) + Ļaut 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ā + Atvērt pārlūkā Atcelt - Instalēt - Netika atrasts video atskaņotājs (jūs varat instalēt VLC, lai to atskaņotu). - Netika atrasts video atskaņotājs. Instalēt VLC\? + Uzstādīt + Netika atrasts video atskaņotājs (jūs varat uzstādīt VLC, lai to atskaņotu). + Netika atrasts video atskaņotājs. Uzstādī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 ne vairāk kā 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 Kore aplikāciju\? + Uzstādīt trūkstošo Kore lietotni? Atskaņot ar Kodi Tikai dažas ierīcas var atskaņot 2K/4K videoklipus Rādīt augstākas izšķirtspējas @@ -575,14 +559,14 @@ Lejupielādētie video faili tiek glabāti šeit Video lejupielādes mape Pievienot - Fons + Fonā Izvēlieties Cilni - Saglabātie atskaņošanas saraksti + Saglabātie saraksti Abonementi Rādīt informāciju - Nevarēja atjaunināt abonementu + Abonementu nevarēja atjaunināt Nevarēja mainīt abonementu - Kanālam atcelts abonements + Atcelts kanāla abonements Atcelt abonementu Abonēts Abonēt @@ -612,7 +596,7 @@ Atrisināt Šis video ir ierobežots ar vecumu. \nŅemot vērā jauno YouTube politiku ar vecuma ierobežotiem videoklipiem, Newpipe nevar piekļūt šim videoklipam. - Nakts Motīvs + Nakts režīma motīvs Izslēgts Ieslēgts Privāts @@ -620,7 +604,7 @@ Atbalsts Valoda Vecuma ierobežojums - Licence + License Tagi Kategorija Jums tiks jautāts, kur saglabāt katru lejupielādi @@ -632,17 +616,16 @@ Sākt video atskaņotāju pilnekrāna režīmā Nesākt video atskaņošanu samazinātā režīmā, bet pilnekrāna režīmā, ja automātiskā rotācija ir izslēgta Izslēgt multivides tuneļošanu - Izslēdziet multivides tuneļošanu, ja jums video atskaņošanas laikā parādās melns ekrāns vai aizķeršanās + Izslēdziet multivides tuneļošanu, ja jums video atskaņošanas laikā parādās melns ekrāns vai aizķeršanās. Rādīt krāsainas lentes virs attēliem, norādot to avotu: sarkana - tīkls, zila - disks, zaļa - atmiņa 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) - Pārbaudīt atjauninājumus - Manuāli pārbaudīt, vai ir atjauninājumi + Pārbaudīt atjauninājumus + Manuāli pārbaudīt, vai ir jaunas versijas Video atskaņošanas joslas sīktēla priekšskatījums Pārbauda, vai ir atjauninājumi… Sākot ar Android 10, tikai“Krātuves Piekļuves Sistēma” ir atbalstīta @@ -657,11 +640,10 @@ Iekšeji Autors piekrīt Atvērt mājaslapu - Tabletes režīms + Planšetes režīms Zemas kvalitātes (mazāks) Privātums Sarakstā neiekļauts - Video attēla URL Uzņēmums Attālinātie meklēšanas ieteikumi Atzīmēt kā skatītu @@ -672,16 +654,15 @@ Izdzēsa %1$s lejupielādes - Lejupielāžu pabeigtas - Lejupielāde pabeigta - Lejupielādes pabeigtas + %s lejupielādes pabeigtas + %s lejupielāde pabeigta + %s 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ā @@ -693,6 +674,159 @@ Bieži uzdotie jautājumi Paziņojumi, lai ziņotu par kļūdām Kļūdas ziņojuma paziņojums - Atskaņošanas ielādēšanas intervāla lielums + Atskaņošanas ielādes 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 + Galvenās cilnes atlasītāja pārvietošana uz apakšu + Rediģējiet katru turpmāk norādīto paziņojuma darbību, pieskaroties tai. Pirmās trīs darbības (atskaņošana/pauze, iepriekšējais un nākamais) ir iestatītas sistēmā, un tās nevar pielāgot. + Mainīt progresīvā satura ielādes intervāla lielumu (pašlaik %s). Mazāka vērtība var paātrināt to sākotnējo ielādi + + + Rezerves kopēšana un atjaunošana + Metadatu ielādēšana… + Galvenās cilnes pozīcija + Nepazīstams formāts + Daļēji noskatīti + Nav tiešraides + Nav pietiekami daudz brīvās vietas uz ierīces + Par + Sīkattēli + Kārtot + NewPipe var automātiski pārbaudīt, vai ir jaunas versijas laiku pa laikam un paziņot jūs, kad tās ir pieejamas. +\nVai jūs gribat šo ieslēgt? + Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. +\nLūdzu instalējiet failu pārvaldnieku vai pamēģiniet atspējot \'%s\' lejuplādēšanas iestatījumos + oriģinālais + Nepieciešams tīkla savienojums + Atiestatīt visus iestatījumus uz to sākotnējām vērtībām + Atiestatīt iestatījumus + Visu iestatījumu atiestatošana atmetīs visus jūsu izvēlētos iestatījumus un restartēs aplikāciju. +\n +\nVai jūs esat droši, ka vēlaties turpināt? + Šī opcija ir pieejama tikai, ja %s ir izvēlēts kā motīvs + Piespraustais komentārs + Paziņojumi ir atspējoti + Jūs abonējāt šim kanālam + Banneri + Abonenti + , + Pārslēgt visus + Nepazīstama kvalitāte + Noskatīti + Gaidāmie + dublēts + aprakstošs + Video + Tiešraides + Kanāli + Atskaņošanas saraksti + Albumi + Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. +\nLūdzu lejuplādējiet ar krātuves pieejas struktūras saderīgu failu pārvaldnieku + Nav tiešraides + Rādīt kļūdas paziņojumu + Piegādāt kanālu cilnes + Cilnes, kuras piegādāt, atjaunojot jauninājumus. Šai opcijai nav nekādas iedarbības, ja kanāls tiek atjaunots ātrajā režīmā. + Multivides tuneļošana tika atspēkota pēc noklusējuma tādēļ, ka ir zināms, ka jūsu ierīces modelis to neatbalsta. + Izvēlēties kvalitāti ārējiem atskaņotājiem + ExoPlayer iestatījumi + Kanālu cilnes + \? + %1$s +\n%2$s + Tiec paziņots + Apakškanālu avatāri + Augšuplādētāju avatāri + Ilgums + Attīt + Patīt + Izvēlēties attēlu kvalitāti un vai vispār ielādēt attēlus, lai samazinātu datu un atmiņas lietojumu. Izmaiņas iztīra iekšējās atmiņas un diska attēlu kešatmiņu — %s + + %s atbildes + %s atbilde + %s atbildes + + Atskaņot + - %1$s: %2$s + Rādīt vairāk + Rādīt mazāk + Avatāri + Tiešraides, kuras vēl neatbalsta lejuplādētājs, netiek rādītas + Izvēlēto tiešraidi neatbalsta ārējie atskaņotāji + Atvērt atskaņošanas rindu + Pārslēgt pilnekrāna režīmu + Pārslēgt ekrāna orientāciju + Iepriekšējā tiešraide + Nākamā tiešraide + Neielādēt attēlus + Augsta kvalitāte + Vairāk opciju + Atkārtoti atskaņot + Attēlu kvalitāte + Zema kvalitāte + Vidēja kvalitāte + Audio celiņam jau ir jābūt šajā straumē + ExoPlayer noklusējuma vērtība + Ārējiem atskaņotājiem nav pieejama neviena video straume + Izmantot ExoPlayer dekodētāja atkāpšanās funkciju + Pārvaldīt dažus ExoPlayer iestatījumus. Lai šīs izmaiņas stātos spēkā, ir jārestartē atskaņotājs + Iespējojiet šo opciju, ja ir problēmas ar dekodētāja inicializāciju, kas atgriežas pie zemākas prioritātes dekodētājiem, ja primārajiem dekodētājiem neizdodas inicializēties. Tas var izraisīt pazeminātu atskaņošanas kvalitāti, nekā, kad izmanto primāros dekoderus + Ārējiem atskaņotājiem nav pieejama neviena audio straume + Nezināms + Vienmēr izmantot ExoPlayer video izvades virsmas iestatījumu risinājumu + Atlasiet audio celiņu ārējiem atskaņotājiem + Kādas cilnes tiek rādītas kanāla lapās + Kopīgot video URL sarakstu + %1$s %2$s + Skaņdarbi + Īsie video + Kopīgot atskaņošanas saraksta nosaukumu un to video nosaukumus vai tikai atskaņošanas sarakstā iekļauto video URL saites + Kopīgot atskaņošanas sarakstu + Kopīgot nosaukumus + Importētā eksporta iestatījumi izmanto ievainojamo formātu, kas tika pārtraukts kopš NewPipe 0.27.0 versijas. Pārliecinieties, ka importētie dati ir no uzticama avota, un turpmāk ir vēlams izmantot tikai datus, kas veikti NewPipe 0.27.0 vai jaunākās versijās. Iestatījumu importēšanas atbalsts šajā neaizsargātajā formātā drīzumā tiks pilnībā aizvākts, un tad vecās NewPipe versijas vairs nevarēs importēt iestatījumus, kas veikti jaunajās versijās. + Šis risinājums problēmas novēršanai atbrīvo un atkārtoti instantiē video kodekus, kad notiek virsmas maiņa, nevis tieši iestatīt virsmu kodekam. ExoPlayer jau izmanto šo risinājumu dažās ierīcēs, kurām ir šī problēma. Šis iestatījums darbosies tikai ierīcēs, kurās uzstādīta operētājsistēma Android 6 un jaunāka.\n\nIespējojot šo iestatījumu, var novērst atskaņošanas kļūdas, pārslēdzot pašreizējo video atskaņotāju vai pārejot uz pilnekrāna režīmu \ 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 6052b871b80..8e03b26ddb8 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -55,8 +55,6 @@ Запамти ја последната големина и место на прозорчето Брзо, непрецизно премотување Со непрецизното премотување се пребарува побрзо, но со намалена презицност. - Прочитај мали видео-сликички - Оневозможете, за да не се читаат малите видео-сликички за штедење на меморија и интернет. Промената на оваа опцијата ќе ја избрише кеш-меморијата. Кешираните слики се избришани Избришете ги кешираните мета-податоци Избришете ги сите кеш-податоци од веб-страни @@ -114,7 +112,6 @@ Грешка Мрежна грешка Не можеа да се прочитаат сите сликички - Невозможно децифрирање на URL потписот Не може да се прочита страната Содржината е недостапна Неуспешно поставување на менито за превземања @@ -300,7 +297,6 @@ Избришана е историјата на пребарувања. Нема стримови за симнување 1 ставка избришана. - Нема апликација за пуштање на овој фајл NewPipe е „copyleft“ слободен софтвер: Можеш да ја користиш, истражуваш и подобруваш по твоја желба. Можеш да ја редистрибуираш и/или да ја промениш под условите на GNU GPL лиценцата, публикувана од фондацијата FSF - или верзија 3 од лиценцата, или (по можност) понова верзија. Дали сакаш да се внесат и подесувањата? Претпочитана акција за „отворање“ @@ -331,10 +327,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Гест за контрола на гласност - Користете гестови за подесување на гласноста - Гестови за контрола на осветленост - Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана Известување за ажурирање на апликација @@ -387,7 +379,7 @@ Ддотека со ова име веќе постои Преземената дадотека со ова име веќе постои NewPipe беше затворен додека работеше на датотеката - Не останува простор на уредот + Не останува простор на уредот Истечено време за поврзување Дали си сигурен\? Ограничи ја редицата за преземање diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 35243ca2600..c439593f7c8 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -125,14 +125,13 @@ %3$s ന്റെ കീഴിൽ %2$s ന്റെ ©%1$s തേർഡ്-പാർട്ടി ലൈസൻസുകൾ ന്യൂപൈപ്പിനെക്കുറിച്ച് - ഈ ഫയൽ പ്ലേ ചെയ്യാൻ കഴിയുന്ന ഒരു അപ്പും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല പ്രത്യേക അടയാളങ്ങൾ അക്ഷരങ്ങളും അക്കങ്ങളും പകരം ഉപയോഗിക്കാവുന്ന അടയാളം സ്വീകാര്യമല്ലാത്ത അടയാളങ്ങൾ ഈ അടയാളം കൊണ്ട് മാറ്റുന്നതാണ് ഫയൽനാമങ്ങളിൽ അനുവദിച്ചിട്ടുള്ള അടയാളങ്ങൾ ഡൗൺലോഡ് - ഓകെ + ഓകെ reCAPTCHA ചാലഞ്ചിനായി അഭ്യർത്ഥിച്ചു തീർന്നാൽ \"Done\" അമർത്തുക reCAPTCHA ചാലഞ്ച് @@ -227,7 +226,6 @@ ഡൗൺലോഡ് മെനു തുറക്കാനായില്ല കന്റെന്റ് ലഭ്യമല്ല വെബ്സൈറ്റ് വ്യാപരിക്കാനായില്ല - വീഡിയോ URL സിഗ്നേച്ചർ ഡീക്രിപ്റ്റ് ചെയ്യാൻ സാധിച്ചില്ല ലഘുചിത്രങ്ങൾ ലോഡ് ചെയ്യാനായില്ല നെറ്റ്‌വർക്ക് പിശക് എസ്ഡി കാർഡിലേക്ക്‌ ഡൗൺലോഡ് അസാധ്യം. ഡൗൺലോഡ് ഫോൾഡർ മാറ്റട്ടെ\? @@ -326,20 +324,14 @@ അന്വേഷണ ചരിത്രം സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക സെർച്ച് നിർദ്ദേശങ്ങൾ - ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക - ആംഗ്യം ഉപയോഗിച്ച് വോള്യം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ വോള്യം നിയന്ത്രിക്കുക തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി കാഷെ ആയ ഡേറ്റ നീക്കംചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി ഇമേജ് കാചെ തുടച്ചുമാറ്റി - ലഘുചിങ്ങൾ ലോഡ് ചെയ്യാതിരിക്കാനും ഡേറ്റയും മെമ്മറിയും ലാഭിക്കാനുമായി ഓഫ്ചെയ്യുക. എസ് ഡീ കാർഡിലെയും മെമ്മറിയിലെയും കാച്ചേ ക്ലിയർ ചെയ്യും കമന്റുകൾ മറയ്ക്കാനായി ഓഫ് ചെയ്യുക കമന്റുകൾ കാണിക്കുക - ലഘുചിത്രങ്ങൾ ലോഡ്‌ ചെയ്യുക ഫാസ്റ്റ്-ഫോർവേർഡ്/റീവൈൻഡ് സമയദൈർഘ്യം Inexact seek ഉപയോഗിക്കുക കുറഞ്ഞ കൃത്യതയോടെ സീക് ചെയ്യാൻ ഇൻ എക്സക്ട് സഹായിക്കുന്നു. 5,15,25 സെക്കൻഡ് സീക്‌ ഈ മോഡിൽ പ്രവർത്തിക്കുകയില്ല @@ -502,7 +494,7 @@ ഈ ഡൗൺലോഡ് വീണ്ടെടുക്കാനാവില്ല കണക്ഷൻ കാലഹരണപ്പെട്ടു ഫയൽ ഇല്ലാതാക്കിയതിനാൽ പുരോഗതി നഷ്‌ടപ്പെട്ടു - ഉപകരണത്തിൽ ഇനിയൊരു സ്ഥലവും ബാക്കിയില്ല + ഉപകരണത്തിൽ ഇനിയൊരു സ്ഥലവും ബാക്കിയില്ല ഫയലിൽ പ്രവർത്തിക്കുമ്പോൾ ന്യൂപൈപ്പ് അടച്ചു പോസ്റ്റ്-പ്രോസസ്സിംഗ് പരാജയപ്പെട്ടു കണ്ടെത്താനായില്ല @@ -616,7 +608,6 @@ സ്വകാര്യം ലിസ്റ്റ് ചെയ്യപ്പെടാത്തത് പൊതുവായത് - ചെറുചിത്രം URL ഹോസ്റ്റ് പിന്തുണ ഭാഷ @@ -628,7 +619,6 @@ താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ്‌ തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം. ഇതിന്റെ കാരണം %s നൽകും: അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു - കണ്ട ഐറ്റംസ് കാണിക്കുക ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല. സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു. \nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല. @@ -654,6 +644,7 @@ അറിയിപ്പുകൾ പ്ലേയർ അറിയിപ്പ് പുതിയ സ്ട്രീമുകൾ - ലോഡ് ഇടവേള മാറ്റുക (ഇപ്പൊൾ %s). കുറഞ്ഞ മൂല്യം വീഡിയോ വേഗത്തിൽ ലോഡ് ചെയ്യാൻ ഇടയാക്കാം. മാറ്റങ്ങൾ പ്രാഭല്യതിൽ വരുത്താൻ പ്ലേയർ പുനരാരംഭിക്കണം. പ്ലേയർ തകർക്കുക + യഥാർത്ഥ ശബ്ദത്തിന് പരിഗണന കൊടുക്കുക + ഭാഷ ഏതായാലും യഥാർത്ഥ ശബ്ദം തിരഞ്ഞെടുക്കുക \ No newline at end of file diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml new file mode 100644 index 00000000000..a877e83f06a --- /dev/null +++ b/app/src/main/res/values-mn/strings.xml @@ -0,0 +1,43 @@ + + + Томруулдаг шил дээр даран эхлэнэ үү. + %1$s-д нийтлэсэн + Тоглуулагч олдсонгүй. VLC суулгах уу? + Тоглуулагч олдсонгүй (VLC суулган тоглуулж болно). + Суулгах + Цуцлах + Тийм + Үгүй + Вэб хөтөч дээр нээх + Үзсэнээр тэмдэглэх + Popup горим дээр нээх + Хуваалцах + Хайх + Тохиргоо + Та \"%1$s\" гэх гэж байсан уу? + Гадны тоглууглагч ашиглах + Зарим дүрслэл дээр дуугүй болгоно + Бүртгэлээ цуцлах + Сувгийн бүртгэл цуцлагдсан + Бүртгэлт цуцалж чадсангүй + Бүртгэлүүд + Тэмдэглэсэн жагсаалт + Таб сонгох + Popup + Дуу татах хавтас + Татагдсан дуунууд энд хадгалагдана + Дуун файлуудыг татах хавтас сонгоно уу + Үндсэн хэмжээс + Гадны дуу тоглуулагч ашиглах + Татах + Бүртгэл шинэчлэж чадсангүй + Мэдээлэл харах + Бичлэг татах хавтас + Татагдсан бичлэгүүд энд хадгалагдана + Бичлэгэн файлуудыг хадгалах хавтас сонгоно уу + Үндсэн popup-ийн хэмжээс + 2K/4K бичлэгүүдийг зарим төхөөрөмжүүд л тоглуулж чадна + Kodi-р тоглуулах + Байхгүй Kore апп-ийг суулгах уу? + \"Kodi-р тоглуулах\" цэсийг харуулах + \ No newline at end of file diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 078fd0fc45a..304858d8434 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -21,7 +21,7 @@ बाहेरील ऑडियो प्लेअर वापरा बाहेरील व्हिडिओ प्लेअर वापरा शेअर करा - यासाठी रिझल्ट दाखवत आहे: %s + %sसाठी निकाल दाखवत आहे सेटिंग शोधा फाईल डाउनलोड @@ -34,11 +34,209 @@ इंस्टॉल प्लेअर सापडले नाही (तुम्ही VLC player वापरून फाईल चालवू शकता). प्लेअर सापडले नाही. VLC प्लेअर इंस्टॉल करू इच्छिता का\? - सुरू करण्यासाठी \"शोधा\" दाबा + प्रारंभ करण्यासाठी मॅग्निफाइंग ग्लासवर टॅप करा. कोडी वापरून चालवा फक्त काही उपकरणे 2k/4k व्हिडिओ चालवू शकतात वरचे रेसॉल्युशन दाखवा डिफॉल्ट पॉप अप रेसिल्युशन डीफॉल्ट रेसोल्युशन निवडा मध्ये टाका + %1$s रोजी प्रकाशित केला + \"कोडीबरोबर प्ले करा\" हा पर्याय दाखवा + कोडी मीडिया सेंटरद्वारे व्हिडिओ प्ले करण्याचा पर्याय प्रदर्शित करा + पाहिले म्हणून चिन्हांकित करा + ठीक आहे + प्लेअर क्रॅश करा + दुसरे क्रिया बटण + तिसरे क्रिया बटण + चौथे क्रिया बटण + पाचवे क्रिया बटण + तुम्हाला \"%1$s\" म्हणायचे आहे का\? + काही रेसॉल्युशनवर ऑडिओ काढून टाकते + गहाळ Kode ॲप इंस्टॉल करायचे\? + 16:9 ते 1:1 आस्पेक्ट रेशो पर्यंत नोटिफिकेशनमध्ये दाखवलेली व्हिडिओ थंबनेल क्रॉप करा + प्रथम क्रिया बटण + 1:1 आस्पेक्ट रेशोवर थंबनेल क्रॉप करा + वापरकर्ते + नेटवर्क बंद आहे + स्थानिक + अहवाल करा + माहिती: + इतिहास पाहा + रद्द करा + नाव बदला + धागे + फाईल चे नाव + नाव बदला + सूचीबद्ध करा + टेम्पो + थांबवा + सर्वात भारी + सार्वजनिक + कधीही नाही + टॅग्ज + नाव + ताजा + असूचीबद्ध केलेले + थीम + स्वयं सूचीबद्ध करा + उजेट + स्वयं सुरु करा + वागणूक + सामग्री + सर्व + चॅनेल + कार्यक्रम + व्हिडिओज + त्रुटी + सामग्री उपलब्ध नाही + आवडले + टिप्पण्या + वर्णन + बनवा + हटवा + चुक झाली + योगदान करा + भरुन + झूम + आत टाकत आहोत… + बाहेर काढत आहोत… + पाऊल + रीसेट करा + टक्केवारी + थांबलेला आहे + रांगेत आहे + पाठींबा + बंद + , + अज्ञात + व्हिडिओज + सुरू + काळा + पुन्हा पहा + शफल + काही नाहीं + गडद + परत करा + कलाकार + दरवेळी + [अनोळखी] + तपशील: + थांबवा + सोडवा + कोणीही पाहत नाही आहे + गाणी + डाऊनलोडस् + नोटिफिकेशनला रंगीत करा + ऑडिओ + रात्रीची थीम + पांढरा + अडकत आहे + डाऊनलोड + प्लेअर + दिखावा + डेबग + अपडेट + थेट + + प्लेलिस्ट + + फाईल + के + परवाना + चेकसम + इतिहास + बाहेर काढा + परिषद + गप्प करा + बोलके करा + स्वयंउत्तपण झालेले + फिट + कॅपशन + नकार करा + काहीही नाही + अपडेट करा + स्वयं + ग्रिड + समाप्त झाले + प्रलंबित + रिकवर होत आहे + रांग + नवीन + धडे + रेडिओ + परवाना + भाषा + श्रेणी + यजमान + खासगी + सुरू + अर्धस्वर + सूचना + शॉर्ट्स + आवाज + कार्ड + पुढील + काही नाही + झाल + अवतार + थंबनेल + पुढेजा + बॅनर + \? + प्रतिक्रिया दाखवा + सर्व सुरु करा + शोधण्याचा इतिहास + डेटा साफ करा + असमर्थित लिंक + सर्वोत्तम क्वालिटी + File हटवली आहे + फक्त एकदा + + %s पाहत आहे + %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 1ad8fe0efbe..45974f81c05 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -43,7 +43,7 @@ Papar resolusi yang lebih tinggi Hanya peranti tertentu yang boleh bermain video 2K/4K Main dengan Kodi - Pasangkan aplikasi Kore yang tidak dijumpai\? + Pasangkan aplikasi Kode yang tidak dijumpai\? Paparkan opsyen \"Main dengan Kodi\" Paparkan opsyen untuk memain video dengan Kodi Audio @@ -57,18 +57,12 @@ Mengingat saiz dan posisi popup terakhir Gunakan tinjau laju tidak tepat Membolehkan pemain untuk meninjau ke posisi lebih laju dengan kurang ketepatan. Mencari 5, 15 atau 25 saat tidak berfungsi dengan ini - Muatkan thumbnail - Matikan untuk mengelakkan pemuatan thumbnail, menjimat penggunaan data dan ingatan. Perubahan akan menghapus cache imej dari ingatan dan disk Cache imej dihapuskan Hapuskan cache metadata Hapuskan semua cache data halaman web 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 @@ -139,7 +133,6 @@ Tidak mampu Memuat turun ke kad SD luar. Tetapkan semula lokasi folder muat turun\? Ralat rangkaian Tidak dapat memuat semua thumbnail - Tidak dapat menyahsulit tanda tangan URL video Tidak dapat menghuraikan laman web Kandungan tidak tersedia Tidak dapat menyediakan menu muat turun @@ -218,7 +211,6 @@ Karakter pengganti Huruf dan angka Karakter yang paling istimewa - Tiada app dipasang untuk memainkan fail ini Tentang NewPipe Lesen Pihak Ketiga © %1$s oleh %2$s di bawah %3$s @@ -385,7 +377,7 @@ %s pendengar Tekan \"Selesai\" saat selesai - Selesai + Selesai Selesaikan Tidak ada ulasan @@ -440,4 +432,86 @@ Jangan tunjuk Nyahbisu Minta Android menyesuaikan warna pemberitahuan sesuai dengan warna utama di thumbnail (perhatikan bahawa ini tidak tersedia dalam semua perangkat) + Auto-main + Sambung main + Tidak boleh memuat komentar + Tutup + Hos + Strim yang dipilih tidak disokong oleh pemain luaran + Pilih mutu untuk pemain luaran + Togol semua + Runut audio seharusnya sudah ada di dalam strim ini + Pilih runut audio untuk pemain luaran + Format tidak diketahui + Mutu tidak diketahui + Ditonton sepenuhnya + Hidupkan + Ditonton secara separa + Akan datang + Main + dialih suara + Buka baris gilir main + Kongsikan senarai main + - %1$s: %2$s + sekunder + Tab saluran + Tiada strim audio tersedia untuk pemain luaran + Strim yang belum disokong oleh pemuat turun tidak akan ditunjukkan + Avatar + , + \? + %1$s\n%2$s + Dapatkan pemberitahuan + Tetapan ExoPlayer + Uruskan beberapa tetapan ExoPlayer. Perubahan ini memerlukan pemain dimulakan semula untuk berfungsi + Gunakan ciri undur penyahkod ExoPlayer + Tidak diketahui + Tempoh + Sepanduk + Awam + Tidak disenaraikan + Peribadi + Dalaman + Pelanggan + Ulasan yang dipinkan + Disukai oleh pencipta + Mod tablet + Matikan + lalai ExoPlayer + Pemberitahuan dilumpuhkan + Anda kini melanggan saluran ini + Tiada strim video tersedia untuk pemain luaran + Isih + Sentiasa gunakan penyelesaian tetapan permukaan keluaran video ExoPlayer + asli + perihalan + Video + Runut + Shorts + Langsung + Saluran + Senarai main + Album + Perihal + Tab apakah yang ditunjukkan pada laman saluran + Strim terdahulu + Strim berikutnya + Main semula + Lebih banyak pilihan + Mutu imej + Jangan muatkan imej + Mutu rendah + Mutu sederhana + Mutu tinggi + Kongsikan senarai main dengan butiran seperti nama senarai main dan tajuk video atau sebagai senarai ringkas URL video + Kongsi dengan Tajuk + Kongsi senarai URL + Tunjukkan lagi + Tunjukkan kurang + + %s balasan + + Lakaran kecil + Avatar pemuat naik + Avatar saluran kecil \ No newline at end of file diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml new file mode 100644 index 00000000000..5bb50d20062 --- /dev/null +++ b/app/src/main/res/values-my/strings.xml @@ -0,0 +1,24 @@ + + + တိုက်ရိုက်ကြည့်ရန် ပလေယာမရှိပါ(သင်VLCကိုသွင်းနိုင်ပါသည်။) + ထည့်သွင်းမည် + ပယ်ဖျက်ပါ + အဆင်ပြေသည် + ကြည့်ပြီးပြီ + popupပုံစံမှာဖွင့်ပါ + ဒေါင်းလုဒ် + တိုက်ရိုက်ဖိုင်ကို ဒေါင်းလုဒ်လုပ်မည် + တင်ခဲ့သည် %1$s + တိုက်ရိုက်ကြည့်ရန် ပလေယာမရှိပါ။VLCသွင်းမလား။ + ဟုတ်တယ် + မဟုတ်ပါ + ဒီမီနူးအိုင်တမ်ကဝဘ်ဘရောက်ဇာထဲမှာဗီဒီယိုသို့မဟုတ်အသံဖိုင်ကိုဖွင့်မည်ဖြစ်သည် + မည်သို့ ဖွင့်မည်ရွေးချယ်ပါ + မျှဝေမည် + ရှာဖွေရန် + ဆက်တင်များ + \"%1$s\" ကိုဆိုလိုသလား။ + စတင်ရန် ဖောက်ထွင်းမှန်ကိုထိပါ။ + ဖြင့် မျှဝေမည် + အခြားဗီဒီယိုပလေယာ အားသုံးမည် + \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 15bb21633f9..416ebfd025b 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -21,18 +21,18 @@ Velg nedlastingsmappe for lydfiler Forvalgt oppløsning Spill av med Kodi - Installer manglende Kore-program\? + Installer manglende Kode-app\? Vis \"Spill av med Kodi\"-valg Vis valg for avspilling via Kodi mediasenter Lyd Forvalgt lydformat - Drakt + Tema Mørk Lys Last ned - Vis \"Neste\" og \"Lignende\" -videoer + Vis «Neste» og «Lignende» -videoer Nettadressen støttes ikke - Foretrukket innholdsspråk + Forvalgt innholdsspråk Video og lyd Utseende Spiller i bakgrunnen @@ -46,12 +46,11 @@ Vis aldersbegrenset innhold Feil Kunne ikke laste inn alle miniatyrbilder - Kunne ikke dekryptere signaturen til videoens nettadresse Kunne ikke tolke nettside 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: @@ -65,7 +64,7 @@ Nedlastinger Nedlastinger Feilrapport - Program/brukergrensesnitt krasjet + App/brukergrensesnitt krasjet Pause Slett Sjekksum @@ -77,7 +76,7 @@ Trykk for detaljer Vent… Kopiert til utklippstavle - Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nProgramspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon: + Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nAppspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon: Start Definer en nedlastingsmappe senere i innstillingene reCAPTCHA-oppgave @@ -241,15 +240,15 @@ Tilpass Fyll Forstørr - Bruk rask unøyaktig blafring - Feilretting + Bruk rask unøyaktig spoling + Feilsøking Fil Ingen slik mappe Ingen slik fil/innholdskilde Filen finnes ikke eller så har du ikke tilgang til å lese eller skrive til den Filnavn kan ikke være tomt En feil inntraff: %1$s - Auto-generert + Autogenerert Importer Importer fra Eksporter til @@ -257,7 +256,6 @@ Eksporterer… Importer fil Forrige eksport - Last miniatyrbilder Bildehurtiglager tømt Tøm hurtiglagret metadata Fjern all hurtiglagret nettsidedata @@ -282,10 +280,9 @@ Slett hele søkehistorikken\? Søkehistorikken er slettet Ett element slettet. - Inget program installert for avspilling av denne filen Undertekster Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft - NewPipe er copyleft-fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. + NewPipe er copyleft fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. Ønsker du også å importere innstillinger? Kunne ikke importere abonnementer Kunne ikke eksportere abonnementer @@ -295,7 +292,7 @@ \n2. Logg inn når forespurt \n3. Klikk på \"All data inkludert\", så på \"Fjern merket for alle\", så på kun \"Abonnementer\", og klikk så \"OK\" \n4. Klikk på \"Neste steg\" og så på \"Opprett eksport\" -\n5. Klikk på \"Last ned\"-knappen etter den vises%1$s +\n5. Klikk på \"Last ned\"-knappen etter den vises \n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen \n7. [Dersom .zip importen feiler] Pakk ut .csv filen (vanligvis under \"YouTube og YouTube Music/subscriptions/subscriptions.csv\"), klikk på IMPORTER FIL under og velg den utpakkede csv filen Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID: @@ -304,15 +301,14 @@ \n2. Gå til denne nettadressen: %1$s \n3. Logg inn når forespurt \n4. Kopier profil-nettadressen du ble videresendt til. - Unøyaktig blafring lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette - Skru av for å stoppe innlasting av miniatyrbilder, noe som sparer data- og minnebruk. Endring av dette vil tømme både disk- og minne-hurtiglager + Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm - Minnelekkasjeoppsyn kan forårsake programmet å opptre uresponsivt under haugdumping + Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping Rapporter feil utenfor livssyklusen Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse Avhekt (kan forårsake forvrenging) NewPipes personvernspraksis - NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke programmet inn data uten ditt samtykke. + NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke appen inn data uten ditt samtykke. \nNewPipes personvernspraksis forklarer i detalj hvilken data som sendes og lagres når du sender en krasjrapport. Les personvernspraksis For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye. @@ -321,8 +317,8 @@ Avslå Ubegrenset Begrens oppløsning når mobildata brukes - Minimer ved programbytte - Handling ved bytting til annet program fra hovedspiller — %s + Minimer ved appbytte + Handling ved bytting til annen app fra hovedspiller — %s Ingen Minimer til bakgrunnsspiller Minimer til oppsprettsspiller @@ -335,14 +331,10 @@ 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 - Programoppgraderingsmerknad + Varsel om appoppdatering Merknader for nye NewPipe-versjoner Ekstern lagring utilgjengelig Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\? @@ -353,11 +345,11 @@ Hvilke faner vises på hovedsiden Konferanser Oppdatering - Varsle om programoppdatering når en ny versjon er tilgjengelig - Listevisningmodus + Vis varsel om appoppdatering når en ny versjon er tilgjengelig + Listevisningsmodus Liste Rutenett - Auto + Automatisk Ny NewPipe-versjon er tilgjengelig! Fullført pauset @@ -403,7 +395,7 @@ Kan ikke overskrive filen Det finnes en ventende nedlasting ved dette navnet NewPipe ble lukket under arbeid med filen - Ingen ledig plass på enheten + Ingen ledig plass på enheten Framdrift gikk tapt, fordi filen ble slettet Tilkoblingsavbrudd Ønsker du å slette din nedlastingshistorikk eller slette alle nedlastede filer\? @@ -430,7 +422,7 @@ %s lytter %s lyttere - Språket vil først bli endret etter at programmet har blitt omstartet + Språket vil endres etter at appen har startet på nytt Standard kiosk PeerTube-instanser Lokal @@ -449,12 +441,12 @@ Autogenerert (fant ingen opplaster) gjenoppretter Kan ikke gjenopprette denne nedlastingen - Hurtigframoverspoling/-tilbakeblafringsvarighet + Hurtigframoverspoling/-tilbakespolingsvarighet Gi tillatelse til å vise over andre apper Programspråk Systemforvalg Trykk \"Ferdig\" når den er løst - Ferdig + Ferdig Videoer %d sekund @@ -486,7 +478,7 @@ Ingen abonnement valgt Velg abonnementer Kanalgrupper - Skru av raskt modus + Skru av hurtigmodus Strømoppdateringsterskel Strøm Behandler strøm… @@ -505,7 +497,7 @@ Fjern sette Opprettet av %s Av %s - Slå på YouTubes \"begrensede modus\" + Slå på YouTubes \"Begrenset modus\" Aldri Kun på Wi-Fi Velg en spilleliste @@ -524,7 +516,7 @@ \n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig. \n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig. \n -\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skjelne mellom sanntidsvideoer og normale) og det kan gi færre elementer. +\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skille mellom direktesendinger og normale videoer) og det kan gi færre elementer. \n \nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal. \n @@ -537,17 +529,17 @@ Tilgjengelig i noen tjenester, det er vanligvis mye raskere, men kan gi et begrenset antall elementer, og ofte ufullstendig informasjon (f.eks. ingen varighet, elementtype, eller sanntidsstatus) Hent fra dedikert strøm når tilgjengelig Tid siden siste oppdatering før et abonnement vurderes utdatert — %s - Som følge av begrensninger i ExoPlayer er blafringsdistansen begrenset til %d sekunder + Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet. \nEr du sikker\? Dette kan ikke angres! Start avspilling automatisk — %s - Kunne ikke gjenkjenne angitt nettadresse. Åpne den med annet program\? + Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\? Innholdet støttes ikke enda av NewPipe. \n \nStøtte vil forhåpentligvis komme til i en senere versjon. Spillelisteside Kanalens avatar-miniatyrbilde - Skru på raskt modus + Skru på hurtigmodus Vis kun ugrupperte abonnementer Spill kø Ingen spillelistebokmerker enda @@ -566,7 +558,7 @@ Tøm reCAPTCHA-kaker reCAPTCHA-kaker har blitt slettet Tøm kaker som NewPipe lagrer når du løser en reCAPTCHA - YouTube tilbyr en \"Begrenset modus\" som skjuler potensielt modent innhold + YouTube tilbyr «Begrenset modus» som skjuler innhold antatt å være for voksne Vis innhold som muligens er uegnet for barn fordi det har en aldersgrense (som 18+) La Android tilpasse varselets farge i henhold til hovedfargen i miniatyrbildet (merk at dette ikke er tilgjengelig på alle enheter) Fargelegg merknad @@ -595,9 +587,9 @@ Dette er et spor fra SoundCloud Go+, ihvertfall i ditt land, så det kan ikke strømmes eller lastes ned av NewPipe. Innholdet er ikke tilgjengelig i din region. Nedlastingen har startet - Du kan velge din favorittnattdrakt nedenfor - Velg din favorittnattdrakt — %s - Automatisk (enhetsdrakt) + Du kan velge ditt favorittnattema nedenfor + Velg ditt favorittnattema — %s + Automatisk (enhetstema) Radio Framhevet Løs @@ -606,7 +598,7 @@ Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking Skru av media-tunnelering Du kan nå velge tekst inne i beskrivelsen. Merk at siden kan flimre og lenker er kanskje ikke klikkbare i utvalgsmodus. - Raskt modus for informasjonskanal tilbyr ikke mer info om dette. + Hurtigmodus for informasjonskanal tilbyr ikke mer info om dette. Skaperens konto har blitt terminert. \nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden. \nØnsker du å oppheve ditt abonnement på denne kanalen\? @@ -614,12 +606,11 @@ 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 Du vil bli spurt om hvor du vil lagre hver nedlastning - Forhåndsvisning av miniatyrbilde i søkefelt + Forhåndsvisning av miniatyrbilde på spolelinjen Ingen nedlastingsmappe er satt ennå, velg en standard nedlastingsmappe nå Av @@ -629,7 +620,6 @@ Privat Ulistet Offentlig - Miniatyrbilde-nettadresse Tjener Støtte Språk @@ -661,7 +651,7 @@ Start hovedspiller i fullskjerm Still i kø neste I kø neste - Se etter oppdateringer + Se etter oppdateringer Behandler … Kan ta sin tid Krasj avspilleren Vis \"Krasj spilleren\" @@ -683,7 +673,7 @@ LeakCanary er ikke tilgjengelig ExoPlayer-forvalg Intervallstørrelse for avspillingsinnlasting - Bytt avspillinginnlastingens intervallstørrelse (for øyeblikket %s). En lavere verdi kan øke hastigheten på den første videoinnlastingen. Endringer krever en omstart av spilleren + Endre størrelsen på lasteintervallet på progressivt innhold (for øyeblikket %s). En lavere verdi kan øke hastigheten på den første videoinnlastingen. Endringer krever omstart av spilleren Spillervarsel Varsler Nye strømmer @@ -703,12 +693,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 @@ -722,4 +709,93 @@ Sorter Velg alle Hvis du har problemer med å bruke appen, så bør du sjekke ut disse svarene fra generelle spørsmål! + Skru av vedvarende miniatyrbilde + Dette valget er kun tilgjengelig dersom %s er valgt som tema + Klarte ikke å kopiere til utklippstavlen + Trykk for å laste ned %s + Du bruker den nyeste versjonen av NewPipe + Kort + Importer eller eksporter fra trepunktsmenyen + 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 + \? + Abonnenter + %1$s +\n%2$s + Kanalfaner + Laster inn metadata … + Lav kvalitet + Hent kanalfaner + Avatarer + Neste strøm + Underkanalavatarer + Åpne avspillingskø + Velg opprinnelig lydspor uavhengig av språk + Ikke last inn bilder + Høy kvalitet + Om + Del spilleliste + Album + Gjenta + Velg et lydspor med beskrivelser for synshemmede hvis tilgjengelig + Middels kvalitet + Foretrekk beskrivende lyd + Opplasteravatarer + Foretrekk opprinnelig lyd + Lyd: %s + Spillelister + Lydspor + Ingen direktestrømmer + Spill av + Flere alternativer + Miniatyrbilder + Spor + Varighet + Ingen strømmer + Kanaler + Forrige strøm + Vis mer + + %s svar + %s svar + + Flytt hovedfanevelgeren til bunnen + Hovedfaneposisjon + Videoer + Ukjent + Direkte + Spol tilbake + Spol forover + Bildekvalitet + Vis mindre + Del med titler + Del nettadresse først + - %1$s: %2$s + ExoPlayer-innstillinger + %1$s %2$s + beskrivende + Veksle fullskjermsvising + Bytt skjermretning + Rediger hver merknadshandling nedenfor ved å trykke på den. De første tre (spill av/pause, forrige, og neste) kan ikke tilpasses. + Bruk ExoPlayers dekodings-tilbakefall + Håndter noen ExoPlayer-innstillinger. Disse endringeren krever omstart av avspilleren. + Hvilke faner som vises på kanalsidene \ 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 6f3d2bb6eeb..5e6c1eecefc 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -56,20 +56,14 @@ पछिल्लो आकार र पपअप को स्थिति सम्झना तेज \'inexact\' खोज्न प्रयोग गर्नुहोस \'Inexact\' प्लेयर कम सटीक छिटो स्थितिहरू गर्न खोज्न अनुमति दिन्छ खोज्छन्। 5, 15 वा 25 सेकेन्ड को लागि खोजी यो काम गर्दैन। - थम्बनेल लोड टिप्पणीहरू देखाऊ टिप्पणीहरू लुकाउन, बन्द गर्नुहोस - डाटा र स्मृति उपयोग सुरक्षित गर्न, थम्बनेलहरू लोड रोक्न, बन्द गर्नुहोस। परिवर्तनहरू दुवै मा-स्मृति र-डिस्क छवि क्यास खाली गर्छ। छवि क्यास सखाप क्यास मेटाडाटा हटाउ सबै क्यास वेबपेज डाटा हटाउ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - आवाज मात्रा नियन्त्रण गर्न इशाराको प्रयोग - प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग - चमक इशारा नियन्त्रण - प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू खोजी गर्दा सुझावहरू देखाउन खोज इतिहास @@ -144,7 +138,6 @@ बाह्य एस डी कार्ड (SD card) छैन। डाउनलोड फोल्डर स्थान रिसेट गर्ने\? नेटवर्क त्रुटि सबै थम्बनेल लोड गर्न सकेन - भिडियो URL हस्ताक्षर डिक्रिप्टगर्न सकेन वेबसाइट पार्स गर्न सकिँएन सामग्री अनउपलब्ध डाउनलोड मेनु स्थापित गर्न सकिएन @@ -225,7 +218,6 @@ प्रतिस्थापन वर्ण अक्षर र अंक सबै विशेष वर्णहरु - कुनै अनुप्रयोग यो फाइल खेल्न स्थापित न्यू पाइपको बारेमा तेस्रो-पक्ष इजाजत पत्र ©%1$s को %2$s द्वारा %3$s अन्तर्गत @@ -397,7 +389,7 @@ फाइल अधिलेखन गर्न सकिएन यसै नाम सितको एक फाइल डाउनलोड हुने प्रक्रियामा छ फाइल मा काम गर्दा NewPipe बन्द भएको थियो - उपकरणमा कुनै ठाउँ बाकी छैन + उपकरणमा कुनै ठाउँ बाकी छैन प्रगति हरायो, किनभने फाइल मेटिएको थियो जडान समय सकियो तपाईं आफ्नो डाउनलोड इतिहास वा डाउनलोड फाइल मेटाउन चाहनुहुन्छ\? @@ -449,7 +441,7 @@ सिस्टम पूर्वनिर्धारित reCAPTCHA चुनौती प्रेस हल गर्दा \"डन\" - सकियो + सकियो भिडियोहरु %d सेकेन्ड diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 6ab0fbf5c10..637eb1751e6 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -55,8 +55,6 @@ Onthoud laatste grootte en positie van pop-up Snel, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie. 5, 15 en 25 seconden werken niet - Miniatuurvoorbeelden laden - Schakel dit uit voor het laden van miniatuurvoorbeelden te verhinderen; dit bespaart mobiele gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -114,7 +112,6 @@ Fout Netwerkfout Kon niet alle miniaturen laden - Kon video-URL-ondertekening niet ontsleutelen Kon website niet verwerken Inhoud niet beschikbaar Kon downloadmenu niet instellen @@ -194,7 +191,6 @@ Vervangend teken Letters en cijfers Meeste speciale tekens - Er is geen app geïnstalleerd die dit bestand kan afspelen Over NewPipe Derdepartijlicenties © %1$s door %2$s, uitgebracht onder de %3$s @@ -335,10 +331,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 @@ -473,7 +465,7 @@ Download geschiedenis verwijderen Kan deze download niet herstellen Verbinding time-out - Geen vrije ruimte meer op het apparaat + Geen vrije ruimte meer op het apparaat NewPipe werd gesloten terwijl het bezig was met het bestand Er staat al een download met deze naam in wacht Kan bestand niet overschrijven @@ -498,7 +490,7 @@ Geen afspeellijst bladwijzers Selecteer een afspeellijst Standaard kiosk - Klaar + Klaar Tik op ‘Klaar’ zodra opgelost ∞ video\'s 100+ video\'s @@ -565,8 +557,8 @@ Derde actie knop Tweede actie knop Eerste actie knop - Schaal de miniatuurafbeelding van de video die getoond wordt in de notificatie van 16:9 naar 1:1 verhouding (kan vervorming creëren) - Schaal miniatuurafbeelding naar verhouding 1:1 + Snij de miniatuurafbeelding van de video die getoond wordt in de notificatie bij van 16:9 naar een 1:1 verhouding + Miniatuurafbeelding naar verhouding 1:1 bijknippen Toon oorspronkelijke tijd geleden op items 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 @@ -626,7 +618,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 2390f8e69d7..6445d8fedd1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,14 +16,14 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kore-app niet gevonden. Deze installeren\? - \"Afspelen met Kodi\"-optie tonen - Toon een optie om een video af te spelen via Kodi media center + Ontbrekende Kore-app installeren\? + Optie ‘Afspelen met Kodi’ tonen + Toont een optie om een video af te spelen via Kodi media center Audio Standaardaudioformaat Downloaden URL wordt niet ondersteund - Toon ‘volgende’ en ‘vergelijkbare’ video’s + ‘Volgende’ en ‘Vergelijkbare’ video\'s tonen Standaardtaal voor inhoud Externe videospeler gebruiken Externe audiospeler gebruiken @@ -31,7 +31,7 @@ Speel video, tijd: Gebruikersafbeelding van uploader Vind-ik-niet-leuks - Downloadfolder voor audio + Download­map voor audio Gedownloade muziek wordt hier opgeslagen Voer de downloadlocatie in voor audiobestanden Thema @@ -40,17 +40,16 @@ Uiterlijk Speelt af op achtergrond Inhoud - Toon inhoud met leeftijdsbeperking + Inhoud met leeftijdsbeperking tonen Fout Netwerkfout Kan niet alle miniatuurvoorbeelden laden - Kan video-URL-ondertekening niet ontsleutelen Kan website niet verwerken Inhoud niet beschikbaar 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: @@ -60,14 +59,14 @@ Video Geluid Opnieuw proberen - Tik op het vergrootglas om te beginnen. + Druk op het vergrootglas om te beginnen. Live Downloads Downloads Foutrapport App/UI gecrasht - Wat:\\nVerzoek:\\nTaal van inhoud:\\nTaal van land:\\nTaal van Toepassing:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: - Begin + Wat:\\nVerzoek:\\nInhoudstaal:\\nInhoudsland:\\nApp-taal:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem: + Starten Pauzeren Verwijderen Controlesom @@ -85,13 +84,13 @@ 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 - Standaard videoformaat + Standaard­videoformaat Uitgeschakeld Standaardresolutie van pop-up Hogere resoluties tonen @@ -135,8 +134,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 +143,7 @@ Geschiedenis en cache Ongedaan maken Geen resultaten - Niets, maar dan ook niets te zien + Enkel krekels hier Geen abonnees %s abonnee @@ -161,7 +160,7 @@ %s video’s Wil je dit item verwijderen uit je zoekgeschiedenis? - Toon tip \"Ingedrukt houden om toe te voegen\" + Tip ‘Ingedrukt houden om toe te voegen’ tonen Toon tip als de achtergrond- of pop-upknop wordt ingedrukt op de videogegevenspagina Alles afspelen Deze stream kan niet worden afgespeeld @@ -180,16 +179,16 @@ Verwijderen Details Audio-instellingen - Houd ingedrukt om toe te voegen aan wachtrij - [Onbekend] - Begin hier met afspelen in de achtergrond - Begin met afspelen in pop-up + Houd ingedrukt om toe te voegen aan de wachtrij + [onbekend] + Op de achter­grond afspelen + In een pop-up afspelen Doneren NewPipe wordt door vrijwilligers in hun vrije tijd ontwikkeld om jou de beste ervaring te brengen. Geef wat terug zodat onze ontwikkelaars NewPipe nóg beter kunnen maken terwijl ze van hun kopje koffie genieten. Teruggeven Website Bezoek de website van NewPipe voor meer informatie en het laatste nieuws. - Standaard inhoudsland + Standaard­land voor inhoud Verplaatsen naar achtergrond Verplaatsen naar pop-up Verplaatsen naar hoofdvenster @@ -197,7 +196,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 @@ -206,8 +205,8 @@ Pop-upspeler Bezig met ophalen van informatie… Bezig met laden van gevraagde inhoud - Databank importeren - Databank exporteren + Data­base importeren + Data­base exporteren Dit overschrijft je huidige geschiedenis, abonnementen, afspeellijsten en instellingen Exporteer geschiedenis, abonnementen, afspeellijsten en instellingen Geëxporteerd @@ -217,10 +216,10 @@ Dit overschrijft je huidige configuratie. Streambestand downloaden Informatie tonen - Bijgehouden afspeellijsten + Bijgehouden afspeellijsten Toevoegen aan Versleep om de volgorde te wijzigen - Creëren + Aanmaken Sluiten Naam wijzigen Laatst afgespeeld @@ -269,11 +268,11 @@ \n \n1. Ga naar dit adres: %1$s \n2. Log in op je account -\n3. Klik op \"Alle YouTube-gegevens inbegrepen\", dan op \"Selectie van alle items ongedaan maken\", dan selecteer alleen \"abonnementen\" en klik op \"OK\" -\n4. Klik op \"Volgende stap\", dan op \"Export maken\" -\n5. Klik op de knop \"Downloaden\" nadat deze verschijnt -\n6. Klik onder op \"Bestand importeren\" en selecteer de gedownloade zip file -\n7. [Als de zip import faalt] Uit de zip file, pak de .csv uit (gebruikelijk in de folder \"YouTube en YouTube Music/abonnementen/abonnementen.csv\"), klik onder op \"Bestand importeren\" en selecteer de uitgepakte zip file +\n3. Druk op ‘Alle YouTube-gegevens inbegrepen’, dan op ‘Selectie van alle items ongedaan maken’, dan selecteer alleen ‘abonnementen’ en druk op ‘OK’ +\n4. Druk op ‘Volgende stap’, dan op ‘Export maken’ +\n5. Druk op de knop ‘Downloaden’ nadat deze verschijnt +\n6. Druk onder op ‘Bestand importeren’ en selecteer de gedownloade zip file +\n7. [Als de zip-import faalt] Uit het zip-bestand, pak de .csv uit (normaal in de map ‘YouTube en YouTube Music/abonnementen/abonnementen.csv’), druk onder op ‘Bestand importeren’ en selecteer het uitgepakte zip-bestand Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren: \n \n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten) @@ -284,8 +283,6 @@ Let op: deze actie kan veel MB’s van je mobiele netwerk gebruiken. \n \nWil je doorgaan? - Miniatuurvoorbeelden laden - Schakel dit uit om het laden van miniatuurvoorbeelden te verhinderen; dit bespaart mobiele data en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -299,7 +296,6 @@ Geen streams beschikbaar voor downloaden Ondertitels Ondertitelgrootte en -achtergrondstijlen wijzigen. Vereist een herstart van de app - Er is geen app geïnstalleerd die dit bestand kan afspelen Kijkgeschiedenis wissen Verwijdert de geschiedenis van bekeken video\'s en afspeelposities De gehele kijkgeschiedenis wissen\? @@ -335,23 +331,19 @@ 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\? - Fout bij het lezen van de opgeslagen tabbladen, waardoor standaardtabbladen worden gebruikt + Fout bij lezen van opgeslagen tabbladen, standaard­tabbladen worden gebruikt Standaardinstellingen herstellen Wil je de standaardinstellingen herstellen\? Aantal abonnees niet beschikbaar Welke tabbladen worden weergegeven op de hoofdpagina Bijwerken - Toon een melding om de applicatie te updaten wanneer er een nieuwe versie beschikbaar is + Toon een melding om de app bij te werken wanneer een nieuwe versie beschikbaar is Lijstweergavemodus Lijst Raster @@ -362,14 +354,14 @@ gepauzeerd aan de wachtrij toegevoegd nabewerking - Wachtrij + In wachtrij plaatsen Actie door het systeem geweigerd Downloaden mislukt Genereer een unieke naam Overschrijven Er bestaat al een gedownload bestand met deze naam Er is een download aan de gang met deze naam - Toon foutmelding + Foutmelding tonen Het bestand kan niet worden gemaakt De doelmap kan niet worden gemaakt Kon geen beveiligde verbinding opzetten @@ -382,7 +374,7 @@ Stop Maximum aantal keer proberen Maximum aantal pogingen voordat de download wordt geannuleerd - Pauzeren bij mobiele data verbinding + Pauzeren bij mobiele gegevens­verbinding Handig voor wanneer u naar mobiel internet overschakelt, hoewel sommige downloads niet gepauzeerd kunnen worden Gebeurtenissen Conferenties @@ -394,7 +386,7 @@ Kan reacties niet laden Sluiten Het \'Storage Access Framework\' staat downloads naar een externe SD kaart toe - Wis data + Gegevens wissen Afspelen hervatten Verder afspelen vanaf laatste positie Posities in lijst @@ -404,18 +396,18 @@ Een bestand met dezelfde naam bestaat al Kan bestand niet overschrijven Er is al een download met deze naam bezig - Geen vrije ruimte meer op het apparaat + Geen vrije ruimte meer op het apparaat Voortgang verloren, omdat bestand was verwijderd Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\? - Limiteer de download wachtrij + Download­wachtrij limiteren 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) - Verwijder afspeelposities + Mapkiezer van systeem gebruiken (SAF) + Afspeelposities verwijderen Verwijdert alle afspeelposities Alle afspeelposities verwijderen\? Niemand is aan het kijken @@ -431,14 +423,14 @@ De taal zal veranderen zodra de app opnieuw is opgestart Standaard kiosk Duur voor-/achteruit spoelen - PeerTube kanaal - Selecteer je favorite PeerTube kanaal - Vind het kanaal dat je leuk vindt op %s - Kanaal toevoegen - Kanaal URL invoeren - Kon kanaal niet valideren - Alleen HTTPS URL\'s worden ondersteund - Kanaal bestaat al + PeerTube-instanties + Selecteer je favorite PeerTube-instanties + Vind de instanties die je leuk vindt op %s + Instantie toevoegen + Instantie-URL invoeren + Kon instantie niet valideren + Alleen HTTPS-URL\'s worden ondersteund + Instantie bestaat al Lokaal Recentelijk toegevoegd Automatisch gegenereerd (geen uploader gevonden) @@ -448,10 +440,10 @@ Download geschiedenis verwijderen Verwijder gedownloade bestanden Geef toestemming voor weergave over andere apps - App taal - Systeem taal gebruiken - Druk op \"Klaar\" zodra opgelost - Klaar + App-taal + Systeemtaal gebruiken + Druk op ‘Klaar’ als u dit heeft opgelost + Klaar Video\'s Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden Geluid dempen @@ -466,7 +458,7 @@ %d uur - %d uren + %d uur %d dag @@ -505,7 +497,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 @@ -517,22 +509,22 @@ 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 +\nSchakel ‘%1$s’ in onder instellingen als u het wilt zien. + Bekeken verwijderen Originele teksten van services zijn zichtbaar in stream-items - YouTube \"Beperkte modus\" aanzetten + YouTube\'s ‘Beperkte modus’ inschakelen Laat originele tijd geleden zien - Kanaal avatar afbeelding + Avatarminiatuur van kanaal Door %s Gemaakt door %s - Afspeellijst pagina - Toon enkel ongegroepeerde abonnementen - Geen afspeellijst bookmarks + Afspeellijst­pagina + Enkel ongegroepeerde abonnementen tonen + Nog geen afspeellijst­bladwijzers Selecteer een afspeellijst Controleer of er al een probleem bestaat dat uw crash beschrijft. Wanneer u dubbele tickets aanmaakt, neemt dit tijd van ons in beslag die we beter kunnen besteden aan het oplossen van het daadwerkelijke probleem. In GitHub rapporteren @@ -541,9 +533,9 @@ Nooit Enkel via Wi-Fi Start automatisch met afspelen — %s - Speel wachtrij af + Wachtrij afspelen Kon de URL niet herkennen. In een andere app openen\? - De actieve spelerswachtrij wordt vervangen + De actieve speler­wachtrij zal worden vervangen Veranderen van één speler naar een andere kan jouw wachtrij vervangen Vraag bevestiging alvorens de wachtrij te wissen Niets @@ -551,31 +543,31 @@ Willekeurig afspelen Herhaal Je kan maximaal drie acties selecteren om te tonen in de compacte notificatie! - Pas elke notificatieactie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte notificatie door gebruik te maken van de selectievakjes aan de rechterkant + Pas elke meldings­actie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte melding door gebruik te maken van de selectievakjes aan de rechterkant. Vijfde actieknop Vierde actieknop Derde actieknop Tweede actieknop Eerste actieknop - Schaal de miniatuurafbeelding van de video die getoond wordt in de notificatie van verhouding 16:9 naar 1:1 + Schaalt de miniatuurafbeelding van de video die getoond wordt in de melding van verhouding 16:9 naar 1:1 Schaal de miniatuurafbeelding tot verhouding 1:1 - Automatisch in de wachtrij plaatsen - Toon memory leaks + Automatisch in wachtrij plaatsen + Geheugen­lekken tonen In de wachtrij geplaatst In de wachtrij plaatsen Verwijder cookies die NewPipe opslaat wanneer u een reCAPTCHA oplost - reCAPTCHA cookies zijn verwijderd - Verwijder reCAPTCHA cookies - YouTube biedt een \"Beperkte modes\" aan, dit verbergt mogelijk materiaal voor volwassenen + reCAPTCHA-cookies zijn gewist + reCAPTCHA-cookies wissen + YouTube biedt een ‘Beperkte modus’ aan, dit verbergt 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 - Toon miniatuurafbeelding op het vergrendelscherm als achtergrond en in de notificaties - Toon miniatuurafbeelding + Meldingkleur aanpassen + Toon miniatuurafbeelding op het vergrendelscherm als achtergrond en in de meldingen + Miniatuur tonen 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 @@ -593,21 +585,20 @@ Deze inhoud is privé en kan dus niet worden gestreamd of gedownload door NewPipe. Dit is een SoundCloud Go + -track, althans in jouw land, dus het kan niet worden gestreamd of gedownload door NewPipe. Deze inhoud is niet beschikbaar in uw land. - De app laten crashen + App laten crashen Oplossen 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) - Toon details van kanaal - Nacht Thema + U kunt uw favoriete nachtthema hieronder selecteren + Selecteer uw favoriete nachtthema — %s + Automatisch (systeemthema) + Kanaal­details tonen + Nachtthema Intern Privé Niet vermeld Openbaar - Miniatuur-URL Host Ondersteuning Taal @@ -619,15 +610,14 @@ Tekst selecteren in de beschrijving uitschakelen Tekst selecteren in de beschrijving inschakelen U kunt nu tekst in de beschrijving selecteren. Houd er rekening mee dat de pagina kan flikkeren en dat links mogelijk niet klikbaar zijn in de selectiemodus. - Media tunneling uitschakelen als u een zwart scherm ervaart of video hapert bij het afspelen + Schakel media-tunneling uit als u een zwart scherm ervaart of de video hapert bij het afspelen. 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. @@ -636,18 +626,18 @@ Error bij het inladen van de feed Vanaf Android 10 is enkel \'Storage Access Framework\' ondersteund U wordt gevraagd waar elk bestand wordt opgeslagen - Nog geen downloadfolder gekozen, kies de standaard downloadfolder + Nog geen download­map gekozen, kies nu de standaard­download­map Geliefd door de maker Niet laten zien Lage kwaliteit (kleiner) Hoge kwaliteit (groter) Zoekbalk miniatuurafbeelding voorbeeld Toon Picasso-gekleurde linten bovenop afbeeldingen die hun bron aangeven: rood voor netwerk, blauw voor schijf en groen voor geheugen - Toon afbeeldingsindicatoren + Afbeeldings­indicatoren tonen Reacties zijn uitgeschakeld Zoeksuggesties op afstand Lokale zoeksuggesties - Markeer als bekeken + Markeren als bekeken %1$s download verwijderd %1$s downloads verwijderd @@ -657,22 +647,22 @@ %s downloads voltooid Volgende item in de wachtrij geplaatst - Plaats volgende item in de wachtrij + Volgende item in de wachtrij plaatsen Veeg items om ze te verwijderen Start geen video\'s in de minispeler, maar ga direct naar de volledige schermmodus, als automatisch draaien is vergrendeld. Je hebt nog steeds toegang tot de minispeler door de volledige schermmodus af te sluiten Start hoofdspeler als volledig scherm Verwerken... Dit kan even duren - Crash de speler - Toon \"crash de speler\" - Toon een crash overzicht bij gebruik van de speler + Speler crashen + ‘Speler crashen’ tonen + Toont een crash-optie 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. @@ -681,22 +671,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 + Vereiste netwerk­verbinding Elk netwerk Meldingen zijn uitgeschakeld - Ontvang een melding + Meldingen , Alles in-/uitschakelen Percentage @@ -715,15 +704,125 @@ 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 + U heeft de nieuwste versie van NewPipe + Druk om %s te downloaden + Kon niet naar klembord kopiëren + 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 + %1$s %2$s + origineel + nagesynchroniseerd + beschrijvend + Verplaats de tabselector naar beneden + Positie van sectie-tabbladen + Geen streams + Geen live-streams + Media-tunneling is standaard uitgeschakeld op uw apparaat omdat uw apparaatmodel dit niet ondersteunt. + Afbeeldings­kwaliteit + Video\'s + \? + Abonnees + Welke tabbladen worden getoond op kanaal­pagina\'s + Kanaal­tabbladen + Shorts + Metagegevens laden… + Scherm­oriëntatie omschakelen + Lage kwaliteit + Volledig scherm omschakelen + Kanaal­tabbladen ophalen + Profielfoto\'s + Volgende stream + Subkanaal-profielfoto\'s + Wachtrij openen + Afbeeldingen niet laden + Hoge kwaliteit + Over + Vooruitspoelen + Albums + Terugspoelen + Opnieuw afspelen + Tabbladen om op te halen bij het bijwerken van de feed. Deze optie heeft geen effect als een kanaal wordt bingewerkt via de snelle modus. + Gemiddelde kwaliteit + Uploader-profielfoto\'s + Banieren + Afspeellijsten + Kies de kwaliteit van afbeeldingen en of deze überhaupt geladen moeten worden, om gegevens- en geheugengebruik te verminderen. Wijzigingen wissen de afbeeldings­cache — %s + Afspelen + Meer opties + Miniaturen + Nummers + Duur + Kanalen + Vorige stream + Live + URL-lijst delen + Delen met titels + %1$s +\n%2$s + Afspeellijst delen + Deel afspeellijst met details zoals afspeellijstnaam en videotitels of als een eenvoudige lijst met video-URL\'s + - %1$s: %2$s + + %s reactie + %s reacties + + Meer tonen + Minder tonen + Bewerk elke meldings­actie hieronder door erop te tikken. De eerste drie acties (afspelen/pauzeren, vorige en volgende) zijn ingesteld door het systeem en kunnen niet worden aangepast. + Onvoldoende vrije ruimte op het apparaat + Ja + Herstelt alle instellingen naar hun standaard­waarde + Als u alle instellingen reset worden al uw voorkeurs­instellingen verwijderd en wordt de app opnieuw gestart. +\n +\nWeet u zeker dat u verder wilt gaan? + Nee + Back-up en herstel + NewPipe kan van tijd tot tijd auto­matisch controleren op nieuwe versies en u op de hoogte stellen zodra deze beschik­baar zijn. +\nWilt u dit inschakelen? + Instellingen resetten + De instellingen in de export die wordt geïmporteerd, gebruiken een kwetsbaar formaat dat verouderd is sinds NewPipe 0.27.0. Zorg ervoor dat de export die wordt geïmporteerd afkomstig is van een vertrouwde bron, en geef er de voorkeur aan om in de toekomst alleen exporten te gebruiken die zijn verkregen van NewPipe 0.27.0 of nieuwer. Ondersteuning voor het importeren van instellingen in dit kwetsbare formaat zal binnenkort volledig worden verwijderd, en oude versies van NewPipe zullen dan geen export­instellingen meer uit nieuwe versies kunnen importeren. \ 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 d937b6a6902..a6d12fe2adb 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 - Tenkte du på «%1$s»\? + 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,33 +34,122 @@ 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 + Forvald oppløysing + Forvald oppsprettsoppløysing + Vis eit val om å spela av ein video med mediasamlestaden Kodi + Skjer småbiletet til storleikshøvet 1:1 + 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 + 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..94e7ae2f49b --- /dev/null +++ b/app/src/main/res/values-nqo/strings.xml @@ -0,0 +1,735 @@ + + + ߞߊ߬ ߢߣߊߕߊߟߌ ߘߏ߫ ߦߌ߬ߘߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߕߏߟߏ߲߫ 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-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index d440d8a897f..6341e670058 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -58,7 +58,6 @@ Utilzar la recèrca rapida inexacta La recèrca inexacta permet a l\'utilizaire de recercar mai rapidament una posicion amb mens de precision Durada d\'avançada/reculada rapida - Cargar las miniaturas Afichar los comentaris Desactivar per afichar pas mai los comentaris Apondre la vidèo seguenta dins la coa de lectura diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 7497e5e4817..11c7b16b4c7 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -18,7 +18,7 @@ ମୋଟ %d ମିନିଟ୍ ଆପ୍ ଭାଷା - ସ୍ୱୟଂଚାଳିତ (ଡିଭାଇସ୍ ଥିମ୍) + ସ୍ୱଚାଳିତ (ଡିଵାଇସ୍ ଥିମ୍) ଗୋପନୀୟତା ନାମ ବିବରଣୀ @@ -44,7 +44,7 @@ ଏଥିରେ ଖୋଲନ୍ତୁ ବାତିଲ୍ କରନ୍ତୁ ଦେଖାଯାଇଥିବା ପରି ଚିହ୍ନିତ କର - ସଞ୍ଚୟ କରନ୍ତୁ + ଡାଉନଲୋଡ୍ କରନ୍ତୁ ସେଟିଂ ତୁମେ ଏହା ଚାଂହ କି \"%1$s\"\? ଫାଇଲ୍ ଡାଉନଲୋଡ କରନ୍ତୁ @@ -73,8 +73,8 @@ ଉଦାହରଣ ବୈଧ କରିପାରିଲା ନାହିଁ ଭିଡିଓ ବର୍ଣ୍ଣନା ଏବଂ ଅତିରିକ୍ତ ସୂଚନା ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ଅଡିଓ - ବାହ୍ୟ ଅଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ - ସବସ୍କ୍ରାଇବ କରନ୍ତୁ + ବହିଃ-ଅଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା + ସଦସ୍ୟତା ଯୋଡ଼ନ୍ତୁ ସଦସ୍ୟତା ଅଦ୍ୟତନ କରିପାରିଲା ନାହିଁ ଟ୍ୟାବ୍ ବାଛନ୍ତୁ ଅଡିଓ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ @@ -82,8 +82,8 @@ ଭିଡିଓ ଫାଇଲ୍ ପାଇଁ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ ଡିଫଲ୍ଟ ରେଜୋଲୁସନ କୋଡି ସହିତ ଖୋଲନ୍ତୁ - ଦ୍ୱିତୀୟ କ୍ରିୟା ବଟନ୍ - ପୁନରାବୃତ୍ତି କରନ୍ତୁ + ଦ୍ୱିତୀୟ କୃତ୍ୟ ବଟନ୍ + ପୁନର୍ବାର କରନ୍ତୁ ବିଜ୍ଞପ୍ତିକୁ ରଙ୍ଗ କରନ୍ତୁ ପପ୍ଅପ୍ ର ଶେଷ ଆକାର ଏବଂ ସ୍ଥିତି ମନେରଖ ଦ୍ରୁତ ନିଷ୍କ୍ରିୟ ସନ୍ଧାନ ବ୍ୟବହାର କରନ୍ତୁ @@ -101,13 +101,10 @@ ଏକ ଧାଡି ସଫା କରିବା ପୂର୍ବରୁ ନିଶ୍ଚିତକରଣ ମାଗନ୍ତୁ ଗୋଟିଏ ଖେଳାଳୀରୁ ଅନ୍ୟ ଖେଳାଳୀକୁ ପରିବର୍ତ୍ତନ କରିବା ଆପଣଙ୍କ ଧାଡି ବଦଳାଇପାରେ ସକ୍ରିୟ ପ୍ଲେୟାର କ୍ୟୁ ବଦଳାଯିବ - ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରନ୍ତୁ \'ପରବର୍ତ୍ତୀ\' ଏବଂ \'ସମାନ\' ଭିଡିଓଗୁଡିକ ଦେଖାନ୍ତୁ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା - ଭଲ୍ୟୁମ୍ ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ - ପ୍ଲେୟାରର ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ପରାମର୍ଶ ଖୋଜ ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ ସୁଦୂର ସନ୍ଧାନ ପରାମର୍ଶ @@ -118,7 +115,7 @@ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକର ଟ୍ରାକ୍ ରଖନ୍ତୁ ଖେଳିବା ଆରମ୍ଭ କରନ୍ତୁ ଫୁଲ ସ୍କ୍ରିନରେ ମୁଖ୍ୟ ପ୍ଲେୟାର ଆରମ୍ଭ କରନ୍ତୁ - ସ୍ଵତଃ ଚଳିତ + ସ୍ୱତଃଚାଳନ URL ଚିହ୍ନି ପାରିଲା ନାହିଁ । ଅନ୍ୟ ଏକ ଆପ୍ ସହିତ ଖୋଲନ୍ତୁ\? ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଦେଶ ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଭାଷା @@ -128,7 +125,7 @@ ଇନଷ୍ଟାଣ୍ଟ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି ପ୍ଲେୟାର ଇତିହାସ ଏବଂ କ୍ୟାଚ୍ - ଦୃଶ୍ୟ + ରୂପ ତ୍ରୁଟି ନିବାରଣ କରନ୍ତୁ ଅଦ୍ୟତନଗୁଡିକ ପ୍ଲେବେକ୍ ଲୋଡ୍ ବ୍ୟବଧାନ ଆକାର @@ -143,16 +140,14 @@ ଶେଷ ପ୍ଲେବେକ୍ ସ୍ଥିତିକୁ ପୁନଃ ସ୍ଥାପନ କରନ୍ତୁ ତାଲିକାରେ ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ସୂଚକ ଦେଖାନ୍ତୁ ସମସ୍ତ କ୍ୟାଚ୍ ହୋଇଥିବା ୱେବପୃଷ୍ଠା ତଥ୍ୟ ଅପସାରଣ କରନ୍ତୁ - ପ୍ଲେୟାର ଭଲ୍ୟୁମକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ସନ୍ଧାନ କରିବା ସମୟରେ ଦେଖାଇବାକୁ ପରାମର୍ଶଗୁଡିକ ବାଛନ୍ତୁ ବାଧା ପରେ ଖେଳିବା ଜାରି ରଖନ୍ତୁ (ଯଥା ଫୋନକଲ୍) ଭିଡିଓ \"ବିବରଣୀ:\" ରେ ପୃଷ୍ଠଭୂମି କିମ୍ବା ପପ୍ଅପ୍ ବଟନ୍ ଦବାଇବା ସମୟରେ ଟିପ୍ ଦେଖାନ୍ତୁ ଆପଣଙ୍କର ପ୍ରିୟ PeerTube ଉଦାହରଣଗୁଡିକ ବାଛନ୍ତୁ ବ୍ୟବହାର - ଭିଡିଓ ଏବଂ ଅଡିଓ + ଵିଡ଼ିଓ ଓ ଅଡ଼ିଓ ମିନି ପ୍ଲେୟାରରେ ଭିଡିଓ ଆରମ୍ଭ କରନ୍ତୁ ନାହିଁ, କିନ୍ତୁ ଅଟୋ ଘୂର୍ଣ୍ଣନ ବନ୍ଦ ହୋଇଗଲେ ସିଧାସଳଖ ଫୁଲ୍ ସ୍କ୍ରିନ୍ ମୋଡ୍ କୁ ଯାଆନ୍ତୁ। ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଛାଡି ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ ମିନି ପ୍ଲେୟାରକୁ ପ୍ରବେଶ କରିପାରିବେ - ଏହା ଉପରେ ଟ୍ୟାପ୍ କରି ନିମ୍ନରେ ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟ ସଂପାଦନ କରନ୍ତୁ। ଡାହାଣରେ ଥିବା ଚେକ୍ ବକ୍ସ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦେଖାଯିବାକୁ ସେମାନଙ୍କ ମଧ୍ୟରୁ ତିନୋଟି ପର୍ଯ୍ୟନ୍ତ ଚୟନ କରନ୍ତୁ - ଥମ୍ବନେଲ ଲୋଡିଂ, ଡାଟା ଏବଂ ମେମୋରୀ ବ୍ୟବହାରକୁ ରୋକିବା ପାଇଁ ବନ୍ଦ କରନ୍ତୁ । ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ଉଭୟ ଇନ-ମେମୋରୀ ଏବଂ ଅନ୍-ଡିସ୍କ ଇମେଜ୍ କ୍ୟାଚ୍ ସଫା କରେ + ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ଡାହାଣ ପଟେ ଥିବା ଚେକବକ୍ସଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦର୍ଶାଇବା ପାଇଁ ସେଗୁଡ଼ିକ ମଧ୍ୟରୁ ତିନିଟି ଚୟନ କରନ୍ତୁ । ଷ୍ଟ୍ରିମ୍ ସୃଷ୍ଟିକର୍ତ୍ତା, ଷ୍ଟ୍ରିମ୍ ବିଷୟବସ୍ତୁ କିମ୍ବା ଏକ ସନ୍ଧାନ ଅନୁରୋଧ ବିଷୟରେ ଅତିରିକ୍ତ ସୂଚନା ସହିତ ମେଟା ସୂଚନା ବାକ୍ସଗୁଡ଼ିକୁ ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ପିଲାମାନଙ୍କ ପାଇଁ ସମ୍ଭବତ content ଅନୁପଯୁକ୍ତ ବିଷୟବସ୍ତୁ ଦେଖାନ୍ତୁ କାରଣ ଏହାର ବୟସ ସୀମା ଅଛି (ଯେପରିକି 18+) ଏହି ଭିଡିଓ ବୟସ-ସୀମିତ ଅଟେ । @@ -184,7 +179,7 @@ ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ । \nଦୟାକରି ଏକ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ କିମ୍ବା ଡାଉନଲୋଡ୍ ସେଟିଂସମୂହରେ \'%s\' ଅକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ ଏହି ଭିଡିଓ କେବଳ ୟୁଟ୍ୟୁବ୍ ମ୍ୟୁଜିକ୍ ପ୍ରିମିୟମ୍ ସଦସ୍ୟଙ୍କ ପାଇଁ ଉପଲବ୍ଧ, ତେଣୁ ଏହାକୁ ନ୍ୟୁପାଇପ୍ ଦ୍ୱାରା ଷ୍ଟ୍ରିମ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ । - ଲୋଡ୍ ବ୍ୟବଧାନ ଆକାର ପରିବର୍ତ୍ତନ କରନ୍ତୁ (currently %s)। ଏକ କମ୍ ମୂଲ୍ୟ ପ୍ରାରମ୍ଭିକ ଭିଡିଓ ଲୋଡିଂକୁ ତ୍ୱରାନ୍ୱିତ କରିପାରେ । ପରିବର୍ତ୍ତନଗୁଡିକ ଏକ ପ୍ଲେୟାର ପୁନଃଆରମ୍ଭ ଆବଶ୍ୟକ କରେ + ଧାରଣ ଅନ୍ତରାଳର ଆକାରକୁ ପ୍ରଗତିଶୀଳ ବିଷୟବସ୍ତୁ (ବର୍ତ୍ତମାନ %s) ରେ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । ଗୋଟିଏ ନିମ୍ନମାନ ସେମାନଙ୍କର ପ୍ରାରମ୍ଭିକ ଧାରଣକୁ ତ୍ୱରାନ୍ୱିତ କରିପାରେ ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ । \nଦୟାକରି ଏକ ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ ସୁସଙ୍ଗତ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ ଅନ୍ତତଃ ପକ୍ଷେ ଆପଣଙ୍କ ଦେଶରେ ଏହା ଏକ ସାଉଣ୍ଡକ୍ଲାଉଡ୍ ଗୋ + ଟ୍ରାକ୍, ତେଣୁ ଏହାକୁ ନ୍ୟୁପାଇପ୍ ଦ୍ୱାରା ଷ୍ଟ୍ରିମ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ । @@ -202,27 +197,26 @@ ଡିଫଲ୍ଟ ଅଡିଓ ଫର୍ମାଟ୍ ଅକ୍ଷୟ ସନ୍ଧାନ ପ୍ଲେୟାରକୁ ହ୍ରାସ ହୋଇଥିବା ସଠିକତା ସହିତ ଶୀଘ୍ର ପଦବୀ ଖୋଜିବାକୁ ଅନୁମତି ଦିଏ । 5, 15 କିମ୍ବା 25 ସେକେଣ୍ଡ ଖୋଜିବା ଏହା ସହିତ କାମ କରେ ନାହିଁ %s ପାଇଁ ଫଳାଫଳ ଦେଖାଉଛି - ବାହ୍ୟ ଭିଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଵିଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ସଦସ୍ୟତା ରଦ୍ଦ କରନ୍ତୁ ଚ୍ୟାନେଲ ସଦସ୍ୟତା ରଦ୍ଦ ହେଲା ସଦସ୍ୟତା ପରିବର୍ତ୍ତନ କରିପାରିଲା ନାହିଁ - ସୂଚନା ଦେଖାନ୍ତୁ - ମିଶାଅ + ସୂଚନା ଦେଖାଅ + ଏଥିରେ ଯୋଡ଼ିବା ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ\? ଥମ୍ୱନେଲ କୁ 1:1 ଅନୁପାତରେ କ୍ରୋପ୍ କରନ୍ତୁ - ପ୍ରଥମ କ୍ରିୟା ବଟନ୍ - ତୃତୀୟ କ୍ରିୟା ବଟନ୍ - ଚତୁର୍ଥ କ୍ରିୟା ବଟନ୍ - ପଞ୍ଚମ କ୍ରିୟା ବଟନ୍ + ପ୍ରଥମ କୃତ୍ୟ ବଟନ୍ + ତୃତୀୟ କୃତ୍ୟ ବଟନ୍ + ଚତୁର୍ଥ କୃତ୍ୟ ବଟନ୍ + ପଞ୍ଚମ କୃତ୍ୟ ବଟନ୍ ଶଫଲ୍ ବଫରିଂ - କିଛି ନୁହେଁ + କିଛି ନାହିଁ ଡିଫଲ୍ଟ ଭିଡିଓ ଫର୍ମାଟ୍ ପପ୍ଅପ୍ ଗୁଣଗୁଡିକ ମନେରଖ - ଉଜ୍ଜ୍ୱଳତା ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ ପ୍ରକ୍ରିୟାକରଣ… କିଛି ସମୟ ନେଇପାରେ ପ୍ଲେୟାର କ୍ୟାପସନ୍ ଟେକ୍ସଟ୍ ସ୍କେଲ୍ ଏବଂ ପୃଷ୍ଠଭୂମି ଶୈଳୀକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । କାର୍ଯ୍ୟକାରୀ ହେବାକୁ ଆପ୍ ପୁନଃଆରମ୍ଭ ଆବଶ୍ୟକ କରେ LeakCanary ଉପଲବ୍ଧ ନାହିଁ @@ -253,7 +247,7 @@ ସମସ୍ତ ପ୍ଲେ କରନ୍ତୁ ସର୍ବଦା ଫାଇଲ୍ - ବିଜ୍ଞପ୍ତି ଗୁଡିକ + ଵିଜ୍ଞପ୍ତି ଆପ୍ ଅଦ୍ୟତନ ବିଜ୍ଞପ୍ତି ନୂତନ NewPipe ସଂସ୍କରଣ ପାଇଁ ବିଜ୍ଞପ୍ତି ଭିଡିଓ ହ୍ୟାସ୍ ବିଜ୍ଞପ୍ତି @@ -273,7 +267,7 @@ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରେ ସନ୍ଧାନ ଇତିହାସ ସଫା କରନ୍ତୁ ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି\? - ବାହ୍ୟ ସଂରକ୍ଷଣ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଷ୍ଟୋରେଜ୍ ଅନୁପଲବ୍ଧ ନେଟୱର୍କ ତ୍ରୁଟି ସମସ୍ତ ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରିପାରିଲା ନାହିଁ ୱେବସାଇଟ୍ ପାର୍ସ କରିପାରିଲା ନାହିଁ @@ -287,7 +281,7 @@ ଆପଣ ଡିଫଲ୍ଟ ପୁନଃସ୍ଥାପନ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? NewPipe ଏକ ତ୍ରୁଟିର ସମ୍ମୁଖୀନ ହେଲା, ରିପୋର୍ଟ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ ଦୁଃଖିତ, ତାହା ହୋଇ ନଥାନ୍ତା । - ଇ-ମେଲ ମାଧ୍ୟମରେ ଏହି ତ୍ରୁଟି ରିପୋର୍ଟ କରନ୍ତୁ + ଇ-ମେଲ ମାଧ୍ୟମରେ ରିପୋର୍ଟ କରନ୍ତୁ GitHub ରେ ରିପୋର୍ଟ କରନ୍ତୁ ଭିଡିଓ ଅଡିଓ @@ -310,7 +304,7 @@ କ୍ଲିପବୋର୍ଡରେ କପି କରାଯାଇଛି 1 ଆଇଟମ୍ ଡିଲିଟ୍ ହୋଇଛି । reCAPTCHA ଆହ୍ୱାନ - ସମାପ୍ତ + ସମାପ୍ତ ଡାଉନଲୋଡ୍ କରନ୍ତୁ ଅବୈଧ ବର୍ଣ୍ଣଗୁଡିକ ଏହି ମୂଲ୍ୟ ସହିତ ବଦଳାଯାଏ ପ୍ରତିସ୍ଥାପନ ବର୍ଣ୍ଣ @@ -347,7 +341,7 @@ ମେମୋରୀ ଲିକ୍ ମନିଟରିଂ ହିପ୍ ଡମ୍ପିଂ କରିବା ସମୟରେ ଆପ୍ ପ୍ରତିକ୍ରିୟାଶୀଳ ହୋଇପାରେ ସେବାଗୁଡିକରୁ ମୂଳ ଲେଖା ଷ୍ଟ୍ରିମ୍ ଆଇଟମ୍ ଗୁଡିକରେ ଦୃଶ୍ୟମାନ ହେବ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ - ଯଦି ଆପଣ ଏକ କଳା ପରଦା ଅନୁଭବ କରନ୍ତି କିମ୍ବା ଭିଡିଓ ପ୍ଲେବେକ୍ ଉପରେ ଝୁଣ୍ଟି ପଡ଼ନ୍ତି ତେବେ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ + ଯଦି ଆପଣ ଏକ କଳା ପରଦା ଅନୁଭବ କରନ୍ତି କିମ୍ବା ଭିଡିଓ ପ୍ଲେବେକ୍ ଉପରେ ଝୁଣ୍ଟି ପଡ଼ନ୍ତି ତେବେ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ । ଚିତ୍ରଗୁଡ଼ିକର ଉପରେ ପିକାସୋ ରଙ୍ଗୀନ ଫିତା ଦେଖାନ୍ତୁ: ସେମାନଙ୍କର ଉତ୍ସକୁ ସୂଚାଇଥାଏ: ନେଟୱାର୍କ ପାଇଁ ନାଲି, ଡିସ୍କ ପାଇଁ ନୀଳ ଏବଂ ସ୍ମୃତି ପାଇଁ ସବୁଜ ଆମଦାନି କରନ୍ତୁ ଠାରୁ ଆମଦାନୀ କରନ୍ତୁ @@ -384,7 +378,7 @@ ପ୍ରଗତି ହଜିଗଲା, କାରଣ ଫାଇଲ୍ ଡିଲିଟ୍ ହେଲା ପରବର୍ତ୍ତୀ ପ୍ରକ୍ରିୟାକରଣ ବିଫଳ ହେଲା ଫାଇଲରେ କାମ କରିବାବେଳେ ନ୍ୟୁ ପାଇପ୍ ବନ୍ଦ ହୋଇଯାଇଥିଲା - ଡିଭାଇସରେ କୌଣସି ସ୍ଥାନ ବାକି ନାହିଁ + ଡିଭାଇସରେ କୌଣସି ସ୍ଥାନ ବାକି ନାହିଁ ଡିସ୍କରୁ ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଲିଭାନ୍ତୁ\? ବନ୍ଦ କର ସର୍ବାଧିକ ପୁନଃଚେଷ୍ଟା @@ -392,7 +386,7 @@ ବନ୍ଦ କର ଡାଉନଲୋଡ୍ ବିରତି କରନ୍ତୁ କେଉଁଠାରେ ଡାଉନଲୋଡ୍ କରିବେ ପଚାରନ୍ତୁ - \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ + \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ ଆଣ୍ଡ୍ରଏଡ୍ 10 ରୁ କେବଳ \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ସମର୍ଥିତ ଏକ ଉଦାହରଣ ବାଛନ୍ତୁ ExoPlayer ପ୍ରତିବନ୍ଧକ ହେତୁ ସନ୍ଧାନ ସମୟସୀମା %d ସେକେଣ୍ଡରେ ସେଟ୍ ହୋଇଥିଲା @@ -416,7 +410,7 @@ ସ୍ଵତଃସୃଷ୍ଟ ବିଷୟବସ୍ତୁ ଡାଉନଲୋଡ୍ ଧାଡି ସୀମିତ କରନ୍ତୁ - ଅଦ୍ୟତନ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ + ଅଦ୍ୟତନ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ ନୂତନ ସଂସ୍କରଣଗୁଡ଼ିକ ପାଇଁ ମାନୁଆଲ ଯାଞ୍ଚ କରନ୍ତୁ ବିଚାରାଧୀନ ଅଛି ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରଣ କରିବେ କି\? @@ -425,9 +419,8 @@ ଟୋଗଲ୍ ସେବା, ବର୍ତ୍ତମାନ ମନୋନୀତ: ଫେରସ୍ତ କର ଓଭର୍ ରାଇଟ୍ କରନ୍ତୁ - ଥମ୍ବନେଲ୍ URL ହୋଷ୍ଟ - ଜନସାଧାରଣ + ସାର୍ଵଜନୀନ ତାଲିକାଭୁକ୍ତ ନୁହେଁ ବ୍ୟକ୍ତିଗତ ମନ୍ତବ୍ୟଗୁଡିକ ଅକ୍ଷମ ହୋଇଛି @@ -446,7 +439,7 @@ ନାପସନ୍ଦ ମନ୍ତବ୍ୟ ଗୁଡିକ ବର୍ଣ୍ଣନା - ମିଲିୟନ + ନିୟୁତ ସମାଧାନ ପ୍ଲେବେକ୍ ସ୍ପିଡ୍ ନିୟନ୍ତ୍ରଣ ଟେମ୍ପୋ @@ -502,13 +495,12 @@ ExoPlayer ଡିଫଲ୍ଟ ବୟସ ସୀମା ଅଜ୍ଞାତ ଗୁଣବତ୍ତା - ଭବିଷ୍ୟତ ଆଇଟମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ । \n \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । ତ୍ରୁଟି ରିପୋର୍ଟ ଆଲବମ୍ ଗୁଡ଼ିକ - ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭବ ନୁହେଁ ।ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରନ୍ତୁ\? + ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି\? ଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଛି କେବଳ ଥରେ ନୂତନ ପାଇପ୍ ବିଜ୍ଞପ୍ତି @@ -523,9 +515,8 @@ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ବିଲୋପ କରିବେ କି\? ସନ୍ଧାନ କୀ ଶବ୍ଦର ଇତିହାସ ବିଲୋପ କରେ ତ୍ରୁଟି - ଭିଡିଓ URL ଦସ୍ତଖତକୁ ଡିବଫସ୍କେଟ୍ କରିପାରିଲା ନାହିଁ ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା - ବାହ୍ୟ ପ୍ଲେୟାରମାନେ ଏହି ପ୍ରକାର ଲିଙ୍କକୁ ସମର୍ଥନ କରନ୍ତି ନାହିଁ + ବହିଃ-ଚାଳକ ଏଭଳି ଲିଙ୍କ୍ ସମର୍ଥନ କରେନି ଫାଇଲ୍ ଘୁଞ୍ଚିଗଲା କିମ୍ବା ଡିଲିଟ୍ ହେଲା ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ପ୍ଲେଲିଷ୍ଟ ବୁକମାର୍କ ନାହିଁ ସେପରି କୌଣସି ଫାଇଲ / ବିଷୟବସ୍ତୁ ଉତ୍ସ ନାହିଁ @@ -538,11 +529,10 @@ ସମ୍ବନ୍ଧୀୟ ଆଇଟମ୍ ଗୁଡ଼ିକ ପୁନଃ ସଯାଇବାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ ବିରାମ - ବିଲିଅନ୍ + ଵୃନ୍ଦ କୌଣସି ଗ୍ରାହକ ନାହାଁନ୍ତି ସୃଷ୍ଟି କରନ୍ତୁ ବିବରଣୀ ପାଇଁ ଟ୍ୟାପ୍ କରନ୍ତୁ - ଏହି ଫାଇଲ୍ ଚଲାଇବା ପାଇଁ କୌଣସି ଆପ୍ ସଂସ୍ଥାପିତ ହୋଇନାହିଁ ନାମ ପରିବର୍ତ୍ତନ କରନ୍ତୁ ଦୟାକରି ଅପେକ୍ଷା କର… ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ସେଟ୍ ହୋଇନାହିଁ, ବର୍ତ୍ତମାନ ଡିଫଲ୍ଟ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ବାଛନ୍ତୁ @@ -590,15 +580,14 @@ ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି । \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଦେଖାନ୍ତୁ - ଆଭ୍ୟନ୍ତରୀଣ + ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ସୃଷ୍ଟିକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ହୃଦୟ ଷ୍ଟ୍ରିମ୍ ଯାହା ଏପର୍ଯ୍ୟନ୍ତ ଡାଉନଲୋଡର୍ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ ଅଜ୍ଞାତ ଫର୍ମାଟ୍ - ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍ କୁ କେଉଁଠାରେ ସେଭ୍ କରାଯିବ ତାହା ଆପଣଙ୍କୁ ପଚରାଯିବ । -\nଯଦି ଆପଣ ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) କୁ ସକ୍ଷମ କରନ୍ତୁ + ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\' ଆପଣଙ୍କୁ ପଚରାଯିବ। +\nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ ମେମୋରୀ ଲିକ୍ ଦେଖାନ୍ତୁ ଆଇଟମଗୁଡିକରେ ମୂଳ ସମୟ ପୂର୍ବରୁ ଦେଖାନ୍ତୁ ବିସର୍ଜନ ପରେ ଖଣ୍ଡ କିମ୍ବା କାର୍ଯ୍ୟକଳାପ ଜୀବନଚକ୍ର ବାହାରେ ଅଣସଂରକ୍ଷିତ Rx ବ୍ୟତିକ୍ରମଗୁଡିକର ଫୋର୍ସ ରିପୋର୍ଟିଂ @@ -617,10 +606,9 @@ ଗୋଟିଏ ଡାଉନଲୋଡ୍ ଏକ ସମୟରେ ଚାଲିବ ସମ୍ପ୍ରତି ଟାବଲେଟ୍ ମୋଡ୍ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଅଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ - ଭବିଷ୍ୟତର ଆଇଟମ୍ ଲୁଚାନ୍ତୁ ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ ହଜାର ସୂଚନା ପାଇବା… @@ -698,7 +686,6 @@ ଏକ ସଦସ୍ୟତା ପୂର୍ବରୁ ଶେଷ ଅଦ୍ୟତନ ପରେ ସମୟ ପୁରୁଣା ବୋଲି ବିବେଚନା କରାଯାଏ -%s ଫିଡ୍ ଲୋଡ୍ କରିବାରେ ତ୍ରୁଟି ଫାଷ୍ଟ ଫିଡ୍ ମୋଡ୍ ଏହା ଉପରେ ଅଧିକ ସୂଚନା ପ୍ରଦାନ କରେ ନାହିଁ । - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଲୁଚାନ୍ତୁ ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ । \n \nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି । @@ -707,7 +694,7 @@ ଟ୍ୟାଗ୍ସ ସୂଚିତ କର , - ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବାହ୍ୟ ଖେଳାଳିଙ୍କ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ + ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବହିଃ-ଚାଳକ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ %s ଜଣ ଶ୍ରୋତା ମୋଟ %s ଜଣ ଶ୍ରୋତା @@ -726,4 +713,116 @@ 3-ଡଟ୍ ମେନୁରୁ ସଦସ୍ୟତା ଆମଦାନୀ କିମ୍ବା ରପ୍ତାନି କରନ୍ତୁ ଆପଣ NewPipe ର ସର୍ବଶେଷ ସଂସ୍କରଣ ଚଳାଉଛନ୍ତି %s ଡାଉନଲୋଡ୍ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ + ଥିମ୍ ପାଇଁ %s ଚୟନ ହେଲେ ହିଁ ଏହି ବିକଳ୍ପ ଉପଲବ୍ଧ + କାର୍ଡ + କ୍ଲିପବୋର୍ଡରେ କପି କରିବାରେ ବିଫଳ + ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ + ଧୂସର ହୋଇଯାଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ ପୂର୍ବରୁ ଏହି ଆଇଟମ୍ ଧାରଣ କରିଥାଏ । + ନକଲ %d ସମୟ (ମୋଟ) ଯୋଡି ହୋଇଛି + ହାର୍ଡୱେର୍ ମିଡିଆ ବଟନ୍ ଇଭେଣ୍ଟଗୁଡ଼ିକୁ ଉପେକ୍ଷା କରନ୍ତୁ + ଉପଯୋଗୀ, ଉଦାହରଣ ସ୍ୱରୂପ, ଯଦି ଆପଣ ଭଙ୍ଗା ଶାରୀରିକ ବଟନ୍ ସହିତ ହେଡସେଟ୍ ବ୍ୟବହାର କରୁଛନ୍ତି + ନକଲଗୁଡିକ ଅପସାରଣ କରନ୍ତୁ + ନକଲ ଗୁଡିକ ହଟାନ୍ତୁ\? + ଆପଣ ଏହି ପ୍ଲେଲିଷ୍ଟରେ ଥିବା ସମସ୍ତ ନକଲ ଷ୍ଟ୍ରିମ୍ ଅପସାରଣ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ନିମ୍ନଲିଖିତ ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ + ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ/ଲୁଚାନ୍ତୁ + ପୁରା ଦେଖାଯାଇଛି + ଆଂଶିକ ଦେଖାଯାଇଛି + ଆଗାମୀ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ବାମ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ବାମ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ଡାହାଣ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ଡାହାଣ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ଉଜ୍ଜ୍ୱଳତା + ଭଲ୍ୟୁମ୍ + କିଛି ନୁହେଁ + ମୂଖ୍ୟ ଟ୍ୟାବ ଚୟନକର୍ତ୍ତାଙ୍କୁ ତଳ ଭାଗକୁ ଘୁଞ୍ଚାନ୍ତୁ + ମୂଖ୍ଯ ଟ୍ୟାବ ଅବସ୍ଥାନ + କିଛି ExoPlayer ବିନ୍ୟାସକୁ ପରିଚାଳନା କରନ୍ତୁ । ଏହି ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ପ୍ରଭାବୀ ହେବା ପାଇଁ ଗୋଟିଏ ଚାଳକକୁ ପୁନଃଚାଳନ କରିବା ଆବଶ୍ୟକ + ExoPlayer ର ଡିକୋଡର୍ ଫଲବ୍ୟାକ୍ ବୈଶିଷ୍ଟ୍ୟକୁ ବ୍ୟବହାର କରନ୍ତୁ + ଯଦି ଆପଣଙ୍କର ଡିକୋଡର ପ୍ରାରମ୍ଭିକ ସମସ୍ୟା ଅଛି ତେବେ ଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରନ୍ତୁ, ଯାହା ପ୍ରାଥମିକ ଡିକୋଡର ପ୍ରାରମ୍ଭିକତା ବିଫଳ ହେଲେ ନିମ୍ନ ପ୍ରାଥମିକତା ଡିକୋଡରକୁ ଫେରିଥାଏ । ପ୍ରାଥମିକ ଡିକୋଡର ବ୍ୟବହାର କରିବା ସମୟରେ ଏହା ଖରାପ ପ୍ଲେବ୍ୟାକ ପ୍ରଦର୍ଶନର କାରଣ ହୋଇପାରେ + %1$s ଓ %2$s + ବର୍ଣ୍ଣନାତ୍ମକ + ମୂଳ + ଡବିଙ୍ଗ୍ ହୋଇଛି + ମୂଳ ଧ୍ୱନିକୁ ପସନ୍ଦ କରନ୍ତୁ + ଭାଷା ନିର୍ବିଶେଷରେ ମୂଳ ଧ୍ୱନି ଟ୍ରାକକୁ ବାଛନ୍ତୁ + ବର୍ଣ୍ଣନାମୂଳକ ଧ୍ୱନିକୁ ପସନ୍ଦ କରନ୍ତୁ + ଧ୍ୱନି: %s + ଧ୍ୱନି ଟ୍ରାକ୍ + ଏହି ଧାରାରେ ଗୋଟିଏ ଧ୍ୱନୀ ଟ୍ରାକ ପୂର୍ବରୁ ଉପସ୍ଥିତ ହେବା ଉଚିତ + ବାହ୍ୟ ଚାଳକମାନଙ୍କ ପାଇଁ ଧ୍ୱନୀ ଟ୍ରାକ ବାଛନ୍ତୁ + ଅଜଣା + ଉପଲବ୍ଧ ହେଲେ ଦୃଷ୍ଟିହୀନ ବ୍ୟକ୍ତିଙ୍କ ପାଇଁ ବର୍ଣ୍ଣନା ସହିତ ଗୋଟିଏ ଧ୍ୱନି ଟ୍ରାକ ଚୟନ କରନ୍ତୁ + ସର୍ବଦା ExoPlayer ର ଭିଡ଼ିଓ ଆଉଟପୁଟ୍ ପୃଷ୍ଠ ବିନ୍ୟାସ କାର୍ଯ୍ଯକ୍ଷେତ୍ରକୁ ବ୍ୟବହାର କରନ୍ତୁ + ଆପଣଙ୍କର ଡିଭାଇସରେ ଡିଫଲ୍ଟ ଭାବରେ ମିଡିଆ ସୁଡଙ୍ଗକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି କାରଣ ଆପଣଙ୍କର ଡିଭାଇସ ମଡେଲ ଏହାକୁ ସମର୍ଥନ କରୁନାହିଁ ବୋଲି ଜଣାଅଛି । + ExoPlayer ବିନ୍ୟାସଗୁଡ଼ିକ + ଏହି ୱାର୍କଆରାଉଣ୍ଡ ଭିଡିଓ କୋଡେକଗୁଡ଼ିକୁ ରିଲିଜ କରିଥାଏ ଏବଂ ପୁନଃସ୍ଥାପନ କରିଥାଏ ଯେତେବେଳେ ଗୋଟିଏ ପୃଷ୍ଠ ପରିବର୍ତ୍ତନ ହୋଇଥାଏ, ଭୂପୃଷ୍ଠକୁ ସିଧାସଳଖ କୋଡେକରେ ସେଟ କରିବା ପରିବର୍ତ୍ତେ । ଏହି ସମସ୍ୟା ସହିତ କିଛି ଉପକରଣରେ ExoPlayer ଦ୍ୱାରା ପୂର୍ବରୁ ବ୍ୟବହୃତ, ଏହି ସଂରଚନା କେବଳ ଆଣ୍ଡ୍ରଏଡ 6 ଏବଂ ଉଚ୍ଚତର ଉପରେ ପ୍ରଭାବ ପକାଇଥାଏ +\n +\nଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ସାମ୍ପ୍ରତିକ ଭିଡିଓ ପ୍ଲେୟାରକୁ ବଦଳାଇବା କିମ୍ବା ସମ୍ପୂର୍ଣ୍ଣ ପରଦାକୁ ପରିବର୍ତ୍ତନ କରିବା ସମୟରେ ପ୍ଲେବ୍ୟାକ ତ୍ରୁଟିକୁ ପ୍ରତିରୋଧ କରିପାରେ + କୌଣସି ସ୍ରୋତ ନାହିଁ + କୌଣସି ଲାଇଭ ଷ୍ଟ୍ରିମ୍ ନାହିଁ + ପ୍ରତିଛବି ଗୁଣବତ୍ତା + ଭିଡିଓଗୁଡିକ + \? + ଗ୍ରାହକଗଣ + ଚ୍ୟାନେଲ ପୃଷ୍ଠାଗୁଡ଼ିକରେ କେଉଁ ଟ୍ୟାବଗୁଡ଼ିକ ଦେଖାଯାଏ + ଚ୍ୟାନେଲ ଟ୍ୟାବଗୁଡ଼ିକ + ସର୍ଟସ୍ + ମେଟାଡାଟା ଧାରଣ କରୁଅଛି… + ସ୍କ୍ରିନ୍ ଆରିଏଣ୍ଟେସନ୍ ଟୋଗଲ୍ କରନ୍ତୁ + ନିମ୍ନମାନର + ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଟୋଗଲ୍ କରନ୍ତୁ + ଚ୍ୟାନେଲ ଟ୍ୟାବଗୁଡ଼ିକୁ ଆଣନ୍ତୁ + ଅବତାର + ପରବର୍ତ୍ତୀ ଷ୍ଟ୍ରିମ୍ + ଉପ-ଚାନେଲ ଅବତାରଗୁଡ଼ିକ + ଖେଳ ଧାଡ଼ି ଖୋଲନ୍ତୁ + ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରନ୍ତୁ ନାହିଁ + ଉଚ୍ଚ ଗୁଣବତ୍ତା + ବିଷୟରେ + ଆଗକୁ + ଆଲବମ୍ + ପୁନରାବୃତ୍ତି କରନ୍ତୁ + ପୁନର୍ବାର ଚଲାନ୍ତୁ + ଫିଡକୁ ଅଦ୍ୟତନ କରିବା ସମୟରେ ଆଣିବା ପାଇଁ ଟ୍ୟାବଗୁଡ଼ିକ । ଫାଷ୍ଟ ମୋଡ ବ୍ୟବହାର କରି ଚ୍ୟାନେଲକୁ ଅଦ୍ୟତନ କରାଗଲେ ଏହି ବିକଳ୍ପର କୌଣସି ପ୍ରଭାବ ପଡ଼ିବ ନାହିଁ । + ମଧ୍ୟମ ଗୁଣବତ୍ତା + ଅପଲୋଡର ଅବତାରଗୁଡ଼ିକ + ବ୍ୟାନରଗୁଡିକ + ପ୍ଲେଲିଷ୍ଟଗୁଡିକ + ତଥ୍ୟ ଏବଂ ସ୍ମୃତିଶକ୍ତି ବ୍ୟବହାରକୁ ହ୍ରାସ କରିବା ପାଇଁ ପ୍ରତିଛବିଗୁଡ଼ିକର ଗୁଣବତ୍ତା ଏବଂ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରିବା ଉଚିତ କି ନୁହଁ ବାଛନ୍ତୁ । ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସ୍ମରଣୀୟ ଏବଂ ଡିସ୍କ ପ୍ରତିଛବି କ୍ୟାଶେ ଉଭୟକୁ ସଫା କରିଥାଏ — %s + ଚଲାନ୍ତୁ + ଅଧିକ ବିକଳ୍ପ + ଥମ୍ବନେଲଗୁଡିକ + ଟ୍ରାକଗୁଡିକ + ଅବଧି + ଚ୍ୟାନେଲଗୁଡିକ + ପୂର୍ବ ଷ୍ଟ୍ରିମ୍ + ଲାଇଭ୍ + URL ତାଲିକା ସହଭାଗ କରନ୍ତୁ + ଶୀର୍ଷକଗୁଡ଼ିକ ସହିତ ଅଂଶୀଦାର କରନ୍ତୁ + %1$s +\n%2$s + ଖେଳ ତାଲିକା ସହଭାଗ କରନ୍ତୁ + ପ୍ଲେ-ଲିଷ୍ଟ ନାମ ଏବଂ ଭିଡିଓ ଶୀର୍ଷକ କିମ୍ବା ଭିଡିଓ URLଗୁଡ଼ିକର ଏକ ସରଳ ତାଲିକା ଭାବରେ ବିବରଣୀ ସହିତ ପ୍ଲେ-ଲିଷ୍ଟ ଅଂଶୀଦାର କରନ୍ତୁ + - %1$s: %2$s + ଅଧିକ ଦର୍ଶାନ୍ତୁ + ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ପ୍ରଥମ ତିନୋଟି କାର୍ଯ୍ୟ (ଖେଳ/ବିରତି, ପୂର୍ବବର୍ତ୍ତୀ ଏବଂ ପରବର୍ତ୍ତୀ) ତନ୍ତ୍ର ଦ୍ୱାରା ସେଟ କରାଯାଇଥାଏ ଏବଂ ଏହାକୁ ଇଚ୍ଛାରୂପଣ କରାଯାଇପାରିବ ନାହିଁ । + + %s ଉତ୍ତର + %s ଉତ୍ତରଗୁଡ଼ିକ + + କମ୍ ଦର୍ଶାନ୍ତୁ + ଉପକରଣରେ ପର୍ଯ୍ୟାପ୍ତ ଖାଲି ସ୍ଥାନ ନାହିଁ + ବ୍ୟାକଅପ୍ ଏବଂ ପୁନରୁଦ୍ଧାର କରନ୍ତୁ + ହଁ + ନା + NewPipe ସ୍ୱୟଂଚାଳିତ ଭାବରେ ସମୟ ସମୟରେ ନୂତନ ସଂସ୍କରଣଗୁଡିକ ଯାଞ୍ଚ କରିପାରିବ ଏବଂ ଥରେ ଉପଲବ୍ଧ ହେବା ପରେ ଆପଣଙ୍କୁ ସୂଚିତ କରିପାରିବ । +\nଆପଣ ଏହାକୁ ସକ୍ଷମ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? + ସେଟିଂସମୂହ ପୁନଃସେଟ୍ କରନ୍ତୁ + ସମସ୍ତ ସେଟିଂସମୂହକୁ ସେମାନଙ୍କର ଡିଫଲ୍ଟ ମୂଲ୍ୟରେ ପୁନଃସେଟ୍ କରନ୍ତୁ + ସମସ୍ତ ସେଟିଂସମୂହକୁ ପୁନଃ ସେଟ୍ କରିବା ଦ୍ବାରା ଆପଣଙ୍କର ସମସ୍ତ ପସନ୍ଦିତ ସେଟିଂସମୂହ ପରିତ୍ୟାଗ ହେବ ଏବଂ ଆପ୍ ପୁନଃ ସେଟ୍ଆରମ୍ଭ ହେବ । +\n +\nଆପଣ ଆଗକୁ ବଢିବାକୁ ଚାହୁଁଛନ୍ତି କି? + ଆମଦାନୀ ହେଉଥିବା ରପ୍ତାନିରେ ଥିବା ସେଟିଂସମୂହ ଏକ ଅସୁରକ୍ଷିତ ଫର୍ମାଟ୍ ବ୍ୟବହାର କରେ ଯାହା NewPipe 0.27.0 ପରଠାରୁ ପୁରୁଣା ହୋଇଯାଇଥିଲା । ନିଶ୍ଚିତ କରନ୍ତୁ ଯେ ଆମଦାନୀ ହେଉଥିବା ରପ୍ତାନି ଏକ ବିଶ୍ୱସ୍ତ ଉତ୍ସରୁ ଆସିଛି ଏବଂ ଭବିଷ୍ୟତରେ କେବଳ NewPipe 0.27.0 କିମ୍ବା ନୂତନରୁ ପ୍ରାପ୍ତ ରପ୍ତାନି ବ୍ୟବହାର କରିବାକୁ ପସନ୍ଦ କରନ୍ତୁ । ଏହି ଅସୁରକ୍ଷିତ ଫର୍ମାଟରେ ସେଟିଂସମୂହ ଆମଦାନି ପାଇଁ ସମର୍ଥନ ଶୀଘ୍ର ସମ୍ପୂର୍ଣ୍ଣ ରୂପେ ଅପସାରିତ ହେବ, ଏବଂ ତା’ପରେ ନୂତନ ପାଇପ୍ ର ପୁରୁଣା ସଂସ୍କରଣଗୁଡ଼ିକ ନୂତନ ସଂସ୍କରଣରୁ ରପ୍ତାନୀର ସେଟିଂସମୂହ ଆମଦାନୀ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \ 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..84e87774548 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -7,7 +7,7 @@ تیردی تصویر لئی ریزولوشن دا مول %s لئی نتیجے وِکھاۓ جا رہے ہن کجھ ریزولوشناں تے آواز نوں ہٹا دِندے - آڈیو فائلاں لئی لئی فولڈر چݨو + آڈیو فائلاں لئی ڈاؤن لوڈ فولڈر دا انتخاب کرو کوڈی نال چلاؤ اینڈروئیڈ نوں تھمنیل دے رکھ مطابق نوٹ دا رنگ بدلݨ دیو (دھیان دیو کہ ایہہ ہریک ڈِوائیس تے اًپلبدھ نہیں اے) %1$s نوں جاری کیتی گئی @@ -38,7 +38,6 @@ گوڑی اگے لنگھاؤݨ یا پچھے کرن دی سماں معد سرگرم پکیئر کتار جاوےگا - تھمنیل لوڈ کرو کتار نوں خالی کرن توں پہلاں تصویر کرن لئی پچھو ٹپݨیاں وکھاؤݨا روکݨ لئی ایسنوں بند کرو ٹپݨیاں دِکھاؤ @@ -48,8 +47,6 @@ تصویر دی کیش ہٹا دتی گئی اے کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو - آواز اشرہ کنٹرول - آواز کنٹرول کرن لئی شواواں دی ورتون کرو ڈاؤن‌لوڈ پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ پلےبیک دوبارہ شروع کرو diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 08c7e47c9fe..3ac2b9a927f 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -1,89 +1,87 @@ - ਵੱਡਦਰਸ਼ੀ ਕੱਚ \'ਤੇ ਟੈਪ ਕਰਕੇ ਸਰਚ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰੋ। - %1$s ਨੂੰ ਜਾਰੀ ਕੀਤੀ ਗਈ - ਕੋਈ ਸਟ੍ਰੀਮ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ। ਤੁਸੀਂ ਵੀਐੱਲਸੀ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੋਗੇ\? - ਸਟ੍ਰੀਮ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ (ਤੁਸੀਂ ਵੀਐੱਲਸੀ ਸਥਾਪਤ ਕਰਕੇ ਇਸਨੂੰ ਚਲਾ ਸਕਦੇ ਹੋ)। - ਸਥਾਪਤ ਕਰੋ + ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਵੱਡਦਰਸ਼ੀ ਸ਼ੀਸ਼ੇ \'ਤੇ ਟੈਪ ਕਰੋ। + %1$s ਨੂੰ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤੀ ਗਈ + ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ। ਕੀ ਤੁਸੀਂ VLC ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੋਗੇ? + ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ (ਤੁਸੀਂ ਇਸਨੂੰ ਚਲਾਉਣ ਲਈ VLC ਪਲੇਅਰ ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ)। + ਇੰਸਟਾਲ ਕਰੋ ਰੱਦ ਕਰੋ ਬ੍ਰਾਊਜ਼ਰ \'ਚ ਖੋਲ੍ਹੋ ਪੌਪ-ਅਪ ਮੋਡ \'ਚ ਖੋਲ੍ਹੋ ਸਾਂਝਾ ਕਰੋ ਡਾਊਨਲੋਡ ਕਰੋ ਸਟ੍ਰੀਮ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ - ਲੱਭੋ + ਖੋਜ ਕਰੋ ਸੈਟਿੰਗਾਂ ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ \"%1$s\"\? - ਇਸ ਨਾਲ਼ ਸਾਂਝਾ ਕਰੋ + ਦੇ ਨਾਲ ਸਾਂਝਾ ਕਰੋ ਬਾਹਰੀ ਵੀਡੀਓ ਪਲੇਅਰ ਵਰਤੋ - ਕੁਝ ਰੈਜ਼ੋਲਿਊਸ਼ਨਾਂ \'ਤੇ ਆਵਾਜ਼ ਨੂੰ ਹਟਾ ਦਿੰਦਾ ਹੈ + ਕੁਝ ਰੈਜ਼ੋਲਿਊਸ਼ਨਾਂ \'ਤੇ ਆਵਾਜ਼ ਹਟ ਸਕਦੀ ਹੈ ਬਾਹਰੀ ਆਡੀਓ ਪਲੇਅਰ ਵਰਤੋ ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਸਬਸਕ੍ਰਾਈਬ ਹੈ - ਚੈਨਲ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਹੋ ਗਿਆ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਬਦਲਣ ਵਿੱਚ ਨਾਕਾਮੀ + ਚੈਨਲ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਹੋਇਆ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ ਜਾਣਕਾਰੀ ਵਿਖਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅਪਡੇਟ ਕਰਨ ਵਿੱਚ ਨਾਕਾਮੀ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ - ਬੁੱਕਮਾਰਕ ਕੀਤੀਆਂ ਪਲੇ-ਸੂਚੀਆਂ + ਬੁੱਕਮਾਰਕ ਕੀਤੀਆਂ ਪਲੇਲਿਸਟਾਂ ਨਵਾਂ ਕੀ ਹੈ ਬੈਕਗ੍ਰਾਊਂਡ ਆਡੀਓ ਪੌਪ-ਅਪ ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ - ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡਿਓ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ + ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ ਆਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ - ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਆਡੀਓ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ + ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ ਡਿਫ਼ਾਲਟ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਪੌਪ-ਅਪ ਲਈ ਡਿਫ਼ਾਲਟ ਰੈਜ਼ੋਲਿਊਸ਼ਨ - ਵੱਡੀਆਂ ਰੈਜ਼ੋਲਿਊਸ਼ਨਜ਼ ਦਿਖਾਓ - ਸਿਰਫ਼ ਕੁਝ ਹੀ ਡਿਵਾਈਸ 2K/4K ਵੀਡੀਓ ਨੂੰ ਚਲਾ ਸਕਦੇ ਹਨ + ਉੱਚ ਰੈਜ਼ੋਲਿਊਸ਼ਨਾਂ ਵਿਖਾਓ + ਸਿਰਫ਼ ਕੁਝ ਹੀ ਡਿਵਾਈਸ 2K/4K ਵਿੱਚ ਵੀਡੀਓ ਚਲਾ ਸਕਦੇ ਹਨ Kodi ਵਿੱਚ ਚਲਾਓ - Kodi ਐਪ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ\? - \"Kodi ਵਿੱਚ ਚਲਾਓ\" ਆਪਸ਼ਨ ਦਿਖਾਓ - Kodi ਮੀਡੀਆ ਸੈਂਟਰ ਰਾਹੀਂ ਵੀਡੀਓ ਚਲਾਉਣ ਦਾ ਵਿਕਲਪ ਦਿਖਾਓ + ਗੈਰ ਮੌਜੂਦਾ Kore ਐਪ ਨੂੰ ਇੰਸਟਾਲ ਕਰੋ? + \"Kodi ਵਿੱਚ ਚਲਾਓ\" ਦਾ ਵਿਕਲਪ ਵਿਖਾਓ + ਕੋਡੀ ਮੀਡੀਆ ਸੈਂਟਰ ਰਾਹੀਂ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਇੱਕ ਵਿਕਲਪ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ ਆਡੀਓ ਡੀਫ਼ਾਲਟ ਆਡੀਓ ਫ਼ਾਰਮੈਟ ਡੀਫ਼ਾਲਟ ਵੀਡੀਓ ਫ਼ਾਰਮੈਟ ਥੀਮ - ਸਫੈਦ - ਗੂੜਾ - ਕਾਲ੍ਹਾ + ਸਫ਼ੈਦ + ਗੂੜ੍ਹਾ + ਕਾਲ਼ਾ ਪੌਪ-ਅਪ ਦਾ ਆਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ ਪੌਪ-ਅਪ ਦਾ ਆਖਰੀ ਅਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ - ਤੇਜ਼ ਪਰ ਅਸਪੱਸ਼ਟ ਸੀਕ ਵਰਤੋ - ਅਸਪੱਸ਼ਟ ਸੀਕ ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਪਰ ਅਣ-ਸਟੀਕ ਢੰਗ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ ਲਿਜਾਂਦਾ ਹੈ । ਇਸ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ 5,15 ਜਾਂ 25 ਸਕਿੰਟ ਜਾਣਾ ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ - ਥੰਮਨੇਲ ਲੋਡ ਕਰੋ - ਥੰਮਨੇਲ ਲੋਡ, ਡਾਟਾ ਦੀ ਬੱਚਤ ਅਤੇ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਨੂੰ ਰੋਕਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ। ਇਸ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਨਾਲ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ cache ਦੋਵੇਂ ਮਿਟ ਜਾਣਗੇ - ਚਿੱਤਰ cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਤੇਜ਼ ਤੇ ਅਣਸਟੀਕ ਭਾਲ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਅਣਸਟੀਕ ਭਾਲ ਨਾਲ ਪਲੇਅਰ ਘੱਟ ਸਟੀਕਤਾ ਦੇ ਪਰ ਅਧਿਕ ਤੇਜ਼ੀ ਨਾਲ ਵੀਡੀਓ ਸਥਿੱਤੀਆਂ ਦੀ ਤਲਾਸ਼ ਕਰ ਸਕਦਾ ਹੈ । ਇਸ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ 5, 15 ਜਾਂ 25 ਸਕਿੰਟ ਲਿਜਾਣਾ ਕੰਮ ਨਹੀਂ ਕਰਦਾ ਹੈ + ਚਿੱਤਰ ਕੈਸ਼ ਮਿਟਾਇਆ ਗਿਆ ਕੈਸ਼ ਕੀਤਾ ਮੈਟਾ-ਡਾਟਾ ਮਿਟਾਓ - ਸਾਰੇ ਕੈਸ਼ ਕੀਤੇ ਵੈੱਬ-ਪੇਜਾਂ ਦਾ ਡਾਟਾ ਮਿਟਾਓ - ਮੈਟਾ-ਡਾਟਾ cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ + ਵੈੱਬ-ਪੇਜਾਂ ਦਾ ਕੈਸ਼ ਕੀਤਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ + ਮੈਟਾ-ਡਾਟਾ ਕੈਸ਼ੇ ਮਿਟਾਇਆ ਗਿਆ ਅਗਲੀ ਸਟ੍ਰੀਮ ਨੂੰ ਆਟੋ-ਕਤਾਰਬੱਧ ਕਰੋ - ਇੱਕ ਮੁੱਕਣ ਵਾਲੀ ਪਰ ਨਾ-ਦੁਹਰਾਉਣ ਵਾਲੀ ਕਤਾਰ ਨੂੰ, ਸੰਬੰਧਤ ਸਟ੍ਰੀਮ ਜੋੜਦਿਆਂ, ਚਲਾਉਂਦੇ ਜਾਓ + ਇੱਕ ਮੁੱਕਣ ਵਾਲੀ ਪਰ ਨਾ-ਦੁਹਰਾਉਣ ਵਾਲੀ ਪਲੇਅਬੈਕ ਕਤਾਰ ਨੂੰ ਸੰਬੰਧਤ ਸਟ੍ਰੀਮ ਜੋੜਦੇ ਹੋਏ ਜਾਰੀ ਰੱਖੋ ਖੋਜ ਸੁਝਾਅ - ਖੋਜ ਕਰਨ ਵੇਲੇ ਦਿਖਾਏ ਜਾਂਦੇ ਸੁਝਾਵਾਂ ਦੀ ਚੋਣ ਕਰੋ - ਖੋਜ ਇਤਿਹਾਸ ਨੂੰ ਵੇਖੋ + ਖੋਜ ਕਰਨ ਵੇਲੇ ਵਿਖਾਏ ਜਾਂਦੇ ਸੁਝਾਵਾਂ ਦੀ ਚੋਣ ਕਰੋ + ਖੋਜ ਇਤਿਹਾਸ ਖੋਜ ਇਤਲਾਹਾਂ ਨੂੰ ਸਥਾਨਕ ਤੌਰ ਤੇ ਸਟੋਰ ਕਰੋ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਰੱਖੋ ਚਲਾਉਣਾ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ ਵਿਘਨਾਂ (ਜਿਵੇਂ ਕਿ ਫ਼ੋਨ-ਕਾਲਾਂ) ਤੋਂ ਬਾਅਦ ਚਲਾਉਣਾ ਜਾਰੀ ਰੱਖੋ ਡਾਊਨਲੋਡ - \'ਅਗਲੇ\' ਤੇ \'ਸਮਾਨਅੰਤਰ\' ਵੀਡੀਓ ਵਿਖਾਓ - \"ਜੋੜਨ ਲਈ ਬਟਨ ਦਬਾ ਕੇ ਰੱਖੋ\" ਵਿਖਾਓ - ਵੀਡੀਓ ਦੇ ਵੇਰਵੇ ਪੰਨੇ \'ਤੇ ਬੈਕਗ੍ਰਾਉਂਡ ਜਾਂ ਪੌਪ-ਅਪ ਬਟਨ ਨੱਪਣ \'ਤੇ ਸੁਝਾਅ ਵਿਖਾਓ + \'ਅਗਲੇ\' ਤੇ \'ਸਬੰਧਤ\' ਵੀਡੀਓ ਵਿਖਾਓ + \"ਕਤਾਰਬੱਧ ਕਰਨ ਵਾਸਤੇ ਦਬਾ ਕੇ ਰੱਖੋ\" ਵਿਖਾਓ + ਵੀਡੀਓ ਦੇ ਵੇਰਵੇ ਪੰਨੇ \'ਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਜਾਂ ਪੌਪ-ਅਪ ਬਟਨ ਨੱਪਣ \'ਤੇ ਸੁਝਾਅ ਵਿਖਾਓ ਅਣ-ਸਹਾਇਕ URL - ਮੂਲ ਦੇਸ਼ + ਸਮੱਗਰੀ ਦਾ ਮੂਲ ਦੇਸ਼ ਪਲੇਅਰ ਵਿਵਹਾਰ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਇਤਿਹਾਸ ਅਤੇ ਕੈਸ਼-ਭੰਡਾਰ ਦਿੱਖ ਡੀ-ਬੱਗ - ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ + ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ ਸਮੱਗਰੀ ਉਮਰ-ਮੁਤਾਬਕ-ਪਾਬੰਦੀਸ਼ੁਦਾ ਸਮੱਗਰੀ ਵਿਖਾਓ @@ -93,34 +91,33 @@ Error ਰਿਪੋਰਟ ਸਾਰੇ ਬੰਦ ਕੀਤਾ - ਮਿਟਾਓ + ਸਾਫ ਕਰੋ ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਵਾਪਿਸ ਸਾਰੇ ਚਲਾਓ - ਹਮੇਸ਼ਾ + ਹਮੇਸ਼ਾਂ ਸਿਰਫ਼ ਇਸ ਬਾਰ ਫਾਈਲ ਨਿਊਪਾਈਪ ਨੋਟੀਫਿਕੇਸ਼ਨ - ਨਿਊਪਾਈਪ ਬੈਕਗ੍ਰਾਉਂਡ ਅਤੇ ਪੌਪ-ਅਪ ਪਲੇਅਰਾਂ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ + ਨਿਊਪਾਈਪ ਦੇ ਪਲੇਅਰ ਦੇ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ [ਅਣਜਾਣ] - ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਚਲਾਓ + ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾਓ ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਓ ਮੇਨ ਤੇ ਚਲਾਓ ਡਾਟਾਬੇਸ ਆਯਾਤ ਕਰੋ ਡਾਟਾਬੇਸ ਨਿਰਯਾਤ ਕਰੋ - ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਇਤਿਹਾਸ, ਸਬਸਕ੍ਰਿਪਸ਼ਨਜ਼, ਪਲੇਸੂਚੀ ਅਤੇ (ਆਪਨਸ਼ਨਲੀ) ਸੈਟਿੰਗਾਂ ਨੂੰ ਨਵਿਆਂ ਨਾਲ਼ ਬਦਲ ਦਿੰਦਾ ਹੈ - ਇਤਿਹਾਸ, ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਜ਼, ਪਲੇ-ਸੂਚੀ ਅਤੇ ਸੈਟਿੰਗਾਂ ਦਰਾਮਦ ਕਰੋ + ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਇਤਿਹਾਸ, ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ (ਚੋਣਵੇਂ ਤੌਰ \'ਤੇ) ਸੈਟਿੰਗਾਂ ਨੂੰ ਨਵੀਆਂ ਨਾਲ ਬਦਲ ਦਿੰਦਾ ਹੈ + ਇਤਿਹਾਸ, ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਾਂ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨਿਰਯਾਤ ਕਰੋ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਮਿਟਾਓ - ਚਲਾਏ ਗਏ ਵੀਡੀਓਜ਼ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਪਲੇ-ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾਉਂਦਾ ਹੈ + ਚਲਾਈਆਂ ਗਈਆਂ ਸਟ੍ਰੀਮਾਂ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਪਲੇ-ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾਉਂਦਾ ਹੈ ਕੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇ\? ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾਓ ਖੋਜ ਸ਼ਬਦਾਂ ਦੀ ਸੂਚੀ ਮਿਟਾਉਂਦਾ ਹੈ - ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿਤੀ ਜਾਵੇ \? - ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿਤਾ ਗਿਆ + ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇ \? + ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਤਰੁੱਟੀ ਨੈੱਟਵਰਕ ਤਰੁੱਟੀ ਸਾਰੇ ਥੰਮਨੇਲ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੇ - ਵੀਡੀਓ URL ਦਸਤਖਤ ਦੀ ਅਸਪੱਸ਼ਟਤਾ ਦੂਰ ਨਹੀਂ ਹੋ ਸਕੀ ਵੈਬਸਾਈਟ parse ਨਹੀਂ ਹੋ ਸਕੀ ਸਮੱਗਰੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਡਾਊਨਲੋਡ ਮੀਨੂੰ ਸੈਟ-ਅਪ ਨਹੀਂ ਹੋ ਸਕਿਆ @@ -138,7 +135,7 @@ ਇੱਕ ਤਰੁੱਟੀ ਆਈ ਹੈ: %1$s ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਕੋਈ ਸਟ੍ਰੀਮ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਮੁਆਫ ਕਰਨਾ, ਅਜਿਹਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ। - ਈ-ਮੇਲ ਦੁਆਰਾ ਇਸ ਤਰੁੱਟੀ ਦੀ ਇਤਲਾਹ ਦਿਓ + ਈ-ਮੇਲ ਦੁਆਰਾ ਇਤਲਾਹ ਦਿਓ ਅਫ਼ਸੋਸ ਹੈ, ਕੁਝ ਤਰੁੱਟੀਆਂ ਸਾਹਮਣੇ ਆਈਆਂ ਹਨ। ਇਤਲਾਹ ਕਰੋ ਜਾਣਕਾਰੀ: @@ -151,20 +148,20 @@ ਪਸੰਦਾਂ ਨਾਪਸੰਦਾਂ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ - ਇਥੇ ਦਾ ਖਾਲੀਪਣ ਦੂਰ ਕਰਨ ਲਈ ਕੁਝ ਸਰਚ ਕਰੋ ਜਾਂ ਕੋਈ ਚੈਨਲ ਸਬਸਕ੍ਰਾਇਬ ਕਰੋ + ਇਥੇ ਦਾ ਖਾਲੀਪਣ ਦੂਰ ਕਰਨ ਲਈ ਕੁਝ ਸਰਚ ਕਰੋ ਜਾਂ ਚੈਨਲ ਸਬਸਕ੍ਰਾਇਬ ਕਰੋ ਅਤੇ ਪਲੇਲਿਸਟ ਬਣਾ ਕੇ ਕੋਈ ਵੀਡੀਓ ਬੁੱਕਮਾਰਕ ਕਰੋ ਮੁੜ-ਕ੍ਰਮਬੱਧ ਕਰਨ ਲਈ ਡਰੈਗ ਕਰੋ ਵੀਡੀਓ ਆਡੀਓ ਦੋਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਹਜ਼ਾਰ ਮਿਲੀਅਨ - ਬਿਲੀਅਨ + ਅਰਬ ਕੋਈ ਸਬਸਕ੍ਰਾਈਬਰ ਨਹੀਂ %s ਸਬਸਕ੍ਰਾਈਬਰ - %s ਸਬਸਕ੍ਰਾਈਬਰਸ + %s ਸਬਸਕ੍ਰਾਈਬਰ - ਕੋਈ ਵਿਊਜ਼ ਨਹੀਂ + ਕੋਈ ਵਿਊ ਨਹੀਂ %s ਵਿਊ %s ਵਿਊਜ਼ @@ -179,14 +176,14 @@ ਬਣਾਓ ਮਿਟਾਓ ਚੈੱਕ-ਸਮ - ਬਰਖਾਸਤ ਕਰੋ + ਖਾਰਿਜ ਕਰੋ ਨਾਮ ਬਦਲੋ ਠੀਕ ਹੈ ਫਾਈਲ ਦਾ ਨਾਮ ਥਰੈੱਡ ਤਰੁੱਟੀ ਨਿਊਪਾਈਪ ਡਾਊਨਲੋਡ ਕਰ ਰਹੀ ਹੈ - ਵੇਰਵਿਆਂ ਲਈ ਖੋਲੋ + ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ… ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ @@ -201,13 +198,12 @@ ਵਟਾਂਦਰਾ ਚਿੰਨ ਅੱਖਰ ਅਤੇ ਅੰਕ ਬਹੁਤੇ ਖ਼ਾਸ ਅੱਖਰ - ਇਸ ਫਾਈਲ ਨੂੰ ਚਲਾਉਣ ਲਈ ਕੋਈ ਐਪ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ - ਨਿਊਪਾਈਪ ਬਾਰੇ + ਨਿਊਪਾਈਪ ਬਾਰੇ ਵਿੱਚ ਜਾਣੋ ਤੀਜੀ ਧਿਰ ਦੇ ਲਾਈਸੈਂਸ - © %1$s ਵਲੋਂ %2$s, %3$s ਅਧੀਨ + %2$s ਵੱਲੋਂ © %1$s , %3$s ਅਧੀਨ ਐਪ ਬਾਰੇ ਤੇ ਆਮ ਸਵਾਲ ਲਾਈਸੈਂਸ - ਐਂਡਰਾਇਡ ਤੇ ਮੁਫ਼ਤ ਹਲਕੀ-ਫੁਲਕੀ ਸਟ੍ਰੀਮਿੰਗ। + ਐਂਡਰਾਇਡ ਦੇ ਲਈ ਹਲਕੀ ਅਤੇ ਮੁਫ਼ਤ ਸਟ੍ਰੀਮਿੰਗ ਐਪਲੀਕੇਸ਼ਨ। ਯੋਗਦਾਨ ਪਾਓ ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ ਹਨ; ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਬਦਲਾਵ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਅਸਲ ਭਾਰੀ ਕੋਡ ਬਦਲਾਵ — ਹਰ ਮਦਦ ਦਾ ਸਦਾ ਸਵਾਗਤ ਹੈ। ਜਿੰਨਾ ਇਸ ਨੂੰ ਜ਼ਿਆਦਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਉੱਨਾ ਹੀ ਇਹ ਬਿਹਤਰ ਹੁੰਦਾ ਹੈ! ਗਿਟਹੱਬ ਤੇ ਵੇਖੋ @@ -221,11 +217,11 @@ ਲਾਈਸੈਂਸ ਪੜ੍ਹੋ ਇਤਿਹਾਸ ਇਤਿਹਾਸ - ਕੀ ਤੁਸੀਂ ਇਸ ਚੀਜ਼ ਨੂੰ ਖੋਜ-ਸੂਚੀ ਦੇ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਖੋਜ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? ਆਖਰੀ ਚਲਾਈ ਗਈ ਸਭ ਤੋਂ ਜਿਆਦਾ ਚਲਾਈ ਗਈ ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ - ਖ਼ਾਲੀ ਪੇਜ + ਖ਼ਾਲੀ ਪੰਨਾ ਕਿਓਸਕ ਪੰਨਾ ਚੈਨਲ ਪੰਨਾ ਚੈਨਲ ਚੁਣੋ @@ -236,7 +232,7 @@ ਕੋਈ ਵੈਧ ZIP ਫਾਈਲ ਨਹੀਂ ਹੈ ਚੇਤਾਵਨੀ: ਸਾਰੀਆਂ ਫਾਈਲਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ। ਇਹ ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਸੈਟ-ਅਪ ਨੂੰ ਓਵਰ-ਰਾਈਡ ਕਰ ਦੇਵੇਗਾ। - ਰੁਝਾਨ ਵਿੱਚ + ਫਿਲਹਾਲ ਰੁਝਾਨ ਵਿੱਚ ਹੈ ਸਿਖਰਲੇ 50 ਨਵੇਂ ਅਤੇ ਤਾਜ਼ਾ-ਤਰੀਨ ਹਟਾਓ @@ -247,38 +243,38 @@ ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ ਡਰਾਅਰ ਖੋਲੋ ਡਰਾਅਰ ਬੰਦ ਕਰੋ - ਤਰਜੀਹੀ \'ਖੋਲ੍ਹੋ\' ਐਕਸ਼ਨ + \'ਖੋਲ੍ਹਣ\' ਤੇ ਤਰਜੀਹੀ ਐਕਸ਼ਨ ਸਮੱਗਰੀ ਖੋਲ੍ਹਣ ਸਮੇਂ ਡਿਫ਼ਾਲਟ ਕਾਰਵਾਈ — %s ਵੀਡੀਓ ਪਲੇਅਰ ਬੈਕਗ੍ਰਾਊਂਡ ਪਲੇਅਰ ਪੌਪ-ਅਪ ਪਲੇਅਰ ਹਮੇਸ਼ਾਂ ਪੁੱਛੋ - ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰ ਰਹੇ ਹਾਂ… + ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ… ਬੇਨਤੀ ਕੀਤੀ ਸਮੱਗਰੀ ਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ - ਨਵੀਂ ਪਲੇ-ਲਿਸਟ + ਨਵੀਂ ਪਲੇਲਿਸਟ ਨਾਮ ਬਦਲੋ ਨਾਮ - ਪਲੇ-ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ - ਬਤੌਰ ਪਲੇ-ਸੂਚੀ ਥੰਮਨੇਲ ਸੈੱਟ ਕਰੋ - ਬੁੱਕਮਾਰਕ ਪਲੇ-ਲਿਸਟ + ਪਲੇਲਿਸਟ ਵਿੱਚ ਜੋੜ੍ਹੋ + ਪਲੇਲਿਸਟ ਥੰਮਨੇਲ ਦੇ ਰੂਪ ਵਿੱਚ ਸੈੱਟ ਕਰੋ + ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਕਰੋ ਬੁੱਕਮਾਰਕ ਹਟਾਓ - ਇਸ ਪਲੇ-ਲਿਸਟ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ\? - ਪਲੇ-ਲਿਸਟ ਬਣਾਈ ਗਈ - ਪਲੇ-ਲਿਸਟ ਕੀਤਾ ਗਿਆ - ਪਲੇ-ਲਿਸਟ ਥੰਮਨੇਲ ਬਦਲਿਆ ਗਿਆ। + ਕੀ ਇਸ ਪਲੇਲਿਸਟ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ? + ਪਲੇਲਿਸਟ ਬਣਾਈ ਗਈ + ਪਲੇਲਿਸਟ ਕੀਤਾ ਗਿਆ + ਪਲੇਲਿਸਟ ਦਾ ਥੰਮਨੇਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ। ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ ਫਿੱਟ ਭਰੋ ਜ਼ੂਮ ਆਪਣੇ-ਆਪ ਬਣੀ ਸਿਰਲੇਖ - ਪਲੇਅਰ ਸੁਰਖੀ, text ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਟਾਈਲ ਨੂੰ ਸੋਧੋ। ਪ੍ਰਭਾਵ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ + ਪਲੇਅਰ ਕੈਪਸ਼ਨ ਟੈਕਸਟ ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਟਾਈਲ ਨੂੰ ਸੋਧੋ। ਪ੍ਰਭਾਵੀ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ ਮੈਮੋਰੀ ਲੀਕ ਨਿਗਰਾਨੀ, ਐਪ ਨੂੰ ਆਕ੍ਰਿਆਸ਼ੀਲ ਬਣਾ ਸਕਦੀ ਹੈ ਜਦੋਂ ਹੀਪ ਡੰਪਿੰਗ ਹੁੰਦੀ ਹੈ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਤਰੁੱਟੀਆਂ ਰਿਪੋਰਟ ਕਰੋ - ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਫਰੈਗਮੈਂਟ ਜਾਂ ਐਕਟੀਵਿਟੀ ਦੇ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਨਾ ਪਹੁੰਚਾਉਣ ਯੋਗ ਆਰ-ਐਕਸ ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰਨਾ + ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਫਰੈਗਮੈਂਟ ਜਾਂ ਐਕਟੀਵਿਟੀ ਦੇ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਨਾ ਪਹੁੰਚਾਉਣ ਯੋਗ ਆਰ-ਐਕਸ ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰੋ ਇੰਪੋਰਟ - ਇੰਪੋਰਟ ਕਰੋ - ਐਕਸਪੋਰਟ ਕਰੋ + ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ + ਤੇ ਐਕਸਪੋਰਟ ਕਰੋ ਇੰਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ… ਐਕਸਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ… ਇੰਪੋਰਟ ਫਾਈਲ @@ -319,165 +315,160 @@ ਅਸਵੀਕਾਰ ਕੋਈ ਸੀਮਾ ਨਹੀਂ ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨੂੰ ਸੀਮਿਤ ਕਰੋ - ਐਪ ਸਵਿੱਚ ਕਰਨ ਤੇ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਐਪ \'ਤੇ ਜਾਣ ਵੇਲ਼ੇ ਕਾਰਵਾਈ — %s + ਐਪ ਬਦਲਦੇ ਸਮੇਂ ਉਸਨੂੰ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ + ਮੇਨ ਵੀਡੀਓ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਐਪ \'ਤੇ ਜਾਣ ਵੇਲ਼ੇ ਕਾਰਵਾਈ — %s ਕੋਈ ਨਹੀਂ - ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ Minimize ਕਰੋ - ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ minimize ਕਰੋ + ਬੈਕਗ੍ਰਾਊਂਡ ਪਲੇਅਰ ਵਿੱਚ ਬਦਲੋ + ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ ਬਦਲੋ ਚੁੱਪ ਦੌਰਾਨ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ ਕਰੋ ਕਦਮ ਰੀਸੈੱਟ ਚੈਨਲ - ਪਲੇ ਸੂਚੀਆਂ + ਪਲੇਲਿਸਟਾਂ ਟਰੈਕਸ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਆਵਾਜ਼ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ - ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ - ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ - ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ - ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ - ਅਪਡੇਟਾਂ + ਸਮੱਗਰੀ ਦੀ ਮੂਲ ਭਾਸ਼ਾ + ਅੱਪਡੇਟਾਂ ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ ਐਪ ਅੱਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣਾਂ ਲਈ ਪ੍ਰਾਪਤ ਸੂਚਨਾਵਾਂ ਬਾਹਰੀ ਸਟੋਰੇਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ - ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \? + ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \? ਸਾਂਭੀਆਂ ਟੈਬਾਂ ਨਹੀਂ ਪੜ੍ਹ ਹੋਈਆਂ, ਇਸ ਲਈ ਡਿਫਾਲਟ ਟੈਬਾਂ ਦੀ ਵਰਤੋਂ ਹੋ ਰਹੀ ਹੈ ਡੀਫ਼ਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ ਕੀ ਤੁਸੀਂ ਡਿਫਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? ਸਬਸਕ੍ਰਾਈਬਰਾਂ ਦੀ ਗਿਣਤੀ ਅਣ-ਉਪਲਬਧ ਮੁੱਖ ਪੰਨੇ ਤੇ ਕਿਹੜੇ ਟੈਬ ਵਿਖਾਏ ਜਾਣਗੇ - ਅਪਡੇਟਾਂ - ਜਦੋਂ ਨਵਾਂ ਸੰਸਕਰਣ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ ਤਾਂ ਐਪ ਅਪਡੇਟ ਨੂੰ ਪੁੱਛਣ ਲਈ ਇੱਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦਿਖਾਓ - ਲਿਸਟ ਵਿਊ ਮੋਡ - ਲਿਸਟ + ਅੱਪਡੇਟਾਂ + ਜਦੋਂ ਐਪ ਦੀ ਨਵੀਂ ਅੱਪਡੇਟ ਉਪਲੱਬਧ ਹੋਵੇ ਤਾਂ ਅੱਪਡੇਟ ਕਰਨ ਵਾਸਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿਖਾਓ + ਸੂਚੀ ਵੇਖਣ ਦਾ ਢੰਗ + ਸੂਚੀ ਗਰਿੱਡ ਆਟੋ - ਨਿਊ-ਪਾਈਪ ਦੀ ਅਪਡੇਟ ਉਪਲਬੱਧ ਹੈ! + ਨਿਊ-ਪਾਈਪ ਦੀ ਅੱਪਡੇਟ ਉਪਲਬੱਧ ਹੈ! ਮੁਕੰਮਲ ਹੋਇਆ ਬਕਾਇਆ - ਰੁਕਿਆ - ਕਤਾਰਬੱਧ - Post-processing - ਕਤਾਰ ਕਰੋ + ਰੋਕਿਆ + ਕਤਾਰ ਵਿੱਚ + ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ + ਕਤਾਰਬੱਧ ਕਰੋ ਸਿਸਟਮ ਦੁਆਰਾ ਕਾਰਵਾਈ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਗਿਆ ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ - ਵਿਲੱਖਣ ਨਾਮ Generate ਕਰੋ - overwrite + ਵਿਲੱਖਣ ਨਾਮ ਬਣਾਓ + ਓਵਰਰਾਈਟ ਕਰੋ ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਕ ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਤੋਂ ਜਾਰੀ ਹੈ - ERROR ਵਿਖਾਓ + ਤਰੁੱਟੀ ਵਿਖਾਓ ਮੰਜ਼ਿਲ ਫੋਲਡਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ ਫਾਈਲ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਸਥਾਪਤ ਨਹੀਂ ਹੋ ਸਕਿਆ ਸਰਵਰ ਨਹੀਂ ਲੱਭ ਸਕਿਆ ਸਰਵਰ ਨਾਲ ਜੁੜ ਨਹੀਂ ਸਕਿਆ ਸਰਵਰ ਨੇ ਡਾਟਾ ਨਹੀਂ ਭੇਜਿਆ - ਸਰਵਰ ਮਲਟੀ-Threaded ਡਾਊਨਲੋਡਸ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ, ਇਸ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ @string/msg_threads = 1 + ਸਰਵਰ ਮਲਟੀ-ਥਰਿੱਡ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ ਹੈ, @string/msg_threads = 1 ਨਾਲ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਨਹੀਂ ਲਭਿਆ - Post-processing ਫੇਲ੍ਹ - ਰੁੱਕੋ + ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ ਹੋਈ + ਰੋਕੋ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ ਡਾਉਨਲੋਡ ਰੱਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ - ਮੀਟਰ ਕੀਤੇ ਨੈਟਵਰਕਸ ਤੇ ਰੁਕਾਵਟ - ਮੋਬਾਈਲ ਡਾਟਾ ਤੇ ਸਵਿੱਚ ਕਰਨ ਵੇਲੇ ਲਾਭਦਾਇਕ ਹੈ, ਹਾਲਾਂਕਿ ਕੁਝ ਡਾਉਨਲੋਡਾਂ ਨੂੰ ਮੁਅੱਤਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ + ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕ ਤੇ ਰੋਕੋ + ਮੋਬਾਈਲ ਡਾਟਾ ਦੇ ਇਸਤੇਮਾਲ ਵੇਲੇ ਫਾਇਦੇਮੰਦ ਹੈ, ਹਾਲਾਂਕਿ ਕੁਝ ਡਾਉਨਲੋਡਾਂ ਨੂੰ ਮੁਅੱਤਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਇਵੇੰਟਸ ਕਾਨਫਰੰਸਾਂ - ਟਿੱਪਣੀਆਂ ਦਿਖਾਓ + ਟਿੱਪਣੀਆਂ ਵਿਖਾਓ ਟਿੱਪਣੀਆਂ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ ਆਟੋ-ਪਲੇਅ - ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਕੀਤੀ ਗਈ + ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਟਿੱਪਣੀਆਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ ਬੰਦ ਕਰੋ - ਪਲੇਅਬੈਕ ਦੋਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ + ਪਲੇਅਬੈਕ ਫਿਰ ਚਾਲੂ ਕਰੋ ਪਿਛਲੀ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਤੋਂ ਮੁੜ ਚਲਾਓ - ਸੂਚੀਆਂ ਦੀ ਸਥਿਤੀ - ਸੂਚੀਆਂ ਵਿੱਚ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸੂਚਕ ਦਿਖਾਓ + ਸੂਚੀਆਂ ਵਿੱਚ ਸਥਿਤੀ + ਸੂਚੀਆਂ ਵਿੱਚ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸੂਚਕ ਵਿਖਾਓ ਡਾਟਾ ਮਿਟਾਓ ਵੇਖੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦੀ ਇਤਿਹਾਸ ਸੂਚੀ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ - ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ + ਪਲੇਅਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਫਾਈਲ ਤਬਦੀਲ ਕੀਤੀ ਜਾਂ ਮਿਟਾਈ ਗਈ ਇਸ ਨਾਮ ਵਾਲੀ ਇੱਕ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ ਇਸ ਨਾਮ ਨਾਲ ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ - ਫਾਈਲ Overwrite ਨਹੀਂ ਹੋ ਸਕਦੀ - ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਥੇ ਇੱਕ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਹੈ - ਫਾਈਲ ਤੇ ਕੰਮ ਕਰਦੇ ਸਮੇਂ NewPipe ਬੰਦ ਕੀਤੀ ਗਈ ਸੀ - ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ - Progress lost, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟ ਗਈ ਸੀ - ਕੁਨੈਕਸ਼ਨ timeout - ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਸਾਫ਼ ਕਰਨਾ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? - ਡਾਊਨਲੋਡ ਸੀਮਾ ਕਤਾਰ ਵਿੱਚ - ਇੱਕ ਸਮੇਂ ਤੇ ਇੱਕੋ ਡਾਊਨਲੋਡ ਚੱਲੇਗਾ + ਫਾਈਲ ਓਵਰਰਾਈਟ ਨਹੀਂ ਹੋ ਸਕਦੀ + ਇਸ ਨਾਮ ਦਾ ਇੱਕ ਡਾਊਨਲੋਡ ਬਕਾਇਆ ਹੈ + ਫਾਈਲ ਤੇ ਕੰਮ ਕਰਦੇ ਸਮੇਂ ਨਿਊਪਾਈਪ ਬੰਦ ਕੀਤੀ ਗਈ + ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ + ਪ੍ਰਗਤੀ ਖਤਮ ਹੋ ਗਈ, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟਾਈ ਗਈ + ਕੁਨੈਕਸ਼ਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ + ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਡਾਊਨਲੋਡ ਕਤਾਰ ਸੀਮਤ ਕਰੋ + ਇੱਕ ਹੀ ਸਮੇਂ ਤੇ ਇੱਕੋ ਡਾਊਨਲੋਡ ਚੱਲੇਗਾ ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰੋ ਡਾਊਨਲੋਡਸ ਰੋਕੋ - ਪੁੱਛੋ ਕਿੱਥੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ + ਡਾਊਨਲੋਡ ਕਿੱਥੇ ਕਰਨਾ ਹੈ, ਦੇ ਲਈ ਪੁੱਛੋ ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ। \nਜੇ ਤੁਸੀਂ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿਸੇ ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਸਾਂਭਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਚਾਲੂ ਕਰੋ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਦੀ ਵਰਤੋਂ ਕਰੋ - \'ਸਟੋਰੇਜ ਐਕਸੈਸ ਫ਼ਰੇਮਵਰਕ\' ਬਾਹਰੀ SD ਕਾਰਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ + \'ਸਟੋਰੇਜ ਐਕਸੈਸ ਫ਼ਰੇਮਵਰਕ\' ਬਾਹਰੀ SD ਕਾਰਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦਿੰਦਾ ਹੈ ਥੰਮਨੇਲ ਨੂੰ 1:1 ਮਾਪ ਦਾ ਕਰੋ - %s ਲਈ ਨਤੀਜੇ ਵਿਖਾਏ ਜਾ ਰਹੇ ਹਨ + %s : ਲਈ ਨਤੀਜੇ ਵਿਖਾਏ ਜਾ ਰਹੇ ਹਨ ਜਦੋਂ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਖ਼ਾਸ ਫ਼ੀਡ ਤੋਂ ਮੰਗਵਾਓ ਤੇਜ਼ ਫ਼ੀਡ ਮੋਡ ਇਸ ਬਾਰੇ ਕੋਈ ਹੋਰ ਜਾਣਕਾਰੀ ਮੁੱਹਈਆ ਨਹੀਂ ਕਰਾਉਂਦਾ। - ਐਕਸੋਪਲੇਅਰ ਦੀਆਂ ਬੰਦਿਸ਼ਾਂ ਕਰਕੇ ਲੱਭਣ ਮਿਆਦ %d ਸਕਿੰਟ ਸੈੱਟ ਕੀਤੀ ਗਈ ਸੀ + ਐਕਸੋਪਲੇਅਰ ਦੀ ਬੰਦਿਸ਼ ਕਰਕੇ ਸੀਕ ਕਰਨ ਦੀ ਮਿਆਦ %d ਸਕਿੰਟ ਸੈੱਟ ਕੀਤੀ ਗਈ ਇਹ ਡਾਊਨਲੋਡ ਮੁੜ-ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਮੁੜ-ਪ੍ਰਾਪਤੀ - ਜੇ ਤੁਹਾਨੂੰ ਕਾਲ਼ੀ ਸਕਰੀਨ ਮਿਲੇ ਜਾਂ ਵੀਡਿਓ ਰੁਕ-ਰੁਕ ਕੇ ਚੱਲੇ ਤਾਂ ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰ ਦਿਓ + ਜੇ ਤੁਹਾਨੂੰ ਕਾਲ੍ਹੀ ਸਕਰੀਨ ਮਿਲੇ ਜਾਂ ਵੀਡਿਓ ਰੁਕ-ਰੁਕ ਕੇ ਚੱਲੇ ਤਾਂ ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰ ਦਿਓ। ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰੋ ਸੇਵਾਵਾਂ ਵੱਲੋਂ ਆਈ ਅਸਲ ਲਿਖਤ ਸਟ੍ਰੀਮ ਨਗਾਂ ਵਿੱਚ ਵਿਖਾਈ ਦੇਵੇਗੀ ਨਗਾਂ ਦੇ ਆਉਣ ਦਾ ਅਸਲੀ ਸਮਾਂ ਵਿਖਾਓ ਮੈਮਰੀ ਲੀਕ ਵਿਖਾਓ ਆਪਣੇ-ਆਪ ਬਣੀ (ਕੋਈ ਅਪਲੋਡਰ ਨਹੀਂ ਲੱਭਿਆ) - ਹਾਲੇ ਕੋਈ ਵੀ ਪਲੇ-ਸੂਚੀ ਬੁੱਕਮਾਰਕ ਨਹੀਂ ਕੀਤੀ ਹੋਈ + ਹਾਲੇ ਕੋਈ ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਨਹੀਂ ਕੀਤੀ ਹੋਈ ਡਿਫ਼ਾਲਟ ਕਿਓਸਕ ਹੈਸ਼ ਦਾ ਲੇਖਾ-ਜੋਖਾ ਹੋ ਰਿਹਾ ਹੈ - ਸੇਵਾ ਟੌਗਲ ਕਰੋ, ਮੌਜੂਦਾ ਚੋਣ: + ਸੇਵਾ ਚੁਣੋ, ਮੌਜੂਦਾ ਚੋਣ: ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਲਓ ਕਿ ਤੁਹਾਡੇ ਵਾਲ੍ਹੇ ਕ੍ਰੈਸ਼ ਦੀ ਗੱਲ ਕਰਦਾ ਕੋਈ ਮਸਲਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਤਾਂ ਨਹੀਂ। ਇੱਕੋ ਮਸਲੇ ਦੀਆਂ ਦੋ ਜਾਂ ਵੱਧ ਨਕਲਾਂ ਬਣਾ ਕੇ ਤੁਸੀਂ ਸਾਡੇ ਤੋਂ ਉਹ ਵਕਤ ਖੋਹ ਲੈਂਦੇ ਹੋ ਜੋ ਅਸੀਂ ਅਸਲੀ ਮਸਲੇ ਦੇ ਹੱਲ ਲਈ ਲਾਉਣਾ ਸੀ। - ਫ਼ਾਰਮੈਟਡ ਰਿਪੋਰਟ ਨਕਲ ਕਰੋ + ਫ਼ਾਰਮੈਟ ਕੀਤੀ ਰਿਪੋਰਟ ਕਾਪੀ ਕਰੋ reCAPTCHA ਹੱਲ ਕਰਦੇ ਵੇਲ਼ੇ ਨਿਊਪਾਈਪ ਵਿੱਚ ਜਮ੍ਹਾਂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਹੋ ਗਈਆਂ ਹਨ reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ - ਵੀਡਿਓ ਹੈਸ਼ਿੰਗ ਦੀ ਕਾਰਵਾਈ ਦੀ ਮੌਜੂਦਾ ਹਾਲਤ ਦੀਆਂ ਇਤਲਾਹਾਂ + ਵੀਡਿਓ ਹੈਸ਼ਿੰਗ ਦੀ ਕਾਰਵਾਈ ਦੀ ਮੌਜੂਦਾ ਹਾਲਤ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਇਹ ਵੀਡੀਓ ਉਮਰ-ਹੱਦ ਮੁਤਾਬਕ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। \nਯੂਟਿਊਬ ਦੀਆਂ ਉਮਰ-ਹੱਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਨੀਤੀਆਂ ਦੇ ਕਾਰਨ ਨਿਊ-ਪਾਈਪ ਇਸਦੀਆਂ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦੀ ਅਤੇ ਇਸੇ ਕਰਕੇ ਇਸਨੂੰ ਚਲਾ ਵੀ ਨਹੀਂ ਸਕਦੀ। - ਇਤਲਾਹਾਂ ਵਿੱਚ ਵੀਡਿਓ ਥੰਮਨੇਲ ਦੇ ਪੈਮਾਨੇ ਨੂੰ 16:9 ਤੋਂ ਘਟਾ ਕੇ 1:1 ਕਰੋ (ਤਸਵੀਰ ਵਿਗੜੀ ਹੋਈ ਦਿਸ ਸਕਦੀ ਹੈ) + ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਏ ਵੀਡਿਓ ਥੰਮਨੇਲ ਨੂੰ 16:9 ਦੀ ਬਜਾਏ 1:1 ਅਨੁਪਾਤ ਦਾ ਵਿਖਾਓ ਇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ ਵੈਬਸਾਈਟ ਖੋਲ੍ਹੋ ਅੰਦਰੂਨੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਗੈਰ-ਸੂਚੀਬੱਧ ਜਨਤਕ - ਥੰਮਨੇਲ URL ਮੇਜ਼ਬਾਨ ਸਹਾਇਤਾ - ਭਾਸ਼ਾ/ਬੋਲੀ + ਭਾਸ਼ਾ ਉਮਰ ਹੱਦ ਪਰਦੇਦਾਰੀ ਲਾਈਸੈਂਸ ਟੈਗ - ਵਰਗ + ਸ਼੍ਰੇਣੀ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਚੁਣਨਾ ਬੰਦ ਕਰੋ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਚੁਣਨਾ ਚਾਲੂ ਕਰੋ - ਤੁਸੀਂ ਹੁਣ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹੋ। ਧਿਆਦੇ ਦਿਓ ਕਿ ਲਿਖਤ ਸਲੈਕਟ ਮੋਡ ਵਿੱਚ ਪੰਨਾ ਜਗ-ਬੁੱਝ ਸਕਦਾ ਹੈ ਅਤੇ ਲਿੰਕ ਵੀ ਕਲਿਕ ਕਰਨ ਯੋਗ ਨਹੀਂ ਹੋਣਗੇ। + ਤੁਸੀਂ ਹੁਣ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹੋ। ਨੋਟ ਕਰੋ ਕਿ ਪੰਨਾ ਜਗ-ਬੁੱਝ ਸਕਦਾ ਹੈ ਅਤੇ ਚੋਣ ਮੋਡ ਵਿੱਚ ਹੋਣ ਵੇਲੇ ਲਿੰਕ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਨਹੀਂ ਹੋ ਸਕਦੇ ਹਨ। ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਗਿਐ ਤੁਸੀਂ ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਹੇਠਾਂ ਚੁਣ ਸਕਦੇ ਹੋ ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਚੁਣੋ — %s - ਆਪ-ਮੁਖ਼ਤਾਰ (ਡਿਵਾਈਸ ਦੀ ਥੀਮ) + ਆਟੋਮੈਟਿਕ (ਡਿਵਾਈਸ ਥੀਮ) ਰੇਡੀਓ - ਉਚੇਚੀ ਪੇਸ਼ਕਸ਼ + ਫੀਚਰਡ ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। - %s ਨੇ ਇਹ ਕਰਨ ਦੱਸਿਆ ਹੈ: + %s ਇਸਦਾ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: ਖਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ ਇਹ ਵੀਡੀਓ ਸਿਰਫ਼ ਯੂਟਿਊਬ ਮਿਊਜ਼ਿਕ ਦੇ ਪ੍ਰੀਮੀਅਮ ਮੈਂਬਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਹ ਸਮੱਗਰੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। - ਇਹ ਸਮੱਗਰੀ ਤੁਹਾਡੇ ਮੁਲਕ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ। + ਇਹ ਸਮੱਗਰੀ ਤੁਹਾਡੇ ਮੁਲਕ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਦੀ ਕੋਈ ਵੀ ਐਪ ਇਸ ਨੂੰ ਖੋਲ੍ਹ ਨਹੀਂ ਸਕਦੀ ਚੈਪਟਰ ਹਾਲੀਆ - ਥੰਮਨੇਲ ਨੂੰ ਤਾਲਾਬੱਧ ਸਕਰੀਨ ਦੇ ਪਿਛੋਕੜ ਅਤੇ ਇਤਲਾਹਾਂ ਦੋਹਾਂ ਲਈ ਵਰਤੋ + ਥੰਮਨੇਲ ਨੂੰ ਤਾਲਾਬੱਧ ਸਕਰੀਨ ਦੇ ਪਿਛੋਕੜ ਅਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦੋਵਾਂ ਲਈ ਵਰਤੋ ਥੰਮਨੇਲ ਵਿਖਾਓ - ਪਲੇ-ਸੂਚੀ ਪੰਨਾ + ਪਲੇਲਿਸਟ ਪੰਨਾ %s ਦੁਆਰਾ %s ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਇਹ ਸਮੱਗਰੀ ਹਾਲੇ ਨਿਊ-ਪਾਈਪ \'ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਦੀ। @@ -490,13 +481,13 @@ \nਕੀ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰਨਾ ਚਾਹੋਗੇ\? \'%s\' ਵਾਸਤੇ ਫ਼ੀਡ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀ। ਫ਼ੀਡ ਲੋਡ ਕਰਨ ਵਿੱਚ ਤਰੁੱਟੀ ਰਹੀ - ਹਮੇਸ਼ਾ ਅਪਡੇਟ ਕਰੋ - ਫ਼ੀਡ ਅਪਡੇਟ ਦੀ ਹੱਦ + ਹਮੇਸ਼ਾਂ ਅੱਪਡੇਟ ਕਰੋ + ਫ਼ੀਡ ਅੱਪਡੇਟ ਦੀ ਹੱਦ ਫ਼ੀਡ ਸਿਰਫ਼ ਉਹ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਵਿਖਾਓ ਜੋ ਕਿਸੇ ਗਰੁੱਪ ਵਿੱਚ ਨਹੀਂ ਪਾਈਆਂ ਹੋਈਆਂ ਨਵਾਂ ਕੀ ਤੁਸੀਂ ਇਸ ਗਰੁੱਪ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? - ਖ਼ਾਲੀ ਗਰੁੱਪ ਨਾਮ + ਗਰੁੱਪ ਦਾ ਨਾਮ ਨਹੀਂ %d ਚੁਣੀ %d ਚੁਣੀਆਂ @@ -505,8 +496,8 @@ ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਚੁਣੋ ਫ਼ੀਡ \'ਤੇ ਅਮਲ ਹੋ ਰਿਹੈ… ਫ਼ੀਡ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… - ਲੋਡ ਨਹੀਂ ਹੋਇਆ: %d - ਫ਼ੀਡ ਆਖ਼ਰੀ ਵਾਰ %s ਨੂੰ ਅਪਡੇਟ ਹੋਈ ਸੀ + ਲੋਡ ਨਹੀਂ ਹੋਏ: %d + ਫ਼ੀਡ ਆਖ਼ਰੀ ਵਾਰ %s ਨੂੰ ਅੱਪਡੇਟ ਹੋਈ ਚੈਨਲ ਗਰੁੱਪ %d ਦਿਨ @@ -525,33 +516,33 @@ %d ਸਕਿੰਟ ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ - ਵੀਡੀਓਜ਼ ਜੋ ਪਲੇ-ਸੂਚੀ ਵਿੱਚ ਜੋੜੇ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੀਆਂ ਜਾ ਚੁੱਕੀਆਂ ਹਨ, ਉਹ ਹਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ. -\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ! - ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀਡੀਓਜ਼ ਹਟਾਉਣੀਆਂ ਹਨ\? - ਵੇਖੀਆਂ ਹੋਈਆਂ ਹਟਾਓ + ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ, ਪਹਿਲਾਂ ਚਾਹੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। +\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ! + ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? + ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ - ਐਪ ਭਾਸ਼ਾ - ਕੋਈ ਸਥਿਤੀ ਚੁਣੋ - \'ਸਟੋਰੇਜ ਐਕਸੈੱਸ ਫ਼ਰੇਮਵਰਕ\' ਐਂਡਰਾਇਡ 10 ਤੋਂ ਕੰਮ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ - ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ + ਐਪ ਦੀ ਭਾਸ਼ਾ + ਕੋਈ ਇੰਸਟੈਂਸ ਚੁਣੋ + ਐਂਡਰਾਇਡ 10 ਤੋਂ ਸ਼ੁਰੂ ਹੋ ਕੇ ਕੇਵਲ \'ਸਟੋਰੇਜ ਐਕਸੈੱਸ ਫ਼ਰੇਮਵਰਕ\' ਸਮਰਥਿਤ ਹੈ + ਤੁਹਾਨੂੰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਹਰ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ - ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਸਾਫ਼ ਕਰੋ - ਕਦੇ ਵੀ ਨਹੀਂ + ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਓ + ਕਦੇ ਨਹੀਂ ਸਿਰਫ਼ ਵਾਈ-ਫ਼ਾਈ \'ਤੇ - ਪਲੇਬੈਕ ਆਪਣੇ-ਆਪ ਸ਼ੁਰੂ ਕਰੋ — %s + ਸਵੈਚਾਲਿਤ ਤੌਰ ਤੇ ਪਲੇਅਬੈਕ ਸ਼ੁਰੂ ਕਰੋ — %s ਐਪ ਕ੍ਰੈਸ਼ ਕਰੋ ਅਵਾਜ਼ ਚਾਲੂ ਕਰੋ ਅਵਾਜ਼ ਬੰਦ ਕਰੋ ਕਤਾਰਬੱਧ ਹੋ ਗਿਆ ਕਤਾਰਬੱਧ ਕਰੋ ਚੈਨਲ ਵੇਰਵੇ ਵਿਖਾਓ - ਕਤਾਰ ਚਲਾਓ - ਸਭ ਤੋਂ ਵੱਧ ਪਸੰਦ + ਪਲੇਅ ਕਤਾਰ + ਵਧੇਰੇ ਪਸੰਦ ਕੀਤੇ ਗਏ ਹਾਲ ਹੀ ਵਿੱਚ ਸ਼ਾਮਿਲ ਸਥਾਨਕ ਭਾਸ਼ਾ ਐਪ ਨੂੰ ਦੋਬਾਰਾ ਚਲਾਉਣ \'ਤੇ ਬਦਲੇਗੀ - ਪਲੇ-ਸੂਚੀ ਚੁਣੋ - ਹੋ ਗਿਆ + ਪਲੇਲਿਸਟ ਚੁਣੋ + ਹੋ ਗਿਆ ਹੱਲ ਕਰੋ ਹੱਲ ਹੋਣ \'ਤੇ \"ਹੋ ਗਿਆ\" ਨੱਪੋ ਹਾਲੇ ਕੋਈ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ, ਹੁਣੇ ਡਿਫ਼ਾਲਟ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਚੁਣੋ @@ -572,11 +563,11 @@ ਟਿੱਪਣੀਆਂ ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ - ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ\? + ਕੀ ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ\? ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਂਦਾ ਹੈ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਓ ਵੀਡੀਓ ਹੈਸ਼ ਇਤਲਾਹ - ਐਲਬਮਾਂ + ਐਲਬਮ ਕਲਾਕਾਰ ਗੀਤ ਵੀਡੀਓ @@ -586,57 +577,57 @@ ਯੂਟਿਊਬ \"ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ\" ਉਪਲਬਧ ਕਰਾਉਂਦਾ ਹੈ ਜੋ ਬਾਲਗਾਂ ਵਾਲ਼ੀ ਸਮੱਗਰੀ ਲੁਕਾਉਂਦਾ ਹੈ ਯੂਟਿਊਬ ਦਾ ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ ਚਾਲੂ ਕਰੋ ਉਹ ਸਮੱਗਰੀ ਵੀ ਵਿਖਾਓ ਜੋ ਉਮਰ-ਸੀਮਾ ਕਰਕੇ ਬੱਚਿਆਂ ਲਈ ਸ਼ਾਇਦ ਸਹੀ ਨਾ ਹੋਵੇ (ਜਿਵੇਂ 18+) - ਸਥਿਤੀ ਪਹਿਲਾਂ ਨੂੰ ਮੌਜੂਦ ਹੈ - ਸਿਰਫ਼ HTTP URLs ਹੀ ਮਾਣਨਯੋਗ ਹਨ - ਸਥਿਤੀ ਦੀ ਜਾਇਜ਼ਗੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ - ਸਥਿਤੀ URL ਦਾਖ਼ਲ ਕਰੋ - ਸਥਿਤੀਆਂ ਜੋੜੋ - ਤੁਹਾਡੀਆਂ ਪਸੰਦੀਦਾ ਸਥਿਤੀਆਂ %s \'ਤੇ ਲੱਭੋ - ਆਪਣੀ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਸਥਿਤੀਆਂ ਚੁਣੋ - ਪੀਅਰਟਿਊਬ ਸਥਿਤੀਆਂ + ਇੰਸਟੈਂਸ ਪਹਿਲਾਂ ਤੋਂ ਮੌਜੂਦ ਹੈ + ਸਿਰਫ਼ HTTP URLs ਹੀ ਮੰਨਣਯੋਗ ਹਨ + ਇੰਸਟੈਂਸ ਦੀ ਜਾਇਜ਼ਗੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ + ਇੰਸਟੈਂਸ URL ਦਾਖ਼ਲ ਕਰੋ + ਇੰਸਟੈਂਸ ਜੋੜੋ + ਤੁਹਾਡੇ ਪਸੰਦੀਦਾ ਇੰਸਟੈਂਸ %s \'ਤੇ ਲੱਭੋ + ਆਪਣੇ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ ਚੁਣੋ + ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ URL ਪਛਾਣ ਨਹੀਂ ਹੋਇਆ। ਕਿਸੇ ਹੋਰ ਐਪ ਨਾਲ਼ ਖੋਲ੍ਹਣਾ ਹੈ\? - ਆਪ-ਮੁਖ਼ਤਾਰ ਕਤਾਰ ਕਰੋ - ਸਟ੍ਰੀਮ ਦੇ ਕਰਤਾ, ਸਮੱਗਰੀ ਜਾਂ ਖੋਜ ਬੇਨਤੀ ਵਾਲੇ ਵਾਧੂ ਜਾਣਕਾਰੀ ਬਕਸਿਆਂ ਵਾਲ਼ੀ ਮੈਟਾ ਜਾਣਕਾਰੀ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰ ਦਿਓ - ਮੈਟਾ ਜਾਣਕਾਰੀ ਦਿਖਾਓ + ਆਟੋ ਕਤਾਰਬੱਧ ਕਰੋ + ਸਟ੍ਰੀਮ ਨਿਰਮਾਤਾ, ਸਟ੍ਰੀਮ ਸਮੱਗਰੀ ਜਾਂ ਖੋਜ ਬੇਨਤੀ ਦੇ ਬਾਰੇ ਵਿੱਚ ਅਤਿਰਿਕਤ ਜਾਣਕਾਰੀ ਦਿੰਦੇ ਮੈਟਾ ਜਾਣਕਾਰੀ ਬਕਸੇ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਬੰਦ ਕਰੋ + ਮੈਟਾ ਜਾਣਕਾਰੀ ਵਿਖਾਓ ਵੀਡੀਓ ਵੇਰਵਾ ਅਤੇ ਵਾਧੂ ਜਾਣਕਾਰੀ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ - ਵੇਰਵਾ ਦਿਖਾਓ - ਸਰਗਰਮ ਪਲੇਅਰ ਕਤਾਰ ਬਦਲ ਜਾਵੇਗੀ - ਪਲੇਅਰ ਬਦਲਣ ਨਾਲ ਤੁਹਾਡੀ ਕਤਾਰ ਬਦਲ ਸਕਦੀ ਹੈ - ਕਤਾਰ ਨੂੰ ਖ਼ਾਲੀ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਤਸਦੀਕ ਕਰਨ ਲਈ ਪੁੱਛੋ - ਅੱਗੇ ਲੰਘਾਉਣ/ਪਿੱਛੇ ਕਰਨ ਦੀ ਸਮਾਂ ਮਿਆਦ - ਰਾਤ ਵਾਲੀ ਥੀਮ - ਐਂਡਰਾਇਡ ਨੂੰ ਥੰਮਨੇਲ ਦੇ ਮੁੱਖ ਰੰਗ ਮੁਤਾਬਕ ਇਲਤਾਹ ਦਾ ਰੰਗ ਬਦਲਣ ਦਿਓ (ਧਿਆਨ ਦਿਓ ਕਿ ਇਹ ਹਰੇਕ ਡਿਵਾਈਸ \'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) - ਰੰਗਦਾਰ ਇਤਲਾਹਾਂ + ਵੇਰਵਾ ਵਿਖਾਓ + ਸਰਗਰਮ ਪਲੇਅਰ ਕਤਾਰ ਨੂੰ ਬਦਲ ਦਿੱਤਾ ਜਾਵੇਗਾ + ਇੱਕ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਵਿੱਚ ਬਦਲਣਾ ਤੁਹਾਡੀ ਕਤਾਰ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ + ਕਤਾਰ ਕਲੀਅਰ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਲਈ ਪੁੱਛੋ + ਫਾਸਟ-ਫਾਰਵਰਡ/-ਰਿਵਾਈਂਡ ਸੀਕ ਦੀ ਮਿਆਦ + ਨਾਈਟ ਥੀਮ + ਐਂਡਰਾਇਡ ਨੂੰ ਥੰਮਨੇਲ ਵਿੱਚ ਮੁੱਖ ਰੰਗ ਦੇ ਅਨੁਸਾਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦੇ ਰੰਗ ਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰਨ ਦਿਓ (ਧਿਆਨ ਦਿਓ ਕਿ ਇਹ ਹਰੇਕ ਡਿਵਾਈਸ \'ਤੇ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ) + ਰੰਗਦਾਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੁਝ ਵੀ ਨਹੀਂ ਬਫ਼ਰਿੰਗ - ਸ਼ਫਲ + ਸ਼ਫਲ ਕਰੋ ਦੁਹਰਾਓ - ਹੇਠਾਂ ਹਰੇਕ ਇਤਲਾਹ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਪਚੀੜੀਆਂ ਇਤਲਾਹਾਂ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ - ਤੁਸੀਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਪਚੀੜੀਆਂ ਇਤਲਾਹਾਂ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ! + ਹੇਠਾਂ ਹਰੇਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ। + ਤੁਸੀਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ! ਪੰਜਵਾਂ ਕਾਰਵਾਈ ਬਟਨ ਚੌਥਾ ਕਾਰਵਾਈ ਬਟਨ ਤੀਜਾ ਕਾਰਵਾਈ ਬਟਨ ਦੂਜਾ ਕਾਰਵਾਈ ਬਟਨ ਪਹਿਲਾ ਕਾਰਵਾਈ ਬਟਨ ਨਾਂ ਵਿਖਾਓ - ਚਾਲੂ ਕਰੋ + ਆਨ , - ਡਾਉਨਲੋਡ ਕੀਤਾ - %s ਡਾਉਨਲੋਡ ਕੀਤੇ + ਡਾਉਨਲੋਡ ਮੁਕੰਮਲ + %s ਡਾਉਨਲੋਡ ਮੁਕੰਮਲ - ਬੰਦ ਕਰੋ + ਆਫ ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਸ਼ਾਮਿਲ ਕਰੋ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ - ਮੋਜੂਦਾ ਚੱਲ ਰਹੀ ਸਟ੍ਰੀਮ ਦੀ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੰਰਚਨਾ ਕਰੋ + ਮੌਜੂਦਾ ਚੱਲ ਰਹੀ ਸਟ੍ਰੀਮ ਦੀ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੰਰਚਨਾ ਕਰੋ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਵੀਂਆਂ ਸਟ੍ਰੀਮਾਂ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਦੁਆਰਾ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਜ਼ ਦੇ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਿਊਪਾਈਪ ਖਾਮੀ ਤੋਂ ਪ੍ਰਭਾਵਤ ਹੋਈ ਹੈ, ਇੱਥੇ ਨੱਪ ਕੇ ਰਿਪੋਰਟ ਕਰੋ ਇੱਕ ਖਾਮੀ ਪ੍ਰਭਾਵੀ ਹੋਈ ਹੈ, ਨੋਟੀਫੀਕੇਸ਼ਨ ਵੇਖੋ ਆਈਟਮਾਂ ਨੂੰ ਇੱਕ ਪਾਸੇ ਖਿੱਚ ਕੇ ਹਟਾਓ ਦ੍ਰਿਸ਼ ਸੂਚਕ ਵਿਖਾਓ - ਵਿਖਾਊ ਪਿਕਾਸੋ ਦੇ ਰੰਗਦਾਰ ਰੀਬਨ ਦ੍ਰਿਸ਼ਾਂ ਦੇ ਉੱਪਰ ਉਹਨਾਂ ਦੀ ਸਰੋਤ-ਪਛਾਣ ਅਨੁਸਾਰ: ਨੈੱਟਵਰਕ ਲਈ ਲਾਲ, ਡਿਸਕ ਲਈ ਨੀਲਾ ਤੇ ਮੈਮਰੀ ਲਈ ਹਰਾ + ਦ੍ਰਿਸ਼ਾਂ ਦੇ ਉੱਪਰ ਉਹਨਾਂ ਦੀ ਸਰੋਤ-ਪਛਾਣ ਲਈ ਪਿਕਾਸੋ ਦੇ ਰੰਗਦਾਰ ਰਿਬਨ ਵਿਖਾਓ : ਨੈੱਟਵਰਕ ਲਈ ਲਾਲ, ਡਿਸਕ ਲਈ ਨੀਲੇ ਤੇ ਮੈਮਰੀ ਲਈ ਹਰੇ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਪਿੰਨ ਕੀਤੀ ਟਿੱਪਣੀ ਅੱਪਡੇਟ ਦੀ ਉਪਲੱਬਧਤਾ ਪਰਖੀ ਜਾ ਰਹੀ… @@ -644,34 +635,30 @@ ਸੀਕਬਾਰ ਥੰਮਨੇਲ ਦੀ ਝਲਕ ਸਮਾਂ-ਅਵਧੀ ਜਦ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਦੁਬਾਰਾ ਅੱਪਡੇਟ ਕੀਤੀ ਜਾ ਸਕੇ — %s ਰਚਨਾਕਾਰ ਨੇ ਦਿਲੋਂ ਪਸੰਦ ਕੀਤਾ - ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਵੀਡੀਓ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ। ਬਦਲਾਅ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਤੇ ਹੀ ਹੋਣਗੇ + ਪ੍ਰਗਤੀਸ਼ੀਲ ਸਮੱਗਰੀ ਉੱਤੇ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਉਸਨੂੰ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ - ਮੁੱਖ ਪਲੇਅਰ ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਵਿਖਾਓ - ਪਲੇਅਬੈਕ ਲੋਡ ਦਾ ਅੰਤਰਾਲ ਆਕਾਰ + ਮੇਨ ਪਲੇਅਰ ਫੁੱਲ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ + ਪਲੇਅਬੈਕ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ - %s ਨਵੀਂ ਸਟਰੀਮ - %s ਨਵੀਆਂ ਸਟਰੀਮਾਂ + %s ਨਵੀਂ ਸਟ੍ਰੀਮ + %s ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ - ਨਵੀਂਆ ਫੀਡ ਇਕਾਈਆਂ - ਸੂਚਨਾ ਪ੍ਰਾਪਤ ਕਰੋ + ਨਵੀਆਂ ਫੀਡ ਆਈਟਮਾਂ + ਸੂਚਨਾ ਪਾਓ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਕੁਆਲਿਟੀ ਚੁਣੋ ਤਰੁੱਟੀ ਰਿਪੋਰਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਖ਼ਾਮੀਆਂ ਰਿਪੋਰਟ ਕਰਨ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ ਟਿੱਪਣੀਆਂ ਬੰਦ ਕੀਤੀਆਂ ਹੋਈਆਂ ਹਨ ਲੀਕ-ਕੈਨਰੀ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ ਤਰੁੱਟੀ ਤੇ ਸਨੈਕਬਾਰ ਵਿਖਾਓ - ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ) - ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਲੁਕਾਓ + ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟ੍ਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟ੍ਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ) + ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਘੱਟੋ-ਘੱਟ ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ, ਇਸ ਲਈ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਵਿਖਾਓ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਲੁਕਾਓ - ਆਮ ਸਵਾਲ + ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ ਵੈੱਬਸਾਈਟ \'ਤੇ ਵੇਖੋ - ਸਟਰੀਮ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… + ਸਟ੍ਰੀਮ ਦੇ ਵਿਵਰਣ ਲੋਡ ਹੋ ਰਹੇ ਹਨ… ਕਾਰਵਾਈ ਵਿੱਚ... ਕੁਝ ਸਮਾਂ ਲੱਗ ਰਿਹਾ ਹੈ \"ਪਲੇਅਰ ਕਰੈਸ਼ ਕਰੋ\" ਵਿਖਾਉ ਵਰਤਦੇ ਸਮੇਂ ਪਲੇਅਰ ਕਰੈਸ਼ ਦਾ ਵਿਕਲਪ ਵਿਖਾਉਂਦਾ ਹੈ @@ -682,12 +669,12 @@ ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਚੈਨਲ ਉੱਪਰ ਨਵੀਂ ਸਟ੍ਰੀਮ ਉੱਪਲਬਧ ਹੋਣ ਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਰਾਹੀਂ ਸੂਚਿਤ ਕਰੋ ਜਾਂਚ ਅਵਧੀ ਕੋਈ ਵੀ ਨੈੱਟਵਰਕ - ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ + ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ ਘੱਟ ਗੁਣਵੱਤਾ (ਛੋਟਾ ਆਕਾਰ) ਡਿਸਕ ਤੋਂ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹਟਾਓ\? - %1$s ਡਾਊਨਲੋਡ ਡਿਲੀਟ ਕੀਤਾ - %1$s ਡਾਊਨਲੋਡ ਡਿਲੀਟ ਕੀਤੇ + %1$s ਡਾਊਨਲੋਡ ਹਟਾਇਆ + %1$s ਡਾਊਨਲੋਡ ਹਟਾਏ ਚੈਨਲ ਦਾ ਅਵਤਾਰ ਥੰਮਨੇਲ ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ। @@ -695,35 +682,148 @@ ਟੈਬਲੇਟ ਮੋਡ ਨੋਟੀਫਿਕੇਸ਼ਨ ਬੰਦ ਕੀਤੇ ਹੋਏ ਹਨ ਸਭ ਨੂੰ ਟੌਗਲ ਕਰੋ - ਚੁਣੀ ਸਟਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਸਹਿਯੋਗੀ ਨਹੀਂ ਹੈ - ਜਿਹੜੀਆਂ ਸਟਰੀਮਾਂ ਨੂੰ ਹਾਲੇ ਐਪ ਡਾਊਨਲੋਡ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਉਹ ਛੁਪਾ ਦਿੱਤੀਆਂ ਹਨ - ਕੋਈ ਆਡੀਓ ਸਟਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ + ਚੁਣੀ ਗਈ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਸਹਿਯੋਗੀ ਨਹੀਂ ਹੈ + ਜਿਹੜੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦਾ ਹਾਲੇ ਐਪ ਡਾਊਨਲੋਡ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਉਹ ਛੁਪਾ ਦਿੱਤੀਆਂ ਗਈਆਂ ਹਨ + ਕੋਈ ਆਡੀਓ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ ਲੜੀਬੱਧ ਕਰੋ ਪਲੇਅਰ ਕਰੈਸ਼ ਕਰੋ - ਵੀਡੀਓ ਮਿੰਨੀ ਪਲੇਅਰ ਚਲਾਉਣ ਦੀ ਵਜਾਏ ਪੂਰੇ ਸਕਰੀਨ ਵਿੱਚ ਚਲਾਉਂਦਾ ਹੈ। ਜੇ ਆਟੋ-ਰੋਟੇਸ਼ਨ ਲਾਕ ਹੈ ਮੇਨ-ਪਲੇਅਰ ਤੋਂ ਬਾਹਰ ਆਕੇ ਤੇ ਮਿੰਨੀ-ਪਲੇਅਰ ਤੱਕ ਰਸਾਈ ਹਾਸਿਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ + ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਵੀਡੀਓ ਸ਼ੁਰੂ ਨਾਂ ਕਰੋ ਬਲਕਿ ਜੇ ਆਟੋ-ਰੋਟੇਸ਼ਨ ਲਾਕ ਹੈ ਤਾਂ ਸਿੱਧਾ ਫੁੱਲ ਸਕਰੀਨ ਵਿੱਚ ਚਲਾਓ। ਤੁਸੀਂ ਫਿਰ ਵੀ ਫੁੱਲ ਸਕ੍ਰੀਨ ਤੋਂ ਬਾਹਰ ਆਕੇ ਮਿੰਨੀ-ਪਲੇਅਰ ਤੱਕ ਰਸਾਈ ਹਾਸਿਲ ਕਰ ਸਕਦੇ ਹੋ ਅਗਰ ਤੁਸੀਂ ਐਪ ਦੀ ਵਰਤੋਂ ਸਬੰਧੀ ਮੁਸ਼ਕਿਲਾਂ ਦਾ ਸਾਹਮਣਾ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਇਹਨਾਂ ਆਮ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਜਾਣਨਾ ਨਾ ਭੁੱਲੋ! - ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਲਗਾਓ + ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਲਗਾਇਆ ਗਿਆ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਲਈ ਹੱਥੀਂ ਜਾਂਚ ਕਰੋ ਵਧੀਆ ਗੁਣਵੱਤਾ (ਵੱਡਾ ਆਕਾਰ) ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ। \nਕ੍ਰਿਪਾ ਕਰਕੇ ਫਾਈਲ ਮੈਨੇਜਰ ਇੰਨਸਟਾਲ ਕਰੋ ਜਾਂ ਡਾਊਨਲੋਡ ਸੈਟਿੰਗ ਵਿੱਚ \'%s\' ਅਸਮਰੱਥ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਸਬਸਕ੍ਰਾਈਬ ਕਰ ਲਿਆ ਹੈ - ਕੋਈ ਵੀਡੀਓ ਸਟਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ - ਐਕਸੋਪਲੇਅਰ ਡਿਫਾਲਟ - ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ\? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ) -\n -\nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ: -\n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ। -\n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ। -\n -\nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ। -\n + ਕੋਈ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ + ਐਕਸੋਪਲੇਅਰ ਡਿਫ਼ਾਲਟ + ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ\? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ) +\n +\nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ: +\n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ। +\n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ। +\n +\nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮ ਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ। +\n \nਯੂਟਿਊਬ ਇੱਕ ਅਜਿਹੀ ਸੇਵਾ ਹੈ ਜਿਹੜੀ RSS ਫੀਡ ਜ਼ਰੀਏ ਇਹ ਤੇਜ਼ ਤਰੀਕਾ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ। -\n +\n \nਤੁਹਾਡੀ ਚੋਣ ਇਸ ਗੱਲ ਤੇ ਮੁਨੱਸਰ ਕਰਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਗਤੀ ਤੇ ਸਟੀਕਤਾ ਵਿੱਚੋਂ ਕਿਸ ਨੂੰ ਪ੍ਰਾਥਮਿਕਤਾ ਦਿੰਦੇ ਹੋ। ਤੇਜ ਮੋਡ 3-ਡੌਟ ਮੀਨੂ ਤੋਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਆਯਾਤ ਜਾਂ ਨਿਰਯਾਤ ਕਰੋ ਤੁਸੀਂ ਨਿਊਪਾਈਪ ਦਾ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਚਲਾ ਰਹੇ ਹੋ %s ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ + ਇਹ ਵਿਕਲਪ ਤਾਂ ਹੀ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ ਜੇਕਰ %s ਨੂੰ ਥੀਮ ਲਈ ਚੁਣਿਆ ਜਾਂਦਾ ਹੈ + ਸਥਾਈ ਥੰਮਨੇਲ ਨੂੰ ਅਨਸੈੱਟ ਕਰੋ + ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕਰਨ ਵਿੱਚ ਅਸਫਲ + ਕਾਰਡ + ਧੁੰਦਲੀਆਂ ਕੀਤੀਆਂ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਇਹ ਆਈਟਮ ਹੈ। + ਡੁਪਲੀਕੇਟ ਜੋੜ੍ਹਿਆ ਗਿਆ %d ਵਾਰ + ਉਪਯੋਗੀ ਹੈ, ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਤੁਸੀਂ ਟੁੱਟੇ ਭੌਤਿਕ ਬਟਨਾਂ ਵਾਲਾ ਹੈੱਡਸੈੱਟ ਵਰਤ ਰਹੇ ਹੋ + ਡੁਪਲੀਕੇਟ ਹਟਾਓ + ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ\? + ਕੀ ਤੁਸੀਂ ਇਸ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸਾਰੀਆਂ ਡੁਪਲੀਕੇਟ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਨਿਮਨਲਿਖਤ ਸਟ੍ਰੀਮਾਂ ਵਿਖਾਓ + ਪੂਰੀ ਵੇਖਿਆ + ਅੰਸ਼ਕ ਤੌਰ \'ਤੇ ਵੇਖਿਆ ਗਿਆ + ਆਗਾਮੀ + ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ + ਸਟ੍ਰੀਮ ਵਿਖਾਓ/ਲੁਕਾਓ + ਸੱਜੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਖੱਬੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਚਮਕ + ਕੋਈ ਨਹੀਂ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਆਵਾਜ਼ + ਇਹ ਆਪਸ਼ਨ ਨੂੰ ਇਨੇਬਲ ਕਰੋ ਜੇ ਤੁਹਾਨੂੰ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਦੀਆਂ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਜੋ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਸ਼ੁਰੂਆਤ ਅਸਫਲ ਹੋਣ ਤੇ ਹੇਠਲੇ-ਪ੍ਰਾਥਮਿਕਤਾ ਡੀਕੋਡਰਾਂ \'ਤੇ ਵਾਪਸ ਲੈ ਜਾਂਦੀ ਹੈ। ਇਸ ਨਾਲ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਤੁਲਨਾ ਮਾੜੀ ਪਲੇਅਬੈਕ ਕਾਰਗੁਜ਼ਾਰੀ ਹੋ ਸਕਦੀ ਹੈ + ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੋਣ ਤੇ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਜਾਰੀ ਅਤੇ ਮੁੜ-ਬਹਾਲ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \'ਤੇ ਐਕਸੋਪਲੇਅਰ ਦੁਆਰਾ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \'ਤੇ ਪ੍ਰਭਾਵ ਹੈ +\n +\nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਮੌਜੂਦਾ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਸਵਿੱਚ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਵੇਲੇ ਪਲੇਅਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ + ਮੂਲ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਭਾਸ਼ਾ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਮੂਲ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਵਰਣਨਾਤਮਕ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਜੇ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਦ੍ਰਿਸ਼ਟੀ ਤੋਂ ਅਪੰਗ ਲੋਕਾਂ ਵਾਸਤੇ ਵਰਣਨਾਂ ਵਾਲਾ ਕੋਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਆਡੀਓ: %s + ਆਡੀਓ ਟਰੈਕ + ਇੱਕ ਆਡੀਓ ਟਰੈਕ ਇਸ ਸਟ੍ਰੀਮ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ + ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਅਗਿਆਤ + ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ + ਕੁਝ ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। ਇਹਨਾਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ + ਐਕਸੋਪਲੇਅਰ ਦੀ ਡੀਕੋਡਰ ਫਾਲਬੈਕ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਹਮੇਸ਼ਾਂ ਐਕਸੋਪਲੇਅਰ ਦੇ ਵੀਡੀਓ ਆਉਟਪੁੱਟ ਸਤਹ ਸੈਟਿੰਗ ਵਰਕਰਾਊਂਡ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਅਸਲੀ + ਡੱਬ ਕੀਤਾ + ਵਰਣਨਾਤਮਕ + ਮੁੱਖ ਟੈਬਾਂ ਦੀ ਸਥਿਤੀ + ਮੁੱਖ ਟੈਬ ਸਿਲੈਕਟਰ ਨੂੰ ਹੇਠਾਂ ਲੈ ਜਾਓ + %1$s %2$s + ਮੀਡੀਆ ਟਨਲਿੰਗ ਤੁਹਾਡੀ ਡਿਵਾਈਸ \'ਤੇ ਡਿਫ਼ਾਲਟ ਤੌਰ \'ਤੇ ਅਸਮਰੱਥ ਕੀਤੀ ਗਈ ਸੀ ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਮਾਡਲ ਇਸਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਨ ਲਈ ਜਾਣਿਆ ਜਾਂਦਾ ਹੈ। + ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ + ਕੋਈ ਲਾਈਵ ਸਟ੍ਰੀਮ ਨਹੀਂ + ਵੀਡੀਓਜ਼ + ਸਬਸਕ੍ਰਾਈਬਰਜ਼ + ਚੈਨਲ ਪੰਨਿਆਂ \'ਤੇ ਕਿਹੜੀਆਂ ਟੈਬਾਂ ਵਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ + ਚੈਨਲ ਟੈਬਾਂ + ਸ਼ੌਰਟਸ + ਮੈਟਾਡੇਟਾ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ… + ਚੈਨਲ ਟੈਬਾਂ ਪ੍ਰਾਪਤ ਕਰੋ + ਦੇ ਬਾਰੇ + ਐਲਬਮਜ਼ + ਫ਼ੀਡ ਅੱਪਡੇਟ ਕਰਨ ਵੇਲੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਟੈਬਾਂ। ਇਸ ਵਿਕਲਪ ਦਾ ਕੋਈ ਅਸਰ ਨਹੀਂ ਹੁੰਦਾ ਜੇਕਰ ਚੈਨਲ ਨੂੰ ਫਾਸਟ ਮੋਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। + ਪਲੇਲਿਸਟਾਂ + ਟ੍ਰੈਕਸ + ਚੈਨਲਜ਼ + ਲਾਈਵ + ਸਕ੍ਰੀਨ ਸਥਿਤੀ ਨੂੰ ਟੌਗਲ ਕਰੋ + ਫੁੱਲ ਸਕ੍ਰੀਨ ਨੂੰ ਟੌਗਲ ਕਰੋ + ਅਗਲੀ ਸਟ੍ਰੀਮ + ਪਲੇ ਕਤਾਰ ਖੋਲ੍ਹੋ + ਅੱਗੇ ਕਰੋ + ਰੀਵਾਈਂਡ ਕਰੋ + ਦੁਬਾਰਾ ਚਲਾਓ + ਚਲਾਓ + ਹੋਰ ਵਿਕਲਪ + ਮਿਆਦ + ਪਿਛਲੀ ਸਟ੍ਰੀਮ + ਚਿੱਤਰ ਕੁਆਲਿਟੀ + \? + ਘੱਟ ਕੁਆਲਿਟੀ + ਅਵਤਾਰ + ਉਪ-ਚੈਨਲ ਅਵਤਾਰ + ਚਿੱਤਰ ਲੋਡ ਨਾ ਕਰੋ + ਉੱਚ ਕੁਆਲਿਟੀ + ਦਰਮਿਆਨੀ ਕੁਆਲਿਟੀ + ਅਪਲੋਡਰ ਅਵਤਾਰ + ਬੈਨਰ + ਡਾਟਾ ਅਤੇ ਮੈਮੋਰੀ ਵਰਤੋਂ ਨੂੰ ਘਟਾਉਣ ਲਈ ਚਿੱਤਰਾਂ ਦੀ ਗੁਣਵੱਤਾ ਅਤੇ ਚਿੱਤਰਾਂ ਨੂੰ ਬਿਲਕੁਲ ਲੋਡ ਕਰਨਾ ਹੈ ਜਾਂ ਨਹੀਂ, ਚੁਣੋ। ਤਬਦੀਲੀਆਂ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ ਕੈਸ਼ ਨੂੰ ਸਾਫ਼ ਕਰਦੀਆਂ ਹਨ — %s + ਥੰਮਨੇਲ + URL ਸੂਚੀ ਸਾਂਝੀ ਕਰੋ + ਸਿਰਲੇਖਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ + %1$s +\n%2$s + ਪਲੇਲਿਸਟ ਸਾਂਝੀ ਕਰੋ + ਪਲੇਲਿਸਟ ਨੂੰ ਪਲੇਲਿਸਟ ਨਾਮ ਅਤੇ ਵੀਡੀਓ ਸਿਰਲੇਖ ਜਿਹੇ ਵੇਰਵਿਆਂ ਸਮੇਤ ਜਾਂ ਵੀਡੀਓ URL ਦੀ ਇੱਕ ਸਰਲ ਸੂਚੀ ਦੇ ਰੂਪ ਵਿੱਚ ਸਾਂਝਾ ਕਰੋ + - %1$s: %2$s + + %s ਜਵਾਬ + %s ਜਵਾਬ + + ਹੋਰ ਵਿਖਾਓ + ਇਸ \'ਤੇ ਟੈਪ ਕਰਕੇ ਹੇਠਾਂ ਹਰੇਕ ਸੂਚਨਾ ਕਾਰਵਾਈ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰੋ। ਪਹਿਲੀਆਂ ਤਿੰਨ ਕਾਰਵਾਈਆਂ (ਚਲਾਓ/ਰੋਕੋ, ਪਿਛਲਾ ਅਤੇ ਅਗਲਾ) ਸਿਸਟਮ ਦੁਆਰਾ ਸੈੱਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਅਨੁਕੂਲਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। + ਘੱਟ ਵਿਖਾਓ + ਹਾਂ + ਨਿਊਪਾਈਪ ਸਮੇਂ-ਸਮੇਂ \'ਤੇ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਦੀ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਜਾਂਚ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਇੱਕ ਵਾਰ ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕਰ ਸਕਦੀ ਹੈ। +\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਇਨੇਬਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ + ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈਟ ਕਰੋ + ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਡਿਫ਼ਾਲਟ ਮੁੱਲਾਂ \'ਤੇ ਰੀਸੈਟ ਕਰੋ + ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਨਾਲ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਤਰਜੀਹੀ ਸੈਟਿੰਗਾਂ ਰੱਦ ਹੋ ਜਾਣਗੀਆਂ ਅਤੇ ਐਪ ਰੀਸਟਾਰਟ ਹੋ ਜਾਵੇਗਾ। +\n +\nਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ \'ਤੇ ਅੱਗੇ ਵਧਣਾ ਚਾਹੁੰਦੇ ਹੋ? + ਡਿਵਾਈਸ \'ਤੇ ਲੋੜੀਂਦੀ ਖਾਲੀ ਥਾਂ ਨਹੀਂ ਹੈ + ਨਹੀਂ + ਇੰਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਐਕਸਪੋਰਟ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਇੱਕ ਕਮਜ਼ੋਰ ਫਾਰਮੈਟ ਦੀ ਵਰਤੋਂ ਕਰਦੀਆਂ ਹਨ ਜੋ ਨਿਊਪਾਈਪ 0.27.0 ਤੋਂ ਬਰਤਰਫ਼ ਕੀਤਾ ਗਿਆ ਸੀ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇੰਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਨਿਰਯਾਤ ਇੱਕ ਭਰੋਸੇਯੋਗ ਸਰੋਤ ਤੋਂ ਹੈ, ਅਤੇ ਸਿਰਫ਼ ਨਿਊਪਾਈਪ 0.27.0 ਜਾਂ ਇਸਤੋਂ ਨਵੇਂ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਐਕਸਪੋਰਟ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨੂੰ ਤਰਜੀਹ ਦਿਓ। ਇਸ ਕਮਜ਼ੋਰ ਫਾਰਮੈਟ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਨੂੰ ਆਯਾਤ ਕਰਨ ਲਈ ਸਮਰਥਨ ਜਲਦੀ ਹੀ ਪੂਰੀ ਤਰ੍ਹਾਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ ਅਤੇ ਫਿਰ ਨਿਊਪਾਈਪ ਦੇ ਪੁਰਾਣੇ ਸੰਸਕਰਣ ਹੁਣ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਤੋਂ ਐਕਸਪੋਰਟ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਇੰਪੋਰਟ ਕਰਨ ਦੇ ਯੋਗ ਨਹੀਂ ਹੋਣਗੇ। + ਸੈਕੰਡਰੀ \ 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 a24be6b9427..d0c58314a78 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -46,12 +46,11 @@ Błąd Błąd sieci Nie udało się załadować wszystkich miniatur - Nie udało się odszyfrować sygnatury URL wideo Nie udało się przetworzyć strony internetowej Treść niedostępna Nie udało się utworzyć menu pobierania Przepraszamy, to nie powinno mieć miejsca. - Zgłoś błąd przez e-mail + Zgłoś przez e-mail Niestety, coś poszło nie tak Zgłoś Informacje: @@ -254,9 +253,7 @@ Wymuś raportowanie niedostarczonych wyjątków Rx poza cyklem życia fragmentu lub aktywności po usunięciu Używaj szybkiego, niedokładnego przewijania Niedokładne przewijanie umożliwia szybsze przewijanie ze zmniejszoną dokładnością. Przewijanie o 5, 15 lub 25 sekund nie działa w tym przypadku - Wczytuj miniatury - Wyłącz, aby nie wczytywać miniatur, oszczędzając dane i zużycie pamięci. Zmiana tej opcji czyści pamięć podręczną obrazów - Wyczyszczono pamięć podręczną miniatur + Wyczyszczono pamięć podręczną obrazów Wyczyść pamięć podręczną metadanych Usuwa całą pamięć podręczną stron Wyczyszczono pamięć podręczną metadanych @@ -314,7 +311,6 @@ Usunąć całą historię wyszukiwania\? Usunięto historię wyszukiwania Usunięto jedną pozycję - Brak zainstalowanej aplikacji do odtworzenia tego pliku NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz je redystrybuować i/lub modyfikować zgodnie z warunkami GNU General Public License, opublikowanej przez Free Software Fundation, w wersji 3 albo (według Twojego wyboru) jakiejkolwiek późniejszej wersji. Czy chcesz zaimportować również ustawienia? Polityka prywatności NewPipe @@ -341,10 +337,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 @@ -409,7 +401,7 @@ Nie udało się nadpisać pliku Plik o tej samej nazwie oczekuje na pobranie NewPipe został zamknięty podczas pracy nad plikiem - Brak miejsca na urządzeniu + Brak miejsca na urządzeniu Utracono postęp, ponieważ plik został usunięty Czy chcesz wyczyścić historię pobierania, czy usunąć wszystkie pobrane pliki\? Ogranicz kolejkę pobierania @@ -421,8 +413,8 @@ \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 - Usuń pozycje odtwarzania + Storage Access Framework umożliwia pobieranie na kartę pamięci + Wyczyść pozycje odtwarzania Usuwa wszystkie pozycje odtwarzania Usunąć wszystkie pozycje odtwarzania\? Przełącz usługę, aktualnie wybrana: @@ -463,7 +455,7 @@ Język aplikacji Domyślny systemowy Po rozwiązaniu naciśnij „Gotowe” - Gotowe + Gotowe Wideo %d sekunda @@ -530,8 +522,8 @@ 100+ wideo Artyści Albumy - Piosenki - To wideo ma ograniczenia wiekowe. + Utwory + To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. Tak, i częściowo obejrzane wideo @@ -578,7 +570,7 @@ Dodano do kolejki Dodaj do kolejki Pokaż wycieki pamięci - Wyczyść ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA + Usuwa ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA Ciasteczka reCAPTCHA zostały wyczyszczone Wyczyść ciasteczka reCAPTCHA YouTube udostępnia „Tryb ograniczonego dostępu”, który ukrywa potencjalne treści dla dorosłych @@ -618,7 +610,7 @@ Automatyczny (motyw urządzenia) Motyw nocny Pokaż szczegóły kanału - Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś 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 @@ -626,7 +618,6 @@ Wewnętrzny Prywatny Publiczny - Adres URL miniatury Host Wsparcie Język @@ -643,12 +634,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 @@ -683,7 +673,7 @@ Przetwarzanie… Może to chwilę potrwać Sprawdzanie aktualizacji… Ręcznie sprawdź dostępność nowych wersji - Sprawdź dostępność aktualizacji + Sprawdź dostępność aktualizacji Nowe pozycje kanału Pokazuje opcję psucia podczas korzystania z odtwarzacza Zepsuj odtwarzacz @@ -701,7 +691,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 @@ -736,9 +725,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 @@ -747,4 +733,120 @@ Tryb szybki Importuj lub eksportuj subskrypcje z menu z trzema kropkami. Używasz najnowszej wersji NewPipe + Ta opcja jest dostępna tylko wtedy, gdy %s jest wybrany jako motyw + Usuń stałą miniaturę + Nie udało się skopiować do schowka + Karta + Wyszarzone playlisty zawierają już tę pozycję + Dodano duplikat %d raz(y) + Przydatne, na przykład, jeśli używasz zestawu słuchawkowego z zepsutymi fizycznymi przyciskami + Ignoruj zdarzenia sprzętowego przycisku multimedialnego + Czy usunąć duplikaty\? + Pokaż następujące strumienie + Pokaż/Ukryj strumienie + Usuń duplikaty + Czy chcesz usunąć wszystkie zduplikowane strumienie z tej playlisty\? + 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 + %1$s %2$s + oryginalna + dubbing + audiodeskrypcja + Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna + To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. +\n +\nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran + 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 + Brak strumieni + Brak transmisji na żywo + Wideo + Subskrybujący + Karty wyświetlane na stronach kanałów + Karty kanałów + Shorts + Ładowanie metadanych… + Pobieranie kart kanału + Informacje + Albumy + Karty do pobrania podczas aktualizacji kanału. Ta opcja nie działa, jeśli kanał jest aktualizowany w trybie szybkim + Playlisty + Utwory + Kanały + Na żywo + Przełącz orientację ekranu + Włącz/Wyłącz pełny ekran + Następny strumień + Otwórz kolejkę odtwarzania + Przewiń do przodu + Przewiń do tyłu + Odtwórz ponownie + Odtwórz + Więcej opcji + Czas trwania + Poprzedni strumień + Jakość obrazów + \? + Niska jakość + Awatary + Awatary podkanału + Nie ładuj + Wysoka jakość + Średnia jakość + Awatary przesyłającego + Banery + Wybierz jakość obrazów albo czy w ogóle je ładować, aby zmniejszyć zużycie danych i pamięci. Zmiana czyści pamięć podręczną obrazów zarówno w pamięci, jak i na dysku — %s + Miniatury + Udostępnij listę URL-i + Udostępnij z tytułami + %1$s +\n%2$s + Udostępnij playlistę + Udostępnij playlistę ze szczegółami, takimi jak nazwa playlisty i tytuły wideo, lub jako prostą listę adresów URL wideo. + – %1$s: %2$s + + %s odpowiedź + %s odpowiedzi + %s odpowiedzi + %s odpowiedzi + + Pokaż więcej + Pokaż mniej + Edytuj każdą poniższą akcję powiadomienia, naciskając ją. Pierwsze trzy akcje (odtwórz/wstrzymaj, poprzedni i następny) są ustawione przez system i nie można ich dostosować + Za mało wolnego miejsca na urządzeniu + Kopia zapasowa i przywracanie + Resetuje wszystkie ustawienia do ich domyślnych wartości + Resetuj ustawienia + Zresetowanie wszystkich ustawień odrzuci wszystkie Twoje preferowane ustawienia i ponownie uruchomi aplikację. +\n +\nCzy na pewno chcesz kontynuować? + Tak + Nie + NewPipe może od czasu do czasu automatycznie sprawdzać dostępność nowych wersji i powiadamiać Cię, gdy tylko będą dostępne. +\nCzy chcesz to włączyć? + Ustawienia w importowanym eksporcie korzystają z podatnego na ataki formatu, który został wycofany od wersji NewPipe 0.27.0. Upewnij się, że importowany eksport pochodzi z zaufanego źródła, i w przyszłości używaj wyłącznie eksportów uzyskanych z NewPipe 0.27.0 lub nowszego. Obsługa importowania ustawień w tym podatnym formacie zostanie wkrótce całkowicie usunięta, a wtedy starsze wersje NewPipe nie będą już mogły importować ustawień z eksportu z nowych wersji. + dodatkowa \ 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 be1f732d1e2..99efa718897 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,6 @@ Áudio - Não foi possível decodificar assinatura da URL do vídeo Seu comentário (em inglês): O que aconteceu: Informação: @@ -18,10 +17,10 @@ Excluir Não gostei Curtidas - Baixar - Baixar + Download + Download Detalhes: - Relatar erro via email + Relatar por e-mail Relatório de erro Relatório Desculpe, algo deu errado. @@ -32,7 +31,7 @@ Erro Copiado para a área de transferência Nome do arquivo - Toque para detalhes + Toque para mais detalhes O NewPipe está baixando Por favor, espere… Erro de rede @@ -53,62 +52,62 @@ Iniciar Tema Publicado em %1$s - Link não suportado + URL não suportado Ao vivo Downloads Downloads Você quis dizer \"%1$s\"\? - App/IU parou + O aplicativo travou Reproduzindo em segundo plano O menu de download não pôde ser configurado Reproduzir vídeo, duração: - Miniatura do avatar do uploader + Foto de perfil do autor Escolha a pasta de download para arquivos de áudio Áudios baixados são salvos aqui Pasta para áudios baixados Escolha a pasta de download para arquivos de vídeo Vídeos baixados são salvos aqui Pasta para vídeos baixados - Instalar o aplicativo Kore\? + Instalar Kore? Toque na lupa para começar. - Threads + Processos Por favor, defina uma pasta de download depois nas configurações - Sem reprodutor de vídeo. Instalar VLC\? + Player de vídeo não encontrado. Instalar VLC? O site não pôde ser analisado Áudio - Reproduzir com Kodi + Reproduzir no Kodi Pesquisar - Mostra uma opção para ver vídeo pelo media center do Kodi + Mostrar opção para reproduzir o vídeo no Kodi Usar player de áudio externo Usar player 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 - Resolução padrão do popup + Mostrar opção \"Reproduzir no Kodi\" + O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do aplicativo:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: + Abrir no modo Popup + Resolução padrão do Popup Mostrar resoluções mais altas Apenas alguns dispositivos suportam vídeos em 2K/4K Formato de vídeo padrão - Reproduzindo em modo popup - Tudo + Reproduzindo em modo Popup + Todos Desativado - k - M - Bi + mil + mi + bi Essa permissão é necessária -\npara abrir em modo popup +\npara abrir em modo Popup Limpar Popup Segundo plano - Lembrar propriedades do popup - Lembrar último tamanho e posição do popup - Remove o som em algumas resoluções + Lembrar propriedades do Popup + Lembrar último tamanho e posição do Popup + Remove áudio em algumas resoluções Sugestões de pesquisa Escolha as sugestões a serem exibidas enquanto estiver buscando Melhor resolução Licenças de Terceiros Sobre & FAQ Licenças - Stream leve e livre no Android. + Transmissão leve e livre no Android. Ver no GitHub Licença do NewPipe Se você tem ideias de: tradução, mudança no design, limpeza de código ou grandes mudanças de código — ajuda é sempre bem-vinda. Quanto mais se faz, melhor fica! @@ -116,7 +115,7 @@ Colaborar © %1$s %2$s protegido pela licença %3$s Sobre o NewPipe - Baixar + Download Caracteres permitidos em nome de arquivos Os caracteres inválidos são substituídos por este valor Caractere de substituição @@ -125,20 +124,20 @@ Inscrever-se Inscrito Inscrição cancelada - Não foi possível alterar inscrição - Não foi possível atualizar inscrição + Não foi possível alterar a inscrição + Não foi possível atualizar a inscrição Inscrições Novidades Continuar reprodução Continua vídeo após interrupções (ex: ligações) Histórico de pesquisa - Armazena histórico de pesquisa localmente - Histórico de vídeo - Armazena histórico de vídeos assistidos + Armazena o histórico de pesquisa localmente + Histórico de exibição + Mantenha o controle dos vídeos assistidos Histórico Histórico Notificação do NewPipe - Notificações para o player do NewPipe + Notificações para o player NewPipe Comportamento Histórico e cache Desfazer @@ -166,45 +165,45 @@ Deseja excluir este item do histórico de busca\? Conteúdo da página inicial Página em branco - Página do Quiosque - Página de canais + Página do Kiosk + Página do canal Selecione um canal Nenhuma inscrição ainda - Selecione uma banca + Selecione um Kiosk Em Alta Top 50 Novos e tendências Mostrar dica \"Segure para pôr na fila\" - Mostra dica ao tocar no botão segundo plano ou popup em \"Detalhes:\" do vídeo + Mostra dica ao tocar no botão segundo plano ou Popup em \"Detalhes:\" do vídeo Reproduzir tudo - Este stream não pôde ser reproduzido - Ocorreu um erro irrecuperável no player - Recuperando do erro do player + Não é possível reproduzir este vídeo + Ocorreu um erro irrecuperável na reprodução + Se recuperando de um erro durante a reprodução Remover Detalhes Configurações de áudio - Segure para pôr na fila + Toque longo para pôr na fila [Desconhecido] Reproduzir em segundo plano - Reproduzir em um popup + Reproduzir em um Popup Doar O NewPipe é desenvolvido por voluntários que usam seu tempo livre para trazer a você a melhor experiência de usuário. Retribua e ajude os desenvolvedores a tornarem o NewPipe ainda melhor enquanto eles desfrutam de uma xícara de café. Retribuir Site oficial Visite o site do NewPipe para mais informações e novidades. - Sem reprodutor de vídeo (você pode instalar o VLC). + Player de vídeo não encontrado (você pode instalar o VLC para reproduzi-lo). País padrão do conteúdo Sempre - Uma vez + Apenas uma vez Mudar para segundo plano - Mudar para popup + Mudar para Popup Mudar para principal - Players externos não suportam estes tipos de links - Nenhum stream de vídeo encontrado - Nenhum stream de áudio encontrado + Players externos não suportam estes tipos de URL + Nenhuma transmissão de vídeo encontrada + Nenhuma transmissão de áudio encontrada Player de vídeo - Player em segundo plano - Player popup + Reprodução em segundo plano + Reprodução em Popup Obtendo informação… Carregando conteúdo solicitado Importar base de dados @@ -222,19 +221,19 @@ Adicionar a Arraste para ordenar Criar - Dispensar + Descartar Renomear - Último reproduzido - Mais reproduzido + Última reprodução + Mais assistidos Sempre perguntar - Nova Playlist + Nova playlist Renomear Nome Adicionar à playlist Definir como miniatura da playlist - Favoritar playlist + Salvar como playlist favorita Remover dos favoritos - Excluir esta playlist\? + Excluir esta playlist? Playlist criada Adicionado à playlist Miniatura da playlist alterada. @@ -243,15 +242,15 @@ Preencher Zoom Gerado automaticamente - O monitoramento de vazamento de memória pode tornar o app instável durante o heap dumping + O monitoramento de vazamento de memória pode tornar o aplicativo instável durante o despejo de pilha 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 - Pôr próximo vídeo na fila automaticamente - Continua a reprodução da fila (sem repetição) adicionando mais vídeos similares + A busca inexata permite que o player 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 + Enfileirar a próxima transmissão automaticamente + Continua a reprodução da fila (sem repetição) adicionando mais transmissões similares Arquivo - Pasta não existe + Essa pasta não existe Arquivo/fonte do conteúdo não existe O arquivo não existe ou não há permissão para leitura ou escrita O nome do arquivo não pode ficar vazio @@ -263,71 +262,68 @@ Exportando… Importar arquivo Exportação anterior - Não foi possível importar inscrições - Não foi possível exportar inscrições - Importe inscrições do YouTube pelo Google takeout: + Não foi possível importar as inscrições + Não foi possível exportar as inscrições + Importar inscrições do YouTube em Google Takeout: \n -\n1. Acesse este link: %1$s +\n1. Acesse este URL: %1$s \n2. Faça login quando solicitado -\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", em seguida, selecione apenas \"assinaturas\" e clique em \"OK\" -\n4. Clique em \"Próximo passo\" e em seguida, em \"Criar exportação\" -\n5. Clique no botão \"Baixar\" quando ele aparecer +\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione apenas \"Inscrições\" e clique em \"OK\" +\n4. Clique em \"Próxima etapa\" e, em seguida, em \"Criar exportação\" +\n5. Clique no botão \"Download\" quando ele aparecer \n6. Clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo .zip baixado -\n7. Caso a importação do arquivo .zip falhe: Extraia o arquivo .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\", clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo csv extraído - Importe um perfil do SoundCloud digitando o URL ou seu ID: +\n7. [Se a importação do .zip falhar] Extraia o arquivo .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo csv extraído + Importar um perfil do SoundCloud digitando o URL ou seu ID: \n -\n1. Ative o \"modo desktop\" em um navegador (o site não está disponível em aparelhos celulares) +\n1. Ative o \"Modo desktop (computador)\" em um navegador da Web (o site não está disponível para dispositivos móveis) \n2. Acesse este URL: %1$s \n3. Faça login quando solicitado -\n4. Copie o URL do perfil que você foi redirecionado. +\n4. Copie o URL do perfil para o qual você foi redirecionado. seuID, soundcloud.com/seuid Tenha em mente que esta operação poderá consumir muitos dados. \n \nVocê deseja continuar\? - Carregar miniaturas - Cache de imagens limpo - Limpar cache de metadados - Remove todos os dados de páginas em cache - Cache de metadados limpo - Controles de velocidade de reprodução + Cache de imagens removidos + Remover metadados em cache + Remover todos os dados da página web armazenados em cache + Cache de metadados removidos + Controles para velocidade de reprodução Velocidade - Desative para não carregar miniaturas e economizar no uso de dados e memória. A alteração limpa todo o cache de imagens em memória e em disco Afinação Desvincular (pode causar distorção) Ação de \'abrir\' preferida Ação padrão ao abrir conteúdo — %s - Nenhum stream disponível para baixar + Nenhum vídeo disponível para download Abrir gaveta Fechar gaveta Legendas - Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o app para ter efeito - Nenhum app instalado para reproduzir este arquivo - Excluir histórico de vídeo - Exclui o histórico de vídeos e as posições de reprodução - Excluir todo o histórico de vídeo\? - Histórico de vídeos excluído - Excluir histórico de pesquisa - Exclui o histórico de pesquisas feitas - Excluir todo o histórico de pesquisa\? - Histórico de busca limpo + Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o aplicativo para ter efeito + Remover histórico de exibição + Remove o histórico de vídeos assistidos e as posições de reprodução + Remover todo o histórico de exibição? + Histórico de exibição removido + Remover histórico de pesquisas + Remove o histórico de pesquisas + Remover todo o histórico de pesquisas? + Histórico de pesquisa removido 1 item excluído. NewPipe é um copyleft de software livre: Você pode usar, estudar, compartilhar e melhorar a seu gosto. Especificamente você pode redistribuir e/ou modificá-lo sob os termos da GNU General Public License como publicado pela Fundação de Software Livre, na versão 3 da Licença, ou (a seu critério) qualquer versão posterior. Você também quer importar as configurações? Política de privacidade do NewPipe - O projeto NewPipe leva sua privacidade muito a sério. Por isso, o app não coleta nenhum dado sem seu consentimento. + O projeto NewPipe leva sua privacidade muito a sério. Por isso, o aplicativo não coleta nenhum dado sem seu consentimento. \nA política de privacidade do NewPipe explica em detalhes quais dados são envidados e salvos quando você manda um relatório de erro. - Ler a política de privacidade + Ver política de privacidade A fim de cumprir com o Regulamento Geral sobre a Proteção de Dados da UE (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. \nVocê deve aceitá-la para nos enviar o relatório de erros. Aceitar Recusar Ilimitado - Limitar a resolução quando estiver usando dados móveis - Minimizar ao trocar entre apps - Ação ao mudar para outro app a partir do player de vídeo principal — %s + Limitar resolução de vídeos ao usar dados móveis + Minimizar ao mudar de aplicativos + Ação ao mudar de aplicativo a partir do player principal - %s Nenhum - Minimizar para segundo plano - Minimizar para player popup + Minimizar reprodução para o modo de segundo plano + Minimizar reprodução para o modo Popup Avançar durante o silêncio Passo Redefinir @@ -336,12 +332,8 @@ 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 + Escolha a guia + Depuração Atualizações Eventos Arquivo excluído @@ -349,26 +341,26 @@ Notificações para novas versões do NewPipe Armazenamento externo indisponível Não é possível baixar para o cartão SD externo. Redefinir o local da pasta de download\? - Não foi possível carregar as abas salvas, carregando as abas padrão - Restaurar padrões - Deseja restaurar padrões\? + Não foi possível ler as guias salvas, portanto, usamos as guias padrão + Restaurar configurações + Deseja restaurar os padrões? Número de inscritos indisponível - Que abas são visíveis na página inicial + Quais guias são exibidas na tela inicial Conferências Atualizações - Notificar quando uma nova versão do app estiver disponível - Modo de exibição em lista + Notificar quando uma nova versão do aplicativo estiver disponível + Modo de exibição da lista Lista Grade Automático - Atualização do NewPipe disponível! + Uma atualização do NewPipe está disponível! Finalizado pausado na fila pós-processamento - Fila + Colocar na fila Ação negada pelo sistema - O download falhou + Download falhou Gerar nome único Sobrescrever Um arquivo baixado com esse nome já existe @@ -376,11 +368,11 @@ Mostrar erro O arquivo não pode ser criado A pasta de destino não pode ser criada - Uma conexão segura não pôde ser estabelecida - O servidor não pôde ser encontrado + Não foi possível estabelecer uma conexão segura + Não foi possível encontrar o servidor Não foi possível se conectar ao servidor O servidor não envia dados - O servidor não aceita downloads em multi-thread, tente de novo com @string/msg_threads = 1 + O servidor não aceita downloads multi-processo, tente novamente com @string/msg_threads = 1 Não encontrado Falha no pós-processamento Parar @@ -396,39 +388,39 @@ Não foi possível carregar os comentários Fechar Continuar reprodução - Restaura última posição da reprodução + Restaurar a última posição de reprodução Posições em listas - Mostra indicadores de posição de reprodução em listas - Excluir dados - Posições de reprodução limpas + Mostra os indicadores de posição de reprodução em listas + Remover dados + Posições de reprodução removidas Arquivo movido ou excluído Já existe um arquivo com este nome O arquivo não pode ser sobrescrito Já existe um download pendente com este nome O NewPipe foi fechado enquanto manipulava o arquivo - Sem espaço disponível + Sem espaço disponível O progresso foi perdido pois o arquivo foi excluído Tempo limite de conexão Excluir todo o histórico de downloads ou excluir todos os arquivos baixados\? Limitar fila de downloads - Faz downloads um de cada vez + Permitir apenas um download de cada vez Iniciar downloads Pausar downloads Perguntar onde salvar o arquivo Você será questionado onde salvar cada download. \nAtive o seletor de pasta do sistema (SAF) se você quiser baixar em um cartão SD externo Usar o seletor de pastas do sistema (SAF) - O \'Storage Access Framework\' permite baixar em um cartão SD externo - Excluir posição das reproduções - Exclui todas as posições de reprodução - Excluir todas as posições de reprodução\? - Alternar serviço, selecionados: - Quiosque Padrão - Ninguém está vendo + A \"Estrutura de acesso ao armazenamento\" permite baixar em um cartão SD externo + Remover posições de reprodução + Remove todas as posições de reprodução + Remover todas as posições de reprodução? + Alternar serviço, atualmente selecionado: + Kiosk padrão + Ninguém está assistindo %s assistindo %s assistindo - %s estão vendo + %s assistindo Ninguém está ouvindo @@ -436,30 +428,30 @@ %s ouvintes %s ouvintes - O idioma será alterado após reiniciar o app - Duração do salto para avançar/retroceder - Instâncias do PeerTube - Escolha suas instâncias do PeerTube favoritas + O idioma será alterado após reiniciar o aplicativo + Duração de avanço/retrocesso rápido + Instâncias PeerTube + Selecione suas instâncias favoritas do PeerTube Encontre as instâncias que gosta em %s Adicionar instância - Insira o link da instância + Insira o URL da instância Erro ao validar a instância - Apenas links HTTPS são suportados + Somente URL HTTPS são compatíveis A instância já existe Local - Recentes + Adicionado recentemente Mais curtidos - Gerado automaticamente (nenhum uploader encontrado) + Gerado automaticamente (nenhum carregador encontrado) recuperando O download não pôde ser recuperado Escolha uma instância Limpar histórico de downloads Excluir arquivos baixados - Dar permissão para mostrar por cima de outros apps - Idioma do app + Obter permissão para exibir sobre outros aplicativos + Idioma do aplicativo Padrão do sistema Toque em \"Pronto\" ao resolver - Pronto + Pronto Vídeos %d segundo @@ -529,53 +521,53 @@ Este vídeo tem restrição de idade. \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. - Sim, e vídeos parcialmente vistos - Os vídeos que foram vistos antes e depois de terem sidos adicionados à playlist serão removidos. -\nTem certeza\? Esta ação não pode ser desfeita! - Remover vídeos vistos\? - Remover vistos + Sim, e vídeos parcialmente assistidos + Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. +\nTem certeza? Esta ação não pode ser desfeita! + Remover vídeos assistidos? + Remover assistidos Textos originais dos serviços serão visíveis nos itens de transmissão Mostrar tempo original nos itens Ativar o \"Modo Restrito\" do YouTube Por %s Criado por %s - Miniatura do avatar do canal + Foto de perfil do canal Mostrar apenas inscrições não agrupadas Mostrando resultados para: %s - Ainda não há playlists favoritas - Página de playlist + Ainda não há playlist favoritas + Página da playlist Selecione uma playlist - Por favor verifique se uma issue discutindo este problema já existe. Ao criar tickets duplicados, você tira de nós um tempo no qual poderíamos estar usando para corrigir um bug real. + Verifique se o erro já foi informado. Ao informar erros duplicados, você nos toma o tempo que poderíamos dedicar a outras correções de erros. Reporte no GitHub Copiar relatório formatado Nunca - Apenas no Wi-Fi + Apenas em Wi-Fi Iniciar reprodução automaticamente — %s - Reproduzir fila + Fila de reprodução 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 + A fila de reprodução atual será substituída Mudar de um player para outro pode substituir sua fila - Pedir confirmação antes de limpar uma fila + Pedir confirmação antes de limpar a fila Aleatório Carregando Nada Repetir Você pode selecionar até no máximo três botões para mostrar na notificação compacta! - Edite os botões de ação de notificação abaixo tocando em cada um. Selecione até três deles para serem mostrados na notificação compacta usando as caixas de seleção à direita + Edite os botões de ação de notificação abaixo tocando em cada um. Selecione até três deles para serem mostrados na notificação compacta usando as caixas de seleção à direita. Quinto botão de ação Quarto botão de ação Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Cortar a miniatura do vídeo mostrada na notificação da proporção 16:9 para 1:1 - Cortar a miniatura para a proporção de 1:1 + Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 + Ajustar miniatura para a proporção de 1:1 Mostrar vazamentos de memória Na fila Pôr na fila - Apaga os cookies que o NewPipe armazena quando você resolve um reCAPTCHA - Apagar cookies de reCAPTCHA - Os cookies de reCAPTCHA foram apagados + Remove os cookies que o NewPipe armazena quando você resolve um reCAPTCHA + Remover cookies de reCAPTCHA + Os cookies de reCAPTCHA foram removidos O YouTube oferece um \"Modo Restrito\" que oculta conteúdo potencialmente adulto Mostra conteúdo possivelmente inadequado para crianças pois tem restrição de idade (como +18) Permite que o Android personalize a cor da notificação de acordo com a cor principal da miniatura (isso não está disponível em todos os dispositivos) @@ -583,11 +575,11 @@ Usar miniatura para o plano de fundo da tela de bloqueio e notificações Mostrar miniatura Calculando hash - Notificações para o progresso do hash do vídeo - Notificação de hash do vídeo - Desative para ocultar as caixas de informações de metadados com informações adicionais sobre o criador, conteúdo do stream ou uma solicitação de pesquisa + Notificações sobre o progresso do hashing de vídeo + Notificar hash de vídeo + Desative para ocultar as caixas de informações de metadados com informações adicionais sobre o criador, conteúdo da transmissão ou uma solicitação de pesquisa Mostrar informação de metadados - Recentes + Recente Capítulos Descrição Ítens relacionados @@ -603,7 +595,7 @@ Esta é uma faixa do SoundCloud Go+, pelo menos no seu país, portanto não pode ser transmitida ou baixada pelo NewPipe. Este conteúdo não está disponível em seu país. Este vídeo tem restrição de idade. -\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar nenhum de seus streams de vídeo e assim ele não pode ser exibido. +\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar qualquer de suas transmissões de vídeo e assim ela não pode ser exibida. Rádio Destaque Resolvido @@ -611,16 +603,15 @@ Você pode selecionar seu tema noturno favorito abaixo Selecione seu tema noturno favorito — %s Automático (tema do dispositivo) - Tema Noturno + Tema noturno Mostrar detalhes do canal - Desative o tunelamento de mídia se aparecer uma tela preta ou se tiver engasgos durante a reprodução do vídeo - Desativar tunelamento de mídia + Desative o túnel de mídia se aparecer uma tela preta ou se tiver travamento durante a reprodução do vídeo. + Desativar túnel de mídia Interno Privado Não Listado Público Limite de Idade - URL da Miniatura Hospedado em Suporte Idioma @@ -630,7 +621,7 @@ Categoria Desativar seleção de texto na descrição Ativar seleção de texto na descrição - Agora você pode selecionar o texto dentro da descrição. Note que a página pode piscar e os links podem não ser clicáveis no modo de seleção. + Agora você pode selecionar o texto dentro da descrição. Note que a página pode piscar e os URL podem não ser clicáveis no modo de seleção. Abrir site %s fornece este motivo: Conta encerrada @@ -640,103 +631,213 @@ \nDeseja cancelar a inscrição neste canal\? Não foi possível carregar o feed para \'%s\'. Erro ao carregar o feed - O \'Storage Access Framework\' é compatível apenas com versões a partir do Android 10 + A \"Estrutura de acesso ao armazenamento\" é compatível apenas com versões a partir do Android 10 Você será questionado onde salvar cada download Nenhuma pasta de download definida ainda, escolha a pasta de download padrão agora - Desligado - Ligado + Desativado + Ativado Modo tablet - Mostrar itens vistos Não mostrar - Baixa qualidade (menor) - Alta qualidade (maior) + Baixa qualidade (pior) + Alta qualidade (melhor) Pré visualização da miniatura da barra de busca Os comentários estão desabilitados - Marcar como visto + Marcar como assistido Curtido pelo criador Exibir fitas coloridas no topo das imagens indicando sua fonte: vermelho para rede, azul para disco e verde para memória - %1$s download apagado - %1$s downloads apagados - %1$s downloads apagados + %1$s download excluído + %1$s downloads excluídos + %1$s downloads excluídos - Download concluído + %s download concluído %s downloads concluídos %s downloads concluídos - Exibir indicadores com imagem + Mostrar indicadores de imagem Adicionado na próxima posição da fila - Adicionar a próxima posição da fila - Deslize items para remove-los - Não inicia os vídeos no player reduzido, mas muda direto para o modo de tela cheia, se a rotação automática estiver travada. Você ainda consegue acessar o player reduzido saindo da tela cheia - Iniciar o player principal em tela cheia + Enfileira a próxima + Deslize os itens para remove-los + Não inicie os vídeos no mini player, mas vá diretamente para o modo de tela cheia, se a rotação automática estiver bloqueada. Você ainda pode acessar o mini player saindo da tela cheia + Iniciar player principal em tela cheia Sugestões de busca remotas Sugestões de busca locais Processando… Pode demorar um pouco - Procurar por atualizações - Procurar manualmente por novas versões - Procurando por atualizações… - Travar o player - Mostrar \"Travar o player\" - Mostra uma opção de travamento ao usar o player + Buscar atualizações + Verificar manualmente se há novas versões + Buscando atualizações… + Travar reprodução + Mostrar \"Travar reprodução\" + Mostra uma opção para travar a reprodução Novos itens do feed Notificação de relatório de erro Notificações para reportar erros - O NewPipe encontrou um erro, toque para reportar + O NewPipe encontrou um erro, toque para relatar Crie uma notificação de erro Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. -\nInstale um gerenciador de arquivos compatível com o Storage Access Framework +\nInstale um gerenciador de arquivos compatível com a \"Estrutura de acesso ao armazenamento\" Ocorreu um erro, consulte a notificação Mostrar um snackbar de erro Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download 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 + Notificação de reprodução + Configurar notificação da reprodução do vídeo atual Notificações - Novos streams - Notificações sobre novas transmissões para inscrições - Notificações de novas transmissões - Notificar sobre novas transmissões de inscrições + Novos vídeos + Notificações sobre novos vídeos de inscrições + Notificações sobre novos vídeos + Notificar sobre novos vídeos de suas inscrições Frequência de verificação Nenhuma rede - Excluir todos os arquivos baixados do disco\? + Excluir todos os arquivos baixados? Agora você se inscreveu neste canal Alternar tudo , Carregando detalhes da transmissão… - %s nova transmissão - %s novas transmissões - %s novas transmissões + %s novo vídeo + %s novos vídeos + %s novos vídeos - Executar verificação de novas transmissões + Buscar novos vídeos Conexão de rede necessária As notificações estão desativadas Seja notificado 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 - 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 + O vídeo selecionado não é compatível com players externos + Nenhuma transmissão de áudio está disponível para players externos + Os vídeos que ainda não são suportados pelo assistente de download não são exibidos + Nenhuma transmissão de vídeo 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 Classificar Modo rápido - Importar ou exportar inscrições do menu de 3 pontos + Importar ou exportar inscrições no menu com 3 pontos Toque para baixar %s - Você está executando a versão mais recente do NewPipe + Você já possui a atualização mais recente do NewPipe + Esta opção só está disponível se %s for selecionado para Tema + Desativar miniatura permanente + Cartão + Falha ao copiar para a área de transferência + Duplicata adicionada %d vez(es) + As playlists em cinza já contêm este item. + Ignorar eventos de botão de mídia de hardware + Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados + Remover duplicados + Remover duplicados\? + Deseja remover todos os vídeos duplicados nesta playlist? + Mostrar próximos vídeos + Mostrar/ocultar vídeos + Parcialmente assistido + Em breve + Totalmente assistido + Escolha o gesto para a parte esquerda na tela de reprodução + Ação para o gesto à esquerda + Escolha o gesto para a parte direita na tela de reprodução + Brilho + Volume + Nenhum + Ação para o gesto à direita + 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 + Selecione a faixa de áudio para players externo + Desconhecido + Configurar ExoPlayer + Gerenciar algumas configurações do ExoPlayer. É necessário reiniciar o player para aplicar as mudanças + %1$s %2$s + original + dublado + descritivo + Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, no lugar 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 player de vídeo atual ou alternar para tela cheia + Uma faixa de áudio já deve estar presente neste vídeo + Usar decodificador alternativo do ExoPlayer + Usar sempre a solução alternativa de configuração da superfície de saída de vídeo 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 + Mover o seletor da guia principal para a parte inferior + Posição de guias principais + Nenhum conteúdo + Nenhuma transmissão ao vivo + O túnel de mídia foi desabilitado por padrão em seu dispositivo porque seu modelo é conhecido por não suportá-lo. + Vídeos + Inscritos + Quais guias são mostradas na página do canal + Guias do canal + Shorts + Carregando metadados… + Buscar guias de canal + Sobre + Álbuns + Guias a serem buscadas ao atualizar o feed. Esta opção não tem efeito se um canal for atualizado usando o modo rápido. + Playlists + Faixas + Canais + Ao vivo + Qualidade da imagem + \? + Compartilhar URL + Compartilhar com título + %1$s +\n%2$s + Alternar orientação da tela + Baixa qualidade + Alternar tela cheia + Fotos + Próximo vídeo + Fotos de perfil do subcanal + Abrir fila de reprodução + Não carregar imagens + Alta qualidade + Compartilhar playlist + Avançar + Retroceder + Repetir + Compartilhar playlist com detalhes como o nome da playlist e títulos de vídeo ou como uma lista simples dos URL de vídeos + Qualidade média + Fotos de perfil do autor + - %1$s: %2$s + Escolha a qualidade das imagens e se as imagens devem ser carregadas, para reduzir o uso de dados e memória. As alterações limpam o cache de imagens na memória e no disco - %s + Reproduzir + Mais opções + Miniaturas + Duração + Vídeo anterior + Banners + Mostrar mais + Edite cada ação de notificação abaixo tocando nela. As três primeiras ações (reproduzir/pausar, anterior e seguinte) são definidas pelo sistema e não podem ser personalizadas. + + %s resposta + %s respostas + %s respostas + + Mostrar menos + Não há espaço livre suficiente no dispositivo + Sim + Não + Backup & Restauração + O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. +\nDeseja ativar essa opção? + Restaurar configurações + Restaurar todas as configurações para seus valores padrão + A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará o aplicativo. +\n +\nTem certeza de que deseja continuar? + As configurações na exportação que está sendo importada usam um formato vulnerável que foi descontinuado desde o NewPipe 0.27.0. Certifique-se de que a exportação que está sendo importada seja de uma fonte confiável e prefira usar apenas exportações obtidas do NewPipe 0.27.0 ou mais recente no futuro. O suporte para importação de configurações neste formato vulnerável será completamente removido em breve e as versões antigas do NewPipe não poderão mais importar configurações de exportações de novas versões. + secundário \ 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 0a2205eeedd..ce155f275fb 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -44,9 +44,10 @@ Histórico de visualizações %s visualização + %s visualizações %s visualizações - Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? + Deseja limpar o histórico de descargas ou eliminar todos os ficheiros descarregados? Histórico e cache Continuar reprodução após interrupções (ex. chamadas) Descarregar ficheiro de vídeo @@ -70,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. @@ -95,7 +95,7 @@ A pesquisa inexata permite que esta seja mais rápida, mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente Permitir sobreposição a outras aplicações Exportar para - Acerca de NewPipe + Sobre o NewPipe Página vazia Geração automática (não foi encontrado nenhum enviador) Resolução padrão @@ -111,11 +111,13 @@ Criado por %s %d segundo + %d segundos %d segundos - %d selecionada - %d selecionadas + %d selecionado + %d selecionados + %d selecionados Partilhar Ver política de privacidade @@ -135,28 +137,28 @@ Mostrar resoluções mais altas Sem subscritores Utilizar reprodutor de áudio externo - Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória Será que queria dizer \"%1$s\"\? Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão Enfileirar Ninguém está a ver - Remover ficheiros descarregados + Eliminar ficheiros descarregados Idioma da aplicação Utilizadores Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. \nTem a certeza\? Esta ação não pode ser revertida! %s a ver + %s a ver %s a ver Por favor aguarde… 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 @@ -165,7 +167,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 @@ -201,7 +203,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 @@ -215,30 +217,28 @@ Novos e tendências Remove o histórico de pesquisas Notificação de nova versão - Não foi possível decifrar a assinatura do URL Selecione uma lista de reprodução Última atualização: %s Importar base de dados Relatório de erro - Não há espaço livre no dispositivo + Não há espaço livre no dispositivo Número máximo de tentativas antes de cancelar a descarga A recuperar de um erro do reprodutor Em direto Limite de atualização da fonte OK Não foi possível atualizar a subscrição - Não existe uma aplicação para reproduzir este ficheiro Sim e também os vídeos parcialmente vistos M Ainda não há listas de reprodução favoritas %s ouvinte + %s ouvintes %s ouvintes Remover todo o histórico de pesquisas\? - Reportar erro por e-mail + 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 @@ -253,10 +253,10 @@ 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 + %s subscritores %s subscritores Deseja repor as predefinições\? @@ -285,11 +285,12 @@ Remover vídeos visualizados\? %d minuto + %d minutos %d minutos 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 @@ -331,25 +332,28 @@ Recentes %s vídeo + %s vídeos %s vídeos Importar Remove o histórico dos vídeos reproduzidos e as posições de reprodução %d dia + %d dias %d dias Pausa nas transferências 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 @@ -374,7 +378,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 @@ -436,7 +440,6 @@ Formato padrão de áudio O ficheiro não existe ou não tem permissões para ler e/ou escrever O nome do grupo está vazio - Carregar miniaturas Partilhar com Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s Pesquisar @@ -457,7 +460,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 @@ -468,7 +471,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 @@ -477,7 +479,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\" @@ -493,7 +495,7 @@ Conteúdo indisponível Subscrito Cache de imagens limpa - Sobre e FAQ + Sobre e perguntas frequentes Contagem de subscrições indisponível Ação padrão ao abrir o conteúdo — %s Repor @@ -535,7 +537,7 @@ Toque para detalhes em pausa Mostrar comentários - Aceitar + Concluído Desativar modo rápido Nunca Apenas em Wi-Fi @@ -552,13 +554,13 @@ Baralhar Repetir Pode selecionar, no máximo, três ações para mostrar na notificação compacta! - Edite cada ação de notificação abaixo tocando nela. Selecione até três delas para serem mostrados na notificação compacta a usar as caixas de seleção à direita + Edite cada ação de notificação abaixo, a tocar nela. Selecione até três delas para serem mostradas na notificação compacta, através das caixas de verificação à direita. Quinto botão de ação Quarto botão de ação 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 @@ -593,7 +595,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 @@ -603,7 +605,7 @@ Automático (Tema do dispositivo) Tema escuro Mostrar detalhes do canal - Desative esta opção se estiverem a ocorrer erros de ecrã escuro ou paragens durante a reprodução + Desactive o túnel multimédia se tiver um ecrã preto ou gaguejo na reprodução de vídeo. Desativar túnel multimédia Desligado Ligado @@ -614,7 +616,6 @@ Privado Não listado Público - URL da miniatura Servidor Apoio Idioma @@ -628,7 +629,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. @@ -649,25 +649,27 @@ Sugestões de pesquisa remotas Sugestões de pesquisa locais - %1$s descarga apagada - %1$s descargas apagadas + %1$s descarga eliminada + %1$s descargas eliminadas + %1$s descargas eliminadas - Descarga concluída - %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 + 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 @@ -681,30 +683,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\? + Eliminar todos os ficheiros descarregados do disco? Notificações são desativadas - %s fluxo novo - %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 @@ -715,15 +717,126 @@ 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 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 auscultadores com botões físicos danificados + Remover duplicados + Mostrar os seguintes vídeos + Mostrar/ocultar vídeos + Completamente visto + Parcialmente visto + Proximamente + Remover duplicados\? + 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 + %1$s %2$s + Mova o seletor da guia principal para a parte inferior + Posição das guias principais + O túnel multimédia foi desativado por predefinição no seu dispositivo porque se sabe que o modelo do dispositivo não o suporta. + Nenhum vídeo em direto + Nenhum vídeo + Qualidade da imagem + Vídeos + \? + Subscritores + Os separadores a mostrar na página Canal + Partilhar lista de URLs + Partilhar com títulos + %1$s +\n%2$s + Separadores do canal + Curtos + A carregar metadados… + Alternar orientação do ecrã + Baixa qualidade + Alternar ecrã completo + Obter separadores de canais + Avatars + Fluxo seguinte + Avatar de subcanais + Abrir fila de reprodução + Não carregar imagens + Alta qualidade + Sobre + Partilhar lista de reprodução + Avançar + Álbuns + Recuar + Repetição + Separadores a obter ao atualizar o feed. Esta opção não tem efeito se um canal for atualizado utilizando o modo rápido. + Partilhe a lista de reprodução com detalhes como o nome da lista de reprodução e os títulos dos vídeos ou como uma simples lista de URLs de vídeos + Média qualidade + Avatar dos publicadores + Bandeiras + Listas de reprodução + - %1$s: %2$s + Escolha a qualidade das imagens e se pretende carregar imagens, para reduzir a utilização de dados e de memória. As alterações limpam a cache de imagens na memória e no disco - %s + Reproduzir + Mais opções + Miniaturas + Faixas + Duração + Canais + Fluxo anterior + Direto + Mostrar mais + Edite cada ação de notificação abaixo a tocar nela. As três primeiras ações (reproduzir/pausa, anterior e seguinte) são definidas pelo sistema e não podem ser personalizadas. + + %s resposta + %s respostas + %s respostas + + Mostrar menos + O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. +\nDeseja ativar essa opção? + Repor valores originais de todas as definições + A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. +\n +\nTem certeza que deseja continuar? + Sim + Não + Cópia de segurança e restauro + Repor definições + Não há espaço suficiente no aparelho + As configurações na exportação a serem importadas usam um formato vulnerável depreciado desde NewPipe 0.27.0. Certifique-se de que a exportação que é importada é de uma fonte confiável e prefira usar apenas as exportações obtidas do NewPipe 0.27.0 ou mais recentes no futuro. O suporte para importar configurações neste formato vulnerável será removido em breve completamente e, em seguida, versões antigas do NewPipe não serão capazes de importar configurações de exportações de novas versões. \ 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 862d6e38381..516979027a5 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,7 +1,7 @@ Publicado em %1$s - Não tem um reprodutor de vídeo. Instalar o VLC\? + Reprodutor de vídeo não encontrado. Instalar VLC\? Instalar Cancelar Abrir no navegador @@ -15,12 +15,12 @@ Utilizar reprodutor de áudio externo Pasta para os ficheiros de vídeo Os ficheiros de vídeo descarregados serão guardados aqui - Escolha a pasta para colocar os ficheiros de vídeo + Escolha a pasta para guardar os ficheiros de vídeo Resolução padrão Reproduzir no Kodi Instalar Kore\? Mostrar opção \"Reproduzir no Kodi\" - Mostrar uma opção para reproduzir o vídeo no Kodi + Mostrar opção para reproduzir o vídeo no Kodi Áudio Formato padrão de áudio Descarregar @@ -38,19 +38,18 @@ Aparência Reprodução em segundo plano Erro de rede - Pasta para ficheiros de áudio + Pasta para os ficheiros de áudio Os ficheiros de áudio descarregados serão guardados aqui - Escolha a pasta para colocar os ficheiros de áudio + Escolha a pasta para guardar os ficheiros de áudio Erro Não foi possível carregar todas as miniaturas - Não foi possível decifrar a assinatura do URL Não foi possível processar o site Conteúdo indisponível Conteúdo Mostrar conteúdo com restrição de idade Não foi possível configurar o menu de descargas Bolas, isto não deveria ter acontecido. - Reportar erro por e-mail + Reportar por e-mail Desculpe mas algo correu mal. Relatório Informação: @@ -62,8 +61,8 @@ Tentar novamente Toque na lupa para começar. Em direto - Transferências - Transferências + Descargas + Descargas Relatório de erro Iniciar Pausa @@ -74,7 +73,7 @@ Toque para detalhes Por favor aguarde… Copiado para a área de transferência - Tem que definir, nas definições, uma pasta para as descargas + Pode definir, mais tarde, uma pasta para as descargas OK Processos Descarga NewPipe @@ -83,7 +82,7 @@ Abrir no modo popup Preto Tudo - k + K M MM Esta permissão é necessária @@ -105,12 +104,12 @@ Sugestões de pesquisa Escolha as sugestões a mostrar ao pesquisar Melhor resolução - Acerca de NewPipe + Sobre o NewPipe Licenças de terceiros © %1$s de %2$s nos termos da %3$s - Sobre e FAQ + Sobre e perguntas frequentes Licenças - Aplicação livre de reprodução de transmissões para Android. + Aplicação de reprodução para Android. Ver no GitHub Licença do NewPipe 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á! @@ -123,7 +122,7 @@ Não foi possível atualizar a subscrição Subscrições Novidades - Histórico de pesquisa + Pesquisar histórico Guardar termos de pesquisa localmente Histórico de visualizações Manter histórico dos vídeos visualizados @@ -132,9 +131,9 @@ Reprodutor Comportamento Histórico e cache - Anular + Desfazer Notificação NewPipe - Notificações para o reprodutor do NewPipe + Notificações para o reprodutor NewPipe Sem resultados Aqui não há nada para ver Sem subscritores @@ -155,7 +154,7 @@ %s vídeos %s vídeos - Transferências + Descargas Carateres permitidos no nome dos ficheiros Os carateres inválidos são substituídos por este valor Carácter de substituição @@ -181,7 +180,7 @@ Detalhes Definições de áudio Iniciar reprodução em segundo plano - Iniciar reprodução num popup + Iniciar reprodução em popup Mostrar informação Listas de reprodução favoritas Sempre @@ -194,18 +193,16 @@ Mudar para popup Mudar para principal Não foi possível reproduzir este vídeo - Os reprodutores externos não suportam este tipo de hiperligações + Os reprodutores externos não possuem suporte a este tipo de ligações Arraste para reordenar Criar Mudar nome Doar - Não foi encontrado um reprodutor (pode instalar o VLC para reproduzir). - Descarregar ficheiro de vídeo + Reprodutor de vídeo não encontrado (pode instalar VLC para o efeito). + Descarregar ficheiro Adicionar a Utilizar pesquisa rápida - A pesquisa inexata permite que esta seja mais rápida, mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente - Carregar miniaturas - Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória + Este tipo de pesquisa é mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente Cache de imagens limpa País padrão para conteúdo Depuração @@ -240,7 +237,7 @@ Reprodutor \'popup\' Perguntar sempre A obter informação… - A carregar o conteúdo solicitado + A carregar conteúdo solicitado Nova lista de reprodução Mudar nome Adicionar à lista de reprodução @@ -265,13 +262,13 @@ Não foi possível exportar as subscrições Importar subscrições do YouTube do Google Takeout: \n -\n1. Vá para este URL: %1$s -\n2. Faça o login quando solicitado -\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\". -\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\". +\n1. Aceda ao URL: %1$s +\n2. Inicie sessão +\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione \"Subscrições\" e clique em \"OK\". +\n4. Clique em \"Próximo passo\" e, depois, em \"Criar exportação\". \n5. Clique no botão \"Descarregar\" após aparecer \n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado -\n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído +\n7. [Se a importação falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n \n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) @@ -283,25 +280,24 @@ Ritmo Limpar histórico de visualizações Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado - Mostrar dica \"Toque longo para enfileirar\" - Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup + Mostrar dica \"Toque longo para colocar na fila\" + Mostrar dica ao premir em segundo plano ou no botão \"Detalhes\" da janela popup Canais Listas de reprodução Faixas Utilizadores Remove o histórico dos vídeos reproduzidos e as posições de reprodução Remover todo o histórico de visualizações\? - Histórico de vídeos apagado - Limpar histórico de pesquisas + Histórico de vídeos eliminado + Remover histórico de pesquisas Remove o histórico de pesquisas Remover todo o histórico de pesquisas\? Histórico de pesquisa removido 1 item eliminado. - Não existe uma aplicação para reproduzir este ficheiro NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor. Contribuir Política de privacidade do NewPipe - O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe nenhum dado sem o seu consentimento. + O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe dados sem o seu consentimento. \nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro. Ver política de privacidade Adicionar o próximo vídeo à fila automaticamente @@ -313,7 +309,7 @@ Definir como miniatura da lista de reprodução Ajustar Preencher - Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações + Alterar escala das legendas e do estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações A monitorização de memória pode tornar a aplicação instável Reportar erros \'out-of-lifecycle\' Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação @@ -338,20 +334,16 @@ 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 Notificações para novas versões do NewPipe Armazenamento externo indisponível Não é possível guardar no cartão SD. Repor pasta de descargas\? - Não foi possível ler as guias gravadas, portanto usando as guias predefinidas + Não foi possível ler os separadores guardados e vamos usar os separadores padrão Repor predefinições Deseja repor as predefinições\? - Contagem de subscrições indisponível + Número de subscrições indisponível Separadores mostrados na página principal Atualizações Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão @@ -364,7 +356,7 @@ em pausa na fila pós-processamento - Enfileirar + Colocar na fila Ação recusada pelo sistema Falha ao descarregar Gerar nome único @@ -378,14 +370,14 @@ Não foi possível encontrar o servidor Não foi possível ligar ao servidor O servidor não envia dados - O servidor não aceita transferências multi-processo, tente novamente com @string/msg_threads = 1 + O servidor não aceita descargas multi-processo, tente novamente com @string/msg_threads = 1 Não encontrado Falha pós-processamento Parar Tentativas máximas Número máximo de tentativas antes de cancelar a descarga Interromper em redes limitadas - Útil ao trocar para dados móveis, mas algumas transferências não podem ser suspensas + Útil ao trocar para dados móveis, mas algumas descargas não podem ser suspensas Eventos Conferências Pendente @@ -403,23 +395,23 @@ Posições de reprodução removidas Ficheiro movido ou eliminado Já existe um ficheiro com este nome - não é possível sobrescrever o ficheiro + Não foi possível substituir o ficheiro Existe uma descarga pendente com este nome NewPipe foi fechado enquanto trabalhava no ficheiro - Não há espaço livre no dispositivo + Não há espaço livre no dispositivo Progresso perdido, o ficheiro foi eliminado Ligação expirada - Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? + Deseja limpar o histórico de descargas ou eliminar todos os ficheiros descarregados? Limitar fila de descargas Permitir apenas uma descarga de cada vez - Iniciar transferências - Pausa nas transferências - Perguntar para onde transferir - 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 + Iniciar descargas + Pausa nas descargas + Perguntar onde guardar + Ser-lhe-á perguntado onde guardar cada descarga. +\nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo Utilizar seletor de pastas do sistema (SAF) - \'Storage Access Framework\' permite transferências para um cartão SD externo - Limpar posições de reprodução + \'Storage Access Framework\' permite descargas para um cartão SD externo + Remover posições de reprodução Remove todas as posições de reprodução Remover todas as posições de reprodução\? Alternar serviço atualmente selecionado: @@ -436,34 +428,34 @@ %s ouvintes %s ouvintes - O idioma será alterado assim que reiniciar a app - Duração da pesquisa de avanço/recuo rápido + O idioma será alterado assim que reiniciar a aplicação + Duração de avanço/recuo rápido Instâncias PeerTube - Defina as suas instâncias favoritas PeerTube + Defina as suas instâncias PeerTube preferidas Encontre as instâncias que gosta em %s Adicionar instância Digite o URL da instância Falha ao validar a instância - Apenas os URL HTTPS são suportados + Apenas são suportados os URL HTTPS Instância já existe Local Recentes Mais apreciados - Geração automática (não foi encontrado nenhum enviador) + Geração automática (não foi encontrado nenhum carregador) a recuperar Não é possível recuperar esta descarga Escolha uma instância Limpar histórico de descargas - Remover ficheiros descarregados + Eliminar ficheiros descarregados Permitir sobreposição a outras aplicações Idioma da aplicação Predefinição do sistema Prima \"Feito\" ao resolver - Aceitar - Acha que a fonte demora muito tempo a carregar\? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). + Feito + Acha que a fonte demora muito tempo a carregar? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). \n \nNewPipe oferece duas estratégias de carregamento: -\n- Obter todo o canal de subscrição - lento, mas completo. +\n- Obter todo o canal - lento, mas completo. \n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo. \n \nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens. @@ -476,11 +468,11 @@ Disponível em alguns serviços, é geralmente muito mais rápido, mas pode devolver uma quantidade limitada de itens e muitas vezes informações incompletas (por exemplo, sem duração, tipo de item, sem estado ativo) Se possível, obter de uma fonte dedicada Atualizar sempre - Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s + Tempo após a última atualização antes da subscrição ser considerada desatualizada - %s Limite de atualização da fonte Fonte Novo - Deseja apagar este grupo\? + Deseja remover este grupo? O nome do grupo está vazio %d selecionado @@ -526,7 +518,7 @@ Artistas Álbuns Músicas - Este vídeo está restringido a idades. + Este vídeo está restringido a adultos. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. @@ -552,21 +544,21 @@ Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções) + Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 Cortar miniatura na proporção 1:1 Iniciar reprodução automaticamente — %s - Reproduzir fila + Fila de reprodução Nunca A carregar - A fila do reprodutor ativo será substituída + A fila de reprodução atual será substituída URL não reconhecido. Abrir com outra aplicação\? - Enfileiramento automático + Colocar na fila automaticamente Baralhar Apenas em Wi-Fi Nada Mudar de um reprodutor para outro pode substituir a sua fila - Pedir confirmação antes de limpar uma fila - Edite cada ação de notificação abaixo tocando nela. Selecione até três delas para serem mostrados na notificação compacta a usar as caixas de seleção à direita + Pedir confirmação antes de limpar a fila + Edite cada ação de notificação abaixo, tocando na mesma. Seleccione até três delas para serem mostradas na notificação compacta, utilizando as caixas de verificação à direita. Pode selecionar, no máximo, três ações para mostrar na notificação compacta! Repetir Quinto botão de ação @@ -576,14 +568,14 @@ Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA Os cookies reCAPTCHA foram limpos Limpar cookies reCAPTCHA - O YouTube fornece um \"Modo restrito\" que oculta o conteúdo destinado a adultos + O YouTube fornece um \"Modo restrito\" que oculta conteúdo, potencialmente, destinado a adultos Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+) - Fazer com que o Android personalize a cor da notificação conforme a cor principal na miniatura (esta opção não está disponível em todos os dispositivos) - Colorir notificação - Usar miniaturas no fundo do ecrã de bloqueio e em notificações + Personalizar cor da notificação com a cor principal da miniatura (esta opção não está disponível em todos os dispositivos) + Notificação colorida + Usar miniatura como fundo do ecrã de bloqueio e nas notificações Mostrar miniatura A calcular \'hash\' - Notificar sobre o progresso das \'hash\' de vídeos + Notificar sobre o progresso das \'hash\' dos vídeos Notificação \'hash\' do vídeo Recentes Desative para ocultar as caixas com informações adicionais acerca do criador, do conteúdo ou de um pedido de pesquisa @@ -591,18 +583,18 @@ Não possui qualquer aplicação para abrir este ficheiro Capítulos Descrição - Emissões relacionadas + Itens relacionados Comentários Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição Abrir com - A app travou + Terminar aplicação Este vídeo tem uma restrição de idade. -\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. - Este conteúdo só está disponível para utilizadores que pagaram, portanto não pode ser transmitido ou descarregado pelo NewPipe. - Este vídeo está disponível apenas para os membros do YouTube Music Premium, portanto não pode ser transmitido ou descarregado pelo NewPipe. - Este conteúdo é privado, portanto não pode ser transmitido ou descarregado pelo NewPipe. - Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe. +\nDevido às novas políticas do YouTube quanto a restrição de alguns vídeos, o NewPipe não pode aceder a estes vídeos e, por isso, não os consegue reproduzir. + Este conteúdo só está disponível para utilizadores pagantes e não pode ser reproduzido ou descarregado pelo NewPipe. + Este vídeo só está disponível para os membros do YouTube Music Premium e não pode ser reproduzido ou descarregado pelo NewPipe. + Este conteúdo é privado e não pode ser reproduzido ou descarregado pelo NewPipe. + Esta é uma faixa SoundCloud Go+ e, pelo menos no seu país, não pode ser reproduzida ou descarregada por NewPipe. Este conteúdo não está disponível no seu país. Rádio Destaques @@ -613,39 +605,37 @@ Automático (Tema do dispositivo) Tema escuro Mostrar detalhes do canal - Desative esta opção se estiverem a ocorrer erros de ecrã escuro ou paragens durante a reprodução + Desative o túnel multimédia se tiver um ecrã preto ou paragens na reprodução de vídeos. Desativar túnel multimédia Sempre que descarregar um ficheiro, terá que indicar o local para o guardar - Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão + Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar %s fornece este motivo: Conta encerrada - Mostrar itens vistos - O modo de feed rápido não fornece mais informações sobre isto. + O modo de fonte rápida 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. -\nQuer cancelar a inscrição deste canal\? - Não foi possível carregar o feed para \'%s\'. - Erro ao carregar o feed - A partir do Android 10, apenas o \'Storage Access Framework\' é compatível - Pré-visualização da miniatura da barra de pesquisa +\nNewPipe não será capaz de carregar esta fonte. +\nDeseja cancelar a subscrição deste canal? + Não foi possível carregar a fonte para \'%s\'. + Erro ao carregar a fonte + A partir do Android 10, apenas é compatível o \'Storage Access Framework\' + Pré-visualização da miniatura na barra de pesquisa Marcar como visto Desligado Ligado Modo tablet - Abrir site de web - Entusiasmado pelo criador + Abrir site + Adorado pelo criador Interno Privado Não listado Público - URL da miniatura Servidor - Apoio + Suporte Idioma Limite de idade Privacidade Licença - Marcadores + Etiquetas Categoria Desativar seleção de texto na descrição Ativar seleção de texto na descrição @@ -653,7 +643,7 @@ Não mostrar Baixa qualidade (menor) Alta qualidade (maior) - Comentários estão desativados + Os comentários estão desativados Mostrar fitas coloridas de Picasso em cima das imagens que indicam a sua fonte: vermelho para rede, azul para disco e verde para memória Mostrar indicadores de imagem Sugestões de pesquisa remotas @@ -668,75 +658,186 @@ %s descargas concluídas %s descargas 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 + Deslize nos itens para os remover + Não iniciar vídeos em mini-reprodutor e ativar ecrã completo, se a rotação automática estiver bloqueada. Pode aceder ao mini-reprodutor se sair do modo de ecrã completo. Iniciar reprodutor principal em ecrã completo - Enfileirado o próximo - Pôr na fila o próximo - A processar… Pode demorar um momento - Procurar atualizações + Seguinte colocado na fila + Colocar seguinte na fila + A processar… Pode levar algum tempo + Procurar atualizações Verificar manualmente se existe uma nova versão A procurar atualizações… Novos itens - Travar o reprodutor + Terminou o reprodutor Mostrar \"Travar o reprodutor\" - Mostra uma opção de travamento ao usar o reprodutor - Notificação de relatório de erros + Mostra uma opção para terminar o reprodutor + Notificação para relatórios de erro Notificações para reportar erros - NewPipe encontrou um erro, toque para relatar + NewPipe encontrou um erro, toque para reportar Ocorreu um erro, veja a notificação - Mostrar um snackbar de erro + Mostrar uma barra de erros Criar uma notificação de erro - Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar + Não foi encontrado um gestor de ficheiros apropriado para esta ação. +\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas definições das descargas Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework - Comentário fixado - 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 +\nPor favor, instale um gestor de ficheiros compatível com SAF (Storage Access Framework) + Comentário afixado + LeakCanary não disponível + Predefinição ExoPlayer Notificação do reprodutor - Configurar a notificação da reprodução do vídeo atual + Configurar notificação da reprodução do vídeo atual Notificações A carregar detalhes do vídeo… - Verificar se há novos vídeos + Procurar novos vídeos Notificações sobre novos vídeos - Notificar sobre novos vídeos nas assinaturas + Notificar sobre novos vídeos nas subscrições Frequência da verificação - Conexão de rede necessária + Requer uma ligação de rede Qualquer rede - Agora assinou este canal + É agora um subscritor deste canal Alternar tudo - Apagar todos os ficheiros descarregados do disco\? + Eliminar todos os ficheiros descarregados? Novos vídeos - Notificações sobre novos vídeos para assinaturas + Notificações sobre novos vídeos nas subscrições - %s vídeo novo - %s vídeos novos - %s vídeos novos + %s novo vídeo + %s novos vídeos + %s novos vídeos - Seja notificado - Notificações são desativadas + Obter notificação + As notificações estão desativadas , - Por cento - Semitom - As transmissões que ainda não são suportadas para descarregamento não são mostradas - Não estão disponíveis transmissões de áudio a reprodutores externos - Não estão disponíveis transmissões de vídeo a reprodutores externos + Percentual + Semi-tom + Os vídeos não suportados para descarga não são mostrados + Não estão disponíveis reproduções de áudio para reprodutores externos + Não estão disponíveis reproduções de vídeo para reprodutores externos Selecione a qualidade para reprodutores externos Formato desconhecido Qualidade desconhecida - A transmissão selecionada não é suportada por reprodutores externos - Mostrar artigos futuros + O vídeo selecionado não é suportado por reprodutores externos 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! - Ordenação + Se está a ter problemas a usar a aplicação, veja estas respostas para as perguntas mais comuns! + Ordem Modo rápido - Importar ou exportar subscrições do menu de 3 pontos + Importe ou exporte subscrições no menu 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s + Esta opção só está disponível se estiver selecionado %s para o tema + Desativar miniatura permanentemente + 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. + Duplicado adicionado %d vez(es) + Ignorar botões físicos + Útil, por exemplo, se estiver a utilizar auscultadores com botões físicos danificados + Remover duplicados + Remover duplicados\? + Mostrar/ocultar vídeos + Brevemente + Deseja remover todos os vídeos duplicados desta lista de reprodução? + Completamente visto + Mostrar vídeos seguintes + Parcialmente visto + Ação para o gesto à esquerda + Ação para o gesto à direita + Brilho + Volume + Nada + Escolha o gesto para a parte esquerda do ecrã + Escolha o gesto para a parte direita do ecrã + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Esta solução alternativa liberta 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 definição só tem efeito no Android 6 e superior +\n +\nA ativaçã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 (atualmente %s). Um valor menor pode acelerar o carregamento inicial do conteúdo + Dar preferência ao áudio original + Seleciona o áudio original, independentemente do idioma + Dar preferência ao áudio descritivo + Áudio: %s + Faixa de áudio + Já deve existir uma faixa de áudio neste vídeo + Selecione a faixa de áudio para reprodutores externos + Desconhecida + Definições ExoPlayer + Gere algumas definições ExoPlayer. Tem que reiniciar o reprodutor para aplicar as alterações + Utilizar descodificador se recurso 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 + %1$s %2$s + original + dobrado + descritivo + Mova o seletor do separador principal para a parte inferior + Posição dos separadores principais + O túnel multimédia foi desativado no seu dispositivo porque o seu dispositivo não tem suporte à opção. + Nenhum vídeo em direto + Nenhum vídeo + A carregar metadados… + Obter separadores de canais + Separadores a obter ao atualizar a fonte. Esta opção não tem efeito se um canal for atualizado utilizando o modo rápido. + Qualidade da imagem + Vídeos + \? + Subscritores + Os separadores a mostrar na página Canal + Partilhar URL + Partilhar com título + %1$s +\n%2$s + Separadores do canal + Curtos + Alternar orientação do ecrã + Baixa qualidade + Alternar ecrã completo + Avatars + Vídeo seguinte + Avatar de subcanais + Abrir fila de reprodução + Não carregar imagens + Alta qualidade + Sobre + Partilhar lista de reprodução + Avançar + Álbuns + Recuar + Repetição + Média qualidade + Avatar dos publicadores + Banners + Listas de reprodução + - %1$s: %2$s + Reproduzir + Mais opções + Miniaturas + Faixas + Duração + Canais + Vídeo anterior + Direto + Partilhe a lista de reprodução com detalhes como o nome da lista de reprodução e os títulos dos vídeos ou como uma simples lista de URLs de vídeos + Escolha a qualidade das imagens e se pretende carregar imagens, para reduzir a utilização de dados e de memória. As alterações limpam a cache de imagens na memória e no disco - %s + Mostrar mais + + %s resposta + %s respostas + %s respostas + + Mostrar menos + Edite cada ação de notificação abaixo a tocar nela. As três primeiras ações (reproduzir/pausa, anterior e seguinte) são definidas pelo sistema e não podem ser personalizadas. + Não há espaço suficiente no dispositivo + Sim + Não + Repor valores originais de todas as definições + Cópia de segurança e restauro + Repor definições + A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. +\n +\nTem certeza que deseja continuar? + O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. +\nDeseja ativar essa opção? + As configurações na exportação a serem importadas usam um formato vulnerável depreciado desde NewPipe 0.27.0. Certifique-se de que a exportação que é importada é de uma fonte confiável e prefira usar apenas as exportações obtidas do NewPipe 0.27.0 ou mais recentes no futuro. O suporte para importar configurações neste formato vulnerável será removido em breve completamente e, em seguida, versões antigas do NewPipe não serão capazes de importar configurações de exportações de novas versões. + secundario \ 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 636c617b2f8..9489c059534 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,11 +1,11 @@ - Încărcat pe %1$s + Publicat pe %1$s Niciun player pentru streaming găsit. Instalați VLC\? Instalare Anulare Deschidere în browser - Distribuiți + Distribuire Descărcare Căutare Setări @@ -30,7 +30,7 @@ Întunecat Luminos Descărcați - Arată videoclipurile care \'Urmează\' şi cele \'Similare\' + Arată videoclipurile care \'Urmează\' și cele \'Similare\' URL nesuportat Limba dorită a conținutului Video și Audio @@ -41,7 +41,6 @@ Eroare Eroare de rețea Nu s-au putut încărca toate miniaturile - Nu s-a putut deobfusca semnătura URL-ului video Nu s-a putut analiza site-ul web Conținut indisponibil Nu s-a putut configura meniul de descărcare @@ -55,7 +54,7 @@ Descărcări Raport de erori Ne pare rău, asta nu trebuia să se întâmple. - Raportați această eroare prin e-mail + Raport prin e-mail Ne pare rău, ceva a mers prost. Raportați Informații: @@ -78,7 +77,7 @@ Vă rugăm așteptați… Copiat în clipboard Vă rugăm să definiți un folder de descărcare mai târziu în setări - Deschide în modul popup + Deschidere în modul popup Această permisiune este necesară pentru a \ndeschide în mod pop-up Provocare reCAPTCHA @@ -92,7 +91,7 @@ Toate Dezactivat Aplicația/UI s-a oprit - Ce:\\nSolicitare:\\nLimba conținutului:\\nȚara conținutului:\\nLimba aplicației:\\nServiciu:\\nOra GMT:\\nPachet:\\nVersiune: \\nVersiune SO: + Ce:\\nSolicitare:\\nLimba conținutului:\\nȚara conținutului:\\nLimba aplicației:\\nServiciu:\\nOra GMT:\\nPachet:\\nVersiune:\\nVersiune SO: k mil. mld. @@ -105,7 +104,7 @@ Alegeți sugestiile care vor fi afișate la căutare Ștergeți Rezoluție maximă - Abonează-te + Abonare Abonat(ă) Canal dezabonat Nu s-a putut modifica abonamentul @@ -155,7 +154,7 @@ © %1$s de %2$s sub %3$s Despre & FAQ Licențe - Un player de streaming „uşor” liber, pentru Android. + Un player de streaming „ușor” liber, pentru Android. Vedeți pe GitHub Licența NewPipe Fie că aveți idei de: traducere, modificări de design, curățare a codului sau modificări de cod cu adevărat importante - ajutorul este întotdeauna binevenit. Cu cât se face mai mult, cu atât mai bine devine! @@ -176,13 +175,11 @@ Noi și populare Niciun player pentru streaming găsit. (Totuși, puteți instala VLC). Descărcați fișierul de flux - Arată informații - Playlist-uri salvate - Salvează în + Afișare informații + Playlisturi salvate + Salvare în Folosește parcurgerea rapidă inexactă Derularea inexactă permite player-ului să deruleze mai rapid, cu o precizie redusă. Derularea timp de 5, 15 sau 25 de secunde nu funcționează cu aceasta - Încarcă miniaturi - Dezactivați pentru a preveni încărcarea miniaturilor, economisirea datelor și utilizarea memoriei. Modificările șterg atât memoria cache a imaginilor în memorie, cât și pe disc Datele cache de imagini au fost șterse Șterge cache-ul pentru metadata Șterge cache-ul pentru datele de pagini web @@ -204,7 +201,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 @@ -230,24 +227,23 @@ Eliminați Detalii Setări Audio - Apăsaţi pentru a adăuga în coadă + Apăsați pentru a adăuga în coadă Începeți redarea în fundal Începeți redarea în popup - Deschdeţi sertarul - Închideţi sertarul - Opţiunea de deschidere preferată + Deschdeți sertarul + Închideți sertarul + Opțiunea de deschidere preferată Acțiune implicită la deschiderea conținutului - %s Player Video Player Fundal Player Popup Întrebați întotdeauna Nu există fluxuri disponibile pentru descărcare - Trageţi pentru a reordona + Trageți pentru a reordona Creați Respingeți - Redenumiţi - Nici o aplicație instalată pentru a reda acest fișier - Donaţi + Redenumiți + Donați De asemenea, doriți să importați setări? Nume Listă de redare creată @@ -276,12 +272,8 @@ Viteză Acceptați Refuzați - Dezabonează-te + 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 @@ -345,7 +337,7 @@ Selectați instanțele PeerTube preferate Instanțe PeerTube Durată derulare rapidă înainte/înapoi - Gata + Gata Apăsați \"Gata\" după ce ați rezolvat problema Raportați pe GitHub Ștergeți cookie-urile pe care NewPipe le stochează atunci când rezolvați un reCAPTCHA @@ -367,11 +359,11 @@ Faceți ca Android să personalizeze culoarea notificării în funcție de culoarea principală din miniatură (rețineți că aceasta nu este disponibilă pe toate dispozitivele) Colorează notificarea Nimic - Tamponare + Se încarcă Redare aleatorie - Repetaţi + Repetare Puteți selecta cel mult trei acțiuni pentru afișare în notificarea compactă! - Modificați fiecare acțiune de notificare de mai jos, atingând-o. Selectați până la trei dintre ele pentru a fi afișate în notificarea compactă, utilizând casetele de selectare din dreapta + Modifică fiecare acțiune de notificare de mai jos, atingând-o. Selectează până la trei dintre ele pentru a fi afișate în notificarea compactă, utilizând casetele de selectare din dreapta. Al cincilea buton de acțiune Al patrulea buton de acțiune Al treilea buton de acțiune @@ -379,7 +371,7 @@ Primul buton de acțiune Tăiați miniatura video afișată în notificare de la raportul de aspect 16:9 la 1:1 (poate introduce distorsiuni) Tăiere miniatură la raportul de aspect 1:1 - Se arată rezultate pentru:%s + Se arată rezultate pentru: %s Nicio aplicație de pe dispozitivul dvs. nu poate deschide acesta Capitole Recente @@ -483,14 +475,14 @@ Nu se poate recupera această descărcare Conexiunea a expirat Progres pierdut, deoarece fișierul a fost șters - Nu a mai rămas spațiu pe dispozitiv + Nu a mai rămas spațiu pe dispozitiv NewPipe a fost închis în timp ce lucra la fișier Post-procesarea a eșuat Nu a fost găsit Serverul nu acceptă descărcări cu mai multe fire, încercați din nou cu @string/msg_threads = 1 Serverul nu trimite date Nu se poate conecta la server - Nu s-a putut găsi server-ul + Nu s-a putut găsi serverul Nu s-a putut stabili o conexiune sigură Folderul de destinație nu poate fi creat Fișierul nu poate fi creat @@ -581,9 +573,9 @@ Nimeni nu ascultă - %s vizionează - %s vizionează - %s vizionează + %s spectator + %s spectatori + %s spectatori Nimeni nu se uită Comutare serviciu, selectat în prezent: @@ -595,7 +587,7 @@ Dezactivați pentru a ascunde casetele de informații meta cu informații suplimentare despre creatorul fluxului, conținutul fluxului sau o cerere de căutare Dezactivați pentru a ascunde descrierea videoclipului și informațiile suplimentare Arată descrierea - Deschideți cu + Deschidere cu Blocați aplicația Rezolvați Evidențiate @@ -609,10 +601,10 @@ Acest conținut este disponibil doar pentru utilizatorii care au plătit, ca atare nu poate fi difuzat sau descărcat de NewPipe. Acest videoclip este disponibil doar pentru membrii YouTube Music Premium, ca atare nu poate fi difuzat sau descărcat de NewPipe. Acest conținut este privat, ca atare nu poate fi difuzat sau descărcat de NewPipe. - Aceasta este o piesă SoundCloud Go+, cel puțin în țara ta, deci nu poate fi difuzată sau descărcată de NewPipe. + Aceasta este o piesă SoundCloud Go+, cel puțin în țara dvs., deci nu poate fi difuzată sau descărcată de NewPipe. Acest conținut nu este disponibil în țara dumneavoastră. Afișați detaliile canalului - Temă Nocturnă + Tema de noapte Următorul pus în coadă Adăugați în coadă pe următorul Marcare ca vizionat @@ -625,21 +617,19 @@ Privat Nelistat Public - URL miniatură Gazdă Sprijin Limbă Limita de vârstă Vizibilitate - Liciență + Licență Etichete Categorie Dezactivați selectarea textului în descriere Activați selectarea textului în descriere - 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. + Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar linkurile 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. @@ -672,9 +662,9 @@ Miniatură de previzualizare în bara de derulare Afișați panglici colorate de Picasso deasupra imaginilor, indicând sursa acestora: roșu pentru rețea, albastru pentru disc și verde pentru memorie Afișați indicatorii de imagine - Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video + Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video. Procesarea.. Poate dura un moment - Verifică dacă există actualizări + Verifică dacă există actualizări Verifică manual dacă există versiuni noi Comentariu lipit Notificare cu raport de eroare @@ -706,7 +696,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 @@ -728,15 +717,126 @@ 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 puse frecvent - Sortează + Întrebări frecvente + 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ă + Nu s-a reușit copierea în clipboard + Dezactivare miniatură permanentă + Listele de redare care colorate în gri conțin deja acest element. + Duplicat adăugat de %d ori + 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 + Eliminați dublurile\? + Afișează următoarele fluxuri + Afișare/Ascundere fluxuri + Vizionat complet + Vizionat parțial + Urmează + Calitatea imaginii + original + Videouri + \? + Abonați + Necunoscut + Ce file sunt afișate pe paginile canalelor + descriptiv + Distribuiți lista URL + Distribuiți cu titluri + %1$s +\n%2$s + Filele canalului + Volum + Utilizați funcționalitatea de rezervă a decodorului din ExoPlayer + Niciunul + Se încarcă metadata… + Schimbați orientarea ecranului + Gestionați unele setări pentru ExoPlayer. Aceste schimbări necesită un restart la player ca să aibă efect + Calitate scăzută + Poziția filelor principale + Schimbați pe ecran complet + Preluați filele canalului + Avatare + Activați această opțiune dacă aveți probleme cu inițializarea decodorului care trece înapoi la decodoare cu prioritate mai scăzută dacă inițializarea decodoarelor principale eșuează. Asta poate duce la performanță de redare mai slabă decât atunci când se utilizează decodoarele principale + Acțiunea gestului din dreapta + %1$s %2$s + Utilizați întotdeauna configurarația suprafeței de ieșire video din ExoPlayer ca soluție alternativă + Transmisia viitoare + Tunelizarea media a fost dezactivată în mod implicit pe dispozitivul dumneavoastră deoarece se cunoaște despre acest model de dispozitiv că nu o suportă. + Avatarele subcanalelor + Această soluție alternativă eliberează și reinstanțează codecurile video când se întamplă o schimbare a suprafeței, în loc de a seta suprafața pentru codec direct. Deja folosită de ExoPlayer pe unele dispozitive cu această problemă, această setare are efect doar pe Android 6 sau mai mare +\n +\nActivarea acestei opțiuni poate preveni erorile de redare când se schimbă playerul video curent sau se trece pe ecran complet + O coloană sonoră ar trebui să fie deja prezentă în această transmisie + Deschideți coada de redare + Selectați coloana sonoră originală indiferent de limbă + Nu încărcați imagini + Calitate înaltă + Despre + Distribuiți playlistul + Avansați + Selectați coloana sonoră pentru playeri externi + Albume + Derulați + Reluați + dublat + File ce vor fi preluate când se actualizează fluxul. Această opțiune nu are niciun efect dacă un canal este actualizat folosind modul rapid. + Selectați o coloană sonoră cu descrieri pentru persoane cu deficiențe vizuale, dacă este disponibilă + Acțiunea gestului din stânga + Distribuiți playlistul cu detalii precum numele playlistului și titlurile videourilor sau ca o simplă listă de URL-uri a videourilor + Calitate medie + Preferați audioul descriptiv + Modificați dimensiunea intervalului de încărcare pentru conținuturi progresive (în prezent %s). O valoare mai mică poate accelera încărcarea lor inițială + Preferați audioul original + Audio: %s + Bannere + Playlisturi + Alegeți un gest pentru jumătatea dreaptă din ecranul playerului + - %1$s: %2$s + Mutați fila principală în partea de jos + Coloană sonoră + Fără transmisii în direct + Alegeți calitatea imaginilor și dacă să se încarce sau nu imaginile, pentru a reduce utilizarea datelor și memoriei. Schimbările șterg cache-ul atât din memoria internă cât și din disc --%s + Redați + Mai multe opțiuni + Miniaturi + Setări pentru ExoPlayer + Luminozitate + Durată + Fără transmisii + Canale + Transmisia anterioară + Alegeți un gest pentru jumătatea stângă din ecranul playerului + În direct + Shorturi + Avatarele autorului + Editează fiecare acțiune de notificare de mai jos atingând-o. Primele trei acțiuni (redare/pauză, anterioară și următoare) sunt setate de sistem și nu pot fi personalizate. + + %s răspuns + %s răspunsuri + %s răspunsuri + + Arată mai multe + Arată mai puține + Piste + Nu este suficient spațiu liber pe dispozitiv + Backup și restabilire + NewPipe poate verifica automat pentru versiuni noi din când în când și vă poate notifica când acestea sunt disponibile. +\nDoriți să activați acest lucru? + Resetează toate setările la valorile inițiale + Da + Nu + Resetează setări + Resetarea tuturor setărilor va elimina toate setările tale preferate și va reporni aplicația. +\n +\nSigur doriți să continuați? + Setările din exportul importat folosesc un format vulnerabil care a fost depreciat de la NewPipe 0.27.0. Asigurați-vă că exportul care este importat este dintr-o sursă de încredere și preferați să utilizați numai exporturi obținute din NewPipe 0.27.0 sau mai nou în viitor. Suportul pentru importul setărilor în acest format vulnerabil va fi în curând eliminat complet, iar versiunile vechi ale NewPipe nu vor mai putea importa setările exporturilor din versiunile noi. \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 159b27a2a41..aeb4ccce0af 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -9,7 +9,7 @@ Скачать Поиск Настройки - Возможно, вы имели в виду \"%1$s\"\? + Возможно, вы имели в виду «%1$s»? Поделиться Папка для скачанного видео Папка для скачанного видео @@ -17,7 +17,7 @@ Разрешение по умолчанию Воспроизвести в Kodi Приложение Kore не найдено, установить\? - \"Воспроизвести в Kodi\" + Показать опцию «Воспроизвести в Kodi» Показать опцию воспроизведения через медиацентр Kodi Аудио Формат аудио по умолчанию @@ -33,13 +33,13 @@ Понравилось Внешний видеоплеер Внешний аудиоплеер - Фоновое воспроизведение + Воспроизведение в фоновом режиме Тема Тёмная Светлая Ошибка сети Папка для скачанного аудио - Папка для скачанного аудио + Загруженные аудиофайлы хранятся здесь Введите путь к папке для скачивания аудио Нажмите на лупу, чтобы начать. Подождите… @@ -68,7 +68,7 @@ Не удалось создать меню загрузки Приложение/UI завершило работу Никогда такого не было, и вот опять. - Отправить по e-mail + Отправить по почте Извините, что-то пошло не так. Отчёт Информация: @@ -78,7 +78,6 @@ Аудио Повтор Не удалось загрузить все миниатюры - Не удалось расшифровать подпись URL у видео В фоне В окне Только некоторые устройства поддерживают видео в 2K/4K @@ -190,8 +189,8 @@ Удалить Вы подписаны Подписка отменена - \"Зажмите, чтобы добавить\" - Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео + Показать подсказку «Зажмите, чтобы добавить» + Показать подсказку при нажатии «В окне» или «В фоне» на странице сведений о видео [Неизвестно] Восстановление после ошибки плеера Зажмите, чтобы добавить в очередь @@ -283,23 +282,21 @@ \n \n1. Перейдите по ссылке: %1$s \n2. Авторизуйтесь, если потребуется -\n3. Отметьте пункт \"YouTube и YouTube Music\", затем выберите тип \"подписки\" -\n4. Нажмите \"Далее\" и \"Создать экспорт\" -\n5. Нажмите кнопку \"Скачать\", когда она появится +\n3. Отметьте пункт «YouTube и YouTube Music», затем выберите тип «подписки» +\n4. Нажмите «Далее» и «Создать экспорт» +\n5. Нажмите кнопку «Скачать», когда она появится \n6. Нажмите ИМПОРТ ФАЙЛА внизу и выберите скачанный ZIP-архив -\n7. [Если импортировать ZIP-файл не удалось] Из скачанного ZIP-архива распакуйте CSV-файл (обычно это \"YouTube и YouTube Music/подписки/подписки.csv\"), нажмите ИМПОРТ ФАЙЛА и выберите этот CSV-файл - Импортируйте профиль SoundCloud, введя его URL или ID: -\n -\n1. Включите режим \"Полная версия сайта\" в браузере. +\n7. [Если импортировать ZIP-файл не удалось] Из скачанного ZIP-архива распакуйте CSV-файл (обычно это «YouTube и YouTube Music/подписки/подписки.csv»), нажмите ИМПОРТ ФАЙЛА и выберите этот CSV-файл + Импортируйте профиль SoundCloud, введя его URL или ID: +\n +\n1. Включите «Версия для ПК» в браузере (сайт не поддерживается мобильными устройствами) \n2. Перейдите по ссылке %1$s -\n3. Выполните вход. +\n3. Авторизуйтесь, если потребуется \n4. Скопируйте URL профиля из адресной строки. вашID, soundcloud.com/вашID Это действие может вызвать большой расход трафика. \n \nПродолжить? - Загружать миниатюры - Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен @@ -311,7 +308,6 @@ При открытии ссылки на контент — %s Нет потоков для загрузки Субтитры - Приложение для воспроизведения этого файла не установлено Изменить размер текста и стиль субтитров. Нужен перезапуск Очистить историю Удалить всю историю просмотров\? @@ -326,7 +322,7 @@ При открытии ссылки Хотите импортировать настройки? Конфиденциальность - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия. \nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. @@ -345,14 +341,12 @@ При сворачивании плеера При переключении со встроенного плеера на другое приложение — %s Ничего не делать - Фоновый плеер - Плеер в окне + Свернуть в фоновый плеер + Свернуть в плеер в окне Вид списка Список Сетка Автоматически - Менять яркость плеера жестом - Жест яркости Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? SD-карта недоступна Вкладки, видимые на главной странице @@ -362,8 +356,6 @@ Количество подписчиков недоступно Выберите вкладку Отписаться - Менять громкость плеера жестом - Жест громкости Обновления Файл удалён Уведомление об обновлении приложения @@ -413,7 +405,7 @@ не удаётся перезаписать файл В очереди уже есть загрузка с таким именем NewPipe была закрыта во время работы над файлом - Закончилось свободное место на устройстве + Закончилось свободное место на устройстве Прогресс потерян, так как файл был удалён Действительно удалить историю загрузок и загруженные файлы\? Ограничить очередь загрузки @@ -424,7 +416,7 @@ Для каждой загрузки запрашивать папку для сохранения. \nВключите системный выбор папки (SAF), если хотите загружать на внешнюю SD-карту Системный выбор папки (SAF) - \"Storage Access Framework\" позволяет сохранять файлы на внешнюю SD-карту + «Storage Access Framework» позволяет сохранять файлы на внешнюю SD-карту Очистить позиции воспроизведения Удалить все позиции воспроизведения Удалить все позиции воспроизведения\? @@ -464,8 +456,8 @@ Разрешите отображение поверх приложений Язык интерфейса Как в системе - По завершении нажмите Готово - Готово + По завершении нажмите «Готово» + Готово Видео %d секунда @@ -527,7 +519,7 @@ Период актуальности подписок после обновления — %s Это видео имеет возрастное ограничение. \n -\nВключите \"%1$s\" в настройках, если хотите его видеть. +\nВключите «%1$s» в настройках, если хотите его видеть. NewPipe не поддерживает этот контент. \n \nВозможно, поддержка появится в следующих версиях. @@ -543,7 +535,7 @@ Удалить просмотренные видео\? Отображать сообщённое сервисом время с момента публикации Исходное время публикации - \"Безопасный режим\" YouTube + Включить «Безопасный режим» YouTube От %s Создано %s Миниатюра значка канала @@ -570,7 +562,7 @@ Перемешать Повтор В компактном уведомлении доступно не более трёх действий! - Действия можно изменить, нажав на них. Отметьте не более трёх для отображения в компактном уведомлении + Отредактируйте каждое действие уведомления ниже, нажав на него. Выберите до трёх из них, которые будут отображаться в компактном уведомлении, используя флажки справа. Пятое действие Четвёртое действие Третье действие @@ -582,7 +574,7 @@ Куки reCAPTCHA удалены Удалить куки reCAPTCHA Показывать контент, который, возможно, не подходит для детей, так как имеет возрастное ограничение (например, 18+) - YouTube предоставляет \"Безопасный режим\", скрывая потенциально взрослый контент + YouTube предоставляет «Безопасный режим», скрывая потенциально взрослый контент Добавлено в очередь Добавить в очередь Удалить сохранённые при решении reCAPTCHA куки @@ -621,7 +613,7 @@ Популярное Решить Подробно о канале - Отключите туннелирование медиа, если видите чёрный экран или видео воспроизводится рывками + Отключите туннелирование медиа, если видите чёрный экран или видео воспроизводится рывками. Отключить туннелирование медиа Теперь вы можете выделить текст внутри описания. В режиме выделения страница может мерцать, ссылки могут быть неактивны. Поддержка @@ -636,7 +628,6 @@ Приватная Не в списке Публичная - URL миниатюры Сервер Доступность В быстром режиме обновления подробности об этом не предоставляются. @@ -648,20 +639,19 @@ Открыть веб-сайт %s указывает следующую причину: Аккаунт отключён - Начиная с Android 10 поддерживается только \"Storage Access Framework\" + Начиная с Android 10 поддерживается только «Storage Access Framework» Спрашивать, куда сохранять каждую загрузку Папка для загрузки ещё не выбрана, укажите папку для загрузки сейчас Отключить Включить Режим планшета - Показать проигранные Комментарии отключены Не показывать Низкое качество (меньше) Высокое качество (крупнее) Миниатюра над полосой прокрутки Автору видео понравилось это - Пометить просмотренными + Пометить проигранным Picasso: указать цветом источник изображений (красный — сеть, синий — диск, зелёный — память) Цветные метки на изображениях Серверные предложения поиска @@ -685,22 +675,22 @@ Добавить следующим Обработка… Подождите немного Проверить обновления вручную - Проверить обновления + Проверить обновления Проверка обновлений… Новое на канале Уведомления Новые видео Уведомления о новых видео в подписках Частота проверки - Уведомлять о новых видео - Получать уведомления о новых видео из каналов, на которые Вы подписаны + Уведомления о новых видео + Уведомлять о новых видео в подписках Тип подключения Любая сеть Уведомления отключены Уведомлять Вы подписались на канал Переключить все - Показать \"Вызвать сбой плеера\" + Показать «Сбой плеера» Показать функцию вызова сбоя при работе плеера Вызвать сбой плеера Уведомление отчёта об ошибке @@ -716,11 +706,10 @@ Закреплённый комментарий LeakCanary недоступна Стандартное значение ExoPlayer - Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера Загрузка сведений о трансляции… Проверить наличие новых трансляций Удалить все загруженные файлы\? - Уведомления плеера + Уведомление плеера , Полутон Проценты @@ -732,15 +721,127 @@ Выберите качество для внешних плееров Неизвестное качество Размер предварительной загрузки - Показывать будущие элементы - Скрыть проигранные - Скрывать будущие видео Ответы на частые вопросы - Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространенные вопросы! + Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! Посмотреть на веб-сайте Сортировка У вас последняя версия Быстрый режим Импорт и экспорт подписок в меню с 3-мя точками Нажмите для загрузки %s + Карта + Не удалось скопировать в буфер обмена + Доступно, когда Тема установлена в %s + Убрать постоянную миниатюру + Дубликат добавлен %d раз(а) + Плейлисты, выделенные серым, уже содержат этот объект. + Игнорировать события аппаратных кнопок + Полезно при использовании гарнитуры со сломанными кнопками + Показать следующие стримы + Показать/скрыть стримы + Полностью просмотрено + Предстоящие + Удалить дубликаты + Удалить дубликаты\? + Частично просмотрено + Удалить все дубликаты потоков в этом плейлисте\? + Жест для левой стороны экрана плеера + Действие жеста слева + Жест для правой стороны экрана плеера + Действие жеста справа + Яркость + Громкость + Ничего + Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера + Отдать предпочтение описательному звуку + Аудио: %s + Звуковая дорожка + Неизвестная + Настройки ExoPlayer + Управление некоторыми настройками ExoPlayer. Эти изменения требуют перезапуска плеера, чтобы они вступили в силу + Использовать резервную функцию декодера ExoPlayer + Всегда использовать обходной путь настройки поверхности видеовыхода ExoPlayer + %1$s %2$s + оригинальный + дублированный + описательный + Отдать предпочтение оригинальному звуку + Выбирать исходную звуковую дорожку независимо от языка + Выбирать звуковую дорожку с описаниями для слабовидящих, если они доступны + Звуковая дорожка уже должна присутствовать в этом потоке + Выберите звуковую дорожку для внешних проигрывателей + Включите этот параметр, если у вас есть проблемы с инициализацией декодера, который возвращается к декодерам с более низким приоритетом в случае сбоя инициализации основных декодеров. Это может привести к ухудшению качества воспроизведения по сравнению с использованием первичных декодеров + Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше +\n +\nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим + Переместить основные вкладки в нижнюю часть экрана + Положение основных вкладок + Нет стримов + Нет прямых трансляций + Медиа-туннелирование на вашем устройстве отключено по умолчанию, поскольку известно, что ваша модель устройства его не поддерживает. + Качество изображения + Видео + \? + Подписчики + Какие вкладки отображаются на страницах каналов + Поделиться списком URL-адресов + Поделиться названиями + %1$s +\n%2$s + Вкладки канала + Shorts + Загрузка метаданных… + Изменить ориентацию экрана + Низкое качество + Переключить полноэкранный режим + Получение вкладок канала + Аватары + Следующий стрим + Аватары подканалов + Открыть очередь воспроизведения + Не загружать изображения + Высокое качество + О канале + Поделиться подборкой + Перемотать вперёд + Альбомы + Перемотать назад + Повторить + Получаемые вкладки при обновлении ленты. Эта функция не применяется, если канал обновляется с помощью быстрого режима. + Поделиться подборкой с подробностями, такими как название подборки и названия видео, или просто списком URL видео + Среднее качество + Загрузчик аватаров + Баннеры + Подборки + - %1$s: %2$s + Выберите качество изображений и загружать ли изображения вообще, чтобы снизить использование данных и памяти. Изменения очищают кэш изображений как в памяти, так и на диске – %s + Воспроизвести + Другие опции + Миниатюры + Треки + Продолжительность + Каналы + Предыдущий стрим + Стримы + Показать больше + Показать меньше + + %s ответ + %s ответа + %s ответов + %s ответов + + Отредактируйте каждое действие уведомления ниже, нажав на него. Первые три действия (воспроизведение/пауза, предыдущее и следующее) задаются системой и не подлежат настройке. + Недостаточно свободного места на устройстве + Сбросить все настройки на их значения по умолчанию + Да + Нет + Резервное копирование и восстановление + Сбросить настройки + NewPipe может автоматически проверять наличие обновлений и уведомить вас, когда они будут доступны. +\nЖелаете включить эту функцию? + Сброс всех настроек приведёт к сбросу всех ваших настроек и перезапуску приложения. +\n +\nВы уверены, что хотите продолжить? + Настройки в импортируемом экспорте используют уязвимый формат, который устарел с версии NewPipe 0.27.0. Убедитесь, что импортируемый экспорт получен из надёжного источника, и в будущем предпочтительнее использовать только экспорт, полученный из NewPipe 0.27.0 или новее. Поддержка импорта настроек в этом уязвимом формате скоро будет полностью удалена, и тогда старые версии NewPipe больше не смогут импортировать настройки из экспорта из новых версий. \ 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..c35dd59c6a4 --- /dev/null +++ b/app/src/main/res/values-ryu/strings.xml @@ -0,0 +1,828 @@ + + + %1$sんかいかんかい + ちゃーしがプレイヤーぬみちかやびらん。VLCインストールさびーが? + インストール + キャンセル + ブラウザっしふぃらちゅん + ちゅーゆーいん + ダウンロード + きんさく + しってい + むしかしてぃ: 「%1$s」\? + ちゅーゆーいん + ちゃーしがふずんするフォルダー + ダウンロードさどぅうがくまんかいふずんさびーん + ちゃーしがファイルダウンロードするフォルダーさんたくちくぃみそーれー + デフォルトふぃんがしち + Kodiっしさいせい + インストールさりてぃうぅらんKoreアプリインストールさびーが? + 「Kodiっしさいせい」オプションひょうじ + Kodiメディアセンターけいゆでいちゃーがさうぅいゆいするたみぬしっていひょうじさびーん + うんせい + デフォルトぬうんせいけいしき + ダウンロード + 「ちぎぬちゃーしが」とぅ「かんりんちゃーしが」ひょうじ + たいおうしうぅらん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ふんぬちゃーしが + %sふんぬちゃーしが + + デフォルトぬKiosk + たーんんーじゃびらん + + %sんかいんがしちょうちゅう + %sんかいんがしちょうちゅう + + たーんちちゃびらん + + %sんかいんがちょうしゅちゅう + %sんかいんがちょうしゅちゅう + + アプリさいきちゃーしーねー、ぎんぐがへいるかんさりやびーん + こうすくはやうくい/まきむどぅしかんかく + PeerTubeインスタンス + PeerTubeインスタンスさんたくすん + うんじゅんかいさちちーやーインスタンスかめーいん:%s + インスタンスちちが + インスタンスぬURLんかいゅうりょく + インスタンスきんしょうするくとぅがなやびらんたん + HTTPSぬURLぬみんかいたいおうそーいびーん + インスタンスーしでぃにすんじぇーそーいびーん + ローカル + さいきんちいからさったん + かんひょうが + しーゅうふくちゅう + ダウンロードぬしーゅうふくなやびらん + インスタンスしんたく + ダウンロードりりきしーょうきょ + ダウンロードさるファイルしーょうきょ + じちゃーせいせい(アップローダーぬみちかやびらん) + ふかぬアプリぬういにふぃいょうじしーんきんぎんをあてーてぃください + アプリぬぎんぐ + システムぬっちうぅい + とぅきーねー「かんりょう」うちくぃみそーれー + かんりょう + ちゃーしが + + %dびょう + %dびょう + + ExoPlayerぬゆいてぃがろーくぬたみシークかんかこー%dびょうんかいしっていさりやびたん + ミュート + ミュートかいじょ + + %dふん + %dふん + + + %dじがん + %dじがん + + + %dんかいち + %dんかいち + + チャンネルグループ + フィードぬさいしゅうこうしん:%s + ゆみくみしっぺー:%d + フィードゆみくみちゅう… + フィードしーょりちゅう… + チャンネルしんたく + チャンネルがせんたくされていません + + %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 + かいきち + やっくゎんテーマ + ダウンロードかいしさびたん + チャンネルぬしーょうさいひょうじ + ラジオ + うすすみ + ビデオさいゆいがとぅまたいでぃねーんばあえーメディアトンネリングんーかがしみそーれー。 + マルチメディアトンネリングんーかなすん + かんかい + ぎんてぃかんかい + ふぃかんかい + やーいぶ + カテゴリ + タグ + ライセンス + プライバシー + されいせいぎん + ぎんぐ + サポート + ホスト + ウェブサイトふぃらちゅん + ダウンロードぬかーじにふずんすーしょたんにやびーん + ダウンロードフォルダーぬなーらしっていさりやびらん。なまちゃーきデフォルトぬフォルダーさんたくちくぃみそーれー + Android10いこおー \'Storage Access Framework\' ぬみやしがサポートさりやびーん + こうすくモードっしくぬじょうほうぬしーょうさいーていきょうさりやびらん。 + \'%s\' ぬフィードゆみくみやびらんたん。 + フィードぬゆみくみエラー + しちめいぶんぬテキストぬしんたくんーかなすん + しちめいぶんぬテキストぬしんたくゆうこうなすん + なましちめいぶんぬテキストさんたくなやびーん。しんたくモードちゅおーページぬちらちちゃいリンクぬクリックならんなたいしーんくとぅんかいちゅういしみそーれー。 + ていしさったるアカウント + くぬとうこうしゃぬアカウントーていしさりとーいびーん。 +\nNewPipeーしーょうらいてぃきにくぬフィードゆみくみらんなやびーん。 +\nくぬチャンネルぬとぅうるいちゅんこーいじょさびーが? + オフ + オン + タブレットモード + %sやしがくぬりゆうていじ: + ひょうじさん + ていふぃんしち(しょう) + かんふぃんしち(だい) + シークバーぬサムネイルプレビュー + コメントーんーかなとーいびーん + しちょうじみとぅしてぃマーク + リモートきんさくかんふ + ローカルきんさくかんふ + アイテムスワイプしさちゅるじょ + ちょくしちフルスクリーンモードんかいきりけーてぃ、ミニプレイヤーっしちゃーがかいしさびらん。じどーでぃんうぅてぃんがロックさりとーーあいやてぃん、フルスクリーンしーゅうりょうするくとぅでぃミニプレイヤーんかいアクセスなやびーん + プレイヤーフルスクリーンっしかいし + + %1$sちぬダウンロードさちゅるじょさびたん + %1$sちぬダウンロードさちゅるじょさびたん + + + %sちぬダウンロードぬかんりょうさびたん + %sちぬダウンロードぬかんりょうさびたん + + ピカソー、がぞうぬういに、がぞうくとぅどぅくるしーきびちするしきさいきしーょうひょうじさびーん: あかーネットワーク、あおーディスク、みどぅれーメモリ + やしがぞうんかいふぃいょうしきひょうじ + しーょりちゅう… くーてーんじがんがかかいんかむしりやびらん + みーさるバージョンしーゅどうでぃかくにんさびーん + アップデートかくにんちゅう… + アップデートかくにん + ちぎキューんかいちちが + ちぎキューんかいちいからさびたん + クリエイターぬちむくみてぃ + \"プレイヤーぬクラッシュ\"ひょうじ + プレイヤーぬクラッシュ + みーさるフィードアイテム + エラーほうくーくちうち + エラーぬはっせいさびたん。ちうちんーちくぃみそーれー + エラーぬはっせいさびたん(タップしーねーほうくーくなやびーん) + スナックバーんかいエラーひょうじ + くていさったるコメント + くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん。 +\nStorage Access Frameworkとぅぐかんゆいぬあんファイルマネージャインストールしみそーれー + くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん +\nファイルマネージャインストールすが、ダウンロードしっていっし \'%s\' んーかなするくとぅうたみしくぃみそーれー + プレイヤーしようじんかいクラッシュオプションひょうじ + エラーちうちさくせい + エラーほうくーくすんちうち + LeakCanaryがりようふかのうやいびーん + プレイヤーちうち + ストリームぬしょうさいゆみくどーいびーん… + とうるいちゅるチャンネルぬみーさるストリームんかいちいていちうちすん + , + ちうちぇーんーかなやーさりとーいびーん + ExoPlayerぬデフォルト + ちうちうきとぅいん + くぬチャンネルかんどぅくさびたん + ディスクからダウンロードさるまじりぬファイルさちゅるじょさびーが? + まじりてーんがい + かくにんすんふぃんどぅ + みーさるストリームぬチェックじっこう + かんどぅちゅるチャンネルぬみーさるストリームんかいかんすんちうち + みーさるストリームぬちうち + + %sきんぬみーさるストリーム + %sきんぬみーさるストリーム + + みーさるストリーム + ちうち + ぎんじぇーさいせいちょーるストリームぬちうちこうせい + ふぃちぐとーるネットワークぬしーゅるい + パーセント + はんうん + まじりぬネットワーク + データぬゆみくみかんかく + みちぬけいしき + みちぬふぃんしち + ダウンローダーにゆってぃサポートさりてぃうぅらんちゃーがーひょうじさりやびらん + しんたくさったんちゃーがーがいぶプレイヤーんかいゆってぃサポートさりやびらん + やしがいぶプレイヤーっしりようがのうのーいるゆいストリームぬあいびらん + やしがいぶプレイヤーっしりりようがのうやーちゃーがストリームぬあいびらん + やしがいぶプレイヤーっしぬふぃんしちしんたく + ならびがい + ウェブサイトひょうじ + タップし%sダウンロード + うんじょーNewPipeぬさいしんばんきどうそーいびーん + ゆーあしちまん + アアプリぬちかいかたんかいくまたるとぅちぇー、ゆーあんさちむぬんかいくてーとーいびーくとぅ、じふぃんーちくぃみそーれー! + %sぬテーマなさんたくさったーあいぬみ、くぬしんたくしがりようかのうやいびーん + こうすくモード + 3てぃんメニューからんでぃうるいちゅるチャンネルぬゆみくみあらんでぃかきだしがかのう + カード + クリップボードんかいぬコピーんかいしっぺーさびたん + はいーらでぃひょうじさっとーるプレイリストんかえー、しでぃにくぬアイテムぬくくまっとーいびーん。 + %dかいじゅうふくちいかさりやびたん + くていサムネイルぬしっていこーいじょ + じゅうふくさくじょさびーが? + たとぅいねー、ぶちりボタンぬやんでぃたるヘッドセットしーようそーーあいにびんりやいびーん + くぬさいせいリストねーんぬじゅうふくさるストリームまじりさくじょさびーが? + ハードウェアメディアボタンイベントむしすん + じゅうふくさちゅるじょ + ちぎぬストリームひょうじ + ストリームぬひょうじ/ふぃふぃょうじ + かんじぬんかいしちょうじみ + いちぶしはべるじみ + くんぐ + さいせいがみんぬふぃだりはんぶんぐとぅジェスチャーしんたく + ふぃだりぬジェスチャーちゃーさ + さいせいがみんぬみぎはんぶんようぬジェスチャーしんたく + みぎぬジェスチャーちゃーさ + あかるさ + うんりょう + + オリジナルうんゆいゆーいんしんすん + ぎんぐんかいかんきうぅらなくオリジナルぬオーディオトラックさんたくすん + うんせいかいしちゆーいんしんすん + メインタブセレクタさるにいちゃー + メインタブぬばしょ + ゆみくみかんかくへいるかんさびーん。(ぎんじぇー %s)くぬあたいくーくしーねーさいせいかいしまでぃぬじがんがいんちゃくなやびーん。へんかんてぃきようすんがーさいきちゃーがふぃちようやいびーん + りようかのうなばあいんかいしかくしょうがいしゃむきのおんせいかいしちトラックさんたくすん + オーディオ:%s + オーディオトラック + やしがいぶプレイヤーようぬオーディオトラックしんたく + ふめいうぅい + ExoPlayer しってい + オーディオトラックーしでぃにくぬししらぎんかいすんじぇーそーるふぃちようがあいびーん + うちかいぬデバイスぬモデルっしぇーメディアトンネリングぬサポートさりてぃうぅらんたみ、くぬデバイスっしぇーメディアトンネリングぬデフォルトっしんーかなとーいびーん。 + デコーダぬしーむんだいぬあーあえー、くぬオプションゆーいるこうかしプライマリデコーダしーょきかしっぺーじにふぃくいゆうしんどぅぬデコーダんかいフォールバックさびーん。プライマリデコーダしようじやかパフォーマンスぬあっかすがのうゆいがあいびーん + くぬかいきちさこーちょくしちコーデックサーフェスんかいしっていしーんかわりんかい、サーフェスぬへいるかんさったるさいんかいえいぞうコーデックかいほうしさいインスタンスがさびーん。しでぃにいくちがぬデバイスっしくぬかいきちさくぬささりとーいびーしが、Android 6いくてぃぬみちぬーさびーん +\n +\nくぬオプションゆーいるこうかしーんくとぅっしプレイヤーきりけーたい、フルスクリーンんかいきりけーたいしーんさいぬさいせいエラーふしじゃびーん + ふきけー + ExoPlayerぬしっていかんりさびーん。くりらぬへんかんはんえいすんがープレイヤーぬさいきちゃーがふぃちようやいびーん + ちゃーExoPlayerぬえいぞうしーゅちりょくサーフェスしっていぬかいきちさくしようすん + %1$s %2$s + うんせいかいしち + ExoPlayerぬデコーダフォールバックちぬーさすん + オリジナル + ストリームーあいびらん + ライブーいしのーあいびらん + ちゃーしが + とうるくさゃ + チャンネルページんかいひょうじさりーんタブ + チャンネルタブ + ショート + メタじょうほうゆみくどーいびーん… + チャンネルタブしーゅとぅくしーん + しょうさい + アルバム + フィードこうしんすんとぅちなしゅとぅくしーんタブ。 こうすくモードさしてぃチャンネルこうしんすーあえー、かんがぬあいびらん。 + プレイリスト + トラック + チャンネル + ライブ + やしがみんぬむききりかいーん + フルスクリーンんかいきりかいーん + ちぎぬストリーム + さいせいキューふぃらちゅん + フォワード + まきんどぅし + リプレイ + さいせい + うぬふかぬオプション + ちかん + めーぬストリーム + ふぃんしち + + ていふぃんしち + アバター + サブチャンネルぬアバター + やしがぞうゆみくまん + かんふぃんしち + ちゅうふぃんしち + アップローダーぬアバター + バナー + やしがぞうぬふぃんしちとぅぬぞうゆみくむがちゃーがさんたくち、データとぅメモリぬしようりょうさくぎんさびーん。 へんかんにゆり、メモリねーんとぅディスクじょうぬがぞうキャッシュぬりょうほうがクリアさりやびーん — %s + サムネイル + URLリストっしちゅーゆーいん + タイトルちきっしちゅーゆーいん + %1$s +\n%2$s + プレイリストちゅーゆーいん + プレイリストめいてぃがろービデオタイトルんでーぬしょうさいくくむるプレイリスト、あらんでぃビデオURLぬみぬシンプルやるリストとぅしてぃプレイリストちゅーゆーいんさびーん + - %1$s: %2$s + + %sぬへんしん + %sぬへんしん + + なーふぃんんーじゅん + ひょうじいきらくすん + いかぬちうちアクションタップしへんしゅうさびーん。さいしょぬみーちぬアクション (さいせい/いちじていし、めーんかい、ちぎんかい)ーシステムにゆってぃしっていさりてぃうぅい、カスタマイズすしぇーなやびらん。 + はい + NewPipeーてぃんじちーがみーさるバージョンじちゃーてぃきんかいチェックしー、こうしんがのうないるとぅちうちさびーん。 +\nゆうこうなさびーが? + デバイスぬあきゆういょうがふすくそーいびーん + うぅーうぅー + バックアップとぅふくぎん + しっていリセット + まじりぬしっていデフォルトじょうたいんかいリセットさびーん + まじりぬしっていリセットしーねー、ゆーいるしんしっていぬまじりはちされい、アプリぬさいきちゃーさびーん。 +\n +\nずっこうさびーが? + インポートさりとーるエクスポートぬしってえー、NewPipe 0.27.0いこおーふぃするいしょうでぃあったけいしきしーようさびーん。 インポートさりとーるエクスポートーしんらいないるじょうほうぎんからでぃあり、しょうらいていちがーNewPipe 0.27.0がくりやかみーさるバージョンからいらりーるエクスポートぬみゆーいるしんししようさびーん。 くぬぜいじゃくやるけいしきっししっていインポートするたみぬたいおおーちゃーきかんじんにさくじょされい、みーさるバージョンからエクスポートぬしっていインポートすしぇーなやびらん。 + \ No newline at end of file diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 836ab01c3f9..a5959086e46 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -59,7 +59,7 @@ ᱛᱮᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ ᱫᱚᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ ᱢᱟᱲᱟᱝ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ - ᱛᱷᱟᱹᱢᱵᱽᱱᱮᱞ ᱫᱚ ᱑:᱑ ᱮᱥᱯᱮᱠᱼᱴ ᱨᱮᱥᱤᱭᱚ ᱨᱮ ᱢᱟᱯ ᱢᱮ + ᱛᱷᱟᱹᱢᱵᱽᱱᱮᱞ ᱫᱚ ᱑:᱑ ᱮᱥᱯᱮᱠᱼᱴ ᱨᱮᱥᱤᱭᱚ ᱨᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ ᱴᱷᱤᱠ ᱥᱟᱰᱮ ᱧᱮᱞ ᱠᱟᱱ ᱞᱮᱠᱷᱟ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ @@ -69,4 +69,689 @@ ᱧᱩᱛ ᱧᱩᱛ ᱛᱷᱤᱢ ᱦᱮᱱᱫᱮ + ᱪᱮᱛᱟᱱ ᱥᱤᱠᱷᱱᱟᱹᱛ (ᱢᱟᱨᱟᱝ) + %1$s %2$s + ᱵᱚᱫᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱯᱟᱭ ᱨᱩᱣᱟᱹ + ᱦᱟᱹᱴᱤᱧ ᱪᱷᱟᱯᱟ ᱟᱠᱟᱱᱟ + ᱢᱤᱰᱤᱭᱟ ᱴᱚᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱟᱢ ᱚᱵᱚᱫᱷᱤ + ᱰᱤᱯᱷᱚᱞᱴ ᱥᱟᱰᱮ ᱯᱷᱚᱨᱢᱮᱴ + ᱧᱮᱞ ᱱᱟᱜᱟᱢ + ᱠᱷᱤᱞᱚᱱᱰ ᱮᱦᱚᱵ ᱢᱮ + ᱴᱨᱮᱠ + ᱤᱢᱯᱳᱨᱴ ᱰᱮᱴᱟᱵᱮᱥ + ᱪᱷᱟᱸᱪ + ᱟᱢᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ, ᱰᱤᱡᱟᱭᱤᱱ ᱵᱮᱵᱚᱥᱛᱟ, ᱠᱳᱰ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ, ᱟᱨᱵᱟᱝ ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝ ᱠᱳᱰ ᱵᱮᱵᱚᱥᱛᱟ ᱨᱮᱱᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ ᱢᱮᱱᱟᱜᱼᱟ ⁇ ᱜᱚᱲᱚ ᱫᱚ ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱨᱮᱜᱮ ᱥᱟᱨᱦᱟᱣ ᱢᱮᱱᱟᱜᱼᱟ ᱾ ᱰᱤᱜᱟᱱ ᱠᱟᱹᱢᱤ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱚᱱᱟ ᱜᱮ ᱱᱟᱯᱟᱭᱚᱜ-ᱟ ᱾ + GitHub ᱨᱮ ᱧᱮᱞ ᱢᱮ + ᱡᱟᱹᱥᱛᱤ ᱞᱟᱭᱠᱟᱨ + ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞᱤᱯ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱰᱤᱥᱠ ᱠᱷᱚᱱ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱨᱮᱰᱤᱭᱳ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ + ᱜᱽᱨᱤᱰ + ᱥᱴᱚᱯ + ᱰᱟᱩᱱᱞᱚᱰ ᱞᱤᱢᱤᱴᱮᱰ ᱠᱩᱣᱮ + ᱢᱩᱬᱩᱛ ᱴᱮᱵᱽ ᱵᱟᱪᱷᱟᱣᱤᱭᱟᱹ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮ ᱞᱟᱜᱟᱜ ᱢᱮ + ᱵᱞᱮᱠ ᱥᱟᱦᱴᱟ + ᱠᱟᱨᱰ + ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ + ᱵᱟᱦᱨᱮ ᱮᱱᱮᱡᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱟᱠᱟᱱ ᱯᱷᱚᱨᱢᱮᱴ + ᱵᱟᱹᱱᱩᱜᱼᱟ ᱫᱟᱜ + ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ +\nᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱮᱛᱦᱚᱵ ᱢᱮ + ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱟᱣ ᱟᱠᱟᱱᱟ \"Done\" ᱚᱞ ᱢᱮ + ᱨᱩᱣᱟ. + ᱠᱤᱭᱳᱥᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱱᱟᱣᱟ ᱟᱨ ᱦᱮᱴ + ᱱᱟᱦᱟᱜ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟ + ᱪᱟᱱᱮᱞ ᱵᱟᱰᱟᱭ ᱧᱮᱞ ᱢᱮ + ᱤᱱᱠᱭᱩᱤᱝ + ᱮᱱᱠᱭᱩᱣᱮᱰ + ᱚᱛᱱᱚ ᱨᱮ ᱥᱮᱞᱮᱫ ᱮᱛᱚᱦᱚᱵ ᱢᱮ + ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱯᱮᱨᱮᱡ ᱢᱮ + ᱤᱱᱯᱷᱳ ᱧᱟᱢ… + ᱞᱟᱹᱠᱛᱤ ᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱞᱚᱰ ᱮᱱᱟ + ᱧᱩᱛᱩᱢ + ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ + ᱠᱟᱹᱢᱤᱦᱚᱨᱟ... ᱚᱠᱛᱚ ᱫᱷᱟᱹᱵᱤᱡ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱠᱨᱟᱥ ᱴᱷᱮᱱ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ + ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱨᱮ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱫᱚ ᱰᱤᱯᱚᱞᱴ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ ᱪᱮᱫᱟᱜ ᱥᱮ ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱢᱚᱰᱮᱞ ᱱᱚᱶᱟ ᱵᱟᱭ ᱥᱚᱦᱚᱫᱟ ᱾ + ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱢᱤᱫ error ᱥᱱᱮᱠᱵᱟᱨ ᱧᱮᱞ ᱢᱮ + URL ᱥᱮ ᱟᱢᱟᱜ ID ᱚᱞ ᱠᱟᱛᱮᱜ ᱢᱤᱫ SoundCloud ᱯᱨᱚᱯᱷᱟᱭᱤᱞ ᱮᱢ ᱢᱮ:_x000D_ +\n_x000D_ +\n1. ᱢᱤᱫ ᱣᱮᱵᱽ-ᱵᱽᱨᱟᱣᱡᱚᱨ ᱨᱮ \"ᱰᱮᱥᱠᱴᱚᱯ ᱢᱳᱰ\" ᱮᱱᱮᱡ ᱢᱮ (ᱡᱚᱵᱮᱛᱟᱨᱮ ᱢᱚᱵᱟᱭᱤᱞ ᱰᱤᱵᱟᱤᱥ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ)_x000D_ +\n2. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s_x000D_ +\n3. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ +\n4. ᱟᱢ ᱚᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱞᱮᱱᱟᱢ ᱚᱱᱟ ᱯᱨᱚᱯᱷᱟᱭᱤᱞ URL ᱠᱚᱯᱤ ᱢᱮ. + ᱯᱞᱮᱵᱮᱠ ᱥᱯᱤᱰ ᱠᱚᱱᱴᱨᱚᱞ + ᱴᱮᱢᱯᱳ + ᱵᱚᱫᱚᱞ ᱢᱮ (ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) + ᱥᱤᱛᱩᱝ ᱚᱠᱛᱚ ᱨᱮ ᱯᱷᱮᱥᱯᱷᱚᱨᱰ ᱢᱮ + ᱯᱨᱚ᱐ᱤᱥᱚᱫ + ᱮᱠᱥᱮᱯᱴ + ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ + ᱪᱟᱪᱞᱟᱣ ᱚᱵᱚᱥᱛᱟ + ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱢᱮ + ᱛᱷᱟᱯᱚᱱ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱᱟᱜ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ + ᱥᱤᱠᱷᱱᱟᱹᱛ ᱡᱚᱱᱚᱲᱟᱣ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱡᱟᱦᱟᱸ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱚᱠᱛᱚ %d ᱥᱮᱠᱮᱱᱰ ᱨᱮ ᱞᱟᱜᱟᱣ ᱟᱠᱟᱱᱟ + ᱪᱮᱫ ᱱᱟᱣᱟ + ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹᱠᱚ ᱵᱟᱠᱚ ᱥᱚᱦᱚᱫ ᱟᱠᱟᱫ ᱪᱷᱟᱸᱪ + ᱵᱟᱦᱨᱮ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ ᱥᱴᱨᱤᱢ ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ + ᱚᱥᱚᱞ + ᱥᱮᱨᱮᱧ + ᱱᱟᱣᱟ + ᱱᱚᱶᱟ ᱨᱮ ᱴᱟᱯ ᱠᱟᱛᱮ ᱞᱟᱛᱟᱨ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱛᱚ ᱱᱤᱯᱷᱩᱴ ᱮᱠᱥᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ ᱾ ᱯᱩᱭᱞᱩ ᱯᱮᱭᱟ ᱠᱟᱹᱢᱤ (ᱯᱞᱮ/ᱯᱷᱟᱣᱩᱥ, ᱯᱩᱭᱞᱩ ᱟᱨ ᱛᱟᱭᱚᱢ) ᱫᱚ ᱥᱤᱥᱴᱚᱢ ᱦᱚᱛᱮᱛᱮ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱᱟ ᱟᱨ ᱱᱚᱣᱟ ᱠᱚ ᱟᱹᱨᱤᱪᱟᱹᱞᱤ ᱛᱮ ᱵᱟᱭ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱟᱱᱰᱨᱚᱭᱮᱰ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱟᱠᱟᱱ ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱢᱩᱬ ᱪᱤᱛᱟᱹᱨ ᱞᱮᱠᱟᱛᱮ ᱱᱤᱯᱷᱩᱴ ᱪᱤᱛᱟᱹᱨ ᱨᱮᱱᱟᱜ ᱨᱚᱝ ᱵᱮᱱᱟᱣ ᱢᱮ (ᱱᱚᱶᱟ ᱡᱚᱛᱚ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ) + ᱴᱟᱴᱠᱟ ᱜᱩᱱᱠᱚ ᱢᱚᱱᱮ ᱠᱟᱜ ᱢᱮ + ᱯᱷᱮᱥᱯᱷᱚᱨᱰ/ᱨᱟᱭᱣᱤᱞᱰ ᱥᱮᱪᱮᱛ ᱚᱠᱛᱚ + ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ, ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱭ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱫᱚᱞ ᱛᱮ ᱦᱮᱰᱥᱮᱴ ᱠᱚ ᱵᱮᱵᱷᱟᱨ ᱮᱫᱟ + ᱴᱤᱯᱚᱬᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱵᱷᱤᱰᱤᱭᱳ ᱵᱟᱵᱚᱫᱽ ᱟᱨ ᱮᱴᱟᱜ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱪᱤᱛᱟᱹᱨ ᱠᱮᱪ ᱵᱚᱫᱚᱞ + ᱠᱟᱪᱷ ᱢᱮᱴᱟᱰᱮᱴᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱟᱢ ᱠᱮᱪ ᱟᱠᱟᱱ ᱣᱮᱵᱽ ᱯᱮᱡ ᱨᱮᱱᱟᱜ ᱰᱮᱴᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱥᱠᱨᱤᱱ ᱨᱮᱱᱟᱜ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱤᱱᱦᱟᱹ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱵᱷᱚᱞᱚᱢ + ᱡᱟᱦᱟᱱ ᱵᱟᱝ + ᱛᱚᱨᱡᱚᱢᱟ ᱱᱟᱜᱟᱢ + ᱞᱚᱠᱟᱞ ᱞᱮᱠᱟᱛᱮ ᱥᱩᱪᱚᱱᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱞᱤᱥᱴᱤ ᱨᱮ ᱯᱳᱡᱤᱥᱚᱱ + ᱞᱤᱥᱴᱤ ᱨᱮ ᱯᱞᱮᱼᱯᱷᱚᱞ ᱯᱳᱡᱤᱥᱚᱱ ᱤᱱᱰᱮᱠᱴᱚᱨ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱛᱟᱲᱤ ᱚᱱᱚᱞ + enqueue ᱴᱤᱯ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱦᱚᱭ ᱢᱮ + Details: ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮ ᱯᱷᱚᱱ ᱥᱮ ᱯᱚᱯᱯᱟᱯ ᱵᱩᱛᱟᱹᱢ ᱞᱟᱜᱟᱣ ᱞᱮᱠᱷᱟᱱ ᱴᱤᱯ ᱮᱢ ᱢᱮ + %s ᱨᱮ ᱟᱢᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱜᱟᱢ ᱟᱨ ᱠᱷᱟᱪ + ᱧᱮᱧᱮᱞ + ᱰᱤᱵᱩᱜ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱰᱟᱭ + ᱛᱷᱚᱠ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ + ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱮᱨ ᱦᱟᱹᱴᱤᱧ ᱠᱟᱱᱟ._x000D_ +\n_x000D_ +\nᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱧᱮᱞᱢᱮ ᱠᱷᱟᱱ ᱟᱢᱟᱜ ᱥᱤᱴᱤᱝ ᱨᱮ %1$s\" ᱚᱞ ᱢᱮ ᱾\" + ᱰᱟᱩᱱᱞᱚᱰ + ᱰᱟᱩᱱᱞᱚᱰ + ᱟᱞᱵᱚᱢ + ᱟᱨᱴᱤᱥᱴ ᱠᱚ + ᱵᱷᱮᱜᱟᱨ ᱦᱚᱲ + ᱠᱞᱟᱨ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ + ᱵᱷᱤᱰᱤᱭᱳ ᱦᱟᱥᱤᱝ ᱯᱨᱚᱜᱨᱮᱥ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ + ᱱᱟᱣᱟ ᱫᱟᱨᱮ ᱠᱚ + ᱥᱮᱞᱮᱫ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱦᱚᱪᱚ + ᱵᱟᱹᱲᱤᱡ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ ᱠᱚ + [ᱱᱚᱣᱟ ᱵᱟᱰᱟᱭᱚᱜ ᱠᱟᱱᱟ] + reCAPTCHA ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + reCAPTCHA ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱮᱠᱥᱯᱳᱨᱴ ᱦᱤᱥᱛᱟ, ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ, ᱯᱞᱮ ᱞᱤᱥᱴ ᱟᱨ ᱥᱮᱴᱤᱝ + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱱᱟᱜᱟᱢ + ᱠᱷᱮᱞ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱟᱨ ᱠᱷᱮᱞ ᱟᱠᱟᱱ ᱯᱳᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞᱟ + ᱥᱟᱱᱟᱢ ᱧᱮᱞ ᱱᱟᱜᱟᱢ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ + ᱵᱟᱦᱨᱮ ᱥᱴᱳᱨᱮᱡ ᱵᱟᱭ ᱧᱟᱢᱚᱜ + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱺ + ᱦᱟᱛᱟᱝ ᱢᱚᱰ + ᱢᱩᱬᱩᱛ ᱴᱮᱵᱽ ᱨᱮᱱᱟᱜ ᱴᱷᱟᱶ + ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱦᱚᱪᱚ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱟ. ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱞᱚᱠᱮᱥᱚᱱ ᱨᱤᱥᱮᱴ ᱢᱮ ? + ᱡᱚᱛᱚ ᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱞᱚᱰ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ + ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱵᱟᱭ ᱯᱟᱨᱥ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱥᱟᱦᱴᱟ ᱵᱟᱹᱱᱩᱜ-ᱟ + ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱝᱠᱟᱱ ᱡᱚᱱᱚᱲ ᱠᱚ ᱵᱟᱠᱚ ᱥᱚᱦᱚᱫᱟ + ᱡᱟᱦᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ + ᱚᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ + ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ, ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱧᱮᱞ ᱢᱮ + GitHub ᱨᱮ ᱚᱱᱚᱞ + ᱨᱤᱯᱚᱨᱴ + What:\\nRequest:\\nContent Language:\\nContent ᱫᱤᱥᱚᱢ:\\nApp Language:\\nService:\\nGMT ᱚᱠᱛᱚ:\\nPackage:\\nVersion:\\nOS version: + ᱟᱢᱟᱜ ᱯᱟᱹᱛᱭᱟᱹᱣ (ᱤᱝᱞᱤᱥ ᱛᱮ): + ᱚᱯᱞᱚᱰᱟᱨᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ + ᱞᱟᱭᱠ + ᱡᱟᱦᱟᱱ ᱡᱤᱱᱤᱥ + ᱱᱚᱣᱟ ᱨᱮᱫᱚ ᱡᱟᱹᱥᱛᱤ ᱡᱟᱹᱥᱛᱤ ᱠᱨᱤᱠᱮᱴ ᱢᱮᱱᱟᱜᱼᱟ ᱾ + ᱵᱷᱤᱰᱤᱭᱳ + k + M + ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱞᱮᱠᱷᱟ ᱵᱟᱭ ᱦᱟᱹᱴᱤᱧ ᱟᱠᱟᱱᱟ + ᱵᱟᱱᱩᱜ ᱧᱮᱞ + ᱵᱷᱤᱰᱤᱭᱳ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱑᱐᱐+ ᱵᱷᱤᱰᱤᱭᱳ + ᱡᱤᱣᱤ ᱥᱴᱨᱤᱢ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱪᱮᱠᱥᱢ + ᱵᱚᱫᱚᱞ ᱢᱮ + ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱮᱛᱦᱚᱵ ᱢᱮ ᱾ + ᱠᱞᱤᱯᱵᱳᱨᱰ ᱨᱮ ᱠᱚᱯᱤ ᱟᱠᱟᱱᱟ + reCAPTCHA ᱪᱟᱞᱟᱣ + ᱵᱮᱱᱟᱣ ᱪᱤᱠᱤ + ᱵᱟᱹᱞᱤ ᱪᱤᱠᱤ ᱠᱚ ᱱᱚᱶᱟ ᱢᱟᱹᱱ ᱥᱟᱞᱟᱜ ᱛᱮ ᱵᱚᱫᱚᱞᱚᱜᱼᱟ + ᱚᱞ ᱟᱨ ᱮᱞ + ᱡᱟᱹᱥᱛᱤ ᱵᱤᱥᱮᱥ ᱪᱤᱠᱤ + ᱪᱟᱹᱞᱩ ZIP ᱯᱷᱤᱞ ᱫᱚ ᱵᱟᱝ + ᱞᱟᱹᱱᱟᱹᱤ: ᱡᱚᱛᱚ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱤᱱᱯᱷᱚᱨᱢ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ. + ᱱᱚᱶᱟ ᱫᱚ ᱟᱢᱟᱜ ᱱᱮᱛᱟᱨᱟᱜ ᱥᱮᱴᱯᱟᱴ ᱩᱫᱩᱜ ᱮᱫᱟ ᱾ + ᱟᱢ ᱥᱤᱴᱤᱝ ᱦᱚᱸ ᱟᱢᱯᱷᱮᱨᱟᱣ ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟ? + ᱠᱚᱢᱮᱱᱴ ᱞᱚᱰ ᱫᱚ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ + ᱢᱩᱬ ᱕᱐ + ᱠᱚᱱᱯᱷᱮᱨᱮᱱᱥ + ᱠᱷᱮᱞ ᱞᱟᱦᱟ + ᱥᱟᱦᱟᱣ ᱢᱮ + ᱡᱚᱠᱷᱟ + ᱚᱰᱤᱭᱳ ᱴᱨᱟᱠ + ᱥᱮᱞᱮᱫᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱛᱟᱭᱚᱢ ᱛᱮ Enqueue + ᱛᱟᱭᱚᱢ ᱛᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱚᱯᱮᱱ ᱰᱨᱟᱵᱷᱤᱴ + ᱵᱟᱹᱲᱛᱤ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ \"ᱚᱯᱮᱱ\" ᱠᱟᱹᱢᱤ + ⁇ %s ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ + ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ + ᱯᱟᱛᱷᱟᱢ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ + ᱯᱚᱯᱯᱟᱯ ᱯᱞᱮᱭᱟᱨ + ᱥᱟᱨᱮᱡ ᱟᱠᱟᱱ ᱯᱞᱮ ᱞᱤᱥᱴᱤ ᱨᱮ ᱱᱤᱛᱚᱜ ᱱᱚᱣᱟ ᱡᱤᱱᱤᱥ ᱢᱮᱱᱟᱜᱼᱟ ᱾ + ᱧᱩᱛᱩᱢ ᱵᱚᱫᱚᱞ ᱢᱮ + Unmute + ᱵᱟᱝ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱ ᱟᱹᱪᱩᱨ ᱦᱟᱹᱴᱤᱧ + ᱯᱮᱭᱞᱤᱥᱴ + %d ᱚᱠᱛᱚ ᱵᱟᱨᱟᱵᱟᱨᱤ ᱥᱮᱞᱮᱫᱚᱜᱼᱟ + ᱪᱤᱛᱟᱹᱨ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ + ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱨᱮᱱᱟᱜ ᱛᱷᱤᱢᱵᱽᱱᱟᱭᱟᱨ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ. + ᱚᱴᱚ-ᱡᱮᱱᱮᱨᱮᱴ (ᱯᱷᱮᱰᱟᱛ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ) + ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱹᱱᱩᱜ + ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱯᱷᱤᱞᱰ + ᱡᱩᱢ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱜ ᱪᱷᱟᱸᱪ ᱚᱞ ᱨᱮᱱᱟᱜ ᱟᱥᱚᱞ ᱟᱨ ᱯᱟᱛᱷᱟᱢ ᱥᱴᱟᱭᱤᱞᱥ ᱵᱚᱫᱚᱞ ᱢᱮ. ᱪᱟᱹᱞᱩᱜ ᱞᱟᱹᱜᱤᱫ ᱮᱯ ᱮᱥᱴᱟᱨᱴ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + LeakCanary ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ + ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱢᱚᱱᱤᱴᱚᱨᱤᱝ ᱦᱤᱯ ᱰᱟᱢᱯᱤᱝ ᱚᱠᱛᱚ ᱨᱮ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱟᱥᱴᱨᱤᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱡᱤᱭᱚᱱ ᱪᱤᱠᱤ ᱠᱷᱚᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱷᱮᱜᱟᱨ ᱠᱚ ᱚᱱᱚᱞ ᱢᱮ + ᱱᱮᱴᱣᱟᱨᱠ ᱞᱟᱹᱜᱤᱫ red, ᱰᱤᱥᱠ ᱞᱟᱹᱜᱤᱫ blue ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱞᱟᱹᱜᱤᱫ green + ᱯᱞᱮᱭᱟᱨ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱮ ᱨᱮ ᱠᱨᱟᱥ ᱚᱯᱥᱚᱱ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ + ᱤᱢᱯᱳᱨᱴ + ᱤᱢᱯᱚᱨᱴ + ᱮᱥᱯᱳᱨᱴ ᱢᱮ + ᱤᱢᱯᱳᱨᱴ… + ᱮᱠᱥᱯᱳᱨᱴ… + ᱤᱢᱯᱳᱨᱴ ᱯᱷᱤᱞ + ᱢᱟᱲᱟᱝ ᱮᱠᱥᱯᱚᱨᱴ + ᱥᱚᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱮᱢ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ ᱠᱟᱱᱟ + \"ᱱᱚᱶᱟ ᱚᱯᱨᱮᱥᱚᱱ ᱨᱮ ᱱᱮᱴᱣᱟᱨᱠ ᱰᱷᱮᱨ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱢᱮᱱᱛᱮ ᱢᱟᱱᱟᱣ ᱢᱮ ᱾\" +\n +\nᱟᱢ ᱫᱚ ᱪᱮᱫ ᱮᱢ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ?\" + ᱨᱤᱥᱮᱴ + ᱥᱮᱢᱤᱴᱚᱱ + ᱰᱷᱮᱨᱚᱜ + ᱞᱤᱢᱤᱴ ᱵᱟᱹᱱᱩᱜ + ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱚ ᱨᱮ ᱞᱤᱢᱤᱴ ᱫᱟᱲᱮ + ᱱᱟᱣᱟ ᱵᱷᱮᱨᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱢᱟᱱᱩᱣᱟᱞ ᱪᱮᱠ + ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱥᱤᱴᱤᱪ ᱨᱮ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ + ᱢᱩᱬᱩᱛ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱚᱠᱛᱚ ᱨᱮᱱᱟᱜ ᱠᱟᱹᱢᱤ ⁇ %s + ᱡᱟᱦᱟᱱ ᱵᱟᱝ + ᱚᱛᱱᱚ ᱯᱞᱮᱭᱟᱨ ᱨᱮ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ + Wi-Fi ᱨᱮᱜᱮ + Seekbar thumbnail preview ᱧᱮᱞᱢᱮ + ᱠᱚᱢ ᱠᱣᱟᱞᱤᱴᱤ (ᱢᱤᱫ ᱠᱷᱚᱱ ᱠᱚᱢ) + ᱵᱟᱝ ᱧᱮᱞᱚᱜ + ᱟᱢ NewPipe ᱨᱮᱭᱟᱜ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ + ᱯᱮᱱᱰᱤᱝ + ᱠᱩᱠᱞᱤ + ᱯᱟᱥᱴᱟ ᱯᱨᱚᱥᱟᱥᱚᱱ + ᱤᱱᱠᱭᱩᱤᱝ + ᱥᱤᱥᱴᱮᱢ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱ ᱠᱟᱹᱢᱤ + ᱯᱷᱟᱹᱞ ᱪᱮᱛᱟᱱ ᱵᱟᱝ ᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱤᱫ ᱚᱞᱚᱜ ᱠᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮᱱᱟᱜᱼᱟ + ᱴᱷᱟᱶ ᱯᱷᱳᱞᱰᱚᱨ ᱛᱮᱭᱟᱨ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱱᱚᱶᱟ ᱰᱟᱩᱱᱞᱚᱰ ᱫᱚ ᱵᱟᱭ ᱨᱤᱠᱳᱨᱰ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱰᱟᱩᱱᱞᱚᱰ ᱦᱤᱥᱛᱟ ᱪᱷᱟᱯᱟ ᱢᱮ + ᱟᱹᱰᱤ ᱡᱟᱹᱥᱛᱤ ᱫᱟᱲᱮ + ᱢᱤᱴᱟᱨ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ ᱨᱮ ᱵᱚᱫᱚᱞ + ᱰᱟᱩᱱᱞᱚᱰ ᱮᱦᱚᱵ ᱢᱮ + ᱧᱮᱞᱚᱜ ᱟᱠᱟᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ + ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ? + ᱫᱩᱯᱞᱟᱹᱲ ᱠᱚ ᱦᱮᱡ ᱢᱮ + ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ + ᱪᱟᱱᱮᱞ ᱜᱨᱩᱯ + ᱯᱷᱤᱰ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ: %s + ᱵᱟᱝ ᱞᱚᱰ ᱟᱠᱟᱱᱟ: %d + ᱯᱷᱤᱰ ᱞᱚᱰᱚᱜ ᱠᱟᱱᱟ… + ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱡᱚᱢᱟᱜ… + ᱜᱩᱴ ᱧᱩᱛᱩᱢ ᱵᱟᱱᱩᱜᱼᱟ + ᱟᱢ ᱱᱚᱶᱟ ᱜᱽᱨᱩᱯ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ? + ᱱᱟᱣᱟ + ᱦᱟᱹᱴᱤᱧ ᱢᱚᱰ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱞᱟᱛᱟᱨ ᱨᱮ ᱚᱞ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱪᱟᱱᱮᱞ ᱛᱟᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ + %s ᱛᱮᱭᱟᱨ ᱟᱠᱟᱱᱟ + %s ᱦᱚᱛᱮᱛᱮ + ᱛᱟᱢᱤᱞ ᱪᱤᱛᱟᱹᱨ ᱧᱮᱞ ᱢᱮ + ᱪᱮᱯᱴᱟᱨᱥ + ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱟᱢ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱟᱱᱮᱡᱚᱨ ᱤᱱᱥᱴᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱤᱴᱤᱝ ᱨᱮ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱨᱚᱵᱷᱟᱣ ᱢᱮ\" + ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ ᱯᱨᱤᱢᱤᱭᱟᱢ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱫᱚ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱟᱨ ᱵᱟᱝ ᱰᱟᱩᱱᱞᱳᱰ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + %s ᱫᱚ ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ: + ᱚᱴᱚᱢᱟᱴᱤᱠ (ᱰᱤᱵᱟᱤᱥ ᱛᱷᱮᱢ) + ᱟᱢᱟᱜ ᱯᱩᱭᱞᱩ ᱧᱤᱫᱟᱹ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ⁇ %s + ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱤᱫᱟᱹ ᱪᱮᱛᱟᱱ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ + ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱪᱷᱟᱣ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱛᱷᱚᱠ + ᱞᱟᱭᱥᱮᱱᱥ + ᱟᱵᱟᱛᱟᱨ + ᱵᱮᱱᱚᱨ + ᱵᱟᱝ ᱞᱤᱥᱴᱤ ᱟᱠᱟᱱᱟ + ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱟᱢ ᱱᱤᱛᱚᱜ ᱱᱚᱣᱟ ᱪᱮᱱᱮᱞ ᱨᱮ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟᱢ + , + ᱵᱟᱦᱨᱮ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱧᱟᱢ ᱟᱠᱟᱱ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱵᱟᱝ ᱵᱟᱰᱟᱭ + ᱡᱚᱛᱚ ᱛᱮ ᱧᱮᱞᱚᱜᱼᱟ + ExoPlayer ᱨᱮᱭᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱟᱯᱩᱴ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱥᱤᱴᱤᱝ ᱣᱟᱨᱠᱟᱨᱚᱸᱜ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱵᱷᱤᱰᱤᱭᱳ + ᱴᱨᱮᱠ + ᱥᱟᱨᱴᱥ + ᱡᱤᱣᱤ + ᱪᱟᱱᱮᱞ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ + ᱟᱞᱵᱚᱢ + ᱤᱫᱤ ᱠᱟᱛᱮ + ᱪᱟᱱᱮᱞ ᱛᱟᱵᱽ + ᱥᱠᱨᱤᱱ ᱴᱳᱜᱞ ᱳᱭᱨᱮᱱᱟᱥᱚᱱ + ᱢᱟᱲᱟᱝ ᱥᱴᱨᱤᱢ + ᱯᱷᱚᱨᱣᱟᱨᱰ + ᱪᱤᱛᱟᱹᱨ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱪᱤᱛᱟᱹᱨ ᱵᱟᱝ ᱞᱚᱰ ᱢᱮ + \? + ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱠᱟᱹ ᱮᱢ + ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱮᱱᱮᱢ ᱢᱮ + %1$s +\n%2$s + ᱟᱨᱦᱚᱸ ᱧᱮᱞ ᱢᱮ + ᱠᱚᱢ ᱧᱮᱞ ᱢᱮ + ᱛᱟᱹᱞᱠᱟᱹ ᱪᱟᱪᱞᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱮᱢ ᱢᱮ + ᱢᱤᱫ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟ. ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟ. ᱛᱮ ᱵᱚᱫᱚᱞ ᱠᱟᱛᱮᱜ ᱟᱢᱟᱜ ᱠᱩᱠᱞᱤ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱮᱠᱴᱤᱵᱽ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱩᱠᱞᱤ ᱫᱚ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ + ᱞᱟᱹᱱᱟᱹᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚ ᱨᱤᱯᱚᱴ ᱢᱮ + ᱯᱞᱮᱵᱮᱠ ᱞᱚᱰ ᱤᱱᱴᱟᱨᱵᱷᱮᱞ ᱨᱮᱱᱟᱜ ᱢᱟᱨᱟᱝ + ᱞᱚᱠᱟᱞ + ᱮᱠᱟᱩᱱᱴ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱵᱟᱰᱟᱭ ᱢᱮ + ᱦᱟᱨᱰᱣᱮᱭᱟᱨ ᱢᱤᱰᱤᱭᱟ ᱵᱩᱴᱚᱱ ᱦᱮᱯᱨᱟᱣ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + System folder picker (SAF) ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱷᱚᱨᱢᱮᱴ + ᱯᱚᱯ-ᱟᱯ ᱨᱮᱱᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱢᱟᱨᱟᱝ ᱟᱨ ᱴᱷᱟᱶ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱦᱩᱰᱤᱧ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱞᱟᱦᱟᱱᱛᱤ ᱵᱮᱵᱷᱟᱨ + ᱵᱟᱝ ᱥᱟᱹᱨᱤ ᱧᱮᱞ ᱠᱷᱟᱱ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱥᱟᱶ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱚ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱕, ᱑᱕ ᱟᱨ ᱒᱕ ᱥᱮᱠᱮᱱᱰ ᱞᱟᱹᱜᱤᱫ ᱧᱮᱞᱚᱜᱼᱟ ᱱᱚᱶᱟ ᱥᱟᱶ ᱵᱟᱝ ᱠᱟᱹᱢᱤᱭᱟ + ᱮᱱᱮᱢ ᱠᱚ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + \'Next\' ᱟᱨ \'Similar\' ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱢᱮᱴᱟ ᱴᱷᱟᱶ ᱧᱮᱞ ᱢᱮ + ᱥᱴᱨᱤᱢ ᱵᱮᱱᱟᱣᱤᱭᱟᱹ, ᱥᱴᱨᱤᱢ ᱟᱹᱛᱩ ᱟᱨᱵᱟᱝ ᱥᱟᱨᱪ ᱞᱟᱹᱠᱛᱤ ᱵᱟᱵᱚᱛ ᱟᱨᱦᱚᱸ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟ ᱤᱱᱯᱷᱳ ᱵᱚᱠᱥ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱱᱮᱛᱟᱨᱟᱜ ᱥᱴᱨᱤᱢ ᱨᱮ ᱚᱴᱚᱼᱠᱤᱣ + ᱡᱚᱲᱟᱣ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱥᱮᱞᱮᱫ ᱠᱟᱛᱮ ᱪᱟᱪᱞᱟᱣ ᱪᱮᱛᱟᱱ (ᱱᱚᱱ-ᱨᱩᱯᱨᱤᱭᱩᱴᱤᱝ) ᱯᱞᱮᱼᱵᱷᱤᱠ ᱪᱮᱛᱟᱱ ᱪᱟᱪᱞᱟᱣ ᱢᱮ + ᱯᱟᱹᱨᱥᱤ ᱵᱟᱝ ᱧᱮᱞ ᱠᱟᱛᱮᱜ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱰᱤᱥᱠᱨᱤᱯᱴᱤᱵᱷ ᱚᱰᱤᱭᱚ ᱵᱟᱹᱲᱛᱤ + ᱚᱴᱚ-ᱮᱱᱠᱭᱩᱤᱝ + ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜ ᱟ ᱡᱩᱫᱤ ᱧᱮᱞ ᱵᱟᱹᱲᱤᱡ ᱦᱚᱲ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱢᱮᱴᱟᱰᱮᱴᱟ ᱠᱮᱪ ᱵᱚᱫᱚᱞ + ᱞᱤᱣᱮᱴ ᱡᱮᱥᱴ ᱮᱠᱥᱚᱱ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱥᱠᱨᱤᱱ ᱨᱮᱱᱟᱜ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱤᱱᱦᱟᱹ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱞᱟᱹᱭ ᱪᱤᱠᱤ ᱠᱟᱹᱢᱤ + ᱢᱤᱱᱤ ᱯᱞᱮᱭᱟᱨ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱢᱮ, ᱡᱩᱫᱤ ᱚᱴᱚᱯᱷᱤ ᱨᱚᱴᱮᱴ ᱞᱚᱠ ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱥᱟᱹᱛ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ ᱟᱢ ᱢᱤᱱᱤ ᱯᱞᱮᱭᱟᱨ ᱪᱷᱟᱰᱟ ᱠᱟᱛᱮᱜ ᱦᱚᱸ ᱥᱮᱞᱮᱫ ᱫᱟᱲᱮᱭᱟᱜ ᱟ + ᱚᱴᱚᱯᱷᱟᱭ + ᱵᱟᱝ ᱥᱚᱦᱚᱫ ᱟᱠᱟᱱ URL + URL ᱵᱟᱭ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱫᱼᱟ. ᱮᱴᱟᱜ ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱛᱮ ᱮᱛᱚᱦᱚᱵ ᱢᱮ? + ᱡᱤᱞᱤᱧ + ᱛᱚᱨᱡᱚᱢᱟ ᱥᱟᱯᱲᱟᱣ + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱺ + ᱨᱮᱢᱳᱴ ᱥᱟᱨᱪ ᱥᱩᱯᱨᱮᱥ + ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱮᱛᱟᱱ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱡᱟᱦᱟᱱᱟᱜ ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ ᱠᱷᱮᱞ ᱫᱚᱦᱚᱭ ᱢᱮ (ᱡᱮᱞᱮᱠᱟ: ᱯᱷᱚᱱ ᱠᱚᱞ) + ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ + ᱢᱩᱬᱩᱛ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱡᱚᱛᱚ ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱮᱛᱚᱦᱚᱵ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚᱱᱴᱮᱱᱴ ᱯᱟᱹᱨᱥᱤ + PeerTube ᱚᱞ ᱠᱚ + ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢᱟᱱ PeerTube ᱵᱷᱤᱛᱨᱤ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱞᱟᱹᱱᱟᱹᱤ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ + ᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱚᱰᱤᱭᱳ + HTTPS URL ᱠᱚ ᱜᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱟᱠᱟᱱᱟ + ᱤᱱᱥᱴᱮᱱᱥ ᱫᱚ ᱟᱞᱮ ᱢᱮᱱᱟᱜᱼᱟ + ᱟᱹᱱᱟᱹᱨᱤ + ᱚᱛᱱᱚᱜ ᱪᱤᱛᱟᱹᱨ ᱠᱷᱚᱸᱫᱽᱨᱚᱸᱫᱽ ᱥᱟᱯᱲᱟᱣ + ᱜᱤᱫᱨᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱚᱣᱟ ᱨᱮ ᱢᱤᱫ ᱩᱢᱮᱨ ᱞᱤᱢᱤᱴ ᱢᱮᱱᱟᱜᱼᱟ (ᱡᱮᱞᱮᱠᱟ ᱑᱘+) + ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱫ \"Restricted Mode\" ᱮᱢᱚᱜᱼᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱯᱚᱴᱮᱱᱥᱤᱭᱟᱞ ᱢᱚᱰᱩᱞ ᱠᱚᱱᱴᱮᱱᱴ (mature content) ᱫᱚᱦᱚᱭᱟ + ᱱᱤᱭᱟᱹ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱜᱮ᱾_x000D_ +\nᱭᱩᱴᱭᱩᱵᱽ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱱᱟᱜ ᱩᱢᱮᱨ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱯᱳᱞᱤᱥᱤ ᱠᱷᱟᱹᱛᱤᱨ, ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯᱷ ᱫᱚ ᱟᱡᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱦᱚᱸ ᱥᱮᱴᱮᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ ᱟᱨ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱯᱞᱮᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱡᱤᱣᱤ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ + ᱵᱷᱤᱰᱤᱭᱳ + ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ + ᱜᱷᱚᱴᱚᱱ ᱠᱚ + ᱮᱯ ᱟᱯᱰᱮᱴ ᱱᱳᱴᱤᱯᱮᱥᱚᱱ + ᱱᱟᱣᱟ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱵᱟᱨᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ + ᱪᱷᱟᱸᱪ ᱠᱚ + ᱵᱷᱤᱰᱤᱭᱳ ᱦᱟᱥ ᱱᱮᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ + ᱪᱟᱹᱠᱨᱤ ᱠᱷᱚᱵᱚᱨ ᱠᱷᱚᱵᱚᱨ + ᱯᱷᱚᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ + ᱯᱚᱯ-ᱟᱯ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱢᱩᱬᱩᱛ ᱨᱮ ᱞᱤᱱ ᱢᱮ + ᱮᱠᱥᱯᱳᱨᱴ ᱰᱮᱴᱟᱵᱮᱥ + ᱟᱢᱟᱜ ᱱᱮᱛᱟᱨᱟᱜ ᱱᱟᱜᱟᱢ, ᱥᱟᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ, ᱯᱷᱟᱭᱞᱤᱥᱴ ᱟᱨ (ᱵᱟᱪᱷᱱᱟᱣ ᱞᱮᱠᱟᱛᱮ) ᱥᱤᱴᱤᱝ ᱠᱚ ᱩᱪᱟᱹᱲᱟ + ᱟᱢ ᱢᱤᱫ reCAPTCHA ᱥᱟᱯᱲᱟᱣ ᱞᱮᱠᱷᱟᱱ NewPipe ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱫᱚᱨ ᱟᱠᱟᱱ ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱯᱷᱟᱭᱞᱟᱣ ᱴᱷᱟᱶ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ ᱯᱞᱮᱤᱯᱷᱟᱭᱤᱰ ᱯᱚᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞᱟ + ᱡᱚᱛᱚ ᱯᱞᱮᱵᱟᱠ ᱯᱳᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱠᱷᱮᱞᱚᱸᱰ ᱨᱮᱱᱟᱜ ᱴᱷᱟᱶ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ ᱟᱠᱟᱱᱟ + ᱥᱩᱪᱚᱱᱟ ᱨᱮᱭᱟᱜ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱯᱟ ᱢᱮ + ᱪᱷᱟᱸᱪ:Search keywords ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱸᱪᱟᱣᱟ + ᱥᱟᱱᱟᱢ ᱥᱩᱪᱚᱱᱟ ᱱᱟᱜᱟᱢ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮᱱᱩ ᱵᱟᱭ ᱥᱮᱯᱴᱮᱭᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱮᱯᱞᱤᱠᱮᱥᱚᱱ/UI ᱠᱨᱟᱥ ᱞᱮᱱᱟ + ᱱᱚᱣᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱭ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱦᱩᱫᱤᱥ ᱠᱷᱚᱱ ᱨᱤᱠᱳᱨᱰ + ᱱᱚᱶᱟ ᱯᱷᱤᱞ ᱵᱟᱹᱱᱩᱜᱼᱟ ᱥᱮ ᱱᱚᱶᱟ ᱨᱮ ᱚᱞ ᱟᱨ ᱯᱟᱲᱦᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱯᱷᱤᱞᱤᱢ ᱧᱩᱛᱩᱢ ᱵᱚᱸᱫᱚ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ + %1$s ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ: + ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱡᱟᱦᱟᱱ ᱥᱴᱨᱤᱢ ᱵᱟᱭ + ᱥᱚᱞᱦᱮ ᱟᱠᱟᱱ ᱴᱮᱵᱽ ᱠᱚ ᱵᱟᱝ ᱯᱟᱲᱦᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ, ᱚᱱᱟᱛᱮ ᱵᱮᱵᱷᱟᱨᱤᱡᱽ ᱠᱚ + ᱟᱢ ᱥᱩᱯᱚᱨᱴ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ? + ᱮᱴᱟᱜ ᱮᱯ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱣ ᱮᱢ ᱢᱮ + NewPipe ᱨᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱵᱷᱩᱞ ᱧᱟᱢ ᱞᱮᱱᱟ, ᱠᱷᱚᱵᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ + ᱤᱧᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜ ᱞᱟᱹᱠᱛᱤ ᱛᱟᱦᱮᱸᱫ ᱾ + ᱤ-ᱢᱮᱞ ᱤᱫᱤ ᱠᱟᱛᱮ ᱨᱤᱯᱚᱨᱴ ᱢᱮ + ᱯᱷᱚᱨᱢᱮᱴ ᱟᱠᱟᱱ ᱨᱤᱯᱳᱨᱴ ᱠᱚᱯᱤ ᱢᱮ + ᱟᱢᱟᱜ ᱠᱨᱮᱥᱴ ᱵᱟᱵᱚᱫᱽ ᱛᱮ ᱢᱤᱫ ᱚᱱᱚᱞ ᱢᱮᱱᱟᱜ ᱟ ᱥᱮ ᱵᱟᱝ ᱚᱱᱟ ᱧᱮᱞ ᱢᱮ ᱾ ᱰᱩᱯᱞᱤᱠᱮᱴ ᱴᱤᱠᱮᱴ ᱵᱮᱱᱟᱣ ᱞᱮᱠᱷᱟᱱ, ᱟᱢ ᱫᱚ ᱚᱠᱛᱚ ᱟᱢᱮᱢ ᱦᱟᱛᱟᱣᱮᱫᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱥᱚᱞ ᱵᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱟᱢᱮᱢ ᱦᱟᱛᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱤᱱᱯᱷᱳ: + ᱪᱮᱫ ᱦᱩᱭ ᱞᱮᱱᱟ: + ᱞᱟᱹᱱᱟᱹᱤ: + ᱵᱷᱤᱰᱤᱭᱚ ᱯᱞᱮ, ᱚᱠᱛᱚ: + ᱵᱟᱹᱲᱤᱡ + ᱠᱚᱢᱮᱱᱴ + ᱥᱟᱶᱦᱮᱫ ᱮᱞᱠᱷᱟ + ᱞᱟᱹᱱᱟᱹᱤ + ᱓ ᱰᱳᱴ ᱢᱮᱱᱩ ᱠᱷᱚᱱ ᱤᱢᱯᱳᱨᱴ ᱟᱨ ᱮᱠᱥᱯᱳᱨᱴ ᱥᱟᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ + ᱱᱟᱣᱟ ᱟᱹᱨᱡᱤ ᱞᱟᱹᱜᱤᱫ ᱟᱹᱪᱩᱨ ᱢᱮ + ᱚᱰᱤᱭᱳ + ᱟᱨᱦᱚᱸ ᱯᱟᱲᱦᱟᱣ ᱢᱮ + ᱵᱤ + ᱱᱤᱛᱚᱜ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱴᱳᱜᱞ ᱥᱮᱵᱟ: + ᱚᱵᱷᱤᱱᱮᱛᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱚᱠᱚᱭ ᱦᱚᱸ ᱵᱟᱝ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ + ᱜᱚᱴᱟ ᱟᱠᱟᱱᱟ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱵᱚᱛ + ᱯᱮᱨᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ + ᱰᱳᱱᱮᱴ ᱢᱮ + ᱡᱟᱦᱟᱸᱭ ᱜᱮᱭ ᱟᱸᱡᱚᱢᱟ + ∞ ᱵᱷᱤᱰᱤᱭᱳ + ᱵᱟᱦᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱠᱚᱢᱮᱱᱴ ᱫᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱮᱛᱚᱦᱚᱵ + ᱯᱷᱟᱭᱩᱥ + ᱵᱮᱱᱟᱣ ᱢᱮ + ᱛᱷᱚᱠ ᱨᱮ ᱛᱟᱭᱚᱢ ᱛᱮ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱮᱢ ᱢᱮ + ᱢᱤᱫᱴᱟᱹᱝ ᱡᱤᱱᱤᱥ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + reCAPTCHA challenge ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱥᱚᱞᱦᱮ + ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱚᱠᱛᱚ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱵᱷᱟᱹᱜᱤ ᱵᱷᱟᱹᱜᱤ ᱥᱟᱹᱜᱟᱹᱭ ᱮᱢ ᱠᱟᱛᱮ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱾ ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱵᱮᱨᱮᱫ ᱞᱟᱹᱜᱤᱫ ᱮᱱᱮᱢᱤᱭᱟᱹ ᱠᱚ ᱜᱚᱲᱚ ᱥᱚᱦᱚᱫ ᱮᱢ ᱢᱮ ᱾ + ᱣᱮᱵᱽᱥᱟᱭᱤᱴ + ᱱᱤᱣ ᱯᱟᱭᱯ ᱨᱮᱭᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ + ᱱᱤᱭᱩ ᱯᱟᱭᱯ ᱫᱚ ᱠᱚᱯᱤᱞᱮᱠᱴ ᱞᱤᱵᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱠᱟᱱᱟ ᱾ ᱟᱢ ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨ, ᱯᱟᱲᱦᱟᱣ, ᱮᱴᱟᱜ ᱦᱚᱲ ᱥᱟᱶ ᱮᱢ ᱟᱨ ᱵᱮᱵᱚᱥᱛᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ ᱟᱢ ᱱᱚᱶᱟ GNU General Public License ᱞᱮᱠᱟᱛᱮ ᱯᱟᱨᱥᱟᱞ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱟᱨ/ᱟᱨᱵᱟᱝ Free Software Foundation ᱦᱚᱛᱮᱛᱮ ᱵᱮᱵᱦᱟᱨ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱥᱮᱱᱥ ᱨᱮᱱᱟᱜ ᱵᱟᱨᱥᱚᱱ ᱓ ᱥᱮ (ᱛᱟᱢᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱞᱮᱠᱟᱛᱮ) ᱡᱟᱦᱟᱸᱱᱟᱜ ᱛᱟᱭᱚᱢ ᱵᱟᱨᱥᱚᱱ ᱠᱟᱱᱟ ᱾ + ᱟᱨᱦᱚᱸ ᱵᱟᱰᱟᱭ ᱟᱨ ᱠᱷᱚᱵᱚᱨ ᱞᱟᱹᱜᱤᱫ NewPipe ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱧᱮᱞ ᱢᱮ ᱾ + ᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱮᱵᱚᱦᱟᱨ ᱨᱮ ᱠᱷᱟᱡᱽᱱᱟ ᱮ ᱧᱟᱢᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱥᱟᱸᱣ ᱡᱩᱲᱟᱹᱣ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ! + ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱨᱮ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱜᱟᱢ + ᱱᱟᱜᱟᱢ + ᱟᱢ ᱱᱚᱶᱟ ᱡᱤᱱᱤᱥ ᱥᱟᱸᱪᱟᱨ ᱱᱟᱜᱟᱢ ᱠᱷᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ? + ᱢᱩᱪᱟᱹᱫ ᱠᱷᱮᱞ ᱟᱠᱟᱱᱟ + ᱡᱟᱹᱥᱛᱤ ᱠᱷᱮᱞ ᱟᱠᱟᱱ + ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱟᱦᱴᱟ + ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱨᱮ ᱚᱠᱟ ᱛᱟᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱡᱤᱱᱤᱥ ᱠᱚ ᱵᱟᱧᱪᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱥᱣᱟᱭᱯ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱤᱭᱳᱥᱠ + ᱠᱤᱭᱳᱥᱠ ᱥᱟᱦᱴᱟ + ᱪᱟᱱᱮᱞ ᱥᱟᱦᱴᱟ + ᱪᱟᱱᱮᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱪᱮᱱᱮᱞ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱵᱟᱝ + ᱢᱤᱫ ᱯᱷᱟᱤᱞᱤᱥᱴ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱤᱢᱯᱳᱨᱴ + ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ playlist bookmarks ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱮᱯ ᱮᱦᱚᱵ ᱞᱮᱠᱷᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ + ᱮᱥᱯᱟᱨᱴ ᱟᱠᱟᱱᱟ + ᱴᱨᱮᱱᱰᱤᱝ + ᱚᱰᱤᱭᱳ ᱥᱮᱴᱤᱝ + ᱚᱰᱤᱭᱳ: %s + ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱰᱮᱴᱮᱞ ᱞᱚᱰ ᱠᱟᱱᱟ… + ᱥᱩᱯᱚᱨ ᱰᱨᱟᱵᱷᱤᱴ + ᱱᱟᱶᱟ ᱯᱞᱮᱭᱞᱤᱥᱴ + ᱢᱩᱴ + ᱢᱤᱫ ᱯᱚᱯ-ᱟᱯ ᱨᱮ ᱠᱷᱮᱞᱚᱸᱰ ᱮᱛᱚᱦᱚᱵ ᱢᱮ + ᱯᱷᱟᱤᱞᱤᱯᱷᱟᱤᱞᱤ ᱞᱮᱠᱟᱛᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱵᱩᱠᱢᱟᱨᱠ ᱯᱞᱮᱭᱞᱤᱥᱴ + ᱪᱷᱟᱸᱪ + ᱡᱤᱵᱚᱱ ᱪᱟᱞᱟᱣ ᱛᱟᱭᱚᱢ ᱡᱟᱹᱛᱤ ᱥᱮ ᱠᱟᱹᱢᱤ ᱡᱤᱭᱚᱱ ᱪᱮᱛᱟᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱟᱝ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ Rx ᱮᱥᱠᱮᱪᱥᱚᱱ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱨᱥ ᱨᱮᱯᱚᱨᱴᱤᱝ + ᱵᱩᱠᱢᱟᱨᱠ ᱚᱪᱚᱭ ᱢᱮ + ᱱᱚᱶᱟ ᱯᱷᱟᱭᱞᱤᱥᱴ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱚᱴᱚ-ᱡᱮᱱᱮᱨᱮᱴ + ᱡᱤᱱᱤᱥ ᱠᱚᱨᱮᱱᱟᱜ ᱢᱩᱞ ᱚᱠᱛᱚ ᱧᱮᱞ ᱢᱮ + ᱥᱮᱵᱟ ᱠᱷᱚᱱ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱴᱮᱠᱥᱴ ᱠᱚ ᱥᱴᱨᱤᱢ ᱤᱴᱮᱢ ᱨᱮ ᱧᱮᱞᱚᱜᱼᱟ + ᱡᱩᱫᱤ ᱟᱢ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱚᱯ ᱨᱮ ᱵᱞᱮᱠ ᱥᱠᱨᱤᱱ ᱟᱨᱵᱟᱝ ᱠᱷᱟᱹᱞᱤ ᱥᱴᱮᱴᱞᱤᱝ ᱮᱢ ᱧᱟᱢᱟ ᱮᱱᱠᱷᱟᱱ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ + ᱪᱤᱛᱟᱹᱨ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱪᱞᱟᱣ ᱢᱮ + ᱢᱤᱫ error notification ᱛᱮᱭᱟᱨ ᱢᱮ + ᱥᱮᱞᱮᱫ ᱮᱠᱥᱯᱳᱨᱴ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + \"ᱜᱩᱜᱩᱞ ᱴᱮᱠᱟᱣᱩᱴ ᱠᱷᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ ᱤᱱᱯᱳᱨᱴ ᱢᱮ: +\n +\n1. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s +\n2. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ +\n3. \"\'All data included\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'Deselect all\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'subscriptions\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ \"\'OK\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ +\n4. \"Next step\" ᱨᱮ ᱟᱨ ᱚᱱᱟ ᱛᱟᱭᱚᱢ \"Create export\" ᱨᱮ ᱞᱤᱱ ᱢᱮ +\n5. ᱱᱚᱶᱟ ᱧᱮᱞ ᱛᱟᱭᱚᱢ \"\"Download\"\" ᱵᱩᱴᱚᱱ ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ +\n6. ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ . zip ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ +\n7. ᱡᱩᱫᱤ .zip ᱤᱱᱯᱷᱚᱨᱴ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱵᱟᱝ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ .csv ᱯᱷᱤᱞ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱢᱮ (\"ᱭᱩᱴᱭᱩᱵᱽ ᱟᱨ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ.ᱥᱤᱵᱷ\" ᱨᱮ), ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ ᱟᱨ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱟᱠᱟᱱ csv ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + yourID, soundcloud.com/yourid + \"ᱤᱭᱩᱨᱚᱯᱤᱭᱚ ᱡᱚᱡᱚᱱᱟ ᱯᱨᱚᱫᱚᱭᱚᱜᱤᱠᱤ (ᱡᱤ.ᱰᱤ.ᱯᱤ.ᱟᱨ.) ᱥᱟᱞᱟᱜ ᱥᱚᱢᱵᱚᱸᱫᱷ ᱞᱟᱹᱜᱤᱫ ᱛᱮ, ᱱᱚᱣᱟ ᱦᱚᱛᱮᱛᱮ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱨᱮᱭᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱟᱵᱚᱣᱟᱜ ᱟᱫᱷᱤᱱᱤᱭᱚᱢ ᱠᱚ ᱩᱫᱩᱜ ᱦᱚᱪᱚᱭᱟ। ᱱᱚᱶᱟ ᱫᱚ ᱞᱟᱹᱭᱛᱮ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱾ +\nᱟᱢ ᱫᱚ ᱱᱚᱶᱟ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱢᱮ ᱡᱮ ᱟᱢ ᱵᱷᱤᱜᱽ ᱨᱮᱯᱳᱨᱴ ᱮᱢ ᱢᱮ ᱾\" + ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱢᱮ + ᱚᱯᱰᱮᱴᱥ + ᱡᱚᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱢᱮᱱᱟᱜ-ᱟ ᱮᱯ ᱟᱯᱰᱮᱴ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱯᱚᱯ-ᱟᱯ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ + ᱚᱞᱪᱤᱠᱤ ᱛᱮ ᱨᱩᱭᱟᱹᱲᱚᱜ ᱢᱮ - %s + ᱞᱤᱥᱴᱤ ᱧᱮᱧᱮᱞ ᱢᱚᱰ + ᱞᱤᱥᱴᱤ + ᱚᱴᱚ + ᱱᱟᱣᱟ ᱯᱟᱭᱤᱯ ᱚᱯᱰᱮᱴ ᱢᱮᱱᱟᱜ-ᱟ! + %s ᱠᱚᱰ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ + ᱢᱩᱪᱟᱹᱫ + ᱱᱤᱛᱚᱜᱟᱜ ᱠᱷᱚᱵᱚᱨ ᱠᱚ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ… + ᱰᱟᱩᱱᱞᱚᱰ ᱵᱟᱹᱱᱩᱜ-ᱟ + ᱧᱩᱛᱩᱢ ᱛᱮᱭᱟᱨ ᱢᱮ + ᱩᱫᱩᱜ ᱢᱮ + ᱪᱷᱟᱸᱪ:Fact + ᱯᱷᱤᱞ ᱵᱮᱱᱟᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ + ᱥᱮᱵᱟ ᱧᱟᱢ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ + ᱥᱮᱵᱟ ᱫᱚ ᱚᱱᱚᱞ ᱵᱟᱝ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ + ᱥᱟᱨᱵᱟᱨ ᱫᱚ ᱢᱚᱞᱴᱤ-ᱛᱷᱨᱮᱰ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱟᱝ ᱮᱢᱚᱜ ᱠᱟᱱᱟ, @string/msg_threads = 1 ᱥᱟᱶᱛᱮ ᱮᱱᱮᱡ ᱢᱮ + ᱛᱟᱭᱚᱢ ᱛᱮᱭᱟᱨ ᱵᱟᱝ ᱪᱟᱞᱟᱣ ᱟᱠᱟᱱᱟ + ᱱᱩᱯᱯᱟᱭᱤᱯᱷ ᱯᱷᱤᱞ ᱨᱮ ᱠᱟᱹᱢᱤ ᱚᱠᱛᱚ ᱨᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ, ᱪᱮᱫᱟᱜ ᱥᱮ ᱯᱷᱤᱞᱤᱯᱟᱭᱤᱰ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱡᱚᱱᱚᱲ ᱚᱠᱛᱚ + ᱟᱢ ᱟᱢᱟᱜ ᱰᱟᱩᱱᱞᱚᱰ ᱦᱤᱥᱛᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱥᱟᱱᱟᱢ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱰᱟᱩᱱᱞᱚᱰ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱵᱟᱲᱛᱤ ᱥᱟᱸᱣᱛᱟ + ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱵᱮᱵᱚᱦᱟᱨᱚᱜ ᱟ, ᱢᱮᱱᱠᱷᱟᱱ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ ᱟ + ᱢᱤᱫᱴᱟᱹᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱤᱫ ᱚᱠᱛᱚ ᱨᱮ ᱪᱟᱞᱟᱜᱼᱟ + ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱡᱟᱦᱟᱸ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ ᱚᱱᱟ ᱟᱢᱮᱢ ᱩᱫᱩᱜᱟ._x000D_ +\nᱡᱩᱫᱤ ᱟᱢ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱠᱴᱤᱵᱷ ᱢᱮ + ᱟᱢ ᱡᱟᱦᱟᱸ ᱨᱮ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱟᱦᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚᱭ ᱢᱮ + \'ᱥᱴᱚᱨᱮᱡᱽ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱠᱣᱟᱨᱠ\' ᱢᱤᱫ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱢᱚᱜ ᱟ + ᱚᱸᱰᱨᱚᱭᱮᱰ ᱑᱐ ᱠᱷᱚᱱ ᱮᱛᱚᱦᱚᱵ ᱠᱟᱛᱮ \'ᱥᱴᱳᱨᱮᱡ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱚᱠ\' ᱜᱮ ᱥᱚᱯᱷᱚᱨᱴ ᱟᱠᱟᱱᱟ + ᱢᱤᱫ ᱤᱱᱥᱴᱟᱱᱥ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱯᱟᱹᱨᱥᱤ + ᱥᱤᱥᱴᱮᱢ ᱰᱤᱯᱚᱞᱴ + ᱰᱩᱯᱞᱤᱠᱮᱴ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ? + ᱟᱢ ᱱᱚᱶᱟ ᱯᱷᱟᱭᱞᱤᱥᱴ ᱨᱮ ᱡᱚᱛᱚ ᱫᱩᱯᱞᱤᱠᱮᱴ ᱥᱴᱨᱤᱢ ᱠᱚ ᱦᱮᱡ ᱟᱫᱮᱭᱟᱢ ᱥᱮ? + ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱤᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱢᱟᱲᱟᱝ ᱟᱨ ᱛᱟᱭᱚᱢ ᱨᱮ ᱡᱟᱦᱟᱸ ᱵᱷᱤᱰᱤᱣ ᱠᱚ ᱧᱮᱞ ᱟᱠᱟᱱᱟ, ᱚᱱᱟ ᱠᱚ ᱪᱷᱟᱹᱲ ᱮᱢ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱟᱢ ᱠᱤ ᱜᱚᱴᱟᱵᱩᱴᱟᱹ ᱠᱟᱱᱟ? ᱱᱚᱶᱟ ᱫᱚ ᱨᱩᱣᱟᱹᱲ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + ᱱᱟᱣᱟ ᱡᱚᱢᱟᱜ ᱡᱤᱱᱤᱥ ᱠᱚ + ᱥᱮᱞᱮᱫ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱱᱟᱣ ᱟᱠᱟᱱᱟ + ᱡᱟᱦᱟᱱᱟᱜ ᱵᱟᱝ ᱜᱩᱴ ᱟᱠᱟᱱ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱯᱷᱮᱰ + ᱯᱷᱤᱰ ᱟᱯᱰᱮᱴ ᱞᱟᱦᱟᱨᱮ + ᱢᱤᱫ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱽᱥᱚᱱ ᱵᱟᱥᱠᱮᱴᱮᱰ ᱦᱩᱭᱩᱜ ᱢᱟᱬᱟᱝ ᱨᱮ ᱯᱟᱹᱪᱷᱤᱢ ᱩᱫᱩᱜ ᱠᱷᱚᱱ ᱛᱟᱭᱚᱢ ᱚᱠᱛᱚ ⁇ %s + Error loading feed ᱥᱟᱯᱲᱟᱣ + \'%s\' ᱞᱟᱹᱜᱤᱫ ᱯᱷᱤᱰ ᱞᱚᱰ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ. + ᱮᱠᱴᱚᱨᱟᱜ ᱮᱠᱟᱶᱴ ᱫᱚ ᱛᱷᱟᱯᱚᱱ ᱟᱠᱟᱱᱟ ᱾ +\nNewPipe ᱫᱚ ᱱᱚᱣᱟ ᱯᱷᱤᱰ ᱫᱚ ᱟᱵᱚ ᱦᱟᱵᱤᱡ ᱵᱟᱝ ᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ +\nᱟᱢ ᱱᱚᱣᱟ ᱪᱟᱱᱮᱨ ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱚᱪᱚᱜ ᱠᱟᱹᱢᱤᱭᱟᱢ ᱥᱮ? + ᱯᱷᱚᱥᱴ ᱯᱷᱤᱰ ᱢᱚᱰ ᱱᱚᱶᱟ ᱨᱮ ᱵᱟᱹᱲᱛᱤ ᱵᱟᱰᱟᱭ ᱮᱢ ᱮᱫᱟ ᱾ + ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜᱼᱟ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱢᱟᱜ ᱠᱷᱚᱱ ᱦᱟᱛᱟᱣ + ᱟᱭᱢᱟ ᱥᱮᱵᱟ ᱨᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱟᱹᱰᱤ ᱦᱩᱰᱤᱧ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱢᱤᱫ ᱞᱮᱠᱟᱱ ᱤᱱᱴᱮᱢᱥ ᱟᱨ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱟᱠᱟᱱ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ (ᱡᱮᱞᱮᱠᱟ ᱺ ᱚᱠᱛᱚ ᱵᱟᱝ, ᱤᱱᱴᱮᱢᱥ ᱨᱮᱱᱟᱜ ᱞᱮᱠᱷᱟ, ᱚᱞᱤᱵᱽ ᱥᱴᱮᱴᱥ ᱵᱟᱝ) ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱯᱷᱮᱥᱵᱩᱠ ᱢᱚᱰ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱟᱢᱟᱜ ᱢᱚᱱᱮ ᱨᱮ ᱡᱚᱢᱟᱜ ᱨᱮᱱᱟᱜ ᱞᱚᱰ ᱟᱹᱰᱤ ᱟᱞᱜᱟ ᱜᱮᱭᱟ? ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱥᱯᱤᱰ ᱞᱚᱰ ᱮᱱᱟᱝ ᱮᱱᱮᱡ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱢ ᱥᱤᱴᱤᱝ ᱨᱮ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱵᱩᱛᱟᱹᱢ ᱚᱞ ᱠᱟᱛᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ) +\n +\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱫᱚ ᱵᱟᱨᱭᱟ ᱯᱷᱤᱰ ᱞᱚᱰ ᱥᱴᱨᱮᱴᱡᱤ ᱮᱢᱚᱜ ᱠᱟᱱᱟ: +\n• ᱡᱚᱛᱚ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱪᱮᱱᱮᱞ ᱦᱟᱛᱟᱣ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱞᱜᱟ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱯᱩᱨᱟᱹᱣᱜᱼᱟ ᱾ +\n• ᱰᱮᱰᱤᱠᱮᱴᱮᱰ ᱥᱮᱵᱟ ᱮᱱᱰ ᱯᱚᱭᱮᱱᱴ ᱵᱮᱵᱷᱟᱨ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱦᱩᱲᱟᱹᱜ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ ᱾ +\n +\nᱵᱟᱨᱭᱟ ᱛᱟᱞᱟᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱫᱚ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱡᱮ ᱦᱩᱲᱟᱹᱜ ᱢᱤᱫᱴᱟᱹᱝ ᱜᱮ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱵᱟᱹᱱᱩᱜᱼᱟ, ᱡᱮᱞᱮᱠᱟ ᱤᱢᱮᱠᱥ ᱨᱮᱱᱟᱜ ᱚᱠᱛᱚ ᱥᱮ ᱛᱷᱚᱠ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱤᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱱᱚᱨᱢᱟᱞ ᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱵᱟᱭ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) ᱟᱨ ᱱᱚᱶᱟ ᱠᱚᱢ ᱤᱢᱮᱠᱥ ᱠᱚ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ +\n +\nᱭᱩᱴᱭᱩᱵᱽ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱥᱮᱵᱟ ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱟᱹᱱᱟᱹᱤ ᱠᱟᱱᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱱᱚᱶᱟ ᱦᱚᱨᱟ ᱟᱡᱟᱜ RSS ᱯᱷᱤᱰ ᱥᱟᱶᱛᱮ ᱮᱢᱚᱜ ᱠᱟᱱᱟ ᱾ +\n +\nᱚᱱᱟᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱟᱢ ᱪᱮᱫ ᱜᱮᱢ ᱵᱷᱟᱹᱵᱤᱛᱟ: ᱦᱩᱲᱟᱹᱜ ᱟᱨᱵᱟᱝ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱟᱛᱷᱟ ᱾ + ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ/ᱥᱚᱫᱚᱨ ᱢᱮ + ᱡᱚᱠᱷᱚᱱ ᱯᱷᱤᱰ ᱚᱯᱰᱮᱴ ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱱᱟ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱴᱮᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ ᱢᱮ ᱾ ᱡᱩᱫᱤ ᱢᱤᱫ ᱪᱮᱱᱮᱞ ᱫᱚ fast mode ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ update ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ option ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾_x000D_ +\n_x000D_ +\nᱱᱚᱶᱟ ᱫᱚ ᱢᱚᱵᱟᱤᱞ ᱣᱟᱨᱥᱚᱱ ᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱦᱩᱭᱩᱜᱼᱟ ᱾ + ᱞᱚᱠ ᱥᱠᱨᱤᱱ ᱛᱷᱚᱠ ᱟᱨ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱵᱟᱱᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱛᱚᱢᱱᱤᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱟᱢᱟᱜ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱱᱚᱶᱟ ᱮᱯ ᱵᱟᱹᱱᱩᱜ-ᱟ + ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱮᱡᱚᱨ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ %s + ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱟᱢᱟᱜ ᱫᱤᱥᱚᱢ ᱨᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾ + ᱱᱩᱶᱟ ᱫᱚ ᱢᱤᱫ ᱥᱟᱣᱚᱱᱰᱠᱞᱟᱣᱩᱰ ᱜᱳ+ ᱴᱨᱟᱠ ᱠᱟᱱᱟ, ᱟᱢᱟᱜ ᱫᱤᱥᱚᱢ ᱨᱮ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱠᱚᱢ, ᱚᱱᱟᱛᱮ ᱱᱩᱭᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱚᱣᱟ ᱴᱨᱟᱠ ᱥᱴᱨᱤᱢ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱠᱟᱱᱟ, ᱚᱱᱟᱛᱮ ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱚᱣᱟ ᱵᱟᱭ ᱰᱟᱩᱱᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱨᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱯᱮᱨᱮᱡ ᱥᱮᱞᱮᱫ ᱠᱚᱣᱟ, ᱚᱱᱟᱛᱮ ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱨᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱯᱮᱨᱮᱡ ᱥᱮᱞᱮᱫ ᱵᱟᱝ ᱠᱚ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱯᱷᱮᱭᱟᱨ ᱟᱠᱟᱱ + ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱚᱱᱠᱟᱱ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱵᱮᱵᱦᱟᱨᱚᱜᱼᱟ ᱡᱩᱫᱤ %s ᱴᱷᱤᱠᱟᱹᱱᱟ + ᱰᱟᱩᱱᱞᱚᱰ ᱮᱛᱚᱦᱚᱵ ᱟᱠᱟᱱᱟ + ᱟᱢ ᱱᱤᱛᱚᱜ ᱚᱞ ᱪᱤᱠᱤ ᱨᱮ ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ. ᱵᱟᱰᱟᱭ ᱢᱮ ᱡᱮ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱷᱤᱸᱰᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱚᱰ ᱨᱮ ᱞᱤᱱᱠ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱪᱤᱠᱤ ᱨᱮ ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱮᱱᱮᱢ ᱢᱮ + ᱯᱨᱟᱭᱵᱷᱮᱴ + ᱩᱢᱚᱨ ᱨᱮᱭᱟᱜ ᱞᱤᱢᱤᱴ + ᱯᱟᱹᱨᱥᱤ + ᱥᱚᱦᱚᱫ + ᱛᱷᱩᱢᱱᱟᱭᱤᱴ + ᱚᱯᱞᱚᱰᱟᱨ ᱟᱵᱟᱛᱟᱨ + ᱥᱟᱵ-ᱪᱟᱱᱮᱞ ᱟᱵᱟᱛᱟᱨ + ᱯᱨᱟᱭᱵᱷᱮᱴ + ᱤᱱᱴᱟᱨᱱᱟᱞ + ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱟᱨ + ᱯᱤᱱ ᱟᱠᱟᱱ ᱟᱹᱱᱤᱡ + ᱵᱮᱱᱟᱣᱤᱡᱟᱜ ᱢᱚᱱᱮ + ᱚᱯᱮᱱ ᱣᱮᱵᱥᱟᱤᱴ + ᱴᱮᱵᱽᱞᱮᱴ ᱢᱚᱰ + ᱨᱮ + ᱚᱯᱷ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱰᱤᱯᱚᱞᱴ + ᱥᱟᱱᱟᱢ ᱪᱟᱞᱟᱣ ᱢᱮ + ᱡᱟᱦᱟᱸᱱ ᱥᱴᱨᱤᱢ ᱠᱚ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰᱡᱚᱨ ᱦᱚᱛᱮᱛᱮ ᱥᱚᱯᱷᱴᱣᱮᱰ ᱵᱟᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱚᱱᱟ ᱠᱚ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱱᱚᱶᱟ ᱥᱴᱨᱤᱢ ᱨᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱚᱰᱤᱭᱳ ᱴᱨᱟᱠ ᱢᱮᱱᱟᱜ ᱛᱟᱭᱟ + ᱡᱟᱹᱥᱛᱤ ᱧᱮᱞ ᱟᱠᱟᱱᱟ + ᱢᱟᱲᱟᱝ ᱨᱮ + ᱡᱩᱫᱤ ᱟᱢᱟᱜ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱨᱮᱭᱟᱜ ᱞᱟᱹᱞᱤᱥ ᱛᱟᱦᱮᱸᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱱᱟᱣ ᱫᱚ ᱮᱥᱮᱨ ᱢᱮ, ᱡᱟᱦᱟᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱞᱟᱛᱟᱨᱼᱯᱨᱳᱭᱨᱤᱴᱤ ᱰᱤᱠᱳᱰᱟᱨ ᱨᱮ ᱨᱩᱣᱟᱹᱲ ᱦᱮᱡᱚᱜᱼᱟ ᱾ ᱱᱚᱶᱟ ᱨᱮᱭᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱠᱚ ᱵᱮᱣᱦᱟᱨ ᱚᱠᱛᱚ ᱠᱷᱚᱱ ᱵᱮᱼᱲᱤᱪᱟᱹᱲ ᱯᱟᱥᱱᱟᱶ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱳᱰᱮᱠ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱨ ᱨᱤ-ᱤᱱᱥᱴᱟᱱᱥᱟᱭᱤᱴ (re-instantiates) ᱮᱫᱟ, ᱚᱱᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱠᱳᱰᱮᱠ ᱨᱮ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱥᱩᱯᱩᱨ ᱥᱩᱯᱩᱨ ᱛᱮ ᱥᱮᱴᱮᱨᱚᱜ ᱨᱮᱱᱟᱜ ᱠᱟᱱᱟ ᱾ ᱱᱚᱶᱟ ᱥᱟᱛᱟᱢ ᱥᱟᱶᱛᱮ ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱟᱭᱢᱟ ᱚᱱᱚᱞ ᱨᱮ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱥᱤᱴᱤᱝ ᱫᱚ ᱟᱱᱰᱨᱚᱭᱮᱰ ᱖ ᱟᱨ ᱚᱱᱟ ᱠᱷᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮᱜᱮ ᱟᱯᱷᱮᱠᱴ ᱟᱠᱟᱱᱟ +\n +\nᱱᱮᱛᱟᱨᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱥᱮ ᱯᱷᱩᱞᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱡᱚᱠᱷᱚᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱮᱢ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱪᱮᱱᱟᱞ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮ ᱪᱮᱫ ᱴᱮᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞᱟ + ᱚᱯᱮᱱ ᱯᱞᱮ ᱠᱭᱩᱤ + ᱡᱚᱛᱚ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱷᱮᱡᱟ ᱢᱮ + ᱱᱮᱛᱟᱨᱟᱜ ᱫᱟᱜᱽ + ᱠᱷᱮᱞ + ᱨᱤᱯᱷᱟᱭᱤᱞ + ᱚᱠᱛᱚ + ᱨᱩᱣᱟ. + ᱰᱮᱴᱟ ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱵᱮᱵᱷᱟᱨ ᱠᱚᱢ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱪᱤᱛᱟᱹᱨ ᱠᱚᱣᱟᱜ ᱥᱤᱠᱷᱱᱟᱹᱛ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱟᱨ ᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ. ᱢᱤᱢᱮᱨᱤ ᱟᱨ ᱚᱱ-ᱰᱤᱥᱠ ᱪᱤᱛᱟᱹᱨ ᱠᱮᱪ ᱵᱟᱱᱟᱨ ⁇ %s ᱪᱷᱟᱯᱟ ᱟᱠᱟᱱᱟ + ᱞᱟᱯᱷᱟᱝ ᱥᱤᱠᱷᱱᱟ. + ᱛᱟᱞᱢᱟ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱩᱥᱩᱞ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱯᱷᱟᱭᱞᱤᱥᱴ ᱧᱩᱛᱩᱢ ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱧᱩᱛᱩᱢ ᱞᱮᱠᱟᱛᱮ ᱟᱨᱵᱟᱝ ᱵᱷᱤᱰᱤᱭᱳ URL ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱮᱠᱟᱱ ᱞᱤᱥᱴᱤ ᱞᱮᱠᱟᱛᱮ ᱴᱷᱟᱶ ᱮᱢ ᱢᱮ + URL ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣ + - %1$s: %2$s + ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱑᱖:᱙ ᱠᱷᱚᱱ ᱑:᱑ ᱟᱥᱯᱮᱠᱴ ᱚᱱᱩᱯᱟᱹᱛ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱛᱷᱚᱢᱵᱱᱮᱞ ᱜᱮᱫᱽ ᱢᱮ + ᱨᱤᱠᱟᱵᱽᱞᱤᱝ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚᱱᱴᱮᱱᱴ ᱫᱤᱥᱚᱢ + ᱯᱤᱪ + ᱦᱳᱥᱴ + ExoPlayer ᱨᱮᱭᱟᱜ ᱰᱤᱠᱚᱰᱟᱨ ᱯᱷᱮᱞᱚᱵᱮᱠ ᱯᱷᱤᱪᱚᱨ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱥᱮᱴᱤᱝ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱥᱮᱴᱤᱸᱜᱽᱥ ᱠᱚ ᱪᱟᱪᱞᱟᱣ ᱢᱮ ᱾ ᱱᱚᱶᱟ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱨᱤᱥᱴᱟᱨᱴ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱰᱟᱵᱞᱤᱝ + ᱰᱮᱥᱠᱨᱤᱯᱴᱤᱵ + ᱯᱨᱚᱜᱨᱮᱥᱤᱵᱽ ᱠᱚᱴᱮᱱᱴ (ᱱᱤᱛᱚᱜ %s) ᱨᱮ ᱞᱚᱰ ᱤᱱᱴᱟᱨᱵᱷᱮᱞ ᱨᱮᱱᱟᱜ ᱢᱟᱨᱟᱝ ᱮᱢ ᱢᱮ ᱢᱤᱫ ᱠᱚᱢ ᱵᱷᱚᱞᱮᱡᱽ ᱟᱡᱟᱜ ᱮᱛᱚᱦᱚᱵ ᱞᱚᱰᱰᱤᱝ ᱨᱮᱱᱟᱜ ᱟᱯᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱚᱥᱴᱨᱮᱞᱤᱭᱟᱱ ᱚᱰᱤᱭᱳ ᱞᱟᱹᱜᱤᱫ + ᱴᱚᱴᱷᱟᱠᱤᱭᱟ. ᱥᱩᱪᱚᱱᱟ + ᱠᱷᱚᱵᱚᱨ ᱮᱦᱚᱵ ᱢᱮ + ᱢᱩᱪᱟᱹᱫ ᱠᱷᱚᱵᱚᱨ ᱴᱷᱟᱹᱶᱠᱟᱹ + ᱤᱱᱥᱴᱮᱸᱥ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱤᱱᱥᱴᱟᱱᱥ URL ᱮᱢ ᱢᱮ + ᱚᱯᱰᱮᱴᱥ + ᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱠᱷᱮᱞᱚᱸᱰ + ᱥᱟᱦᱴᱟ + ᱩᱢᱮᱨ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱭᱩᱴᱭᱩᱵᱽ ᱨᱮᱱᱟᱜ \"Restricted Mode\" ᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ + ᱱᱮᱴᱣᱟᱨᱠ ᱵᱷᱩᱞ + ᱟᱱᱰᱨᱚᱭᱮᱰ ᱨᱮ ᱞᱤᱵᱨᱮ ᱞᱟᱭᱤᱴᱣᱮᱴ ᱥᱴᱨᱤᱢᱤᱝ + ᱴᱮᱜᱥ + ᱥᱚᱨᱠᱟᱨᱤ + ᱚᱱᱚᱞ ᱨᱮ ᱡᱟᱭᱜᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱪᱮᱱᱮᱞ ᱨᱮᱱᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ + ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱥᱟᱦᱴᱟ + ᱵᱟᱝ + ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ + ᱯᱷᱤᱞ ᱧᱩᱛᱩᱢ ᱨᱮ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱪᱤᱠᱤ ᱠᱚ + ᱪᱷᱟᱸᱪ:Copy to clipboard ᱨᱮ ᱪᱷᱟᱸᱪ:Copy to clipboard + ᱧᱩᱛᱩᱢ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱯᱷᱤᱞᱤᱢ ᱧᱩᱛᱩᱢ + ᱛᱷᱤᱭᱮᱴᱚᱨ + ᱪᱷᱟᱸᱪ + NewPipe ᱮᱯᱞᱤᱠᱮᱥᱚᱱ + ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ + ᱦᱟᱥᱤ ᱠᱚᱞᱠᱟᱛᱟ + ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱥᱮᱴ ᱵᱟᱝ, ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + © %1$s ᱛᱮ %2$s ᱞᱟᱛᱟᱨ ᱨᱮ %3$s + About & FAQ + ᱞᱟᱭᱥᱮᱱᱥ + ᱥᱮᱞᱮᱫᱚᱜ ᱢᱮ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥᱤ + ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱯᱨᱚᱡᱮᱠᱴ ᱟᱢᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱟᱹᱰᱤ ᱥᱚᱨᱮᱥ ᱜᱮᱭᱟ. ᱚᱱᱟᱛᱮ, ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ ᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱡᱟᱦᱟᱱ ᱰᱮᱴᱟ ᱵᱟᱭ ᱥᱟᱢᱟᱝᱟ ᱾_x000D_ +\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱰᱮᱴᱟ ᱠᱚ ᱟᱢ ᱠᱨᱮᱥᱚᱨ ᱨᱮᱯᱳᱨᱴ ᱚᱠᱟᱛᱮ ᱟᱢ ᱚᱠᱟ ᱞᱮᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱰᱮᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞᱟ ᱟᱨ ᱵᱚᱫᱚᱞᱟ ᱚᱱᱟ ᱵᱟᱵᱚᱫ ᱛᱮ ᱡᱚᱛᱚ ᱵᱟᱰᱟᱭ ᱮᱢᱚᱜ ᱟ᱾ + ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ + ᱞᱟᱭᱥᱮᱱᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ + ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱚᱞ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟ + ᱯᱷᱤᱞ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱᱟ ᱟᱨ ᱵᱟᱝ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱱᱚᱝᱠᱟᱱ ᱯᱷᱳᱞᱰᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱱᱚᱝᱠᱟᱱ ᱯᱷᱤᱞ/ᱥᱟᱹᱛ ᱨᱮᱱᱟᱜ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱢᱮᱴᱟᱰᱟᱴᱟ ᱞᱚᱰ ᱠᱟᱱᱟ… + ᱪᱟᱱᱮᱞ + ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱟᱢ ᱠᱷᱮᱞ ᱢᱮ + ᱡᱚᱦᱚᱜ + ᱢᱤᱫ ᱫᱷᱟᱣ + ᱯᱷᱤᱞᱤ + ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱰᱟᱭ ᱦᱚᱪᱚ + ᱥᱴᱮᱯ + ᱥᱮᱵᱟ ᱨᱮ ᱡᱚᱲᱟᱣ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ + ᱥᱮᱞᱮᱫ + ᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱡᱟᱦᱟᱸᱱᱟᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ ᱡᱚᱲᱟᱣ + ᱡᱟᱦᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ + ᱥᱩᱯᱩᱨ + ᱰᱷᱮᱨ ᱵᱟᱪᱷᱟᱣ \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index c3051300f6e..88f342a9381 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -109,14 +109,13 @@ © %1$s de %2$s cun litzèntzia %3$s Litzèntzias de tertzas partes In subra de NewPipe - Peruna aplicatzione installada pro pòdere riproduire custu documentu Majoria de sos caràteres ispetziales Lìteras e tzifras Caràtere de remplasamentu Sos caràteres non vàlidos benint remplasados cun custu valore Caràteres permìtidos in sos nùmenes de sos documentos Iscàrriga - Fatu + Fatu B\'at bisòngiu de risòlvere unu reCAPTCHA Incarca \"Fatu\" cando est risoltu Disafiu reCAPTCHA @@ -185,7 +184,7 @@ Ite est acontèssidu: Informatziones: Sinnala - Sinnala custu errore pro mèdiu de posta eletrònica + Sinnala cun sa posta eletrònica Iscusa, custu non diat dèpere èssere acontèssidu. Fruni su permissu pro l\'ammustrare in subra de àteras aplicatziones Cheres ripristinare sos valores predefinidos\? @@ -317,7 +316,7 @@ Impossìbile recuperare custu iscarrigamentu Connessione iscadida Su progressu s\'est pèrdidu, ca su documentu est istadu iscantzelladu - Perunu ispàtziu abarradu in su dispositivu + Perunu ispàtziu abarradu in su dispositivu NewPipe est istadu serradu in su mentres chi fiat traballende a su documentu Post-protzessamentu fallidu No agatadu @@ -375,7 +374,6 @@ Impostatzione de su menù de iscarrigamentu fallida Cuntenutu no a disponimentu Anàlisi de su situ web fallida - Detziframentu de sa firma URL de su vìdeu fallida No est istadu possìbile carrigare totu sas miniaduras Errore de retza Impossìbile iscarrigare in s\'ischeda SD esterna. Cheres resetare sa positzione de sa cartella de iscarrigamentu\? @@ -468,20 +466,14 @@ 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 Boga totu sos datos de sa pàgina web in sa memòria temporànea Iscantzella sos metadatos in sa memòria temporànea Memòria temporànea de sas immàgines isboidada - Istuda pro prevènnere su carrigamentu de sas miniaduras, su sarvamentu de sos datos e s\'impreu de sa memòria. Sas modìficas ant a isbodiare siat sa memòria temporànea de sa memòria siat cussa de su discu Istuda pro cuare sos cummentos Ammustra sos cummentos - Càrriga sas miniaduras Longària de s\'avantzamentu e de sa torrada in segus lestros Su moimentu inesatu permitit a su riproduidore de si mòere cara a una positzione in manera prus lestra ma prus pagu pretzisa. Su de si mòere de 5, 15 o 25 segundos non funtzionat, cun custa optzione Imprea su moimentu inesatu lestru @@ -547,7 +539,7 @@ Colende dae unu riproduidore a s\'àteru dias pòdere remplasare sa lista tua Pedi una cunfirma in antis de iscantzellare una lista Òrdine casuale - Modìfica cada atzione de notìfica inoghe in suta incarchende·la. Ischerta·nde finas a tres de ammustrare in sa notìfica cumpata impreende sas casellas de controllu a destra + Modìfica cada atzione de notìfica inoghe in suta incarchende·la. Ischerta·nde finas a tres de ammustrare in sa notìfica cumpata impreende sas casellas de controllu a destra. Sega sa miniadura ammustrada in sa notìfica dae su formadu in 16:9 a cussu 1:1 Nudda Carrighende @@ -603,13 +595,12 @@ Automàticu (tema de su dispositivu) Tema pro sa note Ammustra sos detàllios de su canale - Disabìlita sa tunnellizatzione de sos elementos multimediales si durante sa riprodutzione bi sunt ischermadas nieddas o su flussu de su vìdeu no est regulare + Disabìlita sa tunnellizatzione de sos elementos multimediales si durante sa riprodutzione bi sunt ischermadas nieddas o su flussu de su vìdeu no est regulare. Disabìlita sa tunnellizatzione de sos mèdios Internu No elencadu Privadu Pùblicu - URL de sa miniadura Istrangiadore Suportu Limba @@ -636,7 +627,6 @@ Istudadu Allutu Modalidade tauledda - Ammustra sos elementos pompiados No ammustres Calidade bassa (prus minore) Calidade arta (prus manna) @@ -662,7 +652,7 @@ Postu in lista comente imbeniente Pone in lista comente imbeniente Protzessende… Bi diat pòdere chèrrere unu pagu de tempus - Chirca agiornamentos + Chirca agiornamentos Verìfica in manera manuale pro versiones noas Controllende sos agiornamentos… NewPipe at rilevadu un\'errore, toca pro lu sinnalare @@ -682,7 +672,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 @@ -715,11 +704,125 @@ 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 Òrdina + Toca pro iscarrigare %s + Modalidade lestra + Importa o esporta iscritziones dae su menù a 3 puntos + Ses impreende s\'ùrtima versione de NewPipe + Custa optzione est a disponimentu petzi si %s est seletzionadu comente tema + Carta + Còpia in punta de billete fallida + Disativa sa miniadura permanente + Sas iscalitas in colore murru tenent giai custu elementu. + Duplicadu annantu %d borta(s) + Ignora eventos de sos butones multimediales fìsicos + Ùtile, a esempru, si ses impreende cùfias cun butones fìsicos segados + Ammustra sos flussos chi sighint + Boga sos duplicados + Bogare sos duplicados\? + Boles bogare totu sos flussos duplicados in custa iscalita\? + Ammustra/Cua flussos + 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 + %1$s %2$s + originale + dopiadu + descritivu + Imprea semper sa solutzione alternativa de s\'impostatzione de superfìtzie de s\'essida vìdeu de ExoPlayer + Custa solutzione alternativa lìberat e torrat a istantziare sos codificadores de vìdeu cando acontesset unu càmbiu de superfìtzie, in càmbiu de impostare sa superfìtzie e su codificadore in manera direta. Giai impreada dae ExoPlayer in unos cantos dispositivos cun custu problema, custa impostatziones tenet un\'efetu petzi in Android 6 e versiones prus noas. +\n +\nS\'abilitatzione de custa optzione diat pòdere prevènnere faddinas de riprodutzione cando si càmbiat su riproduidore vìdeu atuale o si colat a s\'ischermu intreu + Seletziona una rasta àudio pro riproduidores esternos + Seletziona sa rasta sonora originale in manera indipendente dae sa limba + Una rasta àudio diat dèpere èssere giai presente in custu flussu + Impostatziones pro ExoPlayer + Abìlita custa optzione si tenes problemas de initzializatzione de su decodificadore, chi colat a decodificadores a prioridade prus bassa si s\'initzializatzione de sos decodificadores primàrios fallit. Custu diat pòdere causare unu rendimentu de riprodutzione bassu cunfronta a s\'impreu de decodificadores primàrios + Calidade de s\'immàgine + Vìdeos + \? + Iscritos + Ite ischedas benint ammustradas in sas pàginas de su canale + Cumpartzi una lista de URL + Cumpartzi cun sos tìtulos + %1$s +\n%2$s + Ischedas de su canale + Curtzos + Carrighende sos metadatos… + Càmbia s\'orientamentu de s\'ischermu + Calidade bassa + Positzione de sas ischedas printzipales + Allughe/istuda s\'ischermu intreu + Recùpera sas ischedas de su canale + Avatars + Flussu imbeniente + Sa tunnellizatzione multimediale est istada disabilitada comente cunfiguratzione predefinida ca su modellu de dispositivu tuo s\'ischit chi non la suportat. + Avatars de sos suta-canales + Aberi sa lista de riprodutzione + Non càrrighes immàgines + Calidade arta + Informatziones + Cumpartzi s\'iscalita + A dae in antis + Albums + Torra in segus + Torra a reprodùere + Ischedas de recuperare cando agiornas sa fonte. Custa optzione non tenet efetu si unu canale benit agiornadu impreende sa modalidade lestra. + Cumpartzi s\'iscalita cun detàllios che a su nùmene de s\'iscalita e sos tìtulos de sos vìdeos o che a una lista simpre de URL de vìdeos + Calidade mesana + Avatars de su carrigadore + Insignas + Iscalitas + - %1$s: %2$s + Moe su seletzionadore de s\'ischeda printzipale a fundu + Perunu flussu in direta + Issèbera sa calidade de sas immàgines e si las carrigare, pro minimare s\'impreu de datos e memòria. Sas modìficas isbòidant sa memòria temporànea de sas immàgines siat in sa memòria siat in su discu — %s + Riprodue + Prus optziones + Miniaduras + Rastas + Longària + Perunu flussu + Canales + Flussu antepostu + Diretas + Modìfica cada atzione de notìfica inoghe in suta tochende·la. Sas primas tres atziones (riprodutzione/pàusa, antepostu e imbeniente) sunt impostadas dae su sistema e non si podent personalizare. + Non b\'at ispàtziu lìberu bastante in su dispositivu + Mustra de mancu + NewPipe podet chircare in automàticu versiones noas cada tantu e notificare·ti cando sunt a disponimentu. +\nLu boles abilitare? + Nono + Còpia de seguresa e riprìstinu + + %s risposta + %s rispostas + + Mustra de prus + Eja + Reseta sas impostatziones + Reseta totu sas impostatziones a sos valores predefinidos issoro + Resetende totu sas impostatziones as a iscartare totu sas impostatziones preferidas tuas e a torrare a allùghere s\'aplicatzione. +\n +\nSes seguru de bòlere sighire? + Sas impostatziones in s\'esportatzione chi benit importada impreant unu formadu vulneràbile chi est disusadu dae sa versione 0.27.0 de NewPipe. Assegura·ti chi s\'esportatzione importada bèngiat dae una fonte fidada, e preferi a impreare petzi esportatziones otentas dae NewPipe 0.27.0 o prus nou, in su benidore. Su suportu a s\'importatzione de impostatziones in custu formadu vulneràbile at a èssere luego bogadu de su totu, e dae cussu momentu sas versiones de NewPipe prus betzas no ant a èssere prus in gradu de importare impostatziones pro mèdiu de esportatziones de versiones prus noas. \ No newline at end of file diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 08c22c5f740..85f248b1189 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -4,4 +4,30 @@ ඔබ අදහස් කළේ \"%1$s\" ද\? සැකසුම් සොයන්න + බාහිර මෘදුකාංගයක් භාවිත කරන්න + Subscribe කිරීම + ටැබය තෝරන්න + භාගත කල චලන රූප මෙහි තැන්පත් ය + ආරම්භ කිරීමට අණ්වීක්ෂය ඔබන්න. + හරහා විවෘත කරන්න + බෙදාගන්න + පලකරන ලද්දේ %1$s + ස්ථාපනය කරන්න + අවලංගු කරන්න + Browser එක මගින් විවෘත කරන්න + බාගත කරන්න + බැලූ ලෙස සලකුණු කරන්න + හරි + %s සඳහා ප්‍රතිපල පෙන්වයි + Subscribe කර ඇත + ඇතුලත් කරන්න මෙයට + චලන රූප භාගත කරන ස්තානය + චලන රූප ගබඩා කිරීමට ස්තානයක් තෝරන්න + උත්පතන මාදිලියේ විවෘත කරන්න + සමඟ බෙදාගන්න + බාහිර ශ්‍රව්‍ය වාදකය භාවිතා කරන්න + සමහර විභේදනවලදී හඬ ඉවත් කරයි + ප්‍රවාහ වාදකයක් හමු නොවීය (ඔබට එය වාදනය කිරීමට VLC ස්ථාපනය කළ හැක). + ප්‍රවාහ ගොනුව බාගන්න + ප්‍රවාහ වාදකයක් හමු නොවීය. VLC ස්ථාපනය කරන්නද? \ 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 c45086ee017..6c6209d9b48 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -15,15 +15,15 @@ Použiť externý prehrávač zvuku Prevzaté video ukladať do Prevzaté video súbory sú uložené tu - Vyberte priečinok na ukladanie videí - Adresár pre stiahnuté audio - Vyberte adresár pre ukladanie audio súborov + Vyberte priečinok pre stiahnuté video + Priečinok pre stiahnuté audio + Vyberte priečinok pre audio súbory Prevzaté zvukové súbory sú uložené tu Štandardné rozlíšenie Prehrať cez Kodi Nainštalovať chýbajúcu aplikáciu Kore\? Zobraziť možnosť \"Prehrať cez Kodi\" - Zobraziť možnosť \"Prehrať cez Kodi\" + Zobrazí možnosť prehrať video cez mediálne centrum Kodi Zvuk Predvolený zvukový formát Téma @@ -39,7 +39,6 @@ Chyba Chyba siete Nemožno zobraziť všetky náhľady - Nepodarilo sa dekódovať URL videa Nemožno analyzovať webovú stránku Obsah nie je dostupný Prehrať video, dĺžka: @@ -52,7 +51,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: @@ -87,7 +86,7 @@ M B Požiadavka reCAPTCHA - Spustiť v okne + Otvoriť vo vyskakovacom okne Tieto práva sú potrebné pre \nprehrávanie v mini okne Preferovaný formát videa @@ -101,11 +100,11 @@ Vyčistiť Odstráni audio pri niektorých rozlíšeniach Zapamätať si parametre mini okna - Zapamätať si posledné nastavenie veľkosti a pozície mini okna + Zapamätá si posledné nastavenie veľkosti a pozície vyskakovacieho okna Hľadať návrhy Vyberte návrhy, ktoré sa majú zobrazovať pri vyhľadávaní Najlepšie rozlíšenie - Odber + Odoberať Odoberané Odber zrušený Nemožno zmeniť odber @@ -113,16 +112,16 @@ Odbery Čo je nové Hľadať v histórií - Hľadané výrazy ukladať lokálne + Hľadané výrazy uloží lokálne História pozretí - Ukladať históriu pozretých videí + Uloží históriu pozretých videí Pokračovať v prehrávaní - Pokračovať po prerušeniach (napr. telefonát) + Pokračouje v prehrávaní po prerušení (napr. po telefonáte) NewPipe oznámenia Notifikácie NewPipe prehrávača Preberanie Povolené znaky v názvoch súborov - Neplatné znaky budú nahradené týmito znakmi + Neplatné znaky budú nahradené znakmi s týmto významom Náhradný znak Písmená a číslice Väčšina špeciálnych znakov @@ -164,12 +163,12 @@ %s videí Nebol nájdený žiadny prehrávač pre stream (môžete si nainštalovať napr. VLC). - Stiahnuť súbor stream + Stiahnuť súbor streamu Zobraziť info Uložené zoznamy Pridať do Zobrazovať tip \"Pridať podržaním\" - Zobraziť tip pre stlačenie tlačidiel \"Pozadie\" alebo \"V okne\" v detailoch videa + Zobrazí tip pri stlačení tlačidiel pozadia alebo vyskakovacieho okna videa \"Podrobnosti:\" Predvolený obsah pre krajinu Prehrať všetko Vždy @@ -180,8 +179,8 @@ Prepnúť na Video Importovať databázu Exportovať databázu - Prepíše aktuálnu históriu, odbery, zoznamy skladieb a (voliteľne aj) nastavenia - Exportovať históriu, odbery, zoznamy skladieb a nastavenia + Prepíše aktuálnu históriu, odbery, zoznamy skladieb a (voliteľne) nastavenia + Exportuje históriu, odbery, zoznamy skladieb a nastavenia Nepodarilo sa prehrať tento stream Pri prehrávaní došlo k chybe a nemožno pokračovať Zotavovanie po chybe v prehrávaní @@ -246,11 +245,9 @@ Zväčšiť Používať rýchly posun Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou. Posun o 5, 15 alebo 25 sekúnd v tomto prípade nie je možný - Načítanie miniatúr - Vypnutím tejto funkcie sa nebudú vytvárať miniatúry a tým sa ušetrí miesto a pamäť. Zmena nastavení spôsobuje vyčistenie vyrovnávacej pamäte Vyrovnávacia pamäť obrázkov vymazaná Vymazať metadáta uložené vo vyrovnávacej pamäti - Odstrániť všetky údaje webových stránok vo vyrovnávacej pamäti + Odstráni všetky údaje webových stránok vo vyrovnávacej pamäti Vyrovnávacia pamäť metadát bola vymazaná Automaticky zaradiť ďalší stream Končiaci (neopakujúci sa) zoznam prehrávania bude pokračovať súvisiacim streamom @@ -262,15 +259,14 @@ Názov súboru nesme byť prázdny Nastala chyba: %1$s Žiadne streamy nie sú k dispozícii na prevzatie - Prehrávač pre daný typ súboru nebol nájdený Preferovaná akcia \'otvoriť\' Predvolená akcia pri otváraní obsahu — %s Automaticky vygenerované Titulky Upravte mierku textu titulkov prehrávača a štýly pozadia. Vyžaduje sa reštart aplikácie - Monitorovanie pretečenia pamäte môže spôsobiť, že aplikácia nebude reagovať + Monitorovanie úniku pamäte môže spôsobiť, že aplikácia nebude reagovať Nahlásiť mimo-cyklické chyby - Vynútiť hlásenie výnimiek nedoručiteľných Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení + Vynúti hlásenie nedoručiteľných výnimiek Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení Import Importovať z Exportovať do @@ -302,13 +298,13 @@ Ovládanie rýchlosti prehrávania Rýchlosť Výška - Spraviť nezavislími (môže spôsobovať skreslenie) + Spraviť nezávislými (môže spôsobovať skreslenie) Vymazať históriu pozretí Odstráni históriu a pozície prehrávaných streamov Vymazať celú históriu pozretí\? História pozretí bola vymazaná Vymazať históriu vyhľadávania - Vymaže históriu vyhľadávania kľúčových slov + Odstráni históriu vyhľadávania kľúčových slov Vymazať celú históriu vyhľadávania\? História vyhľadávaní bola vymazaná 1 položka bola vymazaná. @@ -332,16 +328,12 @@ Krok Vynulovať Minimalizovať pri prepnutí aplikácie - Akcia pri prepnutí na inú aplikáciu z hlavného prehrávača videa — %s + Akcia pri prepnutí do inej aplikácie z hlavného prehrávača videa - %s Nič Prehrávať na pozadí 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ý @@ -353,7 +345,7 @@ Obnoviť predvolené nastavenia Chcete obnoviť predvolené hodnoty\? Počet odberateľov nie je k dispozícii - Karty, ktoré sa zobrazujú na hlavnej stránke + Aké karty sa zobrazujú na hlavnej stránke Konferencie Aktualizácie Zobrazí sa výzva na aktualizáciu aplikácie, keď je k dispozícii nová verzia @@ -387,7 +379,7 @@ Post-spracovanie zlyhalo Stop Maximum opakovaní - Maximálny počet pokusov pred zrušením stiahnutia + Maximálny počet pokusov pred zrušením sťahovania Pozastaviť pri prechode na mobilné dáta Je to užitočné pri prechode na mobilné dáta, niektoré sťahovania však nemožno pozastaviť Zobraziť komentáre @@ -397,16 +389,16 @@ Nemožno načítať komentáre Zatvoriť Obnoviť prehrávanie - Obnovenie poslednej pozície prehrávania + Obnoví poslednú pozíciu prehrávania Poradie v zoznamoch - Zobraziť indikátory polohy prehrávania v zoznamoch + Zobrazí indikátory pozície prehrávania v zoznamoch Vymazať údaje Pozície prehrávania boli odstránené Súbor bol presunutý alebo odstránený súbor nemožno prepísať Súbor s rovnakým názvom už čaká na stiahnutie NewPipe bol ukončený počas spracovávania súboru - Máš plnú pamäť + V zariadení už nie je voľné miesto Nemožno pokračovať, súbor bol vymazaný Spojenie vypršalo Chcete vymazať históriu sťahovania alebo odstrániť všetky stiahnuté súbory\? @@ -459,7 +451,7 @@ Jazyk aplikácie Predvolený Vyrieš a stlač \"Hotovo\" - Hotovo + Hotovo Videá Pre obmedzenie ExoPlayera bolo prehľadávania nastavené na %d sekúnd Stlmiť @@ -485,7 +477,7 @@ %d dní Skupiny kanálov - Aktualizované: %s + Zdroj naposledy aktualizovaný: %s Nenačítané: %d Načítavanie zdroja… Spracovávanie zdroja… @@ -501,7 +493,7 @@ Nová Zdroj Interval obnovy zdroja - Čas po ktorom sa kontrola odberu považuje za zastaralú — %s + Čas od poslednej aktualizácie, kedy sa odber považuje za neaktuálny - %s Vždy aktualizovať Načítať z vyhradeného zdroja, ak je k dispozícii Služba je dostupná len pre určité zdroje, zvyčajne je rýchlejšia ale môže vrátiť obmedzený počet položiek alebo neúplné informácie (napr. dĺžka, typ, status) @@ -547,7 +539,7 @@ Zobraziť iba nezoskupené odbery Nikdy Iba na WiFi - Spustiť automatické prehrávanie — %s + Spustí automatické prehrávanie - %s Prehrať zoznam Zatiaľ bez záložiek zoznamu Vyberte zoznam skladieb @@ -555,38 +547,38 @@ Nemožno rozpoznať URL. Otvoriť pomocou inej aplikácie\? Automatický rad Zoznam aktuálneho prehrávača bude prepísaný - Prepnutie prehrávača môže vymazať zoznam + Prepnutie z jedného prehrávača na druhý môže nahradiť vaše poradie Vyžadovať povolenie pred vyčistením zoznamu Nič Bufferuje Náhodné Opakovať V kompaktnom oznámení môžete vybrať najviac tri akcie, ktoré sa majú zobraziť! - Všetky nasledovné upozornenia môžete upraviť poklepaním. Tri z nich môžete vybrať a tieto sa budú zobrazovať v kompaktnom oznámení + Všetky nasledovné oznámenia môžete upraviť poklepaním. Tri z nich môžete vybrať a tieto sa budú zobrazovať v kompaktnom oznámení. Akčné tlačidlo päť Akčné tlačidlo štyri Akčné tlačidlo tri Akčné tlačidlo dva Akčné tlačidlo jedna - Orezať pomer strán videa zobrazovaného v miniatúre z 16:9 na 1:1 + Oreže miniatúru videa zobrazenej v oznámení z pomeru strán 16:9 na 1:1 Orezať pomer strán miniatúry na 1: 1 Zobraziť memory leaks Zaradené do poradia Zaradiť do poradia - Vymazať cookies, ktoré NewPipe ukladá, keď vyriešite reCAPTCHA + Vymaže cookies, ktoré NewPipe ukladá, keď vyriešite reCAPTCHA reCAPTCHA cookies boli vymazané Vymazať cookies reCAPTCHA YouTube poskytuje \"Obmedzený režim\", ktorý skrýva potenciálny obsah pre dospelých - Zobraziť obsah, ktorý je možno nevhodný pre deti, pretože má vekovú hranicu (napríklad 18+) - Nechajte Android, aby prispôsobil farbu upozornenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach) + Zobrazí obsah, ktorý je pravdepodobne nevhodný pre deti, pretože má vekové obmedzenie (napríklad 18+) + Nechajte Android, aby prispôsobil farbu oznámenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach) Farby upozornení Zobrazovať miniatúru - Používať miniatúru ako pozadie pri uzamknutej obrazovke a v upozorneniach + Použije miniatúru pre pozadie uzamknutej obrazovke a oznámenia Počítanie hash - Upozornenie pri generovaní hash z názu videa + Oznámenia o priebehu hašovania videa Oznámenie o hashovaní videa Nedávne - Vypnite, pokiaľ nechcete zobrazovať meta informácie ako autor streamu, obsah streamu alebo vyhľadávanie + Vypnutím skryjete metainformačné polia s ďalšími informáciami o autorovi streamu, obsahu streamu alebo požiadavke na vyhľadávanie Zobrazovať meta informácie Kapitoly Popis @@ -612,13 +604,12 @@ Najlepšie Zobraziť podrobnosti kanála Vyrieš - Nočná Téma - Ak vám video pri prehrávaní seká alebo sa zobrazuje čierna obrazovka zakážte tunelovanie médií + Nočná téma + Ak sa video pri prehrávaní seká alebo sa objaví čierna obrazovka, vypnite tunelovanie médií. Zakázať tunelovanie médií Interné Súkromné Nezaradené - URL miniatúry Verejné Hostiteľ Podpora @@ -640,15 +631,14 @@ \nChcete sa odhlásiť z odberu tohto kanála\? Nemožno načítať informačný kanál \'%s\'. Chyba pri načítaní kanála - \'Storage Access Framework\' je podporovaný len od Androidu 10 a vyššie - Pri každom sťahovaní sa zobrazí výzva kam uložiť súbor + Od Androidu 10 je podporovaný len \'Storage Access Framework\' + Pri každom sťahovaní sa zobrazí výzva, kam uložiť súbor Nie je nastavený adresár na sťahovanie, nastavte ho teraz Označiť ako videné Vypnuté Zapnuté Režim tabletu Obľúbené autorom - Zobrazovať pozreté položky %1$s sťahovanie zmazané %1$s sťahovania zmazané @@ -663,18 +653,18 @@ Nízka kvalita (menšie) Vysoká kvalita (väčšie) Náhľad miniatúry pri vyhľadávaní - Zobraziť farebné stužky Picassa na obrázkoch podľa ich zdroja: červená pre sieť, modrá pre disk a zelená pre pamäť + Zobrazí farebné pásiky Picasso na obrázkoch podľa ich zdroja: červený pre sieť, modrý pre disk a zelený pre pamäť Zobraziť indikátory obrázka Potiahnutím vymazať Komentáre sú zakázané - Pri zamknutej auto-rotácií nespúšťať videá v mini prehrávači, ale prepnúť sa priamo do režimu celej obrazovky. Prístup k mini prehrávaču bude po ukončení režimu celej obrazovky + Ak je automatické otáčanie zablokované, nespustí videá v miniprehrávači, ale prepne sa do celoobrazovkového režimu. Do miniprehrávača sa dostanete po ukončení režimu celej obrazovky Hlavný prehrávač na celej obrazovke Návrhy vzdialeného vyhľadávania Miestne návrhy vyhľadávania Pridať do zoznamu Ďaľší v poradí Spracovávanie... môže to chvíľku trvať - Skontrolovať aktualizácie + Skontrolovať aktualizácie Ručne skontrolovať nové verzie Kontrolujú sa aktualizácie… Nové položky informačného kanála @@ -694,19 +684,18 @@ 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\? Upozornenia sú vypnuté Upozornenie z prehrávača - Nastavte notifikáciu aktuálneho prehrávania + Nastavte oznámenie aktuálneho streamu prehrávania Je vyžadované pripojenie na internet Začali ste odoberať tento kanál , Zapnúť všetko Nové streamy - Upozornenia na nové streamy v odberoch + Oznámenia o nových streamoch v odberoch %s nový stream %s nové streamy @@ -714,7 +703,7 @@ Skontrolovať nové streamy Upozornenia na nové streamy - Upozorniť na nové streamy z odberov + Upozorní na nové streamy z odberov Akákoľvek sieť Dostávať upozornenia Poltón @@ -728,11 +717,127 @@ 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ť Ak máte problémy s používaním aplikácie, určite si prečítajte tieto odpovede na časté otázky! + Vypnutie trvalého náhľadu + Kopírovanie do schránky zlyhalo + Zoznamy zobrazené šedou farbou už obsahujú danú položku. + Karta + Dotykom stiahnite %s + Duplikát bol pridaný %d-krát + Používate najnovšiu verziu NewPipe + 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 + Vyberte gesto pre pravú polovicu obrazovky prehrávača + Akcia gesta vpravo + Vyberte gesto pre ľavú polovicu obrazovky prehrávača + 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čidlá na slúchadlách + Ignorovať fyzické tlačidlá + Zmení veľkosť 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 + Vyberte pôvodnú zvukovú stopu bez ohľadu na 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 niektorých nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je potrebné reštartovať prehrávač + 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žiť funkciu záložného dekodéra prehrávača ExoPlayer + Vždy použiť nastavenia výstupu videa ExoPlayera + %1$s %2$s + povodná + dabovaná + Vyberte zvukovú stopu s popisom pre osoby so zrakovým postihnutím, ak je k dispozícii + Zobrazovať/Skrývať streamy + Nastavenia ExoPlayer + Toto riešenie uvoľní a znovu nastaví videokodeky pri zmene rozhrania namiesto priameho nastavenia rozhrania kodeku. Nastavenie už používa ExoPlayer na niektorých zariadeniach s týmto problémom a týka sa len systému Android 6 a vyššie +\n +\nPovolením tejto možnosti môžete zabrániť chybám prehrávania pri zmene aktuálneho prehrávača videa alebo pri prepnutí do režimu celej obrazovky + popisná + Videá + Odberatelia + Aké karty sa zobrazujú na stránkach kanála + Karty kanálov + Krátke + Načítavanie metadát… + Prepnúť orientáciu obrazovky + Poloha hlavných kariet + Prepnúť na celú obrazovku + Načítať karty kanála + Ďalší stream + Vaše zariadenie nepodporuje tunelovanie medií a preto bolo tunelovanie medií zakázané. + Otvoriť zoznam prehrávania + O kanále + Dopredu + Albumy + Dozadu + Opäť prehrať + Karty, ktoré sa majú načítať pri aktualizácii informačného kanála. Táto možnosť nemá žiadny účinok, ak je kanál aktualizovaný pomocou rýchleho režimu. + Zoznamy skladieb + Presunie výber hlavnej karty do spodnej časti + Žiadne živé prenosy + Prehrať + Ďalšie možnosti + Stopy + Dĺžka + Žiadne videá + Kanály + Predchádzajúci stream + Naživo + Kvalita obrázkov + \? + Nízka kvalita + Avatary + Nenačítavať obrázky + Vysoká kvalita + Zdieľať playlist + Stredná kvalita + Bannery + Vyberte kvalitu obrázkov a či sa majú obrázky vôbec načítať, aby sa znížila spotreba dát a pamäte. Zmeny vymažú vyrovnávaciu pamäť obrázkov v pamäti a na disku - %s + Zobraziť viac + Zobraziť menej + Každú akciu oznámenia upravte poklepaním. Prvé tri akcie (prehrať/pozastaviť, predchádzajúce, ďalšie) sú nastavené systémom a nie je možné ich prispôsobiť. + Náhľady + Avatary uploadera + Sub-kanálové avatary + Zdieľať s názvami + Zdieľať URL playlistu + + %s odpoveď + %s odpovede + %s odpovedí + + Zdieľajte playlist s podrobnosťami, ako je jeho názov a názvy videí, alebo ako jednoduchý zoznam URL adries videí + - %1$s: %2$s + %1$s +\n%2$s + Nedostatok voľného miesta v zariadení + Obnoví všetky nastavenia na pôvodné hodnoty + Obnoviť nastavenia + Záloha a obnovenie + Obnovením nastavení sa zrušia všetky preferované nastavenia a aplikácia sa reštartuje. +\n +\nSte si istí, že chcete pokračovať? + Nie + Áno + NewPipe môže z času na čas automaticky kontrolovať nové verzie a upozorniť vás, keď budú k dispozícii. +\nChcete to povoliť? + Nastavenia v importovanom exporte používajú zraniteľný formát, ktorý bol od verzie NewPipe 0.27.0 zrušený. Uistite sa, že importovaný export pochádza z dôveryhodného zdroja, a v budúcnosti radšej používajte len exporty získané z verzie NewPipe 0.27.0 alebo novšej. Podpora importu nastavení v tomto zraniteľnom formáte bude čoskoro úplne odstránená a potom už staré verzie programu NewPipe nebudú môcť importovať nastavenia exportov z nových verzií. + sekundárny \ 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 ea2a9dbb5a5..b0fcec406c9 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -43,10 +43,9 @@ Izberite mapo za prenos avdio datotek Napaka Vseh sličic videov ni mogoče naložiti - Ni mogoče odšifrirati podpisa naslova URL videa - Ni mogoče razčleniti spletišča. + Ni mogoče razčleniti spletišča Vsebina ni na voljo - Ni mogoče nastaviti menija za prejem datotek. + Ni mogoče nastaviti menija za prejem datotek Vsebina Pokaži starostno omejeno vsebino Do te napake naj ne bi prišlo. @@ -61,7 +60,7 @@ Poskusi znova Opomba (v angleščini): v živo - Začnite z iskanjem + Pritisnite lupo in začnite z iskanjem. Začni Premor Izbriši @@ -72,16 +71,16 @@ Prejemanje Podrobnosti Počakajte … - Kopirano v odložišče. + Kopirano v odložišče Izberite mapo za prejem V redu Prejemi Prejemi Poročilo o napaki - Program se je sesul! + Program se je sesul Izziv reCAPTCHA Zahtevan izziv reCAPTCHA - Predmet:\\nZahteva:\\nJezik vsebine:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS: + Predmet:\\nZahteva:\\nJezik vsebine:\\nDržava vsebine:\\nJezik aplikacije:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS: Črna Vse k @@ -144,7 +143,7 @@ Zgodovina in predpomnilnik Razveljavi Ni rezultatov iskanja - Tu ni ničesar! + Tu ni ničesar, razen čričkov Ni naročnikov %s naročnik @@ -198,7 +197,6 @@ Ustvari Opusti Preimenuj - Naloži sličice Jezik aplikacije Uporabi SAF Vprašaj kam shraniti @@ -213,7 +211,7 @@ Počisti zgodovino prenosa Ni mogoče povrniti prenos Napredek je izgubljen, ker je bila datoteka izbrisana - Ni več prostora v vaši napravi + Ni več prostora v vaši napravi NewPipe se je zaprl medtem ko je delal z datoteko Ni najden Strežnik ne pošilja informacij @@ -255,7 +253,7 @@ Najbolj všečkan Dodano nedolgo nazaj Lokalno - Jezik se bo spremenil po ponovnem zagonu aplikacije. + Jezik bo spremenjen ob ponovnem zagonu aplikacije Ni mogoče naložiti komentarjev Ni veljavne ZIP datoteke Uvoženo @@ -266,7 +264,7 @@ Preberi pravilnik zasebnosti NewPipe-ovi pravilnik zasebnosti Obiščite spletno mesto od NewPipe za več informacij in novic. - Končano + Končano Ni komantarjev Nobeden ne posluša Nobeden ne gleda @@ -274,7 +272,7 @@ Ni take mape Datoteka premaknjena ali izbrisana Prenašanje na zunanjo SD kartico ni mogoče. Resetiram lokacijo mape z prenosi\? - Vsa zgodovina gledanja izbrisana. + Zgodovina gledanja izbrisana Izbrišem vso zgodovino gledanja\? Izbriši zgodovino gledanja Izvozi zgodovino, naročnine, sezname predvajanj in nastavitve @@ -293,12 +291,12 @@ Izbriši shranjene metapodatke Predshramba za slike je bila izbrisana Prikaži komentarje - Izberi Zavihek + Izberi zavihek Odjava Predvajalnika pretoka ni mogoče najti (namestite lahko VLC program za predvajanje). Predvajalnik v ozadju Želite uvoziti tudi nastavite\? - Zgodovina brskanja izbrisana. + Zgodovina iskanja izbrisana Izbrišem vso zgodovino brskanja\? Izbriši zgodovino brskanja Izbriši piškotke, ki jih NewPipe shrani, ko rešite reCAPTCHA @@ -309,7 +307,6 @@ Predpomnjeni metapodatki so bili odstranjeni Prikaži meta informacije Onemogoči da se ustavi prikazovanje komentarjev - Izklopite, če želite preprečiti nalaganje sličic, s tem bo varčeval na podatkih in uporabi spomina. Spremembe bodo izbrisale predpomnilnik v spominu in na disku. Dejavna vrsta bo zamenjana Preklop na drugi predvajanik lahko zamenja vašo čakalno vrsto Vprašaj za potrditev pred čiščenjem vrste @@ -320,15 +317,15 @@ Naključno Ponovi Izberete lahko največ 3 dejanja, ki se bodo prikazala v kompaktnem obvestilu! - Uredite vsako obvestilo z klikom na obvestilo. Izberite do 3 obvestila, ki se bodo prikazala v kompaktnem obvestilu z uporabo potrditvenega polja na desni. + Uredite vsako dejanje obvestila z klikom na posamezno dejanje. Z uporabo potrditvenega polja na desni izberite do 3 dejanja obvestil, ki se bodo prikazala v kompaktnem obvestilu Gumb za peto dejanje Gumb za četrto dejanje Gumb za tretje dejanje Gumb za drugo dejanje Gumb za prvo dejanje - Povečaj sličico videa, ki je prikazana v obvestilu iz razmerja 16:9 v razmerje 1:1 (lahko pride do popačenja) + Povečaj sličico videa, ki je prikazana v obvestilu iz razmerja 16:9 v razmerje 1:1 Zruši aplikacijo - Spremeni velikost besedila podnapisov in stil ozadja v predvajalniku. Zahteva ponovni zagon aplikacije, da učinkuje. + Spremeni velikost besedila podnapisov in slog ozadja v predvajalniku. Zahteva ponovni zagon aplikacije, da učinkuje Podnapisi Samodejno ustvarjeno Prilagodi zaslonu @@ -362,7 +359,6 @@ \nPolitika zasebnosti NewPipe-a podrobno pojasnjuje, kateri podatki so poslani in shranjeni, ko pošljete poročilo o zrušitvi. Pomagaj NewPipe razvijajo prostovoljci, ki preživljajo svoj prosti čas, da vam prinašajo najboljšo uporabniško izkušnjo. Pomagajte razvijalcem pri izdelavi še boljšega NewPipe-a medtem ko uživajo skodelico kave. - Za predvajanje te datoteke ni nameščena nobena aplikacija Pritisni \"končano\" ko je rešena Odstranjen 1 element. Izračun zgoščevalne funkcije je v teku @@ -401,7 +397,7 @@ Prišlo je do neobnovljive napake v predvajalniku Zunanja shramba ni na voljo Izbriše zgodovino ključnih besed za iskanje - Položaji predvajalnika so bili izbrisani. + Položaji predvajalnika so bili izbrisani Ali želite izbrisati vse položaje predvajalnika\? Izbriše vse položaje predvajalnika Izbriši položaje predvajalnika @@ -435,10 +431,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 @@ -455,7 +447,7 @@ Brez omejitev Zavrni Korak - yourID, soundcloud.com/yourid + tvojID, soundcloud.com/tvojid Stran kiosk Kateri zavihki so prikazani na domači strani Rešiti @@ -464,4 +456,8 @@ Prikaži puščanje pomnilnika Prikaži detajle kanala Nočna tema + Povečaj sličico na razmerje 1:1 + Označi kot že ogledano + Uporabite hitro nenatančno iskanje + Sesuj predvajalnik \ No newline at end of file diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 530cb465d59..e37c3a36d31 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -183,14 +183,13 @@ © %1$s sameeyay %2$s ayagoo raacaya %3$s Laysimada gacanta sadexaad Kusaabsan NewPipe - Shaygan app fura kuuguma jiro Xarfaha gaarka ah kuwa ugu badan Xarfaha iyo godadka Xarafka lagu baddalayo Xarfaha aan la taageerin waxaa lagu bdadali midkan Xarafyada magaca shayga loo ogol yahay Dajinta - Dhameeyay + Dhameeyay Tijaabada reCAPTCHA ayaa la codsaday Taabo \"Dhameeyay\" ✅ markaad xaliso Tijaabada reCAPTCHA @@ -290,7 +289,6 @@ Lama soo kicin karo tusmada dajinta shaygan lama heli karo Lama furi karo website-ka - Lama baddali karo sixiixa tixraaca muuqaalka Lama soo wada kicin karo galalkoo dhan khalad xaga khadka ah Ku dajinta kaydka dibadda (mimoriga) suurtogal ma aha. Dib u fadhiisi khaanada wax lagu dajiyo\? @@ -395,10 +393,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 @@ -406,10 +400,8 @@ Tirtir waxyaabaha K/G ah ee boga website-ka Tirtir faahfaahinada yaryar kaydkii kumeelgaadhka ahaa ee sawirka waa la tirtiray - Xidh si aad u joojiso soo bandhiga galka muuqaalada, adigoo yaraynaya isticmalka khadka iyo maskaxda aalada. Wax ka baddalkan wuxuu nadiifin doonaa waxa kaydka hore iyo ka caadiga ah kumeelgaadh ahaan ugu jira Xidh si aad uqariso faallooyinka Tus faallooyinka - Soodhig galalka Hormada daareha hadda wax shidaya waa la baddali doonaa Kala baddalka daareha waxay badali kartaa hormada sidaas darteed waydii in la xaqiijiyo intaan hormada la tirtirin Xaqiijinta tirtirka hormada @@ -528,7 +520,7 @@ Dajintan lama hagaajin karo Ku xidhidii ayaa wakhtigii ka dhacay Hawshii socotay way kala kacday, sababtoo ah shayga waa lala saaray - Meel banaan oo wax lagu kaydiyo aalaada kuma hadhin + Meel banaan oo wax lagu kaydiyo aalaada kuma hadhin NewPipe waxaa la xidhay asagoo fayl ka shaqaynaya Habayntii way guuldareystay Lama helin @@ -609,7 +601,6 @@ Gaar ah Aan liistada kujirin Lawada arko - Tixraaca galka Martigaliye Taageero Luuqada @@ -623,7 +614,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 073800b765c..b0fabfdf90c 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -18,7 +18,6 @@ Luaj me Kodi Audio E zezë - Ngarko pamjet miniaturë Sugjerimet e kërkimit Të shikuarat Ruaji videot e shikuara @@ -83,7 +82,7 @@ Nuk mund të rikuperohet ky shkarkim Koha e lidhjes skadoi Progresi humbi, pasi skedari është fshirë - Nuk ka vend bosh në pajisje + Nuk ka vend bosh në pajisje NewPipe u mbyll ndërkohë që po punohej mbi skedarin Procesimi dështoi Nuk u gjet @@ -250,14 +249,13 @@ © %1$s nga %2$s nën %3$s Licensat e palëve të treta Rreth NewPipe - Nuk ka aplikacion të instaluar që mund ta luajë këtë skedar Shumica e karaktereve speciale Shkronjat dhe numrat Karakteri zëvendësues Karakteret e palejuara zëvendësohen me këtë vlerë Karakteret e lejuara në emrat e skedarëve Shkarko - U bë + U bë sfida reCAPTCHA u kërkua Shtyp \"U bë\" kur ta zgjidhni sfida reCAPTCHA @@ -403,7 +401,6 @@ Nuk u arrit të vendosej menuja e shkarkimeve Përmbajtja e padisponueshme Nuk u arrit të analizohej faqja - Nuk u arrit të dekriptohej firma e URL së videos Nuk u mundën të ngarkoheshin të gjitha pamjet statike Problem rrjeti Shkarkimi në kartën SD të jashtme nuk ishte i mundur. Doni të rivendosni vendndodhjen e dosjes së shkarkimeve\? @@ -483,16 +480,11 @@ 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 Boshatis depon e të gjitha të dhënave të faqeve të internetit Boshatis depon e të dhënave meta - Fikeni për të ndaluar shfaqjen e pamjeve statike, duke kursyer internet dhe memorje. Ndryshimet boshatisin depon e imazheve në memorje dhe në disk Depoja e imazheve u boshatis Fikeni për të fshehur komentet Shfaq komentet @@ -557,7 +549,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 @@ -594,7 +586,6 @@ Private E palistuar Publike - URL e pamjes statike Mundësuesi Mbështetje Gjuha @@ -616,7 +607,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. @@ -643,4 +633,48 @@ Parapamje e pamjes miniaturë të lëvizësit të kohës Komentet janë të ç\'aktivizuara Shëno si të parë + Drita + Volumi + Njoftohu + Qualitet i panjohur + Cilidi rrjet + Kartë + Panjohur + Format i panjohur + Hiq duplikatet\? + Së shpejti + Te shikuara në plotësi + Gjysmë të shikuar + origjinal + dubluar + përshkruese + Hiq duplikatet + Modi i shpejtë + Rradhit + Live + Albumet + Luaj + Zgjatja + Rikthe + Para + Nuk ka streams + Audio: %s + Avataret + Banerat + Kanalet + Videot + \? + Ri-luaj + Po + Jo + Rreth + Streami i rradhes + Njoftimet + Sugjerime jo-lokale për kërkim + Shikoje në faqen ueb + Pyetjet më të shpeshta + Prefero audion origjinale + Prefero audio përshkruese + Asnjë + Sugjerime lokale për kërkim \ No newline at end of file diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e87498e537a..2272205562d 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,148 +1,147 @@ Објављено %1$s - Нема плејера токова. Инсталирати ВЛЦ\? + Нема плејера стримова. Инсталирати VLC\? Инсталирај Откажи - Отвори у претраживачу - Подели + Отвори у прегледачу + Дели Преузми - Тражи + Претрага Подешавања Да ли сте мислили: „%1$s“\? - Подели помоћу - Фасцикла за видео - Преузети видео записи се чувају овде - Избор фасцикле за преузимање видеа + Делите помоћу + Фолдер за преузимање видео снимака + Преузети видео снимци се чувају овде + Изаберите фолдер за преузимање видео снимака Подразумевана резолуција - Пусти помоћу Кодија - Инсталирати даљински за Коди\? - Прикажи „Пусти помоћу Кодија“ - Приказ опције за пуштање видеа у Коди медија центру - Аудио - Подразумевани формат звука + Пусти помоћу Kodi-ја + Инсталирати апликацију Kore која недостаје\? + Прикажи опцију „Пусти помоћу Kodi-ја“ + Прикажите опцију за пуштање видео снимака преко Kodi медија центра + Аудио снимак + Подразумевани формат аудио снимка Преузимање - УРЛ није подржан - Прикажи „следећи“ и „слични“ видео + URL адреса није подржана + Прикажи „следеће“ и „сличне“ видео снимке Подразумевани језик садржаја - Видео и аудио - Пусти видео, трајање: + Видео и аудио снимци + Пусти видео снимак, трајање: Аватар пошиљаоца Несвиђања Свиђања - Користи спољашњи видео плејер - Користи спољашњи аудио плејер - Пуштам у позадини + Користи спољни плејер видео снимака + Користи спољни плејер аудио снимака + Пуштање у позадини Тема - тамна - светла + Тамна + Светла Изглед - Грешка мреже - Фасцикла за аудио - Избор фасцикле за аудио фајлове - Преузети аудио записи се чувају овде + Мрежна грешка + Фолдер за преузимање аудио снимака + Изаберите фолдер за преузимање аудио снимака + Преузети аудио снимци се чувају овде Грешка - Не могу да учитам све сличице - Не могу да дешифрујем потпис видео урл-а - Не могу да рашчланим веб-сајт + Није могуће учитати све сличице + Није могуће рашчланити веб-сајт Садржај је недоступан Садржај - Прикажи старосно-ограничени садржај - Не могу да поставим мени преузимања - Нажалост, ово не би требало да се деси. - Пријавите ову грешку е-поштом + Прикажи старосно ограничени садржај + Није могуће подесити мени преузимања + Извините, ово није требало да се деси. + Пријави путем имејла Извините, нешто није у реду. Пријави - Подаци: + Информације: Шта се десило: Ваш коментар (на енглеском): Детаљи: - Видео - Аудио + Видео снимак + Аудио снимак Покушај поново Уживо - Кликните на лупу да започнете. + Додирните лупу да бисте започели. Почни Паузирај - Обриши + Избриши Контролна сума У реду Назив фајла Нити Грешка - Њупајп преузима - Тапните за детаље + NewPipe преузима + Додирните за детаље Сачекајте… Копирано у привремену меморију - Одредите фасциклу за преузимање касније у поставкама + Одредите фолдер за преузимање касније у подешавањима Преузимања Преузимања Извештај о грешци - Програм се срушио - Шта:\\nЗахтев:\\nЈезик садржаја:\\nЗемља садржаја:\\nЈезик апликације:\\nУслуга:\\nГМТ време:\\nПакет:\\nИздање:\\nИздање ОС-а: + Програм је отказао + Шта:\\nЗахтев:\\nЈезик садржаја:\\nЗемља садржаја:\\nЈезик апликације:\\nУслуга:\\nGMT време:\\nПакет:\\nВерзија:\\nВерзија ОС-а: „reCAPTCHA“ задатак Решите „reCAPTCHA“ задатак - црна + Црна Све - хиљ - мил - млрд + хиљ. + мил. + млрд. Отвори у искачућем режиму Ова дозвола је потребна за \nотварање у искачућем режиму - Пуштање у режиму прозорчета - Искључено - Подразумевани формат видеа - Резолуција искачућег прозора + Пуштање у режиму искачућег прозора + Онемогућено + Подразумевани формат видео снимка + Подразумевана резолуција искачућих прозора Прикажи веће резолуције - Само неки уређаји могу да пуштају 2K/4K видео + Само неки уређаји могу да пуштају 2K/4K видео снимке Очисти Позадина - Прозорче + Искачући прозор Уклања звук на неким резолуцијама Упамти својства искачућег прозора - памти последњу величину и позицију искачућег прозора - Предлози у претрази - Приказује предлоге током претраге + Памти последњу величину и позицију искачућег прозора + Предлози за претрагу + Изаберите предлоге који ће се приказати приликом претраге Пратите - Прати + Запрати Праћења Шта је ново - Историјат претраге - Појмове претраге складишти локално + Историја претраге + Локално чувајте упите за претрагу Историја гледања - Чувај историјат гледања - Настави са репродукцијом + Чувајте листу одгледаних видео снимака + Настави са пуштањем Најбоља резолуција Преузимање - О програму - О програму + О NewPipe + О нама и ЧПП Лиценце - Слободно и лагано стримовање на Андроиду. - Погледај на Гитхабу + Слободно и лагано стримовање на Android-у. + Погледај на GitHub-у Прочитај лиценцу Допринос - Историјат - Историјат - Настави пуштање након прекида (нпр. позива) - Дозвољени знакови у називима - слова и бројке + Историја + Историја + Наставите са пуштањем након прекида (нпр. телефонски позиви) + Дозвољени знакови у називима фајлова + Слова и бројеви © %1$s од %2$s под %3$s - Одјављен са канала - Не могу да променим претплату - Не могу да ажурирам претплату + Прекинуто праћење канала + Није могуће променити праћење + Није могуће ажурирати праћење Плејер Понашање Историја и кеш - Врати - Њупајп обавештење - Обавештења за Њупајп плејере у позадини и искачућем прозору + Поништи + NewPipe обавештење + Обавештења за NewPipe плејер Нема резултата - Нема ничега овде осим цврчака + Овде нема ничега осим цврчака Нема пратилаца %s пратилац - %s пратилаца + %s пратиоца %s пратилаца Нема прегледа @@ -151,25 +150,25 @@ %s прегледа %s прегледа - Нема видеа + Нема видео снимака - %s видео - %s видеа - %s видеа + %s видео снимак + %s видео снимка + %s видео снимака - Неисправни знакови биће замењени овим - Знак за замену - и посебни знакови + Неисправни знакови биће замењени овим вредностима + Заменски знак + Већина посебних знакова Лиценце треће стране - Лиценца Њупајпа - Помоћ је увек добро дошла, било да имате идеју за превод, дизајн, козметичке или озбиљне измене кôда. Што се више уради, боље је! - Покажите савет када притиснете позадину или искачуће дугме у видеу „Детаљи:“ + Лиценца NewPipe-а + Без обзира имате ли идеје; превод, промене дизајна, чишћење кода или праве, озбиљне, промене кода—помоћ је увек добродошла. Што се више уради, то је боље! + Прикажите савет када притиснете позадину или искачуће дугме у видео снимку „Детаљи:“ Пусти све - Не могу да пустим овај ток - Десила се непоправљива грешка плејера - Опорављам се од грешке плејера - Желите да обришете ову ставку из историјата претраге\? - Садржај главне стране + Није могуће пустити овај стрим + Дошло је до непоправљиве грешке плејера + Опорављање од грешке плејера + Желите ли да избришете ову ставку из историје претраге\? + Садржај главне странице Празна страница Киоск страница Страница канала @@ -181,226 +180,224 @@ Ново и популарно Уклони Детаљи - Поставке звука - Нема плејера тока (можете инсталирати ВЛЦ). - Преузимање фајла тока - Прикажи податке - Обележене листе + Подешавања аудио снимка + Није пронађен ниједан плејер стримова (можете инсталирати VLC да бисте га покренули). + Преузимање фајла стрима + Прикажи информације + Обележене плејлисте Додај на Подразумевана држава за садржај Исправљање грешака Увек Само једном - [непознато] - Прикажи поруку „задржи ради заказивања” + [Непознато] + Прикажи савет „Задржати за стављање у редослед” Донација - ЊуПајп развијају волонтери у своје слободно време како би вам пружили најбоље искуство. Узвратите им како би наставили са побољшавањем ЊуПајпа док уживају уз шољицу кафе. + NewPipe је развијен од стране волонтера који проводе своје слободно време доносећи вам најбоље корисничко искуство. Узвратите програмерима како би учинили NewPipe још бољим, док уживају у шољици кафе. Узврати - Веб страна - За више информација и новости посетите ЊуПајпов вебсајт. - Задржи за стављање у ред + Веб-сајт + За више информација и новости посетите NewPipe веб-сајт. + Задржати за стављање у редослед Користи брзо, непрецизно премотавање Непрецизно премотавање омогућава плејеру да брже долази до позиције уз смањену прецизност. Премотавање за 5, 15 или 25 секунди са овом опцијом не ради - Учитај сличице - Искључите да спречите преузимање сличица, смањујући утрошак преноса података и меморије. Изменом ће се очистити и меморијски и диск кеш Очишћен кеш са сликама Уклони кеширане метаподатке - Уклања све податке кешираних веб-страна - Откажи праћење - Изаберите језичак + Уклања све податке кешираних веб-страница + Прекини праћење + Изаберите картицу Приказ коментара - искључите за сакривање коментара - Због ограничења плејера, премотавање је постављено на %d секунди - Да, и делимично одгледани снимци - Видео записи који су гледани пре и након додавања на листу биће уклоњени. -\nДа ли сте сигурни\? Ово се не може повратити! + Искључите да бисте сакрили коментаре + Због ограничења ExoPlayer-а, премотавање је постављено на %d секунди + Да, и делимично одгледани видео снимци + Видео снимци који су одгледани пре и после додавања на плејлисту биће уклоњени. +\nЈесте ли сигурни\? Ово се не може поништити! Уклонити одгледане видео снимке\? - Уклони гледано - Системски + Уклони одгледано + Системски подразумевано Језик апликације Изаберите инстанцу - „Storage Access Framework“ омогућава преузимање на спољну СД картицу - Користи системски бирач фасцикли (SAF) - Питаће вас где да сачувате свако преузимање. -\nУкључите системски бирач фасцикли „SAF“ ако желите да користите спољну СД картицу + „Storage Access Framework“ омогућава преузимање на спољну, SD (меморијску), картицу + Користи системски бирач фолдера (SAF) + Бићете упитани где желите да сачувате свако преузимање. +\nОмогућите системски бирач фолдера (SAF), ако желите да преузмете на спољну, SD (меморијску), картицу Питај где да се преузме Паузирај преузимања Започни преузимања - По једно преузимање ће бити активно - Ограничи ред за преузимање + Једно преузимање ће бити покренуто у исто време + Ограничи редослед преузимања Затвори Корисно при преласку на мобилне податке, иако нека преузимања не могу бити обустављена - Прекид на мереним мрежама + Прекид на мрежама с ограничењем Највећи број покушаја пре отказивања преузимања Највише покушаја Заустави Избриши преузете фајлове - Желите да очистите историју преузимања или обришете све преузете фајлове\? - Обриши историју преузимања - Не могу да опоравим ово преузимање + Желите ли да очистите историју преузимања или избришете све преузете фајлове\? + Очисти историју преузимања + Није могуће опоравити ово преузимање Веза је истекла - Напредак је изгубљен јер је фајл обрисан - Нема простора на уређају - ЊуПајп је затворен док је радио на фајлу + Напредак је изгубљен, јер је фајл избрисан + Недовољно меморије на уређају + NewPipe је затворен док је радио на фајлу Накнадна обрада није успела Није пронађено Сервер не прихвата преузимања са више нити. Покушајте са @string/msg_threads = 1 Сервер не шаље податке - Не могу да се повежем са сервером - Не могу да пронађем сервер - Не могу да успоставим безбедну везу - Не могу да направим одредишну фасциклу + Није могуће повезати се са сервером + Није могуће пронаћи сервер + Није могуће успоставити безбедну везу + Одредишни фолдер се не може направити Фајл се не може направити Прикажи грешку Преузимање са овим називом чека на ред У току је преузимање са овим називом - не могу да пребришем фајл + није могуће преписати фајл Преузет фајл са овим називом већ постоји Фајл са овим називом већ постоји - Пребриши + Препиши Генериши јединствен назив - Преузимање неуспешно - Систем одбија радњу - Ред чекања - опоравља се + Преузимање није успело + Систем је одбио радњу + Стави у редослед + опорављање накнадна обрада - у реду + у редоследу паузирано На чекању Завршено - Доступно је ажурирање за ЊуПајп! - аутоматски - мрежа - листа + Доступно је ажурирање за NewPipe! + Аутоматски + Мрежа + Листа Режим приказа листе - никад - само на бежичној - Покрени аутоматски — %s - умањи на искачући плејер - умањи на позадински плејер - ништа - Радња при преласку на другу апликацију са главног видео плејера — %s + Никад + Само на Wi-Fi-у + Покрени репродукцију аутоматски — %s + Умањи на искачући плејер + Умањи на позадински плејер + Ниједно + Радња при преласку на другу апликацију са главног плејера видео снимака — %s Умањи при мењању апликације Прикажи обавештење када постоји нова верзија апликације Ажурирања - Ограничити резолуцију на мобилној мрежи + Ограничење резолуције када се користе мобилни подаци Одбиј - без ограничења + Без ограничења Прихвати - Да бисмо били у складу са Европском општом уредбом о заштити података („GDPR“), скрећемо вам пажњу на политику приватности апликације ЊуПајпа. Пажљиво је прочитајте. + Да бисмо били у складу са Европском општом уредбом о заштити података (GDPR), скрећемо вам пажњу на политику приватности NewPipe-а. Пажљиво је прочитајте. \nМорате је прихватити да бисте нам послали извештај о грешци. Ресетуј Корак Премотавање унапред током тишине - Откачити (може изазвати изобличења) + Откачи (може изазвати изобличења) Висина тона Брзина Контроле брзине репродукције Имајте на уму да ова операција може потрошити доста података. \n \nЖелите ли да наставите\? - вашИД, soundcloud.com/yourid - Увезите СаундКлауд профил тако што ћете откуцати УРЛ или свој ИД: + ВашID, soundcloud.com/yourid + Увезите SoundCloud профил тако што ћете откуцати URL адресу или свој ID: \n -\n1. Омогућите „режим радне површине“ у веб прегледачу (веб локација није доступна за мобилне уређаје) -\n2. Идите на ову УРЛ адресу: %1$s -\n3. Пријавите се када вас питају -\n4. Копирајте УРЛ профила на који сте преусмерени. - Увезите Јутјуб претплате са Гугл тејкаута: +\n1. Омогућите „верзију сајта за рачунар“ у веб-прегледачу (сајт није доступан за мобилне уређаје) +\n2. Идите на ову URL адресу: %1$s +\n3. Пријавите се када се то од вас затражи +\n4. Копирајте URL адресу профила на који сте преусмерени. + Увезите YouTube праћења из Google Takeout-а: \n -\n1. Идите на ову УРЛ адресу: %1$s -\n2. Пријавите се када вас питају -\n3. Кликните на „Сви подаци су укључени“, затим на „Поништи избор свих“, а затим изаберите само „претплате“ и кликните на „У реду“ +\n1. Идите на ову URL адресу: %1$s +\n2. Пријавите се када се то од вас затражи +\n3. Кликните на „Сви подаци укључени“, затим на „Опозови све“, затим изаберите само „праћења“ и кликните на „ У реду“ \n4. Кликните на „Следећи корак“, а затим на „Направи извоз“ -\n5. Кликните на дугме „Преузми“ након што се појави и -\n6. Из преузете зип датотеке за преузимање извадите .json датотеку (обично под „YouTube и YouTube Music/subscriptions/subscriptions.json“) и увезите је овде. - Не могу да извезем претплате - Не могу да увезем претплате +\n5. Кликните на дугме „Преузми“ након што се појави +\n6. Кликните на УВЕЗИ ФАЈЛ испод и изаберите преузети .zip фајл +\n7. [Ако увоз .zip не успе] Извуците .csv фајл (обично под „YouTube and YouTube Music/subscriptions/subscriptions.csv“), кликните на УВЕЗИ ФАЈЛ испод и изаберите извучени csv фајл + Није могуће извести праћења + Није могуће увести праћења Претходни извоз Увези фајл - Увозим… - Извозим… + Увоз… + Извоз… Извоз у Увоз из Увоз Срушите апликацију - Изворни текстови са услуга биће видљиви у ставкама тока + Изворни текстови са услуга биће видљиви у ставкама стрима Прикажи изворно време ставки - Присили пријављивање неиспоручивих „Rx“ изузетака изван делова или активности након одлагања + Присилно извештавање о „Rx“ изузецима који се не могу испоручити ван фрагмента или животног циклуса активности након одлагања Пријави грешке ван животног циклуса Прикажи цурење меморије - Надгледање цурења меморије може изазвати заглављивање апликација при стварању записника - Мења величину и позадину титлова плејера. Захтева поновно покретање да би ступило на снагу + Праћење цурења меморије може довести до тога да апликација престане да реагује када се прикупљају извештаји + Измените размеру натписа титлова плејера и стилове позадине. Захтева рестартовање апликације да би се применило Титлови - Аутоматски направљено - Увеличај + Аутоматски генерисано + Увеличано Попуњено Уклопљено Без титлова - Аутоматски направљено (нема отпремача) - Сличица листе је промењена. - Листа пуштања - Листа је направљена - Да обришем ову листу\? - Обележи листу + Аутоматски генерисано (нема отпремача) + Сличица плејлисте је промењена. + Додато на плејлисту + Плејлиста је направљена + Избрисати ову плејлисту\? + Обележи плејлисту Уклони обележивач - Постави као сличицу листе - Упали звук - Утишај - Додај на листу + Постави као сличицу плејлисте + Укључи звук + Искључи звук + Додај на плејлисту Назив Преименуј - Нова листа - Учитавам тражени садржај - Добављам податке… + Нова плејлиста + Учитавање траженог садржаја + Прикупљање информација… Увек питај - Плејер у искачућем прозору - Плејер у позадини - Видео плејер + Искачући плејер + Позадински плејер + Плејер видео снимака Подразумевана радња при отварању садржаја — %s - Пожељна радња при отварању + Преферирана радња при отварању Затвори фиоку Отвори фиоку Почни пуштање у искачућем прозору Почни пуштање у позадини - Стави у ред - На листи - Ред пуштања + Стави у редослед + Стављено у редослед + Редослед пуштања Конференције Највише свиђања Недавно додато Локално - Језик ће бити промењен након поновног покретања - Не могу да учитам коментаре - Желите да увезете и поставке\? - Ово ће прегазити тренутна подешавања. - Упозорење: не могу да увезем све фајлове. - Није исправан ЗИП фајл + Језик ће бити промењен након рестартовања апликације + Није могуће учитати коментаре + Желите ли да увезете и подешавања\? + Ово ће заменити ваше тренутно подешавање. + Упозорење: Није могуће увести све фајлове. + Нема важећег ZIP фајла Увезено Извезено Још нема обележивача на листи Изаберите листу пуштања Подразумевани киоск - Које картице се налазе на главној страници + Које картице се приказују на главној страници Највише пуштано Последње пуштано - ЊуПајп је бесплатни слободни софтвер. Можете га користити, проучавати и делити по жељи. Конкретно, можете га дистрибуирати и/или мењати под условима ГНУ Опште јавне лиценце коју је објавила Фондација за слободни софтвер, било верзије 3 лиценце, или (по вашој жељи) било које касније верзије. - Прочитајте политику приватности - Пројекат ЊуПајп врло озбиљно схвата вашу приватност. Стога апликација не прикупља никакве податке без вашег пристанка. -\nПолитика приватности ЊуПајпа детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о паду апликације. - Политика приватности ЊуПајпа - Нема апликације за пуштање овог фајла - Готово + NewPipe је слободан софтвер за копирање: Можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га поново дистрибуирати и/или модификовати под условима GNU Опште јавне лиценце коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију. + Прочитај политику приватности + Пројекат NewPipe веома озбиљно схвата вашу приватност. Стога, апликација не прикупља никакве податке без вашег пристанка. +\nПолитика приватности NewPipe-а детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању апликације. + Политика приватности NewPipe-а + Готово Реши - Притисните „Готово“ кад решите - Обрисана је 1 ставка. + Притисните „Готово“ када решите + Избрисана је 1 ставка. Израчунавање хеша Преименуј Одбаци Направи Нема коментара - ∞ видеа - 100+ видеа + ∞ видео снимака + 100+ видео снимака %s слушалац %s слушаоца @@ -414,44 +411,44 @@ Нико не гледа Број пратилаца није доступан - Мењај услугу, тренутно изабрана: + Изабери услугу, тренутно изабрана: Превуците за преуређивање Опис Коментари - Проверите да ли већ постоји проблем који говори о вашем паду апликације. Када правите дупликате карата, одузимате нам време које бисмо могли потрошити на исправљање стварне грешке. - Пријави на Гитхабу + Проверите да ли већ постоји проблем који говори о вашем отказивању апликације. Када правите дупликате карата, одузимате нам време које бисмо могли потрошити на исправљање стварне грешке. + Пријави на GitHub-у Копирајте форматирани извештај - Дајте дозволу за приказ преко других апликација - Врати подразумеване - Желите да вратите подразумеване вредности\? - Не могу да очитам сачуване картице. Користим подразумеване - Нема тока доступног за преузимање + Дајте дозволу за приказивање преко других апликација + Врати подразумеване вредности + Желите ли да вратите подразумеване вредности\? + Није могуће прочитати сачуване картице, тако да се користе подразумеване + Нема стримова доступних за преузимање Дошло је до грешке: %1$s Фајл не постоји или нема дозволе за читање или писање Назив фајла не може бити празан Нема таквог фајла/извора садржаја - Нема такве фасцикле + Нема таквог фолдера Фајл је премештен или избрисан - Нема видео тока - Нема аудио тока - Спољни плејери не подржавају ове врсте веза - Преузимање на спољну СД картицу није могуће. Ресетовати локацију фасцикле за преузимање\? - Спољно складиште није доступно - Историја претраге је обрисана - Да обришем целу историју претраге\? + Нису пронађени видео стримови + Нису пронађени аудио стримови + Спољни плејери не подржавају ове врсте линкова + Преузимање на спољну, SD (меморијску), картицу није могуће. Ресетовати локацију фолдера за преузимање\? + Спољна меморија није доступна + Историја претраге је избрисана + Избрисати целу историју претраге\? Брише историју кључних речи за претрагу - Обриши историју претраге - Позиције репродукције су обрисане - Обрисати све позиције репродукције\? + Очисти историју претраге + Позиције репродукције су избрисане + Избрисати све позиције репродукције\? Брише све позиције репродукције - Обриши позиције репродукције + Избриши позиције репродукције Историја гледања је избрисана - Обрисати целу историју гледања\? - Брише историју пуштаних токова и позиције репродукције + Избрисати целу историју гледања\? + Брише историју пуштаних стримова и позиције репродукције Очисти историју гледања - Чисти колачиће које ЊуПајп чува када решите „reCAPTCHA“ - Извоз историје, претплата, листи и поставки - Замениће вашу тренутну историју, претплате, листе и (опционо) поставке + Чисти колачиће које NewPipe чува када решите „reCAPTCHA“ + Извоз историје, праћења, плејлисти и подешавања + Замениће вашу тренутну историју, праћења, плејлисте и (опционално) подешавања „reCAPTCHA“ колачићи су очишћени Очисти „reCAPTCHA“ колачиће Извоз базе података @@ -459,9 +456,9 @@ Пребаци на главно Пребаци на искачући прозор Пребаци у позадину - Обавештења о напретку хеширања видео записа - Обавештење о видео хешу - Обавештења о новој верзији ЊуПајпа + Обавештења о напретку хеширања видео снимка + Обавештење о хешу видео снимка + Обавештења о новим верзијама NewPipe-а Обавештење о ажурирању апликације Фајл Фајл избрисан @@ -471,124 +468,120 @@ Догађаји Корисници Нумере - Видео - Листе пуштања + Видео снимци + Плејлисте Канали - Овај видео је старосно ограничен. -\nЗбог нових Јутјуб смерница за такве видео записе, Њупајп не може да им приступи, па није у могућности да их репродукује. - Овај видео је старосно ограничен. + Овај видео снимак је старосно ограничен. +\nЗбог нових YouTube смерница за старосно ограничене видео снимке, NewPipe не може да им приступи, па није у могућности да их пушта. + Овај видео снимак је старосно ограничен. \n -\nУкључите „%1$s“ у поставкама ако желите да га видите. - Јутјуб омогућава „Ограничени режим“ који скрива потенцијални садржај за одрасле - Укључити Јутјубов „Ограничени режим“ - Приказ садржаја који можда није прикладан за децу јер има старосну границу (попут 18+) +\nУкључите „%1$s“ у подешавањима, ако желите да га видите. + YouTube омогућава „Ограничени режим“ који скрива потенцијални садржај за одрасле + Укључи YouTube-ов „Ограничени режим“ + Приказивање садржаја који можда није прикладан за децу, јер има старосну границу (попут 18+) Ажурирања Инстанца већ постоји - Подржане су само HTTPS УРЛ адресе - Не могу да потврдим инстанцу - Унесите УРЛ инстанце + Подржане су само HTTPS URL адресе + Није могуће потврдити инстанцу + Унесите URL адресу инстанце Додајте инстанцу Пронађите инстанце које вам се свиђају на %s - PeerTube инстанца - Изаберите своје омиљене инстанце PeerTube - УРЛ није препознат. Отворити другом апликацијом\? + PeerTube инстанце + Изаберите своје омиљене PeerTube инстанце + URL адреса није препозната. Отворити помоћу друге апликације\? Аутоматско пуштање - Очисти податке + Чишћење података Прикажите индикаторе положаја репродукције на листама Позиције на листама Вратите последњу позицију репродукције - Наставак репродукције - Користите покрете за контролу осветљаја - Контрола осветљености потезом - Користите потезе за контролу јачине звука плејера - Контрола јачине звука потезом - Самостално заказивање - Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима - Самостално закажи следећи ток + Настави репродукцију + Аутоматско стављање у редослед + Наставите да завршавате (непонављајући) редослед репродукције додавањем сродног стрима + Аутоматски стави у редослед следећи стрим Кеш метаподатака обрисан - Искључите за сакривање поља мета-података са додатним информацијама о творцу тока, садржају или захтеву за претрагу - Прикажи мета-податке - Искључите за сакривање описа видеа и додатних информација + Искључите да бисте сакрили поља за метаподатке са додатним информацијама о креатору стрима, садржају стрима или захтеву за претрагу + Прикажи метаподатке + Искључите да бисте сакрили опис видео снимка и додатне информације Прикажи опис Редослед активног плејера биће замењен Пребацивање на други плејер може променити ваш редослед - Питај за потврду пре пражњења редоследа + Питај за потврду пре чишћења редоследа Период премотавања напред/назад - ноћна тема - Андроид ће прилагодити боју обавештења према главној боји на сличици (није доступно на свим уређајима) - Обоји обавештења + Ноћна тема + Android ће прилагодити боју обавештења према главној боји на сличици (није доступно на свим уређајима) + Обоји обавештење Ништа Учитавање Мешање Понављање Можете да изаберете највише три радње за приказ у компактном обавештењу! - Уредите сваку радњу обавештења додиром на њу. Означите до три радње које ће се приказивати у компактном обавештењу помоћу кућица са десне стране + Измените сваку радњу обавештења додиром на њу. Означите до три радње које ће се приказивати у компактном обавештењу помоћу поља за потврду са десне стране Дугме пете радње Дугме четврте радње Дугме треће радње Дугме друге радње Дугме прве радње - мења размеру сличице видеа у обавештењима са 16:9 на 1:1 (може довести до изобличења) - Умањени приказ размере 1:1 - Приказ резултата за: %s + Исеците сличицу видео снимка приказану у обавештењу с размере 16:9 на размеру 1:1 + Исеци сличицу на размеру 1:1 + Приказивање резултата за: %s Отвори помоћу Преузимање је започело - Испод можете одабрати своју омиљену ноћну тему + Испод можете изабрати своју омиљену ноћну тему Изаберите своју омиљену ноћну тему — %s - аутоматски (тема уређаја) + Аутоматски (тема уређаја) Радио Истакнуто - Овај садржај је доступан само корисницима који су платили, тако да га ЊуПајп не може стримовати или преузимати. - Овај видео је доступан само премијум члановима Јутјуб музике, тако да га ЊуПајп не може стримовати или преузимати. - Овај садржај је приватан, тако да га ЊуПајп не може стримовати или преузимати. - Ово је СаундКлауд Го+ нумера, барем у вашој земљи, тако да је ЊуПајп не може стримовати или преузимати. + Овај садржај је доступан само корисницима који су платили, тако да га NewPipe не може стримовати или преузимати. + Овај видео снимак је доступан само премијум YouTube Music члановима, тако да га NewPipe не може стримовати или преузимати. + Овај садржај је приватан, тако да га NewPipe не може стримовати или преузимати. + Ово је SoundCloud Go+ нумера, барем у вашој земљи, тако да је NewPipe не може стримовати или преузимати. Овај садржај није доступан у вашој земљи. - Нема апликације која отвара ово + Ниједна апликација на вашем уређају не може да отвори ово Поглавља Недавни - користи сличицу и за позадину закључаног екрана и за обавештења - Приказ сличице - Страница листе - од %s - Направи %s + Користите сличицу и за позадину закључаног екрана и за обавештења + Прикажи сличицу + Страница плејлисте + Од %s + Направио %s Сличица аватара канала - ЊуПајп још увек не подржава овај садржај. + NewPipe још увек не подржава овај садржај. \n \nНадамо се да ће бити подржан у будућој верзији. - Да ли је учитавање довода преспоро\? Ако је тако, укључите брзо учитавање (промените у поставкама или притиском на дугме испод). + Мислите ли да је учитавање фида превише споро\? Ако јесте, покушајте да омогућите брзо учитавање (можете га променити у подешавањима или притиском на дугме испод). \n -\nЊуПајп нуди два начина учитавања довода: -\n• Преузимање целог претплаћеног канала, што је споро али потпуно. -\n• Коришћење наменске крајње тачке услуге, што је брже али обично није потпуно. +\nNewPipe нуди две стратегије учитавања фида: +\n• Прикупљање целог претплатничког канала, што је споро, али потпуно. +\n• Коришћење наменске крајње тачке услуге, која је брза, али обично није потпуна. \n -\nРазлика је у томе што брзом обично недостају неке информације, попут трајања или врсте (не могу се разликовати живи видео од уобичајених), а можда ће вратити и мање ставки. +\nРазлика између њих је у томе што брзом начину обично недостају неке информације, као што је трајање или врста ставке (не могу да се разликују видео снимци уживо и нормални) и може да врати мање ставки. \n -\nЈутјуб је пример услуге која нуди овај брзи метод својим РСС доводом. +\nYouTube је пример услуге која нуди ову брзу методу са својим RSS фидом. \n -\nДакле, избор се своди на оно шта желите: брзину или прецизне информације. - Искључи брзи режим - Укључи брзи режим - Доступно у неким услугама. Обично је много брже али може вратити мање ставки и често непотпуне информације (нпр. нема трајања, врсте предмета, нема статуса уживо) - Преузми из наменског довода када је доступан - Увек ажурна - Време након којег се претплата сматра застарелом — %s - Праг освежавања довода - Довод - Прикажи само негруписане претплате +\nДакле, избор се своди на оно што ви преферирате: брзину или прецизне информације. + Онемогући брзи режим + Омогући брзи режим + Доступан у неким услугама, обично је много бржи, али може да врати ограничену количину ставки и често непотпуне информације (нпр. нема трајања, врсте ставке, нема статуса уживо) + Прикупи из наменског фида, када је доступан + Увек ажурирај + Време након последњег ажурирања пре него што се праћење сматра застарелом — %s + Праг освежавања фида + Фид + Прикажи само негруписана праћења Нова - Желите да избришете ову групу\? + Желите ли да избришете ову групу\? Празан назив групе - %d одабран - %d одабрана - %d одабраних + %d изабран + %d изабрана + %d изабраних - Нема изабраних претплата - Изабери претплате - Обрађујем довод… - Учитавам довод… + Нема изабраних праћења + Изабрана праћења + Обрађивање фида… + Учитавање фида… Није учитано: %d - Довод освежен: %s + Фид последњи пут ажуриран: %s Групе канала %d дан @@ -611,50 +604,240 @@ %d секунди Прикажи детаље о каналу - Повезани записи - Искључите тунеловање ако имате црн екран или прекиде у репродукцији - Искључи тунеловање медија - Отвори веб страну - интерно - лично - ненаведено - јавно - УРЛ сличице + Сродне ставке + Онемогућите тунеловање медија ако искусите црни екран или застајкивање при репродукцији видео снимка. + Онемогући тунеловање медија + Отвори веб-сајт + Унутрашње + Приватно + По позиву + Јавно Домаћин Подршка Језик Старосно ограничење - Доступност + Приватност Лиценца Ознаке Категорија Омогући бирање текста унутар описа Онемогући бирање текста унутар описа - Сада можете изабрати текст унутар описа. Знајте да страна може треперети а везе неће радити док сте у режиму избора. + Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора. %s даје овај разлог: Налог укинут - Режим брзог довода не даје више информација о овоме. + Режим брзог фида не пружа више информација о овоме. Налог аутора је укинут. -\nЊуПајп убудуће неће моћи да учита овај довод. -\nЖелите ли да прекинете праћење канала\? - Не могу да учитам довод за „%s“. - Грешка учитавања довода - Од Андроида 10 само „Storage Access Framework“ је подржан - Питаће вас где да сачувате свако преузимање - Фасцикла за преузимање није одређена. Изаберите подразумевану фасциклу - искљ - укљ +\nNewPipe убудуће неће моћи да учита овај фид. +\nЖелите ли да прекинете праћење овог канала\? + Није могуће учитати фид за „%s“. + Грешка при учитавању фида + Од Android-а 10 само „Storage Access Framework“ је подржан + Бићете упитани где желите да сачувате свако преузимање + Фолдер за преузимање није одређен, изаберите подразумевани фолдер + Искључи + Укључи Режим таблета - Прикажи пуштано - Закажи следеће - Заказано је следеће - Местни предлози претраге + Стави у редослед следећи + Стављен у редослед следећи + Локални предлози претраге Удаљени предлози претраге Означи као одгледано - Разговори су онемогућени - Обрађујем… Може потрајати пар тренутака - Приказуј указиваче слике - Не покрећи видео у малом прозору, већ пређи одмах у пун приказ заслона, уколико је обртање приказа закључано. И даље можете приступити малом приказу извођача изласком из пуног приказа - Покрени пуни главни приказ извођача - Прекините плејер + Коментари су онемогућени + Обрађивање… Може потрајати пар тренутака + Прикажи индикаторе слике + Не покрећите видео снимке у мини-плејеру, већ директно пређите на режим целог екрана, ако је аутоматска ротација закључана. И даље можете приступити мини-плејеру тако што ћете изаћи из целог екрана + Покрени главни плејер преко целог екрана + Срушите плејер + + %s преузимање је завршено + %s преузимања су завршена + %s преузимања је завршено + + %1$s %2$s + Обавештења о новим стримовима + Обавештења + Погледај на веб-сајту + Ако имате проблема са коришћењем апликације, обавезно погледајте ове одговоре на честа питања! + Дупликат је додат %d пут(а) + Потребна мрежна веза + Потпуно одгледано + Делимично одгледано + Превуците ставке да бисте их уклонили + Низак квалитет (мањи) + Поништи трајну сличицу + Било која мрежа + Ручно проверите постоје ли нове верзије + Спољни плејери не подржавају изабрани стрим + Померите главни бирач картице на дно + Положај главних картица + Дошло је до грешке, погледајте обавештење + NewPipe је наишао на грешку, додирните да бисте пријавили + Прикажи траку са грешком + Учесталост провере + Картица + Уклонити дупликате\? + Желите ли да уклоните све дупликате стримова на овој плејлисти\? + Предстојеће + Подешавања ExoPlayer-а + Увек користи заобилазно решење ExoPlayer-а за подешавање површине излаза видео снимка + Изабери квалитет за спољне плејере + Нема стримова + Нема стримова уживо + + %s нови стрим + %s нова стрима + %s нових стримова + + Учитавање детаља стрима… + Прикажи „Сруши плејер“ + Покрени проверу нових стримова + Тунеловање медија је подразумевано онемогућено на вашем уређају, јер је познато да ваш уређај то не подржава. + Полутон + Обавештавање о новим стримовима из праћења + Провера ажурирања… + Избрисати све преузете фајлове са диска\? + Уклони дупликате + Прикачен коментар + ExoPlayer подразумевано + Изабери све + Не приказују се стримови које програм за преузимање још увек не подржава + Аудио снимак би већ требало да буде присутан у овом стриму + Нема доступних аудио стримова за спољне плејере + Нема доступних видео стримова за спољне плејере + Непознати формат + Непознати квалитет + Непознато + Висок квалитет (већи) + Величина интервала учитавања репродукције + Обавештење о извештају о грешци + Нове ставке фида + Игнориши догађаје хардверског дугмета за медије + Плејлисте које су затамњене већ садрже ову ставку. + LeakCanary није доступан + Додирните да бисте преузели %s + Провера ажурирања + Преглед сличице траке за претрагу + Приказ следећих стримова + Прикажи/сакриј стримове + Користи резервну функцију декодера ExoPlayer-а + оригинални + Промените величину интервала учитавања на прогресивним садржајима (тренутно %s). Нижа вредност може убрзати њихово почетно учитавање + Корисно, на пример, ако користите слушалице са поквареним физичким дугмадима + Изаберите покрет за леву половину екрана плејера + Радња покретом улево + Изаберите покрет за десну половину екрана плејера + Обавештење плејера + Обавештења о новим стримовима за праћења + Конфигуришите обавештење о тренутно репродукованом стриму + Изаберите оригинални аудио снимак, без обзира на језик + Изаберите аудио снимак са описима за особе са оштећеним видом, ако је доступан + Преферирај описни аудио снимак + Радња покретом удесно + Осветљеност + Јачина звука + Ниједно + Нови стримови + Обавештења за пријаву грешака + Увезите или извезите праћења из менија са 3 тачке + Аудио снимак + Прикажите Picasso обојене траке на врху слика које указују на њихов извор: црвена за мрежу, плава за диск и зелена за меморију + Направите обавештење о грешци + Проценат + Користите најновију верзију NewPipe-а + Не приказуј + Није пронађен одговарајући менаџер фајлова за ову радњу. +\nИнсталирајте менаџер фајлова или покушајте да онемогућите „%s“ у подешавањима преузимања + Често постављана питања + Приказује опцију рушења, када користите плејер + + Избрисано је %1$s преузимање + Избрисано је %1$s преузимања + Избрисано је %1$s преузимања + + Није пронађен одговарајући менаџер фајлова за ову радњу. +\nИнсталирајте менаџер фајлова компатибилан са Storage Access Framework-ом + Срце од стране креатора + Обавештења су онемогућена + Добијајте обавештења + Омогућите ову опцију ако имате проблема са иницијализацијом декодера, која се враћа на декодере нижег приоритета, ако иницијализација примарних декодера не успе. Ово може резултирати лошијим перформансама репродукције него када користите примарне декодере + Ова опција је доступна само ако је %s изабрано за тему + описни + синхронизовани + Управљајте неким подешавањима ExoPlayer-а. Ове промене захтевају рестартовање плејера да би се примениле + Преферирај оригинални аудио снимак + Ово заобилазно решење ослобађа и поново инстанцира кодеке видео снимка када дође до промене површине, уместо да се површина директно поставља на кодек. ExoPlayer већ користи ово на неким уређајима са овим проблемом, ово подешавање утиче само на Android 6 и новије верзије. +\n +\nОмогућавање ове опције може спречити грешке при репродукцији приликом пребацивања тренутног плејера видео снимака или преласка на цео екран + Аудио снимак: %s + Брзи режим + , + Копирање у привремену меморију није успело + Сортирање + Сада пратите овај канал + Изабери аудио снимак за спољне плејере + Пратиоци + Учитавање метаподатака… + Прикупи картице канала + Картице за прикупљање приликом ажурирања фида. Ова опција нема ефекта ако се канал ажурира у брзом режиму. + Видео снимци + Које картице се приказују на страницама канала + Картице канала + Shorts + Информације + Албуми + Плејлисте + Снимци + Канали + Уживо + Квалитет слике + \? + Укључи оријентацију екрана + Низак квалитет + Укључи цео екран + Аватари + Следећи стрим + Аватари потканала + Отвори редослед пуштања + Не учитавај слике + Висок квалитет + Унапред + Премотавање + Поново пусти + Средњи квалитет + Аватари отпремаоца + Банери + Изаберите квалитет слика и да ли ћете уопште учитавати слике да бисте смањили потрошњу података и меморије. Промене бришу кеш слике у меморији и на диску — %s + Пусти + Више опција + Сличице + Трајање + Претходни стрим + Дели листу URL адреса + Дели са насловима + %1$s +\n%2$s + Дели плејлисту + Делите плејлисту са детаљима, као што су назив плејлисте и наслови видео снимака или као једноставна листа URL адреса видео снимака + -%1$s: %2$s + + %s одговор + %s одговора + %s одговора + + Прикажи више + Прикажи мање + Измените сваку радњу обавештења у наставку тако што ћете је додирнути. Прве три радње (пусти/паузирај, претходни и следећи) поставља систем и не могу се прилагодити. + Нема довољно слободног меморијског простора на уређају + Прављење резервне копије и враћање + Ресетуј подешавања + Ресетујте сва подешавања на подразумеване вредности + Ресетовање свих подешавања ће одбацити сва жељена подешавања и поново покренути апликацију. +\n +\nЖелите ли заиста да наставите? + Не + Да + NewPipe може аутоматски да проверава да ли постоје нове верзије с времена на време и да вас обавести када буду доступне. +\nЖелите ли да омогућите ово? + Подешавања у извозу који се увозе користе рањив формат који је застарео од NewPipe верзије 0.27.0. Уверите се да извоз који се увози долази из поузданог извора и радије користите само извозе добијене из NewPipe 0.27.0 или новије верзије, у будућности. Подршка за увоз подешавања у овом рањивом формату ће ускоро бити потпуно уклоњена и тада старе NewPipe верзије више неће моћи да увозе подешавања извоза из нових верзија. + секундарни \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3bdb388c431..e77a69678d6 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 @@ -34,12 +34,12 @@ Visa ett alternativ för att spela upp en video med mediacentret Kodi Ljud Standardformat för ljud - Videoformat som föredras + Standardformat för video Tema Ljust Mörkt Svart - Kom ihåg popupstorlek och position + Kom ihåg popupinstä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 @@ -100,11 +100,10 @@ NewPipe avisering Aviseringar för NewPipes spelare [Okänd] - Kunde inte dekryptera video URL signatur Misslyckades med att spela denna ström Allvarligt spelarfel inträffade Återhämtar sig från spelarfel - Rapportera detta fel via e-post + Rapportera via e-post Vad:\\nBegäran:\\nInnehållsspråk:\\nInnehållsland:\\nApp-språk:\\nTjänst:\\nGMT-tid:\\nPaket:\\nVersion:\\nOS-version: Spela video, längd: Uppladdarens avatar-miniatyrbild @@ -151,7 +150,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 +174,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,11 +189,9 @@ 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 - Stäng av för att förhindra att miniatyrbilder läses in, vilket sparar data- och minnesanvändning. Ändringarna rensar både bildcacheminnet i minnet och på disken Cacheminnet för bilder rensat Debug Alltid @@ -206,7 +203,7 @@ Inexakt sökning gör det möjligt att söka snabbare med mindre precision. Att hoppa 5, 15 eller 25 sekunder fungerar inte med detta val Ta bort alla cachade webbsidor Metadata cache rensad - Köa nästa ström automatiskt + Köa nästa strömning automatiskt Fortsätt avsluta (icke-upprepande) uppspelningskö genom att lägga till en relaterad ström Standard innehållsland Kanaler @@ -214,7 +211,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 @@ -229,20 +226,19 @@ Ta bort hela sökhistoriken\? Sökhistorik borttagen Externa spelare stöder inte dessa typer av länkar - Inga videoströmmar hittades + Inga videoströmningar hittades Inga ljudspår hittades Ingen sådan mapp Ingen sådan fil/innehållskälla Filen finns inte eller behörighet att läsa eller skriva till den saknas Filnamnet får inte vara tomt Ett fel uppstod: %1$s - Inga strömmar tillgängliga för hämtning + Inga strömningar tillgängliga för hämtning Dra för att ändra ordning Skapa Avfärda Byt namn 1 objekt borttaget. - Ingen app installerad för att spela upp filen NewPipes sekretesspolicy NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport. @@ -281,9 +277,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 @@ -304,7 +300,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) @@ -331,14 +327,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 @@ -354,7 +346,7 @@ Listvy Lista Rutnät - Automatiskt + Automatisk En NewPipe-uppdatering är tillgänglig! Färdig pausad @@ -432,7 +424,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 @@ -442,7 +434,7 @@ Mest gillade Nyligen tillagd Lokala - Klar + Klar Slå på YouTubes \"Begränsat läge\" Språket ändras när appen startas om Det gick inte att läsa in kommentarerna @@ -511,7 +503,7 @@ Kan inte återställa den här hämtningen Anslutnings avbrott Framsteg förlorat, för att filen blev borttagen - Inget utrymme kvar på enhet + Inget utrymme kvar på enhet NewPipe stängdes under arbete med en fil Vänligen kontrollera om en felrapport som tar upp din krasch redan finns. Att skapa ärenden när en felrapport redan finns, tar av den tid som vi annars kunde ha ägnat åt att fixa den faktiska buggen. Rapportera på GitHub @@ -537,8 +529,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. @@ -575,7 +567,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! @@ -622,13 +614,12 @@ Beskrivning Kommentarer Denna video här en åldersgräns. -\nPå grund av nya YouTube-regler med åldersgräns för vissa videor kan NewPipe inte komma åt någon av dess videoströmmar och kan därmed inte spela upp den. +\nPå grund av nya YouTube-regler med åldersgräns för vissa videor kan NewPipe inte komma åt någon av dess videoströmningar och kan därmed inte spela upp den. Visa innehåll som pga sin åldersgräns (ex 18+) kan vara olämpligt för barn Visa beskrivning Ö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 @@ -636,9 +627,8 @@ Aktuellt Natt-tema Aviseringar för videohashningsframsteg - Miniatyrbild-webbadress - Inaktivera medietunnel om du upplever en svart skärm eller stamning vid videouppspelning - Inaktivera mediatunnel + Inaktivera medietunnel om du upplever en svart skärm eller att videouppspelningen hackar. + 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 @@ -660,9 +650,9 @@ 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 + Sök efter uppdateringar Kolla manuellt efter nya versioner Söker efter uppdateringar… Nya flödes objekt @@ -670,7 +660,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 @@ -682,7 +672,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 @@ -690,34 +680,31 @@ 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ömningar för prenumerationer - %s Ny ström - %s Nya strömmar + %s Ny strömning + strömningar%s Nya strömningar Konfigurera meddelande om aktuell ström som spelas upp - Kör leta efter nya strömmar - Meddela om nya strömmar från prenumerationer + Kör leta efter nya strömningar + Meddela om nya strömningar från prenumerationer Aviseringar - Nya strömmar + Nya strömningar Laddar strömdetaljer… - Avisering om nya strömmar + Aviseringar om nya strömningar , Spelaravisering Växla alla Procent Halvton - Inga videoströmmar tillgängliga för externa spelare + Inga videoströmningar tillgängliga för externa spelare Okänd kvalitet - Inga ljudströmmar tillgängliga för externa spelare + Inga ljudströmningar tillgängliga för externa spelare Okänt format - Videoströmmar som ännu inte stöds av nedladdaren visas inte - Inläsningsintervalls storlek + Videoströmningar som ännu inte stöds av nedladdaren visas inte + Inläsningsintervallsstorlek 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 @@ -726,4 +713,116 @@ Snabbt läge Du använder den senaste versionen av NewPipe Tryck för att ladda ner %s + Det här alternativet är endast tillgängligt om %s har valts som Tema + Inaktivera permanent miniatyrbild + Det gick inte att kopiera till urklipp + Kort + Dubblett tillagd %d gång(er) + Spellistor som är gråmarkerade innehåller redan det här objektet. + Användbart om du till exempel använder ett headset med trasiga fysiska knappar + Ignorera hårdvarans mediaknappar + Ta bort dubbletter\? + Visa följande strömningar + Delvis sedd + Vill du ta bort alla duplicerade strömningar i den här spellistan\? + Ta bort dubbletter + Visa/Dölj strömningar + Fullständigt sedd + Kommande + Volym + Ingen + Välj en gest för den vänstra halvan av spelarskärmen + Ljusstyrka + Vänstergest åtgärd + Välj en gest för den högra halvan av spelarskärmen + Högergest å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 + %1$s %2$s + original + beskrivande + dubbad + Flytta huvudflik väljaren till botten + Huvudflikarnas position + Inga strömningar + Inga live-strömningar + Medietunnel har inaktiverats som standard på din enhet eftersom att enhetsmodellen inte stöder funktionen. + Bildkvalité + Videor + Prenumeranter + Vilka filkar visas på kanalsidorna + Dela URL-lista + Kanalflikar + Shorts + Laddar Metadata… + Aktivera skärmorientering + Låg kvalité + Aktivera helskärm + Hämta kanalflikar + Nästa strömning + Öppna spelkö + Ladda inte bilder + Hög kvalité + Om + Dela spellista + Spola frammåt + Album + Spola tillbaka + Återspela + Medelkvalité + Spellistor + Spela + Fler alternativ + Miniatyrbilder + Spår + Längd + Kanaler + Föregående strömning + Live + \? + Dela med Titlar + %1$s +\n%2$s + Visningsbilder + Underkanalens visningsbilder + Flikar att hämta när flödet uppdateras. Det här alternativet har ingen effekt om en kanal uppdateras i snabbt läge. + Uppladdarens visningsbilder + Banderoller + - %1$s: %2$s + Dela spellistan med detaljer så som spellistans namn och video-titlarna eller som en enkel lista med URL till videorna + Välj bildkvalitet och om bilder överhuvudtaget ska laddas för att minska data och minnesanvändningen. Ändringar rensar både i minnet och bildcache på disk – %s + Visa mer + + %s svar + %s svar + + Visa mindre + Redigera varje aviseringsåtgärd nedan genom att trycka på den. De tre första åtgärderna (spela/pausa, föregående och nästa) är satta av systemet och kan inte ändras. + Inte tillräckligt med ledigt utrymme på enheten + Nej + Säkerhetskopiering och återställning + Ja + NewPipe kan automatiskt söka efter nya versioner då och då och meddela dig när de är tillgängliga. +\nVill du aktivera detta? + Återställ inställningar + Återställ alla inställningar till deras standardvärden + Om du återställer alla inställningar försvinner alla dina föredragna inställningar och appen startas om. +\n +\nÄr du säker på att du vill fortsätta? + Inställningarna i exporten som importeras använder ett sårbart format som fasades ut i NewPipe 0.27.0. Se till att exporten som importeras är från en betrodd källa, och överväg att endast använda exporter som erhållits från NewPipe 0.27.0 eller nyare i framtiden. Stöd för import av inställningar från detta sårbara format kommer snart att tas bort helt, och sedan kommer gamla versioner av NewPipe inte att kunna importera inställningar av exporter från nya versioner längre. \ 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..80d1aa97be8 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -50,7 +50,6 @@ கருமை திரைமேல் பண்புகளை நினைவுகொள் திரைமேல் நிலையின் கடைசி அளவையும் இடத்தையும் நினைவுகொள் - சிறுபடத்தைக் இறக்கு பட பதுக்ககம் அழிக்கப்பட்டது மேல்நிலைத்தரவின் பதுக்ககம் அழிக்கப்பட்டது பதுக்ககப்படுத்திய வலைப்பக்கத் தரவை நீக்கு @@ -146,8 +145,8 @@ %s பார்வைகள் - காணொளிகள் - காணொளிகள் + %sகாணொளிகள் + %sகாணொளிகள் முதற்பக்கத்துக்கு மாற்று எந்த காணொலியும் இல்லை @@ -157,10 +156,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - சத்தக் கட்டுப்பாடு செய்கை - இயக்கிச் சத்தத்தைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து - வெளிச்ச கட்டுப்பாடு செய்கை - இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் கோப்பு அழிக்கப்பட்டது செயலி புதுப்பித்தல் அறிவிப்பு @@ -193,7 +188,7 @@ செயலிலுள்ள இயக்கி வரிசை மாற்றப்படும் ஒரு இயக்கி விட்டு மறு இயக்கி மாறுதல் உங்கள் வரிசையை மாற்றக்கூடும் துல்லியமற்ற நாடல் குறைந்த துல்லியத்துடன் விரைவாக நாட இயக்கியை அனுமதிக்கிறது. 5, 15 அ 25 நொடிகள் நாடுவது இதனுடன் செயல்படாது - இரவு தோற்றம் + இரவுத் தோற்றம் சிறுபடத்திலுள்ள முதன்மை நிறத்திற்கேற்ப அறிவிப்பின் நிறத்தை Androidஐ தனிப்பயனாக்கச் செய் (இது எல்லா சாதனங்களிலும் கிடைக்காதென்பதை குறித்துக்கொள்) அறிவிப்பை வண்ணமயமாக்கு ஏதுமில்லை @@ -268,7 +263,6 @@ ப.ல இயக்கியைச் சிதை - சிறுபடங்களேற்றுவதை தவிர்த்து தரவு மற்றும் நினைவகப் பயன்பாட்டைச் சேமிக்க அணை. மாற்றங்கள் நினைவகத்துள் மற்றும் வட்டின்மீதுள்ள பிடிதரவைத் துடைக்கும் பட்டியல்களில் இயக்கக குறியட நிலைகாட்டிகளைக் காட்டு துணையியக்கியில் காணொளிகளை துவக்காதே, ஆனால் தானாக சுழற்றல் பூட்டப்பட்டிருந்தால் நேரடியாக முழுதிரைக்குத் திரும்பு. முழுதிரையை வெளியேறி நீங்கள் இன்னும் துணையியக்கியை அணுகலாம் உரலியை அங்கீகரக்க முடியவில்லை. மற்றொரு செயலியில் திறக்கவா\? @@ -320,7 +314,7 @@ ஒருபோதுமில்லை பட்டியல் பார்வை முறை இப்பெயருடன் ஏற்கனவே ஒரு பதிவிறக்கிய கோப்பு உள்ளது - பதிவிறக்கிய கோப்புகளை அழி + பதிவிறக்கிய கோப்புகளை நீக்கு இயங்குதள இயல்பிருப்பு சிறுபடங்காட்டு தானியங்கி (சாதன தோற்றம்) @@ -368,10 +362,15 @@ அறிவிப்புகள் வீடியோ ஹாஷ் அறிவிப்பு புதிய நீரோடைகள் - வீடியோ URL கையொப்பத்தை நீக்க முடியவில்லை வீடியோ ஹேஷிங் முன்னேற்றத்திற்கான அறிவிப்புகள் சந்தாவுக்கான புதிய ஸ்ட்ரீம்கள் பற்றிய அறிவிப்புகள் இந்த வீடியோ வயது வரம்புக்குட்பட்டது. \nவயது வரம்புக்குட்பட்ட வீடியோக்கள் கொண்ட புதிய YouTube கொள்கைகள் காரணமாக, NewPipe ஆல் அதன் எந்த வீடியோ ஸ்ட்ரீம்களையும் அணுக முடியாது, இதனால் அதை இயக்க முடியவில்லை. வேகமான பயன்முறை + ஆம் + இல்லை + வட்டில் இருக்கும் பதிவிறக்கம் செய்யப்பட்ட அனைத்து கோப்புகளையும் அழிக்கவா? + இந்தக் குழுவை நீக்க வேண்டுமா? + நீக்கு + ஒரு உருப்படி நீக்கப்பட்டது. \ No newline at end of file diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index ac34a316ed1..6c8bb771918 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -115,11 +115,11 @@ న్యూపిప్ గురించి మూడవ పార్టీ లైసెన్స్ గురించి - లైసెన్సుల + లైసెన్సులు GitHub పై చూడండి - న్యూపెయిప్స్ లైసెన్స్ + న్యూపెయిప్ యొక్క లైసెన్స్ మీకు ఆలోచనలు ఉన్నాయా; అనువాదం, డిజైన్ మార్పులు, కోడ్ శుభ్రపరచడం లేదా నిజమైన భారీ కోడ్ మార్పులు-సహాయం ఎల్లప్పుడూ స్వాగతం. ఎంత ఎక్కువ చేస్తే అంత మంచిది! - లైసెన్స్ చదువు + లైసెన్స్‌ను చదువు సహకరించటానికి చరిత్ర చరిత్ర @@ -146,7 +146,7 @@ పూర్తి స్క్రీన్‌లో ప్రధాన ప్లేయర్‌ని ప్రారంభించండి డీబగ్ చేయండి ఏమిలేదు - నోటిఫికేషన్‌లో చూపబడిన వీడియో థంబ్‌నెయిల్‌ను 16:9 నుండి 1:1 కారక నిష్పత్తికి స్కేల్ చేయండి (వక్రీకరణలను ప్రవేశపెట్టవచ్చు) + నోటిఫికేషన్‌లో చూపబడిన వీడియో థంబ్‌నెయిల్‌ను 16:9 నుండి 1:1 కారక నిష్పత్తికి మార్చుము పునరావృతం చేయండి వీడియో \"వివరాలు:\"లో బ్యాక్‌గ్రౌండ్ లేదా పాప్‌అప్ బటన్‌ను నొక్కినప్పుడు చిట్కాను చూపు URLని గుర్తించడం సాధ్యపడలేదు. మరొక యాప్‌తో తెరవాలా\? @@ -165,13 +165,11 @@ అధిక స్పష్టతను చూపుము నలుపు పాప్అప్ లక్షణాలను గుర్తుంచుకో - సూక్ష్మచిత్రాలను లోడ్ చేయండి వ్యాఖ్యలను చూపించు వ్యాఖ్యలను దాచడాన్ని ఆఫ్ చేయండి %sలో మీకు నచ్చిన సందర్భాలను కనుగొనండి పీర్‌ట్యూబ్ ఉదాహరణలు మూడవ చర్య బటన్ - థంబ్‌నెయిల్‌లను లోడ్ చేయడం, డేటాను సేవ్ చేయడం మరియు మెమరీ వినియోగాన్ని నిరోధించడానికి ఆఫ్ చేయండి. మార్పులు ఇన్-మెమరీ మరియు ఆన్-డిస్క్ ఇమేజ్ కాష్ రెండింటినీ క్లియర్ చేస్తాయి ఖచ్చితమైన శోధన తగ్గిన ఖచ్చితత్వంతో వేగంగా స్థానాలను పొందేందుకు ఆటగాడిని అనుమతిస్తుంది. 5, 15 లేదా 25 సెకన్ల పాటు కోరడం దీనితో పని చేయదు వేగవంతమైన ఖచ్చితమైన శోధనను ఉపయోగించండి జోడించండి @@ -179,14 +177,13 @@ ట్యాబ్‌ని ఎంచుకోండి సభ్యత్వాన్ని తొలగించుము సమాచారాన్ని చూపుము - సూక్ష్మచిత్రాన్ని 1:1 కారక నిష్పత్తికి స్కేల్ చేయండి + సూక్ష్మచిత్రాన్ని 1:1 కారక నిష్పత్తికి మార్చుము ఒక ప్లేయర్ నుండి మరొక ప్లేయర్‌కు మారడం వలన మీ క్యూను భర్తీ చేయవచ్చు సంబంధిత స్ట్రీమ్‌ను జోడించడం ద్వారా (పునరావృతం కాని) ప్లేబ్యాక్ క్యూను ముగించడాన్ని కొనసాగించండి దిగువన ఉన్న ప్రతి నోటిఫికేషన్ చర్యను దానిపై నొక్కడం ద్వారా సవరించండి. కుడివైపు ఉన్న చెక్‌బాక్స్‌లను ఉపయోగించడం ద్వారా కాంపాక్ట్ నోటిఫికేషన్‌లో చూపబడే వాటిలో మూడు వరకు ఎంచుకోండి పాప్అప్ చివరి పరిమాణం మరియు స్థానాన్ని గుర్తుంచుకోండి వీడియో వివరణ మరియు అదనపు సమాచారాన్ని దాచడాన్ని ఆఫ్ చేయండి స్ట్రీమ్ సృష్టికర్త, స్ట్రీమ్ కంటెంట్ లేదా శోధన అభ్యర్థన గురించి అదనపు సమాచారంతో మెటా సమాచార పెట్టెలను దాచడానికి ఆఫ్ చేయండి - ప్లేయర్ ప్రకాశాన్ని నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి శోధిస్తున్నప్పుడు చూపాల్సిన సూచనలను ఎంచుకోండి చివరి ప్లేబ్యాక్ స్థానాన్ని పునరుద్ధరించండి మీకు ఇష్టమైన పీర్‌ట్యూబ్ సందర్భాలను ఎంచుకోండి @@ -204,7 +201,7 @@ షఫుల్ చేయండి బఫరింగ్ డిఫాల్ట్ వీడియో ఫార్మాట్ - రాత్రి థీమ్ + చీకటి థీమ్ చీకటి ఫాస్ట్-ఫార్వర్డ్/-రివైండ్ సీక్ వ్యవధి క్యూను క్లియర్ చేయడానికి ముందు నిర్ధారణ కోసం అడగండి @@ -214,9 +211,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - వాల్యూమ్ సంజ్ఞ నియంత్రణ - ప్లేయర్ వాల్యూమ్‌ను నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి - ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి శోధన చరిత్ర శోధన ప్రశ్నలను స్థానికంగా నిల్వ చేయండి @@ -269,7 +263,6 @@ ప్లేబ్యాక్ స్థానాలు తొలగించబడ్డాయి బాహ్య ప్లేయర్‌లు ఈ రకమైన లింక్‌లకు మద్దతు ఇవ్వవు చెక్సమ్ - వీడియో URL సంతకాన్ని డీఓబ్‌ఫస్కేట్ చేయడం సాధ్యపడలేదు GitHubపై నివేదించు ఇక్కడ క్రికెట్‌లు తప్ప మరేమీ లేదు ఎవరూ వినడం లేదు @@ -325,7 +318,6 @@ లోపనివేదన నోటిఫికేషన్ చెరుపు వాటిని తీసివేయడానికి వాటిని స్వైప్ చేయండి - ఈ ఫైల్‌ని ప్లే చేయడానికి యాప్ ఏదీ ఇన్‌స్టాల్ చేయబడలేదు మరింత సమాచారం మరియు వార్తల కోసం NewPipe వెబ్‌సైట్‌ని సందర్శించండి. NewPipe ప్రాజెక్ట్ మీ గోప్యతను చాలా తీవ్రంగా పరిగణిస్తుంది. కాబట్టి, మీ సమ్మతి లేకుండా యాప్ ఎలాంటి డేటాను సేకరించదు. \nNewPipe యొక్క గోప్యతా విధానం మీరు క్రాష్ నివేదికను పంపినప్పుడు ఏ డేటా పంపబడుతుందో మరియు నిల్వ చేయబడుతుందో వివరంగా వివరిస్తుంది. @@ -353,7 +345,7 @@ 1 అంశం తొలగించబడింది. పరిష్కరించబడినప్పుడు \"పూర్తయింది\" నొక్కండి పరిష్కరించండి - పూర్తి + పూర్తి చాలా ప్రత్యేక పాత్రలు ఆండ్రాయిడ్‌లో లిబ్రే తేలికపాటి స్ట్రీమింగ్. వాలంటీర్లు తమ ఖాళీ సమయాన్ని వెచ్చిస్తూ మీకు ఉత్తమ వినియోగదారు అనుభవాన్ని అందించడం ద్వారా NewPipe అభివృద్ధి చేయబడింది. డెవలపర్‌లు ఒక కప్పు కాఫీని ఆస్వాదిస్తున్నప్పుడు న్యూపైప్‌ని మరింత మెరుగ్గా చేయడంలో సహాయపడటానికి తిరిగి ఇవ్వండి. @@ -405,7 +397,7 @@ తేలియాడే ప్లేయర్ ప్రాసెస్ చేస్తోంది... కొంత సమయం పట్టవచ్చు వినోదజాబితా సూక్ష్మచిత్రం మార్చబడింది. - శీర్షికలు లేవు + శీర్షికలు వద్దు వినోదజాబితా రూపొందించబడింది వినోదజాబితా చేయబడింది అన్‌మ్యూట్ చేయండి @@ -418,7 +410,6 @@ పరివీక్షణ తేలియాడే విధంగా మార్చు తదుపరి స్ట్రీమ్‌ను స్వీయ-ఎన్క్యూ - లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ ప్రారంభ వీడియో లోడింగ్‌ని వేగవంతం చేయవచ్చు. మార్పులకు ప్లేయర్ రీస్టార్ట్ అవసరం. LeakCanary అందుబాటులో లేదు ప్లేయర్ శీర్షిక వచన స్థాయి మరియు నేపథ్య శైలులను సవరించండి. అమలులోకి రావడానికి యాప్ రీస్టార్ట్ అవసరం స్వయంచాలకంగా రూపొందించబడింది (ఎక్కించినవారు కనబడుటలేదు) @@ -471,4 +462,13 @@ ఆగిపోయింది క్రమం %sని డౌన్‌లోడ్ చేయడానికి నొక్కండి + దిగువన ఉన్న ప్రతి నోటిఫికేషన్ చర్యను దానిపై నొక్కడం ద్వారా సవరించండి. మొదటి మూడు చర్యలు (ప్లే/పాజ్, మునుపటి మరియు తదుపరి) సిస్టమ్ ద్వారా సెట్ చేయబడ్డాయి మరియు అనుకూలీకరించబడవు. + భాషతో సంబంధం లేకుండా అసలు ఆడియో ట్రాక్‌ని ఎంచుకోండి + వివరణాత్మక ఆడియోకు ప్రాధాన్యత ఇవ్వండి + ఉదాహరణకు, మీరు విరిగిన భౌతిక బటన్‌లతో హెడ్‌సెట్‌ని ఉపయోగిస్తుంటే ఉపయోగకరంగా ఉంటుంది + ప్రగతిశీల విషయాలపై లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ వాటి ప్రారంభ లోడింగ్‌ను వేగవంతం చేయవచ్చు + హార్డ్‌వేర్ మీడియా బటన్ ఈవెంట్‌లను విస్మరించండి + అసలు శ్రావ్యయానికి ప్రాధాన్యత ఇవ్వండి + మొబైల్ డేటా వాడుతున్నప్పుడు స్పష్టతకు హద్దుపెట్టు + 3-చుక్కల మెనూలో సభ్యత్వాలను ఎగుమతి లేదా దిగుమతి చేయండి \ No newline at end of file diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index af5bb73efcb..f54c55eae86 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -15,7 +15,7 @@ ตั้งค่า หรือคุณหมายถึง \"%1$s\"\? แชร์ด้วย - Use external video player + ใช้เครื่องเล่นวีดิโอภายนอก ใช้แอปเล่นเสียงภายนอก ติดตาม ติดตามแล้ว @@ -33,10 +33,10 @@ เพิ่มไปยัง เส้นทางการดาวน์โหลดวิดีโอ เส้นทางในการจัดเก็บวิดีโอที่ดาวน์โหลดมา - ป้อนเส้นทางการดาวน์โหลดสำหรับวิดีโอ + เลือกเส้นทางการดาวน์โหลดสำหรับไฟล์วิดีโอ โฟลเดอร์ที่ดาวน์โหลดเสียง - เสียงที่ดาวน์โหลดจะถูกเก็บไว้ที่นี่ - ป้อนเส้นทางการดาวน์โหลดสำหรับไฟล์เสียง + ไฟล์เสียงที่ดาวน์โหลดไว้จะถูกเก็บไว้ที่นี่ + เลือกเส้นทางการดาวน์โหลดสำหรับไฟล์เสียง ความละเอียดเริ่มต้น ความละเอียดเริ่มต้นในโหมดป๊อปอัพ แสดงความละเอียดที่สูงขึ้น @@ -56,18 +56,12 @@ จำขนาดและตำแหน่งสุดท้ายของป๊อปอัพ ใช้การข้ามที่ไม่แม่นยำ การข้ามช่วงที่ไม่แม่นยำจะทำให้เลื่อนไปยังตำแหน่งเวลาที่ต้องการได้เร็วขึ้น แต่จะลดความแม่นยำในการลากตำแหน่งลง - โหลดภาพขนาดย่อ แสดงความคิดเห็น ปิดใช้งานเพื่อซ่อนความคิดเห็น - ปิดเพื่อป้องกันการโหลดรูปขนาดย่อ ลดการใช้ข้อมูลและหน่วยความจำ การเปลี่ยนแปลงล้างแคชภาพในหน่วยความจำและบนดิสก์ ล้างแคชของรูปภาพแล้ว ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - การควบคุมระดับเสียงด้วยท่าทาง - ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น - การควบคุมความสว่างด้วยท่าทาง - ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา แสดงคำแนะนำเมื่อทำการค้นหา ประวัติการค้นหา @@ -137,7 +131,6 @@ การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่\? ข้อผิดพลาดของเครือข่าย ไม่สามารถโหลดรูปขนาดย่อทั้งหมด - ไม่สามารถถอดรหัสลายเซ็น URL ของวิดีโอ ไม่สามารถแยกวิเคราะห์เว็บไซต์ เนื้อหาไม่พร้อมใช้งาน ไม่สามารถตั้งค่าเมนูดาวน์โหลด @@ -207,7 +200,6 @@ อักขระทดแทน ตัวอักษรและตัวเลข อักขระพิเศษส่วนใหญ่ - ไม่มีแอพที่ติดตั้งเพื่อให้เล่นไฟล์นี้ได้ เกี่ยวกับ NewPipe สัญญาอนุญาตของบุคคลที่สาม © %1$s โดย %2$s ภายใต้ %3$s @@ -357,7 +349,7 @@ หยุดชั่วคราวเมื่อเปลี่ยนเป็นข้อมูลมือถือ การดาวน์โหลดที่ไม่สามารถหยุดพักได้จะเริ่มต้นใหม่ ปิด - Removes audio at some resolutions + บางความละเอียดอาจไม่มีเสียง แคช metadate ถูกลบแล้ว เล่นต่อหลังจากการขัดจังหวะ เล่นต่อ @@ -366,4 +358,16 @@ แสดงตำแหน่งวีดิโอที่เล่นในรายการ ล้างข้อมูล กำลังแสดงผลลัพธ์สำหรับ: %s + เปิดด้วย + ทำเครื่องหมายว่าดูแล้ว + ตกลง + ปุ่มการกระทำที่สี่ + ปุ่มการกระทำแรก + ปุ่มการกระทำที่สาม + ปุ่มการกระทำที่ห้า + แก้ไขการกระทำของการแต่การแจ้งเตือนด้วยการแตะไปที่มัน เลือกสามรายการที่จะแสดงในการแจ้งเตือนในการแจ้งเตือนแบบกระทัดรัดโดยใช้ปุ่มกาเครื่องหมายทางขวา + ครอบตัดตัวอย่างภาพเป็นอัตราส่วน 1:1 + ครอบตัดตัวอย่างภาพที่แสดงในการแจ้งเตือนจากอัตราส่วน 16:9 เป็น 1:1 + ทำเครื่องเล่นพัง + ปุ่มการกระทำรอง \ No newline at end of file diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml new file mode 100644 index 00000000000..252f13954d2 --- /dev/null +++ b/app/src/main/res/values-ti/strings.xml @@ -0,0 +1,74 @@ + + + ሰረዝ + ኣብ መርበብ-ሓበሬታ ክፉት + ውጽኢት ምርኣዩ ን፦ %s + መጀመርታ ምእንቲ ኽትጅምር ነቲ ዜጕልሕ መረጼን ጠውቆ። + ኣብ %1$s እተሓትመ + ወሓይዝ ዚጻወት ኣይተረኽበን። VLC፧ + ሐራይ + ቅጥዕታት + \"%1$s\" ማለቱ ድዩ፧ + ዚተሪየ ጋባራ + ክፉቴ ምሲ + ፋይል ውሕጅ ኣራግፍ + ድለ + ኣካፍሎ + ኣራግፍ + ኣካፍሎም ምሲ + መስመር ኣይትጽንበሩ + ኣብ ሓፍ፡ሓፍ ቅዲ ክፉት + ሰዓብካ\'ኪ + ክቕይር ኣይከኣለን ምዝገብ + ድምጺታት ኣብ ገለ ርዝነት የወግድ + ወሓይዝ ዚጻወት ኣይተረኽበን። (ንኽትጻወቶ VLC ከተውራድ ትኽእል)። + ክሕደስ ኣይከኣለን ምዝገባ + ሰዓበ + ናይ ደገ ቪድዮ ተጠቐም መጻወቲ + ምውራድ + ኣይትጽንበሩ + ነቲ ኣብ\'ቲ ምልክታ ዝተርኣየ ናይ ቪድዮ ምስሊ ካብ 16:9 ናብ 1:1 ርሕቐት ኣቀራርባ ቅረጽ + ምስ Kodi ተጻወት + ድምር ምስ + ሓበሬታ ኣርእዩ + መፍለጢ ሕብሪ ልኸ + \"Play with Kodi\" ኣማራጺ + ዝያዳ ድንቀት ኣርኢ + ንተንቃሳቀሴ-ምስሌ ፋይላት ዝኸውን ናይ ምውራድ ማህደር ምረጽ + ተጻዋታይ ወደቀ + ድምጺ + ድምጺ ምውራድ ማህደር ፋይላት ኣብዚ ይኽዘኑ + ዋላ-ሓንቲ + ገለ መሳርሒታት ጥራይ እዮም 2K/4K ተንቃሳቀሴ-ምስሌ ክጻወቱ ዝኽእሉ + ናይ ደገ ድምጺ መጻወቲ ተጠቐም + Android ሕብሪ ናይቲ መተሓሳሰቢ ብመሰረት እቲ ኣብቲ ንእሽቶ ስእሊ ዘሎ ቀንዲ ሕብሪ ከም ዝጥዕሞ ግበር (እዚ ኣብ ኩሉ መሳርሒታት ከምዘይርከብ ኣስተውዕል) + ትሑዝ ፖፕኣፕ ድንቀት + ነፍሲ ወከፍ መፍለጢ ተግባር ኣብ ታሕቲ ብምጥዋቕ ኣርትዖ። ኣብቲ ውህሉል መተሓሳሰቢ ንኽርአ ክሳብ ሰለስተ ካብኣቶም ምረጽ፡ ኣብ የማናይ ሸነኽ ዘሎ ሳጹናት ብምጥቃም + ፖፕኣፕ + ትሑዝ ድንቀት + ዝወረዱ ናይ ተንቃሳቀሴ-ምስሌ ፋይላት ኣብዚ ይኽዘኑ + + ናይ እኽሊ ምስሊ ምስ ናይ 1:1 ርክባት + ቀዳማይ ወሰን ተጠዋቃ + ደገመ + ድምጺ ምውራድ ማህደር + ቦኦክማርከድ ዝርዝር-ጸወታ + ናይ ድምጺ ፋይል ኣራግፍ ምረጽ + ዝጎደለ ኮረ ኣፕፕ ኣውራድ፧ + ነባሪ ቅርጺ ድምጺ + ምዝገባ + Kodi ሚድያ ማእኸል ቪድዮ ንምጽዋት ዝሕግዝ ኣማራጺ + ኣብቲ ውሱን መፍለጢ ንምርኣይ እንተበዝሐ ሰለስተ ተግባራት ክትመርጽ ትኽእል ኢኻ! + ተንቃሳቀሴ-ምስሌ ፋይል ኣራግፍ + ታብ ምረጽ + ድሕረ ባይታ + ብርሃን + ጸልማት + ካልኣይ ስጉምቲ መጠወቒ + ሳልሳይ ስጉምቲ መጠወቒ + ሓሙሻይ ስጉምቲ መጠወቒ + እወ + ኣይፋልን + ጸሊም + ኣርእስቲ + \ No newline at end of file diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index d41b317e898..02794a62015 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -66,4 +66,5 @@ \nBuksan ang \"%1$s\" sa ayos ng app kung gusto mong makita ito. Mga Artista Nakalutang + \ 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 5c3d072047e..192eb4e2c07 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 + Video oynatıcısı bulunamadı. VLC kurulsun mu? + Kur İptal Tarayıcıda aç Paylaş @@ -20,12 +20,12 @@ Ses indirme klasörü İndirilen ses dosyaları burada depolanır Ses dosyaları için indirme klasörünü seç - Öntanımlı çözünürlük + Varsayılan çözünürlük Kodi ile oynat Eksik Kore uygulaması yüklensin mi\? \"Kodi ile oynat\" seçeneğini göster Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster - Öntanımlı ses biçimi + Varsayılan ses biçimi Tema Koyu Açık @@ -46,19 +46,18 @@ Hata Ağ hatası Küçük resimlerin tamamı yüklenemedi - Video URL imzasının şifresi çözülemedi Web sitesi ayrıştırılamadı İçerik kullanılamıyor Uygulama/kullanıcı arayüzü çöktü Üzgünüz, bu olmamalıydı. - Bu hatayı e-posta aracılığıyla bildir + E-posta ile bildir Üzgünüz, bir şeyler yanlış gitti. Bildir Bilgi: Ne oldu: Ne:\\nİstek:\\nİçerik Dili:\\nİçerik Ülkesi:\\nUygulama Dili:\\nHizmet:\\nGMT Zamanı:\\nPaket:\\nSürüm:\\nİşletim sistemi sürümü: Videoyu oynat, süre: - Yükleyicinin avatar küçük resmi + Yükleyenin avatar küçük resmi Beğeni Beğenmeme Video @@ -78,11 +77,11 @@ Panoya kopyalandı Lütfen daha sonra ayarlardan uygun indirme klasörü belirleyin İndirme menüsü ayarlanamadı - Açılır pencere kipinde aç - Öntanımlı açılır pencere çözünürlüğü + Açılır pencere modunda aç + Varsayılan açılır pencere çözünürlüğü Yüksek çözünürlükleri göster Yalnızca bazı aygıtlar 2K/4K videoları oynatabilir - Öntanımlı video biçimi + Varsayılan video biçimi Siyah Açılır pencere kipinde oynatılıyor Tümü @@ -103,7 +102,7 @@ Açılan pencerenin son boyutunu ve konumunu hatırla Bazı çözünürlüklerde sesi kaldırır Arama önerileri - Ararken gösterilecek önerileri seç + Arama yaparken öneriler gösterilsin mi En iyi çözünürlük NewPipe Hakkında Üçüncü Taraf Lisansları @@ -191,7 +190,7 @@ Ana Görünüme Geç Çekmeceyi Aç Çekmeceyi Kapat - Akış oynatıcı bulunamadı (Oynatmak için VLC kurabilirsiniz). + Video oynatıcı bulunamadı (Oynatmak için VLC kurabilirsiniz). Her Zaman Yalnızca Bir Kez Dış oynatıcılar bu tür bağlantıları desteklemez @@ -213,11 +212,11 @@ Bu, var olan kurulumunuzu geçersiz kılacaktır. Akış dosyasını indir Bilgi göster - İmlenen Oynatma Listeleri + İmlenen Çalma Listeleri Ekle Yeniden düzenlemek için sürükleyin Oluştur - Reddet + Dışla Yeniden adlandır Son Oynatılan En Çok Oynatılan @@ -238,13 +237,13 @@ Doldur Yakınlaştır Hata ayıklama - Otomatik oluşturulan + Kendiliğinden oluşturulan Bellek sızıntısı izleme, yığın boşaltımı sırasında uygulamanın yanıtlamamasına neden olabilir Yaşam döngüsü dışı hatalarını bildir Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsündeki teslim edilemeyen Rx beklentilerinin bildirimini zorla Hızlı isabetsiz konumlama kullan İsabetsiz konumlama, oynatıcının daha düşük hassasiyetle daha hızlı konumlamasını sağlar. 5, 15 veya 25 saniyeye konumlama bununla birlikte çalışmamaktadır - Sonraki akışı otomatik kuyruğa ekle + Sonraki videoyu kuyruğa otomatik ekle İlgili bir akış ekleyerek sonlanacak (yinelemeyen) oynatma sırasını sürdür Dosya Böylesi klasör yok @@ -280,10 +279,8 @@ Bu sürecin ağa yük olabileceğini unutmayın. \n \nSürdürmek istiyor musunuz\? - Küçük resimleri yükle - Küçük resimlerin yüklenmesini önleyerek veri ve hafıza kullanımından tasarruf etmek için kapatın. Değişiklikler, hem bellek içi hem de diskteki resim önbelleğini temizler - Resim önbelleği silindi - Önbelleğe alınmış üstverileri temizle + Resim önbelleği temizlendi + Önbelleğe alınmış meta verileri silin Önbelleğe alınmış tüm web sayfası verilerini kaldır Üstveri önbelleği temizlendi Oynatım Hızı Denetimleri @@ -295,7 +292,6 @@ Paylaşma ekranında tanımlı eylem — %s Alt yazılar Oynatıcı alt yazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir - Bu dosyayı oynatmak için herhangi bir uygulama yüklü değil İzleme geçmişini temizle Oynatılan akışların geçmişini ve kalınan oynatım konumlarını siler İzleme geçmişinin tamamı silinsin mi\? @@ -331,10 +327,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 @@ -351,7 +343,7 @@ Liste görünümü kipi Liste Izgara - Otomatik + Kendiliğinden Tamamlandı durduruldu sırada @@ -383,7 +375,7 @@ Beklemede Yorumları göster Yorumları gizlemek için kapatın - Otomatik oynatma + Kendiliğinden oynat Yorum yok Yorumlar yüklenemedi Kapat @@ -398,7 +390,7 @@ dosyanın üzerine yazılamaz Bu isim ile bekleyen bir indirme var NewPipe bu dosya üzerinde çalışırken kapandı - Aygıt üzerinde yer yok + Aygıt üzerinde yer yok İlerleme kaybedildi, çünkü dosya silinmiş Bağlantı zaman aşımı İndirme geçmişinizi temizlemek veya indirilen tüm dosyaları silmek istiyor musunuz\? @@ -422,8 +414,8 @@ Öntanımlı Kiosk Kimse izlemiyor - %s izleyen - %s izleyen + %s izleyici + %s izleyici Kimse dinlemiyor @@ -431,7 +423,7 @@ %s dinleyici Uygulama yeniden başlatıldıktan sonra dil değişecektir - Hızlı ileri/geri konumlama süresi + Hızlı ileri/geri atlama süresi PeerTube örnekleri Favori PeerTube örneklerinizi seçin %s adresinde beğendiğiniz örnekleri bulun @@ -443,7 +435,7 @@ Yerel Son eklenen En çok beğenilen - Otomatik oluşturulan (yükleyen bulunamadı) + Kendiliğinden oluşturulan (yükleyen bulunamadı) kurtarılıyor Bu indirme kurtarılamıyor Oluşum seçin @@ -453,7 +445,7 @@ Uygulama dili Sistem öntanımlısı Çözüldüğünde \"Bitti\" düğmesine basın - Bitti + Bitti Videolar %d saniye @@ -482,8 +474,8 @@ Abonelikleri seç Abonelik seçilmedi - %d seçildi - %d seçildi + %d öge seçildi + %d öge seçildi Boş grup adı Bu grubu silmek istiyor musunuz\? @@ -539,19 +531,19 @@ Henüz oynatma listesi yer imleri yok Asla Yalnızca Wi-Fi - Oynatmayı otomatik başlat — %s + Oynatmayı kendiliğinden başlat — %s Oynatma kuyruğu URL tanınamadı. Başka bir uygulamayla açılsın mı\? - Otomatik kuyruğa alma + Otomatik kuyruğa alış Etkin oynatıcının kuyruğu değiştirilecek Bir oynatıcıdan diğerine geçmek kuyruğunuzu değiştirebilir - Bir kuyruğu temizlemeden önce onay iste + Bir sırayı temizlemeden önce onay iste Hiçbir şey Ara belleğe alınıyor Karıştır - Tekrarla + Yinele Bildirim sekmesinde gösterilecek en fazla üç eylem seçebilirsiniz! - Aşağıdaki bildirim eyleminlerini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak sıkışık bildirimde gösterilecek üç eylemi seçin + Aşağıdaki bildirim eyleminlerini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak üst bildirimde gösterilecek üç eylemi seçin. Beşinci eylem düğmesi Dördüncü eylem düğmesi Üçüncü eylem düğmesi @@ -599,16 +591,15 @@ İndirme başladı Gözde gece temanızı aşağıdan seçebilirsiniz Gözde gece temanızı seçin — %s - Otomatik (cihaz teması) - Gece Teması + Kendiliğinden (aygıt teması) + Gece teması Kanal ayrıntılarını göster - Ortam yürütümünde siyah ekran veya tutukluk yaşıyorsanız ortam tünellemeyi devre dışı bırakın + Ortam yürütümünde siyah ekran veya tutukluk yaşıyorsanız ortam tünellemeyi devre dışı bırakın. Ortam tünellemeyi devre dışı bırak İç Gizli Listelenmemiş Herkese Açık - Küçük Resim URL\'si Konakçı Destek Dil @@ -632,17 +623,16 @@ \'Depolama Erişimi Çerçevesi\' yalnızca Android 10\'dan başlayarak desteklenmektedir Her indirmede nereye kaydedileceği sorulacak İndirme klasörü belirlenmedi, şimdi öntanımlı indirme klasörünü seçin - Kapat + Kapalı Tablet kipi - İzlenen ögeleri göster Konum çubuğu küçük resim ön izlemesi Gösterme Düşük nitelik (küçük) Yüksek nitelik (geniş) Yorumlar devre dışı Yaratıcısınca kalplendi - İzlendi olarak imle + İzlendi olarak işaretle Resimlerin üzerinde kaynaklarını gösteren Picasso renkli şeritler göster: ağ için kırmızı, disk için mavi ve bellek için yeşil Resim göstergelerini göster Uzak arama önerileri @@ -656,12 +646,12 @@ %s indirme tamamlandı Ögeleri kaldırmak için kaydır - Videoları mini oynatıcıda başlatmayın, otomatik döndürme kilitliyse doğrudan tam ekran moduna geçin. Tam ekrandan çıkarak mini oynatıcıya erişmeye devam edebilirsiniz + Videoları küçük oynatıcıda başlatma, kendiliğinden döndürme kilitliyse doğrudan tam ekran kipine geç. Tam ekrandan çıkarak küçük oynatıcıya erişebilirsiniz Ana oynatıcıyı tam ekranda başlat - Sonrakini sıraya ekle - Sonraki sıraya eklendi + Bundan sonra oynat + Bundan sonra oynatılmak için sıraya eklendi İşleniyor… Biraz zaman alabilir - Güncellemeleri denetle + Güncellemeleri denetle Yeni sürümleri el ile denetleyin Güncellemeler denetleniyor… Yeni akış ögeleri @@ -677,16 +667,15 @@ \nLütfen Depolama Erişimi Çerçevesi uyumlu dosya yönetici kurun Hata raporları için bildirimler Oynatıcı kullanırken çöktürme seçeneği gösterir - Oynatıcıyı çöktür + Oynatıcıyı çökert 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 @@ -714,9 +703,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! @@ -726,4 +712,117 @@ NewPipe güncellemesi var! %s indirmek için dokunun 3-nokta menüsünden abonelikleri içe veya dışa aktarın + Bu seçenek yalnızca tema için %s seçildiğinde kullanılabilir + Kalıcı küçük resmin ayarını kaldır + Kart + Panoya kopyalanamadı + %d kez kopyası eklendi + Gri oynatma listeleri halihazırda bu ögeyi içeriyor. + Donanımsal ortam düğmesi olaylarını yoksay + Örneğin, fiziksel düğmeleri bozuk bir kulaklık kullanıyorsanız kullanışlıdır + Kopyaları kaldır + Kopyalar kaldırılsın mı\? + Bu oynatma listesindeki tüm yinelenen akışları kaldırmak istiyor musunuz\? + Aşağıdaki akışları göster + Akışları göster/gizle + 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 betimli 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 + %1$s %2$s + Dış oynatıcılar için ses parçası seç + Dilden bağımsız olarak orijinal ses parçasını seçin + Ses: %s + Orijinal sesi tercih edin + Açıklayıcı sesi tercih edin + Ses parçası + Bu akışta halihazırda bir ses parçası bulunmalıdır + Akış yok + Canlı akış yok + Sağ hareket işlemi + Ana sekme seçiciyi alta taşı + Ana sekme konumu + Ortam tünelleme öntanımlı olarak devre dışı bırakılmıştır çünkü aygıt modelinizin desteği bilinmemektedir. + Çözücü ilklendirme sorunlarınız varsa bu seçeneği etkinleştirin, eğer birincil çözücülerin ilklendirmesi başarısızsa düşük öncelikli çözücülere dönülür. Bu, birincil çözücüler kullanılırkenki başarımdan daha kötü sonuçlanabilir + Her zaman ExoPlayer\'ın video çıktısı yüzey ayar çözümünü kullan + Bu çözüm, bir yüzey değişimi yaşandığında yüzeyi doğrudan kodlayıcıya ayarlamaktansa video kodlayıcısını serbest bırakır ve yeniden örneklendirir. Bu sorunu olan bazı aygıtlarda ExoPlayer tarafından halihazırda kullanılır, bu ayar yalnızca Android 6 ve üstünde etkilidir +\n +\nBu ayarı etkinleştirmek, geçerli video oynatıcısını değiştirirken veya tam ekrana geçerkenki oynatma hatalarını önleyebilir + Progresif içeriklerdeki yükleme aralığı boyutunu değiştir (şu anda %s). Daha düşük değer ilk yüklemeyi hızlandırabilir + Sol hareket işlemi + Parmağınızı ekranın sağ yarısında kaydırırken ne yapılacağını seçin + ExoPlayer\'ın çözücü yedek özelliğini kullan + Resim niteliği + Videolar + \? + Aboneler + Kanal sayfalarında hangi sekmelerin gösterileceği + Adres Listesiyle Paylaş + Başlıklarla Paylaş + %1$s +\n%2$s + Kanal sekmeleri + Shorts + Üst Veri Yükleniyor… + Ekran yönelimini değiştir + Düşük nitelik + Tam ekranı değiştir + Kanal sekmelerini al + Avatarlar + Sonraki akış + Alt kanal avatarları + Oynatma kuyruğunu aç + Resimleri yükleme + Yüksek nitelik + Hakkında + Oynatma Listesini Paylaş + İleri sar + Albümler + Geri sar + Yeniden oynat + Besleme güncellenirken alınacak sekmeler. Hızlı kip kullanılırken kanal güncelleniyorsa bu seçeneğin etkisi yoktur. + Oynatma listesini, oynatma listesi adı ve video başlıkları gibi ayrıntılarla ya da video adreslerinin basit listesi olarak paylaş + Orta nitelik + Yükleyen avatarları + Afişler + Oynatma listeleri + - %1$s: %2$s + Veriyi ve bellek kullanımını düşürmek için resimlerin niteliğini ve tümünün yüklenip yüklenmemesini seçin. Değişiklikler bellek ve diskteki resim önbelleğini temizler — %s + Oynat + Daha çok seçenekler + Küçük resimler + Parçalar + Süre + Kanallar + Önceki akış + Canlı + Daha fazla göster + Daha az göster + Aşağıdaki her bir bildirim eylemini üzerine dokunarak düzenleyin. İlk üç eylem (oynat/duraklat, önceki ve sonraki) sistem tarafından ayarlanır ve özelleştirilemez. + + %s yanıt + %s yanıt + + Aygıtta yeterli boş alan yok + Yedekle ve geri yükle + Ayarları sıfırla + Tüm ayarları öntanımlı değerlerine sıfırlayın + Tüm ayarları sıfırlamak, tercih edilen tüm ayarlarınızı kaldırır ve uygulamayı yeniden başlatır. +\n +\nDevam etmek istediğinizden emin misiniz? + Evet + Hayır + NewPipe zaman zaman yeni sürümleri kendiliğinden denetleyebilir ve kullanılabilir olduklarında sizi bilgilendirebilir. +\nBunu etkinleştirmek istiyor musunuz? + İçe aktarılmakta olan dışa aktarımdaki ayarlar, NewPipe 0.27.0\'dan itibaren kullanımdan kaldırılan güvenlik açığı olan bir biçim kullanmaktadır. İçe aktarılmakta olan dışa aktarımın güvenilir bir kaynaktan alındığından emin olun ve gelecekte yalnızca NewPipe 0.27.0 veya daha yeni sürümlerden alınan dışa aktarımları kullanmayı tercih edin. Bu güvenlik açığı bulunan biçimdeki ayarları içe aktarma desteği yakında tamamen kaldırılacak ve ardından NewPipe\'ın eski sürümleri artık yeni sürümlerden dışa aktarılan ayarların içe aktarımını yapamayacaktır. \ No newline at end of file diff --git a/app/src/main/res/values-tt/strings.xml b/app/src/main/res/values-tt/strings.xml new file mode 100644 index 00000000000..a482de21e9d --- /dev/null +++ b/app/src/main/res/values-tt/strings.xml @@ -0,0 +1,52 @@ + + + Урнаштыру + Баш тарту + Ярар + Әйе + Юк + Браузерда ачу + Йөкләп алу + Эзләү + Көйләүләр + Язылу + Мәгълүматны күрсәтү + Арткы план + Kodi белән уйнату + Тема + Ачык + Кара + Тавыш көче + Бернинди дә + Мәгълүматны чистарту + Йөкләп алу + Автоматик уйнату + \"PeerTube\" серверлары + Тышкы күренеш + Хата төзәтү + Яңартулар + Каналлар + Җырлар + Cүндерелде + Кире алу + Файл + Яктылык + Эзләү тәкъдимнәре + Локаль эзләү тәкъдимнәре + Эзләү тарихы + Тәртип + Видео һәм аудио + Тарих һәм кэш + Кулланучылар + Вакыйгалар + Сервер өстәү + Эчтәлек + Турыдан-туры + Чистарту + NewPipe искәртүе + Файл бетерелде + Искәртүләр + [Билгесез] + Барысын да уйнату + Һәрвакыт + \ 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 9c4ec39572c..663eb23a416 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -21,7 +21,7 @@ Завантажені аудіофайли зберігаються тут Типова роздільність Програти в Kodi - Встановити відсутній застосунок Kore\? + Установити відсутній застосунок Kore\? Показати опцію «Відтворити у Kodi» Показати опцію відтворення відео в Kodi Аудіо @@ -42,17 +42,16 @@ Помилка Помилка мережі Не вдалося завантажити всі ескізи - Не вдалося розшифрувати URL-підпис відео Не вдалося проаналізувати вебсайт Вміст недоступний Не вдалося налаштувати меню завантаження Перепрошуємо, цього не мало статися. - Надіслати звіт про помилки е-поштою + Надіслати звіт е-поштою Вибачте, щось пішло не так. Звіт Інформація: Що сталося: - Натисніть на «лупу», щоб почати. + Торкніться лупи, щоб розпочати. Чорна Завантаження Завантаження @@ -92,7 +91,7 @@ Не вдалося оновити підписку Підписки Новинки - Фоново + У фоні У вікні Типова роздільність вікна Не всі пристрої можуть відтворювати 2K/4K-відео @@ -113,7 +112,7 @@ Історія переглядів Відновлювати відтворення Продовжувати відтворення після переривань (напр. телефонних дзвінків) - Показувати підказку «Утримуйте, щоб додати в чергу» + Показати підказку «Затисніть, щоб додати» Типова країна вмісту Програвач Поведінка @@ -171,7 +170,7 @@ Показати інформацію Закладки відтворення Додати до - Показати підказку при натисканні на тло або на спливну кнопку «Деталі:» у відео + Показати підказку при натисканні «У вікні» або «У фоні» на сторінці відомостей про відео Сталася невиправна помилка програвача Зовнішні програвачі не підтримують такі види посилань Що:\\nЗапит:\\nМова вмісту:\\nКраїна вмісту:\\nМова застосунку:\\nСлужба:\\nЧас GMT:\\nПакунок:\\nВерсія:\\nВерсія ОС: @@ -197,7 +196,7 @@ Про застосунок і ЧаП Вільне та легке потокове програвання на Android. Які б не були ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг — будь-яка допомога завжди у пригоді. Що більше зроблено, то ліпшим стає NewPipe! - Зневадження + Налагодження Нічого немає… чути лише цвіркунів Немає переглядів @@ -284,7 +283,7 @@ \n7. [Якщо не вдалося імпортувати zip] Видобудьте файл .csv (зазвичай у розділі «YouTube і YouTube Music/Підписки/subscriptions.csv»), натисніть ІМПОРТУВАТИ ФАЙЛ нижче та виберіть видобутий файл csv Імпортуйте профіль SoundCloud, вписавши або URL, або ваш ID: \n -\n1. Увімкніть режим «режим комп\'ютера» у браузері (сайт не підтримується мобільними пристроями) +\n1. Увімкніть режим «Версія для ПК» у браузері (сайт не підтримується мобільними пристроями) \n2. Перейдіть за цим посиланням: %1$s \n3. За запитом увійдіть до облікового запису \n4. Скопіюйте URL профілю, до якого ви будете переспрямовані. @@ -292,8 +291,6 @@ Майте на увазі: ця операція може потребувати багато трафіку. \n \nБажаєте продовжити\? - Завантажувати ескізи - Вимкніть для запобігання завантаженню ескізів, що заощадить трафік і внутрішню пам\'ять. Зміни призведуть до очищення кешу зображень Кеш зображень стерто Стерти кеш метаданих Видалити всі кешовані дані вебсторінок @@ -307,7 +304,6 @@ Типова дія під час відкриття вмісту — %s Субтитри Зміна висоти тексту субтитрів та стилів тла. Потребує перезапуску застосунку - Не встановлено застосунків для відтворення цього файлу Очистити історію переглядів Видаляє історію відтворень і позицій відтворення Видалити всю історію переглядів\? @@ -339,17 +335,13 @@ Зменшити до програвача у вікні Канали Добірки - Доріжки + Треки Користувачі Режим перегляду списком Список Сiтка Відписатися Обрати вкладку - Жест керування гучністю - Змінювати гучність звуку жестами - Жест керування яскравістю - Змінювати яскравість програвача жестами Оновлення Події Файл видалено @@ -406,7 +398,7 @@ не можу перезаписати файл Завантаження з такою назвою вже додано в чергу NewPipe був закритий під час роботи над файлом - На пристрої не залишилося вільного місця + На пристрої не залишилося вільного простору Прогрес втрачено через видалення файлу Час очікування з\'єднання вичерпано Очистити історію завантажень чи завантажені файли\? @@ -455,8 +447,8 @@ Потрібен дозвіл показувати поверх інших застосунків Мова Мова телефону - Розв\'язавши натисніть «Готово» - Готово + Після завершення натисніть «Готово» + Готово Нова Бажаєте видалити цю групу\? Підписки не вибрані @@ -596,7 +588,7 @@ Додано у чергу Додати у чергу Розв\'язати - Обчислення гешу + Обчислення хешу Очистити збережені під час вирішення reCAPTCHA реп\'яшки (cookies) Реп\'яшки (cookies) reCAPTCHA видалено Очистити реп\'яшки (cookies) reCAPTCHA @@ -613,9 +605,9 @@ Кольорувати повідомлення основним кольором мініатюри. Підтримується не всіма пристроями Кольорове сповіщення У компактному сповіщенні є не більше трьох дій! - Дії можна змінити, натиснувши на них. Позначте не більше трьох для показу в компактному сповіщенні + Відредагуйте кожну дію сповіщення, натиснувши на неї. Виберіть до трьох з них, які будуть показані в компактному сповіщенні, за допомогою прапорців праворуч. Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1 - Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео + Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео. Вимкнути тунелювання медіа «Фреймворк доступу до сховища» (SAF) підтримується лише починаючи з Android 10 Вас питатиме, куди зберігати кожне завантаження @@ -625,7 +617,6 @@ Публічне Приватне Поза списком - URL мініатюри Власник Підтримка Мова @@ -647,7 +638,6 @@ Увімкнути Режим планшета Обліковий запис припинено - Показувати переглянуті обʼєкти Режим швидкої підписки не надає багато інформації щодо цього. Коментарі вимкнено Не показувати @@ -667,7 +657,7 @@ Видалено %1$s завантажень - Завантаження завершено + %s завантаження завершено %s завантаження завершено %s завантажень завершено %s завантажень завершено @@ -678,7 +668,7 @@ Заплановано наступним Запланувати наступним Обробка… Трохи заждіть - Перевірити наявність оновлень + Перевірити наявність оновлень Перевірка нових версій вручну Перевірка оновлень… Нові записи стрічки @@ -698,7 +688,6 @@ Закріплений коментар LeakCanary недоступний Типовий ExoPlayer - Змінити розмір інтервалу завантаження (наразі %s). Менше значення може прискорити початкове завантаження відео. Зміни вимагають перезапуску програвача Ви підписалися на цей канал , Сповіщення про нові трансляції для підписок @@ -732,9 +721,6 @@ Виберіть якість для зовнішніх програвачів Невідома якість Розмір інтервалу завантаження відтворення - Показати наступні елементи - Сховати переглянуті елементи - Сховати майбутні елементи Переглянути на сайті Поширені запитання Якщо у вас виникли проблеми з використанням застосунку, обов\'язково ознайомтеся з відповідями на поширені запитання! @@ -743,4 +729,120 @@ Торкніться, щоб завантажити %s Імпорт або експорт підписок з 3-крапкового меню Швидкий режим + Ця опція доступна, лише якщо темою обрано %s + Прибрати постійну мініатюру + Картки + Не вдалося скопіювати до буфера обміну + Дублікат додано %d раз(ів) + У виділених сірим кольором добірках цей елемент уже є. + Ігнорувати події апаратних медіакнопок + Корисно, наприклад, якщо ви використовуєте гарнітуру зі зламаними фізичними кнопками + Вилучити дублікати + Вилучити дублікати\? + Бажаєте вилучити всі повторювані трансляції в цій добірці\? + Показати/сховати трансляції + Незабаром + Показати такі трансляції + Повністю переглянуто + Частково переглянуто + Яскравість + Нічого + Дія жестом ліворуч + Виберіть жест для лівої половини екрана програвача + Виберіть жест для правої половини екрана програвача + Дія жесту праворуч + Гучність + Змінити розмір інтервалу завантаження прогресивного вмісту (наразі %s). Нижче значення може прискорити його початкове завантаження + Надавати перевагу оригінальному аудіо + Вибирати оригінальну звукову доріжку незалежно від мови + Надавати перевагу описовому аудіо + Вибирати звукову доріжку з описом для людей із вадами зору, якщо вона є + Аудіо: %s + Звукова доріжка + Вибір звукової доріжки для зовнішніх програвачів + Невідомо + Налаштування ExoPlayer + Керування деякими налаштуваннями ExoPlayer. Щоб ці зміни набули чинності, потрібно перезапустити програвач + Використовувати запасну функцію декодера ExoPlayer + Завжди використовувати обхідний шлях налаштування поверхні відеовиходу ExoPlayer + %1$s %2$s + оригінальна + дубльована + описова + У цій трансляції вже має бути звукова доріжка + Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів + Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях +\n +\nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму + Перемістити селектор головної вкладки вниз + Розташування основних вкладок + Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує. + Немає трансляцій + Немає трансляцій наживо + Відео + Підписники + Які вкладки показуються на сторінках каналів + Вкладки каналу + Shorts + Завантаження метаданих… + Отримання вкладок каналу + Про канал + Альбоми + Отримувані вкладки під час оновлення стрічки. Ця опція не застосовується, якщо канал оновлюється за допомогою швидкого режиму. + Добірки + Треки + Канали + Наживо + Змінити орієнтацію екрана + Перемкнути повноекранний режим + Наступний стрим + Відкрити чергу відтворення + Перемотати вперед + Відмотати назад + Повторити + Відтворити + Інші опції + Тривалість + Попередній стрим + Якість зображення + \? + Низька якість + Аватари + Аватари підканалів + Не завантажувати зображення + Висока якість + Середня якість + Вивантажувач аватарів + Банери + Виберіть якість зображень і чи завантажувати зображення взагалі, щоб знизити використання даних і пам\'яті. Зміни очищують кеш зображень як у пам\'яті, так і на диску — %s + Мініатюри + Поділитися списком URL-адрес + Поділитися з назвами + %1$s +\n%2$s + Поділитися добіркою + Поділитися добіркою з подробицями, такими як назва добірки та назви відео, або просто списком URL-адрес відео + - %1$s: %2$s + Показати більше + Відредагуйте кожну дію сповіщення, натиснувши на неї. Перші три дії (відтворення/пауза, попередній і наступний) встановлюються системою і не можуть бути змінені. + + %s відповідь + %s відповіді + %s відповідей + %s відповідей + + Показати менше + Недостатньо вільного простору на пристрої + Скинути налаштування + Резервне копіювання і відновлення + NewPipe може час від часу автоматично перевіряти наявність нових версій і сповіщати вас про їх появу. +\nХочете увімкнути цю функцію? + Так + Ні + Скинути всі налаштування до усталених значень + Скидання всіх налаштувань призведе до скидання всіх вибраних вами налаштувань і перезапуску застосунку. +\n +\nВи впевнені, що хочете продовжити? + Параметри експорту, який імпортується, використовують вразливий формат, який не підтримується з NewPipe 0.27.0. Переконайтеся, що експорт, який імпортується, походить із надійного джерела, і в майбутньому віддайте перевагу використанню лише експорту, отриманого з NewPipe 0.27.0 або новішої версії. Підтримку імпорту налаштувань у цьому вразливому форматі незабаром буде повністю припинено, і тоді старі версії NewPipe більше не зможуть імпортувати налаштування експорту з нових версій. + вторинний \ No newline at end of file diff --git a/app/src/main/res/values-und/strings.xml b/app/src/main/res/values-und/strings.xml index f22a117c57f..94e4f9dd61c 100644 --- a/app/src/main/res/values-und/strings.xml +++ b/app/src/main/res/values-und/strings.xml @@ -118,7 +118,6 @@ کتار نوں خالی کرن توں پہلاں تصویر کرن لئی پچھو پلیئر بدلݨ نال تہاڈی بدل سکدی اے سرگرم پکیئر کتار جاوےگا - تھمنیل لوڈ کرو وہروا دِکھاؤ کھوج دا اتیت ڈیٹا پٹاؤ diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 686644fd989..d7092712116 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,15 @@ پاپ اپ جسامت اور مقام کو یاد رکھیں پچھلی جسامت اور پوپ اپ کا مقام یاد رکھیں بالواسطہ رسائی استعمال کریں - بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے۔ 5 ، 15 یا 25 سیکنڈ کی تلاش اس کے ساتھ کام نہیں کرتی ہے۔ - نظرِ انگشتی لوڈ کریں - ڈیٹا کی بچت اور میموری کے استعمال کو روکنے کیلئے نظرِ انگشتی کو بند کریں۔ تبدیلیاں میموری اور آن ڈسک عکس کے کیشے کو صاف کرتی ہیں۔ + بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے۔ 5 ، 15 یا 25 سیکنڈ کی تلاش اس کے ساتھ کام نہیں کرتی ہے: تصویری کیشے کی صفائی ہوئی کیشے میٹا ڈیٹا کو صاف کریں ویب پیج کے سبھی کیشے ڈیٹا کو ہٹا دیں میٹا ڈیٹا کیشے کی صفائی ہوئی - اگلا سلسلہ خود قطار + اگلی اسٹریم خود قطار متعلقہ سلسلے کو جوڑ کر پلے بیک کی قطار کو اختتام تک (نہ دہراتے ہوئے) جاری رکھیں تلاش کے اشارے - تلاش کرتے وقت اشارے دکھائیں + تلاش کے دوران دکھانے کے لئے تجاویز کا انتخاب کریں سرگزشت تلاش کریں تلاش کے استفسارات کو مقامی طور پر ذخیرہ کریں دیکھے جانے کی سرگزشت @@ -73,7 +71,7 @@ مداخلت کے بعد چلانا جاری رکھیں (مثلاً فون کالز) ڈاؤن لوڈ \'اگلی\' اور \'ملتی جلتی\' ویڈیوز دکھائیں - ’’شامل کرنے کے لئے پکڑیں‘‘ اشارہ دکھائیں + ’’شامل کرنے کے لئے ہولڈ کریں‘‘ اشارہ دکھائیں ویڈیو کی \"تفصیلات:\" میں پس منظر یا پاپ اپ بٹن دبانے پر اشارے دکھائیں غیر موافق URL مشمولات کا طے شدہ ملک @@ -101,7 +99,7 @@ صرف ایک بار فائل نیو پائپ اطلاعات - نیو پائپ کے پس منظر اور پاپ اپ پلیئرز کیلئے اطلاعات + نیو پائپ پلیئرز کیلئے اطلاعات [نامعلوم] پس منظر پر جائیں پاپ اپ پر جائیں @@ -113,7 +111,6 @@ خرابی نیٹ ورک کی خرابی تمام نظرِ انگشتی لوڈ نہیں کر سکے - ویڈیو یو آر ایل کے دستخط ڈکرپٹ نہیں ہو سکے ویب سائٹ کو تجزیہ نہیں کیا جاسکا مواد دستیاب نہیں ہے ڈاؤن لوڈ مینو ترتیب نہیں دے سکتے @@ -131,7 +128,7 @@ ایک خامی پیش آگئی: %1$s کوئی سلسلسہ ڈاؤن لوڈ کرنے کے لئے دستیاب نہیں معذرت، ایسا نہیں ہونا چاہئے تھا۔ - ای میل کے ذریعے غلطی کی اطلاع دیں + ای میل کے ذریعے اطلاع دیں معذرت، کچھ غلط ہوا۔ رپورٹ کریں معلومات: @@ -194,14 +191,14 @@ نیو پائپ کے بارے میں تیسری پارٹی کی لائسنس © %1$s بذریعہ %2$s %3$s کے تحت - کے بارے میں + کے بارے میں اور اکثر پوچھے گئے سوالات لائسنس اینڈروئیڈ پر لِبرے کی ہلکی اسٹریمنگ۔ تعاون کریں جو بھی آپ کے خیالات ہوں؛ ترجمہ، ڈیزائن میں تبدیلیاں، کوڈ کی درستی، یا حقیقتاً کوڈ میں بڑی تبدیلی—مدد کا ہمیشہ خیرمقدم ہے۔ جتنا زیادہ ہوگا اتنی ہی بہتری ہو گی! گٹ ہب پر دیکھیں عطیہ - نیو پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت صرف کرتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں مدد دینے کے لئے بہتر بدلہ دیں۔ + نیو پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت صرف کرتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں بہتر تعاون کریں بدلہ دیں ویب سائٹ مزید معلومات اور خبروں کے لئے نیو پائپ ویب سائٹ ملاحظہ کریں۔ @@ -232,7 +229,7 @@ آڈیو کی ترتیبات انقطار کو پکڑو پس منظر میں چلانا شروع کریں - نئے پاپ اپ میں چلانا شروع کریں + پوپ اپ میں چلانا شروع کریں دراز کھولیں دراز بند کریں پسندیدہ \'کھلی\' کارروائی @@ -247,7 +244,7 @@ نام تبدیل کریں نام پلے لسٹ میں شامل - بطور پلے لسٹ انگشتی طے کریں + بطور پلے لسٹ تھمبنیل طے کریں پلے لسٹ کو نشان زد کریں نشان زد حدف کریں کیا یہ پلے لسٹ حذف کریں؟ @@ -294,16 +291,15 @@ غیر مربوط (مسخ کا سبب بن سکتا ہے) عنوانات پلیئر کیپشن ٹیکسٹ اسکیل اور بیک گراونڈ اسٹائل میں ترمیم کریں۔ اثر لینے کیلئے ایپ کو دوبارہ شروع کرنا ضروری ہے۔ - اس فائل کو چلانے کے لئے کوئی ایپ انسٹال نہیں ہے دیکھنے کی سرگزشت صاف کریں چلائے گئے سلسلوں اور پلے بیک پوزیشنز کی سرگزشت کو حذف کیا گیا دیکھے جانے کی تمام سرگزشت حذف کریں؟ تلاش کی سرگزشت مٹائیں تلاش کے الفاظ کی سرگزشت حذف کی گئیں تلاش کی مکمل سرگزشت حذف کریں؟ - تلاش کی سرگزشت حذف ہوئی۔ + تلاش کی سرگزشت حذف ہوئی 1 شے حذف کر دی گئی۔ - نیو پائپ کاپلیفٹ فری سافٹ ویئر ہے: آپ استعمال کرسکتے ہیں، مطالعہ شیئر کرسکتے ہیں اور اپنی مرضی سے اسے بہتر کرسکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور / یا ترمیم کرسکتے ہیں، خواہ لائسنس کا ورژن 3، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن۔ + نیو پائپ کاپی لیفٹ فری سافٹ ویئر ہے: آپ استعمال، مطالعہ، شیئر اور اپنی مرضی سے اسے بہتر بنا سکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور/یا ترمیم کرسکتے ہیں، خواہ لائسنس کا ورژن 3، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن میں۔ کیا آپ ترتیبات بھی درآمد کرنا چاہتے ہیں؟ نیو پائپ کی رازداری کی پالیسی نیو پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا، ایپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا./nنیو پائپ کی رازداری پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کے کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔ @@ -328,15 +324,11 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - صوتی اشارہ کنٹرول - پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں - چمک کا متحرک کنٹرول - پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان تازہ کاریاں فائل حذف ہوگئی - ایپ کی تازہ کاری کی اطلاع - جدید نیو پائپ ورژن کیلئے اطلاعات + ایپ اَپ ڈیٹ کی اطلاع + جدید نیو پائپ ورژن کے لیے اطلاعات بیرونی ذخیرہ دستیاب نہیں بیرونی ایسڈی کارڈ پر ڈاؤن لوڈ ممکن نہیں۔ ڈاؤن لوڈ فولڈر کے مقام کو دوبارہ ترتیب دیں؟ محفوظ شدہ ٹیبز نہیں پڑھ سکے لہذا پہلے سے طے شدہ کا استعمال کر رہے ہیں @@ -390,15 +382,15 @@ فہرست میں مقامات فہرستوں میں پلے بیک مقامات کے اشارے دکھائیں کوائف صاف کریں - دیکھے جانے کی سرگزشت حذف ہوگئی۔ - پلے بیک پوزیشنس حذف ہوئیں۔ + دیکھے جانے کی سرگزشت حذف ہو گئی + پلے بیک پوزیشنس حذف ہوئیں فائل منتقل یا حذف ہوگئی اس نام والی فائل پہلے سے موجود ہے اس نام کی ڈاؤن لوڈ کی گئی فائل پہلے سے موجود ہے فائل برتحریر نہیں کر سکتا اس نام کے ساتھ ڈاؤن لوڈ زیر التوا ہے فائل پر کام کرنے کے دوران نیو پائپ بند کردی گئی تھی - آلہ میں کوئی جگہ نہیں بچی + آلہ میں کوئی جگہ نہیں بچی پیشرفت ختم ہوگئی، کیونکہ فائل کو حذف کردیا گیا تھا رابطے کا وقت ختم کیا آپ اپنی ڈاؤن لوڈ کی سرگزشت کو صاف کرنا چاہتے ہیں یا ڈاؤن لوڈ کی گئی تمام فائلوں کو حذف کرنا چاہتے ہیں؟ @@ -425,7 +417,7 @@ %s سننے والا %s سننے والے - جب ایپ دوبارہ شروع ہو گی تو زبان تبدیل ہو جائے گی۔ + جب ایپ دوبارہ شروع ہو گی تو زبان تبدیل ہو جائے گی طے شدہ کیوسک آگے بھگانے /- پیچھے کرنے کی مدت پیر ٹیوب واقعات @@ -451,7 +443,7 @@ ‪تفصیل متعلقہ سلسلے تبصرے - براہ کرم چیک کریں کہ آیا آپ کے کریش پر بحث کرنے والا مسئلہ پہلے سے موجود ہے۔ جعلی ٹکٹ تیار کرتے وقت، آپ ہم سے وقت نکالتے ہیں جو ہم اصل مسئلے کو ٹھیک کرنے میں گزار سکتے ہیں۔ + براہ کرم چیک کریں کہ آیا آپ کے کریش پر بحث کرنے والا مسئلہ پہلے سے موجود ہے۔ ڈپلیکیٹ ٹکٹ بناتے وقت آپ ہم سے وقت لیتے ہیں، جو ہم اصل مسئلے کو ٹھیک کرنے میں صرف کرتے ہیں۔ گِٹ ہب میں اطلاع دیں فارمیٹڈ رپورٹ کو کاپی کریں دوسرے ایپس پر نظر آنے کی اجازت دیں @@ -471,8 +463,8 @@ یوٹیوب کا \"پابندی والا وضع\" چالو کریں وہ مواد دکھائیں جو بچوں کے لیے ممکنہ طور پر نا مناسب ہیں کیوں کہ اس میں عمر کی حد ہے (جیسے 18+) URL کو نہیں پہچان سکے۔ کسی اور ایپ کے ساتھ کھولیں؟ - ازخود قطار - اسٹریم کے موجد، اسٹریم مواد یا تلاش کی درخواست کے بارے میں اضافی معلومات والے میٹا انفارمیشن بکسوں کو چھپانے کیلئے بند کریں۔ + خود کار قطار + اسٹریم کے موجد، اسٹریم مواد یا تلاش کی درخواست کے بارے میں اضافی معلومات والے میٹا انفارمیشن بکسوں کو چھپانے کیلئے بند کریں میٹا معلومات دکھائیں ویڈیو کی تفصیل اور اضافی معلومات کو چھپانے کیلئے بند کریں تفصیل دکھائیں @@ -486,26 +478,81 @@ شفل دوہرائیں آپ کومپیکٹ نوٹیفکیشن میں زیادہ سے زیادہ تین ایکشن منتخب کرسکتے ہیں! - ذیل میں ہر اطلاع کی کارروائی پر ٹیپ کرکے اس میں ترمیم کریں۔ دائیں طرف کے چیک باکسز کا استعمال کرکے کمپیکٹ نوٹیفکیشن میں دکھائے جانے والے ان میں سے تین تک کا انتخاب کریں۔ + ذیل میں ہر اطلاع کی کارروائی پر ٹیپ کرکے اس میں ترمیم کریں۔ دائیں طرف کے چیک باکسز کا استعمال کرکے کمپیکٹ نوٹیفکیشن میں دکھائے جانے والے ان میں سے تین تک کا انتخاب کریں: پانچواں ایکشن بٹن چوتھا ایکشن بٹن تیسرا ایکشن بٹن دوسرا ایکشن بٹن پہلا ایکشن بٹن نوٹیفیکیشن میں دکھائے جانے والے ویڈیو تھمب نیل کو 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 8262abcef37..7a5e49a2970 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,36 +1,36 @@ - 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\? + Không tìm thấy trình phát trực tuyến. Cài đặt VLC\? Cài đặt 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ải xuống Tìm kiếm Cài đặt Ý bạn là \"%1$s\"\? Chia sẻ với Sử dụng trình phát video bên ngoài Loại bỏ âm thanh ở một số độ phân giải - Sử dụng trình phát audio bên ngoài - Trình phát nổi + Sử dụng trình phát âm thanh bên ngoài + Bật lên Thư mục video tải về Video đã tải về được lưu ở đây - Chọn thư mục lưu video tải về - Thư mục tải về audio - Audio đã tải về được lưu ở đây - Chọn vị trí lưu audio tải về + Chọn thư mục tải xuống cho các tệp video + Thư mục tải xuống âm thanh + Các tệp âm thanh đã tải xuống được lưu trữ tại đây + Chọn thư mục tải xuống cho các tệp âm thanh Độ phân giải mặc định - Độ phân giải popup mặc định + Độ phân giải cửa sổ bật lên mặc định 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 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 + Chỉ một số thiết bị có thể phát video 2K/4K + Phát với Kodi + Cài đặt ứng dụng Kore bị thiếu\? + Hiển thị tùy chọn \"Phát với Kodi\" + Hiển thị tùy chọn phát video qua trung tâm truyền thông Kodi Âm thanh Định dạng âm thanh mặc định Định dạng video mặc định @@ -38,17 +38,17 @@ Chủ đề Sáng Tối - Đen (Amoled) - Nhớ thuộc tính của popup - Nhớ kích thước và vị trí lần trước của popup + Đen + Ghi nhớ thuộc tính cửa sổ bật lên + Ghi nhớ kích thước và vị trí cuối cùng của cửa sổ bật lên Đề xuất tìm kiếm Chọn các đề xuất để hiển thị khi tìm kiếm - Tải về - Hiện video \"Tiếp theo\" và \"Tương tự\" - URL không được hỗ trợ - Hiển thị - Phát ở dưới nền - Phát ở chế độ popup + Tải xuống + Hiện các video \"Tiếp theo\" và \"Tương tự\" + URL không hỗ trợ + Vẻ ngoài + Đang phát trong nền + Đang phát trong chế độ bật lên Nội dung Hiển thị nội dung bị giới hạn độ tuổi Trực tiếp @@ -62,21 +62,20 @@ Lỗi Lỗi kết nối mạng Không thể tải tất cả hình thu nhỏ - Không thể giải mã chữ ký URL video Không thể phân tích cú pháp trang web 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. + Ứng dụng/Giao diện người dùng bị lỗi + Có vẻ NewPipe đã xảy ra lỗi, lướt xuống kiểm tra xem. Báo lỗi qua email - Xin lỗi, đã xảy ra sự cố. + Rất tiếc, đã xảy ra lỗi. Báo cáo Thông tin: Chuyện gì đã xảy ra: Loại lỗi:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành: Nhận xét của bạn (bằng tiếng Anh): Chi tiết: - Video xem, thời lượng: + Phát video, thời lượng: Hình thu nhỏ của avatar người tải lên Lượt thích Lượt không thích @@ -96,68 +95,66 @@ Lỗi NewPipe đang tải xuống Chạm để biết chi tiết - Đợi chút xíu nha… - Đã sao chép vào clipboard - Hãy chọn một thư mục để tải xuống trong phần cài đặt - Chế độ popup cần quyền này -\n để hoạt động, hãy bật trong phần cài đặt + Vui lòng chờ… + Đã sao chép vào khay nhớ tạm + Vui lòng xác định thư mục tải xuống sau trong cài đặt + Sự cho phép này là cần thiết để +\nmở trong chế độ bật lên reCAPTCHA Yêu cầu reCAPTCHA 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 + Giới thiệu & Câu hỏi thường gặp Giấy phép - Trình phát video YT nhẹ, mã nguồn mở và không quảng cáo cho Android. + Phát trực tuyến nhẹ tự do trên 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 ! + Cho dù bạn có ý tưởng về: dịch thuật, thay đổi thiết kế, dọn mã hoặc thay đổi mã thực sự nhiều— sự trợ giúp luôn được hoan nghênh. Làm càng nhiều thì càng tốt! Đọc giấy phép Đóng góp Ngôn ngữ nội dung ưu tiên Video và âm thanh Lịch sử xem - Lịch sử và bộ nhớ cache + Lịch sử và bộ nhớ đệm Không tìm thấy Đăng ký Đã đăng ký Đã hủy đăng ký kênh 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 + Không tìm thấy trình phát trực tuyến nào (bạn có thể cài đặt VLC để phát nó). + Tải tệp luồng về Hiện thông tin - Đăng ký - Danh sách phát được đánh dấu + Kênh đăng ký + Đã đánh dấu danh sách phát Có gì mới Thêm vào - Sử dụng tìm kiếm nhanh không chính xác - Tua không chính xác cho phép trình phát tua đến các vị trí nhanh hơn với độ chính xác bị giảm. Tua 5, 15 hay 25 giây không dùng được với chế độ này - Tải hình thu nhỏ - Tắt để ngăn chặn việc tải các hình thu nhỏ, việc này sẽ tiết kiệm lưu lượng mạng và bộ nhớ. Các thay đổi sẽ xóa bộ nhớ đệm hình ảnh cả trong RAM và trong bộ nhớ + Dùng tua nhanh ít chính xác + Tua ít chính xác cho phép trình phát giảm độ chính xác để tua tới vị trí nhanh hơn. Tua khoảng 5, 15 hoặc 25 giây không hoạt động với điều này Đã xóa bộ nhớ cache hình ảnh - Xóa siêu dữ liệu đã lưu vào bộ nhớ cache + Xóa sạch siêu dữ liệu đã lưu đệm Xóa tất cả dữ liệu trang web được lưu trong bộ nhớ cache Đã xóa bộ nhớ cache siêu dữ liệu - Tự động thêm luồng phát tiếp theo vào hàng đợi + Tự động thêm vào hàng đợi luồng phát tiếp theo Tiếp tục hàng đợi (không lặp lại) bằng cách thêm một luồng phát liên quan Lịch sử tìm kiếm Lưu trữ truy vấn tìm kiếm cục bộ Theo dõi các video đã xem - Tiếp tục phát - Tiếp tục phát sau khi bị gián đoạn (ví dụ: cuộc gọi điện thoại) - Hiển thị \"Giữ để thêm vào hàng đợi\" - Hiển thị mẹo khi nhấn nút phát trong nền hoặc phát trên popup trong trang \"Chi tiết\" + Tiếp tục đang phát + Tiếp tục phát lại sau khi bị gián đoạn (ví dụ: cuộc gọi) + Hiển thị mẹo \"Giữ để thêm vào hàng đợi\" + Hiển thị mẹo khi nhấn vào nút nền hoặc nút bật lên trong \"Chi tiết:\" video Quốc gia nội dung mặc định - Phát + Trình phát Hành vi Gỡ lỗi Kênh - Playlist + Danh sách phát Bản nhạc Người dùng Hoàn tác - Chơi tất cả + Phát tất cả Luôn luôn Chỉ một lần Tập tin @@ -165,29 +162,29 @@ Thông báo cho trình phát của NewPipe [Không xác định] Chuyển sang nền - Chuyển sang Popup - Chuyển sang Main + Chuyển sang Cửa sổ bật lên + Chuyển sang Chính Nhập cơ sở dữ liệu Xuất cơ sở dữ liệu - Ghi đè lịch sử, kênh đăng ký, playlist hiện tại (và cài đặt, nếu có) của bạn - Xuất lịch sử, danh sách đăng ký, playlist và cài đặt + Ghi đè lịch sử, đăng ký, danh sách phát và các cài đặt (tùy chọn) hiện tại của bạn + Xuất lịch sử, đăng ký, danh sách phát và các cài đặt Xóa lịch sử xem - Xóa lịch sử những video đã xem và vị trí phát + Xóa lịch sử các luồng đã phát và các vị trí phát lại 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\? Đã xóa lịch sử tìm kiếm - Không thể phát video này + Không thể phát luồng này Đã xảy ra lỗi trình phát không thể khôi phục Phục hồi lại trình phát bị lỗi Trình phát ngoài không hỗ trợ các loại liên kết này Không tìm thấy luồng video nào - Không tìm thấy luồng audio nào + Không tìm thấy luồng âm thanh nào Thư mục không hợp lệ - Tệp / nguồn nội dung không hợp lệ - Tệp không tồn tại hoặc không có quyền đọc / ghi + Tệp/nguồn nội dung không hợp lệ + Tệp không tồn tại hoặc không có quyền đọc/ghi Tên tệp không được để trống Đã xảy ra lỗi: %1$s Không có luồng nào để tải về @@ -195,7 +192,7 @@ Kéo để sắp xếp lại Không có người đăng ký - %s người đăng kí + %s người đăng ký Không có lượt xem nào @@ -205,32 +202,31 @@ %s video - Tạo nên + Tạo Bỏ qua Đổi tên Đã xóa 1 mục. Tải xuống - Các ký tự được cho phép cho tên tệp + Các ký tự được cho phép trong tên tệp Ký tự không hợp lệ được thay thế bằng giá trị này Ký tự thay thế Chỉ chữ cái và chữ số Hầu hết các ký tự đặc biệt - Không có ứng dụng nào được cài đặt để phát tệp này - Đóng góp - NewPipe được phát triển bởi các tình nguyện viên dành thời gian và tâm huyết của mình để mang lại cho bạn trải nghiệm tốt nhất. Đóng góp một chút xiền để giúp chúng tôi làm NewPipe tốt hơn nữa (Nếu bạn muốn). - Đôn Nét + Quyên tặng + NewPipe được phát triển bởi các tình nguyện viên dành thời gian rảnh rỗi để mang lại cho bạn trải nghiệm người dùng tốt nhất. Hãy đền đáp để giúp các nhà phát triển làm cho NewPipe thậm chí còn tốt hơn nữa trong khi họ thưởng thức một tách cà phê. + Đền đáp Trang web Truy cập website chính thức của NewPipe để biết thêm thông tin và tin tức. Chính sách bảo mật của NewPipe NewPipe rất coi trọng quyền riêng tư của bạn. Do đó, ứng dụng không thu thập bất kỳ dữ liệu nào mà không có sự đồng ý của bạn. \nChính sách bảo mật của NewPipe giải thích chi tiết dữ liệu nào được gửi và lưu trữ khi bạn gửi báo cáo sự cố. Đọc chính sách bảo mật - NewPipe là phần mềm miễn phí copyleft: Bạn có thể sử dụng, nghiên cứu, chia sẻ và cải thiện nó theo ý của bạn. Nói cụ thể hơn, bạn có thể phân phối lại và/hoặc sửa đổi nó theo các điều khoản trong Giấy phép Công cộng GNU (GPL) được xuất bản bởi Quỹ Phần mềm Tự do (FSF), theo phiên bản 3 hoặc bất kì phiên bản nào sau này của Giấy phép (tùy ý bạn). + NewPipe là phần mềm tự do bản quyền bên trái: Bạn có thể sử dụng, nghiên cứu, chia sẻ và cải tiến nó theo ý muốn. Cụ thể là bạn có thể phân phối lại và/hoặc sửa đổi nó theo các điều khoản của Giấy phép Công cộng GNU do Tổ chức Phần mềm Tự do xuất bản, phiên bản 3 của Giấy phép hoặc (tùy theo lựa chọn của bạn) bất kỳ phiên bản nào mới hơn. Lịch sử Lịch sử Bạn có muốn xóa mục này khỏi lịch sử tìm kiếm không? Lần phát cuối - Hầu hết phát + Được phát nhiều nhất Nội dung trang chính Trang trống Trang chủ @@ -243,63 +239,63 @@ Không có tệp ZIP hợp lệ Cảnh báo: Không thể nhập tất cả các tệp. Thao tác này sẽ ghi đè cài đặt hiện tại của bạn. - Bạn cũng muốn nhập cài đặt? - Thịnh hành - Mới và đang hot + Bạn có muốn cũng nhập các cài đặt không? + Đang thịnh hành + Mới và phổ biến Loại bỏ Chi tiết Cài đặt âm thanh - Giữ để nối tiếp - Bắt đầu phát từ đây trong nền - Bắt đầu phát trên trình phát popup + Chờ để thêm vào hàng đợi + Bắt đầu phát trong nền + Bắt đầu phát trong cửa sổ bật lên Mở ngăn kéo Đóng ngăn - Hành động \'mở\' được ưu tiên + Ưu tiên hành động \'mở\' Hành động mặc định khi mở nội dung — %s Trình phát video - Trình phát nền - Trình phát popup - Luôn luôn hỏi + Trình phát trong nền + Trình phát cửa sổ nổi + Luôn hỏi Đang nhận thông tin… Đang tải nội dung được yêu cầu - Tạo playlist mới - Đổi tên playlist + Danh sách phát mới + Đổi tên Tên Thêm vào danh sách phát Đặt làm hình thu nhỏ của danh sách phát - Đánh dấu playlist này - Xóa dấu trang - Xóa playlist này\? - Đã tạo playlist - Đã thêm vào playlist - Đã thay đổi hình thu nhỏ của playlist. + Đánh dấu danh sách phát + Loại bỏ đánh dấu + Xóa danh sách phát này\? + Đã tạo danh sách phát + Đã thêm danh sách phát + Hình thu nhỏ của danh sách phát đã thay đổi. Không có phụ đề Phù hợp Lấp đầy Thu phóng Tự động tạo ra Phụ đề - Sửa cỡ chữ, màu chữ và kiểu màu nền phụ đề. Hãy khởi động lại ứng dụng để áp dụng - Theo dõi rò rỉ bộ nhớ có thể khiến ứng dụng trở nên không phản hồi khi đổ xô đống - Báo các lỗi out-of-lifecycle + Thay đổi tỷ lệ văn bản và kiểu nền phụ đề trình phát. Yêu cầu khởi động lại ứng dụng để có hiệu lực + Giám sát rò rỉ bộ nhớ có thể khiến ứng dụng không phản hồi khi tải vùng lưu trữ + Báo cáo lỗi ngoài vòng đời Buộc báo cáo ngoại lệ Rx không thể gửi được bên ngoài vòng đời của mảnh hoặc hoạt động sau khi xử lý Nhập Nhập từ Xuất sang Đang nhập… - Đang xuất … + Đang xuất… Nhập tệp Xuất trước - Không thể nhập đăng ký - Không thể xuất đăng ký + Không thể nhập kênh đăng ký + Không thể xuất kênh đăng ký Nhập danh sách đăng ký YouTube từ Google Takeout: \n \n1. Vào URL này: %1$s \n2. Đăng nhập khi được yêu cầu -\n3. Nhấn chọn \"Bao gồm tất cả dữ liệu trên YouTube\", sau đó nhấn \"Bỏ chọn tất cả\", sau đó chỉ chọn mục \"đăng kí\" rồi nhấn OK +\n3. Nhấn chọn \"Bao gồm tất cả dữ liệu trên YouTube\", sau đó nhấn \"Bỏ chọn tất cả\", sau đó chỉ chọn mục \"đăng ký\" rồi nhấn OK \n4. Nhấn nút \"Bước tiếp theo\" rồi nhấn \"Tạo tệp xuất\" \n5. Nhấn nút \"Tải xuống\" khi nó xuất hiện -\n6. Từ file zip mới tải về, trích xuất file .json ra (thường nằm ở đường dẫn \"YouTube và YouTube Music/đăng kí/subscriptions.json\") rồi nhập vào đây. +\n6. Từ file zip mới tải về, trích xuất file .json ra (thường nằm ở đường dẫn \"YouTube và YouTube Music/đăng ký/subscriptions.json\") rồi nhập vào đây. \n7. [Nếu nhập file .zip không thành công] Hãy giải nén tệp .csv (thường nó được để dưới phần \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), nhấn vào nút NHẬP TỆP ở phía bên dưới rồi chọn tệp csv đã được giải nén Để nhập hồ sơ SoundCloud bằng cách nhập URL hoặc ID của bạn, hãy làm các bước như sau: \n @@ -313,27 +309,23 @@ Điều khiển tốc độ phát lại Tốc độ Độ cao - Bỏ gắn (có thể gây méo nhưng vui) - Tua nhanh trong im lặng - Tiếp theo + Bỏ gắn (có thể gây méo) + Chuyển nhanh qua khoảng lặng + Bước Đặt lại Để tuân thủ Quy định bảo vệ dữ liệu chung của châu Âu (GDPR), chúng tôi sẽ thu hút sự chú ý của bạn đến chính sách bảo mật của NewPipe. Vui lòng đọc kỹ. \nBạn phải chấp nhận nó để gửi cho chúng tôi báo cáo lỗi. Chấp nhận Từ chối Không giới hạn - Giới hạn độ phân giải khi sử dụng 3G, 4G + Giới hạn độ phân giải khi sử dụng dữ liệu di động Thu nhỏ khi chuyển qua ứng dụng khác - Hành động khi chuyển sang ứng dụng khác từ trình phát chính — %s + Hành động khi chuyển sang ứng dụng khác từ trình phát video chính — %s Không Thu nhỏ xuống trình phát nền - Thu nhỏ vào trình phát popup + Thu nhỏ xuống trình phát bật lên 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 @@ -349,7 +341,7 @@ Top 50 phổ biến Nhập ID SoundCloud hoặc link soundcloud.com/<ID của bạn> Cập nhật - Hiện thông báo khi có bản cập nhật ứng dụng + Hiển thị thông báo để nhắc cập nhật ứng dụng khi có phiên bản mới Chế độ hiển thị danh sách Danh sách Lưới @@ -359,9 +351,9 @@ đã tạm dừng trong hàng đợi đang xử lý - Hàng chờ + Xếp hàng Thao tác bị từ chối bởi hệ thống - Tải về không thành công + Tải xuống thất bại Tạo tên riêng biệt Ghi đè Có một tệp đã tải về trùng tên @@ -386,36 +378,36 @@ Hiện bình luận Tắt để ẩn bình luận Tự động phát - Không có bình luận + Không có bình luận nào Không thể tải bình luận Đóng - Tiếp tục phát - Phục hồi vị trí phát lại + Tiếp tục phát lại + Khôi phục vị trí phát lại cuối cùng 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 + Hiển chỉ báo vị trí phát lại trong danh sách + Xóa dữ liệu + Đã 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 - Có một bản tải xuống đang chờ xử lí với tên này - Newpipe đã bị đóng khi đang xử lí tệp - Không đủ dung lượng trên máy - Quá trình mất, vì tập tin đã bị xoá + Có một bản tải xuống đang chờ xử lý với tên này + NewPipe đã bị đóng khi đang xử lý tệp + Không đủ dung lượng trên máy + Quá trình tải bị hủy, vì tập tin đã bị xoá Kết nối hết thời gian Bạn muốn xóa lịch sử tải về hay xóa tất cả những file đã tải về\? Giới hạn hàng chờ tải xuống - Chỉ một tải xuống sẽ chạy + Chỉ một lần tải mỗi lượt Bắt đầu tải xuống Tạm dừng tải xuống Hỏi nơi thư mục để tải xuống Bạn sẽ được hỏi nơi lưu vào mỗi lần tải xuống. \nHãy bật trình chọn thư mục của hệ thống (SAF) nếu bạn muốn tải xuống vào một cái thẻ nhớ Xóa vị trí phát - Xóa toàn bộ vị trí phát - Xác nhận xóa toàn bộ vị trí phát\? + Xóa tất cả vị trí phát + Xóa tất cả vị trí phát\? Nhóm kênh - Chọn thực thể + Chọn một thực thể Thực thể đã tồn tại Không thể xác nhận thực thể Nhập URL thực thể @@ -434,24 +426,24 @@ %d giây Có, và video đã xem một phần - Video đã xem trước và sau khi được thêm vào playlist sẽ bị xóa. -\nBạn có chắc không\? Video sẽ không thể hồi phục được! - Xóa video đã xem\? - Xóa video đã xem + Những video đã xem trước và sau khi thêm vào danh sách phát sẽ bị loại bỏ. +\nBạn có chắc không? Điều này không thể được hoàn tác! + Xóa các video đã xem? + Loại bỏ đã 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 lưu trữ\' cho phép tải xuống một 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ề Không thể khôi phục bản tải xuống này Bật tiếng Tắt tiếng - Yêu thích nhất - Thêm vào gần đây + Được yêu thích nhất + Đã thêm gần đây Ngôn ngữ sẽ thay đổi khi ứng dụng khởi động lại Bấm \"Xong\" khi hoàn thành - Xong + Đã hoàn thành ∞ video 100+ video @@ -466,17 +458,17 @@ 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. - Bật chế độ hạn chế Youtube + Bật chế độ hạn chế YouTube Chỉ URL HTTPS được hỗ trợ Chọn thực thể PeerTube ưa thích Thực thể PeerTube - Thời lượng tua video + Thời lượng tua-nhanh tới/-lùi Dòng chữ mô tả thời gian gốc từ các dịch vụ sẽ được hiển thị thay thế - Hiện thời gian gốc trên các item + Hiển thị thời gian ban đầu trước đây trên các mục Chọn dịch vụ; dịch vụ hiện tại: Bởi %s Được tạo bởi %s @@ -484,82 +476,82 @@ NewPipe chưa hỗ trợ loại nội dung này. \n \nCó thể nó sẽ được hỗ trợ bởi một phiên bản mới hơn trong tương lai. - Bạn có thấy feed của mình cập nhật chậm không\? Nếu có thì bạn có thể thử chế độ tăng tốc (bạn có thể bật/tắt chế độ này trong cài đặt hoặc bằng cách nhấn nút bên dưới). + Bạn có nghĩ rằng tải nguồn cấp dữ liệu quá chậm? Nếu vậy, hãy thử bật tải nhanh (bạn có thể thay đổi nó này trong cài đặt hoặc bằng cách nhấn nút bên dưới). \n -\nNewPipe hỗ trợ 2 cách cập nhật feed: -\n• Tải thông tin cả kênh cho từng kênh một; chậm nhưng chắc. -\n• Tải từ các nguồn chuyên dụng; nhanh nhưng thường không đầy đủ. +\nNewPipe cung cấp hai chiến lược tải nguồn cấp dữ liệu: +\n• Tìm nạp toàn bộ kênh đăng ký, tuy chậm nhưng đầy đủ. +\n• Sử dụng điểm cuối dịch vụ chuyên dụng, nhanh nhưng thường không hoàn thiện. \n -\nĐiểm khác biệt giữa 2 cách trên là cách nhanh hơn (chế độ tăng tốc) thường có thể thiếu thông tin - như thời lượng hay loại (VD: không thể phân biệt được giữa video thường và livestream) - và thiếu nội dung hơn. +\nSự khác biệt giữa hai loại này là cái nào nhanh thường thiếu một số thông tin, chẳng hạn như thời lượng hoặc loại mục (không thể phân biệt giữa các video trực tiếp và bình thường) và nó có thể trả về ít mục hơn. \n -\nYouTube là một trong số các dịch vụ có hỗ trợ cập nhật nhanh, sử dụng RSS. +\nYouTube là một ví dụ về dịch vụ cung cấp phương pháp nhanh này với nguồn cấp RSS. \n -\nTuy nhiên, việc lựa chọn chế độ tùy thuộc vào mong muốn của bạn: tốc độ hay thông tin. - Tải thông tin từ các nguồn chuyên dụng nếu có thể - Bật chế độ tăng tốc - Tắt chế độ tăng tốc - Có thể được với một số dịch vụ, thường sẽ nhanh hơn nhưng có thể bị giới hạn nội dung nhận được hoặc nội dung nhận được không đầy đủ (v.d. thời lượng, trạng thái,..) +\nVì vậy, sự lựa chọn tập trung vào những gì bạn thích: tốc độ hoặc thông tin chính xác. + Tìm nạp từ nguồn cấp dữ liệu chuyên dụng khi có sẵn + Bật chế độ nhanh + Tắt chế độ nhanh + Có sẵn trong một số dịch vụ, nó thường nhanh hơn nhiều nhưng có thể trả về một số lượng mục hạn chế và thông tin thường không đầy đủ (ví dụ: không có thời lượng, loại mục, trạng thái không trực tiếp) Luôn cập nhật - Khoảng thời gian kể từ lần cuối cập nhật thông tin kênh trước khi nó được coi là hết hạn — %s - Ngưỡng thời gian cập nhật thông báo - Thông báo (feed) + Thời gian sau lần cập nhật cuối cùng trước khi đăng ký được coi là lỗi thời — %s + Ngưỡng cập nhật nguồn cấp dữ liệu + Nguồn cấp dữ liệu Tạo mới - Bạn muốn xóa nhóm kênh này\? - Tên nhóm kênh trống + Bạn có muốn xóa nhóm này\? + Tên nhóm trống Đã chọn %d - Chưa chọn kênh nào - Chọn kênh - Đang xử lý thông báo… - Số kênh không tải được: %d - Đang tải thông báo… - Thông báo cập nhật lần cuối vào: %s - Do giới hạn của ExoPlayer, khoảng thời gian tua đã được đặt lại thành %d giây + Chưa chọn kênh đăng ký nào + Chọn kênh đăng ký + Đang xử lý nguồn cấp dữ liệu… + Chưa tải được: %d + Đang tải nguồn cấp dữ liệu… + Nguồn cấp được cập nhật lần cuối: %s + Do các hạn chế của ExoPlayer, đã đặt lại thời lượng tua thành %d giây đang khôi phục - Tự tạo (không tìm thấy người upload) + Được tạo tự động (không tìm thấy người tải lên) Cục bộ Trang chính mặc định Trang danh sách phát - Chỉ hiện các kênh chưa được nhóm + Chỉ hiển thị các đăng ký chưa được nhóm Không bao giờ Chỉ trên Wi-Fi - Tự động phát — %s - Phát hàng đợi (Video) - Không có danh sách nào ở đây - Chọn danh sách + Bắt đầu phát lại tự động — %s + Phát hàng đợi + Chưa đánh dấu danh sách phát nào + Chọn danh sách phát Vui lòng kiểm tra xem vấn đề mà bạn đang gặp đã báo cáo trước đó hay chưa. Nếu bạn tạo quá nhiều báo cáo trùng lặp, bạn sẽ khiến cho chúng tôi tốn thời gian để đọc chúng thay vì sửa lỗi bạn gặp. Báo cáo trên GitHub Sao chép bản báo cáo đã được định dạng - Không thể đọc URL này. Mở với app khác\? + Không thể đọc URL này. Mở với ứng dụng khác? Tự động thêm vào hàng đợi Hàng đợi của trình phát hiện tại sẽ bị thay thế Việc chuyển từ trình phát này sang trình phát khác có thể sẽ thay thế hàng đợi - Hỏi xác nhận trước khi xóa hàng đợi + Yêu cầu xác nhận trước khi xóa hàng đợi Để trống Đang tải Ngẫu nhiên Lặp lại Bạn có thể chọn tối đa ba hành động để hiện trong thông báo thu gọn! - Chỉnh sửa mỗi hành động trong thông báo ở dưới bằng cách nhấn vào nó. Chọn tối đa ba hành động để hiện trong thông báo thu gọn bằng cách sử dụng các ô đánh dấu bên phải + Chỉnh sửa từng hành động thông báo bên dưới bằng cách nhấn vào nó. Chọn tối đa ba trong số chúng để hiển thị trong thông báo thu gọn bằng cách sử dụng các hộp kiểm ở bên phải. Nút hành động thứ năm Nút hành động thứ tư Nút hành động thứ ba Nút hành động thứ hai Nút hành động đầu tiên - Chỉnh ảnh thu nhỏ của video trên thanh thông báo từ tỉ lệ 16:9 thành 1:1 (có thể gây méo ảnh) + Cắt bớt hình thu nhỏ video hiển thị trong thông báo từ tỷ lệ khung hình 16:9 xuống 1:1 Chỉnh ảnh thu nhỏ thành tỉ lệ 1:1 Đang hiện kết quả cho: %s - Thêm vào danh sách đang phát + Thêm vào hàng đợi Hiển thị nội dung không phù hợp vì có giới hạn độ tuổi (18+) Hiện ảnh thu nhỏ (thumbnail) trên nền màn hình khóa và trong thông báo Xem hình thu nhỏ Kiểm tra bộ nhớ - Đã thêm vào danh sách đang phát + Đã thêm vào hàng đợi Xoá Cookie mà NewPipe lưu trữ sau khi bạn hoàn thành nó Cookie reCAPTCHA đã được xóa - Xóa bỏ Cookie của reCAPCHA - YouTube cung cấp \"Chế độ hạn chế\" để ẩn nội dung không phụ hợp + Xóa Cookie của reCAPCHA + YouTube cung cấp \"Chế độ hạn chế\" để ẩn nội dung có khả năng dành cho người trưởng thành Yêu cầu Android tùy chỉnh màu của thông báo theo màu chính của ảnh thu nhỏ (lưu ý rằng việc này không khả dụng trên tất cả thiết bị) Tô màu thông báo Thiết bị của bạn không có ứng dụng để mở tệp này @@ -567,16 +559,16 @@ Gần đây Đang tính hash Mô tả - Video liên quan + Các mục liên quan Bình luận - Thông báo cho quá trình hash video - Thông báo hash video - Tắt để ẩn các hộp thông tin meta chứa thông tin bổ sung về tác giả/nội dung của stream, hoặc yêu cầu tìm kiếm - Hiện thông tin meta + Thông báo cho quá trình băm video + Thông báo băm video + Tắt để ẩn các hộp siêu dữ liệu có thông tin bổ sung về người tạo luồng, nội dung luồng hoặc yêu cầu tìm kiếm + Hiển thị thông tin meta Tắt để ẩn mô tả video và các thông tin bổ sung Hiện mô tả Mở bằng - Tệp tin đã bắt đầu được tải xuống + Tệp đang được tải xuống Bạn có thể chọn giao diện ban đêm cho mình phía bên dưới Chọn giao diện ban đêm của bạn — %s Tự động (giao diện hệ thống) @@ -584,16 +576,16 @@ Nội dung này chỉ dành cho người dùng trả phí, nên NewPipe không thể phát hay tải xuống. Video này chỉ được dành cho thành viên YouTube Music Premium, nên NewPipe không thể phát hay tải xuống. Nội dung này được để ở chế độ riêng tư, nên NewPipe không thể phát hay tải xuống. - Đây là một track SoundCloud Go+, nên NewPipe không thể phát hay tải xuống được, ít nhất là tại quốc gia của bạn. + Đây là bản nhạc SoundCloud Go+, ít nhất là ở quốc gia của bạn, vì vậy NewPipe không thể phát trực tuyến hoặc tải xuống bản nhạc này. Nội dung này không có sẵn ở quốc gia của bạn. Làm văng ứng dụng - Video này đã bị giới hạn độ tuổi. -\nVì những quy định mới của YouTube, NewPipe không thể phát được video này, vì không thể tìm thấy nguồn phát video. - Chủ đề ban đêm + Video này bị giới hạn độ tuổi. +\nDo chính sách mới của YouTube với các video bị giới hạn độ tuổi, NewPipe không thể truy cập bất kỳ luồng video nào của nó và do đó không thể phát nó. + Chủ đề đêm Nổi bật Hiện chi tiết kênh Hoàn thành - Tắt truyền phương tiện qua đường hầm nếu bạn gặp màn hình đen hoặc khựng khi phát video + Tắt tính năng truyền tải phương tiện nếu bạn gặp phải tình trạng màn hình đen hoặc giật hình khi phát lại video. Tắt truyền phương tiện qua đường hầm Tắt Bật @@ -603,7 +595,6 @@ Riêng tư Chưa được liệt kê Công khai - URL hình thu nhỏ Nơi chứa Hỗ trợ Ngôn ngữ @@ -617,14 +608,13 @@ 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. -\nBạn có muốn huỷ đăng ký kênh này không\? - Không thể tải thông báo cho \'%s\'. - Lỗi khi tải nguồn thông báo - \'Storage Access Framework\' chỉ được hỗ trợ từ Android 10 trở đi + Chế độ nạp nhanh không cung cấp thêm thông tin về điều này. + Tài khoản của tác giả đã bị chấm dứt. +\nNewPipe sẽ không thể tải nguồn cấp dữ liệu này trong tương lai. +\nBạn có muốn hủy đăng ký khỏi kênh này không\? + Không thể tải nguồn cấp dữ liệu cho \'%s\'. + Lỗi tải nguồn cấp dữ liệu + \'Khung truy cập lưu trữ\' chỉ được hỗ trợ từ Android 10 trở lên Bạn sẽ được hỏi nơi bạn muốn lưu mỗi mục tải xuống Chưa có thư mục tải xuống nào được đặt, hãy chọn thư mục tải xuống mặc định ngay Không hiện @@ -634,7 +624,7 @@ Bình luận đã bị tắt Đã được chủ kênh thả \"thính\" Đánh dấu là đã xem - Hiện ruy băng được tô màu Picasso ở trên cùng các hình ảnh và chỉ ra nguồn của chúng: đỏ đối với mạng, xanh lam đối với ổ đĩa và xanh lá đối với bộ nhớ + Hiển thị các dải băng màu Picasso trên đầu các hình ảnh cho biết nguồn của chúng: màu đỏ cho mạng, màu lam cho đĩa và màu lục cho bộ nhớ Hiện dấu chỉ hình ảnh Đề xuất tìm kiếm trên mạng Đề xuất tìm kiếm cục bộ @@ -644,12 +634,12 @@ %s lượt tải xuống đã hoàn tất - Vuốt các mục để xóa chúng - Không bắt đầu video ở trình phát mini, mà chuyển trực tiếp thành chế độ toàn màn hình, nếu tự động xoay bị khóa. Bạn vẫn có thể truy cập trình phát mini bằng cách thoát khỏi toàn màn hình + Vuốt các mục để loại bỏ chúng + Không bắt đầu các video ở trình phát mini, mà chuyển trực tiếp thành chế độ toàn màn hình, nếu tự động xoay bị khóa. Bạn vẫn có thể truy cập trình phát mini bằng cách thoát khỏi toàn màn hình Khởi động trình phát chính ở toàn màn hình - Đã cho mục tiếp vào hàng đợi - Cho video kế tiếp vào hàng đợi - Đang thực hiện...Có thể mất một lúc + Đã xếp kế tiếp vào hàng + Xếp kế tiếp vào hàng + Đang xử lý... Có thể mất chút thời gian Thông báo lỗi Thông báo để báo cáo lỗi NewPipe đã gặp sự cố, nhấn để xem và báo cáo @@ -658,35 +648,34 @@ Hiện tùy chọn dừng đột ngột khi sử dụng trình phát Hiện thanh báo lỗi Tạo thông báo lỗi - Kiểm tra cập nhật + Kiểm tra cập nhật Kiểm tra phiên bản mới theo cách thủ công Đang kiểm tra cập nhật… - Mục thông báo mới - Làm trình phát dừng + Mục nguồn cấp dữ liệu mới + Làm sập trình phát Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework. - Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống - 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 +\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 trình quản lý tệp nào thích hợp cho hành động này. +\nVui lòng cài đặt một trình quản lý tệp hoặc thử tắt \'%s\' trong thiết đặt tải xuống LeakCanary không khả dụng - ExoPlayer mặc định + Mặc định ExoPlayer Bình luận được ghim Thông báo trình phát - Thiết lập thông báo hiện đang phát + Cấu hình thông báo hiện đang phát trực tuyến Thông báo Luồng truyền mới - Thông báo về video mới đối với mục đăng ký + Thông báo về luồng mới của kênh đăng ký %s luồng truyền mới - Đang tải chi tiết luồng truyền… + Đang tải chi tiết luồng phát trực tiếp… Chạy kiểm tra luồng truyền mới - Thông báo video mới - Thông báo về video mới từ kênh bạn đã đăng ký + Thông báo về luồng mới + Thông báo về các luồng mới từ các kênh đăng ký Thời gian kiểm tra Yêu cầu kết nối mạng Bất kỳ loại mạng nào (có thể tính phí) - Xóa tất cả tệp đã tải xuống khỏi ổ đĩa\? + Xóa tất cả các tệp đã tải xuống khỏi bộ nhớ\? Thông báo bị tắt Được thông báo Bạn hiện đã đăng ký kênh này @@ -694,19 +683,132 @@ Phần trăm , Nửa cung - Luồng video mà không được trình tải xuống hỗ trợ sẽ không hiện - Không có video khả dụng cho trình chạy ngoài - Video bạn chọn không hỗ trợ trình chạy bên ngoài - Video này không có âm thanh khả dụng cho trình chạy ngoài + Các luồng chưa được trình tải xuống hỗ trợ sẽ không được hiển thị + Không có luồng video nào khả dụng cho trình phát bên ngoài + Luồng phát đã chọn không được trình phát ngoài hỗ trợ + Không có luồng âm thanh nào khả dụng cho máy phát bên ngoài Chọn chất lượng cho trình chạy ngoài - Định dạng không xác định (:P) + Định dạng không xác định Độ 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 + Kích thước tải thời lượng phát lại Thể loại Câu hỏi thường gặp Xem trên website - Nếu bạn gặp rắc rối 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 + 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 ! + 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 trùng lặp %d lần + Dạng thẻ + 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ế độ tăng tốc + Danh sách phát màu xám thì đã chứa mục này. + 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 + Bỏ qua nhận nút phương tiện vật lý + Loại bỏ các bản trùng lặp + Loại bỏ các bản trùng lặp? + Bạn có muốn loại bỏ mọi luồng trùng lặp trong danh sách phát này\? + Hiện/Ẩn luồng phát + Hiển thị các luồng phát sau + Đã xem đầy đủ + Đã xem một phần + Bỏ đặt vĩnh viễn hình thu nhỏ + Thay đổi kích thước khoảng thời gian tải trên nội dung lũy tiến (hiện tại là %s). Giá trị thấp hơn có thể tăng tốc độ tải ban đầu của chúng + Một bản âm thanh đã có sẵn trong luồng này + Sử dụng tính năng bộ giải mã dự phòng của ExoPlayer + Giải pháp thay thế này giải phóng và khởi tạo lại codec video khi xảy ra thay đổi bề mặt, thay vì cài đặ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ố này, cài đặt này chỉ ảnh hưởng đến 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 + mô tả + lồng tiếng + Ưu tiên âm thanh gốc + Chọn bản âm thanh gốc kể cả nhiều ngôn ngữ + Ưu tiên âm thanh mô tả + Chọn một bản âm thanh có mô tả cho người khiếm thị nếu có + Chọn cử chỉ vuốt cho nửa bên trái màn hình của trình phát + Hành động cho cử chỉ trái + Chọn cử chỉ vuốt cho nửa bên phải màn hình của trình phát + Hành động cho cử chỉ phải + Độ sáng + Âm lượng + Không + Âm thanh: %s + Bản âm thanh + Sắp tới + Không rõ + Chọn bản âm thanh cho máy phát bên ngoài + Cài đặt ExoPlayer + Quản lý một số cài đặt ExoPlayer. Những thay đổi này yêu cầu khởi động lại trình phát để có hiệu lực + Đang tải siêu dữ liệu… + Vị trí tab chính + Tìm nạp các tab kênh + Đường hầm phương tiện đã bị tắt theo mặc định trên thiết bị của bạn vì kiểu thiết bị của bạn được biết là không hỗ trợ tính năng này. + Các tab cần tìm nạp khi cập nhật nguồn cấp dữ liệu. Tùy chọn này không có hiệu lực nếu kênh được cập nhật bằng chế độ nhanh. + Hình đại diện của người tải lên + Di chuyển bộ chọn tab chính xuống dưới cùng + Không có luồng trực tiếp + Ảnh xem trước + Không có luồng + Các video + Người đăng ký + Những thẻ nào được hiển thị trên các trang kênh + Thẻ kênh + Chuyển đổi hướng màn hình + Chuyển đổi toàn màn hình + Hình đại diện + %1$s %2$s + Luồng tiếp theo + Hình đại diện kênh phụ + Mở phát hàng chờ + Giới thiệu + Phát lại + Băng rôn + Danh sách phát + Phát + Lựa chọn khác + Thời lượng + Kênh + Luồng trước đó + Chất lượng ảnh + \? + Chia sẻ danh sách URL + Chia sẻ với Tiêu đề + %1$s +\n%2$s + Video ngắn + Chất lượng thấp + Không tải ảnh + Chất lượng cao + Chia sẻ danh sách phát + Tua đi + Album + Tua lại + Chia sẻ danh sách phát với các thông tin chi tiết như tên danh sách phát và tiêu đề video hoặc dưới dạng danh sách URL video đơn giản + Chất lượng trung bình + - %1$s: %2$s + Chọn chất lượng hình ảnh và chọn có tải chất lượng ảnh hay không, để giảm mức sử dụng dữ liệu và bộ nhớ. Thay đổi xoá cache ảnh cho cả trong bộ nhớ lẫn ổ cứng - %s + Track + Trực tiếp + Chỉnh sửa từng hành động thông báo bên dưới bằng cách nhấn vào nó. Ba hành động đầu tiên (phát/tạm dừng, trước đó và tiếp theo) do hệ thống thiết lập và không thể tùy chỉnh. + Hiện ít hơn + Hiện nhiều hơn + + %s hồi đáp + + Không đủ dung lượng trống trên thiết bị + Sao lưu và khôi phục + Đặt lại cài đặt + Đặt lại tất cả cài đặt về giá trị mặc định + Việc đặt lại tất cả cài đặt sẽ loại bỏ tất cả các cài đặt ưa thích của bạn và khởi động lại ứng dụng. +\n +\nBạn có chắc muốn tiếp tục? + Không + NewPipe có thể tự động kiểm tra các phiên bản mới theo thời gian và thông báo cho bạn khi chúng có sẵn. +\nBạn có muốn kích hoạt tính năng này không? + + Cài đặt trong xuất đang được nhập sử dụng định dạng dễ bị tấn công và không được dùng nữa kể từ NewPipe 0.27.0. Đảm bảo rằng bản xuất đang được nhập là từ một nguồn đáng tin cậy và chỉ ưu tiên sử dụng các bản xuất lấy từ NewPipe 0.27.0 hoặc mới hơn trong tương lai. Hỗ trợ nhập cài đặt ở định dạng dễ bị tấn công này sẽ sớm bị xóa hoàn toàn và khi đó các phiên bản cũ của NewPipe sẽ không thể nhập cài đặt xuất từ phiên bản mới nữa. \ No newline at end of file diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index 63fc8164446..ce2d482a526 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -3,4 +3,7 @@ (such as screen margins) for screens with more than 820dp of available width. This would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 64dp + + 208dp + 117dp diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e4358152311..d4a2bf0bd46 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 个视频 已停用 - 后台播放 + 后台 显示搜索建议 订阅 已订阅 @@ -46,7 +46,6 @@ 仅一次 添加至 文件 - 加载封面 清空播放历史 最小化至后台播放 @@ -106,7 +105,6 @@ 新建 退出 重命名 - 未安装可播放此文件的应用程序 已删除一个项目。 自定义主页显示的标签页 列表视图模式 @@ -140,13 +138,12 @@ 反馈错误 错误 无法加载所有缩略图 - 无法解密视频的 URL 签名 无法解析网址 内容不可用 无法设置下载菜单 App/UI 崩溃 抱歉, 这本不该发生。 - 使用电子邮件反馈错误 + 使用电子邮件反馈 抱歉,发生了一些错误。 反馈 信息: @@ -164,7 +161,7 @@ reCAPTCHA 验证 已请求新的 reCAPTCHA 验证 在悬浮窗中播放 - 默认分辨率(悬浮窗模式) + 悬浮窗默认分辨率 使用更高的分辨率 仅部分设备支持播放 2K 或 4K 视频 清除 @@ -311,7 +308,6 @@ 该操作消耗大量流量, \n \n你想继续吗? - 关闭可禁止加载封面,节省流量和内存使用。切换该选项将立即清除内存与存储中的图片缓存 清空图像缓存成功 清空已缓存的元数据 清空已缓存的网页数据 @@ -351,10 +347,6 @@ 曲目 用户 选择标签 - 手势控制音量 - 使用手势控制播放器的音量 - 手势控制亮度 - 使用手势控制播放器的亮度 视频默认语言 应用更新通知 NewPipe 新版本的通知 @@ -401,7 +393,7 @@ 无法覆盖文件 已暂停下载包含此名称的任务 NewPipe 在处理文件时被关闭 - 设备上没有剩余储存空间 + 设备上没有剩余储存空间 进度丢失,文件已被删除 连接超时 是否清空下载记录或删除所有下载的文件? @@ -449,7 +441,7 @@ 应用语言 系统默认 完成后请点击“完成” - 完成 + 完成 视频 %d 秒 @@ -542,7 +534,7 @@ 随机播放 单曲循环 最多可以选择三个操作显示在紧凑通知中! - 点击编辑下面的每一个通知操作。使用右方的复选框选择在紧凑通知中显示的动作,最多可以选择三个 + 轻按下面的每一个通知操作进行编辑。使用右方的复选框选择在紧凑通知中显示的操作,最多可以选择三个。 第五操作按钮 第四操作按钮 第三操作按钮 @@ -593,19 +585,18 @@ 选择你最喜欢的夜间主题 — %s 夜间主题 显示频道详情 - 如果遇到黑屏或视频播放卡顿的情况,请停用媒体隧道 + 如果在视频播放中遇到黑屏或卡顿的情况,请停用媒体隧道。 停用媒体隧道 停用简介中的文本选择功能 内部 私享 未分类 公开 - 缩略图 URL 所在服务器 支持 语言 年龄限制 - 私有性 + 私密性 许可 标签 类别 @@ -624,7 +615,6 @@ 你会被问到在哪里保存每个下载 尚未设置下载文件夹,现在选择默认下载文件夹 平板模式 - 显示已观看的项目 关闭 开启 评论功能已停用 @@ -652,7 +642,7 @@ 处理中…可能需要一些时间 手动检查新版本 检查更新中… - 检查更新 + 检查更新 新订阅源条目 显示\"使播放器崩溃\" 在使用播放器时显示一个崩溃选项 @@ -669,7 +659,6 @@ NewPipe 遇到了一个错误,点击此处报告此错误 置顶评论 LeakCanary 不可用 - 更改加载间隔的大小(当前为 %s),较低的值可以加快视频的首次加载速度。更改需要重启播放器 ExoPlayer 默认 配置当前正在播放的串流的通知 新串流通知 @@ -702,9 +691,6 @@ 不显示下载器尚不支持的串流 未知画质 播放加载间隔大小 - 显示未来项目 - 隐藏看过的项目 - 隐藏未来项目 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! 在网站上查看 @@ -713,4 +699,117 @@ 从三点菜单导入或导出订阅 你正在运行最新版的 NewPipe 轻按下载 %s + 只有在主题中选择了 %s 该选项才可用 + 取消设置永久缩略图 + 卡片 + 无法复制到剪贴板 + 变灰的播放列表已经包含此项目。 + 重复添加了 %d 次 + 如果你在使用一副物理按钮坏掉的耳机,该选项应该会有帮助 + 忽略硬件媒体按钮事件 + 删除重复吗? + 你想删除这个播放列表中所有重复项吗? + 显示下列音视频流 + 显示/隐藏音视频流 + 完整看过 + 只看了一部分 + 即将到来 + 删除重复 + 亮度 + 音量 + 右半边手势动作 + 左半边手势动作 + 选择播放器屏幕左半边手势 + 选择播放器屏幕右半边手势 + + 更改渐进式内容的加载间隔大小(当前为 %s)。较低的值可加快初始加载 + 偏好描述性音频 + 如果可用,为视障人群选择带描述的音轨 + 音频:%s + 此串流中应该已经有音轨 + 选择外部播放器音轨 + 未知 + 管理一些 ExoPlayer 设置。这些更改需要重启播放器才能生效 + 使用 ExoPlayer 的编码器回退功能 + 始终使用 ExoPlayer 的视频输出界面设置变通方法 + 此变通方法在发生界面更改时会释放并重新初始化视频编解码器,而不是直接将编解码器设置到新界面。在某些有这个问题的设备上,Exoplayer 已经在使用这个方法。此设置仅适用于 Android 6 及更高的系统版本 +\n +\n启用此选项可防止切换当前视频播放器或切换到全屏播放时出现播放错误 + 原始 + 配音 + 描述 + 偏好原始音频 + 不管何种语言都选择原始音轨 + 音轨 + ExoPlayer 设置 + 如遇解码器初始化方面的问题可开启此选项。启用后,如主解码器初始化失败,ExoPlayer 将使用较低优先级的解码器进行播放。请注意,这可能导致播放性能下降 + 将主标签页选择器移到底部 + 主标签页位置 + %1$s %2$s + 媒体隧道功能在你的设备上默认停用,因为已知你的设备型号不支持它。 + 无直播 + 无音视频流 + 视频 + 订阅者 + 展示在频道页面上的标签页 + 频道标签页 + 短视频 + 正在加载元数据… + 获取频道标签页 + 关于 + 专辑 + 更新数据源时要获取的标签页。如果使用快速模式更新频道,则该选项无效果。 + 播放列表 + 歌曲 + 频道 + 直播 + 切换全屏方向 + 切换全屏 + 下一条串流 + 打开播放队列 + 前进 + 后退 + 重放 + 播放 + 更多选项 + 持续时间 + 上一条串流 + 图片质量 + + 低质量 + 头像 + 子频道头像 + 不加载图片 + 高质量 + 中等质量 + 上传者头像 + 横幅 + 选择图片质量以及是否根本不加载图片来降低数据和内存使用。更改选项会清除内存中和磁盘上的图片缓存 - %s + 缩略图 + 只包含视频网址 + 分享时带视频标题 + %1$s +\n%2$s + 分享播放列表 + 分享详细的播放列表(带名称和视频标题等信息)或只分享视频网址列表 + - %1$s: %2$s + + %s 条回复 + + 显示较多 + 显示较少 + 轻按下方的每个通知操作进行编辑。头三个动作(播放/暂停、上一个和下一个)是系统设置的,不能自定义。 + 设备剩余空间不足 + 备份和还原 + 重置设置 + 将所有设置重置为默认值 + 重置所有设置会取消你所有的偏好设置并重启应用。 +\n +\n你确定想要继续吗? + + NewPipe 可以自动时不时地检查新版本并在新版本可用时通知你。 +\n你想开启该功能吗? + + 正导入的导出文件中的设置使用了有漏洞的格式,该格式已从 NewPipe 0.27.0 版本起被弃用。请确保导入的导出文件来自可信来源,今后最好只使用从 NewPipe 0.27.0 或更新版本获取的导出文件。不久后将完全不支持导入这一有漏洞格式的设置,到时旧版 NewPipe 再不能导入来自新版应用的设置导出文件。 + 第二 \ 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 ab902d37329..518a1290fc5 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -7,26 +7,26 @@ 下載 搜尋 設定 - 您係咪想搵「%1$s」? - 用外面嘅影片播放器 - 用外面嘅音樂播放器 + 你係咪想搵「%1$s」? + 用出面嘅影片播放器 + 用出面嘅音樂播放器 影片下載路徑 下載咗嘅影片檔案會收埋喺度 - 揀選影片檔案嘅下載資料夾 - 預設解像度 + 揀選影片檔案嘅下載文件夾 + 預設嘅解像度 用 Kodi 嚟播放 - 要唔要裝缺少嘅 Kore app? + 裝唔裝缺少咗嘅 Kore app? 顯示「用 Kodi 嚟播放」嘅選項 顯示以 Kodi 媒體中心播放影片嘅選項 聲音 預設聲音檔案格式 - 色系 - 黑暗 - 明亮 + 主題色系 + 黑眼睛 + 白頭浪 下載 顯示「接續落」同「咁上下」嘅影片 唔支援呢個網址 - 內容預設語言 + 預設內容語言 影音 版面 幕後播緊 @@ -34,29 +34,28 @@ 播放影片,片長: 上載者嘅頭像縮圖 讚好 - 劣評 + 負皮 搵唔到串流播放器。要唔要裝 VLC? 喺瀏覽器開啟 - 分享影片 - 音樂下載資料夾 + 分享影片畀 + 音樂下載文件夾 下載咗嘅音樂檔案會收埋喺度 - 揀選音樂檔案嘅下載資料夾 + 揀選音樂檔案嘅下載文件夾 撳放大鏡開始。 內容 顯示年齡設限嘅內容 直播 問題 載入唔晒全部縮圖 - 影片 URL 簽章解唔到碼 解析唔到網站 設定唔到下載功能表 啫係嗱,世事講唔埋嘅,真係唔好意思。 - 以電郵報告今次問題 + 以電郵報告 出咗啲問題,唔好意思。 報告 資訊: - 出事: - 您嘅意見 (請以英文輸入): + 出咗咩事: + 你嘅見解 (請以英文輸入): 詳情: 影片 聲音 @@ -64,10 +63,10 @@ 下載 下載 問題報告 - 內容未能提供 + 未能提供內容 開始 暫停 - 刪除 + 剷走 校驗碼 檔案名稱 @@ -79,13 +78,13 @@ 複製咗去剪貼簿 請之後喺設定度揀定一個下載資料夾 以浮面模式開啟 - 預設浮面解像度 + 預設浮面播放器嘅解像度 顯示更高解像度 - 得某啲機至播到 2K/4K 影片 - 預設影片檔案格式 - 純黑 + 得某啲機先播到 2K/4K 影片 + 預設嘅影片檔案格式 + 紅日降 浮面播緊 - 魂&我 + 全部嘢 App/界面閃退 經過:\\n請求:\\n內容語言:\\n內容國家:\\nApp 語言:\\n服務:\\nGMT 時間:\\n封裝:\\n版本:\\nOS 版本: @@ -94,15 +93,15 @@ 以浮面模式開啟 \n有呢個權限至得 要完成 reCAPTCHA 考驗 - 某啲解像度可能會冇聲 + 某啲影片可能會冇聲 幕後播 浮面播 - 記住浮面點擺法 - 記住對上一次浮面嘅大細同擺位 + 記住浮面嘅擺法 + 記住上次浮面嘅大細同擺位 搜尋建議 揀選搜尋嘅時候顯示邊啲建議 不適用 - 清除 + 抹走 最佳解像度 十億 關於 NewPipe @@ -110,25 +109,25 @@ © %1$s %2$s 版權所有,根據 %3$s 嘅條款授權 跋記 版權協議 - 喺 Android 上盡享自由輕便串流。 + 喺 Android 上盡享自由輕快嘅串流。 去 GitHub 睇下 - NewPipe 嘅授權協議 - 無論您對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都無任歡迎您幫手。聚沙成塔,眾志成城! + NewPipe 嘅版權協議 + 無論你對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都勁歡迎你嚟幫手。聚沙成塔,眾志成城! 閱讀版權協議 貢獻 - 抹走睇過嘅紀錄 - 搵唔到串流播放器 (您可以裝 VLC 嚟播)。 + 抹走播放紀錄 + 搵唔到串流播放器 (你可以裝 VLC 嚟播)。 下載串流檔案 訂閱 訂閱咗 取消訂閱 - 已成功取消訂閱頻道 - 轉唔到訂閱 + 已取消訂閱頻道 + 改唔到訂閱 更新唔到訂閱 顯示資訊 訂閱 - 收起嘅播放清單 - 用粗略快轉 + 儲起嘅播放清單 + 用粗略嘅快轉 加入去 選擇標籤 第一粒動作掣 @@ -137,30 +136,28 @@ 第四粒動作掣 隨機播放 緩衝緊 - 空白 - 用手勢去控制播放器光暗 + 空寥寥 本機搜尋建議 遠端搜尋建議 - 喺本機儲存搵過嘅查詢 - 睇過有紀錄 + 喺本機儲低搵過嘅紀錄 + 有睇過有紀錄 恢復播放 - 返返最後播放到去嗰個位 + 返返去最後播放嘅嗰個位 清單度睇到播到去邊 縮圖以 1:1 長寬比框起 顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比 通知色彩化 等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意:唔係部部機都用得) - 夜色 + 晚風色系 跳前/跳後嘅快轉長短 - 關閉去隱藏影片描述同附加資訊 + 閂埋佢去隱藏影片描述同附加資訊 剔低睇過 - 開啟方式 - 搵緊呢挺嘢:%s + 開啟方式係 + 搜尋到嘅嘢係:%s 第五粒動作掣 - 撳一下下面每粒掣去更改各個通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度顯示 + 撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個,擺落去精簡通知度。 精簡通知最多淨係擺到三個動作! 循環播放 - 載入縮圖 顯示留言 關閉去隱藏留言 搜尋紀錄 @@ -169,19 +166,15 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 音量手勢控制 - 用手勢去控制播放器音量 - 光暗手勢控制 - 關閉去避免載入縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 - 粗糙快轉允許播放器比較籠統噉快轉去其他位置。快轉 5、15 或 25 秒就太精緻,粗做唔到 + 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 - 內容預設國家 + 預設嘅國家內容 演出者 專輯 淨係支援 HTTPS 嘅 URL 除錯 復原 - 刪除咗個檔案 + 剷走咗個檔案 幾時都係 一次咁多 檔案 @@ -194,19 +187,19 @@ 使用者 事件 歌曲 - 抹走當您完成 reCAPTCHA 嘅時候 NewPipe 儲存嘅 Cookie + 抹走當你完成 reCAPTCHA 嘅時候, NewPipe 儲存嘅 Cookie 轉返主版面 收埋喺背景 撈起去浮面 匯入資料庫 主播放器用全螢幕開啟 - 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。您仍可結束全螢幕返返去袖珍播放器 + 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。你仍可結束全螢幕返返去袖珍播放器 認唔出呢個 URL。要唔要用另一個 app 開? YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容 - 有年齡限制 (例如 18+) 故可能兒童不宜嘅內容都照顯示 + 有年齡限制 (例如 18+/兒童不宜)嘅內容都照顯示 呢部影片有年齡限制。 \n -\n如果您想睇,請喺設定度開啟「%1$s」。 +\n如果你想睇,請喺設定度開啟「%1$s」。 呢部影片有年齡限制。 \n鑑於 YouTube 就年齡限制影片嘅新政策,NewPipe 存取唔到條片嘅任何影像串流,所以播放唔到。 [未知] @@ -214,7 +207,7 @@ 抹走咗 reCAPTCHA Cookie 恢復播放 打斷 (例如有電話) 完之後繼續播放 - 記低睇過嘅影片 + 記低晒睇過嘅影片 自動播放 更新 開啟 YouTube 嘅「嚴格篩選模式」 @@ -229,7 +222,7 @@ 外置播放器唔支援呢類型嘅連結 搵唔到影像串流 搵唔到聲音串流 - 檔案搬走咗或刪除咗 + 檔案搬走咗或剷走咗 個檔案唔喺度,又或者欠缺讀寫權限 檔名冇得留空 復原緊播放器錯誤 @@ -238,24 +231,24 @@ 讀取唔到儲存咗嘅分頁,所以用返預設分頁 還原返預設噉樣 發生錯誤:%1$s - 您係咪要還原返做預設嗰個樣? + 你係咪要還原返做預設嗰個樣? 複製執咗格式嘅報告 乜都搵唔到 名稱 接受 - 關閉 + 閂埋佢 下載失敗 - 完成咗 %s 個下載 + 完成咗 %s 嘅下載 產生獨一無二嘅名稱 匯入檔案 匯出緊… 先前嘅匯出 - 惟請注意:呢項操作可能相當消耗網絡數據。 + 請注意:呢項操作可能相當消耗網絡數據。 \n -\n您係咪要繼續? +\n你係咪要繼續? 幾時都唔使 自動 低畫質 (細格啲) @@ -294,9 +287,9 @@ 匯入唔到訂閱 節奏 播放速度控掣 - 系統預設噉樣 - 檢查有冇更新 - 個 App 用咩文 + 系統預設 + 檢查有冇更新 + 個 App 用咩語言 睇咗嗰啲剷咗佢 係咪要剷走睇咗嘅影片? 網站 @@ -324,13 +317,12 @@ 未設定下載資料夾,請立即揀選預設嘅下載資料夾 刪除咗 1 個項目。 執執佢 - 未裝 app 嚟播放呢個檔案 - 搞掂 - NewPipe 專案非常著重您嘅私隱。因此,呢個 app 未得您同意係唔會收集任何資料。 -\nNewPipe 嘅私隱政策,詳述當您傳送彈 app 報告時,有咩資料會傳送同保存。 + 搞掂 + NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 +\nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 最近播放 最常播放 - 頭版內容 + 頭條新嘢 頭版要擺放邊啲分頁 打橫掃走啲項目去剷走佢 空白頁 @@ -339,13 +331,13 @@ 頭 50 位 最新同大熱 警告:未能匯入晒全部檔案。 - 噉樣做會冚咗您而家嘅設定個囉噃。 - 您想唔想匯入埋啲設定? + 噉樣做會冚咗你而家嘅設定個囉噃。 + 你想唔想匯入埋啲設定? 載入唔到留言 最近新加 剷咗佢 詳細資料 - 唔使靜音 + 唔使噤聲 背景播放器 浮面播放器 幾時都問 @@ -360,8 +352,8 @@ 匯入緊… 無聲嘅時候快轉 重設 - 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請您注意 NewPipe 嘅私隱政策。請仔細閱讀。 -\n您必須接受先可以傳送錯誤報告畀我哋。 + 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。 +\n你必須接受,先可以傳送錯誤報告畀我哋。 拒絕 用流動數據嘅時候限制解像度 更新 @@ -388,53 +380,53 @@ 改過個名 字母同數目字 - 大部份特殊字元 + 大部份嘅特殊字元 下載 課金 匯出唔到訂閱 修改播放器字幕大細同背景款式。要重新開過個 app 先會生效 執好就撳一下「搞掂」 - 靜音 + 噤聲 處理緊… 可能要等等 令播放器閃退 自動輪候 - 係咪要全部剷走晒睇過嘅紀錄? + 係咪要全部剷走晒睇片嘅紀錄? 顯示元資訊 - 關閉去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 + 閂埋佢去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 顯示「撳住就輪候」提示 - 揀選啱您心水嘅 PeerTube 站 + 揀選啱你心水嘅 PeerTube 站 紀錄與快取 NewPipe 播放器嘅通知 抹除元資料快取 抹除咗元資料快取 - 自動輪候接續落串流 - 排隊播要完嘅時候 (又未設定循環播放) 就追加一條咁上下嘅串流 + 自動輪候接落串流 + 排隊清單嘅片要播完嘅時候 (並未設定循環播放) ,就追加一條相似性質嘅串流片 PeerTube 站 - 去 %s 發掘啱您心水嘅站 + 去 %s 發掘啱你心水嘅站 播放清單 問題報告通知 報告問題嘅通知 - 剷走播放過嘅串流同播放到邊個位嘅紀錄 + 剷走播放過嘅串流同之前啲片睇到邊嘅紀錄 剷走咗睇過嘅紀錄 NewPipe 遇到問題,撳一下去報告 發生問題,詳見通知 - 拖拉執排位 + 拖條片去執好清單排位 轉換服務,而家揀選咗嘅係: 清單檢視模式 - 做噉一半冇咗,因為個檔案刪除咗 - 連線等太耐 + 做做下冇咗,因為個檔案刪除咗 + 等太耐連線 開始晒所有下載 - 下載排隊逐個嚟,唔要一次過 + 下載要排隊逐個嚟 近期 - 帳戶已被終止 + 已終止帳戶 語言 支援 覆寫唔到個檔案 暫停晒所有下載 平板電腦模式 - 個檔案建立唔到 - 您係咪想喺搜尋紀錄度刪除呢個項目? + 建立唔到呢個檔案 + 你係咪想喺搜尋紀錄度剷走呢個項目? 睇下咩問題 有個整緊嘅下載撞名 有個等緊嘅下載撞名 @@ -442,47 +434,47 @@ 喺鎖定畫面背景同埋通知都擺放縮圖 開始咗下載 年齡限制 - 您部機冇 app 開到佢 + 你部機冇 app 開到佢 呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。 - 揀選啱您心水嘅夜色主題 — %s + 揀選啱你心水嘅夜色主題 — %s 呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。 - 您可以喺下面揀選啱您心水嘅夜色主題 - 停用揀選描述入面嘅文字 + 你可以喺下面揀選啱你心水嘅夜色主題 + 停止揀選描述入面嘅文字 一格格 一行行 加入去播放清單 新嘅播放清單 顯示頻道詳情 - 唔見影 + 唔見咗影 揀選一個播放清單 伺服器唔接受多執行緒下載,請改用 @string/msg_threads = 1 再試下啦 連接唔到伺服器 播放清單頁面 撳住就輪候 - 目的地資料夾建立唔到 + 建立唔到呢個目的地資料夾 建立唔到安全連線 喺幕後開始播放 - 部機冇晒位 + 部機冇晒位 頂櫳重試幾多次 - 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載或者冇得暫停 - 輪住下載 + 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載冇得暫停 + 輪住嚟下載 內部 私人 停止 按用量收費嘅網絡就閘住 抹走下載紀錄 - 您想抹走您嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? + 你想抹走你嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? 剷走下載咗嘅檔案 - 刪除咗 %1$s 個下載 + 剷走咗 %1$s 個下載 問我要下載去邊 - 排隊尾 + 排隊排隊尾 搵唔到伺服器 - 伺服器冇傳回資料 + 伺服器冇傳返資料嚟 後期處理失敗 - NewPipe 未搞掂個檔案就關閉咗 - 呢個下載恢復唔到 + NewPipe 未搞掂個檔案就閂埋咗 + 呢個下載檔案恢復唔到 同個下載咗嘅檔案撞名 同個現有嘅檔案撞名 @@ -495,66 +487,64 @@ 由 %s 建立 出自 %s 章節 - 呢部內容 NewPipe 仲未支援。 + NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 - 顯示睇過嘅項目 %s 話理由如下: 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式 - 呢部內容限區,喺您所在國家未有提供。 - 呢首 (至少喺您所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 - 呢部內容屬於私人,因此 NewPipe 未能串流或下載。 - 自動 (跟返部機嘅主題色系) + 呢部內容限區,喺你所在國家未有提供。 + 呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 + 呢部內容係私人嘢,因此 NewPipe 未能串流或下載。 + 明或暗 (跟返部機嘅主題色系) 精選 廣播 - 您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,個頁面可能眨眨下,同埋啲連結會撳唔到。 + 你而家可以揀選喺描述入面嘅文字喇。不過要單聲先,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結可能會撳唔到。 啟用揀選描述入面嘅文字 版權協議 分類 標籤 公開設定 - 縮圖 URL 公開 憑網址瀏覽 置頂留言 創作者畀咗心心 開啟網站 - + 主機 喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示 紀錄 紀錄 - 攝下個等陣播 - 記憶體洩露監測喺傾卸堆疊嘅時候,或者會導致個 app 冇反應 - 閂選單 - 攝咗做下個等陣播 + 攝咗做下個播 + 記憶體洩露監測喺傾卸堆疊嘢嘅時候,或者會導致個 app 冇反應 + 閂埋選單 + 攝咗做下個播 點做法 影片雜湊進度嘅通知 大笪地 抹走搜尋紀錄 - 刪除搜尋關鍵字嘅紀錄 + 剷走晒搜尋關鍵字嘅紀錄 係咪要全部剷走晒搜尋嘅紀錄? 頻道頁面 揀選一個頻道 排隊播 聲音設定 - 開選單 + 開啟選單 揀做播放清單縮圖 整咗個播放清單 加咗入播放清單 LeakCanary 用唔到 顯示記憶體洩露 - 強制報告喺片段或活動週期棄置後送遞唔到嘅 Rx 例外狀況 + 強制報告喺片段或週期棄置後送遞唔到嘅 Rx 狀況 顯示「令播放器閃退」 用播放器嘅時候顯示一個閃退選項 令個 app 閃退 顯示一則錯誤橫條 - 建立一則錯誤通知 + 建立一則出現錯誤通知 好,包括埋睇過但未睇晒嘅影片 - 礙於 ExoPlayer 所限,快轉長短經已改為 %d 秒 + 礙於 ExoPlayer 所限,快轉長度經已改為 %d 秒 影片雜湊通知 排咗去隊尾 揀定「開啟」動作 @@ -566,47 +556,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 嘅時候借過 @@ -619,7 +609,7 @@ 載入緊摘要… 處理緊摘要… 摘要 - 摘要上次更新:%s + 摘要上次更新到:%s 未有載入:%d 摘要隔幾耐要更新 訂閱對上一次更新後,隔幾耐視之為過時 — %s @@ -641,76 +631,183 @@ 下載工具暫未支援嘅串流,就無謂擺出嚟喇 著作者嘅帳戶已經被終止。 \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 嘅時候至有得揀 + 複製唔到去剪貼簿 + 一張張 + 灰咗嘅播放清單,即係已經有呢個項目。 + 重複加入咗 %d 次 + 忽略硬件多媒體掣嘅事件 + 譬如話你用耳機嗰陣,撳上面啲實體掣就會有用 + 重複嗰啲剷咗佢 + 重複咗嗰啲係咪要剷走? + 下列嘅串流見得光 + 顯示/隱藏串流 + 睇晒 + 未睇晒 + 未夠鐘上畫 + 你係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 揀選左手邊播放器螢幕嘅手勢 + 左手邊手勢動作 + 揀選右手邊播放器螢幕嘅手勢 + 右手邊手勢動作 + 調整光暗度 + 音量 + 乜都唔使做 + 優先揀原聲 + 優先揀旁述 + 揀選為視障人士而設嘅旁述音軌 (如有提供) + 揀選原始音軌,唔理佢講咩話 + 聲音: %s + 音軌 + 未知 + 呢個串流已經有音軌喇 + Exoplayer 設定 + 管理一啲 ExoPlayer 設定。呢啲變更需要重新啟動播放程式先會生效 + 用 ExoPlayer 嘅解碼器汰退功能 + 如果遇到解碼器初始化問題,請啟用呢個選項,如果主解碼器初始化失敗,就會用優先順序較低的解碼器。咁樣可能會導致播放性能比使用主解碼器嗰陣差 + 幾時都用 Exoplayer嘅浮面影片輸出設定解決方法 + 原聲 + 配音 + 旁述 + 為外面嘅播放器揀選音軌 + 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 +\n +\n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤 + 啲圖嘅畫質 + 影片 + + 訂閱者 + 頻道頁要騷邊啲分頁出嚟 + 齋分享 URL 清單 + 分享埋片名 + %1$s +\n%2$s + 頻道分頁 + 短片 + 載入緊元資料… + 橫豎轉換 + 低畫質 + 主畫面分頁擺位 + 切換全螢幕 + 攞邊啲頻道分頁 + 頭像 + %1$s %2$s + 下一個串流 + 已知您部機個型號唔支援多媒體隧道,因此預設已經停用咗先。 + 子頻道嘅頭像 + 跳去排隊播 + 唔要載入啲圖 + 高畫質 + 簡介 + 分享播放清單 + 跳前 + 專輯 + 跳後 + 重播 + 更新摘要嘅時候要攞邊啲分頁返嚟。若果頻道用快速模式更新,就橫豎都無相干嘞。 + 分享播放清單要詳細包含播放清單個名同埋入面啲片名,定簡單得啲影片嘅 URL + 一般畫質 + 上載者嘅頭像 + 橫額 + 播放清單 + - %1$s:%2$s + 主畫面嘅分頁揀選搬落最底 + 無直播串流 + 揀選啲圖嘅畫質,定索性唔載入啲圖,去慳啲用數據同記憶體。更改會抹走記憶體同磁碟入面嘅影像快取 — %s + 播放 + 其他選項 + 縮圖 + 曲目 + 片長 + 無串流 + 頻道 + 上一個串流 + 直播 + + %s 個回覆 + + 摺埋 + 拉開 + 撳下面嘅掣去更改對應嘅通知動作。頭三個動作 (播放/暫停、上一個、下一個) 系統預設咗,冇得揀。 + 部機冇晒位 + + NewPipe 可以周不時自動睇過有冇新版本,一出咗就通知您。 +\n您想唔想啟用呢個功能? + 推翻所有設定 + 推翻所有設定就會全盤抹走晒您喜好過嘅設定,然後重新開過個 app 個囉噃。 +\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 be81c294f6f..727898e17fb 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - %1$s 發布 - 找不到串流播放器。要安裝 VLC 嗎? + 發佈於 %1$s + 未找到串流播放器。安裝 VLC? 安裝 取消 以瀏覽器開啟 @@ -15,33 +15,33 @@ 使用外部音訊播放器 影片下載資料夾 下載好的影片檔案會儲存在這裡 - 選擇影片檔的下載資料夾 + 選擇視訊檔案的下載資料夾 預設解析度 用 Kodi 播放 顯示用 Kodi 媒體中心播放影片的選項 聲音 - 未找到 Kore app,是否安裝? + 要安裝缺少的 Kore 應用程式嗎? 顯示「用 Kodi 播放」的選項 預設音訊格式 主題 - 灰暗 - 明亮 + 深色 + 淺色 下載 顯示「下一部」與「相關」的影片 - 不支援此 URL + 不支援此網址 預設內容語言 影片與音訊 外觀 - 背景播放中 + 正在背景播放 網路錯誤 播放影片,持續時間: - 發佈者的個人頭像縮圖 + 發布者的頭像縮圖 喜歡 不喜歡 音訊下載資料夾 下載好的音訊檔案會儲存在這裡 選擇音訊檔的下載資料夾 - 輕觸放大鏡以開始使用。 + 點選放大鏡即可開始。 以懸浮視窗開啟 移除某些解析度的音訊 背景播放 @@ -49,43 +49,42 @@ 顯示更高的解析度 僅部份裝置可播放 2K/4K 影片 預設影片格式 - 純黑 + 黑色 記住懸浮視窗屬性 記住上次使用時懸浮視窗的大小和位置 搜尋建議 選擇在搜尋時顯示建議 - 以懸浮視窗播放中 + 正在以懸浮視窗播放 內容 顯示年齡限制內容 下載 下載 - 錯誤回報 + 回報錯誤 全部 已停用 清除 最佳解析度 錯誤 無法載入所有縮圖 - 無法解析影片 URL 簽章 無法解析網站 內容無法使用 無法設定下載選單 - 應用程式或界面已停止運作 + 應用程式或介面已崩潰 抱歉,這是不該發生的。 - 使用電子郵件回報此錯誤 - 抱歉,發生了一些問題。 + 透過電子郵件回報 + 抱歉,發生問題。 回報 資訊: 發生了什麼事: 發生了什麼:\\n請求:\\n內容語言:\\n內容國家:\\n應用程式語言:\\n服務:\\nGMT 時間:\\n套件:\\n版本:\\n系統版本: - 您的留言(請用英文): + 您的留言(請用英語): 詳細資訊: 影片 音訊 重試 - k + 百萬 - B + 十億 開始 暫停 刪除 @@ -97,7 +96,7 @@ NewPipe 下載中 輕觸以顯示詳細資訊 請稍候… - 已複製至剪貼簿 + 已複製到剪貼簿 稍後請在設定中選擇下載資料夾 使用懸浮視窗模式 \n需要此權限 @@ -112,9 +111,9 @@ 無法更新訂閱 訂閱清單 新鮮事 - 搜尋紀錄 - 在本機儲存搜尋紀錄 - 觀看紀錄 + 搜尋記錄 + 在本機儲存搜尋記錄 + 觀看記錄 記錄觀看過的影片 恢復播放 在干擾結束後繼續播放(例如有來電) @@ -143,18 +142,18 @@ 大部分的特殊字元 關於 NewPipe 第三方授權 - © %1$s 由 %2$s 使用 %3$s 授權條款發佈 + © %1$s 由 %2$s 使用 %3$s 授權條款發布 關於與常見問題 授權條款 Android 上自由且輕巧的串流播放器。 在 GitHub 上檢視 NewPipe 使用的授權條款 - 不管你有什麼點子——翻譯、設計、程式碼整理,或者程式碼撰寫——我們永遠歡迎你來幫忙。完成的越多,NewPipe 也會更好! + 不管你有什麼點子──翻譯、設計、程式碼整理,或者程式碼撰寫──我們永遠歡迎你來幫忙。完成的越多,NewPipe 也會更好! 閱讀授權條款 貢獻 - 歷史紀錄 - 歷史紀錄 - 確定要刪除此項搜尋紀錄嗎? + 歷史記錄 + 歷史記錄 + 確定要刪除此項搜尋記錄嗎? 找不到串流播放器(您可以安裝 VLC 來播放)。 顯示「長按以新增」提示 預設內容國家 @@ -176,7 +175,7 @@ 網站 匯入資料庫 匯出資料庫 - 覆蓋您目前的歷史記錄、訂閱與(可選的)設定 + 覆蓋您目前的歷史記錄、訂閱與設定(選用) 匯出歷史記錄、訂閱內容、播放清單、設定 回饋 如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。 @@ -189,7 +188,7 @@ 選擇互動導覽 已匯出 已匯入 - 無有效的 ZIP 檔案 + 無效的 ZIP 檔案 警告:無法匯入所有檔案。 這將覆蓋您目前的設定。 熱門 @@ -211,7 +210,7 @@ 正在載入要求的內容 下載串流檔案 顯示資訊 - 已加入書籤的播放清單 + 書籤播放列表 新增至 拖曳以重新排序 建立 @@ -241,12 +240,12 @@ 報告週期不足錯誤 強制報告在處理完片段或活動週期外發生的無法傳遞的 Rx 異常 使用粗略但快速的尋找 - 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置。尋找 5、15或25秒無法與其一同使用 - 自動將下一部影片新增至佇列 + 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置。尋找 5、15 或 25 秒無法與其一同使用 + 自動排序下一個串流 透過加入相關的串流來繼續結束的(未重複)播放佇列 檔案 無效的資料夾 - 無效的檔案/內容來源 + 無效的檔案或內容來源 檔案名稱不能留空 發生錯誤: %1$s 匯入 @@ -263,11 +262,11 @@ \n \n1. 移至此網址:%1$s \n2. 當被提示時登入帳號 -\n3. 點擊「包含所有資料」,然後「取消選取全部」,然後僅選取「訂閱」並點擊「確定」 -\n4. 點擊「下一步」然後「建立匯出」 -\n5. 在「下載」按鈕出現後點擊它 +\n3. 按一下「包含所有資料」,接著「取消選取全部」,然後僅勾選「訂閱」並按一下「確定」 +\n4. 按一下「下一步」然後「建立匯出」 +\n5. 在「下載」按鈕出現後按一下它 \n6. 點擊下方的「匯入檔案」並選取已下載的 zip 檔案 -\n7. [若 zip 匯入失敗] 擷取 .csv 檔案(通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),點擊下方的「匯入檔案」並選取擷取的 csv 檔案 +\n7. [若 zip 匯入失敗] 擷取 .csv 檔案(通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),按一下下方的「匯入檔案」並選取擷取的 csv 檔案 yourID, soundcloud.com/yourid 請記住,此操作可造成昂貴網路花費。 \n @@ -278,31 +277,28 @@ \n2. 移至此網址: %1$s \n3. 當被提示時登入帳號 \n4. 複製您被重新導向到的個人設定檔網址。 - 載入縮圖 - 關閉以防止載入縮圖,減少數據和儲存空間的用量。改變時將清除記憶體和磁碟上的縮圖快取 - 已抹除圖片快取 - 抹除已快取的中介資料 + 已清除圖片快取 + 清除已快取的後設資料 移除所有已快取的網頁資料 - 已抹除中介資料快取 + 已清除後設資料快取 播放速度控制 節奏 音高 解除掛鉤(可能導致失真) 偏好的「開啟」動作 - 開啟內容時的預設動作 — %s + 開啟內容時的預設動作 ─ %s 沒有可供下載的串流 字幕 調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效 - 未安裝可播放此檔案的應用程式 清除觀看歷史 刪除播放過的串流與播放位置歷史 刪除所有觀看歷史記錄? 觀看歷史已刪除 清除搜尋歷史 - 刪除搜尋關鍵字的歷史 + 刪除搜尋關鍵字的記錄 刪除所有搜尋歷史記錄? - 搜尋歷史已刪除 - 已刪除 1 個項目。 + 搜尋記錄已刪除 + 已刪除一個項目。 NewPipe 是一個 Copyleft 的自由軟體:您可以隨意使用、研究、分享並改進它。在遵守由自由軟體基金會所發佈的 GNU 通用公共授權條款的狀況下,您可以自由地再散佈及/或修改它;授權條款預設使用第三版,但您也可以選擇更新的版本。 您是否要同時匯入設定? NewPipe 的隱私政策 @@ -316,7 +312,7 @@ 沒有限制 使用行動網路時限制解析度 切換 app 時最小化 - 從主影片播放器切換到其他 app 時要執行的動作 — %s + 從主影片播放器切換到其他 app 時要執行的動作 ─ %s 最小化為背景播放器 最小化為彈出式播放器 @@ -329,10 +325,6 @@ 使用者 取消訂閱 選擇分頁 - 音量手勢控制 - 使用手勢控制播放器音量 - 亮度手勢控制 - 使用手勢控制播放器亮度 更新 已刪除檔案 應用程式更新通知 @@ -398,9 +390,9 @@ 無法覆寫檔案 已有擱置中的下載與此同名 NewPipe 在處理檔案時被關閉 - 裝置上沒有剩餘的空間 + 裝置上沒有剩餘的空間 進度遺失,因為檔案已被刪除 - 您想要清除您的下載歷史紀錄,還是刪除所有已下載的檔案? + 您想要清除您的下載歷史記錄,還是刪除所有已下載的檔案? 限制下載佇列 一次執行一個下載 開始下載 @@ -432,9 +424,9 @@ 選取您最愛的 PeerTube 站臺 在 %s 上找到您喜愛的站臺 新增站臺 - 輸入站臺 URL + 輸入站臺網址 無法驗證站臺 - 僅支援 HTTPS URL + 僅支援 HTTPS 網址 站臺已存在 本機 最近新增 @@ -443,13 +435,13 @@ 正在恢復 無法恢復此下載 選擇一個站臺 - 清除下載歷史紀錄 + 清除下載歷史記錄 刪除已下載的檔案 給予顯示在其他應用程式上層的權限 應用程式語言 系統預設值 解決後請按「完成」 - 完成 + 完成 影片 %d 秒 @@ -481,7 +473,7 @@ Feed Feed 更新閾值 - 上次更新後,訂閱被視為過時的時間 — %s + 上次更新後,訂閱被視為過時的時間 ─ %s 總是更新 在可用時從專用 feed 擷取 其在某些服務中可用,且通常較快速,但可能只會回傳有限的項目,而且資訊通常不完整(例如:沒有持續時間、項目類型、沒有即時狀態) @@ -524,25 +516,25 @@ 尚無播放清單書籤 播放清單頁面 選取播放清單 - 請檢查是否已有與您的應用程式當機相關的討論議題。當建立重複的工單時,您就是在耗費我們本來可以用來修復臭蟲的時間。 + 請檢查是否已有與您的應用程式崩潰相關的討論議題。當建立重複的客服單時,您就是在耗費我們本來可以用來修復錯誤的時間。 在 GitHub 上回報 複製格式化過的報告 目前顯示 %s 的結果 從不 僅在 Wi-Fi 上 - 自動開始播放 — %s + 自動開始播放 ─ %s 播放佇列 - 無法識別 URL。要用其他應用程式開啟嗎? + 無法識別此網址。要用其他應用程式開啟嗎? 自動佇列 - 作用中播放器的佇列可能會被取代 + 啟動中播放器的佇列可能會被取代 從一個播放器切換到另一個可能會取代您的佇列 清除佇列前要求確認 正在緩衝 - 隨機播放 - 循環播放 + 隨機 + 循環 您可以選取最多三個動作來顯示在簡潔通知中! - 透過點擊下方的每一個通知來編輯它。使用右側的勾選框,最多可以選取三個在簡潔通知中顯示 + 透過輕觸下方的通知來編輯它。使用右側的勾選框,最多可以選取三個在簡潔通知中顯示。 第五動作按鈕 第四動作按鈕 第三動作按鈕 @@ -557,7 +549,7 @@ reCAPTCHA cookies 已被清除 清除 reCAPTCHA cookies YouTube 有提供「嚴格篩選模式」,可以隱藏潛在的成人內容 - 顯示可能不適於兒童的內容(因為其有年齡限制,如18歲以上等) + 顯示可能不適於兒童的內容,因為其有年齡限制(如 18 歲以上等) 讓 Android 根據縮圖中的主要色彩來自訂通知的顏色(請注意,此功能不是在所有裝置上都能正常運作) 彩色通知 於鎖定畫面背景與通知使用縮圖 @@ -589,17 +581,16 @@ 解決 下載已經開始 您可以在下方選取您最愛的夜間佈景主題 - 選取您最愛的夜間佈景主題 — %s + 選取您最愛的夜間佈景主題 ─ %s 自動(裝置佈景主題) - 夜間佈景主題 + 深色主題 顯示頻道詳細資訊 - 如果您遇到黑畫面或影片播放停頓的現象,請停用媒體隧道 + 如果您遇到黑畫面或影片播放停頓的現象,請停用媒體隧道。 停用媒體隧道 內部 私人 未列出 公開 - 縮圖 URL 主機 支援 語言 @@ -626,14 +617,13 @@ 關閉 開啟 平板電腦模式 - 顯示已檢視的項目 留言已停用 不要顯示 低品質(較小) 高品質(較大) 拖動列縮圖預覽 被創作者加心號 - 標記為已看過 + 標記為已看 在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體 顯示圖片指示器 遠端搜尋建議 @@ -650,11 +640,11 @@ 已將下一個加入佇列 將下一個加入佇列 正在處理……可能需要一點時間 - 檢查更新 + 檢查更新 手動檢查新版本 正在檢查更新…… 新 feed 項目 - 使播放器當機 + 讓播放器崩潰 顯示「播放器當機」 使用播放器時顯示當機選項 錯誤回報通知 @@ -666,11 +656,10 @@ 找不到適合此動作的檔案管理程式。 \n請安裝檔案管理程式或在下載設定嘗試停用「%s」 NewPipe 遇到錯誤,點擊以回報 - 發生錯誤,請檢視通知 + 發生錯誤,請查看通知 釘選的留言 LeakCanary 無法使用 ExoPlayer 預設值 - 變更載入間隔大小(目前為 %s)。較低的值可能會提昇初始影片載入速度。變更需要重新啟動播放器 播放器通知 通知 正在載入串流詳細資訊…… @@ -680,7 +669,7 @@ 新串流通知 設定目前播放串流通知 需要網路連線 - 從磁碟抹除所有已下載的檔案? + 從磁碟清除所有已下載的檔案? 取得通知 新串流 關於訂閱的新串流通知 @@ -702,9 +691,6 @@ 沒有可用於外部播放程式的視訊串流 選取外部播放程式的畫質 播放載入間隔大小 - 顯示未來項目 - 隱藏未來項目 - 隱藏已觀看的項目 常見問題 在網站上檢視 排序 @@ -713,4 +699,117 @@ 輕點以下載 %s 快速模式 從三點式選單匯入或匯出訂閱 + 此選項僅在主題選擇為 %s 時可用 + 卡片 + 取消設定永久縮圖 + 無法複製到剪貼簿 + 重複新增 %d 次 + 變灰的播放清單已經包含此項目。 + 忽略硬體媒體鍵事件 + 這很有用,舉例來說,若您正在使用物理按鍵壞掉的耳機 + 移除重複的? + 顯示以下串流 + 顯示/隱藏串流 + 完全觀看 + 部份觀看 + 即將到來 + 移除重複的 + 您想要移除所有在此播放清單中重複的串流? + 左側手勢動作 + 右側手勢動作 + 亮度 + 音量 + 為播放器畫面左側選擇手勢 + 為播放器畫面右側選擇手勢 + + 偏好原始音訊 + 音訊:%s + 音訊軌道 + 此串流應已存在音訊軌道 + 為外部播放程式選取音訊軌道 + 未知 + ExoPlayer 設定 + 使用 ExoPlayer 的解碼器汰退功能 + 一律使用 ExoPlayer 的視訊輸出表面設定解決方法 + 原始 + 配音 + 描述性 + 變更漸進式內容的載入間隔大小(目前為 %s)。較低的值可能會加速初始載入速度 + 偏好描述性的音訊 + 若可用,為視障人士選取帶有描述的音訊軌道 + 無論語言都選取原始音訊軌道 + 管理一些 ExoPlayer 設定。這些變更需要重新啟動播放程式才會生效 + 若您有解碼器初始化的問題,請啟用此選項,若主要的解碼器初始化失敗,其將會汰退至較低優先度的解碼器。這可能會導致播放效能比使用主要解碼器時差 + 此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器,而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定,此設定僅對 Android 6 或更新版本有效。 +\n +\n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤 + 將主分頁選擇器移動至底部 + 主分頁位置 + %1$s %2$s + 因為您的裝置型號已知不支援媒體隧道,因此已預設停用。 + 無串流 + 無直播串流 + 影片 + 訂閱者 + 頻道頁面上顯示哪些分頁 + 頻道分頁 + 短片 + 正在載入後設資料…… + 擷取頻道分頁 + 關於 + 專輯 + 更新 feed 時要擷取的分頁。若使用快速模式更新頻道,則此選項無效。 + 播放清單 + 軌道 + 頻道 + 直播 + 切換螢幕方向 + 切換全螢幕 + 下一個串流 + 開啟播放佇列 + 快轉 + 倒帶 + 重播 + 播放 + 更多選項 + 持續時間 + 上一個串流 + 畫質 + 不要載入圖片 + 影片縮圖 + + 低品質 + 大頭照 + 子頻道大頭照 + 高品質 + 中等品質 + 上傳者大頭照 + 橫幅 + 選擇影像品質以及是否載入影像,以減少資料與記憶體使用。變更會清除記憶體中與磁碟上的影像快取 — %s + 分享網址清單 + 分享標題 + %1$s +\n%2$s + 分享播放清單 + 分享包含播放清單名稱與影片標題等詳細資訊的播放清單,或是僅作為簡單的影片網址清單 + - %1$s:%2$s + + %s 個回覆 + + 顯示更多 + 顯示較少 + 透過點擊下面的每個通知操作來編輯它。前三個動作(播放/暫停、上一個與下一個)由系統設定,無法自訂。 + 裝置上沒有足夠的空間 + 備份與還原 + 重設設定 + 將所有設定重設為預設值 + 重設所有設定將會放棄您的所有偏好設定並重新啟動應用程式。 +\n +\n您確定您想要繼續嗎? + + + NewPipe 可以隨時自動檢查新版本,並在新版本可用時通知您。 +\n您想要啟用此功能嗎? + 匯入的匯出中的設定使用自 NewPipe 0.27.0 起已廢棄的脆弱格式。請確定匯入的匯出是來自可信賴的來源,並在未來只使用從 NewPipe 0.27.0 或更新版本取得的匯出。對於匯入此脆弱格式設定的支援即將完全移除,屆時舊版本的 NewPipe 將無法再匯入新版本匯出的設定。 + 次要 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9f7e50c199d..0e5fd126f5b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,5 +1,12 @@ + + 16dp + 8dp + 12dp + 4dp + 2dp + 120dp 16dp @@ -30,7 +37,8 @@ 164dp 92dp - 42dp + 100dp + 92dp 128dp 96dp @@ -67,7 +75,6 @@ 14sp 13sp 13sp - 12sp 12sp 32dp @@ -124,9 +131,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 09bf9080c7f..528542ce7d8 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -1,7 +1,7 @@ - https://f-droid.org/packages/org.videolan.vlc/ RSS + org.videolan.vlc org.xbmc.kore https://joinpeertube.org/instances#instances-list newpipe @@ -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 17ed547a095..fb68a464d5a 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 @@ -25,6 +23,7 @@ screen_brightness_key screen_brightness_timestamp_key clear_queue_confirmation_key + ignore_hardware_media_buttons_key popup_saved_width popup_saved_x @@ -125,6 +124,16 @@ 480p best_resolution + + 2160p + 1440p + + + + 2160p + 1440p + + @string/best_resolution_key 1080p60 @@ -191,15 +200,47 @@ @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 + reset_settings + debug_pref_screen_key allow_heap_dumping_key show_memory_leaks_key allow_disposed_exceptions_key show_original_time_ago_key - disable_media_tunneling_key show_image_indicators_key show_crash_the_player_key check_new_streams @@ -241,7 +282,39 @@ caption_settings_key caption_user_set_key + + main_tabs_position + + channel_tabs + show_channel_tabs_videos + show_channel_tabs_tracks + show_channel_tabs_shorts + show_channel_tabs_livestreams + show_channel_tabs_channels + show_channel_tabs_playlists + show_channel_tabs_albums + show_channel_tabs_about + + @string/show_channel_tabs_videos + @string/show_channel_tabs_tracks + @string/show_channel_tabs_shorts + @string/show_channel_tabs_livestreams + @string/show_channel_tabs_channels + @string/show_channel_tabs_playlists + @string/show_channel_tabs_albums + @string/show_channel_tabs_about + + + @string/channel_tab_videos + @string/channel_tab_tracks + @string/channel_tab_shorts + @string/channel_tab_livestreams + @string/channel_tab_channels + @string/channel_tab_playlists + @string/channel_tab_albums + @string/channel_tab_about + show_search_suggestions show_local_search_suggestions show_remote_search_suggestions @@ -283,7 +356,8 @@ feed_update_threshold_key 300 - feed_show_played_items + feed_show_played_items + feed_show_partially_watched_items feed_show_future_items show_thumbnail_key @@ -310,14 +384,30 @@ feed_use_dedicated_fetch_method + feed_fetch_channel_tabs + fetch_channel_tabs_videos + fetch_channel_tabs_tracks + fetch_channel_tabs_shorts + fetch_channel_tabs_livestreams + + @string/fetch_channel_tabs_videos + @string/fetch_channel_tabs_tracks + @string/fetch_channel_tabs_shorts + @string/fetch_channel_tabs_livestreams + + + @string/channel_tab_videos + @string/channel_tab_tracks + @string/channel_tab_shorts + @string/channel_tab_livestreams + + import_export_data_path import_data export_data clear_cookie - download_thumbnail_key - cache_wipe_key clear_play_history clear_playback_states @@ -404,6 +494,7 @@ + update_check_consent_key update_app_key manual_update_key update_pref_screen_key @@ -440,9 +531,11 @@ lt hu nl + nqo no nn uz + or pl pt-PT pt @@ -489,12 +582,13 @@ zh-TW zh-HK ja + ryu ko @string/systems_language Afrikaans - Azərbaycan + Azərbaycanca Bahasa Indonesia Bahasa Malaysia Català @@ -519,9 +613,11 @@ Lietuvių Magyar Nederlands + ߒߞߏ Norsk Nynorsk O‘zbek + ଓଡ଼ିଆ Polski Português Português (Brasil) @@ -568,6 +664,7 @@ 中文 (繁體) 中文 (香港) 日本語 + うちなーぐち 한국어 @@ -1128,7 +1225,9 @@ ne nl nl-be + nqo oc + or pa pl pt @@ -1136,6 +1235,7 @@ pt-pt ro ru + ryu sat sc sk @@ -1162,7 +1262,7 @@ Basa Acèh العربية العربية (ليبيا) - Azərbaycan dili + Azərbaycanca Asturianu Беларуская ⵜⴰⵎⴰⵣⵉⵖⵜ @@ -1210,14 +1310,17 @@ Nनेपाली Nederlands (NL) Nederlands (BE) + ߒߞߏ Occitan + ଓଡ଼ିଆ ਪੰਜਾਬੀ Polski Português Português (BR) Português (PT) Română - русский язык + Pусский + うちなーぐち ᱥᱟᱱᱛᱟᱲᱤ sardu Slovenčina @@ -1256,6 +1359,11 @@ 144p + + 2160p + 1440p + + list_view_mode @string/list_view_mode_auto_key @@ -1263,16 +1371,19 @@ auto list grid + card @string/list_view_mode_auto_key @string/list_view_mode_list_key @string/list_view_mode_grid_key + @string/list_view_mode_card_key @string/auto @string/list @string/grid + @string/card tablet_mode @@ -1330,4 +1441,32 @@ 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 + + + image_quality_key + image_quality_none + image_quality_low + image_quality_medium + image_quality_high + @string/image_quality_medium_key + + @string/image_quality_none + @string/image_quality_low + @string/image_quality_medium + @string/image_quality_high + + + @string/image_quality_none_key + @string/image_quality_low_key + @string/image_quality_medium_key + @string/image_quality_high_key + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c9e0bb49290..766491d538a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,8 @@ Install Cancel OK + Yes + No Open in browser Mark as watched Open in popup mode @@ -46,7 +48,7 @@ Show higher resolutions Only some devices can play 2K/4K videos Play with Kodi - Install missing Kore app? + Install missing Kore app\? Show \"Play with Kodi\" option Display an option to play a video via Kodi media center Crash the player @@ -57,7 +59,8 @@ Third action button Fourth action button Fifth action button - Edit each notification action below by tapping on it. Select up to three of them to be shown in the compact notification by using the checkboxes on the right + Edit each notification action below by tapping on it. Select up to three of them to be shown in the compact notification by using the checkboxes on the right. + Edit each notification action below by tapping on it. The first three actions (play/pause, previous and next) are set by the system and cannot be customized. You can select at most three actions to show in the compact notification! Repeat Shuffle @@ -69,7 +72,7 @@ Default audio format Default video format Theme - Night Theme + Night theme Light Dark Black @@ -79,12 +82,12 @@ 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 - Load thumbnails - Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disk image cache + Ignore hardware media button events + Useful, for instance, if you are using a headset with broken physical buttons Show comments Turn off to hide comments Show \'Next\' and \'Similar\' videos @@ -92,6 +95,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 @@ -99,10 +106,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 @@ -145,6 +155,7 @@ Updates Player notification Configure current playing stream notification + Backup and restore Playing in background Playing in popup mode Content @@ -158,6 +169,7 @@ Live Downloads Downloads + Loading Metadata… Error report All Channels @@ -213,13 +225,14 @@ Delete entire search history? Search history deleted Fast mode + Move main tab selector to the bottom + Main tabs position Error External storage unavailable Downloading to external SD card not possible. Reset download folder location? Network error Could not load all thumbnails - Could not deobfuscate video URL signature Could not parse website Content unavailable Could not set up download menu @@ -245,7 +258,7 @@ NewPipe encountered an error, tap to report An error occurred, see the notification Sorry, that should not have happened. - Report this error via e-mail + Report via e-mail Copy formatted report Report on GitHub Please check whether an issue discussing your crash already exists. When creating duplicate tickets, you take time from us which we could spend with fixing the actual bug. @@ -306,6 +319,8 @@ No comments Comments are disabled + No streams + No live streams %s new stream %s new streams @@ -327,6 +342,7 @@ Calculating hash Please wait… Copied to clipboard + Failed to copy to clipboard Please define a download folder later in settings No download folder set yet, choose the default download folder now This permission is needed to\nopen in popup mode @@ -336,7 +352,7 @@ Press \"Done\" when solved reCAPTCHA challenge requested Solve - Done + Done Download Allowed characters in filenames @@ -344,7 +360,6 @@ Replacement character Letters and digits Most special characters - No app installed to play this file About NewPipe Third-party Licenses @@ -409,6 +424,8 @@ Remove Details Audio Settings + Audio: %s + Audio track Hold to enqueue Show channel details Enqueue @@ -432,6 +449,7 @@ "Loading requested content" New Playlist + The playlists that are grayed out already contain this item. Rename Name Add to playlist @@ -445,6 +463,7 @@ Delete this playlist\? Playlist created Playlisted + Duplicate added %d time(s) Playlist thumbnail changed. Auto-generated (no uploader found) @@ -465,7 +484,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\" @@ -525,6 +545,10 @@ 240p 144p + + 2160p + 1440p + New streams notifications Notify about new streams from subscriptions @@ -534,8 +558,11 @@ Updates Show a notification to prompt app update when a new version is available - Check for updates + Check for updates + NewPipe can automatically check for new versions from time to time and notify you once they are available.\nDo you want to enable this? + @string/check_for_updates Manually check for new versions + Minimize on app switch Action when switching to other app from main video player — %s @@ -549,6 +576,7 @@ List view mode List Grid + Card Auto Seekbar thumbnail preview @@ -574,6 +602,10 @@ Download finished %s downloads finished + Reset settings + Reset all settings to their default values + + Resetting all settings will discard all of your preferred settings and restarts the app.\n\nAre you sure you want to proceed? Generate unique name Overwrite @@ -594,7 +626,8 @@ Not found Post-processing failed NewPipe was closed while working on the file - No space left on device + Not enough free space on device + No space left on device Progress lost, because the file was deleted Connection timeout Cannot recover this download @@ -627,6 +660,9 @@ System default Remove watched Remove watched videos? + Remove duplicates + Remove duplicates? + Do you want to remove all duplicate streams in this playlist? Videos that have been watched before and after being added to the playlist will be removed. \nAre you sure\? This cannot be undone! Yes, and partially watched videos @@ -689,8 +725,10 @@ \nYouTube is an example of a service that offers this fast method with its RSS feed. \n \nSo the choice boils down to what you prefer: speed or precise information. - Show watched items - Hide watched items + Show the following streams + Show/Hide streams + Fetch channel tabs + Tabs to fetch when updating the feed. This option has no effect if a channel is updated using fast mode. This content is not yet supported by NewPipe.\n\nIt will hopefully be supported in a future version. Channel\'s avatar thumbnail Created by %s @@ -730,11 +768,16 @@ Language Support Host - Thumbnail URL + Thumbnails + Uploader avatars + Sub-channel avatars + Avatars + Banners Public Unlisted Private Internal + Subscribers Pinned comment Hearted by creator Open website @@ -750,13 +793,69 @@ , 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 - \ No newline at end of file + 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 + %1$s %2$s + original + dubbed + descriptive + secondary + Videos + Tracks + Shorts + Live + Channels + Playlists + Albums + About + Channel tabs + What tabs are shown on the channel pages + Open play queue + Toggle fullscreen + Toggle screen orientation + Previous stream + Next stream + Play + Replay + More options + Duration + Rewind + Forward + Image quality + Choose the quality of images and whether to load images at all, to reduce data and memory usage. Changes clear both in-memory and on-disk image cache — %s + Do not load images + Low quality + Medium quality + High quality + \? + Share Playlist + Share playlist with details such as playlist name and video titles or as a simple list of video URLs + Share with Titles + Share URL list + - %1$s: %2$s + %1$s\n%2$s + + %s reply + %s replies + + Show more + Show less + The settings in the export being imported use a vulnerable format that was deprecated since NewPipe 0.27.0. Make sure the export being imported is from a trusted source, and prefer using only exports obtained from NewPipe 0.27.0 or newer in the future. Support for importing settings in this vulnerable format will soon be removed completely, and then old versions of NewPipe will not be able to import settings of exports from new versions anymore. + diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml index d726e26b735..d8f6bf5528f 100644 --- a/app/src/main/res/xml/appearance_settings.xml +++ b/app/src/main/res/xml/appearance_settings.xml @@ -23,14 +23,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + diff --git a/app/src/main/res/xml/backup_restore_settings.xml b/app/src/main/res/xml/backup_restore_settings.xml new file mode 100644 index 00000000000..ef6a3cde3a6 --- /dev/null +++ b/app/src/main/res/xml/backup_restore_settings.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index fddb966c847..2cdc6c545c9 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -41,6 +41,16 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + - @@ -114,20 +126,6 @@ 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/history_settings.xml b/app/src/main/res/xml/history_settings.xml index b6126b10a73..46111635c20 100644 --- a/app/src/main/res/xml/history_settings.xml +++ b/app/src/main/res/xml/history_settings.xml @@ -23,6 +23,7 @@ + + + + - - - - diff --git a/app/src/main/res/xml/update_settings.xml b/app/src/main/res/xml/update_settings.xml index a44555edfe1..becd5c5c923 100644 --- a/app/src/main/res/xml/update_settings.xml +++ b/app/src/main/res/xml/update_settings.xml @@ -4,7 +4,7 @@ android:title="@string/settings_category_updates_title"> - + + + + @@ -174,19 +188,23 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - @@ -224,5 +242,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + diff --git a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java new file mode 100644 index 00000000000..847c54aa849 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java @@ -0,0 +1,106 @@ +package org.schabi.newpipe.database.playlist; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; +import org.schabi.newpipe.local.bookmark.MergedPlaylistManager; + +import java.util.ArrayList; +import java.util.List; + +public class PlaylistLocalItemTest { + @Test + public void emptyPlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + final List mergedPlaylists = + MergedPlaylistManager.merge(localPlaylists, remotePlaylists); + + assertEquals(0, mergedPlaylists.size()); + } + + @Test + public void onlyLocalPlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", false, -1, 0, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", false, -1, 1, 1)); + localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", false, -1, 3, 1)); + final List mergedPlaylists = + MergedPlaylistManager.merge(localPlaylists, remotePlaylists); + + assertEquals(3, mergedPlaylists.size()); + assertEquals(0, mergedPlaylists.get(0).getDisplayIndex()); + assertEquals(1, mergedPlaylists.get(1).getDisplayIndex()); + assertEquals(3, mergedPlaylists.get(2).getDisplayIndex()); + } + + @Test + public void onlyRemotePlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name1", "url1", "", "", 1, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name2", "url2", "", "", 2, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 3, "name3", "url3", "", "", 4, 1L)); + final List mergedPlaylists = + MergedPlaylistManager.merge(localPlaylists, remotePlaylists); + + assertEquals(3, mergedPlaylists.size()); + assertEquals(1, mergedPlaylists.get(0).getDisplayIndex()); + assertEquals(2, mergedPlaylists.get(1).getDisplayIndex()); + assertEquals(4, mergedPlaylists.get(2).getDisplayIndex()); + } + + @Test + public void sameIndexWithDifferentName() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", false, -1, 0, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", false, -1, 1, 1)); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name3", "url1", "", "", 0, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name4", "url2", "", "", 1, 1L)); + final List mergedPlaylists = + MergedPlaylistManager.merge(localPlaylists, remotePlaylists); + + assertEquals(4, mergedPlaylists.size()); + assertTrue(mergedPlaylists.get(0) instanceof PlaylistMetadataEntry); + assertEquals("name1", ((PlaylistMetadataEntry) mergedPlaylists.get(0)).name); + assertTrue(mergedPlaylists.get(1) instanceof PlaylistRemoteEntity); + assertEquals("name3", ((PlaylistRemoteEntity) mergedPlaylists.get(1)).getName()); + assertTrue(mergedPlaylists.get(2) instanceof PlaylistMetadataEntry); + assertEquals("name2", ((PlaylistMetadataEntry) mergedPlaylists.get(2)).name); + assertTrue(mergedPlaylists.get(3) instanceof PlaylistRemoteEntity); + assertEquals("name4", ((PlaylistRemoteEntity) mergedPlaylists.get(3)).getName()); + } + + @Test + public void sameNameWithDifferentIndex() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", false, -1, 1, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", false, -1, 3, 1)); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name1", "url1", "", "", 0, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name2", "url2", "", "", 2, 1L)); + final List mergedPlaylists = + MergedPlaylistManager.merge(localPlaylists, remotePlaylists); + + assertEquals(4, mergedPlaylists.size()); + assertTrue(mergedPlaylists.get(0) instanceof PlaylistRemoteEntity); + assertEquals("name1", ((PlaylistRemoteEntity) mergedPlaylists.get(0)).getName()); + assertTrue(mergedPlaylists.get(1) instanceof PlaylistMetadataEntry); + assertEquals("name1", ((PlaylistMetadataEntry) mergedPlaylists.get(1)).name); + assertTrue(mergedPlaylists.get(2) instanceof PlaylistRemoteEntity); + assertEquals("name2", ((PlaylistRemoteEntity) mergedPlaylists.get(2)).getName()); + assertTrue(mergedPlaylists.get(3) instanceof PlaylistMetadataEntry); + assertEquals("name2", ((PlaylistMetadataEntry) mergedPlaylists.get(3)).name); + } +} diff --git a/app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java b/app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java deleted file mode 100644 index f77c7b2681c..00000000000 --- a/app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.schabi.newpipe.error; - -import android.app.Activity; - -import org.junit.Test; -import org.schabi.newpipe.MainActivity; -import org.schabi.newpipe.RouterActivity; -import org.schabi.newpipe.fragments.detail.VideoDetailFragment; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -/** - * Unit tests for {@link ErrorActivity}. - */ -public class ErrorActivityTest { - @Test - public void getReturnActivity() { - Class returnActivity; - returnActivity = ErrorActivity.getReturnActivity(MainActivity.class); - assertEquals(MainActivity.class, returnActivity); - - returnActivity = ErrorActivity.getReturnActivity(RouterActivity.class); - assertEquals(RouterActivity.class, returnActivity); - - returnActivity = ErrorActivity.getReturnActivity(null); - assertNull(returnActivity); - - returnActivity = ErrorActivity.getReturnActivity(Integer.class); - assertEquals(MainActivity.class, returnActivity); - - returnActivity = ErrorActivity.getReturnActivity(VideoDetailFragment.class); - assertEquals(MainActivity.class, returnActivity); - } -} diff --git a/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt b/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt index 1479c3d1eee..2fc44d9b7ab 100644 --- a/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt +++ b/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt @@ -9,7 +9,7 @@ class FeedGroupIconTest { fun `No gaps and repeated ids`() { val usedIds = HashSet() - for ((shouldBeId, currentIcon) in FeedGroupIcon.values().withIndex()) { + for ((shouldBeId, currentIcon) in FeedGroupIcon.entries.withIndex()) { val added = usedIds.add(currentIcon.id) assertTrue("Repeated ids (current item: ${currentIcon.name} - ${currentIcon.id})", added) @@ -24,7 +24,7 @@ class FeedGroupIconTest { fun `No icons pointing to the same attr`() { val usedIcons = HashSet() - for (groupIcon in FeedGroupIcon.values()) { + for (groupIcon in FeedGroupIcon.entries) { val added = usedIcons.add(groupIcon.drawableResource) assertTrue("Repeated icon (current item: ${groupIcon.name} - ${groupIcon.id})", added) } diff --git a/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java b/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java index a130359a338..022089f37ed 100644 --- a/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java +++ b/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java @@ -13,7 +13,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -169,7 +168,8 @@ public void sameStreams() { final List streams = Collections.nCopies(5, item1); final PlayQueue queue1 = makePlayQueue(0, streams); final PlayQueue queue2 = makePlayQueue(0, streams); - assertEquals(queue1, queue2); + assertTrue(queue1.equalStreams(queue2)); + assertTrue(queue1.equalStreamsAndIndex(queue2)); } @Test @@ -177,7 +177,8 @@ public void sameStreamsDifferentIndex() { final List streams = Collections.nCopies(5, item1); final PlayQueue queue1 = makePlayQueue(1, streams); final PlayQueue queue2 = makePlayQueue(4, streams); - assertEquals(queue1, queue2); + assertTrue(queue1.equalStreams(queue2)); + assertFalse(queue1.equalStreamsAndIndex(queue2)); } @Test @@ -186,7 +187,7 @@ public void sameSizeDifferentItems() { final List streams2 = Collections.nCopies(5, item2); final PlayQueue queue1 = makePlayQueue(0, streams1); final PlayQueue queue2 = makePlayQueue(0, streams2); - assertNotEquals(queue1, queue2); + assertFalse(queue1.equalStreams(queue2)); } @Test @@ -195,7 +196,7 @@ public void differentSizeStreams() { final List streams2 = Collections.nCopies(6, item2); final PlayQueue queue1 = makePlayQueue(0, streams1); final PlayQueue queue2 = makePlayQueue(0, streams2); - assertNotEquals(queue1, queue2); + assertFalse(queue1.equalStreams(queue2)); } } } diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt new file mode 100644 index 00000000000..862ac3b80ab --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -0,0 +1,184 @@ +package org.schabi.newpipe.settings + +import android.content.SharedPreferences +import org.junit.Assert +import org.junit.Test +import org.mockito.Mockito +import org.schabi.newpipe.settings.export.BackupFileLocator +import org.schabi.newpipe.settings.export.ImportExportManager +import org.schabi.newpipe.streams.io.StoredFileHelper +import us.shandian.giga.io.FileStream +import java.io.File +import java.io.IOException +import java.nio.file.Files + +class ImportAllCombinationsTest { + + companion object { + private val classloader = ImportExportManager::class.java.classLoader!! + } + + private enum class Ser(val id: String) { + YES("ser"), + VULNERABLE("vulnser"), + NO("noser"); + } + + private data class FailData( + val containsDb: Boolean, + val containsSer: Ser, + val containsJson: Boolean, + val filename: String, + val throwable: Throwable, + ) + + private fun testZipCombination( + containsDb: Boolean, + containsSer: Ser, + containsJson: Boolean, + filename: String, + runTest: (test: () -> Unit) -> Unit, + ) { + val zipFile = File(classloader.getResource(filename)?.file!!) + val zip = Mockito.mock(StoredFileHelper::class.java, Mockito.withSettings().stubOnly()) + Mockito.`when`(zip.stream).then { FileStream(zipFile) } + + val fileLocator = Mockito.mock( + BackupFileLocator::class.java, + Mockito.withSettings().stubOnly() + ) + val db = File.createTempFile("newpipe_", "") + val dbJournal = File.createTempFile("newpipe_", "") + val dbWal = File.createTempFile("newpipe_", "") + val dbShm = File.createTempFile("newpipe_", "") + Mockito.`when`(fileLocator.db).thenReturn(db) + Mockito.`when`(fileLocator.dbJournal).thenReturn(dbJournal) + Mockito.`when`(fileLocator.dbShm).thenReturn(dbShm) + Mockito.`when`(fileLocator.dbWal).thenReturn(dbWal) + + if (containsDb) { + runTest { + Assert.assertTrue(ImportExportManager(fileLocator).extractDb(zip)) + Assert.assertFalse(dbJournal.exists()) + Assert.assertFalse(dbWal.exists()) + Assert.assertFalse(dbShm.exists()) + Assert.assertTrue("database file size is zero", Files.size(db.toPath()) > 0) + } + } else { + runTest { + Assert.assertFalse(ImportExportManager(fileLocator).extractDb(zip)) + Assert.assertTrue(dbJournal.exists()) + Assert.assertTrue(dbWal.exists()) + Assert.assertTrue(dbShm.exists()) + Assert.assertEquals(0, Files.size(db.toPath())) + } + } + + val preferences = Mockito.mock(SharedPreferences::class.java, Mockito.withSettings().stubOnly()) + var editor = Mockito.mock(SharedPreferences.Editor::class.java) + Mockito.`when`(preferences.edit()).thenReturn(editor) + Mockito.`when`(editor.commit()).thenReturn(true) + + when (containsSer) { + Ser.YES -> runTest { + Assert.assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) + ImportExportManager(fileLocator).loadSerializedPrefs(zip, preferences) + + Mockito.verify(editor, Mockito.times(1)).clear() + Mockito.verify(editor, Mockito.times(1)).commit() + Mockito.verify(editor, Mockito.atLeastOnce()) + .putBoolean(Mockito.anyString(), Mockito.anyBoolean()) + Mockito.verify(editor, Mockito.atLeastOnce()) + .putString(Mockito.anyString(), Mockito.anyString()) + Mockito.verify(editor, Mockito.atLeastOnce()) + .putInt(Mockito.anyString(), Mockito.anyInt()) + } + Ser.VULNERABLE -> runTest { + Assert.assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) + Assert.assertThrows(ClassNotFoundException::class.java) { + ImportExportManager(fileLocator).loadSerializedPrefs(zip, preferences) + } + + Mockito.verify(editor, Mockito.never()).clear() + Mockito.verify(editor, Mockito.never()).commit() + } + Ser.NO -> runTest { + Assert.assertFalse(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) + Assert.assertThrows(IOException::class.java) { + ImportExportManager(fileLocator).loadSerializedPrefs(zip, preferences) + } + + Mockito.verify(editor, Mockito.never()).clear() + Mockito.verify(editor, Mockito.never()).commit() + } + } + + // recreate editor mock so verify() behaves correctly + editor = Mockito.mock(SharedPreferences.Editor::class.java) + Mockito.`when`(preferences.edit()).thenReturn(editor) + Mockito.`when`(editor.commit()).thenReturn(true) + + if (containsJson) { + runTest { + Assert.assertTrue(ImportExportManager(fileLocator).exportHasJsonPrefs(zip)) + ImportExportManager(fileLocator).loadJsonPrefs(zip, preferences) + + Mockito.verify(editor, Mockito.times(1)).clear() + Mockito.verify(editor, Mockito.times(1)).commit() + Mockito.verify(editor, Mockito.atLeastOnce()) + .putBoolean(Mockito.anyString(), Mockito.anyBoolean()) + Mockito.verify(editor, Mockito.atLeastOnce()) + .putString(Mockito.anyString(), Mockito.anyString()) + Mockito.verify(editor, Mockito.atLeastOnce()) + .putInt(Mockito.anyString(), Mockito.anyInt()) + } + } else { + runTest { + Assert.assertFalse(ImportExportManager(fileLocator).exportHasJsonPrefs(zip)) + Assert.assertThrows(IOException::class.java) { + ImportExportManager(fileLocator).loadJsonPrefs(zip, preferences) + } + + Mockito.verify(editor, Mockito.never()).clear() + Mockito.verify(editor, Mockito.never()).commit() + } + } + } + + @Test + fun `Importing all possible combinations of zip files`() { + val failedAssertions = mutableListOf() + for (containsDb in listOf(true, false)) { + for (containsSer in Ser.entries) { + for (containsJson in listOf(true, false)) { + val filename = "settings/${if (containsDb) "db" else "nodb"}_${ + containsSer.id}_${if (containsJson) "json" else "nojson"}.zip" + testZipCombination(containsDb, containsSer, containsJson, filename) { test -> + try { + test() + } catch (e: Throwable) { + failedAssertions.add( + FailData( + containsDb, containsSer, containsJson, + filename, e + ) + ) + } + } + } + } + } + + if (failedAssertions.isNotEmpty()) { + for (a in failedAssertions) { + println( + "Assertion failed with containsDb=${a.containsDb}, containsSer=${ + a.containsSer}, containsJson=${a.containsJson}, filename=${a.filename}:" + ) + a.throwable.printStackTrace() + println() + } + Assert.fail("${failedAssertions.size} assertions failed") + } + } +} diff --git a/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt similarity index 65% rename from app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt rename to app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt index ec41a77f877..5b802356157 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt @@ -1,8 +1,10 @@ package org.schabi.newpipe.settings import android.content.SharedPreferences +import com.grack.nanojson.JsonParser import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse +import org.junit.Assert.assertThrows import org.junit.Assert.assertTrue import org.junit.Assume import org.junit.Before @@ -17,6 +19,8 @@ import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.Mockito.withSettings import org.mockito.junit.MockitoJUnitRunner +import org.schabi.newpipe.settings.export.BackupFileLocator +import org.schabi.newpipe.settings.export.ImportExportManager import org.schabi.newpipe.streams.io.StoredFileHelper import us.shandian.giga.io.FileStream import java.io.File @@ -25,27 +29,25 @@ import java.nio.file.Files import java.util.zip.ZipFile @RunWith(MockitoJUnitRunner::class) -class ContentSettingsManagerTest { +class ImportExportManagerTest { companion object { - private val classloader = ContentSettingsManager::class.java.classLoader!! + private val classloader = ImportExportManager::class.java.classLoader!! } - private lateinit var fileLocator: NewPipeFileLocator + private lateinit var fileLocator: BackupFileLocator private lateinit var storedFileHelper: StoredFileHelper @Before fun setupFileLocator() { - fileLocator = Mockito.mock(NewPipeFileLocator::class.java, withSettings().stubOnly()) + fileLocator = Mockito.mock(BackupFileLocator::class.java, withSettings().stubOnly()) storedFileHelper = Mockito.mock(StoredFileHelper::class.java, withSettings().stubOnly()) } @Test fun `The settings must be exported successfully in the correct format`() { val db = File(classloader.getResource("settings/newpipe.db")!!.file) - val newpipeSettings = File.createTempFile("newpipe_", "") `when`(fileLocator.db).thenReturn(db) - `when`(fileLocator.settings).thenReturn(newpipeSettings) val expectedPreferences = mapOf("such pref" to "much wow") val sharedPreferences = @@ -53,12 +55,12 @@ class ContentSettingsManagerTest { `when`(sharedPreferences.all).thenReturn(expectedPreferences) val output = File.createTempFile("newpipe_", "") - `when`(storedFileHelper.stream).thenReturn(FileStream(output)) - ContentSettingsManager(fileLocator).exportDatabase(sharedPreferences, storedFileHelper) + `when`(storedFileHelper.openAndTruncateStream()).thenReturn(FileStream(output)) + ImportExportManager(fileLocator).exportDatabase(sharedPreferences, storedFileHelper) val zipFile = ZipFile(output) val entries = zipFile.entries().toList() - assertEquals(2, entries.size) + assertEquals(3, entries.size) zipFile.getInputStream(entries.first { it.name == "newpipe.db" }).use { actual -> db.inputStream().use { expected -> @@ -70,26 +72,11 @@ class ContentSettingsManagerTest { val actualPreferences = ObjectInputStream(actual).readObject() assertEquals(expectedPreferences, actualPreferences) } - } - - @Test - fun `Settings file must be deleted`() { - val settings = File.createTempFile("newpipe_", "") - `when`(fileLocator.settings).thenReturn(settings) - - ContentSettingsManager(fileLocator).deleteSettingsFile() - - assertFalse(settings.exists()) - } - @Test - fun `Deleting settings file must do nothing if none exist`() { - val settings = File("non_existent") - `when`(fileLocator.settings).thenReturn(settings) - - ContentSettingsManager(fileLocator).deleteSettingsFile() - - assertFalse(settings.exists()) + zipFile.getInputStream(entries.first { it.name == "preferences.json" }).use { actual -> + val actualPreferences = JsonParser.`object`().from(actual) + assertEquals(expectedPreferences, actualPreferences) + } } @Test @@ -98,7 +85,7 @@ class ContentSettingsManagerTest { Assume.assumeTrue(dir.delete()) `when`(fileLocator.dbDir).thenReturn(dir) - ContentSettingsManager(fileLocator).ensureDbDirectoryExists() + ImportExportManager(fileLocator).ensureDbDirectoryExists() assertTrue(dir.exists()) } @@ -107,7 +94,7 @@ class ContentSettingsManagerTest { val dir = Files.createTempDirectory("newpipe_").toFile() `when`(fileLocator.dbDir).thenReturn(dir) - ContentSettingsManager(fileLocator).ensureDbDirectoryExists() + ImportExportManager(fileLocator).ensureDbDirectoryExists() assertTrue(dir.exists()) } @@ -122,9 +109,9 @@ class ContentSettingsManagerTest { `when`(fileLocator.dbShm).thenReturn(dbShm) `when`(fileLocator.dbWal).thenReturn(dbWal) - val zip = File(classloader.getResource("settings/newpipe.zip")?.file!!) + val zip = File(classloader.getResource("settings/db_ser_json.zip")?.file!!) `when`(storedFileHelper.stream).thenReturn(FileStream(zip)) - val success = ContentSettingsManager(fileLocator).extractDb(storedFileHelper) + val success = ImportExportManager(fileLocator).extractDb(storedFileHelper) assertTrue(success) assertFalse(dbJournal.exists()) @@ -141,9 +128,9 @@ class ContentSettingsManagerTest { val dbShm = File.createTempFile("newpipe_", "") `when`(fileLocator.db).thenReturn(db) - val emptyZip = File(classloader.getResource("settings/empty.zip")?.file!!) + val emptyZip = File(classloader.getResource("settings/nodb_noser_nojson.zip")?.file!!) `when`(storedFileHelper.stream).thenReturn(FileStream(emptyZip)) - val success = ContentSettingsManager(fileLocator).extractDb(storedFileHelper) + val success = ImportExportManager(fileLocator).extractDb(storedFileHelper) assertFalse(success) assertTrue(dbJournal.exists()) @@ -154,41 +141,44 @@ class ContentSettingsManagerTest { @Test fun `Contains setting must return true if a settings file exists in the zip`() { - val settings = File.createTempFile("newpipe_", "") - `when`(fileLocator.settings).thenReturn(settings) - - val zip = File(classloader.getResource("settings/newpipe.zip")?.file!!) + val zip = File(classloader.getResource("settings/db_ser_json.zip")?.file!!) `when`(storedFileHelper.stream).thenReturn(FileStream(zip)) - val contains = ContentSettingsManager(fileLocator).extractSettings(storedFileHelper) - - assertTrue(contains) + assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(storedFileHelper)) } @Test - fun `Contains setting must return false if a no settings file exists in the zip`() { - val settings = File.createTempFile("newpipe_", "") - `when`(fileLocator.settings).thenReturn(settings) - - val emptyZip = File(classloader.getResource("settings/empty.zip")?.file!!) + fun `Contains setting must return false if no settings file exists in the zip`() { + val emptyZip = File(classloader.getResource("settings/nodb_noser_nojson.zip")?.file!!) `when`(storedFileHelper.stream).thenReturn(FileStream(emptyZip)) - val contains = ContentSettingsManager(fileLocator).extractSettings(storedFileHelper) - - assertFalse(contains) + assertFalse(ImportExportManager(fileLocator).exportHasSerializedPrefs(storedFileHelper)) } @Test fun `Preferences must be set from the settings file`() { - val settings = File(classloader.getResource("settings/newpipe.settings")!!.path) - `when`(fileLocator.settings).thenReturn(settings) + val zip = File(classloader.getResource("settings/db_ser_json.zip")?.file!!) + `when`(storedFileHelper.stream).thenReturn(FileStream(zip)) val preferences = Mockito.mock(SharedPreferences::class.java, withSettings().stubOnly()) val editor = Mockito.mock(SharedPreferences.Editor::class.java) `when`(preferences.edit()).thenReturn(editor) + `when`(editor.commit()).thenReturn(true) - ContentSettingsManager(fileLocator).loadSharedPreferences(preferences) + ImportExportManager(fileLocator).loadSerializedPrefs(storedFileHelper, preferences) verify(editor, atLeastOnce()).putBoolean(anyString(), anyBoolean()) verify(editor, atLeastOnce()).putString(anyString(), anyString()) verify(editor, atLeastOnce()).putInt(anyString(), anyInt()) } + + @Test + fun `Importing preferences with a serialization injected class should fail`() { + val emptyZip = File(classloader.getResource("settings/db_vulnser_json.zip")?.file!!) + `when`(storedFileHelper.stream).thenReturn(FileStream(emptyZip)) + + val preferences = Mockito.mock(SharedPreferences::class.java, withSettings().stubOnly()) + + assertThrows(ClassNotFoundException::class.java) { + ImportExportManager(fileLocator).loadSerializedPrefs(storedFileHelper, preferences) + } + } } 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/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java b/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java index 10e23883f9e..47853bd7fe4 100644 --- a/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.schabi.newpipe.util.text.TimestampExtractor; import java.time.Duration; import java.util.Arrays; diff --git a/app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java b/app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java new file mode 100644 index 00000000000..8c8bf69378a --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java @@ -0,0 +1,195 @@ +package org.schabi.newpipe.util.image; + +import static org.junit.Assert.assertEquals; +import static org.schabi.newpipe.extractor.Image.HEIGHT_UNKNOWN; +import static org.schabi.newpipe.extractor.Image.WIDTH_UNKNOWN; +import static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage; +import static org.schabi.newpipe.util.image.ImageStrategy.estimatePixelCount; + +import org.junit.Test; +import org.schabi.newpipe.extractor.Image; +import org.schabi.newpipe.extractor.Image.ResolutionLevel; + +import java.util.List; + +public class ImageStrategyTest { + + private static final List RESOLUTION_LEVELS = List.of( + ResolutionLevel.LOW, ResolutionLevel.MEDIUM, ResolutionLevel.HIGH); + + private Image img(final int height, final int width) { + return new Image("", height, width, ResolutionLevel.UNKNOWN); + } + + private Image img(final String url, final ResolutionLevel resolutionLevel) { + return new Image(url, HEIGHT_UNKNOWN, WIDTH_UNKNOWN, resolutionLevel); + } + + private Image img(final String url, + final int height, + final int width, + final ResolutionLevel resolutionLevel) { + return new Image(url, height, width, resolutionLevel); + } + + private void assertChoosePreferredImage(final String low, + final String medium, + final String high, + final List images) { + assertEquals(low, choosePreferredImage(images, PreferredImageQuality.LOW)); + assertEquals(medium, choosePreferredImage(images, PreferredImageQuality.MEDIUM)); + assertEquals(high, choosePreferredImage(images, PreferredImageQuality.HIGH)); + } + + + // CHECKSTYLE:OFF + @Test + public void testEstimatePixelCountAllKnown() { + assertEquals(20000.0, estimatePixelCount(img(100, 200), 1.0), 0.0); + assertEquals(20000.0, estimatePixelCount(img(100, 200), 12.0), 0.0); + assertEquals( 100.0, estimatePixelCount(img(100, 1), 12.0), 0.0); + assertEquals( 100.0, estimatePixelCount(img( 1, 100), 0.5), 0.0); + } + + @Test + public void testEstimatePixelCountHeightUnknown() { + assertEquals( 10000.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 100), 1.0 ), 0.0); + assertEquals( 20000.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 200), 2.0 ), 0.0); + assertEquals( 10.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 1), 0.1 ), 0.0); + assertEquals(230400.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 640), 16.0/9.0), 0.0); + } + + @Test + public void testEstimatePixelCountWidthUnknown() { + assertEquals( 10000.0, estimatePixelCount(img(100, WIDTH_UNKNOWN), 1.0 ), 0.0); + assertEquals( 20000.0, estimatePixelCount(img(200, WIDTH_UNKNOWN), 0.5 ), 0.0); + assertEquals( 12.0, estimatePixelCount(img( 1, WIDTH_UNKNOWN), 12.0 ), 0.0); + assertEquals(230400.0, estimatePixelCount(img(360, WIDTH_UNKNOWN), 16.0/9.0), 0.0); + } + + @Test + public void testEstimatePixelCountAllUnknown() { + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 1.0 ), 0.0); + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 12.0 ), 0.0); + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 0.1 ), 0.0); + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 16.0/9.0), 0.0); + } + // CHECKSTYLE:ON + + + @Test + public void testChoosePreferredImageAllKnown() { + // the resolution level of the images is more important than the actual resolution + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", 1, 1, ResolutionLevel.LOW), + img("b", 200, 200, ResolutionLevel.MEDIUM), + img("c", 10000, 10000, ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", 10000, 10000, ResolutionLevel.LOW), + img("b", 200, 200, ResolutionLevel.MEDIUM), + img("c", 1, 1, ResolutionLevel.HIGH) + )); + + assertChoosePreferredImage("b", "c", "d", List.of( + img("a", 2, 1, ResolutionLevel.LOW), + img("b", 50, 25, ResolutionLevel.LOW), + img("c", 200, 100, ResolutionLevel.LOW), + img("d", 300, 150, ResolutionLevel.LOW) + )); + + assertChoosePreferredImage("c", "d", "d", List.of( + img("a", 2, 1, ResolutionLevel.MEDIUM), + img("b", 50, 25, ResolutionLevel.MEDIUM), + img("c", 60, 30, ResolutionLevel.MEDIUM), + img("d", 300, 150, ResolutionLevel.MEDIUM) + )); + } + + @Test + public void testChoosePreferredImageSomeKnown() { + // the resolution level of the images is more important than the actual resolution + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", 1, WIDTH_UNKNOWN, ResolutionLevel.LOW), + img("b", HEIGHT_UNKNOWN, 200, ResolutionLevel.MEDIUM), + img("c", 10000, WIDTH_UNKNOWN, ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", HEIGHT_UNKNOWN, 10000, ResolutionLevel.LOW), + img("b", 200, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM), + img("c", HEIGHT_UNKNOWN, 1, ResolutionLevel.HIGH) + )); + + assertChoosePreferredImage("b", "c", "d", List.of( + img("a", HEIGHT_UNKNOWN, 1, ResolutionLevel.HIGH), + img("b", 50, WIDTH_UNKNOWN, ResolutionLevel.HIGH), + img("c", HEIGHT_UNKNOWN, 120, ResolutionLevel.HIGH), + img("d", 340, WIDTH_UNKNOWN, ResolutionLevel.HIGH) + )); + + assertChoosePreferredImage("c", "d", "d", List.of( + img("a", 2, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM), + img("b", HEIGHT_UNKNOWN, 50, ResolutionLevel.MEDIUM), + img("c", 60, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM), + img("d", HEIGHT_UNKNOWN, 340, ResolutionLevel.MEDIUM) + )); + } + + @Test + public void testChoosePreferredImageMixed() { + for (final ResolutionLevel resolutionLevel : RESOLUTION_LEVELS) { + assertChoosePreferredImage("d", "b", "c", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", 200, 100, resolutionLevel), + img("c", 400, WIDTH_UNKNOWN, resolutionLevel), + img("d", HEIGHT_UNKNOWN, 50, resolutionLevel), + img("e", resolutionLevel) + )); + } + for (final ResolutionLevel resolutionLevel : RESOLUTION_LEVELS) { + assertChoosePreferredImage("b", "b", "b", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", 200, 100, resolutionLevel), + img("e", resolutionLevel) + )); + } + assertChoosePreferredImage("b", "b", "e", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", 200, 100, ResolutionLevel.LOW), + img("e", ResolutionLevel.HIGH) + )); + } + + @Test + public void testChoosePreferredImageAllUnknown() { + assertChoosePreferredImage("b", "c", "d", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", ResolutionLevel.LOW), + img("c", ResolutionLevel.MEDIUM), + img("d", ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("c", "c", "d", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("c", ResolutionLevel.MEDIUM), + img("d", ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("b", "c", "c", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", ResolutionLevel.LOW), + img("c", ResolutionLevel.MEDIUM) + )); + + // UNKNOWN is avoided as much as possible + assertChoosePreferredImage("d", "d", "d", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("d", ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("b", "b", "b", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", ResolutionLevel.LOW) + )); + assertChoosePreferredImage("a", "a", "a", List.of( + img("a", ResolutionLevel.UNKNOWN) + )); + } +} diff --git a/app/src/test/resources/settings/README.md b/app/src/test/resources/settings/README.md new file mode 100644 index 00000000000..13a3440e1e7 --- /dev/null +++ b/app/src/test/resources/settings/README.md @@ -0,0 +1,4 @@ +`*.zip` files in this folder are NewPipe database exports, in all possible configurations: +- `db` / `nodb` indicates if there is a `newpipe.db` database included or not +- `ser` / `vulnser` / `noser` indicates if there is a `newpipe.settings` Java-serialized preferences file included, if it is included and contains an injection attack, of if it is not included +- `json` / `nojson` indicates if there is a `preferences.json` JSON preferences file included or not diff --git a/app/src/test/resources/settings/db_noser_json.zip b/app/src/test/resources/settings/db_noser_json.zip new file mode 100644 index 00000000000..4bbb7523cff Binary files /dev/null and b/app/src/test/resources/settings/db_noser_json.zip differ diff --git a/app/src/test/resources/settings/db_noser_nojson.zip b/app/src/test/resources/settings/db_noser_nojson.zip new file mode 100644 index 00000000000..625947ef56b Binary files /dev/null and b/app/src/test/resources/settings/db_noser_nojson.zip differ diff --git a/app/src/test/resources/settings/db_ser_json.zip b/app/src/test/resources/settings/db_ser_json.zip new file mode 100644 index 00000000000..3662666cb23 Binary files /dev/null and b/app/src/test/resources/settings/db_ser_json.zip differ diff --git a/app/src/test/resources/settings/db_ser_nojson.zip b/app/src/test/resources/settings/db_ser_nojson.zip new file mode 100644 index 00000000000..0196c9f64c5 Binary files /dev/null and b/app/src/test/resources/settings/db_ser_nojson.zip differ diff --git a/app/src/test/resources/settings/db_vulnser_json.zip b/app/src/test/resources/settings/db_vulnser_json.zip new file mode 100644 index 00000000000..64444acdda9 Binary files /dev/null and b/app/src/test/resources/settings/db_vulnser_json.zip differ diff --git a/app/src/test/resources/settings/db_vulnser_nojson.zip b/app/src/test/resources/settings/db_vulnser_nojson.zip new file mode 100644 index 00000000000..56d58a22e2d Binary files /dev/null and b/app/src/test/resources/settings/db_vulnser_nojson.zip differ diff --git a/app/src/test/resources/settings/newpipe.settings b/app/src/test/resources/settings/newpipe.settings deleted file mode 100644 index 56e6c5d5dd5..00000000000 Binary files a/app/src/test/resources/settings/newpipe.settings and /dev/null differ diff --git a/app/src/test/resources/settings/newpipe.zip b/app/src/test/resources/settings/newpipe.zip deleted file mode 100644 index 1ce8431feb3..00000000000 Binary files a/app/src/test/resources/settings/newpipe.zip and /dev/null differ diff --git a/app/src/test/resources/settings/nodb_noser_json.zip b/app/src/test/resources/settings/nodb_noser_json.zip new file mode 100644 index 00000000000..7881f939b1c Binary files /dev/null and b/app/src/test/resources/settings/nodb_noser_json.zip differ diff --git a/app/src/test/resources/settings/empty.zip b/app/src/test/resources/settings/nodb_noser_nojson.zip similarity index 100% rename from app/src/test/resources/settings/empty.zip rename to app/src/test/resources/settings/nodb_noser_nojson.zip diff --git a/app/src/test/resources/settings/nodb_ser_json.zip b/app/src/test/resources/settings/nodb_ser_json.zip new file mode 100644 index 00000000000..aa8316c6ca3 Binary files /dev/null and b/app/src/test/resources/settings/nodb_ser_json.zip differ diff --git a/app/src/test/resources/settings/nodb_ser_nojson.zip b/app/src/test/resources/settings/nodb_ser_nojson.zip new file mode 100644 index 00000000000..437d30d8bb8 Binary files /dev/null and b/app/src/test/resources/settings/nodb_ser_nojson.zip differ diff --git a/app/src/test/resources/settings/nodb_vulnser_json.zip b/app/src/test/resources/settings/nodb_vulnser_json.zip new file mode 100644 index 00000000000..84f97aac0cf Binary files /dev/null and b/app/src/test/resources/settings/nodb_vulnser_json.zip differ diff --git a/app/src/test/resources/settings/nodb_vulnser_nojson.zip b/app/src/test/resources/settings/nodb_vulnser_nojson.zip new file mode 100644 index 00000000000..26a2c3b90e6 Binary files /dev/null and b/app/src/test/resources/settings/nodb_vulnser_nojson.zip differ diff --git a/build.gradle b/build.gradle index d2f1dc4c546..d93abc4c01c 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.9.25' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.3.1' + classpath 'com.android.tools.build:gradle:8.7.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml index e8c9d94ca2c..ee091fa9f44 100644 --- a/checkstyle/checkstyle.xml +++ b/checkstyle/checkstyle.xml @@ -39,11 +39,13 @@ - + + + @@ -69,6 +71,8 @@ + + diff --git a/doc/README.ar.md b/doc/README.ar.md new file mode 100644 index 00000000000..242516cdc74 --- /dev/null +++ b/doc/README.ar.md @@ -0,0 +1,143 @@ +

+

NewPipe

+

.Android واجهة أمامية متدفقة خفيفة الوزن لنظام

+ +

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] > .عن طريق ملء نموذج المشكلةGITHUB هذا التطبيق في مرحلة البيتا، لذا قد تواجه بعض الأخطاء. إذا واجهت أي أخطاء، يرجى فتح مشكلة في مستودعنا على +> +> .ينتهك شروطهم وأحكامهم Google Play أو أي فرع منه، في متجرNewPipe وضع تطبيق + +## لقطات الشاشة + +[](../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://fr.wikipedia.org/wiki/YouTube)) +- PeerTube ([موقع إلكتروني](https://joinpeertube.org/)) و جميع حالاته (قم بزيارة الموقع لتعرف ماذا يعني ذلك!) ([ويكي](https://fr.wikipedia.org/wiki/PeerTube)) +- Bandcamp ([موقع إلكتروني](https://bandcamp.com/)) ([ويكي](https://fr.wikipedia.org/wiki/Bandcamp)) +- SoundCloud ([موقع إلكتروني](https://soundcloud.com/)) ([ويكي](https://fr.wikipedia.org/wiki/SoundCloud)) +- media.ccc.de ([موقع إلكتروني](https://media.ccc.de/)) ([ويكي](https://fr.wikipedia.org/wiki/Chaos_Computer_Club)) + +كما يمكنكم ملاحظة، يدعم نيوبايب العديد من خدمات الفيديو والصوت. على الرغم من أن البداية كانت مع يوتيوب، إلا أن أشخاصًا آخرين قاموا بإضافة خدمات جديدة على مر السنين، مما جعل نيوبايب أكثر تنوعًا ومرونة! + +جزئيًا بسبب الظروف، وجزئيًا بسبب شعبيته، يوتيوب هو الخدمة الأفضل دعمًا من بين هذه الخدمات. إذا كنت تستخدم أو تعرف أيًا من هذه الخدمات الأخرى، فالرجاء مساعدتنا في تحسين الدعم لها! نحن بحاجة إلى من يعتنون بساوندكلاود وبييرتيوب. + +إذا كان لديك نية في إضافة خدمة جديدة، يرجى التواصل معنا أولا! توفر [مستنداتنا] (https://teamnewpipe.github.io/documentation/) المزيد من المعلومات حول كيفية إضافة خدمة جديدة إلى التطبيق وإلى [NewPipe Extractor] (https://github.com/TeamNewPipe/NewPipeExtractor).. + +## وصف + +نيوبايب يعمل عن طريق جلب البيانات المطلوبة من واجهة برمجة التطبيقات الرسمية (مثل بيرتيوب) للخدمة التي تستخدمها. إذا كانت واجهة برمجة التطبيقات الرسمية مقيدة (مثل يوتيوب) لأغراضنا، أو مملوكة، يقوم التطبيق بتحليل الموقع الإلكتروني أو استخدام واجهة برمجة التطبيقات الداخلية بدلاً من ذلك. وهذا يعني أنك لا تحتاج إلى حساب على أي خدمة لاستخدام نيوبايب. + +أيضًا، نظرًا لأنهما برمجيات حرة ومفتوحة المصدر، فإن التطبيق ولا المستخرج يستخدمان أي مكتبات أو إطارات برمجية مملوكة، مثل خدمات جوجل بلاي. وهذا يعني أنه يمكنك استخدام نيوبايب على الأجهزة أو الرومات المخصصة التي لا تحتوي على تطبيقات جوجل المثبتة. + +### سمات + +- 4K شاهد مقاطع الفيديو بدقة تصل إلى +- الاستماع إلى الصوت في الخلفية، وتحميل دفق الصوت فقط لحفظ البيانات +- الوضع المنبثق (المشغل العائم، المعروف أيضًا باسم Picture-in-Picture) +- مشاهدة البث المباشر +- إظهار/إخفاء الترجمة +- ابحث عن مقاطع فيديو وصوت (على اليوتيوب، يمكنك أيضًا تحديد لغة المحتوى) +- وضع مقاطع الفيديو في قائمة الانتظار (وحفظها اختياريًا كقوائم تشغيل محلية) +- إظهار/إخفاء المعلومات العامة حول مقاطع الفيديو (مثل الوصف والعلامات) +- إظهار/إخفاء مقاطع الفيديو التالية أو ذات الصلة +- إظهار/إخفاء التعليقات +- ابحث عن مقاطع الفيديو والصوت والقنوات وقوائم التشغيل والألبومات +- تصفح مقاطع الفيديو والتسجيلات الصوتية للقناة +- الاشتراك في القنوات (نعم، دون الحاجة إلى تسجيل الدخول إلى حساب!) +- تلقي إشعارات حول مقاطع الفيديو الجديدة من القنوات التي اشتركت فيها. +- إنشاء مجموعات القنوات وتحريرها (لتسهيل الإدارة والتنقل) +- تصفح خلاصات الفيديو التي تم إنشاؤها من مجموعات القنوات الخاصة بك +- عرض وبحث تاريخ العرض الخاص بك +- عرض قوائم التشغيل والبحث فيها (هذه قوائم تشغيل عن بعد، أي أنه يتم سحبها من الخدمة التي تتصفحها) +- إنشاء وتحرير قوائم التشغيل المحلية (يتم إنشاؤها وحفظها داخل التطبيق، وليس لها أي علاقة بأي من الخدمات) +- تنزيل مقاطع الفيديو/الصوت/الترجمات +- العب في كودي +- مشاهدة/حظر المحتوى المقيد بالفئة العمرية + + + + + +## التثبيت والتحديثات + + +يمكنك تثبيت نيوبايب باستخدام إحدى الطرق التالية: + +1. أضف مستودعنا في F-Droid وقم بتثبيت التطبيق من هناك. الإرشادات متوفرة هنا: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ +2. قم بتنزيل APK من [إصدارات GitHub](https://github.com/TeamNewPipe/NewPipe/releases) وقم بتثبيته. +3. قم بتحديث التطبيق عبر F-Droid. هذه الطريقة هي الأبطأ للحصول على التحديثات، حيث يجب على F-Droid اكتشاف التغييرات، وبناء ملف APK بنفسه، وتوقيعه، ثم نشر التحديث أخيرًا. +4. قم بإنشاء ملف APK للتصحيح بنفسك. هذه هي الطريقة الأسرع للحصول على ميزات جديدة على جهازك، لكنها أكثر تعقيدًا بكثير، ولهذا نوصي باستخدام أحد الطرق الأخرى. +5. ذا كنت مهتمًا بميزة معينة أو إصلاح خلل محدد في طلب سحب (PR) من هذا المستودع، يمكنك أيضًا تنزيل ملف APK من هذا الطلب. ستجد التعليمات في وصف الطلب. الرائع في ملفات APK الخاصة بالطلبات السحب هو أنها تُثبت بجانب التطبيق الرسمي، لذا لا داعي للقلق بشأن فقدان بياناتك أو تعطيل أي شيء. + +نوصي بالطريقة الأولى لمعظم المستخدمين. يتوافق ملفات APK التي تم تثبيتها باستخدام الطرق الأولى أو الثانية مع بعضها البعض (مما يعني أنه إذا قمت بتثبيت NewPipe باستخدام إحدى هاتين الطريقتين، يمكنك أيضًا تحديث NewPipe باستخدام الطريقة الأخرى)، ولكن لا يتوافق ذلك مع تلك التي تم تثبيتها باستخدام الطريقة الثالثة. يرجع ذلك إلى استخدام نفس مفتاح التوقيع (الخاص بنا) للطرق الأولى والثانية، بينما يتم استخدام مفتاح مختلف (مفتاح F-Droid) للطريقة الثالثة. إن بناء ملف APK للتصحيح باستخدام الطريقة الرابعة لا يتطلب أي مفتاح. تساعد مفاتيح التوقيع في التأكد من عدم خداع المستخدم وتثبيت تحديث غير مشروع للتطبيق. عند استخدام الطريقة الخامسة، يتم توقيع كل ملف APK بمفتاح توقيع فريد وعشوائي يتم إنشاؤه بواسطة GitHub Actions؛ لذا لا يمكنك تحديثها. فيجب عليك حفظ واستعادة بيانات التطبيق في كل مرة ترغب في استخدام ملف APK جديد. + +في الوقت الحاضر، إذا كنت ترغب في تغيير المصدر لأي سبب من الأسباب (على سبيل المثال، إذا كانت ميزة NewPipe الأساسية معطلة ولم يتم تحديثها بعد على F-Droid)، نوصي باتباع هذه الإجراءات: + +1. قم بعمل نسخة احتياطية من بياناتك عبر الإعدادات > المحتوى > تصدير قاعدة البيانات للحفاظ على السجل والاشتراكات وقوائم التشغيل. +2. إلغاء تثبيت NewPipe +3. قم بتنزيل APK من المصدر الجديد وتثبيته. +4. قم باستعادة البيانات من الخطوة 1 عبر الإعدادات > المحتوى > استيراد قاعدة البيانات + +ملاحظة: عندما تقوم بإستيراد قاعدة بيانات إلى التطبيق الرسمي، تأكد دائمًا من أنها تم استخراجها من التطبيق الرسمي. إذا قمت بإستيراد قاعدة بيانات من APK آخر غير الرسمي، قد تحدث مشاكل. هذا الإجراء غير مدعوم، ويجب عليك فعل ذلك فقط عندما تكون متأكدًا تمامًا من ما تفعله. + +## مساهمة + +سواء كانت لديك أفكار، أو ترجمات، أو تغييرات في التصميم، أو تنظيف التعليمات البرمجية، أو حتى تغيير كبير في التعليمات البرمجية، فنحن نرحب بأي مساعدة. التطبيق يصبح أفضل قليلا مع كل مساهمة، مهما كانت كبيرة أو صغيرة! إذا كنت ترغب في المشاركة، قم بإلقاء نظرة على [ملاحظات المساهمة](.github/CONTRIBUTING.md). + + +Translation status + + +## التبرعات + +إذا كنت تحب NewPipe، فنحن نرحب بك لإرسال التبرع. نحن نفضل Liberapay لأنه مفتوح المصدر وغير ربحي. لمزيد من المعلومات حول كيفية التبرع لـ NewPipe، تفضل بزيارة [موقعنا الإلكتروني](https://newpipe.net/donate) + + + + + + + +
LiberapayVisitez NewPipe sur liberapay.comDonnez via Liberapay
+ +## سياسة الخصوصية + +يهدف مشروع NewPipe إلى توفير تجربة خاصة ومجهولة لاستخدام خدمات الوسائط المستندة إلى الويب. ولذلك، فإن التطبيق لا يجمع أي بيانات دون موافقتك. تشرح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير بالحادث أو ترك تعليق على مدونتنا. يمكنك العثور على المستند [هنا](https://newpipe.net/legal/privacy/). + +## رخصة + +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe هو برنامج مجاني: يمكنك استخدامه ودراسته ومشاركته وتحسينه كما يحلو لك. وبشكل أكثر تحديدًا، يمكنك إعادة توزيعه و/أو تعديله بموجب شروط [رخصة GNU العامة](https://www.gnu.org/licenses/gpl.html) كما نشرتها مؤسسة البرمجيات الحرة، أيًا من الإصدارين. 3 من الترخيص، أو (حسب اختيارك) أي إصدار لاحق. diff --git a/doc/README.asm.md b/doc/README.asm.md new file mode 100644 index 00000000000..8042b3db91e --- /dev/null +++ b/doc/README.asm.md @@ -0,0 +1,142 @@ +

+

NewPipe

+

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

+ +

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> এই এপটো নিৰ্মিয়মান অৱস্থাত আছে, গতিকে আপুনি ব্যৱহাৰ কৰোঁতে কোনো অসুবিধাৰ সন্মুখীন হ'ব পাৰে। যদি আপুনি অসুবিধাৰ সন্মুখীন হয়, ইছ্যু টেমপ্লেট পূৰণ কৰি আমাৰ 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 ([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 এ একাধিক ভিডিঅ' আৰু অডিঅ' সেৱা সমৰ্থন কৰে। ই YouTube ৰ পৰা আৰম্ভ হৈছিল, বছৰ বছৰ ধৰি আন মানুহে অধিক সেৱা যোগ কৰিছে, যাৰ ফলত 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 > Backup and Restore > Export Database ৰ জৰিয়তে ভিডিঅ' উপভোগৰ ইতিহাস, প্লেলিষ্ট আদি ৰপ্তানি কৰক। + +২)NewPipe আনইনষ্টল কৰক। + +৩)নতুন উৎসৰ পৰা APK ডাউনলোড কৰি ইনষ্টল কৰক + +৪)Settings > Backup and Restore > Import Database যোগেদি তথ্য আমদানি কৰক + +টোকা: যেতিয়া আপুনি এটা ডাটাবেছ অফিচিয়েল এপলৈ আমদানি কৰে, সদায় নিশ্চিত কৰক যে সেইটো আপুনি অফিচিয়েল এপৰ পৰা ৰপ্তানি কৰাটোৱেই। যদি আপুনি অফিচিয়েল এপৰ বাহিৰে অন্য এটা APK ৰ পৰা ৰপ্তানি কৰা ডাটাবেছ আমদানি কৰে, ই এপটো অক্ষম কৰি ব পাৰে। এনে কাৰ্য্য সমৰ্থিত নহয়, আৰু আপুনি তেতিয়াহে তেনে কৰা উচিত যেতিয়া আপুনি সম্পূৰ্ণ নিশ্চিত যে আপুনি কি কৰি আছে সেয়া জানে। + +## অৱদান + +আপোনাৰ ধাৰণা, অনুবাদ, ডিজাইন পৰিবৰ্তন, ক'ড পৰিষ্কাৰ কৰা, বা আনকি ডাঙৰ ক'ড পৰিৱৰ্তন হওক, সহায় সদায় আদৰণীয়। প্ৰতিটো অৱদানৰ লগে লগে এপটো ভাল হৈ পৰে, যিমানেই ডাঙৰ বা সৰু নহওক কিয়! যদি আপুনি জড়িত হ'ব বিচাৰে তেন্তে চাওক আমাৰ [অবদানৰ টোকা সমূহ](/.github/CONTRIBUTING.md).Translation status + +## অনুদান + +যদি আপুনি NewPipe ভাল পায় তেন্তে অনুদান প্ৰেৰণ কৰিব পাৰে। আমি Liberapay পছন্দ কৰো, কাৰণ ই মুক্ত উৎস(Open Source) আৰু অলাভজনক(Non-profit) দুয়োটা। NewPipe লৈ দান দিয়াৰ বিষয়ে অধিক তথ্যৰ বাবে অনুগ্ৰহ কৰি আমাৰ [ৱেবচাইট](https://newpipe.net/donate) চাওক. + + + + + + + +
LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
+ +## গোপনীয়তা নীতি + +নিউপাইপ প্ৰকল্পৰ লক্ষ্য হৈছে ৱেব-ভিত্তিক মিডিয়া সেৱা ব্যৱহাৰৰ বাবে এক ব্যক্তিগত অভিজ্ঞতা প্ৰদান কৰা। গতিকে আপোনাৰ সন্মতি অবিহনে এপটোৱে কোনো তথ্য সংগ্ৰহ নকৰে। 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..5b3275d0768 --- /dev/null +++ b/doc/README.de.md @@ -0,0 +1,159 @@ +

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> 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, sieh 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
+ +## 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.es.md b/doc/README.es.md index 0d8e6fd6550..8ec58e771db 100644 --- a/doc/README.es.md +++ b/doc/README.es.md @@ -10,7 +10,6 @@ -


@@ -18,26 +17,27 @@

Sitio WebBlogPreguntas FrecuentesPrensa


-*Lea esto en otros idiomas: [English](../README.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* +*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), [Српски](README.sr.md) , [العربية](README.ar.md)* -AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDE ENCONTRAR BUGS. SI ENCUENTRA UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. - -COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES. +> [!warning] +> ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDES ENCONTRAR BUGS. SI ENCUENTRAS UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. +> +> COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES. ## Capturas de Pantalla -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/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) ## Descripción @@ -59,7 +59,7 @@ NewPipe no usa ninguna librería del framework de Google, ni la API de YouTube. * Buscar a través de YouTube en un idioma específico * Mirar/Bloquear videos restringidos por edad * Mostrar información general sobre canales -* Buscar de canales +* Buscador de canales * Mirar videos de un canal * Soporte Orbot/Tor (todavía no directamente) * Soporte para videos en 1080p/2K/4K @@ -115,21 +115,11 @@ Si quiere involucrarse, fíjese en nuestras [notas de contribución](../.github/ Si te gusta NewPipe, estaremos felices con una donación. Puede enviar bitcoin o donar a través de Bountysource o Liberapay. Visita nuestro [sitio web](https://newpipe.net/donate) para más información. - - - - - - - - - -
BitcoinCódigo QR del Bitcoin16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay Visita NewPipe en liberapay.com Dona vía Liberapay
BountysourceVisita NewPipe en bountysource.comRevisa cuántas recompensas puedes obtener.
## Política de Privacidad diff --git a/doc/README.fr.md b/doc/README.fr.md new file mode 100644 index 00000000000..772f4a1ae00 --- /dev/null +++ b/doc/README.fr.md @@ -0,0 +1,138 @@ +

Nous prévoyons de réécrire une large partie de code, afin de créer un NewPipe encore plus moderne et stable!

+

Prière de ne pas ouvrir de nouvelles pull-up requêtes contenant de nouvelles fonctionnalités. Seules les corrections de bugs seront acceptées.

+ +

+

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> 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 LA CATEGORIE ISSUE. +> +> AJOUTER 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 années, rendant NewPipe de plus en plus polyvalent ! + +Grace aux circonstances et 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 diffusions en direct +* Afficher/masquer les sous-titres +* Chercher des vidéos et des audios (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 informations 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, des audios, des chaînes, des listes de 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és. +* 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 par 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 cela 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 à partir de la 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 foirer 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 souhaitez utiliser un nouveau 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(paramètre) > Content(contenu) > Export Database(exporter la base de donnée) 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é _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
+ +## 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..37ae71a4ae2 100644 --- a/doc/README.hi.md +++ b/doc/README.hi.md @@ -2,7 +2,7 @@

NewPipe

Android के लिए एक ओपन सोर्स, हल्का YouTube ऐप।

-

इसे F-Droid पर पाएँ

+

इसे F-Droid पर पाएँ

@@ -10,39 +10,57 @@ - +


-

ऐप कैसी दिखती हैविवरणसुविधाएँस्थापित करना और अपडेट करनायोगदान करेंआर्थिक योगदान करेंलाइसेंस

+

ऐप कैसी दिखती हैसमर्थित सेवाएँविवरणसुविधाएँस्थापित करना और अपडेट करनायोगदान करेंआर्थिक योगदान करेंलाइसेंस

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


-इसे दूसरी भाषाओं में पढ़ें: [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), [Српски](README.sr.md) , [العربية](README.ar.md)* -चेतावनी: यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें। - -NewPipe या इसके किसी फोर्क को Google Play Store पर डालने पर Store के नियमों और शर्तों का उल्लंघन होता है। +> [!warning] +> यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें। +> +> NewPipe या इसके किसी फोर्क को Google Play Store पर डालने पर Store के नियमों और शर्तों का उल्लंघन होता है। ## ऐप कैसी दिखती है -[](../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) + +## समर्थित सेवाएँ + +न्यूपाइप वर्तमान में इन सेवाओं का समर्थन करता है: + + +* 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)) + +जैसा कि आप देख सकते हैं, न्यूपाइप कई वीडियो और ऑडियो सेवाओं का समर्थन करता है। इसकी शुरुआत YouTube से हुई, लेकिन पिछले कुछ वर्षों में अन्य लोगों ने अन्य सेवाएँ जोड़ी हैं, जिससे न्यूपाइप और भी बहुमुखी बन गया है! + +परिस्थितियों और लोकप्रियता के कारण, YouTube इन सेवाओं में से सबसे अच्छा समर्थित है। यदि आप इनमें से किसी भी अन्य सेवा का उपयोग करते हैं या उससे परिचित हैं, तो कृपया उनके लिए समर्थन को बेहतर बनाने में हमारी सहायता करें! हम SoundCloud और PeerTube के लिए मेंटेनरज़ की तलाश कर रहे हैं। + +यदि आप कोई नई सेवा जोड़ना चाहते हैं, कृपया पहले हमसे संपर्क करें! हमारे [प्रलेख](https://teamnewpipe.github.io/documentation/) में यह बताया गया है कि ऐप और [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor) में एक नई सेवा कैसे जोड़ी जा सकती है। ## विवरण NewPipe ना ही किसी Google फ्रेमवर्क लाइब्रेरी, और ना ही YouTube के API का इस्तेमाल करता है। इस ऐप को चलाने के लिए सिर्फ वेबसाइट्स से जानकारी प्राप्त करने की ज़रूरत है, तो इस ऐप का इस्तेमाल उन डिवाइसों पर भी किया जा सकता है जिनपर Google की सेवाएँ स्थापित नहीं हैं। और NewPipe जैसे कॉपीलेफ्ट किए गए मुक्त सॉफ़्टवेयर का इस्तेमाल करने के लिए आपको YouTube खाते की ज़रूरत नहीं। -### सुविधाएँ +## सुविधाएँ * वीडियो खोजें * खाते की ज़रूरत नहीं @@ -73,19 +91,6 @@ NewPipe ना ही किसी Google फ्रेमवर्क लाइ * लाइवस्ट्रीम देखें * वीडियो पे टिप्पणियाँ देखें -### उपलब्ध सेवाएँ - -NewPipe पर कई सेवाएँ उपलब्ध हैं। हमारे [प्रलेख](https://teamnewpipe.github.io/documentation/) में यह बताया गया है कि ऐप और एक्सट्रैक्टर में एक नई सेवा कैसे जोड़ी जा सकती है। अगर आप कोई नई सेवा जोड़ना चाहते हैं, कृपया हमसे संपर्क करें। वर्तमान में उपलब्ध सेवाएँ हैं: - -* YouTube -* SoundCloud \[बीटा\] -* media.ccc.de \[बीटा\] -* PeerTube instances \[बीटा\] -* Bandcamp \[बीटा\] - - - - ## स्थापित करना और अपडेट करना आप इनमें से किसी एक तरीके से NewPipe को स्थापित कर सकते हैं: 1. हमारे अपने रिपॉज़िटरी को F-Droid पर जोड़ें और उसे वहाँ से स्थापित करें। अनुदेश यहाँ हैं: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ @@ -96,40 +101,32 @@ NewPipe पर कई सेवाएँ उपलब्ध हैं। हम ज़्यादातर उपयोगकर्ताओं के लिए पहला तरीका ठीक है। पहले और दूसरे तरीके से स्थापित APK एक-दूसरे के अनुकूल हैं, मगर तीसरे तरीके से स्थापित APK से नहीं। ऐसा इसलिए है क्योंकि पहले और दूसरे तरीके में एक ही (हमारे) हस्ताक्षर कुँजी का इस्तेमाल हुआ है, मगर तीसरे तरीके में दूसरे (F-Droid के) हस्ताक्षर कुँजी का इस्तेमाल किया जाता है। चौथे तरीके से अपना डीबग APK फ़ाइल बनाने पर कुँजी की ज़रूरत ही नहीं पड़ती। कुँजियों से यह निश्चित किया जाता है कि उपयोगकर्ता कहीं ऐप पर कोई दुर्भावनापूर्ण अपडेट तो स्थापित नहीं कर रहा। इस दौरान अगर आप स्रोत बदलना चाहते हैं (मान लीजिए NewPipe की मूल सुविधा खराब हो गई और F-Droid पर कोई अपडेट नहीं आया है), हम इस अनुदेश का इस्तेमाल करने की सलाह देंगे: -1. सेटिंग्स > सामग्री > डेटाबेस निर्यात करें — इसके ज़रिए अपने डेटा को बैकअप कर लें ताकि आपके पास अपने देखे गए वीडियो, सदस्यताएँ और प्लेलिस्ट्स हो +1. सेटिंग्स > बैकअप और रिस्टोर > डेटाबेस निर्यात करें — इसके ज़रिए अपने डेटा को बैकअप कर लें ताकि आपके पास अपने देखे गए वीडियो, सदस्यताएँ और प्लेलिस्ट्स हो 2. NewPipe को डिवाइस से हटाएँ 3. नए स्रोत से APK डाउनलोड करें और उसे स्थापित करें -4. सेटिंग्स > सामग्री > डेटाबेस आयात करें — इसके ज़रिए पहले चरण के डेटा को आयात करें +4. सेटिंग्स > बैकअप और रिस्टोर > डेटाबेस आयात करें — इसके ज़रिए पहले चरण के डेटा को आयात करें + +ध्यान दें: जब आप किसी डेटाबेस को आधिकारिक ऐप में आयात कर रहे हैं, तो हमेशा सुनिश्चित करें कि यह वही है जिसे आपने आधिकारिक ऐप से निर्यात किया था। यदि आप आधिकारिक ऐप के अलावा किसी एपीके से निर्यात किया गया डेटाबेस आयात करते हैं, तो यह चीजों को तोड़ सकता है। ऐसी कार्रवाई समर्थित नहीं है, और आपको ऐसा केवल तभी करना चाहिए जब आप पूरी तरह से आश्वस्त हों कि आप जानते हैं कि आप क्या कर रहे हैं। ## योगदान करें चाहे आप अपने विचार जोड़ना चाहे, या अनुवाद, डिज़ाइन में बदलाव, कोड में सफ़ाई, या कोड में भारी बदलाव, सहायता ज़रूर करें। जितने योगदान हो, ऐप उतनी ही बेहतर होती जाती है! -अगर आप योगदान करना चाहते हैं, हमारे [योगदान के दिशानिर्देश](.github/CONTRIBUTING.md) देखें। +अगर आप योगदान करना चाहते हैं, हमारे [योगदान के दिशानिर्देश](/.github/CONTRIBUTING.md) देखें। अनुवाद की स्थिति ## आर्थिक योगदान करें -अगर आपको NewPipe पसंद है, एक छोटे-से दान से हम खुश होंगे। आप या तो बिटकॉइन भेज सकते हैं या फिर Bountysource या Liberapay से दान कर सकते हैं। NewPipe को दान करने के बारे में अधिक जानकारी के लिए कृपया हमारी [वेबसाइट](https://newpipe.net/donate) देखें। +यदि आपको न्यूपाइप पसंद है, तो दान भेजने के लिए आपका स्वागत है। आप Liberapay से दान कर सकते हैं। हम Liberapay को प्राथमिकता देते हैं, क्योंकि यह ओपन-सोर्स और गैर-लाभकारी दोनों है। न्यूपाइप को दान देने के बारे में अधिक जानकारी के लिए कृपया हमारी [वेबसाइट](https://newpipe.net/donate) पर जाएँ। - - - - - - - - - -
Bitcoinबिटकॉइन पर दान करने के लिए QR कोड16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay liberapay.com पर NewPipe को देखें Liberapay के ज़रिए दान करें
Bountysourcebountysource.com पर NewPipe को देखेंदेखें कि आप कितने बाउंटी कमा सकते हैं।
## गोपनीयता और शर्तें diff --git a/doc/README.it.md b/doc/README.it.md new file mode 100644 index 00000000000..6c227ea2fac --- /dev/null +++ b/doc/README.it.md @@ -0,0 +1,136 @@ +

+

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> 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
+ +## 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.ja.md b/doc/README.ja.md index 38eacf08407..e8f708a8a18 100644 --- a/doc/README.ja.md +++ b/doc/README.ja.md @@ -10,39 +10,39 @@ -


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

ウェブサイトブログ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](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), [Српски](README.sr.md) , [العربية](README.ar.md)* -注意: これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。 - -NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。 +> [!warning] +> これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。 +> +> NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。 ## スクリーンショット -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../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 アカウントは必要となりません。 +自由なコピーレフトソフトウェアの NewPipe は一切のGoogleフレームワークライブラリ及び、YouTube API を使用しません。ウェブサイトは必要な情報のためだけに読み込まれるため、このアプリはGoogleのサービスがインストールされていない端末でも使用できます。また、NewPipeの使用にYouTubeアカウントは必要ありません。 ### 機能 @@ -55,7 +55,7 @@ * 動画を視聴するストリーミングプレイヤーの選択 * 動画のダウンロード * 音声のみのダウンロード -* Kodi での動画再生 +* Kodiでの動画再生 * 次の動画/関連動画の表示 * 特定の言語の YouTube の検索 * 年齢制限のあるコンテンツの視聴/ブロック @@ -91,7 +91,7 @@ NewPipe は複数のサービスに対応しています。[ドキュメント]( ## インストールと更新 以下の方法のいずれかに従うことによって NewPipe をインストールできます。 -1. カスタムリポジトリを F-Droid に追加してリリースが公開され次第インストールする。この方法の説明はこちら: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ +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 をビルドする。これは新しい機能を使用する上で最も早い方法ですが、他と比べてとても複雑なので、他の方法の使用を推奨します。 @@ -120,21 +120,11 @@ NewPipe は複数のサービスに対応しています。[ドキュメント]( もし、NewPipe を気に入っていただけたら、寄付をしていただけると嬉しいです。Bitcoin または Bountysource, Liberapay から寄付をすることができます。NewPipe への寄付については、[ウェブサイト](https://newpipe.net/donate)からお願いします。 - - - - - - - - - -
BitcoinBitcoin QR コード16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay liberapay.com で NewPipe を訪れる Liberapay で寄付
Bountysourcebountysource.com で NewPipe を訪れるあなたがどれほどの寄付を得られるのか確認しましょう。
## プライバシーポリシー diff --git a/doc/README.ko.md b/doc/README.ko.md index 9703e6a4897..3215bd713c6 100644 --- a/doc/README.ko.md +++ b/doc/README.ko.md @@ -10,135 +10,124 @@ -


ScreenshotsDescriptionFeaturesUpdatesContributionDonateLicense

WebsiteBlogFAQPress


-*Read this in other languages: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* - -경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GITHUB 저장소에서 ISSUE를 열람하여 주십시오. - -NEWPIPE 또는 이것의 FORK을 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. - -## Screenshots - -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) - -## Description - -NewPipe는 어떤 구글 프레임워크 라이브러리나, 유튜브 API를 사용하지 않습니다. 웹사이트는 단지 필요한 정보를 가져오기 위해 구문 분석 됩니다. 따라서 이 앱은 구글 서비스의 설치 없이 기기에서 사용될 수 있습니다. 또한, 카피레프트 자유 소프트웨어인 NewPipe를 사용하기 위해 유튜브 계정이 필요하지 않습니다. - -### Features - -* 영상 검색 -* 영상의 일반적인 정보 표시 -* 유튜브 영상 보기 -* 유튜브 영상 듣기 -* 팝업 모드 (floating player) -* 영상 공유 -* 영상 다운로드 -* 음성만 다운로드 -* Kodi에서 영상 열람 -* 다음/관련된 영상 표시 -* 특정 언어로 유튜브 검색 -* 연령 제한 컨텐츠 시청/차단 -* 채널에 대한 일반적인 정보 표시 -* 채널 검색 -* 채널에서 영상 시청 -* Orbot/Tor 지원 (아직 직접적이지 않음) -* 1080p/2K/4K 지원 -* 기록 보기 -* 채널 구독 -* 기록 검색 -* 재생목록 검색/시청 -* 추가된 재생목록 시청 -* 영상 추가 -* 지역 재생목록 -* 자막 -* 실시간 방송 지원 -* 댓글 표시 - -### Supported Services - -NewPipe는 여러가지 서비스를 지원합니다. 우리의 [문서](https://teamnewpipe.github.io/documentation/)는 새로운 서비스가 앱과 추출기에 어떻게 추가될 수 있는지에 대한 더 많은 정보를 제공합니다. 만약 새로운 서비스를 추가하고자 한다면, 우리에게 연락해 주시기 바랍니다. 현재 지원되는 서비스: - -* YouTube -* SoundCloud \[beta\] -* media.ccc.de \[beta\] -* PeerTube instances \[beta\] -* Bandcamp \[beta\] - -## Updates -NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 인해), 결국 릴리즈가 발생할 것입니다. 이것들의 형식은 x.xx.x 입니다. -이 새로운 버전을 얻기 위해서, 당신은: - 1. 직접 디버그 APK를 생성할 수 있습니다. 이 방법은 당신의 기기에서 새로운 기능을 얻을 수 있는 가장 빠른 방법이지만, 꽤 많이 복잡합니다. - 따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다. - 2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다. - 이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ - 3. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다. - 4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, +*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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오. +> +> NewPipe 또는 NewPipe 포크를 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. + +## 스크린샷 + +[](../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의 인기로 인해 현재 서비스 중에서 YouTube가 가장 잘 지원됩니다. 다른 서비스를 사용하시거나, 잘 알고 계시다면 지원을 개선할 수 있도록 도와주세요! SoundCloud와 PeerTube의 관리자를 찾고 있습니다. + +새로운 서비스를 추가하고 싶으시다면, 먼저 저희에게 연락해 주세요! 저희의 [문서](https://teamnewpipe.github.io/documentation/)가 앱과 [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor)에 서비스를 추가하는 법에 대한 정보를 제공합니다. + +## 설명 + +NewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식으로 작동합니다. 공식 API가 저희의 목적을 제한하는 경우 (예: YouTube), 또는 독점적인 경우 NewPipe는 웹사이트의 구문을 분석하거나 내부 API를 사용합니다. 즉, NewPipe를 사용할 때 계정은 필요하지 않습니다. + +### 기능 + +* 최대 4K 화질로 영상 보기 +* 백그라운드에서 노래 듣기 (노래 데이터만을 가져오므로 데이터 절약) +* 팝업 모드 (floating player, 또는 Picture-in-Picture) +* 실시간 영상 보기 +* 부제/자막 표시/숨기기 +* 영상과 오디오 검색하기 (YouTube에서는 콘텐츠 언어를 지정할 수 있습니다) +* 영상 대기열 추가 (로컬 플레이리스트에 추가 가능) +* 영상에 대한 기본 정보 표시/숨기기 (설명이나 태그 등) +* 다음/관련 영상 표시/숨기기 +* 댓글 표시/숨기기 +* 영상, 오디오, 채널, 플레이리스트, 앨범 검색하기 +* 채널 내부에서 영상, 오디오 찾기 +* 채널 구독하기 (계정에 로그인 불필요!) +* 구독한 채널의 영상 알림 받기 +* 채널 그룹 생성, 수정 (쉬운 탐색과 관리를 위해) +* 채널 그룹에서 생성된 영상 피드 탐색 +* 시청 기록 보기, 검색 +* 플레이리스트 검색, 시청 (서비스에서 원격으로 받아옴) +* 로컬 플레이리스트 만들기/수정 (다른 서비스에서 할 필요 없이 NewPipe 내부에 저장) +* 영상/오디오/자막 다운로드 +* Kodi에서 열기 +* 나이 제한 영상 시청/차단 + +## 설치 및 업데이트 +당신은 NewPipe를 설치하기 위해 이 방법 중 하나를 사용할 수 있습니다: + 1. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 F-Droid에서 릴리즈를 설치할 수 있습니다. 지침은 여기 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 받고 이것을 설치할 수 있습니다. + 3. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, 이것은 업데이트를 받는 가장 느린 방법입니다. + 4. 스스로 디버그 APK 빌드하기. 이것은 새 기능을 기기에 추가하는 가장 빠른 방법이지만, 매우 복잡하므로, 다른 방법 중 하나를 사용하는 것을 권장합니다. + 5. 이 저장소의 PR에 제공된 기능 또는 버그 픽스에 관심이 있다면, PR의 APK를 받을 수 있습니다. 지침을 위해선 PR 설명을 따르십시오. PR APK는 공식 APK와 같이 설치되기 때문에, 데이터를 잃거나 무언가 잘못될 걱정을 하지 않으도 됩니다. -우리는 대부분의 사용자에게 2번쨰 방법을 추천합니다. 방법 2 또는 3을 사용하여 설치된 APK는 서로 호환되지만, 방법 4를 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 2 또는 3에서는 같은 (우리의)서명 키가 사용되지만, 방법 4에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 1을 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다. +우리는 대부분의 사용자에게 1번째 방법을 추천합니다. 방법 1 또는 2를 사용하여 설치된 APK는 서로 호환되지만 (NewPipe를 방법 1로 설치한 후 방법 2로 업데이트할 수 있음을 의미합니다), 방법 3을 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 1 또는 2에서는 같은 (우리의)서명 키가 사용되지만, 방법 3에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 4를 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다. -한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid가 아직 업데이트를 가지지 않는 경우) 때문에 소스를 바꾸길 원한다면, +한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid에 아직 업데이트가 없는 경우) 때문에 소스를 바꾸길 원한다면, 우리는 다음과 같은 절차를 따르는 것을 권장합니다: 1. 당신의 기록, 구독, 그리고 재생목록을 유지할 수 있도록 Settings > Content > Export Database 를 통해 데이터를 백업하십시오. 2. NewPipe를 삭제하십시오. 3. 새로운 소스에서 APK를 다운로드하고 이것을 설치하십시오. 4. Step 1의 Settings > Content > Import Database 을 통해 데이터를 불러오십시오. -## Contribution +## 기여 당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다. 더 많이 수행될수록 더 많이 발전할 수 있습니다! -만약 참여하고 싶다면, 우리의 [컨트리뷰션 공지](../.github/CONTRIBUTING.md)를 참고하십시오. +만약 참여하고 싶다면, 우리의 [기여 공지](../.github/CONTRIBUTING.md)를 참고하십시오. Translation status -## Donate +## 기부 만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오. - - - - - - - - - -
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
-## Privacy Policy +## 개인정보 보호 정책 NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다. 그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다. -## License +## 라이선스 [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) NewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다. diff --git a/doc/README.pa.md b/doc/README.pa.md new file mode 100644 index 00000000000..0e254adf1a6 --- /dev/null +++ b/doc/README.pa.md @@ -0,0 +1,136 @@ +

+

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> ਇਹ ਐਪ ਬੀਟਾ ਵਿੱਚ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਬੱਗ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਮਪਲੇਟ ਨੂੰ ਭਰ ਕੇ ਸਾਡੀ ਗਿਟਹੱਬ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਮੁੱਦਾ ਖੋਲ੍ਹੋ +> +> ਗੂਗਲ ਪਲੇ ਸਟੋਰ ਵਿੱਚ ਨਿਊਪਾਈਪ ਜਾਂ ਇਸ ਦਾ ਕੋਈ ਵੀ ਫੋਰਕ ਲਗਾਉਣਾ ਉਹਨਾਂ ਦੇ ਨਿਯਮਾਂ ਅਤੇ ਸ਼ਰਤਾਂ ਦੀ ਉਲੰਘਣਾ ਕਰਦਾ ਹੈ। + +## ਐਪ ਕਿਹੋ-ਜਿਹੀ ਦਿਖਦੀ ਹੈ + +[](../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 ਲਈ ਮੇਨਟੇਨਰਾਂ ਦੀ ਭਾਲ ਕਰ ਰਹੇ ਹਾਂ। + +ਜੇ ਤੁਸੀਂ ਕੋਈ ਨਵੀਂ ਸੇਵਾ ਜੋੜਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਪਹਿਲਾਂ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ! ਸਾਡੇ [ਦਸਤਾਵੇਜ਼](https://teamnewpipe.github.io/documentation/) ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ ਕਿ ਐਪ ਅਤੇ [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). ਵਿੱਚ ਨਵੀਂ ਸੇਵਾ ਕਿਵੇਂ ਸ਼ਾਮਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। + +## ਵਰਣਨ + +NewPipe ਤੁਹਾਡੇ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਰਹੀ ਸੇਵਾ ਦੇ ਅਧਿਕਾਰਤ API (ਉਦਾਹਰਨ ਲਈ PeerTube) ਤੋਂ ਲੋੜੀਂਦਾ ਡੇਟਾ ਪ੍ਰਾਪਤ ਕਰਕੇ ਕੰਮ ਕਰਦਾ ਹੈ। ਜੇਕਰ ਅਧਿਕਾਰਤ API ਸਾਡੇ ਉਦੇਸ਼ਾਂ ਲਈ ਪ੍ਰਤਿਬੰਧਿਤ ਹੈ (ਉਦਾਹਰਨ ਲਈ YouTube) ਜਾਂ ਮਲਕੀਅਤ ਹੈ, ਤਾਂ ਐਪ ਵੈੱਬਸਾਈਟ ਨੂੰ ਪਾਰਸ ਕਰਦੀ ਹੈ ਜਾਂ ਇਸਦੀ ਬਜਾਏ ਇੱਕ ਅੰਦਰੂਨੀ API ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਹਾਨੂੰ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਕਿਸੇ ਵੀ ਸੇਵਾ 'ਤੇ ਖਾਤੇ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। + +ਨਾਲ ਹੀ, ਕਿਉਂਕਿ ਇਹ ਮੁਫਤ ਅਤੇ ਓਪਨ ਸੋਰਸ ਸੌਫਟਵੇਅਰ ਹਨ, ਨਾ ਤਾਂ ਐਪ ਅਤੇ ਨਾ ਹੀ ਐਕਸਟਰੈਕਟਰ ਕਿਸੇ ਵੀ ਮਲਕੀਅਤ ਲਾਇਬ੍ਰੇਰੀਆਂ ਜਾਂ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ, ਜਿਵੇਂ ਕਿ Google Play ਸੇਵਾਵਾਂ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਉਹਨਾਂ ਡਿਵਾਈਸਾਂ ਜਾਂ ਕਸਟਮ ਰੋਮਾਂ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ ਜਿਨ੍ਹਾਂ ਵਿੱਚ Google ਐਪਸ ਸਥਾਪਿਤ ਨਹੀਂ ਹਨ। + +## ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ + +* 4K ਤੱਕ ਰੈਜ਼ੋਲਿਊਸ਼ਨ 'ਤੇ ਵੀਡੀਓ ਵੇਖੋ +* ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਆਡੀਓ ਸੁਣੋ, ਡਾਟਾ ਬਚਾਉਣ ਲਈ ਸਿਰਫ਼ ਆਡੀਓ ਸਟ੍ਰੀਮ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ +* ਪੌਪਅੱਪ ਮੋਡ (ਫਲੋਟਿੰਗ ਪਲੇਅਰ, ਉਰਫ ਪਿਕਚਰ-ਇਨ-ਪਿਕਚਰ) +* ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਵੇਖੋ/ਸੁਣੋ +* ਸਬਟਾਈਟਲ/ ਕਲੋਜ਼ਡ ਕੈਪਸ਼ਨਾਂ ਵਿਖਾਓ/ਲੁਕਾਓ +* ਵੀਡੀਓ ਅਤੇ ਆਡੀਓਜ਼ ਖੋਜੋ (ਯੂਟਿਊਬ 'ਤੇ, ਤੁਸੀਂ ਸਮੱਗਰੀ ਦੀ ਭਾਸ਼ਾ ਵੀ ਨਿਰਧਾਰਤ ਕਰ ਸਕਦੇ ਹੋ) +* ਵੀਡੀਓਜ਼ ਨੂੰ ਕਤਾਰਬੱਧ ਕਰੋ /ਵੇਖੋ (ਅਤੇ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਉਹਨਾਂ ਨੂੰ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਵਜੋਂ ਸੁਰੱਖਿਅਤ ਕਰੋ) +* ਵੀਡੀਓਜ਼ ਬਾਰੇ ਆਮ ਜਾਣਕਾਰੀ ਵਿਖਾਓ/ਛੁਪਾਓ (ਜਿਵੇਂ ਕਿ ਵਰਣਨ ਅਤੇ ਟੈਗਸ) +* ਅਗਲੇ/ਸਬੰਧਤ ਵੀਡੀਓ ਵਿਖਾਓ/ਲੁਕਾਓ +* ਟਿੱਪਣੀਆਂ ਵਿਖਾਓ/ਲੁਕਾਓ +* ਵੀਡੀਓ, ਆਡੀਓ, ਚੈਨਲ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ ਐਲਬਮਾਂ ਖੋਜੋ +* ਇੱਕ ਚੈਨਲ ਦੇ ਅੰਦਰ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਬ੍ਰਾਊਜ਼ ਕਰੋ +* ਚੈਨਲਾਂ ਨੂੰ ਸਬਸਕਰਾਈਬ ਕਰੋ(ਹਾਂ, ਕਿਸੇ ਵੀ ਖਾਤੇ ਵਿੱਚ ਲੌਗਇਨ ਕੀਤੇ ਬਿਨਾਂ!) +* ਤੁਹਾਡੇ ਦੁਆਰਾ ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਗਏ ਚੈਨਲਾਂ ਤੋਂ ਨਵੇਂ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ +* ਚੈਨਲ ਸਮੂਹ ਬਣਾਓ ਅਤੇ ਸੰਪਾਦਿਤ ਕਰੋ (ਆਸਾਨ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਤੇ ਪ੍ਰਬੰਧਨ ਲਈ) +* ਤੁਹਾਡੇ ਚੈਨਲ ਸਮੂਹਾਂ ਤੋਂ ਤਿਆਰ ਵੀਡੀਓ ਫੀਡਾਂ ਨੂੰ ਬ੍ਰਾਊਜ਼ ਕਰੋ +* ਆਪਣਾ ਵੇਖੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦਾ ਇਤਿਹਾਸ ਵੇਖੋ ਅਤੇ ਖੋਜੋ +* ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਖੋਜੋ ਅਤੇ ਵੇਖੋ (ਇਹ ਰਿਮੋਟ ਪਲੇਲਿਸਟਾਂ ਹਨ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਉਹ ਤੁਹਾਡੇ ਦੁਆਰਾ ਬ੍ਰਾਊਜ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਸੇਵਾ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ) +* ਖੁਦ ਦੀਆਂ ਸਥਾਨਕ ਪਲੇਲਿਸਟਸ ਬਣਾਓ ਅਤੇ ਸੰਪਾਦਿਤ ਕਰੋ (ਇਹ ਐਪ ਦੇ ਅੰਦਰ ਬਣਾਈਆਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਅਤੇ ਇਹਨਾਂ ਦਾ ਕਿਸੇ ਸੇਵਾ ਨਾਲ ਕੋਈ ਲੈਣਾ-ਦੇਣਾ ਨਹੀਂ ਹੈ) +* ਵੀਡੀਓ/ਆਡੀਓ/ਸਬਟਾਈਟਲ (ਕਲੋਜ਼ਡ ਕੈਪਸ਼ਨਾਂ ) ਡਾਊਨਲੋਡ ਕਰੋ +* Kodi ਵਿੱਚ ਵੀਡੀਓ ਨੂੰ ਖੋਲ੍ਹੋ +* ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਵੇਖੋ /ਬਲਾਕ ਕਰੋ + +## ਇੰਸਟਾਲੇਸ਼ਨ ਅਤੇ ਅੱਪਡੇਟ +ਤੁਸੀਂ ਹੇਠਾਂ ਦਿੱਤੇ ਤਰੀਕਿਆਂ ਵਿੱਚੋਂ ਇੱਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਨਿਊਪਾਈਪ ਨੂੰ ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ: + 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 ਤੋਂ ਡੇਟਾ ਆਯਾਤ ਕਰੋ + +ਨੋਟ: ਜਦੋਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਵਿੱਚ ਇੱਕ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਹਮੇਸ਼ਾਂ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇਹ ਉਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਇਲਾਵਾ ਕਿਸੇ ਏਪੀਕੇ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤੇ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਚੀਜ਼ਾਂ ਨੂੰ ਤੋੜ ਸਕਦਾ ਹੈ। ਅਜਿਹੀ ਕਾਰਵਾਈ ਅਸਮਰਥਿਤ ਹੈ, ਅਤੇ ਤੁਹਾਨੂੰ ਅਜਿਹਾ ਉਦੋਂ ਹੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਯਕੀਨ ਹੋਵੇ ਕਿ ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਕੀ ਕਰ ਰਹੇ ਹੋ। + +## ਯੋਗਦਾਨ + +ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ, ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਤਬਦੀਲੀਆਂ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਇੱਥੋਂ ਤੱਕ ਕਿ ਵੱਡੀਆਂ ਕੋਡ ਤਬਦੀਲੀਆਂ ਹੋਣ, ਮਦਦ ਦਾ ਹਮੇਸ਼ਾ ਸਵਾਗਤ ਹੈ। ਐਪ ਹਰੇਕ ਯੋਗਦਾਨ ਦੇ ਨਾਲ ਬਿਹਤਰ ਹੋ ਜਾਂਦੀ ਹੈ, ਚਾਹੇ ਉਹ ਕਿੰਨਾ ਵੱਡਾ ਜਾਂ ਛੋਟਾ ਹੋਵੇ! + +ਜੇਕਰ ਤੁਸੀਂ ਯੋਗਦਾਨ ਪਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਸਾਡੇ [ਯੋਗਦਾਨ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ](/.github/CONTRIBUTING.md) ਨੂੰ ਵੇਖੋ। + + +Translation status + + +## ਦਾਨ +ਜੇਕਰ ਤੁਹਾਨੂੰ NewPipe ਪਸੰਦ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਦਾਨ ਭੇਜਣ ਲਈ ਸੁਆਗਤ ਹੈ। ਅਸੀਂ Liberapay ਨੂੰ ਤਰਜੀਹ ਦਿੰਦੇ ਹਾਂ, ਕਿਉਂਕਿ ਇਹ ਓਪਨ-ਸੋਰਸ ਅਤੇ ਗੈਰ-ਮੁਨਾਫ਼ਾ ਦੋਵੇਂ ਹੈ। ਨਿਊ ਪਾਈਪ ਨੂੰ ਦਾਨ ਕਰਨ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੀ [ਵੈੱਬਸਾਈਟ](https://newpipe.net/donate) 'ਤੇ ਜਾਓ। + + + + + + + +
Liberapayliberapay.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋDonate via Liberapay
+ +## ਗੋਪਨੀਅਤਾ ਨੀਤੀ + +ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਦਾ ਉਦੇਸ਼ ਵੈੱਬ-ਆਧਾਰਿਤ ਮੀਡੀਆ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਕ ਨਿੱਜੀ, ਅਗਿਆਤ ਅਨੁਭਵ ਪ੍ਰਦਾਨ ਕਰਨਾ ਹੈ। ਇਸ ਲਈ, ਇਹ ਐਪ ਤੁਹਾਡੀ ਇਜਾਜ਼ਤ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਡਾਟਾ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰਦੀ ਹੈ। 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 ਮੁਫਤ ਓਪਨ ਸੋਰਸ ਸਾਫ਼ਟਵੇਅਰ ਹੈ: ਤੁਸੀਂ ਆਪਣੀ ਮਰਜ਼ੀ ਨਾਲ ਇਸਨੂੰ ਸੁਧਾਰ ਸਕਦੇ ਹੋ, ਜਾਂਚ ਸਕਦੇ ਹੋ, ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਵਰਤ ਸਕਦੇ ਹੋ। ਖਾਸ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਇਸ ਨੂੰ ਫ੍ਰੀ ਸਾਫ਼ਟਵੇਅਰ ਫਾਊਂਡੇਸ਼ਨ ਦੁਆਰਾ ਪ੍ਰਕਾਸ਼ਿਤ [GNU ਜਨਰਲ ਪਬਲਿਕ ਲਾਈਸੈਂਸ](https://www.gnu.org/licenses/gpl.html) ਦੇ ਸੰਸਕਰਣ 3 ਜਾਂ (ਵਿਕਲਪਿਕ ਤੌਰ ਤੇ) ਬਾਅਦ ਵਾਲੇ ਕਿਸੇ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਦੀਆਂ ਸ਼ਰਤਾਂ ਦੇ ਤਹਿਤ ਮੁੜ ਵੰਡ ਸਕਦੇ ਹੋ ਅਤੇ/ਜਾਂ ਸੋਧ ਸਕਦੇ ਹੋ। diff --git a/doc/README.pl.md b/doc/README.pl.md index 246a86c8ea9..96d4931532c 100644 --- a/doc/README.pl.md +++ b/doc/README.pl.md @@ -10,33 +10,33 @@ -


ScreenshotyOpisFunkcjeInstalacja i aktualizacjeWkładWesprzyjLicencja

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), [Српски](README.sr.md) , [العربية](README.ar.md)* -UWAGA: TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. - -PUBLIKOWANIE NEWPIPE LUB JAKIEGOKOLWIEK JEGO FORKU W SKLEPIE PLAY NARUSZA ICH WARUNKI UŻYTKOWANIA. +> [!warning] +> TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. +> +> PUBLIKOWANIE NEWPIPE LUB JAKIEGOKOLWIEK JEGO FORKU W SKLEPIE PLAY NARUSZA ICH WARUNKI UŻYTKOWANIA. ## Screenshoty -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../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 @@ -112,21 +112,11 @@ Jeśli chcesz pomóc, przeczytaj [Notkę o wkładzie](../.github/CONTRIBUTING.md Jeśli podoba Ci się NewPipe, bardzo ucieszylibyśmy się z dotacji. Możesz wysłać bitcoin lub przekazać darowiznę przez Bountysource lub Liberapay. Po więcej informacji o darowiznach dla NewPipe, proszę zobacz naszą [stronę](https://newpipe.net/donate). - - - - - - - - - -
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
## Polityka prywatności diff --git a/doc/README.pt_BR.md b/doc/README.pt_BR.md index f0512c69245..da6c4fce6bb 100644 --- a/doc/README.pt_BR.md +++ b/doc/README.pt_BR.md @@ -1,3 +1,6 @@ +

Nós estamos planejando reescrever grandes pedaços do código base, para gerar um novo, moderno e estável NewPipe!

+

Por favor, não abra solicitações de pull para novos recursos por enquanto, apenas correções de bugs serão aceitas.

+

NewPipe

@@ -11,121 +14,112 @@ -


-

ScreenshotsDescriçãoCaracterísticasAtualizaçõesContribuiçãoDoarLicença

+

ScreenshotsServiços SuportadosDescriçãoRecursosInstalação e atualizaçõesContribuiçõesDoarLicença

SiteBlogFAQPress


-*Read this in other languages: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* - -AVISO: ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB. +*Leia esse documento em outras línguas: [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), [Српски](README.sr.md), [العربية](README.ar.md)* -COLOCAR NEWPIPE OU QUALQUER FORK DELE NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES. +> [!warning] +> ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB PREENCHENDO O MODELO. +> +> COLOCAR NEWPIPE, OU QUALQUER FORK DELE, NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES. ## Screenshots -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/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) -## Descrição +### Serviços Suportados -O NewPipe não usa nenhuma biblioteca de framework do Google, nem a API do YouTube. Os sites são apenas analisados para obter informações necessárias, para que este aplicativo possa ser usado em dispositivos sem os serviços do Google instalados. Além disso, você não precisa de uma conta no YouTube para usar o NewPipe, que é um software livre com copyleft. - -### Características - -* Procurar vídeos -* Exibir informações gerais sobre vídeos -* Assista aos vídeos do YouTube -* Ouça vídeos do YouTube -* Modo popup (player flutuante) -* Selecione o player para assistir streaming -* Baixar vídeos -* Baixar somente áudio -* Abrir vídeo no Kodi -* Mostrar vídeos próximos/relacionados -* Pesquise no YouTube em um idioma específico -* Assistir/Bloquear material restrito -* Exibir informações gerais sobre canais -* Pesquisar canais -* Assista a vídeos de um canal -* Suporte Orbot/Tor (ainda não diretamente) -* Suporte 1080p/2K/4K -* Ver histórico -* Inscreva-se nos canais -* Procurar histórico -* Porcurar/Assistir playlists -* Assistir playlists em fila -* Vídeos em fila -* Playlists Local -* Legenda -* Suporte a live -* Mostrar comentários +Atualmente, os serviços suportados são: -### Serviços Suportados +* YouTube ([site](https://www.youtube.com/)) e YouTube Music ([site](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([site](https://joinpeertube.org/)) e todas suas instâncias (abra o site para saber o que isso significa!) ([wiki](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([site](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([site](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([site](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +Como você pode ver, o NewPipe suporta múltiplos serviços de vídeo e áudio. Embora tenha começado com o YouTube, outras pessoas adicionaram mais serviços ao longo dos anos, tornando o NewPipe cada vez mais versátil! -O NewPipe suporta vários serviços. Nosso [documentação](https://teamnewpipe.github.io/documentation/) fornecer mais informações sobre como um novo serviço pode ser adicionado ao aplicativo e ao extrator. Por favor, entre em contato conosco se você pretende adicionar um novo. Atualmente, os serviços suportados são: +Parcialmente devido as circustâncias e a sua popularidade, o YouTube tem o melhor suporte em relação a esses serviços. Se você usa ou é familarizado com qualquer um desses serviços, por favor ajude-nos a melhorar o suporte para eles! Estamos procurando mantenedores para o SoundCloud e o PeerTube. -* YouTube -* SoundCloud \[beta\] -* media.ccc.de \[beta\] -* PeerTube instances \[beta\] -* Bandcamp \[beta\] +Se você pretende adicionar um novo serviço, por favor entre em contato conosco primeiro! Nossa [documentação](https://teamnewpipe.github.io/documentation/) traz mais informações em como um novo serviço pode ser adicionado ao aplicativo e no [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). -## Atualizações -Quando uma alteração no código NewPipe (devido à adição de recursos ou fixação de bugs), eventualmente ocorrerá uma versão. Estes estão no formato x.xx.x . A fim de obter esta nova versão, você pode: - 1. Construa um APK de depuração você mesmo. Esta é a maneira mais rápida de obter novos recursos em seu dispositivo, mas é muito mais complicado, por isso recomendamos usar um dos outros métodos. - 2. Adicione nosso repo personalizado ao F-Droid e instale-o a partir daí assim que publicarmos um lançamento. As instruções estão aqui.: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ - 3. Baixe o APK do [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e instalá-lo assim que publicarmos um lançamento. - 4. Atualização via F-droid. Este é o método mais lento para obter atualizações, pois o F-Droid deve reconhecer alterações, construir o próprio APK, assiná-lo e, em seguida, enviar a atualização para os usuários. +## Descrição -Recomendamos o método 2 para a maioria dos usuários. Os APKs instalados usando o método 2 ou 3 são compatíveis entre si, mas não com aqueles instalados usando o método 4. Isso se deve à mesma chave de assinatura (nossa) sendo usada para 2 e 3, mas uma chave de assinatura diferente (F-Droid's) está sendo usada para 4. Construir um APK depuração usando o método 1 exclui totalmente uma chave. Assinar chaves ajudam a garantir que um usuário não seja enganado para instalar uma atualização maliciosa em um aplicativo. +NewPipe funciona buscando os dados necessários da API oficial (ex. PeerTube) ou do serviço que você está usando. Se a API oficial é restrita (ex. YouTube) para nossos propósitos, ou é proprietária, o aplicativo analisa o site ou usa uma API interna. Isso significa que não é preciso ter uma conta de qualquer serviço para usar o NewPipe. + +Também, desde que somos um software livre e de código aberto, nem o aplicativo e nem o Extractor usa qualquer biblioteca ou framework proprietário, como o Google Play Services. Isso significa que você pode usar o NewPipe em dispositivos ou ROMs customizadas em que não tem os aplicativos do Google instalados. + +### Recursos + +* Assistir vídeos em resoluções de até 4K +* Escutar o áudio em segundo plano, carregando apenas o fluxo de áudio para salvar dados +* Modo popup (player flutuante, aka Picture-in-Picture) +* Assista a transmissões ao vivo +* Mostrar/esconder legendas/closed captions +* Buscar vídeos e áudios (no YouTube, você pode especificar o conteúdo da linguagem também) +* Enfileirar vídeos (e opcionalmente salvar eles como playlists locais) +* Mostrar/esconder informações gerais sobre os vídeos (como descrições e tags) +* Mostrar/esconder vídeos próximos/relacionados +* Mostrar/esconder comentários +* Buscar vídeos, áudios, canais, playlists e álbuns +* Navegar vídeos e áudios dentro de um canal +* Inscrever-se a canais (sim, mesmo se não estiver logado a qualquer conta!) +* Receba notificações sobre novos vídeos de canais em que você está inscrito +* Crie e edite grupos de canais (para facilitar a navegação e o gerenciamento) +* Navege feeds de vídeo gerados a partir dos seus grupos de canais +* Veja e pesquise seu histórico de vídeos +* Pesquise e assista playlists (Eles são playlists remotas, o que significa que eles serão obtidos do serviço que você está navegando) +* Crie e edite playlists locais (Eles são criados e salvos no aplicativo, e não são relacionados com nenhum serviço) +* Baixe vídeos/áudios/legendas (closed captions) +* Abra no Kodi +* Assista/Bloqueie material restrito + +## Instalação e atualizações +Você pode instalar NewPipe com um dos seguintes métodos: + 1. Adicione nosso repo personalizado ao F-Droid e instale-o a partir daí. As instruções estão aqui: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Baixe o APK aqui no [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e instalá-lo assim que publicarmos um lançamento. + 3. Atualização via F-droid. Este é o método mais lento para obter atualizações, pois o F-Droid deve reconhecer alterações, construir o próprio APK, assiná-lo e, em seguida, enviar a atualização para os usuários. + 4. Construa um APK de depuração você mesmo. Esta é a maneira mais rápida de obter novos recursos em seu dispositivo, mas é muito mais complicado, por isso recomendamos usar um dos outros métodos. + 5. Se você estiver interessado em um recurso específico ou uma correção de bug fornecido em uma solicitação de Pull nesse repositório, pode instalar o APK a partir de lá. Leia a descrição da solicitação para instruções. A grande vantagem dos APKs específicos de S.P é que eles são instalados lado a lado com o aplicativo oficial, então você não precisa se preocupar em perder seus dados ou estragar alguma coisa. + +Recomendamos o método 1 para a maioria dos usuários. Os APKs instalados usando o método 1 ou 2 são compatíveis entre si (o que significa que se você instalou o NewPipe usando o método 1 ou 2, você também pode atualizar o NewPipe usando o outro), mas não com aqueles instalados usando o método 3. Isso se deve à mesma chave de assinatura (nossa) sendo usada para 1 e 2, mas uma chave de assinatura diferente (F-Droid's) está sendo usada para 3. Construir um APK depuração usando o método 4 exclui totalmente uma chave. Assinar chaves ajudam a garantir que um usuário não seja enganado para instalar uma atualização maliciosa em um aplicativo. Ao usar o método 5, cada APK é assinado com uma chave aleatória diferente fornecida pelo GitHub Actions, portanto você não pode nem mesmo atualizá-lo. Você terá que fazer backup e restaurar os dados do aplicativo sempre que desejar usar um novo APK. Enquanto isso, se você quiser trocar de fontes por algum motivo (por exemplo, a funcionalidade principal do NewPipe foi quebrada e o F-Droid ainda não tem a atualização), recomendamos seguir este procedimento: -1. Faça backup de seus dados através de Configurações > Conteúdo > Exportar Base de Dados para que você mantenha seu histórico, inscrições e playlists +1. Faça backup de seus dados através de Configurações > Backup e Restauração > Exportar Base de Dados para que você mantenha seu histórico, inscrições e playlists 2. Desinstale o NewPipe 3. Baixe o APK da nova fonte e instale-o -4. Importe os dados da etapa 1 via Configurações > Conteúdo > Inportar Banco de Dados - -## Contribuição -Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda. -Quanto mais for feito, melhor fica! +4. Importe os dados da etapa 1 via Configurações > Backup e Restauração > Importar Base de Dados -Se você quiser se envolver, verifique nossa [notas de contribuição](../.github/CONTRIBUTING.md). +## Contribuições +Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda. O aplicativo fica cada vez melhor a cada contribuição, não importa quão grande ou pequena! Se você quiser se envolver, verifique nossas [notas de contribuição](/.github/CONTRIBUTING.md). -Translation status +Estado da tradução ## Doar -Se você gosta de NewPipe, ficaríamos felizes com uma doação. Você pode enviar bitcoin ou doar via Bountysource ou Liberapay. Para obter mais informações sobre como doar para a NewPipe, visite nosso [site](https://newpipe.net/donate). +Se você gosta do NewPipe, pode enivar uma doação. Nós preferimos Liberapay, pois é de código aberto e sem fins lucrativos. Para mais informações sobre como doar para o NewPipe, visite nosso [site](https://newpipe.net/donate). - - - - - - - - - - - - + +
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.Visite NewPipe em liberapay.comDoar via Liberapay
diff --git a/doc/README.ro.md b/doc/README.ro.md index 0ee7e44ece8..29c1d3666b4 100644 --- a/doc/README.ro.md +++ b/doc/README.ro.md @@ -10,33 +10,33 @@ -


Capturi de ecranDescriereFuncţiiInstalare şi actualizăriContribuţieDonaţiLicenţă

WebsiteBlogFAQPresă


-*Citiţi în alte limbi: [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), [Српски](README.sr.md) , [العربية](README.ar.md)* -Atenţionare: ACEASTA ESTE O VERSIUNE BETA, AŞA CĂ S-AR PUTE SĂ ÎNTÂLNIŢI ERORI. DACĂ SE ÎNTÂMPLĂ ACEST LUCRU, DESCHIDEŢI UN ISSUE PRIN REPSITORY-UL NOSTRU GITHUB. - -PUNERA NEWPIPE SAU ORICĂRUI FORK AL ACESTUIA ÎN MAGAZINUL GOOGLE PLAY LE ÎNCALCĂ TERMENII ŞI CONDIŢIILE. +> [!warning] +> ACEASTA ESTE O VERSIUNE BETA, AŞA CĂ S-AR PUTE SĂ ÎNTÂLNIŢI ERORI. DACĂ SE ÎNTÂMPLĂ ACEST LUCRU, DESCHIDEŢI UN ISSUE PRIN REPSITORY-UL NOSTRU GITHUB. +> +> PUNERA NEWPIPE SAU ORICĂRUI FORK AL ACESTUIA ÎN MAGAZINUL GOOGLE PLAY LE ÎNCALCĂ TERMENII ŞI CONDIŢIILE. ## Capturi de ecran -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/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) ## Descriere @@ -115,21 +115,11 @@ Dacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](../ Dacă vă place NewPipe, am fi bucuroşi să primim o donaţie. Puteţi să ne trimiteţi bitcoin sau să ne donaţi cu Bountysource sau Liberapay. Pentru mai multe informaţii în legătură cu donaţiile către NewPipe, vă rugăm vizitaţi [website-ul nostru](https://newpipe.net/donate). - - - - - - - - - -
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
## Politica de Confidenţialitate diff --git a/doc/README.ru.md b/doc/README.ru.md new file mode 100644 index 00000000000..e3c76d32981 --- /dev/null +++ b/doc/README.ru.md @@ -0,0 +1,133 @@ +

+

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> ЭТО ПРИЛОЖЕНИЕ НАХОДИТСЯ В СТАДИИ БЕТА, ПОЭТОМУ ВЫ МОЖЕТЕ ОБНАРУЖИТЬ ОШИБКИ. ЕСЛИ ЭТО СЛУЧИТСЯ, ОТКРОЙТЕ ВОПРОС В НАШЕМ РЕПОЗИТОРИИ 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
+ +## Политика конфиденциальности + +Целью проекта 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..2e24aa41c40 --- /dev/null +++ b/doc/README.ryu.md @@ -0,0 +1,139 @@ +

+

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), [Српски](README.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> くれーベータばんぬたみ、バグぬはっせいすがのうゆいがあいびーん。むしバグぬはっせいさーあい、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)からうにげーさびら。 + + + + + + + +
Liberapayliberapay.comっしNewPipeちゅーんLiberapayなちーふ
+ +## プライバシーポリシー +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.so.md b/doc/README.so.md index 5477401b27b..640feae60e4 100644 --- a/doc/README.so.md +++ b/doc/README.so.md @@ -10,33 +10,33 @@ -


Sawir-shaashadeedFaahfaahinWaxqabadkaKushubida iyo cusboonaysiintaKusoo KordhinUgu DeeqLaysinka

Website-kaMaqaaladaSu'aalaha Aalaa La-iswaydiiyoWarbaahinta


-*Ku akhri luuqad kale: [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), [Српски](README.sr.md) , [العربية](README.ar.md)* -DIGNIIN: MIDKAN, NOOCA APP-KA EE HADDA WALI TIJAABO AYUU KU JIRAA, SIDAA DARTEED CILLADO AYAAD LA KULMI KARTAA. HADAAD LA KULANTO, KA FUR ARIN SHARAXAYA QAYBTANADA ARRIMAHA EE GITHUB-KA. - -NEWPIPE AMA KUWA KU SALAYSAN IN PLAYSTORE-KA LA GALIYO WAXAY KA HOR IMANAYSAA SHARCIGA IYO SHURUUDAHA AY LEEYIHIIN. +> [!warning] +> MIDKAN, NOOCA APP-KA EE HADDA WALI TIJAABO AYUU KU JIRAA, SIDAA DARTEED CILLADO AYAAD LA KULMI KARTAA. HADAAD LA KULANTO, KA FUR ARIN SHARAXAYA QAYBTANADA ARRIMAHA EE GITHUB-KA. +> +> NEWPIPE AMA KUWA KU SALAYSAN IN PLAYSTORE-KA LA GALIYO WAXAY KA HOR IMANAYSAA SHARCIGA IYO SHURUUDAHA AY LEEYIHIIN. ## Sawir-shaashadeed -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/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) ## Faahfaahin @@ -110,21 +110,11 @@ Hadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](../ Hadaad jeceshahay NewPipe waan ku faraxsanaan lahayn deeq. Waxaad soo diri kartaa bitcoin ama sidoo kale waxaad deeqda kusoo diri kartaa xaga Bountysource ama Liberapay. Faahfaahin dheeraad ah oo kusaabsan ugu deeqida NewPipe, fadlan booqo [website-kanaga](https://newpipe.net/donate). - - - - - - - - - -
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
## Siyaasada Sirdhawrka diff --git a/doc/README.sr.md b/doc/README.sr.md new file mode 100644 index 00000000000..1a9118638f8 --- /dev/null +++ b/doc/README.sr.md @@ -0,0 +1,131 @@ +

Планирамо да препишемо велике делове кода, како бисмо створили нови, модеран и стабилан NewPipe!

+

Немојте сада слати захтеве за нове функције, прихватаће се само захтеви за исправљање грешака.

+ +

+

NewPipe

+

Бесплатна и лагана апликација за стримовање за Android.

+ +

Набавите на F-Droid

+ +

+ + + + + +

+
+

Снимци екранаПодржане услугеОписКарактеристикеИнсталација и ажурирањаДоприносДонацијаЛиценца

+

Веб-сајтБлогЧППШтампа

+
+ +*Прочитајте овај документ на другим језицима: [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.sr.md) , [العربية](README.ar.md)* + +> [!warning] +> ОВА АПЛИКАЦИЈА ЈЕ У БЕТА ВЕРЗИЈИ, ТАКО ДА МОЖЕТЕ НАИЋИ НА ГРЕШКЕ. АКО НАИЂЕТЕ, НАПИШИТЕ ИЗВЕШТАЈ У НАШЕМ 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 услуге. То значи да можете да користите NewPipe на уређајима или прилагођеним ROM-овима који немају инсталиране Google апликације. + +### Карактеристике + + * Гледајте видео снимке у резолуцијама до 4К + * Слушајте аудио снимке у позадини, само учитавајући аудио стрим да бисте сачували податке + * Искачући режим (плутајући плејер, познат као „Слика у слици”) + * Гледајте стримове уживо + * Прикажите/сакријте титлове/скривене титлове + * Претражујте видео и аудио снимке (на YouTube-у можете одредити и језик садржаја) + * Ставите видео снимке у ред чекања (и опционо их сачувајте као локалне плејлисте) + * Прикажите/сакријте опште информације о видео снимцима (као што су опис и ознаке) + * Прикажите/сакријте следеће/сродне видео снимке + * Прикажите/сакријте коментаре + * Претражујте видео снимке, аудио снимке, канале, плејлисте и албуме + * Прегледајте видео и аудио снимке унутар канала + * Претплатите се на канале (да, без пријављивања на било који налог!) + * Добијајте обавештења о новим видео снимцима са канала на које сте претплаћени + * Креирајте и уређујте групе канала (за лакше прегледање и управљање) + * Прегледајте фидове видео снимака генерисане из ваших група канала + * Прегледајте и претражујте историју гледања + * Претражујте и гледајте плејлисте (ово су даљинске плејлисте, што значи да се преузимају са услуге коју прегледате) + * Направите и уређујте локалне плејлисте (оне се креирају и чувају у апликацији и немају никакве везе са било којом услугом) + * Преузмите видео снимке/аудио снимке/титлове (скривене титлове) + * Отварајте у Kodi-ју + * Гледајте/блокирајте старосно ограничени материјал + +## Инсталација и ажурирања +Можете да инсталирате NewPipe користећи један од следећих начина: + 1. Додајте наш прилагођени репозиторијум на F-Droid и инсталирајте га одатле. Упутства су овде: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Преузмите APK са [GitHub издања](https://github.com/TeamNewPipe/NewPipe/releases) и инсталирајте га. + 3. Ажурирајте преко F-Droid-а. Ово је најспорији начин добијања ажурирања, јер F-Droid мора да препозна промене, да направи сам APK, да га потпише, а затим да ажурирање пошаље корисницима. + 4. Сами направите APK за отклањање грешака. Ово је најбржи начин да добијете нове функције на свом уређају, али је много компликованији, па препоручујемо да користите неки од других начина. + 5. Ако сте заинтересовани за одређену функцију или исправку грешке која се налази у захтеву за повлачење у овом репозиторијуму, такође можете преузети његов APK из захтева за повлачење. Прочитајте опис захтева за повлачење за упутства. Одлична ствар у вези са APK-овима специфичним за захтев за повлачење је то што су инсталирани упоредо са званичном апликацијом, тако да не морате да бринете да ћете изгубити своје податке или нешто забрљати. + +Препоручујемо 1. начин за већину корисника. APK-ови инсталирани коришћењем 1. или 2. начина су компатибилни један са другим (што значи да ако сте инсталирали NewPipe користећи било који 1. или 2. начин, можете, такође, да ажурирате NewPipe користећи други начин), али не и са онима инсталираним коришћењем 3. начина. То је због истог кључа за потписивање (нашег) који се користи за 1. и 2. начин, али се други кључ за потписивање (F-Droid-ови) користи за 3. начин. Израда 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). + + + + + + + +
LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
+ +## Политика приватности + +Пројекат NewPipe има за циљ да обезбеди приватно, анонимно искуство за коришћење медијских услуга заснованих на вебу. Стога, апликација не прикупља никакве податке без вашег пристанка. Политика приватности апликације NewPipe детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању или оставите коментар на нашем блогу. Документ можете пронаћи [овде](https://newpipe.net/legal/privacy/). + +## Лиценца +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe је бесплатан софтвер: можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га редистрибуирати и/или модификовати под условима [GNU General Public License](https://www.gnu.org/licenses/gpl.html), коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију. diff --git a/doc/README.tr.md b/doc/README.tr.md index 783d1b1e316..bbdd85f7634 100644 --- a/doc/README.tr.md +++ b/doc/README.tr.md @@ -10,33 +10,33 @@ -


Ekran fotoğraflarıAçıklamaÖzelliklerKurulum ve güncellemelerKatkıda bulunmaBağışLisans

Web sitesiBlogSSSBasın


-*Bu sayfayı diğer dillerde okuyun: [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), [Српски](README.sr.md) , [العربية](README.ar.md)* -UYARI: BU SÜRÜM BETA SÜRÜMÜDÜR, BU NEDENLE HATALARLA KARŞILAŞABİLİRSİNİZ. HATA BULURSANIZ BU GITHUB DEPOSUNDA BUNU BİLDİRİN. - -GOOGLE PLAY STORE'A NEWPIPE VEYA BAŞKA BİR KOPYASINI KOYMAK, PLAY STORE ŞARTLARINI VE KOŞULLARINI İHLAL EDER. +> [!warning] +> BU SÜRÜM BETA SÜRÜMÜDÜR, BU NEDENLE HATALARLA KARŞILAŞABİLİRSİNİZ. HATA BULURSANIZ BU GITHUB DEPOSUNDA BUNU BİLDİRİN. +> +> GOOGLE PLAY STORE'A NEWPIPE VEYA BAŞKA BİR KOPYASINI KOYMAK, PLAY STORE ŞARTLARINI VE KOŞULLARINI İHLAL EDER. ## Ekran görüntüleri -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/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) ## Açıklama @@ -114,21 +114,11 @@ Eğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız no NewPipe'ı beğendiyseniz, yapacağınız bağışlar bizi motive eder. Bitcoin gönderebilir veya Bountysource veya Liberapay aracılığıyla bağış yapabilirsiniz. NewPipe'a bağış yapma hakkında daha fazla bilgi için lütfen [web sitemizi](https://newpipe.net/donate) ziyaret edin. - - - - - - - - - -
BitcoinBitcoin QR kodu16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay liberapay.com üzerinde NewPipe'ı ziyaret edin Liberapay aracılığıyla bağış yapın
Bountysourcebountysource.com üzerinde NewPipe'ı ziyaret edinNe kadar ödül kazanabileceğinizi kontrol edin.
## Gizlilik politikası diff --git a/doc/README.zh_TW.md b/doc/README.zh_TW.md index 83267b65bfd..760a43ad57a 100644 --- a/doc/README.zh_TW.md +++ b/doc/README.zh_TW.md @@ -10,34 +10,34 @@ -


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

網站部落格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](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), [Српски](README.sr.md) , [العربية](README.ar.md)* -警告:這是測試版本,可能會發生錯誤。如果遇到錯誤,請在我們的 GITHUB REPO 開 ISSUE 回報。 - -將 NEWPIPE 或其任何分支上傳至 GOOGLE PLAY 商店違反了他們的使用者合約。 +> [!warning] +> 這是測試版本,可能會發生錯誤。如果遇到錯誤,請在我們的 GITHUB REPO 開 ISSUE 回報。 +> +> 將 NEWPIPE 或其任何分支上傳至 GOOGLE PLAY 商店違反了他們的使用者合約。 ## 截圖 -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) +[](../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) ## 說明 @@ -120,21 +120,11 @@ NewPipe 支援多種服務。我們的[使用文件](https://teamnewpipe.github. 若你喜歡 NewPipe 我們歡迎捐款。你可以使用 bitcoin ,也能在 Bountysource 或 Liberapay 上捐款。 更多關於捐款資訊,請見我們的[網站](https://newpipe.net/donate)。 - - - - - - - - - -
BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
## 隱私權政策 diff --git a/fastlane/metadata/android/ar/changelogs/1000.txt b/fastlane/metadata/android/ar/changelogs/1000.txt new file mode 100644 index 00000000000..225a9e11a2a --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/1000.txt @@ -0,0 +1,13 @@ +تحسنت +• جعل وصف قائمة التشغيل قابلاً للنقر لإظهار محتوى أكثر / أقل +• [PeerTube] تعامل مع روابط مثيل "subscribeto.me" تلقائيًا +• ابدأ تشغيل عنصر واحد فقط في شاشة المحفوظات + +ثابت +• إصلاح رؤية زر RSS +• إصلاح أعطال معاينة شريط البحث +• إصلاح قائمة التشغيل لعنصر بدون صورة مصغرة +• إصلاح الخروج من مربع حوار التنزيل قبل ظهوره +• إصلاح العناصر ذات الصلة قائمة الانتظار المنبثقة +• إصلاح الترتيب في مربع حوار الإضافة إلى قائمة التشغيل +• ضبط تخطيط عنصر الإشارة المرجعية لقائمة التشغيل diff --git a/fastlane/metadata/android/ar/changelogs/63.txt b/fastlane/metadata/android/ar/changelogs/63.txt index 00c428bdaf2..e2315acbb09 100644 --- a/fastlane/metadata/android/ar/changelogs/63.txt +++ b/fastlane/metadata/android/ar/changelogs/63.txt @@ -1,8 +1,8 @@ ### تحسينات -- إعدادات الاستيراد / التصدير # 1333 -- تقليل السحب الزائد (تحسين الأداء) # 1371 -- تحسينات التعليمات البرمجية الصغيرة # 1375 -- أضف كل شيء عن اللائحة العامة لحماية البيانات رقم 1420 +- إعدادات الاستيراد / التصدير #1333 +- تقليل السحب الزائد (تحسين الأداء) #1371 +- تحسينات التعليمات البرمجية الصغيرة #1375 +- أضف كل شيء عن اللائحة العامة لحماية البيانات رقم #1420 ### مثبت -- أداة التنزيل: إصلاح التعطل عند تحميل التنزيلات غير المكتملة من ملفات .جيغا # 1407 +- أداة التنزيل: إصلاح التعطل عند تحميل التنزيلات غير المكتملة من ملفات .جيغا #1407 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/71.txt b/fastlane/metadata/android/ar/changelogs/71.txt index 6c02247bbc6..338ab17c5e5 100644 --- a/fastlane/metadata/android/ar/changelogs/71.txt +++ b/fastlane/metadata/android/ar/changelogs/71.txt @@ -1,10 +1,10 @@ -### تحسينات -* إضافة إشعار تحديث التطبيق لبناء GitHub (#1608 بواسطة krtkush) -* تحسينات مختلفة على برنامج التنزيل (# 1944 بواسطة kapodamy): - * إضافة الرموز البيضاء المفقودة واستخدام طريقة hardcored لتغيير ألوان الرمز - * تحقق مما إذا كان المكرر قد تمت تهيئته (إصلاحات #2031) - * السماح بإعادة المحاولة مع ظهور خطأ "فشلت المعالجة اللاحقة" في muxer الجديد - * MPEG-4 muxer الجديد الذي يعمل على تثبيت تدفقات الفيديو والصوت غير المتزامنة (#2039) +تحسين +*إضافة إشعار تحديث التطبيق لبناء GitHub (#1608 بواسطة krtkush) +*تحسينات مختلفة على برنامج التنزيل(#1944 بواسطة kapodamy): + *إضافة الرموز البيضاء المفقودة واستخدام طريقة hardcored لتغيير ألوان الرمز + *تحقق مما إذا كان المكرر قد تمت تهيئته(إصلاحات #2031) + *السماح بإعادة المحاولة مع ظهور خطأ "فشلت المعالجة اللاحقة" في muxer الجديد + *MPEG-4 muxer جديد يعمل على تثبيت تدفقات الفيديو والصوت غير المتزامنة(#2039) -### ثابت -* توقف البث المباشر على YouTube عن التشغيل بعد وقت قصير (#1996 by @yausername) +تصليح +*توقف البث المباشر على يوتيوب عن التشغيل بعد وقت قصير(#1996 by @yausername) 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/991.txt b/fastlane/metadata/android/ar/changelogs/991.txt new file mode 100644 index 00000000000..5eaebe7a979 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/991.txt @@ -0,0 +1,13 @@ +جديد +• إضافة زر "فتح في المتصفح" على واجهة الخطأ +• إضافة خيار لعرض مجموعات القنوات على شكل قائمة +• [YouTube] ضغطة مطولة على مقاطع الدفق لمشاركة رابط URL مع الطابع الزمني +• إضافة زر قائمة انتظار التشغيل للمشغل الصغير + +تحسينات +• إضافة الترجمة الأيسلندية وتحديث العديد من الترجمات الأخرى +• العديد من التحسينات الداخلية + +تصليحات +• إصلاح أعطاب متعددة +• [YouTube] إصلاح مشكلات تحميل القنوات، وتحميل التغذية غير المخصصة، والتشغيل البديل في بعض البلدان 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/ar/changelogs/995.txt b/fastlane/metadata/android/ar/changelogs/995.txt new file mode 100644 index 00000000000..3995ca6eb04 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/995.txt @@ -0,0 +1,16 @@ +جديد +• دعم علامات التبويب القناة +• تحديد جودة الصورة +• الحصول على العناوين لجميع الصور + +تحسين +• إمكانية الوصول إلى واجهات المشغل +• اختيار أفضل للصوت لتنزيلات الفيديو فقط +• خيار لتضمين قائمة التشغيل وأسماء الفيديو لمحتوى قائمة التشغيل المشتركة + +مُثَبَّت +• [يوتيوب] إصلاح جلب عدد الإعجابات +• إصلاح عدم استجابة المشغل للنوافذ المنبثقة والأعطال +• اختيار لغات خاطئة في منتقي اللغة +• تركيز صوت المشغل لم يكن يحترم كتم الصوت +• إضافة عنصر قائمة التشغيل لا يعمل في بعض الأحيان diff --git a/fastlane/metadata/android/ar/changelogs/996.txt b/fastlane/metadata/android/ar/changelogs/996.txt new file mode 100644 index 00000000000..1dd4e3de593 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/996.txt @@ -0,0 +1,2 @@ +تم إصلاح NullPointerException عند فتح قناة / مؤتمر في media.ccc.de. +حاول احدهم كسر الهدية التي قدمناها لك، لكننا تخطينا الأمر. diff --git a/fastlane/metadata/android/ar/changelogs/997.txt b/fastlane/metadata/android/ar/changelogs/997.txt new file mode 100644 index 00000000000..f338558a18b --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/997.txt @@ -0,0 +1,17 @@ +جديد +• إضافة ردود التعليق +• السماح بإعادة ترتيب قوائم التشغيل +• عرض وصف قائمة التشغيل ومدتها +• السماح بإعادة ضبط الإعدادات + +تحسين +• [Android 13+] استعادة إجراءات الإشعارات المخصصة +• طلب الموافقة للتحقق من التحديث +• السماح بتشغيل/إيقاف الإشعارات مؤقتًا أثناء التخزين المؤقت +• إعادة ترتيب بعض الإعدادات + +مُثَبَّت +• [YouTube] إصلاح مشكلة عدم تحميل التعليقات، بالإضافة إلى إصلاحات وتحسينات أخرى +• حل مشكلة عدم الحصانة في إعدادات الاستيراد والتحويل إلى JSON +• إصلاحات التنزيل المختلفة +• تقليم نص البحث diff --git a/fastlane/metadata/android/ar/changelogs/998.txt b/fastlane/metadata/android/ar/changelogs/998.txt new file mode 100644 index 00000000000..81a2d43dfac --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/998.txt @@ -0,0 +1,4 @@ +تم إصلاح عدم تشغيل YouTube لأي بث بسبب أخطاء HTTP 403. + +لم يتم إصلاح أخطاء HTTP 403 العرضية في منتصف مقطع فيديو YouTube بعد. +ستتم معالجة هذه المشكلة في إصدار إصلاح عاجل آخر في أقرب وقت ممكن. diff --git a/fastlane/metadata/android/ar/changelogs/999.txt b/fastlane/metadata/android/ar/changelogs/999.txt new file mode 100644 index 00000000000..6192536ba5c --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/999.txt @@ -0,0 +1,12 @@ +يعمل إصدار الإصلاح الجديد هذا على إصلاح أخطاء HTTP 403 في منتصف مقاطع فيديو YouTube. + +جديد +• [SoundCloud] إضافة دعم لعناوين URL الخاصة بـ on.soundcloud.com + +تحسنت +• [Bandcamp] عرض معلومات إضافية في كشك الراديو + +ثابت +• [YouTube] إصلاح أخطاء HTTP 403 العرضية في بداية مقاطع الفيديو أو في منتصفها +• [YouTube] استخراج الصورة الرمزية والشعار من المزيد من أنواع رؤوس القنوات +• [Bandcamp] إصلاح الأخطاء المختلفة واستخدام HTTPS دائمًا diff --git a/fastlane/metadata/android/ar_LY/changelogs/64.txt b/fastlane/metadata/android/ar_LY/changelogs/64.txt index bb2e2f3fdc5..df02d11662d 100644 --- a/fastlane/metadata/android/ar_LY/changelogs/64.txt +++ b/fastlane/metadata/android/ar_LY/changelogs/64.txt @@ -3,5 +3,6 @@ - تذكر السطوع للدورة # 1442 - تحسين أداء التنزيل لوحدات المعالجة المركزية الأضعف # 1431 - إضافة (العمل) دعم الدورة الإعلامية # 1433 + ### إصلاح - فيكس تحطم على فتح التنزيلات (فيكس متاحة الآن ليبني الإصدار) #1441 diff --git a/fastlane/metadata/android/az/changelogs/989.txt b/fastlane/metadata/android/az/changelogs/989.txt new file mode 100644 index 00000000000..cb32456dc4d --- /dev/null +++ b/fastlane/metadata/android/az/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] İstənilən videonu oynatmağa cəhd edilərkən sonsuz tüklənmə düzəldildi +• [YouTube] Bəzi videolarda yavaşılama aradan qaldırıldı +• jsoup kitabxanası 1.15.3 versiyasına qədər yeniləndi, buraya da təhlükəsizlik riskləri aradan qaldırılması da daxildir diff --git a/fastlane/metadata/android/az/changelogs/998.txt b/fastlane/metadata/android/az/changelogs/998.txt new file mode 100644 index 00000000000..16a2e101364 --- /dev/null +++ b/fastlane/metadata/android/az/changelogs/998.txt @@ -0,0 +1 @@ +YouTube-un heç bir yayım oynatmaması düzəldildi diff --git a/fastlane/metadata/android/az/changelogs/999.txt b/fastlane/metadata/android/az/changelogs/999.txt new file mode 100644 index 00000000000..16a2e101364 --- /dev/null +++ b/fastlane/metadata/android/az/changelogs/999.txt @@ -0,0 +1 @@ +YouTube-un heç bir yayım oynatmaması düzəldildi 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/63.txt b/fastlane/metadata/android/be/changelogs/63.txt new file mode 100644 index 00000000000..8583daa68a0 --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/63.txt @@ -0,0 +1,8 @@ +### Паляпшэнні +- Імпарт/экспарт налад #1333 +- Зменшана перамалёўка (аптымізацыя прадуктыўнасці) #1371 +- Невялікія паляпшэнні кода #1375 +- Дададзена ўсё пра GDPR #1420 + +### Выпраўлена +- Загрузчык: Выпраўленне збою пры загрузцы незавершаных загрузак з .giga файлаў #1407 diff --git a/fastlane/metadata/android/be/changelogs/64.txt b/fastlane/metadata/android/be/changelogs/64.txt new file mode 100644 index 00000000000..ad5606b6fae --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/64.txt @@ -0,0 +1,8 @@ +### Паляпшэнні +- Дададзена магчымасць абмежаваць якасць відэа пры выкарыстанні мабільных дадзеных. #1339 +- Запамінанне яркасці для сесіі #1442 +- Паляпшенне прадуктыўнасці загрузкі для слабых працэсараў #1431 +- Дададзена (працоўная) падтрымка медыя-сесіі #1433 + +### Выпраўленне +- Выпраўленне збою пры адкрыцці загрузак (выпраўленне зараз даступна для рэлізных зборак) #1441 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/be/changelogs/992.txt b/fastlane/metadata/android/be/changelogs/992.txt new file mode 100644 index 00000000000..20c8a7b1a2f --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/992.txt @@ -0,0 +1,17 @@ +Новае +- Колькасць падпісчыкаў у дэталях відэа +- Загрузка з чаргі +- Сталая ўсталёўка мініяцюры плэйліста +- Доўгі націск на хэштэгі і спасылкі +- Карткавы рэжым прагляду + +Паляпшэнні +- Павялічаная кнопка зачынення міні-плэера +- Больш плаўнае змяншэнне памеру мініяцюр +- Мэтавая версія Android 13 (API 33) +- Пошук больш не ставіць плэера на паўзу + +Выпраўленні +- Выпраўленне накладання на DeX/мыш +- Дазволены фонавы плэер без асобных аўдыятрансляцый +- Розныя выпраўленні YouTube і гэтак далей… diff --git a/fastlane/metadata/android/be/full_description.txt b/fastlane/metadata/android/be/full_description.txt new file mode 100644 index 00000000000..6ce0c696340 --- /dev/null +++ b/fastlane/metadata/android/be/full_description.txt @@ -0,0 +1 @@ +NewPipe не выкарыстоўвае бібліятэкі фрэймворку Google ці API YouTube. Ён толькі аналізуе вэб-сайт, каб атрымаць неабходную інфармацыю. Таму гэтую праграму можна выкарыстоўваць на прыладах без усталяваных сэрвісаў Google. Акрамя таго, вам не патрэбен уліковы запіс YouTube, каб выкарыстоўваць NewPipe, гэта вольнае і адкрытае праграмнае забеспячэнне. diff --git a/fastlane/metadata/android/be/short_description.txt b/fastlane/metadata/android/be/short_description.txt index d689c171322..0fb9121492e 100644 --- a/fastlane/metadata/android/be/short_description.txt +++ b/fastlane/metadata/android/be/short_description.txt @@ -1 +1 @@ -Свабодны і лёгкі кліент Youtube для Android. +Вольны і лёгкі кліент YouTube для Android. diff --git a/fastlane/metadata/android/bg/changelogs/64.txt b/fastlane/metadata/android/bg/changelogs/64.txt new file mode 100644 index 00000000000..0323e8f2577 --- /dev/null +++ b/fastlane/metadata/android/bg/changelogs/64.txt @@ -0,0 +1,7 @@ +### Подобрения +-Добавена е възможността да се ограничи качеството на видеото ако се използва мобилен интернет. #1339. +- Запаметява яркостта за сесията #1442. +- Оптимизиране при изтегляне с по-слаби процесори #1431. + +### Поправени +- Поправен срив при отваряне на изтегления #1441 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/bn/changelogs/64.txt b/fastlane/metadata/android/bn/changelogs/64.txt index d5e5901e56f..e76c3130e3c 100644 --- a/fastlane/metadata/android/bn/changelogs/64.txt +++ b/fastlane/metadata/android/bn/changelogs/64.txt @@ -1,5 +1,5 @@ ### অগ্রগতিসমূহ -- মোবাইল ডাটা ব্যবহার করার সময় ভিডিও মানের সীমা নির্ধারণ করা যাবে। #1339। +- মোবাইল ডাটা ব্যবহার করার সময় ভিডিও মানের সীমা নির্ধারণ করা যাবে। #1339। - প্লেয়ারের উজ্জ্বলতা মনে রাখুন #1442। - দুর্বল সিপিইউর ডিভাইসে পারফরম্যান্স উন্নত করা হয়েছে #1431। - মিডিয়া সেশন এখন সঠিকভাবে কাজ করে #1433। diff --git a/fastlane/metadata/android/bn/changelogs/68.txt b/fastlane/metadata/android/bn/changelogs/68.txt new file mode 100644 index 00000000000..8f6742e848c --- /dev/null +++ b/fastlane/metadata/android/bn/changelogs/68.txt @@ -0,0 +1 @@ +https://hosted.weblate.org/translate/newpipe/metadata/bn/?checksum=2a64aca6716bd69b diff --git a/fastlane/metadata/android/cs/changelogs/1000.txt b/fastlane/metadata/android/cs/changelogs/1000.txt new file mode 100644 index 00000000000..0e90ca421dc --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/1000.txt @@ -0,0 +1,13 @@ +Vylepšeno +• Popis playlistu je klikatelný pro více/méně obsahu +• [PeerTube] Auto. zpracování odkazů instance subscribeto.me +• Spustit přehrávání pouze jedné položky v historii + +Opraveno +• Oprava viditelnosti tl. RSS +• Oprava pádů náhledů na liště videa +• Oprava přidání položky bez miniatury do playlistu +• Oprava ukončení okna stahování před jeho zobrazením +• Oprava okna seznamu souvisejících položek +• Oprava pořadí v okně přidání do playlistu +• Úprava rozložení položek záložek playlistu diff --git a/fastlane/metadata/android/cs/changelogs/66.txt b/fastlane/metadata/android/cs/changelogs/66.txt index d62f6db4fa8..3c892ffdc99 100644 --- a/fastlane/metadata/android/cs/changelogs/66.txt +++ b/fastlane/metadata/android/cs/changelogs/66.txt @@ -1,16 +1,18 @@ -# Changelog of v0.13.7 +# v0.13.17 - seznam změn -### Fixed -- Fix sort filter issues of v0.13.6 +### Opraveno +- Řazení filtrů -# Changelog of v0.13.6 +# v0.13.6 - seznam změn -### Improvements +### Vylepšeno -- Disable burgermenu icon animation #1486 -- undo delete of downloads #1472 -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 -- Library version update and database backup fix #1510 -- ExoPlayer 2.8.2 Update #1392 +- Zakázání animace tlačítka menu +- Zrušení odstranění stahování +- Možnost stažení v menu sdílení +- Sdílení v menu při dlouhém podržení +- Minimalizace hlavního přehrávače při opuštění +-Aktualizace ExoPlayer 2.8.2 + - Přepracován dialog ovládání rychlosti přehrávání + - Přidán přepínač pro rychlé přetočení v tichých částech +Další změny/opravy viz GitHub. diff --git a/fastlane/metadata/android/cs/changelogs/992.txt b/fastlane/metadata/android/cs/changelogs/992.txt new file mode 100644 index 00000000000..b45f8f73a31 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/992.txt @@ -0,0 +1,17 @@ +Novinky +• Počet odběratelů v podrobnostech videa +• Stahování z fronty +• Permanentní nastavení náhledu playlistu +• Dlouhé podržení hashtagů a odkazů +• Režim zobrazení v kartách + +Vylepšení +• Větší tlačítko k zavření minipřehrávače +• Jemnější zmenšování náhledů +• Cíl Android 13 (API 33) +• Posouvání v přehrávači jej již nezastaví + +Opravy +• Oprava překrytí s DeX/myší +• Povolení přehrávače na pozadí bez oddělených streamů zvuku +• Různé opravy YouTube a další… diff --git a/fastlane/metadata/android/cs/changelogs/993.txt b/fastlane/metadata/android/cs/changelogs/993.txt new file mode 100644 index 00000000000..2d57d44a130 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/993.txt @@ -0,0 +1,12 @@ +Nové +• Upozornění při přidávání duplicit do playlistu a tlačítko pro jejich odstranění +• Povolit ignorování hardwarových tlačítek +• Povolit skrývání částečně zhlédnutých videí v kanálu + +Vylepšeno +• Více sloupců mřížky na velkých obrazovkách +• Ukazatele průběhu konzistentní s nastavením + +Opraveno +• Oprava otevírání URL prohlížeče, stahování a externích přehrávačů v Android 11+ +• Oprava interakce s celou obrazovkou v MIUI diff --git a/fastlane/metadata/android/cs/changelogs/994.txt b/fastlane/metadata/android/cs/changelogs/994.txt new file mode 100644 index 00000000000..0dfedc1b18f --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/994.txt @@ -0,0 +1,15 @@ +Nové +- Podpora více zvukových stop/jazyků +- Umožňuje nastavení hlasitosti a jasu gesty na libovolné straně obrazovky +- Podpora zobrazování hlavních karet ve spodní části obrazovky + +Vylepšeno +- [Bandcamp] Zpracování skladeb za paywallem + +Opraveno +- [YouTube] Chyby 403 HTTP pro streamy +- Černý přehrávač při přepnutí do hlavního přehrávače ze zobrazení seznamu skladeb +- Únik paměti služby přehrávače +- [PeerTube] Avatary nahrávače a podkanálu byly prohozeny + +a další diff --git a/fastlane/metadata/android/cs/changelogs/995.txt b/fastlane/metadata/android/cs/changelogs/995.txt new file mode 100644 index 00000000000..222437b3a50 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/995.txt @@ -0,0 +1,16 @@ +Nové +• Podpora karet kanálů +• Výběr kvality obrázků +• Získání URL všech obrázků + +Vylepšeno +• Přístupnost rozhraní přehrávače +• Lepší výběr zvuku pro stahování videa +• Možnost přidat název playlistů a videí do obsahu sdíleného playlistu + +Opraveno +• [YouTube] Opraveno získání počtů líbí se +• Opraveny popupy neodpovídání přehrávače a pády +• Výběr nesprávných jazyků ve výběru jazyka +• Zaměření zvuku přehrávače nerespektovalo ztlumení +• Přidávání položek do playlistů někdy nefungovalo diff --git a/fastlane/metadata/android/cs/changelogs/996.txt b/fastlane/metadata/android/cs/changelogs/996.txt new file mode 100644 index 00000000000..a220330bce7 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/996.txt @@ -0,0 +1,2 @@ +Opravena chyba NullPointerException při otevírání kanálu / konference na media.ccc.de. +Ježíšek nám málem doručil rozbitý dárek pro vás, ale opravili jsme to. diff --git a/fastlane/metadata/android/cs/changelogs/997.txt b/fastlane/metadata/android/cs/changelogs/997.txt new file mode 100644 index 00000000000..c2fbe35a4e9 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/997.txt @@ -0,0 +1,17 @@ +Nové +• Odpovědi na komentáře +• Změna pořadí playlistů +• Zobrazení popisu a trvání playlistu +• Možnost resetu nastavení + +Vylepšeno +• [Android 13+] Obnovení vlastních akcí oznámení +• Žádost o souhlas pro kontrolu aktualizací +• Povolení přehrání/pozastavení oznámení při načítání +• Změna pořadí některých nastavení + +Opraveno +• [YouTube] Opraveno nenačítání komentářů a další opravy a vylepšení +• Oprava závislosti v importu nastavení a přechod na JSON +• Různé opravy stahování +• Trim vyhledávaného textu diff --git a/fastlane/metadata/android/cs/changelogs/998.txt b/fastlane/metadata/android/cs/changelogs/998.txt new file mode 100644 index 00000000000..55c18b0f8f9 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/998.txt @@ -0,0 +1,4 @@ +Opraveno nepřehrávání žádného streamu ve službě YouTube kvůli chybám HTTP 403. + +Občasné chyby HTTP 403 uprostřed videí zatím nejsou opraveny. +Tento problém bude opraven v dalším hotfix vydání jak nejdříve to bude možné. diff --git a/fastlane/metadata/android/cs/changelogs/999.txt b/fastlane/metadata/android/cs/changelogs/999.txt new file mode 100644 index 00000000000..bc0a4c4be8b --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/999.txt @@ -0,0 +1,12 @@ +Tato opravná verze opravuje chyby HTTP 403 uprostřed videí YouTube. + +Nové +- [SoundCloud] Přidána podpora pro adresy on.soundcloud.com + +Vylepšení +- [Bandcamp] Zobrazení dalších informací v rádiovém kiosku + +Opravena stránka +- [YouTube] Oprava občasných chyb HTTP 403 na začátku nebo uprostřed videí +- YouTube] Extrahování avataru a banneru z více typů hlaviček kanálů +- Bandcamp] Opraveny různé chyby a vynucené použití protokolu HTTPS 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/cy/changelogs/63.txt b/fastlane/metadata/android/cy/changelogs/63.txt new file mode 100644 index 00000000000..4727fb4da49 --- /dev/null +++ b/fastlane/metadata/android/cy/changelogs/63.txt @@ -0,0 +1,8 @@ +### Gwelliannau +- Gosodiadau mewnforio/Allforio #1333 +- Lleihau dros dynnu (gwelliant perfformiad) #1371 +- Gwelliannau bychan cod #1375 +- Ychwanegu popeth am y GDPR #1420 + +### Trwsio +- Llwythwr: Trwsio'r chwalu wrth lwytho llwythi i lawr heb eu gorffen o ffeiliau .giga #1407 diff --git a/fastlane/metadata/android/cy/full_description.txt b/fastlane/metadata/android/cy/full_description.txt new file mode 100644 index 00000000000..2228a799b7c --- /dev/null +++ b/fastlane/metadata/android/cy/full_description.txt @@ -0,0 +1 @@ +Nid yw NewPipe yn defnyddio unrhyw fframweithiau lyfrgell Google neu API YouTube. Mae ond yn didoli'r wefan er mwyn cael y wybodaeth mae ei angen. Felly mae modd ei ddefnyddio ar ddyfeisiau sydd heb Google Services wedi'u gosod. Hefyd, does dim angen cyfrif YouTube arnoch i ddefnyddio NewPipe ac mae'n FLOSS. diff --git a/fastlane/metadata/android/cy/short_description.txt b/fastlane/metadata/android/cy/short_description.txt new file mode 100644 index 00000000000..63c8b4b0675 --- /dev/null +++ b/fastlane/metadata/android/cy/short_description.txt @@ -0,0 +1 @@ +Blaen YouTube ysgafn rhad a rhydd ar gyfer Android. diff --git a/fastlane/metadata/android/de/changelogs/1000.txt b/fastlane/metadata/android/de/changelogs/1000.txt new file mode 100644 index 00000000000..08952579cee --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/1000.txt @@ -0,0 +1,12 @@ +Verbessert +• Wiedergabelisten-Beschreibung klickbar, um mehr/weniger Inhalt anzuzeigen +• [PeerTube] Automat. Handhabung von `subscribeto.me`-Instanzlinks +• Nur einzelnes Element im Verlaufsbildschirm abspielen + +Behoben +• Sichtbarkeit der RSS-Schaltfläche +• Abstürze der Suchleistenvorschau +• Erstellen einer Wiedergabeliste ohne Vorschaubild +• Beenden des Download-Dialogs, bevor er erscheint +• Pop-up-Fenster für die Liste der verwandten Elemente in der Warteschlange +• … diff --git a/fastlane/metadata/android/de/changelogs/63.txt b/fastlane/metadata/android/de/changelogs/63.txt index 1fdd53b5525..3ccc56bc03f 100644 --- a/fastlane/metadata/android/de/changelogs/63.txt +++ b/fastlane/metadata/android/de/changelogs/63.txt @@ -5,4 +5,4 @@ - Alles über DSGVO hinzugefügt #1420 ### Repariert -- Downloader: Absturz beim Laden unvollendeter Downloads aus .giga-Dateien behoben #1407 +- Downloader: Absturz beim Laden unvollendeter Downloads von .giga-Dateien behoben #1407 diff --git a/fastlane/metadata/android/de/changelogs/65.txt b/fastlane/metadata/android/de/changelogs/65.txt new file mode 100644 index 00000000000..6815d432a3e --- /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 Teilen-Menü #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 Wiedergabegeschwindigkeitskontrolle um Änderungen besser zu unterstützen. diff --git a/fastlane/metadata/android/de/changelogs/66.txt b/fastlane/metadata/android/de/changelogs/66.txt new file mode 100644 index 00000000000..937bfd642cb --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/66.txt @@ -0,0 +1,18 @@ +# Versionsänderung von v0.13.7 + +### Behebungen +- Probleme der Filterung von v.0.13.6 behoben + +# Versionsänderung von v0.13.6 + +### Verbesserungen + +- Animation der Burgermenü-Icon entfernt #1486 +- Löschen von Downloads rückgängig machen #1472 +- Im "Teilen"-Tab die Download option hinzugefügt #1498 +- Option "Teilen" zum Long-Tap-Menü hinzugefügt #1454 + +### Behebungen + +- Probleme mit dem kaputten Video Info layout behoben. #1440 / #1491 +- Probleme mit dem Verlauf wurden behoben. #1497. diff --git a/fastlane/metadata/android/de/changelogs/68.txt b/fastlane/metadata/android/de/changelogs/68.txt new file mode 100644 index 00000000000..f700b3d26ad --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/68.txt @@ -0,0 +1,19 @@ +# Änderungen von v0.14.1 + +### Fixed +- nicht entschlüsselt Video url #1659 +- Beschreibungs Link nicht extrahierbar #1657 + +# Änderungen von v0.14.0 + +### New +- Neues Schubladendesign #1461 +- Neue anpassbare Titelseite #1461 + +### Verbesserungen +- Reworked Gesture Controls #1604 +- Neue Möglichkeit, den Pop-up-Player #1597 zu schließen + +### Fixed +- Fehler beheben, wenn die Anzahl der Abonnements nicht verfügbar ist. Schließt #1649. +- Zeigen Sie "Abonnentenzählung nicht verfügbar" in diesen Fällen. diff --git a/fastlane/metadata/android/de/changelogs/69.txt b/fastlane/metadata/android/de/changelogs/69.txt new file mode 100644 index 00000000000..8802508a323 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/69.txt @@ -0,0 +1,14 @@ +### New +- Long-tap Löschen & Teilen in Abonnements #1516 +- Tablet UI & Rasterlistenlayout #1617 + +### Verbesserungen +- Speichern und Nachladen des zuletzt verwendeten Seitenverhältnisses #1748 +- Separate Einstellungen für Lautstärke & Helligkeitsgesten #1644 + +### Fixes +- Anzahl der Abonnements +- Foreground Service Erlaubnis für API 28+ Geräte #1830 hinzugefügt + +### Known Bugs +- Wiedergabe kann nicht auf Android P gespeichert werden diff --git a/fastlane/metadata/android/de/changelogs/70.txt b/fastlane/metadata/android/de/changelogs/70.txt new file mode 100644 index 00000000000..59a09b21096 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/70.txt @@ -0,0 +1,10 @@ +ACHTUNG: Diese Version ist wahrscheinlich ein Bugfest. + +### Verbesserungen +* heruntergeladene Dateien können mit einem Klick #1879 geöffnet werden +* Drop-Unterstützung für Android 4.1 - 4.3 #1884 +* Streams aus der aktuellen Warteschlange entfernt, indem sie nach rechts swipen #1915 + +### Fixed +* Crash mit Standard-Auflösung eingestellt auf beste und begrenzte mobile Datenauflösung #1835 +* Pop-up-Spieler-Absturz behoben #1874 diff --git a/fastlane/metadata/android/de/changelogs/71.txt b/fastlane/metadata/android/de/changelogs/71.txt new file mode 100644 index 00000000000..0132de3c32b --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/71.txt @@ -0,0 +1,8 @@ +### Verbesserungen +* App-Update-Benachrichtigung für GitHub build hinzufügen (#1608 von @krtkush) +* Verschiedene Verbesserungen des Downloaders (#1944 von @kapodamy): +* Fügen Sie fehlende weiße Icons hinzu und verwenden Sie hardcored Weg, um die Icon Farben zu ändern +* neue MPEG-4 muxer fixieren nicht-synchrone Video- und Audiostreams (#2039) + +### Fixed +* YouTube Live-Streams spielen nach kurzer Zeit (#1996 von @yausername) diff --git a/fastlane/metadata/android/de/changelogs/740.txt b/fastlane/metadata/android/de/changelogs/740.txt new file mode 100644 index 00000000000..0d28a157ab3 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/740.txt @@ -0,0 +1,12 @@ +

    Verbesserungen

    +
      +
    • Make Links in Kommentare klickbar, erhöhen Textgröße
    • +
    • seek zum Klicken von Zeitstempel-Links in Kommentare
    • +
    • Beliebte Registerkarte basierend auf kürzlich ausgewähltem Zustand anzeigen
    • +
    • Add-Unterstützung für Invidious links
    • +
    +

    Fixed

    +
      +
    • fixed scroll w/kommentare und verwandten Streams deaktiviert
    • +
    • fixiert CheckForNewAppVersionTask wird ausgeführt, wenn es sollten't
    • +
    diff --git a/fastlane/metadata/android/de/changelogs/750.txt b/fastlane/metadata/android/de/changelogs/750.txt new file mode 100644 index 00000000000..78a25282a00 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/750.txt @@ -0,0 +1,15 @@ +Neu +Playback Lebenslauf #2288 +• Resume Streams, wo Sie letztes Mal aufgehört haben +Downloader Verbesserungen #2149 + + +Verbessert +• Gemaketten entfernen #2295 +• Handle (auto)Rotationsänderungen während des Aktivitätszyklus #2444 + +Behoben +• Fixed Downloads bei 99,9% #2440 +• Aktualisieren der Spielwarteschlange Metadaten #2453 +• [SoundCloud] Fester Absturz beim Laden von Wiedergabelisten TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Feste Dauer kann nicht paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/de/changelogs/760.txt b/fastlane/metadata/android/de/changelogs/760.txt new file mode 100644 index 00000000000..f0eac002f6e --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/760.txt @@ -0,0 +1,24 @@ +Veränderung in 0,17.1 + +Neu +• thailändische Lokalisierung + + +Verbessert +• Schalter für SAF / Legacy Datei Picker #2521 hinzufügen + +Behoben +• Löschen Sie Löschtasten in Downloads Ansicht beim Umschalten von Apps #2487 + +Veränderungen in 0,17,0 + +Neu +Playback Lebenslauf #2288 +• Resume Streams, wo Sie letztes Mal aufgehört haben +Downloader Verbesserungen #2149 + +Verbessert +• Gemaketten entfernen #2295 + +Behoben +• Behoben ausgewählter Subtitle Track Name nicht angezeigt #2394 diff --git a/fastlane/metadata/android/de/changelogs/780.txt b/fastlane/metadata/android/de/changelogs/780.txt new file mode 100644 index 00000000000..4deac3709a1 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/780.txt @@ -0,0 +1,11 @@ +Veränderungen in 0,17,3 + +Verbessert +• Hinzugefügte Option, um die Wiedergabezustände #2550 zu löschen +• Versteckte Verzeichnisse in der Datei Picker #2591 anzeigen +• Unterstützung von URLs von `invidio.us` Instanzen, die mit NewPipe #2488 geöffnet werden sollen +• Unterstützung für `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Behoben +• [YouTube] Behoben 'java.lang.IllegalArgumentException #192 +• [YouTube] Feste Live-Streams nicht arbeiten TeamNewPipe/NewPipeExtractor#195 diff --git a/fastlane/metadata/android/de/changelogs/790.txt b/fastlane/metadata/android/de/changelogs/790.txt new file mode 100644 index 00000000000..345cb37aa01 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/790.txt @@ -0,0 +1,13 @@ +Verbessert +• Weitere Titel hinzufügen, um die Zugänglichkeit für Blinde zu verbessern #2655 +• Sprache des Download-Ordners konsistenter und weniger eindeutig #2637 + +Behoben +• Fixed Scrolling in Video Detail Fragment #2672 +• Entfernen Sie doppelte Suche klare Box-Animationen zu einem #2695 +• [SoundCloud] Client_id Extraktion fix #2745 + +Entwicklung +• Hinzufügen fehlender Abhängigkeiten von NewPipeExtractor in NewPipe #2535 +• Migration auf AndroidX #2685 +• Update auf ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/de/changelogs/800.txt b/fastlane/metadata/android/de/changelogs/800.txt new file mode 100644 index 00000000000..783a5c2fbfa --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/800.txt @@ -0,0 +1,11 @@ +Neu +• PeerTube Unterstützung ohne P2P (#2201) (Beta) + Es könnte Probleme mit SSL Handshakes auf Android 4.4 & 7.1 geben, wenn auf bestimmte Instanzen zugegriffen wird. + +Verbessert +• Neue Localization and Downloader von Extractor #2713 +• Schwarze Navigationsleiste für schwarzes Theme #2569 + +Behoben +• Fehler wurde behoben, der den Pop-up-Player nicht verschieben konnte, wenn ein anderer Finger beim Verschieben des Pop-up-Players #2772 platziert wurde +• [SoundCloud] Audio-Stream-Extraktion diff --git a/fastlane/metadata/android/de/changelogs/810.txt b/fastlane/metadata/android/de/changelogs/810.txt new file mode 100644 index 00000000000..09cc43ad6c4 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/810.txt @@ -0,0 +1,11 @@ +Neu +• Video Vorschau auf den Sperrbildschirm beim Spielen im Hintergrund anzeigen + +Verbessert +• Fügen Sie lokale Wiedergabeliste hinzu, um zu löschen, wenn lange Drücken auf Hintergrund / Pop-up-Taste + +Behoben +• Mehrere Probleme behoben, wenn ein Video zu NewPipe geteilt und seine Streams direkt herunterladen +• [YouTube] Festes Einschalten Null verursacht NPE +• [YouTube] Behobene Betrachtungskommentare beim Öffnen eines invidio.us url +• [SoundCloud] Update von client_id diff --git a/fastlane/metadata/android/de/changelogs/840.txt b/fastlane/metadata/android/de/changelogs/840.txt new file mode 100644 index 00000000000..73e9904ec55 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/840.txt @@ -0,0 +1,10 @@ +Neu +• Sprachauswahl hinzugefügt, um die App-Sprache zu ändern +• Hinzugefügt senden zu Kodi Taste zu Spieler zusammenklappbare Menü + +Verbessert +• Entfernen von dot-menu für Schublade und verstecken Geschichte Taste, wenn die Uhr Geschichte nicht in den Einstellungen aktiviert ist + +Behoben +• Fix initialer Helligkeitswert für die Geste +• [YouTube] Timestamps in der Beschreibung sind wieder anklickbar diff --git a/fastlane/metadata/android/de/changelogs/900.txt b/fastlane/metadata/android/de/changelogs/900.txt index a4a8a1253df..58fc1e05d1b 100644 --- a/fastlane/metadata/android/de/changelogs/900.txt +++ b/fastlane/metadata/android/de/changelogs/900.txt @@ -1,14 +1,14 @@ -Neu -- Abonnementgruppen und sortierte Feeds -- Stummschalttaste in Playern +Neu: +• Abonnementgruppen und sortierte Feeds +• Stummschalttaste in Playern -Verbessert -- Das Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt -- Zwei Einstellungen wurden von "Erscheinungsbild" zu "Inhalt" verschoben -- Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist +Verbessert: +• Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt +• Zwei Einstellungen von „Erscheinungsbild“ zu „Inhalt“ verschoben +• Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist -Behoben -- einige WebM-Videos sind nicht suchbar -- Datenbank-Backup auf Android P -- Absturz beim Teilen einer heruntergeladenen Datei -- YouTube-Extraktionsprobleme, ... +Behoben: +• Einige WebM-Videos sind nicht suchbar +• Datenbank-Backup auf Android P +• Absturz beim Teilen einer heruntergeladenen Datei +• YouTube-Extraktionsprobleme und mehr … diff --git a/fastlane/metadata/android/de/changelogs/930.txt b/fastlane/metadata/android/de/changelogs/930.txt new file mode 100644 index 00000000000..e2ddba83f1a --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/930.txt @@ -0,0 +1,12 @@ +Neu +• Suche auf YouTube Musik +• Basic Android TV-Unterstützung + +Verbessert +• Hinzugefügt die Fähigkeit, alle beobachteten Videos von einer lokalen Wiedergabeliste zu entfernen +• Nachricht anzeigen, wenn der Inhalt noch nicht unterstützt wird, anstatt zu stürzen + +Behoben +• Feste altersbeschränkte Inhaltseinstellung nicht funktionieren +• Behoben bestimmte Arten von reCAPTCHAs +• Feste Sichtbarkeit der Gruppen-Sort-Taste im Abonnement-Bereich diff --git a/fastlane/metadata/android/de/changelogs/940.txt b/fastlane/metadata/android/de/changelogs/940.txt new file mode 100644 index 00000000000..e96340b16a3 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/940.txt @@ -0,0 +1,12 @@ +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..790d6329db0 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/951.txt @@ -0,0 +1,10 @@ +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/954.txt b/fastlane/metadata/android/de/changelogs/954.txt index 267e2424e2e..ccb365b9e30 100644 --- a/fastlane/metadata/android/de/changelogs/954.txt +++ b/fastlane/metadata/android/de/changelogs/954.txt @@ -2,8 +2,8 @@ • MediaStyle-Benachrichtigungen: Anpassbare Aktionen in Benachrichtigungen • Grundlegende Größenänderung für NewPipe als Desktop-App -• Dialog mit geöffneten Optionen anzeigen für nicht unterstützte URL-Toasts +• Dialog mit offenen Optionen bei nicht unterstütztem URL-Toast anzeigen • Verbesserte Suchvorschläge, wenn Remote-Vorschläge nicht abgerufen werden können -• Standardvideoqualität auf 720p60 (In-App) und 480p (Popup) angepasst +• Standardvideoqualität auf 720p60 (In-App) und 480p (Pop-up) angepasst • Fehlerbehebungen diff --git a/fastlane/metadata/android/de/changelogs/957.txt b/fastlane/metadata/android/de/changelogs/957.txt index 94c693d0607..fbabcbf337b 100644 --- a/fastlane/metadata/android/de/changelogs/957.txt +++ b/fastlane/metadata/android/de/changelogs/957.txt @@ -6,5 +6,5 @@ • YouTube Videos beschleunigen und Fehlerbehebung bei altersbeschränkten Videos • Fehlerbehebung beim Vor- und Zurückspulen • Listen werden beim Verschieben von Miniaturansichten nicht mehr umsortiert -• Popup-Einstellungen werden immer gemerkt +• Pop-up-Einstellungen werden immer gemerkt • Santali-Sprache hinzugefügt diff --git a/fastlane/metadata/android/de/changelogs/958.txt b/fastlane/metadata/android/de/changelogs/958.txt index 4b41f7d70a5..96b0629d2a9 100644 --- a/fastlane/metadata/android/de/changelogs/958.txt +++ b/fastlane/metadata/android/de/changelogs/958.txt @@ -1,15 +1,15 @@ -Neu+verbessert -•Option Miniansicht Ausblenden auf Sperrbildschirm wieder hinzugefügt -•Ziehen zum Feed aktualisieren -•Verbesserte Leistung beim Abruf lokaler Listen +Neu und verbessert: +• Option Vorschaubild auf Sperrbildschirm ausblenden wieder hinzugefügt +• Ziehen zum Feed aktualisieren +• Verbesserte Leistung beim Abruf lokaler Listen -Behoben -•Absturz, Start von NewPipe, nachdem es aus dem RAM entfernt wurde -•Absturz, Starten von NewPipe ohne Internetverbindung -•Einstellungen Helligkeits- und Lautstärkegesten -•[YT] Lange Wiedergabelisten +Behoben: +• Absturz, NewPipe-Start nachdem es aus dem RAM entfernt wurde +• Absturz, NewPipe-Start ohne Internetverbindung +• Einstellungen Helligkeits- und Lautstärkegesten +• [YT] Lange Wiedergabelisten -Sonstiges -•Codebereinigung, verschiedene interne Verbesserungen -•Aktualisierung Abhängigkeiten -•Aktualisierte Übersetzungen +Sonstiges: +• Codebereinigung, etliche interne Verbesserungen +• Abhängigkeiten aktualisiert +• Übersetzungen aktualisiert 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/968.txt b/fastlane/metadata/android/de/changelogs/968.txt index a619dc5c2f6..eaaf0637cbb 100644 --- a/fastlane/metadata/android/de/changelogs/968.txt +++ b/fastlane/metadata/android/de/changelogs/968.txt @@ -1,7 +1,7 @@ -Option "Kanaldetails" wurde zum Langdruckmenü hinzugefügt. -Funktion zum Umbenennen des Playlist-Namens von der Playlist-Oberfläche zugefügt. +Option „Kanaldetails“ dem Langdruck-Menü hinzugefügt. +Funktion zum Umbenennen des Namens der Wiedergabeliste der Oberfläche hinzugefügt. Benutzer kann nun pausieren, während ein Video gepuffert wird. -Weiße Thema wurde aufpoliert. +Weißes Design wurde aufpoliert. Überlappende Schriftarten bei Verwendung einer größeren Schriftgröße behoben. -Kein Video auf Formuler- und Zephier-Geräten behoben. +Videoanzeige auf Formuler- und Zephier-Geräten behoben. Verschiedene Abstürze behoben. diff --git a/fastlane/metadata/android/de/changelogs/970.txt b/fastlane/metadata/android/de/changelogs/970.txt index 301ea1e3f0e..cf0ae0e0b4f 100644 --- a/fastlane/metadata/android/de/changelogs/970.txt +++ b/fastlane/metadata/android/de/changelogs/970.txt @@ -1,11 +1,11 @@ -Neu -• Inhaltsmetadaten (Tags, Kategorien, Lizenz, ...) unter der Beschreibung anzeigen -• Option "Kanaldetails anzeigen" in remote (nicht lokalen) Wiedergabelisten hinzugefügt -• Option "Im Browser öffnen" zum Langdruck-Menü hinzugefügt +Neu: +• Inhaltsmetadaten (Tags, Kategorien, Lizenz, …) unter der Beschreibung anzeigen +• Option „Kanaldetails anzeigen“ in remote (nicht lokalen) Wiedergabelisten hinzugefügt +• Option „Im Browser öffnen“ zum Langdruck-Menü hinzugefügt -Behoben +Behoben: • Rotationsabsturz auf der Videodetailseite -• "Mit Kodi spielen"-Button im Player fordert immer auf, Kore zu installieren +• „Mit Kodi spielen“-Schaltfläche im Player fordert immer auf, Kore zu installieren • Setzen von Import- und Exportpfaden wurde behoben und verbessert • [YouTube] Anzahl Kommentar-Likes korrigiert Und vieles mehr 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/975.txt b/fastlane/metadata/android/de/changelogs/975.txt new file mode 100644 index 00000000000..7b56b45c2e2 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/975.txt @@ -0,0 +1,17 @@ +Neu: +• Vorschaubild-Anzeige während der Suche +• Deaktivierte Kommentare erkennen +• Feed-Element als beobachtet markieren +• Kommentarherzen anzeigen + +Verbessert: +• Layout von Metadaten und Tags +• Dienstfarbe für UI-Komponenten + +Behoben: +• Vorschaubild im Mini-Player +• Endlose Pufferung bei doppelten Warteschlangenelementen +• Einige Player-Fixes wie Rotation und schnelleres Schließen +• ReCAPTCHA lädt im Hintergrund +• Klicks bei Feed-Aktualisierung deaktivieren +• Einige Downloader-Abstürze diff --git a/fastlane/metadata/android/de/changelogs/976.txt b/fastlane/metadata/android/de/changelogs/976.txt new file mode 100644 index 00000000000..296d9ab4b95 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/976.txt @@ -0,0 +1,10 @@ +• Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt +• Auswahl der anzuzeigenden Suchvorschläge möglich +• Dunkles Design nun dunkler + dunkler Splash-Screen hinzugefügt +• Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen +• Import von YouTube-Abonnements behoben +• Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste +• Behoben: Audio-Sitzung schließen +… + +Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten. diff --git a/fastlane/metadata/android/de/changelogs/977.txt b/fastlane/metadata/android/de/changelogs/977.txt new file mode 100644 index 00000000000..20ab730a490 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/977.txt @@ -0,0 +1,9 @@ +• Die Schaltfläche „Weiter abspielen“ dem Langdruckmenü hinzugefügt +• YouTube-Shorts-Pfadpräfix zum Absichtsfilter hinzugefügt +• Import von Einstellungen behoben +• Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm getauscht +• Verschiedene Korrekturen im Zusammenhang mit MediasessionManager +• Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen +… + +Weitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten. diff --git a/fastlane/metadata/android/de/changelogs/980.txt b/fastlane/metadata/android/de/changelogs/980.txt index 3e32d136bc1..dc69300f349 100644 --- a/fastlane/metadata/android/de/changelogs/980.txt +++ b/fastlane/metadata/android/de/changelogs/980.txt @@ -1,13 +1,13 @@ -Neu -- Option "Zur Wiedergabeliste hinzufügen" zum Freigabemenü hinzugefügt -- Unterstützung für y2u.be und PeerTube Kurzlinks hinzugefügt +Neu: +• Option „Zur Wiedergabeliste hinzufügen“ zum Freigabemenü hinzugefügt +• Unterstützung für y2u.be- und PeerTube-Kurzlinks hinzugefügt -Verbessert -- Playback-Speed-Controls kompakter gemacht -- Feed hebt jetzt neue Elemente hervor -- "Beobachtete Artikel anzeigen" Option im Feed wird nun gespeichert +Verbessert: +• Playback-Speed-Controls kompakter gemacht +• Feed hebt jetzt neue Elemente hervor +• „Beobachtete Artikel anzeigen“-Option im Feed wird nun gespeichert -Behoben -- Extraktion von YouTube Likes und Dislikes behoben -- Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben +Behoben: +• Extraktion von YouTube Likes und Dislikes behoben +• Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben Und vieles mehr diff --git a/fastlane/metadata/android/de/changelogs/986.txt b/fastlane/metadata/android/de/changelogs/986.txt new file mode 100644 index 00000000000..044365eb8bd --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/986.txt @@ -0,0 +1,16 @@ +Neu: +• Benachrichtigungen für neue Streams +• Nahtloser Übergang zwischen Hintergrund- und Videoplayer +• Änderung der Tonhöhe um Halbtöne +• Warteschlange des Hauptplayers an Wiedergabeliste anfügen + +Verbessert: +• Geschwindigkeit/Tonhöhenschrittgröße speichern +• Anfängliche lange Videoplayer-Pufferung verringert +• Player-UI für Android TV +• Löschbestätigung für alle heruntergeladenen Dateien + +Behoben: +• Medienschaltfläche blendet die Steuerelemente des Players nicht aus +• Rücksetzung der Wiedergabe bei Änderung des Playertyps +• Drehung des Wiedergabelisten-Dialogs diff --git a/fastlane/metadata/android/de/changelogs/987.txt b/fastlane/metadata/android/de/changelogs/987.txt index a857b1caac3..f7bc9bd8040 100644 --- a/fastlane/metadata/android/de/changelogs/987.txt +++ b/fastlane/metadata/android/de/changelogs/987.txt @@ -1,12 +1,12 @@ -Neu -- Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams -- Schaltfläche "Hinzufügen" zum Hinzufügen einer entfernten Wiedergabeliste zu einer lokalen Wiedergabeliste -- Bildvorschau im Android 10+ Teilen-Dialog +Neu: +• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams +• Schaltfläche um entfernte Wiedergabeliste einer lokalen Wiedergabeliste hinzuzufügen +• Bildvorschau im Android 10+ Teilen-Dialog -Verbesserte -- Verbesserung des Dialogs für Wiedergabewerte -- Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschieben +Verbessert: +• Wiedergabewerte-Dialog +• Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschoben -Behoben -- Fix: Entfernen vollständig angesehener Videos aus der Wiedergabeliste -- Repariert das Thema des Freigabemenüs und den Eintrag "Zur Wiedergabeliste hinzufügen" +Behoben: +• Entfernung von vollständig angesehenen Videos aus der Wiedergabeliste +• Freigabemenü-Design und „Zur Wiedergabeliste hinzufügen“-Eintrag diff --git a/fastlane/metadata/android/de/changelogs/988.txt b/fastlane/metadata/android/de/changelogs/988.txt new file mode 100644 index 00000000000..bde54eda1f2 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Fehler „Konnte keinen Stream abrufen“ behoben beim Versuch, ein Video abzuspielen +[YouTube] "Der folgende Inhalt ist in dieser App nicht verfügbar." anstelle des angeforderten Videos behoben diff --git a/fastlane/metadata/android/de/changelogs/989.txt b/fastlane/metadata/android/de/changelogs/989.txt new file mode 100644 index 00000000000..40e38f43e61 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Unendliches Laden behoben beim Versuch, ein Video abzuspielen +• [YouTube] Drosselung bei einigen Videos behoben +• Aktualisierung der jsoup-Bibliothek auf 1.15.3, die einen Sicherheitsfix enthält diff --git a/fastlane/metadata/android/de/changelogs/990.txt b/fastlane/metadata/android/de/changelogs/990.txt new file mode 100644 index 00000000000..d3c926d8fe5 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/990.txt @@ -0,0 +1,14 @@ +Mit dieser Version entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist nun Android 5 Lollipop! + +Neu: +• Herunterladen aus dem Langdruckmenü +• Zukünftige Videos im Feed ausblenden +• Lokale Wiedergabelisten teilen + +Verbessert: +• Player-Code in kleine Komponenten refaktorisiert: weniger RAM-Verbrauch, weniger Bugs +• Skalierungsmodus für Miniaturansicht + +Behoben: +• Verschiedene Probleme mit Player-Benachrichtigung: veraltete/fehlende Medieninfos, verzerrte Miniaturansicht +… diff --git a/fastlane/metadata/android/de/changelogs/991.txt b/fastlane/metadata/android/de/changelogs/991.txt new file mode 100644 index 00000000000..d2faadae77c --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/991.txt @@ -0,0 +1,13 @@ +Neu: +• Neue Schaltfläche "Im Browser öffnen" im Fehler-Fenster +• Anzeigeoption von Kanalgruppen als Liste +• [YouTube] Langer Klick auf Streamsegmente um Zeitstempel-URL zu teilen +• Schaltfläche „Warteschlange abspielen“ im Mini-Player + +Verbessert: +• Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert +• Viele interne Verbesserungen + +Behoben: +• Mehrere Abstürze behoben +• [YouTube] Fehlerbehebung für Laden von Kanälen, nicht zugeordnete Feeds und Wiedergabe in einigen Ländern diff --git a/fastlane/metadata/android/de/changelogs/992.txt b/fastlane/metadata/android/de/changelogs/992.txt new file mode 100644 index 00000000000..f0993d9936b --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/992.txt @@ -0,0 +1,17 @@ +Neu: +• Anzahl der Abonnenten in den Videodetails +• Herunterladen aus der Warteschlange +• Dauerhaftes Einstellen einer Wiedergabelisten-Miniaturansicht +• Hashtags und Links lang drücken +• Kartenansicht-Modus + +Verbessert: +• Größere Schaltfläche um Mini-Player zu schließen +• Glattere Miniaturansicht-Skalierung +• Android 13 (API 33) +• Suchen hält den Player nicht mehr an + +Behoben: +• Overlay auf DeX/Maus +• Hintergrundplayer ohne separate Audiostreams +• YouTube-Korrekturen und mehr… diff --git a/fastlane/metadata/android/de/changelogs/993.txt b/fastlane/metadata/android/de/changelogs/993.txt new file mode 100644 index 00000000000..23f4db0b0f6 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/993.txt @@ -0,0 +1,12 @@ +Neu +• Warnung beim Erstellen von Duplikaten in Wiedergabelisten und neue Schaltfläche um diese zu entfernen +• Möglichkeit, Hardwaretasten zu ignorieren +• Möglichkeit, teilweise gesehene Videos im Feed auszublenden + +Verbessert +• Mehr Gitterspalten auf großen Displays +• Fortschrittsbalken sind jetzt konsistent mit Einstellungen + +Behoben +• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern unter Android 11+ +• Vollbildmodus-Bedienung benötigte zweimaliges Tippen unter MIUI diff --git a/fastlane/metadata/android/de/changelogs/994.txt b/fastlane/metadata/android/de/changelogs/994.txt new file mode 100644 index 00000000000..9ff45d8d318 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/994.txt @@ -0,0 +1,15 @@ +Neu +• Unterstützung mehrerer Audiospuren/Sprachen +• Lautstärke- und Helligkeitsgesten auf jeder Bildschirmseite ermöglicht +• Unterstützung für die Anzeige von Haupttabs am unteren Bildschirmrand + +Verbessert +• [Bandcamp] Handhabung von Titeln hinter der Bezahlschranke + +Behoben +• [YouTube] 403-HTTP-Fehler bei Streams +• Schwarzer Player beim Wechsel von der Wiedergabeliste zum Hauptplayer +• Speicherleck im Playerdienst +• [PeerTube] Benutzer- und Unterkanal-Profilbilder getauscht + +und mehr diff --git a/fastlane/metadata/android/de/changelogs/995.txt b/fastlane/metadata/android/de/changelogs/995.txt new file mode 100644 index 00000000000..6fccdb65a11 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/995.txt @@ -0,0 +1,14 @@ +Neu +• Unterstützung von Kanaltabs +• Bildqualität auswählbar +• URLs zu allen Bildern erhalten + +Verbessert +• Zugänglichkeit der Player-Oberflächen +• Bessere Audioauswahl bei reinen Video-Downloads +• Option zur Aufnahme von Wiedergabelisten-/Videonamen in geteilten Wiedergabelisteninhalten + +Behoben +• [YouTube] Erhalten der Like-Anzahl +• Nicht reagierende Pop-ups und Abstürze des Players +• Hinzufügen von Wiedergabelistenelementen funktionierte gelegentlich nicht diff --git a/fastlane/metadata/android/de/changelogs/996.txt b/fastlane/metadata/android/de/changelogs/996.txt new file mode 100644 index 00000000000..bcdea8f4f73 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/996.txt @@ -0,0 +1,2 @@ +Eine NullPointerException beim Öffnen eines Kanals / einer Konferenz in media.ccc.de behoben. +Der Grinch hat versucht, unser Weihnachtsgeschenk für Sie zu zerstören, aber wir haben es behoben. diff --git a/fastlane/metadata/android/de/changelogs/997.txt b/fastlane/metadata/android/de/changelogs/997.txt new file mode 100644 index 00000000000..f55e72b053d --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/997.txt @@ -0,0 +1,17 @@ +Neu +• Antwort auf Kommentar +• Wiedergabelisten umordnen +• Wiedergabelisten-Beschreibung und -Dauer +• Rücksetzen der Einstellungen + +Verbessert +• [Android 13+] Wiederherstellen benutzerdef. Benachrichtigungsaktionen +• Zustimmung zur Update-Prüfung +• Während Pufferung Abspielen/Pause über Benachrichtigung +• Neuordnung einiger Einstellungen + +Behoben +• [YouTube] Kommentare wurden nicht geladen, weitere Korrekturen und Verbesserungen +• Sicherheitslücke beim Einstellungsimport und Umstellung auf JSON +• Verschiedene Download-Korrekturen +• Suchtext gekürzt diff --git a/fastlane/metadata/android/de/changelogs/998.txt b/fastlane/metadata/android/de/changelogs/998.txt new file mode 100644 index 00000000000..183414df412 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/998.txt @@ -0,0 +1,4 @@ +Behoben: YouTube spielt keinen Stream wegen HTTP-403-Fehlern ab. + +Gelegentliche HTTP-403-Fehler in der Mitte eines YouTube-Videos sind noch nicht behoben. +Dieses Problem wird in einer weiteren Hotfix-Version so bald wie möglich behoben. diff --git a/fastlane/metadata/android/de/changelogs/999.txt b/fastlane/metadata/android/de/changelogs/999.txt new file mode 100644 index 00000000000..51cf80d3eb2 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/999.txt @@ -0,0 +1,12 @@ +Diese Hotfix-Version behebt HTTP-403-Fehler mitten in YouTube-Videos. + +Neu +• [SoundCloud] Unterstützung für on.soundcloud.com-URLs hinzugefügt + +Verbessert +• [Bandcamp]Anzeige zusätzlicher Informationen im Radio-Kiosk + +Behoben +• [YouTube] Behebung gelegentlicher HTTP 403-Fehler am Anfang oder in der Mitte von Videos +• [YouTube] Extrahieren von Avataren und Banner aus mehr Kanal-Header-Typen +• [Bandcamp] Verschiedene Fehler behoben und HTTPS wird stets verwendet diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt index a476e427e17..ef2ac9577a3 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de/full_description.txt @@ -1 +1 @@ -NewPipe verwendet keine Bibliotheken des Google-Frameworks oder der YouTube-API. Es analysiert die Website, um die benötigten Informationen zu erlangen. Aus diesem Grund kann die App ohne die Google Services verwendet werden. Ebenso wird kein YouTube-Konto für NewPipe benötigt und es ist FLOSS (Freie Software / Open-Source-Software). +NewPipe verwendet keine Bibliotheken des Google-Frameworks oder der YouTube-API. Es analysiert die Website, um die benötigten Informationen zu erlangen. Aus diesem Grund kann die App ohne die Google Services verwendet werden. Ebenso wird kein YouTube-Konto für NewPipe benötigt und es ist FOSS (Freie Software / Open-Source-Software). diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt index 138e55523ae..ec47872eb07 100644 --- a/fastlane/metadata/android/de/short_description.txt +++ b/fastlane/metadata/android/de/short_description.txt @@ -1 +1 @@ -Eine freie, leichtgewichtige YouTube-App für Android. +Eine freie, leichte YouTube-App für Android. diff --git a/fastlane/metadata/android/el/changelogs/65.txt b/fastlane/metadata/android/el/changelogs/65.txt new file mode 100644 index 00000000000..0417512c781 --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/65.txt @@ -0,0 +1,26 @@ +### Βελτιώσεις + +- Απενεργοποίηση της κίνησης του εικονιδίου του burgermenu #1486 +- Αναίρεση διαγραφής λήψεων #1472 +- Επιλογή λήψης στο μενού κοινής χρήσης #1498 +- Προστέθηκε επιλογή κοινής χρήσης στο μενού παρατεταμένου πατήματος #1454 +- Ελαχιστοποίηση του κύριου προγράμματος αναπαραγωγής κατά την έξοδο #1354 +- Ενημέρωση της έκδοσης της βιβλιοθήκης και διόρθωση αντιγράφων ασφαλείας της βάσης δεδομένων #1510 +- Ενημέρωση ExoPlayer 2.8.2 #1392 + - Ανασχεδιάστηκε ο διάλογος ελέγχου της ταχύτητας αναπαραγωγής ώστε να υποστηρίζει διαφορετικά μεγέθη βημάτων για ταχύτερη αλλαγή ταχύτητας. + - Προστέθηκε μια εναλλαγή για γρήγορη μετακίνηση προς τα εμπρός κατά τη διάρκεια σιωπής στον έλεγχο ταχύτητας αναπαραγωγής. Αυτό θα πρέπει να είναι χρήσιμο για τα ακουστικά βιβλία και ορισμένα είδη μουσικής και μπορεί να φέρει μια πραγματικά απρόσκοπτη εμπειρία (και μπορεί να σπάσει ένα τραγούδι με πολλές σιωπές =\\). + - Αναδιαμόρφωση της ανάλυσης πηγής πολυμέσων ώστε να επιτρέπεται η μετάδοση μεταδεδομένων μαζί με τα πολυμέσα εσωτερικά στον αναπαραγωγέα, αντί να γίνεται χειροκίνητα. Τώρα έχουμε μια ενιαία πηγή μεταδεδομένων και είναι άμεσα διαθέσιμα κατά την έναρξη της αναπαραγωγής. + - Διορθώθηκε η μη ενημέρωση των απομακρυσμένων μεταδεδομένων της λίστας αναπαραγωγής όταν είναι διαθέσιμα νέα μεταδεδομένα κατά το άνοιγμα του τμήματος της λίστας αναπαραγωγής. + - Διάφορες διορθώσεις στο UI: #1383, τα στοιχεία ελέγχου ειδοποίησης αναπαραγωγής στο παρασκήνιο είναι τώρα πάντα λευκά, είναι ευκολότερο να κλείσετε το αναδυόμενο πρόγραμμα αναπαραγωγής μέσω εκτίναξης +- Χρήση νέου εξαηωγέα με ανασχεδιασμένη αρχιτεκτονική για πολλαπλές υπηρεσίες + +### Διορθώσεις + +- Διόρθωση #1440 Προβληματική διάταξη πληροφοριών βίντεο #1491 +- Διόρθωση ιστορικού προβολής #1497 + - #1495, ενημέρωση των μεταδεδομένων (μικρογραφία, τίτλος και αριθμός βίντεο) μόλις ο χρήστης αποκτήσει πρόσβαση στη λίστα αναπαραγωγής. + - #1475, με την καταχώριση μιας προβολής στη βάση δεδομένων όταν ο χρήστης ξεκινάει ένα βίντεο σε εξωτερική συσκευή αναπαραγωγής σε λεπτομερές θραύσμα. +- Διόρθωση του χρονικού ορίου creen σε περίπτωση λειτουργίας αναδυόμενου παραθύρου. #1463 (Διορθώθηκε το #640) +- Διόρθωση του κύριου προγράμματος αναπαραγωγής βίντεο #1509 + - #1412] Διορθώθηκε η λειτουργία επανάληψης που προκαλεί NPE του αναπαραγωγέα όταν λαμβάνεται νέα εντολή ενώ εργάζεται στο παρασκήνιο. + - Διορθώθηκε κατά την ελαχιστοποίηση του αναπαραγωγέα σε αναδυόμενο παράθυρο, να μην τον καταστρέφει όταν δεν έχει χορηγηθεί άδεια αναδυόμενου παραθύρου. diff --git a/fastlane/metadata/android/el/changelogs/963.txt b/fastlane/metadata/android/el/changelogs/963.txt new file mode 100644 index 00000000000..b6c30aa9d84 --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Διόρθωση της συνέχισης ενός καναλιού diff --git a/fastlane/metadata/android/el/changelogs/996.txt b/fastlane/metadata/android/el/changelogs/996.txt new file mode 100644 index 00000000000..58223cb1ae6 --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/996.txt @@ -0,0 +1,2 @@ +Διορθώθηκε μια NullPointerException κατά το άνοιγμα ενός καναλιού/συνεδρίου στο media.ccc.de. +Ο Grinch προσπάθησε να σπάσει το χριστουγεννιάτικο δώρο μας προς εσάς, αλλά το διορθώσαμε. diff --git a/fastlane/metadata/android/en-US/changelogs/1000.txt b/fastlane/metadata/android/en-US/changelogs/1000.txt new file mode 100644 index 00000000000..6a884f9672e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1000.txt @@ -0,0 +1,13 @@ +Improved +• Make playlist description clickable to show more / less content +• [PeerTube] Handle `subscribeto.me` instance links automatically +• Only start playing single item in history screen + +Fixed +• Fix RSS button visibility +• Fix seekbar preview crashes +• Fix playlisting a thumbnail-less item +• Fix exiting the download dialog before it appears +• Fix related items list enqueue popup +• Fix order in add to playlist dialog +• Adjust the playlist bookmark item layout diff --git a/fastlane/metadata/android/en-US/changelogs/1001.txt b/fastlane/metadata/android/en-US/changelogs/1001.txt new file mode 100644 index 00000000000..a07fade321e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1001.txt @@ -0,0 +1,6 @@ +Improved +• Always allow changing player notification preferences on Android 13+ + +Fixed +• Fix exporting database/subscriptions would not truncate an already existing file, possibly leading to a corrupted export +• Fix player resuming from start when clicking on a timestamp \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/992.txt b/fastlane/metadata/android/en-US/changelogs/992.txt new file mode 100644 index 00000000000..807411d50a8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/992.txt @@ -0,0 +1,17 @@ +New +• Subscriber count in video details +• Download from the queue +• Permanently set a playlist thumbnail +• Long-press hashtags and links +• Card view mode + +Improved +• Larger mini-player close button +• Smoother thumbnail downscaling +• Target Android 13 (API 33) +• Seeking no longer pauses the player + +Fixed +• Fix overlay on DeX/mouse +• Allow background player with no separate audio streams +• Various YouTube fixes and more… \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/993.txt b/fastlane/metadata/android/en-US/changelogs/993.txt new file mode 100644 index 00000000000..722bc50cffb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/993.txt @@ -0,0 +1,12 @@ +New +• Add warning when adding playlist duplicates and add button to remove them +• Allow ignoring hardware buttons +• Allow hiding partially watched videos in feed + +Improved +• Use more grid columns on big screens +• Make progress indicators consistent with settings + +Fixed +• Fix opening browser URLs, downloads and external players on Android 11+ +• Fix interacting with fullscreen requiring two taps on 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/changelogs/995.txt b/fastlane/metadata/android/en-US/changelogs/995.txt new file mode 100644 index 00000000000..78e0770f7f8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/995.txt @@ -0,0 +1,16 @@ +New +• Support channel tabs +• Select image quality +• Get URLs to all images + +Improved +• Accessibility of player interfaces +• Better audio selection for video-only downloads +• Option to include playlist and video names to shared playlist content + +Fixed +• [YouTube] Fix getting like count +• Fix player not responding popups and crashes +• Selection of wrong languages in language picker +• Player audio focus was not respecting mute +• Playlist item addition occasionally not working \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/996.txt b/fastlane/metadata/android/en-US/changelogs/996.txt new file mode 100644 index 00000000000..8e5af53a480 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/996.txt @@ -0,0 +1,2 @@ +Fixed a NullPointerException when opening a channel / conference in media.ccc.de. +The Grinch tried to break our Christmas gift to you, but we fixed it. diff --git a/fastlane/metadata/android/en-US/changelogs/997.txt b/fastlane/metadata/android/en-US/changelogs/997.txt new file mode 100644 index 00000000000..95432407093 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/997.txt @@ -0,0 +1,17 @@ +New +• Add comment replies +• Allow reordering playlists +• Show playlist description and duration +• Allow resetting settings + +Improved +• [Android 13+] Restore custom notification actions +• Request consent for update check +• Allow notification play/pause while buffering +• Reorder some settings + +Fixed +• [YouTube] Fix comments not loading, plus other fixes and improvements +• Solve vulnerability in settings import and switch to JSON +• Various download fixes +• Trim search text \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/998.txt b/fastlane/metadata/android/en-US/changelogs/998.txt new file mode 100644 index 00000000000..468df020430 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/998.txt @@ -0,0 +1,4 @@ +Fixed YouTube not playing any stream because of HTTP 403 errors. + +Occasional HTTP 403 errors in the middle of a YouTube video are not fixed yet. +That issue will be addressed in another hotfix release as soon as possible. diff --git a/fastlane/metadata/android/en-US/changelogs/999.txt b/fastlane/metadata/android/en-US/changelogs/999.txt new file mode 100644 index 00000000000..c089ed197ef --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/999.txt @@ -0,0 +1,12 @@ +This hotfix release fixes HTTP 403 errors in the middle of YouTube videos. + +New +• [SoundCloud] Add support for on.soundcloud.com URLs + +Improved +• [Bandcamp] Show additional info in radio kiosk + +Fixed +• [YouTube] Fix occasional HTTP 403 errors at the beginning or in the middle of videos +• [YouTube] Extract avatar and banner from more channel header types +• [Bandcamp] Fix various bugs and always use HTTPS 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/eo/changelogs/63.txt b/fastlane/metadata/android/eo/changelogs/63.txt new file mode 100644 index 00000000000..c6e1e9ad5fa --- /dev/null +++ b/fastlane/metadata/android/eo/changelogs/63.txt @@ -0,0 +1,8 @@ +### Plibonigojn +- Importi/eksporti konfiguraĵojn #1333 +- Malpliigi superdesegnaĵon (rendimentan plibonigon) #1371 +- Malgrandajn kodajn plibonigojn #1375 +- Aldoni ĉion pri GDPR #1420 + +### Fiksitaj +- Elŝutilo: Fiksi kraŝon kiam ŝarĝi malfinitajn elŝutaĵojn el .giga-j dosieroj #1407 diff --git a/fastlane/metadata/android/eo/full_description.txt b/fastlane/metadata/android/eo/full_description.txt new file mode 100644 index 00000000000..74418f2ab15 --- /dev/null +++ b/fastlane/metadata/android/eo/full_description.txt @@ -0,0 +1 @@ +NewPipe uzas nek frambildotekojn de *Google*, nek la aplikprograman interfacon de YouTube. Ĝi nur sintakse analizas la retejon por akiri la necesaj datumoj. Tial ĉi tio aplikaĵo estas uzebla per disponaĵoj sen instalita *Google Services*. Oni ne bezonas konton de YouTube por uzi NewPipe, kaj ĝi estas libera programaro. diff --git a/fastlane/metadata/android/es/changelogs/1000.txt b/fastlane/metadata/android/es/changelogs/1000.txt new file mode 100644 index 00000000000..c6168f2202b --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/1000.txt @@ -0,0 +1,13 @@ +Mejorado +• Lista de reproducción muestra más/menos contenido +• [PeerTube] Manejar automáticamente las instancia de subscribeto.me. +• Reproducir único elemento en el historial + +Corregido +• Visibilidad del botón RSS +• Bloqueos en la barra de búsqueda. +• Reproducción de un elemento sin miniaturas +• Salir del cuadro de diálogo de descarga antes de que aparezca +• Lista de elementos relacionados a la cola +• Orden al añadir a la lista de reproducción +• Diseño de favoritos en lista de reproducción diff --git a/fastlane/metadata/android/es/changelogs/68.txt b/fastlane/metadata/android/es/changelogs/68.txt index 643c0f135d0..cac77df8406 100644 --- a/fastlane/metadata/android/es/changelogs/68.txt +++ b/fastlane/metadata/android/es/changelogs/68.txt @@ -1,31 +1,18 @@ # cambios de la v0.14.1 -### Fijado +### Arreglado - Arreglado el fallo de descifrar la url del vídeo #1659 - Corregido el enlace de descripción que no se extrae bien #1657 -# cambios de v0.14.0 +# cambios de la v0.14.0 ### Nuevo -- Nuevo diseño del cajón #1461 +- Nuevo diseño del drawer #1461 - Nueva página frontal personalizable #1461 ### Mejoras -- Controles gestuales rediseñados #1604 +- Mejora de los controles gestuales #1604 - Nueva forma de cerrar el reproductor emergente #1597 ### Corregido -- Arreglado el error cuando el recuento de suscripciones no está disponible. Cierra #1649. - - Mostrar "Recuento de suscriptores no disponible" en esos casos -- Arreglar NPE cuando una lista de reproducción de YouTube está vacía -- Arreglo rápido de los quioscos en SoundCloud -- Refactorización y corrección de errores #1623 - - Arreglar resultado de búsqueda cíclica #1562 - - Corrección de la barra de búsqueda no estática - - Fix YT Premium video no se bloquean correctamente - - Corregir los vídeos que a veces no se cargan (debido al análisis sintáctico de DASH) - - Arreglar los enlaces en la descripción del vídeo - - Mostrar advertencia cuando alguien trata de descargar a sdcard externa - - Fix nothing shown exception triggers report - - la miniatura no se muestra en el reproductor de fondo para android 8.1 [ver aquí](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Arreglar el registro del receptor de transmisión. Cierra #1641. +- Corregido el error cuando el recuento de suscripciones no está disponible. Cierra #1649. diff --git a/fastlane/metadata/android/es/changelogs/69.txt b/fastlane/metadata/android/es/changelogs/69.txt index a2d1c839532..6038ef93df1 100644 --- a/fastlane/metadata/android/es/changelogs/69.txt +++ b/fastlane/metadata/android/es/changelogs/69.txt @@ -1,19 +1,11 @@ -### Nuevo -- Mantén pulsado para borrar y/o compartir en Subscripciones #1516 -- Interfaz de Tablet y listas en forma de cuadrícula #1617 +- La puesta en cola ahora activa la reproducción de vídeo si la cola de reproducción ya terminó #1783 +- Ajustes separados para los gestos de volumen y brillo #1644 +- Añadir soporte para la localización #1792 -### Mejoras -- Guarda y usa la última relación de aspecto #1748 -- Activa las listas lineares en las Descargas con los nombres completos #1771 -- Guarda y comparte subscripciones directamente desde la pestaña de subscripciones #1516 -- Poner en cola un video hace que empiece a reproducirse si la cola ya ha acabado #1783 -- Ajustes para gestos separados del el brillo y el volumen #1644 -- Añadido soporte para traducciones #1792 +### Correcciones +- Corregir parse en .format, para que NewPipe se pueda utilizar en Finlandia +- Corregir el recuento de suscripciones +- Añadir permiso de servicio en primer plano para dispositivos API 28+ #1830 -### Arreglos -- Arreglada la obtención de fecha para el .format, de modo que NewPipe se puede usar en Finlandia. -- Arreglado el contador de subscriptores -- Añadido permiso para arrancar en primer plano para dispositivos con API +28 #1830 - -### Bugs Conocidos -- El estado de la reproducción no se puede guardar en Android P +### Bugs conocidos +- El estado de la reproducción no se guarda en Android P diff --git a/fastlane/metadata/android/es/changelogs/750.txt b/fastlane/metadata/android/es/changelogs/750.txt index 715d704dcfe..e35a02e6d8b 100644 --- a/fastlane/metadata/android/es/changelogs/750.txt +++ b/fastlane/metadata/android/es/changelogs/750.txt @@ -1,22 +1,13 @@ Nuevo -Resumen de la reproducción #2288 -- Reanudar las transmisiones donde se detuvo la última vez -Mejoras en el descargador #2149 -- Use Storage Access Framework para almacenar descargas en tarjetas SD externas +Reanudación de la reproducción #2288 +- Reanudar la reproducción donde se detuvo la última vez +Mejoras en el gestor de descargas #2149 +- Utilizar el marco de acceso al almacenamiento para guardar las descargas en tarjetas SD externas - Nuevo mp4 muxer -- Opción de cambiar el directorio de la descarga antes de iniciar una descarga -- Respeta las redes con contador +- Opción de cambiar el directorio de descarga antes de iniciar una descarga +- Respetar las redes con contador -Mejora de +Mejorado - Eliminación de las cadenas de gema #2295 -- Manejar los cambios de (auto)rotación durante la reproducción #2444 -- Hacer consistentes los menús de pulsación larga #2368 - -Arreglado -- Se corrigió el nombre de la pista de subtítulos seleccionados que no se mostraba #2394 -- No se bloquee cuando falle la verificación de la actualización de la aplicación (versión GitHub) #2423 -- Corregidas las descargas atascadas en el 99,9% #2440 -- Actualizar los metadatos de la cola de reproducción #2453 -- SoundCloud] Corregido el fallo al cargar listas de reproducción TeamNewPipe/NewPipeExtractor#170 -- YouTube] La duración fija no se puede emparejar TeamNewPipe/NewPipeExtractor#177 +- Manejar cambios de (auto)rotación en el ciclo de vida de la actividad #2444 diff --git a/fastlane/metadata/android/es/changelogs/760.txt b/fastlane/metadata/android/es/changelogs/760.txt index e2d3903f557..29d45f4142f 100644 --- a/fastlane/metadata/android/es/changelogs/760.txt +++ b/fastlane/metadata/android/es/changelogs/760.txt @@ -1,43 +1,13 @@ Cambios en 0.17.1 Nuevo -- Localización en tailandés +•Localización tailandesa Mejora de -- Añadir la acción de empezar a reproducir aquí en los menús de pulsación larga para las listas de reproducción de nuevo #2518 -- Añadir interruptor para SAF / legado selector de archivos #2521 +•Añadir la acción de empezar a reproducir aquí en los menús de pulsación larga para las listas de reproducción de nuevo #2518 +•Añadir interruptor para SAF / legado selector de archivos #2521 Corregido -- Arreglar la desaparición de los botones en la vista de descargas al cambiar de aplicación #2487 -- Arreglar que la posición de reproducción se almacene aunque el historial de visionado esté desactivado -- Corregir la reducción del rendimiento causada por la posición de reproducción en las vistas de lista #2517 -- Extractor] Fijar ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 -- Extractor] [YouTube] Corregir error de búsqueda casual cuando las listas de reproducción están en los resultados TeamNewPipe/NewPipeExtractor#185 - - - -Cambios en 0.17.0 - -Nuevo -Reanudación de la reproducción #2288 -- Reanudar las secuencias donde se detuvo la última vez -- Mejoras en el descargador #2149 -- Utiliza el marco de acceso al almacenamiento para guardar las descargas en tarjetas SD externas -- Nuevo mp4 muxer -- Opción de cambiar el directorio de descarga antes de iniciar una descarga -- Respeta las redes con contador - - -Mejora de -- Eliminación de las cadenas de gema #2295 -- Manejar los cambios de (auto)rotación durante la reproducción #2444 -- Hacer consistentes los menús de pulsación larga #2368 - -Arreglado -- Corregido el nombre de la pista de subtítulos seleccionada que no se muestra #2394 -- No se bloquea cuando falla la comprobación de la actualización de la aplicación (versión GitHub) #2423 -- Corregidas las descargas atascadas en el 99,9% #2440 -- Actualizar los metadatos de la cola de reproducción #2453 -- SoundCloud] Corregido el fallo al cargar listas de reproducción TeamNewPipe/NewPipeExtractor#170 -- YouTube] Corregida la duración que no se puede emparejar TeamNewPipe/NewPipeExtractor#177 +• Arreglar la desaparición de los botones en la vista de descargas al cambiar de aplicación #2487 +• Arreglar que la posición de reproducción se almacene aunque el historial de visionado esté desactivado diff --git a/fastlane/metadata/android/es/changelogs/780.txt b/fastlane/metadata/android/es/changelogs/780.txt index 3f11e21043f..7687a146eea 100644 --- a/fastlane/metadata/android/es/changelogs/780.txt +++ b/fastlane/metadata/android/es/changelogs/780.txt @@ -1,12 +1,11 @@ Cambios en 0.17.3 Se ha mejorado -- Añadida la opción de borrar los estados de reproducción #2550 -- Mostrar directorios ocultos en el selector de archivos #2591 -- Soportar URLs de instancias de `invidio.us` para ser abiertas con NewPipe #2488 -- Añadir soporte para URLs de `music.youtube.com` TeamNewPipe/NewPipeExtractor#194 +• Añadida la opción de borrar los estados de reproducción #2550 +• Mostrar directorios ocultos en el selector de archivos #2591 +• Soportar URLs de instancias de `invidio.us` para ser abiertas con NewPipe #2488 +• Añadir soporte para URLs de `music.youtube.com` TeamNewPipe/NewPipeExtractor#194 Corregido -- YouTube] Corregido 'java.lang.IllegalArgumentException' #192 +- YouTube] Corregido 'java.lang.IllegalArgumentException #192 - YouTube] Arreglado que las transmisiones en directo no funcionan TeamNewPipe/NewPipeExtractor#195 -- Corregido el problema de rendimiento en android pie al descargar un stream #2592 diff --git a/fastlane/metadata/android/es/changelogs/790.txt b/fastlane/metadata/android/es/changelogs/790.txt index 16a670c9733..858564a52b2 100644 --- a/fastlane/metadata/android/es/changelogs/790.txt +++ b/fastlane/metadata/android/es/changelogs/790.txt @@ -1,14 +1,9 @@ -Mejora de -- Añadir más títulos para mejorar la accesibilidad de los invidentes #2655 -- Hacer que el lenguaje de la configuración de la carpeta de descarga sea más consistente y menos ambiguo #2637 +Mejorado +• Añadir más títulos para mejorar la accesibilidad de los invidentes #2655 +• Hacer que el lenguaje de la configuración de la carpeta de descarga sea más consistente y menos ambiguo #2637 Corregido -- Comprobar si se descarga el último byte del bloque #2646 -- Corregido el desplazamiento en el fragmento de detalle del vídeo #2672 -- Quitar las animaciones de doble caja de búsqueda a una sola #2695 -- [SoundCloud] Fijar la extracción de client_id #2745 - -Desarrollo -- Añadir las dependencias que faltan heredadas de NewPipeExtractor en NewPipe #2535 -- Migrar a AndroidX #685 -- Actualizar a ExoPlayer 2.10.6 #2697, #2736 +• Comprobar si se descarga el último byte del bloque #2646 +• Corregido el desplazamiento en el fragmento de detalle del vídeo #2672 +• Eliminar las animaciones de doble caja de búsqueda a una sola #2695 +• [SoundCloud] Arreglar la extracción de client_id #2745 diff --git a/fastlane/metadata/android/es/changelogs/800.txt b/fastlane/metadata/android/es/changelogs/800.txt index 6798a8e1ac5..ea1da82b1a8 100644 --- a/fastlane/metadata/android/es/changelogs/800.txt +++ b/fastlane/metadata/android/es/changelogs/800.txt @@ -1,27 +1,9 @@ Nuevo -- Soporte de PeerTube sin P2P (#2201) [Beta]: +• Soporte de PeerTube sin P2P (#2201) [Beta]: ◦ Ver y descargar vídeos de las instancias de PeerTube. ◦ Añadir instancias en la configuración para acceder al mundo completo de PeerTube - ◦ Podría haber problemas con los apretones de manos SSL en Android 4.4 y 7.1 al acceder a ciertas instancias, lo que resulta en un error de red. + ◦ Puede haber problemas con los apretones de manos SSL en Android 4.4 y 7.1 al acceder a ciertas instancias que dan lugar a un error de red. -- Descargador (#2679): +• Gestor de descargas (#2679): ◦ Calcular el tiempo estimado de descarga ◦ Descargar opus (archivos webm) como ogg - ◦ Recuperar enlaces de descarga caducados para reanudar las descargas tras una larga pausa - -Mejorado -- Hacer el KioskFragment consciente de los cambios en el país de contenido preferido y mejorar el rendimiento de todas las fichas principales #2742 -- Utilizar las nuevas implementaciones de localización y descargador del extractor #2713 -- Hacer traducible la cadena "Kiosco por defecto -- Barra de navegación negra para el tema negro #2569 - -Corregido -- Se ha corregido un error que impedía mover el reproductor emergente si se colocaba otro dedo mientras se movía el reproductor emergente #2772 -- Permitir que las listas de reproducción no tengan un cargador y arreglar los fallos relacionados con este problema #2724, TeamNewPipe/NewPipeExtractor#219 -- Habilitar TLS1.1/1.2 en dispositivos Android 4.4 (API 19/KitKat) para arreglar el apretón de manos TLS con MediaCCC y algunas instancias de PeerTube #2792 -- SoundCloud] Corregida la extracción de client_id TeamNewPipe/NewPipeExtractor#217 -- SoundCloud] Corregir la extracción de flujos de audio - -Desarrollo -- Actualizar ExoPlayer a la versión 2.10.8 #2791, #2816 -- Actualizar Gradle a 3.5.1 y añadir soporte para Kotlin #2714 diff --git a/fastlane/metadata/android/es/changelogs/810.txt b/fastlane/metadata/android/es/changelogs/810.txt index 2f569dc5bf8..caacfec03e1 100644 --- a/fastlane/metadata/android/es/changelogs/810.txt +++ b/fastlane/metadata/android/es/changelogs/810.txt @@ -8,12 +8,12 @@ Mejorado - Añadir una miniatura ficticia para listas de reproducción locales vacías - Usar la extensión de archivos *.opus en lugar de *.webm y mostrar "opus" en etiqueta de formato en lugar de "WebM Opus" en menú desplegable de descargas - Añadir un botón para eliminar archivos descargados o el historial de descargas en "Descargas" -- YouTube] Añadir soporte a los enlaces de canal /c/shortened_url +- [YouTube] Añadir soporte a los enlaces de canal /c/shortened_url Corregidos - Corregidos múltiples problemas al compartir un video a NewPipe y al descargar sus secuencias directamente - Corregido el acceso al reproductor fuera de su hilo de creación - Corregida la paginación de resultados de búsqueda -- YouTube] Corregido el cambio a nulo que causaba NPE -- YouTube] Corregida la visualización de comentarios al abrir una url de invidio.us -- SoundCloud] Actualizado client_id +- [YouTube] Corregido el cambio a nulo que causaba NPE +- [YouTube] Corregida la visualización de comentarios al abrir una url de invidio.us +- [SoundCloud] Actualizado client_id 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/961.txt b/fastlane/metadata/android/es/changelogs/961.txt index ce3a21b582c..56230f9404e 100644 --- a/fastlane/metadata/android/es/changelogs/961.txt +++ b/fastlane/metadata/android/es/changelogs/961.txt @@ -8,5 +8,5 @@ - Se ha corregido la posibilidad de compartir vídeos desde el reproductor - Corregida la vista web de ReCaptcha en blanco - Corregido el fallo que se producía al eliminar un stream de una lista -- PeerTube] Corregidos los flujos relacionados -- YouTube] Corregida la búsqueda de música en YouTube +- [PeerTube] Corregidos los flujos relacionados +- [YouTube] Corregida la búsqueda de música en YouTube diff --git a/fastlane/metadata/android/es/changelogs/963.txt b/fastlane/metadata/android/es/changelogs/963.txt index b1cb99b522c..9ed4710a1f1 100644 --- a/fastlane/metadata/android/es/changelogs/963.txt +++ b/fastlane/metadata/android/es/changelogs/963.txt @@ -1 +1 @@ -• [YouTube] Continuación del canal fijo +• [YouTube] Arregló la continuación de canal diff --git a/fastlane/metadata/android/es/changelogs/977.txt b/fastlane/metadata/android/es/changelogs/977.txt index d5b4dad2a59..a8869fbcbfe 100644 --- a/fastlane/metadata/android/es/changelogs/977.txt +++ b/fastlane/metadata/android/es/changelogs/977.txt @@ -1,5 +1,5 @@ • Añade botón de "reproducir siguiente" al menú presionado -• Añadido prefijo de ruta de Youtube shorts +• Añadido prefijo de ruta de YouTube Shorts • Corregida importación de ajustes • Intercambio entre barra y botones en pantalla de cola • Correcciones relacionadas con MediasessionManager diff --git a/fastlane/metadata/android/es/changelogs/982.txt b/fastlane/metadata/android/es/changelogs/982.txt index e38ba90c972..59db3236537 100644 --- a/fastlane/metadata/android/es/changelogs/982.txt +++ b/fastlane/metadata/android/es/changelogs/982.txt @@ -1 +1 @@ -Solución a YouTube no reproduciendo flujos. +Arreglado el fallo por el cuál YouTube no reproducía ningún stream diff --git a/fastlane/metadata/android/es/changelogs/992.txt b/fastlane/metadata/android/es/changelogs/992.txt new file mode 100644 index 00000000000..bdbd0ccba26 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/992.txt @@ -0,0 +1,17 @@ +Nuevo +• Número de suscriptores en los detalles del video +• Descarga desde la cola +• Establecer permanentemente una miniatura de lista de reproducción +• Hashtags y enlaces con pulsación de larga duración +• Modo de vista de tarjeta + +Mejorado +• Botón de cierre del minirreproductor más grande +• Reducción de escala de miniaturas más suave +• Objetivo Android 13 (API 33) +• Buscar ya no detiene el reproductor + +Arreglos +• Solucionar superposición en DeX/ratón +• Permitir reproductor de fondo sin transmisiones de audio separadas +• Varias correcciones de YouTube y más… diff --git a/fastlane/metadata/android/es/changelogs/993.txt b/fastlane/metadata/android/es/changelogs/993.txt new file mode 100644 index 00000000000..f951484e00b --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/993.txt @@ -0,0 +1,12 @@ +Nuevo +• Aviso al poner duplicados en lista de reproducción y botón para quitarlos +• Ignorar botones físicos +• Ocultar videos vistos a medias en el feed + +Mejorado +• Más columnas en pantallas grandes +• Indicadores de progreso sean consistentes con la configuración + +Solucionado +• Abrir URL del navegador, descargas y reproductores externos en Android 11+ +• Interación en pantalla completa, requería dos toques en MIUI 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/es/changelogs/995.txt b/fastlane/metadata/android/es/changelogs/995.txt new file mode 100644 index 00000000000..93aab836e00 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/995.txt @@ -0,0 +1,16 @@ +Nuevo +• Pestañas de canal +• Calidad de imagen +• URLs de las imágenes + +Mejora de +• Accesibilidad de las interfaces de los reproductores +• Mejor selección de audio para descargas de vídeo +• Incluir nombres de listas de reproducción y vídeos en listas compartidas + +Corregido +• [YouTube] Corrección del recuento "Me gusta" +• Ventanas emergentes y bloqueos +• Idiomas incorrectos en selector de idiomas +• Audio del reproductor no respetaba silencio +• La lista de reproducción no funcionaba ocasionalmente diff --git a/fastlane/metadata/android/es/changelogs/996.txt b/fastlane/metadata/android/es/changelogs/996.txt new file mode 100644 index 00000000000..e620b525f59 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/996.txt @@ -0,0 +1,2 @@ +Corregida una NullPointerException al abrir un canal / conferencia en media.ccc.de. +El Grinch trató de romper nuestro regalo de Navidad para usted, pero lo arreglamos. diff --git a/fastlane/metadata/android/es/changelogs/997.txt b/fastlane/metadata/android/es/changelogs/997.txt new file mode 100644 index 00000000000..ee9a61d8c3a --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/997.txt @@ -0,0 +1,17 @@ +Nuevo +• Añadir respuestas a comentarios +• Reordenar listas de reproducción +• Mostrar descripción y duración de listas de reproducción +• Restaurar ajustes + +Mejorado +• [Android 13+] acciones de notificación personalizadas +• Permiso para comprobar actualizaciones +• Reproducir/pausar notificaciones al almacenar en búfer +• Algunos ajustes + +Corregido +• [YouTube] Corregir comentarios que no se cargan y mejoras +• Fallo al importar de ajustes y JSON +• Corrección de varias descargas +• texto de búsqueda diff --git a/fastlane/metadata/android/es/changelogs/998.txt b/fastlane/metadata/android/es/changelogs/998.txt new file mode 100644 index 00000000000..80b4efa553d --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/998.txt @@ -0,0 +1 @@ +Arreglo en YouTube no reproduciendo flujos diff --git a/fastlane/metadata/android/es/changelogs/999.txt b/fastlane/metadata/android/es/changelogs/999.txt new file mode 100644 index 00000000000..f87b70baf8a --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/999.txt @@ -0,0 +1,12 @@ +Esta versión corrige errores HTTP 403 en medio de los videos de YouTube. + +Nuevo +• [SoundCloud] Agregar soporte para URL on.soundcloud.com + +Mejorado +• [Bandcamp] Mostrar información adicional en el quiosco de radio + +Corregido +• [YouTube] Se corrigen errores HTTP 403 ocasionales al principio o en el medio de los videos. +• [YouTube] Extraer avatar y banner de más tipos de encabezado de canal +• [Bandcamp] Corrige varios errores y usa siempre HTTPS diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt index 8e2096a8809..2f06d6e1ddb 100644 --- a/fastlane/metadata/android/es/short_description.txt +++ b/fastlane/metadata/android/es/short_description.txt @@ -1 +1 @@ -Un cliente de YouTube gratuito y liviano para Android. +Un cliente de YouTube gratuito y ligero para Android. diff --git a/fastlane/metadata/android/eu/changelogs/66.txt b/fastlane/metadata/android/eu/changelogs/66.txt deleted file mode 100644 index cd2fcc89940..00000000000 --- a/fastlane/metadata/android/eu/changelogs/66.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog of v0.13.7 - -### Improvements - -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 - - Support different step sizes for faster speed change - - Added a toggle to fast-forward during silences in playback speed control - - Refactored media source resolution - - Fixed remote playlist metadata not updating. - - Various UI fixes -- Use new extractor with refactored architecture for multiservice. diff --git a/fastlane/metadata/android/eu/changelogs/992.txt b/fastlane/metadata/android/eu/changelogs/992.txt new file mode 100644 index 00000000000..5b0dd96ba70 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/992.txt @@ -0,0 +1,17 @@ +Zer berri +• Harpidetza kopurua bideoen xehetasunetan +• Ilaratik deskargatu +• Erreprodukzio-zerrendei betirako izango den miniatura ezarri +• Luze sakatu traola eta estekentzako +• Txartel-bista modua + +Hobekuntzak +• Mini-erreproduzitzailearen ixteko botoi handiago bat +• Miniaturen eskala murrizketa arinagoa +• Android 13 (API 33) +• Bilaketak ez du erreprodukzioa geldiaraziko + +Konponketak +• DeX/saguaren gainezarpena konpondua +• Bigarren planoko erreprodukzioa baimendu bereizitako bi audio-jariorik gabe +• YouTube-kin zeuden arazoak konpondu eta are gehiago… diff --git a/fastlane/metadata/android/eu/changelogs/997.txt b/fastlane/metadata/android/eu/changelogs/997.txt new file mode 100644 index 00000000000..d76342e3ef1 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/997.txt @@ -0,0 +1,17 @@ +Berria +• Gehitu erantzunak iruzkinei +• Err. zerr. berrantolaketa +• Erakutsi err. zerr. deskribapena eta iraupena +• Ezarpenak berrezartzea + +Hobetuta +• [Android 13+] jakinarazpen-ekintza pertsonalizatuak +• Baimena eskatu eguneraketak egiaztatzeko +• Errepr./pausatu jakinarazpenak bufferean +• Ezarpen batzuk berrantolatu + +Konponduta +• [YouTube] Konpondu iruzkinak ez kargatzea +• Konpondu ahultasuna ezarpenen importazioan eta JSON-era aldatu +• Konpondu hainbat deskarga +• Moztu bilaketa-testua diff --git a/fastlane/metadata/android/fa/changelogs/998.txt b/fastlane/metadata/android/fa/changelogs/998.txt new file mode 100644 index 00000000000..ba5413d49f8 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/998.txt @@ -0,0 +1 @@ +مشکل عدم نمایش پخش‌زنده برطرف شد diff --git a/fastlane/metadata/android/fa/changelogs/999.txt b/fastlane/metadata/android/fa/changelogs/999.txt new file mode 100644 index 00000000000..ba5413d49f8 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/999.txt @@ -0,0 +1 @@ +مشکل عدم نمایش پخش‌زنده برطرف شد diff --git a/fastlane/metadata/android/fi/changelogs/830.txt b/fastlane/metadata/android/fi/changelogs/830.txt new file mode 100644 index 00000000000..7fc24478fee --- /dev/null +++ b/fastlane/metadata/android/fi/changelogs/830.txt @@ -0,0 +1 @@ +Päivitetty SoundCloud client_id korjatakseen ongelmia SoundCloudissa. diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt new file mode 100644 index 00000000000..422529abf85 --- /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/changelogs/800.txt b/fastlane/metadata/android/fr/changelogs/800.txt new file mode 100644 index 00000000000..91bd24d5429 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/800.txt @@ -0,0 +1,27 @@ +Nouveau +- Support de PeerTube sans P2P (#2201) [Beta] : + ◦ Regarder et télécharger des vidéos depuis des instances PeerTube + ◦ Ajouter des instances dans les paramètres pour accéder à l'ensemble du monde PeerTube + ◦ Il peut y avoir des problèmes avec les handshakes SSL sur Android 4.4 et 7.1 lors de l'accès à certaines instances, ce qui entraîne une erreur de réseau. + +- Téléchargeur (#2679) : + ◦ Calculer l'heure d'arrivée du téléchargement + ◦ Télécharger les opus (fichiers webm) en ogg + ◦ Récupération des liens de téléchargement expirés pour reprendre les téléchargements après une longue pause + +Amélioré +- Le KioskFragment est informé des changements dans le pays de contenu préféré et améliore les performances de tous les onglets principaux #2742 +- Utilisation des nouvelles implémentations Localization et Downloader de l'extracteur #2713 +- Rendre la chaîne « Default kiosk » traduisible +- Barre de navigation noire pour le thème noir #2569 + +Correction +- Correction d'un bogue qui ne permettait pas de déplacer le lecteur popup si un autre doigt était placé pendant le déplacement du lecteur popup #2772 +- Autorise les listes de lecture sans uploader et corrige les crashs liés à ce problème #2724, TeamNewPipe/NewPipeExtractor#219 +- Activation de TLS1.1/1.2 sur les appareils Android 4.4 (API 19/KitKat) pour corriger le handshake TLS avec MediaCCC et certaines instances PeerTube #2792 +- SoundCloud] Correction de l'extraction de l'identifiant client TeamNewPipe/NewPipeExtractor#217 +- [SoundCloud] Correction de l'extraction du flux audio + +Développement +- Mise à jour d'ExoPlayer vers la version 2.10.8 #2791, #2816 +- Mise à jour de Gradle vers 3.5.1 et ajout du support Kotlin #2714 diff --git a/fastlane/metadata/android/fr/changelogs/840.txt b/fastlane/metadata/android/fr/changelogs/840.txt new file mode 100644 index 00000000000..f08a46740b0 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/840.txt @@ -0,0 +1,22 @@ +Nouveau +• Ajout d'un sélecteur de langue pour changer la langue de l'application +• Ajout du bouton Envoyer vers Kodi au menu déroulant du lecteur +• Ajout de la possibilité de copier les commentaires en appuyant longuement + +Amélioré +• Corriger l'activité ReCaptcha et enregistrer correctement les cookies obtenus +• Suppression du menu à points au profit du tiroir et du bouton Masquer l'historique lorsque l'historique de visionnage n'est pas activé dans les paramètres +• Demander correctement l'autorisation d'affichage sur d'autres applications dans les paramètres sur Android 6 et versions ultérieures +• Renommer la liste de lecture locale en cliquant longuement dans BookmarkFragment +• Diverses améliorations de PeerTube +• Amélioration de plusieurs chaînes sources en anglais + +Corrigé +• Correction du redémarrage du lecteur bien qu'il soit en pause lorsque l'option « Réduire au changement d'application » est activée et que NewPipe est réduit +• Correction de la valeur de luminosité initiale pour le geste +• Correction des téléchargements de sous-titres .srt ne contenant pas tous les sauts de ligne +• Correction du téléchargement sur la carte SD qui échoue car certains appareils Android 5 ne sont pas conformes CTF +• Correction du téléchargement sur Android KitKat +• Correction du fichier vidéo .mp4 corrompu reconnu comme fichier audio +• Correction de la localisation multiple problèmes, notamment des codes de langue chinois erronés +• [YouTube] Les horodatages dans la description sont à nouveau cliquables diff --git a/fastlane/metadata/android/fr/changelogs/930.txt b/fastlane/metadata/android/fr/changelogs/930.txt new file mode 100644 index 00000000000..4bf050a24d4 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/930.txt @@ -0,0 +1,19 @@ +Nouveau +• Recherche sur YouTube Music +• Prise en charge Android TV de base + +Amélioré +• Ajout de la possibilité de supprimer toutes les vidéos regardées d'une playlist locale +• Afficher un message lorsque le contenu n'est pas encore pris en charge au lieu de planter +• Redimensionnement amélioré du lecteur contextuel avec des gestes de pincement +• Mettre les flux en file d'attente en appuyant longuement sur les boutons d'arrière-plan et contextuels dans la chaîne +• Gestion améliorée de la taille du titre de l'en-tête du tiroir + +Corrigé +• Correction du paramètre de contenu restreint par âge qui ne fonctionne pas +• Correction de certains types de reCAPTCHA +• Correction du crash lors de l'ouverture des signets alors que la playlist est « nulle » +• Correction de la détection des exceptions liées au réseau +• Correction de la visibilité du bouton de tri de groupe dans le fragment d'abonnements + +et plus diff --git a/fastlane/metadata/android/fr/changelogs/992.txt b/fastlane/metadata/android/fr/changelogs/992.txt new file mode 100644 index 00000000000..88e58db9607 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/992.txt @@ -0,0 +1,17 @@ +Nouveau +• Nombre d'abonnés dans les détails de la vidéo +• Télécharger depuis la file d'attente +• Définir de manière permanente une miniature de liste de lecture +• Hashtags et liens à appui long +• Mode d'affichage de la carte + +Amélioré +• Bouton de fermeture du mini-lecteur plus grand +• Réduction d'échelle des vignettes plus fluide +• Cible Android 13 (API 33) +• La recherche ne met plus le lecteur en pause + +Corrigé +• Correction de la superposition sur DeX/souris +• Autoriser le lecteur d'arrière-plan sans flux audio séparés +• Divers correctifs YouTube et plus encore… diff --git a/fastlane/metadata/android/fr/changelogs/993.txt b/fastlane/metadata/android/fr/changelogs/993.txt new file mode 100644 index 00000000000..9865a19acc7 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/993.txt @@ -0,0 +1,12 @@ +Nouveau +• Ajout d'un avertissement lors de l'ajout de doublons de playlist et ajout d'un bouton pour les supprimer +• Autoriser l'ignorance des boutons matériels +• Autoriser le masquage des vidéos partiellement regardées dans le flux + +Amélioré +• Utiliser plus de colonnes de grille sur les grands écrans +• Rendre les indicateurs de progression cohérents avec les paramètres + +Corrigé +• Correction de l'ouverture des URL du navigateur, des téléchargements et des lecteurs externes sur Android 11+ +• Correction de l'interaction avec le plein écran nécessitant deux appuis sur MIUI diff --git a/fastlane/metadata/android/fr/changelogs/994.txt b/fastlane/metadata/android/fr/changelogs/994.txt new file mode 100644 index 00000000000..35a77aa91d3 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/994.txt @@ -0,0 +1,15 @@ +Nouveau +• Prise en charge de plusieurs pistes audio/langues +• Possibilité de régler le volume et la luminosité par gestes sur n'importe quel côté de l'écran +• Prise en charge de l'affichage des onglets principaux en bas de l'écran + +Amélioré +• [Bandcamp] Gestion des pistes derrière le mur payant + +Corrigé +• [YouTube] Erreurs HTTP 403 pour les flux +• Lecteur noir lors du passage au lecteur principal depuis la vue playlist +• Fuite de mémoire du service de lecture +• [PeerTube] Les avatars du téléchargeur et du sous-canal ont été échangés + +et plus diff --git a/fastlane/metadata/android/fr/changelogs/995.txt b/fastlane/metadata/android/fr/changelogs/995.txt new file mode 100644 index 00000000000..f8b55f3fd63 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/995.txt @@ -0,0 +1,16 @@ +Nouveau +• Prise en charge des onglets de chaîne +• Sélection de la qualité de l'image +• Obtenir les URL de toutes les images + +Amélioré +• Accessibilité des interfaces du lecteur +• Meilleure sélection audio pour les téléchargements de vidéos uniquement +• Option permettant d'inclure les noms de playlist et de vidéo dans le contenu de playlist partagé + +Corrigé +• [YouTube] Correction de l'obtention du nombre de likes +• Correction des fenêtres contextuelles et des plantages du lecteur +• Sélection de mauvaises langues dans le sélecteur de langue +• Le focus audio du lecteur ne respectait pas la fonction muet +• L'ajout d'éléments de liste de lecture ne fonctionnait parfois pas diff --git a/fastlane/metadata/android/fr/changelogs/996.txt b/fastlane/metadata/android/fr/changelogs/996.txt new file mode 100644 index 00000000000..3f0eac3e7ea --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/996.txt @@ -0,0 +1,2 @@ +Correction d'une NullPointerException lors de l'ouverture d'un canal/conférence dans media.ccc.de. +Le Grinch a essayé de vous interrompre avec notre cadeau de Noël, mais nous avons résolu le problème. diff --git a/fastlane/metadata/android/fr/changelogs/997.txt b/fastlane/metadata/android/fr/changelogs/997.txt new file mode 100644 index 00000000000..87ca55570c0 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/997.txt @@ -0,0 +1,17 @@ +Nouveau +• Ajouter des réponses aux commentaires +• Autoriser la réorganisation des listes de lecture +• Afficher la description et la durée de la liste de lecture +• Autoriser la réinitialisation des paramètres + +Amélioré +• [Android 13+] Restaurer les actions de notification personnalisées +• Demander le consentement pour la vérification des mises à jour +• Autoriser la lecture/pause des notifications pendant la mise en mémoire tampon +• Réorganiser certains paramètres + +Corrigé +• [YouTube] Correction des commentaires qui ne se chargent pas, ainsi que d'autres correctifs et améliorations +• Résoudre la vulnérabilité dans l'importation des paramètres et passer à JSON +• Divers correctifs de téléchargement +• Couper le texte de recherche diff --git a/fastlane/metadata/android/fr/changelogs/998.txt b/fastlane/metadata/android/fr/changelogs/998.txt new file mode 100644 index 00000000000..3ad3bf2798b --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/998.txt @@ -0,0 +1 @@ +Correction de YouTube qui ne lisait aucun média diff --git a/fastlane/metadata/android/fr/changelogs/999.txt b/fastlane/metadata/android/fr/changelogs/999.txt new file mode 100644 index 00000000000..3ad3bf2798b --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/999.txt @@ -0,0 +1 @@ +Correction de YouTube qui ne lisait aucun média 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/he/changelogs/995.txt b/fastlane/metadata/android/he/changelogs/995.txt new file mode 100644 index 00000000000..c0fab1e52e7 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/995.txt @@ -0,0 +1,14 @@ +חדש +• תמיכה בלשוניות ערוצים +• בחירת איכות תמונה +• קבלת כתובות לכל התמונות + +משופר +• גישה למנשקי הנגן +• אפשרות להוספת שם רשימת נגינה ושם סרטון לתוכן שמשותף ברשימת נגינה +• שיפורים פנימיים ועדכוני תלויות + +תוקן +• בחירה בשפה הלא נכונה בבורר השפות +• מיקוד השמע של הנגן לא כיבד השתקה +• הוספת פריטים לרשימות נגינה לא עבדה במקרים מסוימים diff --git a/fastlane/metadata/android/he/changelogs/998.txt b/fastlane/metadata/android/he/changelogs/998.txt new file mode 100644 index 00000000000..50731171e10 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/998.txt @@ -0,0 +1 @@ +תוקנה התקלה ש־YouTube לא מנגן אף תזרים diff --git a/fastlane/metadata/android/he/changelogs/999.txt b/fastlane/metadata/android/he/changelogs/999.txt new file mode 100644 index 00000000000..50731171e10 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/999.txt @@ -0,0 +1 @@ +תוקנה התקלה ש־YouTube לא מנגן אף תזרים diff --git a/fastlane/metadata/android/hi/changelogs/1000.txt b/fastlane/metadata/android/hi/changelogs/1000.txt new file mode 100644 index 00000000000..67a819e0f48 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/1000.txt @@ -0,0 +1,13 @@ +सुधार +• अधिक/कम सामग्री दिखाने के लिए प्लेलिस्ट विवरण को क्लिक करने योग्य बनाएं +• [PeerTube] `subscribeto.me` इंस्टेंस लिंक को स्वचालित रूप से हैंडल करें +• इतिहास स्क्रीन में केवल एकल आइटम चलाना शुरू करें + +ठीक किया गया +• RSS बटन दृश्यता को ठीक करें +• सीकबार पूर्वावलोकन क्रैश को ठीक करें +• थंबनेल-रहित आइटम को प्लेलिस्ट में डालना ठीक करें +• डाउनलोड डायलॉग के दिखाई देने से पहले बाहर निकलने को ठीक करें +• संबंधित आइटम सूची एनक्यू पॉपअप को ठीक करें +• प्लेलिस्ट में जोड़ें डायलॉग में क्रम को ठीक करें +• प्लेलिस्ट बुकमार्क आइटम लेआउट को समायोजित करें diff --git a/fastlane/metadata/android/hi/changelogs/64.txt b/fastlane/metadata/android/hi/changelogs/64.txt new file mode 100644 index 00000000000..65e1f16a7d0 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/64.txt @@ -0,0 +1,8 @@ +### सुधार +- मोबाइल डेटा का उपयोग करते समय वीडियो की गुणवत्ता को सीमित करने की क्षमता को जोड़ा गया। #1339 +- सत्र # 1442 के लिए चमक याद रखें +- कमजोर सीपीयू # 1431 के लिए डाउनलोड प्रदर्शन में सुधार +- मीडिया सत्र # 1433 के लिए समर्थन जोड़ें (काम कर रहा है) + +### फिक्स +- डाउनलोड खोलने पर क्रैश ठीक करें (रिलीज बिल्ड के लिए अब उपलब्ध है) # 1441 diff --git a/fastlane/metadata/android/hi/changelogs/65.txt b/fastlane/metadata/android/hi/changelogs/65.txt new file mode 100644 index 00000000000..8570a056a10 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/65.txt @@ -0,0 +1,26 @@ +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - 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/hi/changelogs/66.txt b/fastlane/metadata/android/hi/changelogs/66.txt new file mode 100644 index 00000000000..30c20b0e8cb --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog of v0.13.7 + +### Fixed +- Fix sort filter issues of v0.13.6 + +# Changelog of v0.13.6 + +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - 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/hi/changelogs/68.txt b/fastlane/metadata/android/hi/changelogs/68.txt new file mode 100644 index 00000000000..238b1e0b18c --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/68.txt @@ -0,0 +1,31 @@ +# changes of v0.14.1 + +### Fixed +- Fixed failed to decrypt video url #1659 +- Fixed description link not extract well #1657 + +# changes of v0.14.0 + +### New +- New Drawer design #1461 +- New customizable front page #1461 + +### Improvements +- Reworked Gesture controls #1604 +- New way to close the popup player #1597 + +### Fixed +- Fix error when subscription count is not available. Closes #1649. + - Show "Subscriber count not available" in those cases +- Fix NPE when a YouTube playlist is empty +- Quick fix for the kiosks in SoundCloud +- Refactor and bugfix #1623 + - Fix Cyclic search result #1562 + - Fix Seek bar not statically lay outed + - Fix YT Premium video are not blocked correctly + - Fix Videos sometimes not loading (due to DASH parsing) + - Fix links in video description + - Show warning when someone tries to download to external sdcard + - fix nothing shown exception triggers report + - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Fix registering of broadcast receiver. Closes #1641. diff --git a/fastlane/metadata/android/hi/changelogs/69.txt b/fastlane/metadata/android/hi/changelogs/69.txt new file mode 100644 index 00000000000..c8262d1b0d7 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/69.txt @@ -0,0 +1,19 @@ +### New +- Long-tap delete and share in subscriptions #1516 +- Tablet UI and grid list layout #1617 + +### Improvements +- store and reload the last used aspect ratio #1748 +- Enable linear layout in Downloads activity with full video names #1771 +- Delete and share subscriptions directly from within the subscriptions tab #1516 +- Enqueuing now triggers video playing if the play queue has already ended #1783 +- Separate settings for volume and brightness gestures #1644 +- Add support for Localization #1792 + +### Fixes +- Fix time parsing for . format, so NewPipe can be used in Finland +- Fix subscription count +- Add foreground service permission for API 28+ devices #1830 + +### Known Bugs +- Playback state can not be saved on Android P diff --git a/fastlane/metadata/android/hi/changelogs/70.txt b/fastlane/metadata/android/hi/changelogs/70.txt new file mode 100644 index 00000000000..ad87a4409c5 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/70.txt @@ -0,0 +1,25 @@ +ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯ + +### Improvements +* downloaded files can now be opened with one click #1879 +* drop support for android 4.1 - 4.3 #1884 +* remove old player #1884 +* remove streams from current play queue by swiping them to the right #1915 +* remove auto queued stream when a new stream is enqueued manually #1878 +* Postprocessing for downloads and implement missing features #1759 by @kapodamy + * Post-processing infrastructure + * Proper error handling "infrastructure" (for downloader) + * Queue instead of multiple downloads + * Move serialized pending downloads (`.giga` files) to app data + * Implement max download retry + * Proper multi-thread download pausing + * Stop downloads when swicthing to mobile network (never works, see 2nd point) + * Save the thread count for next downloads + * A lot of incoherences fixed + +### Fixed +* Fix crash with default resolution set to best and limited mobile data resolution #1835 +* pop-up player crash fixed #1874 +* NPE when trying to open background player #1901 +* Fix for inserting new streams when auto queuing is enabled #1878 +* Fixed the decypering shuttown issue diff --git a/fastlane/metadata/android/hi/changelogs/71.txt b/fastlane/metadata/android/hi/changelogs/71.txt new file mode 100644 index 00000000000..5facfc05f3a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/71.txt @@ -0,0 +1,10 @@ +### Improvements +* Add app update notification for GitHub build (#1608 by @krtkush) +* Various improvements to the downloader (#1944 by @kapodamy): + * add missing white icons and use hardcored way for change the icon colors + * check if the iterator is initialized (fixes #2031) + * allow retry downloads with "post-processing failed" error in the new muxer + * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039) + +### Fixed +* YouTube live streams stop playing after a short time (#1996 by @yausername) diff --git a/fastlane/metadata/android/hi/changelogs/730.txt b/fastlane/metadata/android/hi/changelogs/730.txt new file mode 100644 index 00000000000..e4f260cd2b4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/730.txt @@ -0,0 +1,2 @@ +# हल किया गया +- हॉट फिक्स डिक्रिप्ट फ़ंक्शन त्रुटि फिर से। diff --git a/fastlane/metadata/android/hi/changelogs/740.txt b/fastlane/metadata/android/hi/changelogs/740.txt new file mode 100644 index 00000000000..c795978a894 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/740.txt @@ -0,0 +1,23 @@ +

    Improvements

    +
      +
    • make links in comments clickable, increase text size
    • +
    • seek on clicking timestamp links in comments
    • +
    • show preferred tab based on recently selected state
    • +
    • add playlist to queue when long clicking on 'Background' in playlist window
    • +
    • search for shared text when it is not an URL
    • +
    • add "share at current time" button to the main video player
    • +
    • add close button to main player when video queue is finished
    • +
    • add "Play directly in Background" to longpress menu for video list items
    • +
    • improve English translations for Play/Enqueue commands
    • +
    • small performance improvements
    • +
    • remove unused files
    • +
    • update ExoPlayer to 2.9.6
    • +
    • add support for Invidious links
    • +
    +

    Fixed

    +
      +
    • fixed scroll w/ comments and related streams disabled
    • +
    • fixed CheckForNewAppVersionTask being executed when it shouldn't
    • +
    • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
    • +
    • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
    • +
    diff --git a/fastlane/metadata/android/hi/changelogs/750.txt b/fastlane/metadata/android/hi/changelogs/750.txt new file mode 100644 index 00000000000..39b77f7c346 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/750.txt @@ -0,0 +1,22 @@ +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hi/changelogs/760.txt b/fastlane/metadata/android/hi/changelogs/760.txt new file mode 100644 index 00000000000..6e000f6d9f0 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/760.txt @@ -0,0 +1,43 @@ +Changes in 0.17.1 + +New +• Thai localization + + +Improved +• Add start playing here action in long-press menus for playlists again #2518 +• Add switch for SAF / legacy file picker #2521 + +Fixed +• Fix disappearing buttons in downloads view when switching apps #2487 +• Fix playback position is stored although watch history is disabled +• Fix reduced performance caused by playback position in list views #2517 +• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 + + + +Changes in 0.17.0 + +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hi/changelogs/770.txt b/fastlane/metadata/android/hi/changelogs/770.txt new file mode 100644 index 00000000000..c775d63fc39 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/770.txt @@ -0,0 +1,4 @@ +0.17.2 में परिवर्तन + +फिक्स +• फिक्स कोई वीडियो उपलब्ध नहीं था diff --git a/fastlane/metadata/android/hi/changelogs/780.txt b/fastlane/metadata/android/hi/changelogs/780.txt new file mode 100644 index 00000000000..9100d7335f0 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/780.txt @@ -0,0 +1,12 @@ +Changes in 0.17.3 + +Improved +• Added option to clear playback states #2550 +• Show hidden directories in the file picker #2591 +• Support URLs from `invidio.us` instances to be opened with NewPipe #2488 +• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Fixed +• [YouTube] Fixed 'java.lang.IllegalArgumentException #192 +• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195 +• Fixed performance problem in android pie when downloading a stream #2592 diff --git a/fastlane/metadata/android/hi/changelogs/790.txt b/fastlane/metadata/android/hi/changelogs/790.txt new file mode 100644 index 00000000000..ec77b2acb0d --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/790.txt @@ -0,0 +1,14 @@ +Improved +• Add more titles to improve accessibility for blind people #2655 +• Make language of download folder setting more consistent and less ambiguous #2637 + +Fixed +• Check if last byte in the block is downloaded #2646 +• Fixed scrolling in video detail fragment #2672 +• Remove double search clear box animations to one #2695 +• [SoundCloud] Fix client_id extraction #2745 + +Development +• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 +• Migrate to AndroidX #2685 +• Update to ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/hi/changelogs/800.txt b/fastlane/metadata/android/hi/changelogs/800.txt new file mode 100644 index 00000000000..332b5c9946d --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/800.txt @@ -0,0 +1,27 @@ +New +• PeerTube support without P2P (#2201) [Beta]: + ◦ Watch and download videos from PeerTube instances + ◦ Add instances in the settings to access the complete PeerTube world + ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. + +• Downloader (#2679): + ◦ Calculate download ETA + ◦ Download opus (webm files) as ogg + ◦ Recover expired download links to resume downloads after a long pause + +Improved +• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 +• Use new Localization and Downloader implementations from extractor #2713 +• Make "Default kiosk" string translatable +• Black navigation bar for black theme #2569 + +Fixed +• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 +• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 +• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 +• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] Fix audio stream extraction + +Development +• Update ExoPlayer to 2.10.8 #2791, #2816 +• Update Gradle to 3.5.1 and add Kotlin support #2714 diff --git a/fastlane/metadata/android/hi/changelogs/810.txt b/fastlane/metadata/android/hi/changelogs/810.txt new file mode 100644 index 00000000000..c75855fd18a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/810.txt @@ -0,0 +1,19 @@ +New +• Show video thumbnail on the lock screen when playing in the background + +Improved +• Add local playlist to queue when long pressing on background / popup button +• Make main page tabs scrollable and hide when there is only a single tab +• Limit amount of notification thumbnail updates in background player +• Add dummy thumbnail for empty local playlists +• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown +• Add button to delete downloaded files or download history in "Downloads" +• [YouTube] Add support to /c/shortened_url channel links + +Fixed +• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly +• Fixed player access out of its creation thread +• Fixed search result paging +• [YouTube] Fixed switching on null causing NPE +• [YouTube] Fixed viewing comments when opening an invidio.us url +• [SoundCloud] Updated client_id diff --git a/fastlane/metadata/android/hi/changelogs/820.txt b/fastlane/metadata/android/hi/changelogs/820.txt new file mode 100644 index 00000000000..d99e5f00420 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/820.txt @@ -0,0 +1 @@ +फिक्स्ड डिक्रिप्ट फ़ंक्शन नाम रेगेक्स YouTube को अनुपयोगी बना रहा। diff --git a/fastlane/metadata/android/hi/changelogs/830.txt b/fastlane/metadata/android/hi/changelogs/830.txt new file mode 100644 index 00000000000..b8c338f9aaf --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/830.txt @@ -0,0 +1 @@ +साउंडक्लाउड समस्याओं को ठीक करने के लिए साउंडक्लाउड क्लाइंट_आईडी अपडेट किया गया। diff --git a/fastlane/metadata/android/hi/changelogs/840.txt b/fastlane/metadata/android/hi/changelogs/840.txt new file mode 100644 index 00000000000..95dc80844c8 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/840.txt @@ -0,0 +1,22 @@ +New +• Added language selector to change the app language +• Added send to Kodi button to player collapsible menu +• Added ability to copy comments on long press + +Improved +• Fix ReCaptcha activity and correctly save obtained cookies +• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings +• Ask for display over other apps permission in settings correctly on Android 6 and later +• Rename local playlist by long-clicking in BookmarkFragment +• Various PeerTube improvements +• Improved several English source strings + +Fixed +• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized +• Fix initial brightness value for gesture +• Fixed .srt subtitle downloads containing not all line breaks +• Fixed download to SD card failing because some Android 5 devices are not CTF compliant +• Fixed downloading on Android KitKat +• Fixed corrupt video .mp4 file being recognized as audio file +• Fixed multiple localization problems, including wrong Chinese language codes +• [YouTube] Timestamps in description are clickable again diff --git a/fastlane/metadata/android/hi/changelogs/850.txt b/fastlane/metadata/android/hi/changelogs/850.txt new file mode 100644 index 00000000000..09f564614bf --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/850.txt @@ -0,0 +1 @@ +इस रिलीज़ में YouTube वेबसाइट संस्करण अपडेट किया गया था। पुराना वेबसाइट संस्करण मार्च में बंद होने जा रहा है और इसलिए आपको न्यूपाइप को अपग्रेड करना होगा। diff --git a/fastlane/metadata/android/hi/changelogs/860.txt b/fastlane/metadata/android/hi/changelogs/860.txt new file mode 100644 index 00000000000..da3aa75f98a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/860.txt @@ -0,0 +1,7 @@ +उन्नत +• सेव करें और रिस्टोर करें कि क्या पिच और टेंपो अनहुक हैं या नहीं +• प्लेयर में सपोर्ट डिस्प्ले कटआउट +• गोल दृश्य और ग्राहकों की संख्या +• कम डेटा का उपयोग करने के लिए यूट्यूब को अनुकूलित किया गया + +इस रिलीज़ में यूट्यूब से संबंधित 15 से अधिक बग ठीक किए गए थे। diff --git a/fastlane/metadata/android/hi/changelogs/870.txt b/fastlane/metadata/android/hi/changelogs/870.txt new file mode 100644 index 00000000000..849cc317d53 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/870.txt @@ -0,0 +1,2 @@ +यह एक हॉटफिक्स रिलीज़ है जो न्यूपाइप को बिना किसी बड़ी परेशानी के फिर से साउंडक्लाउड का उपयोग करने की अनुमति देता है। +साउंडक्लाउड के v2 एपीआई का उपयोग अब एक्सट्रैक्टर में किया जाता है और अमान्य क्लाइंट आईडी का पता लगाने में सुधार किया गया है। diff --git a/fastlane/metadata/android/hi/changelogs/900.txt b/fastlane/metadata/android/hi/changelogs/900.txt new file mode 100644 index 00000000000..78a617e47f4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/900.txt @@ -0,0 +1,14 @@ +New +• Subscription groups and sorted feeds +• Mute button in players + +Improved +• Allow opening music.youtube.com and media.ccc.de links in NewPipe +• Relocate two settings from Appearance to Content +• Hide 5, 15, 25 second seek options if inexact seek is enabled + +Fixed +• some WebM videos are not seekable +• database backup on Android P +• crash when sharing a downloaded file +• tons of YouTube extraction issue and more ... diff --git a/fastlane/metadata/android/hi/changelogs/910.txt b/fastlane/metadata/android/hi/changelogs/910.txt new file mode 100644 index 00000000000..18cf511312e --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/910.txt @@ -0,0 +1 @@ +फिक्स्ड डेटाबेस माइग्रेशन जो न्यूपाइप को कुछ दुर्लभ मामलों में शुरू होने से रोकता है। diff --git a/fastlane/metadata/android/hi/changelogs/920.txt b/fastlane/metadata/android/hi/changelogs/920.txt new file mode 100644 index 00000000000..1484a6bd0ff --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/920.txt @@ -0,0 +1,9 @@ +Improved + +• Added upload date and view count on stream grid items +• Improvements for the drawer header layout + +Fixed + +• Fixed mute button causing crashes on API 19 +• Fixed downloading of long 1080p 60fps videos diff --git a/fastlane/metadata/android/hi/changelogs/930.txt b/fastlane/metadata/android/hi/changelogs/930.txt new file mode 100644 index 00000000000..b23b01ea8ce --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/930.txt @@ -0,0 +1,19 @@ +New +• Search on YouTube Music +• Basic Android TV support + +Improved +• Added the ability to remove all watched videos from a local playlist +• Show message when content isn't supported yet instead of crashing +• Improved popup player resize with pinch gestures +• Enqueue streams on long press on background and popup buttons in channel +• Improved size handling of the drawer header title + +Fixed +• Fixed age restricted content setting not working +• Fixed certain kinds of reCAPTCHAs +• Fixed crash when opening bookmarks while playlist is `null` +• Fixed detection of network related exceptions +• Fixed visibility of group sort button in the subscriptions fragment + +and more diff --git a/fastlane/metadata/android/hi/changelogs/940.txt b/fastlane/metadata/android/hi/changelogs/940.txt new file mode 100644 index 00000000000..f9530bc68c4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/940.txt @@ -0,0 +1,16 @@ +New +• Add support for SoundCloud comments +• Add YouTube restricted mode setting +• Show PeerTube parent channel details + +Improved +• Show Kore button only for supported services +• Block player gestures that begin at the NavigationBar or StatusBar +• Change retry & subscribe buttons background color based on service color + +Fixed +• Fix download dialog freeze +• Open in browser button now really opens in browser +• Fix crash on opening videos and "Could not play this stream" + +and more diff --git a/fastlane/metadata/android/hi/changelogs/950.txt b/fastlane/metadata/android/hi/changelogs/950.txt new file mode 100644 index 00000000000..4f47a9959f7 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/950.txt @@ -0,0 +1,4 @@ +यह रिलीज़ तीन छोटे सुधार लाता है: +• Android 10+ पर फिक्स्ड स्टोरेज एक्सेस +• फिक्स्ड ओपनिंग कियोस्क +• लंबे वीडियो की निश्चित अवधि पार्सिंग diff --git a/fastlane/metadata/android/hi/changelogs/951.txt b/fastlane/metadata/android/hi/changelogs/951.txt new file mode 100644 index 00000000000..e933e5cbd48 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/951.txt @@ -0,0 +1,17 @@ +New +• Add search for subscription picker in the feed group dialog +• Add filter to the feed group dialog to show only ungrouped subscriptions +• Add playlist tab to main page +• Fast forward/rewind in background/pop-up player queue +• Display search suggestion: did you mean & showing result for + +Improved +• Drop writing application metadata in muxed files +• Do not remove failed streams from the queue +• Update status bar color to match toolbar color + +Fixed +• Fixed audio/video desync caused by floating point cumulative errors +• [PeerTube] Handle deleted comments + +and more diff --git a/fastlane/metadata/android/hi/changelogs/952.txt b/fastlane/metadata/android/hi/changelogs/952.txt new file mode 100644 index 00000000000..d228e3a2ddb --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/952.txt @@ -0,0 +1,7 @@ +Improved +• Auto-play is available for all services (instead of only for YouTube) + +Fixed +• Fixed related streams by supporting YouTube's new continuations +• Fixed age restricted YouTube videos +• [Android TV] Fixed lingering focus highlight overlay diff --git a/fastlane/metadata/android/hi/changelogs/954.txt b/fastlane/metadata/android/hi/changelogs/954.txt index 36536b8c7c3..87df3fb9c0a 100644 --- a/fastlane/metadata/android/hi/changelogs/954.txt +++ b/fastlane/metadata/android/hi/changelogs/954.txt @@ -1,8 +1,9 @@ • नए एप्लिकेशन वर्कफ़्लो: विस्तार पृष्ठ पर वीडियो चलाएं, प्लेयर को छोटा करने के लिए नीचे स्वाइप करें -• मीडियास्टाइल सूचनाएँ: सूचनाएँ, प्रदर्शन सुधार में अनुकूलन योग्य क्रियाएँ +• मीडियास्टाइल सूचनाएँ: सूचनाओं में अनुकूलन योग्य क्रियाएं, प्रदर्शन सुधार • डेस्कटॉप ऐप के रूप में न्यूपाइप का उपयोग करते समय मूल आकार परिवर्तन + • असमर्थित यूआरएल टोस्ट के मामले में खुले विकल्पों के साथ संवाद दिखाएं • रिमोट सुझावों के अनुपलब्धता पर अनुभव में सुधार • 720p60 (इन-ऐप प्लेयर) और 480p (पॉप-अप प्लेयर) के लिए डिफ़ॉल्ट वीडियो की गुणवत्ता वृद्धि - -• त्रुटियों में सुधार और बोहोत कुछ + +• त्रुटियों में सुधार और बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/959.txt b/fastlane/metadata/android/hi/changelogs/959.txt index 601c655acfd..a8879fec200 100644 --- a/fastlane/metadata/android/hi/changelogs/959.txt +++ b/fastlane/metadata/android/hi/changelogs/959.txt @@ -1,5 +1,3 @@ त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप। -पीयरट्यूब उदाहरणों की अद्यतन सूची जो न्यूपाइप द्वारा स्वचालित रूप से खोली जा सकती है। -अपडेट किए गए अनुवाद।त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप। -पीयरट्यूब उदाहरणों की अद्यतन सूची जो न्यूपाइप द्वारा स्वचालित रूप से खोली जा सकती है। +पीरट्यूब इंस्टेंस सूची जो निऊपाईप द्वारा स्वचालित रूप से खोली जा सकती है। अपडेट किए गए अनुवाद। diff --git a/fastlane/metadata/android/hi/changelogs/963.txt b/fastlane/metadata/android/hi/changelogs/963.txt new file mode 100644 index 00000000000..06ca8b0e2d9 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/963.txt @@ -0,0 +1 @@ +• [यूट्यूब] फिक्स्ड निश्चित चैनल निरंतरता diff --git a/fastlane/metadata/android/hi/changelogs/964.txt b/fastlane/metadata/android/hi/changelogs/964.txt new file mode 100644 index 00000000000..1238eb87691 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/964.txt @@ -0,0 +1,8 @@ +• Added support for chapters in player controls +• [PeerTube] Added Sepia search +• Re-added share button in video detail view and moved stream description into the tab layout +• Disable restoring brightness if brightness gesture is disabled +• Added list item to play video on kodi +• Fixed crash when no default browser is set on some devices and improve share dialogs +• Toggle play/pause with hardware space button in fullscreen player +• [media.ccc.de] Various fixes and improvements diff --git a/fastlane/metadata/android/hi/changelogs/965.txt b/fastlane/metadata/android/hi/changelogs/965.txt new file mode 100644 index 00000000000..eaed8c84778 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/965.txt @@ -0,0 +1,6 @@ +Fixed crash which occurred when reordering channel groups. +Fixed getting more YouTube videos from channels and playlists. +Fixed getting YouTube comments. +Added support for /watch/, /v/ and /w/ subpaths in YouTube URLs. +Fixed extraction of SoundCloud client id and geo-restricted content. +Added Northern Kurdish localization. diff --git a/fastlane/metadata/android/hi/changelogs/966.txt b/fastlane/metadata/android/hi/changelogs/966.txt new file mode 100644 index 00000000000..b7fdc182fa4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/966.txt @@ -0,0 +1,14 @@ +New: +• Add a new service: Bandcamp + +Improved: +• Add an option to have the app follow the device theme +• Prevent some crashes by showing an improved error panel +• Show more information on why content in unavailable +• Hardware space button triggers play/pause +• Show "Download started" toast + +Fixed: +• Fix very small thumbnail in video details while playing in the background +• Fix empty title in minimized player +• Fix last resize mode not being restored correctly diff --git a/fastlane/metadata/android/hi/changelogs/967.txt b/fastlane/metadata/android/hi/changelogs/967.txt new file mode 100644 index 00000000000..ba416b621a5 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/967.txt @@ -0,0 +1 @@ +यूरोपीय संघ में YouTube ठीक से काम नहीं कर रहा है। यह एक नई कुकी और गोपनीयता सहमति प्रणाली के कारण हुआ था जिसके लिए न्यूपाइप को एक सहमति कुकी सेट करने की आवश्यकता होती है। diff --git a/fastlane/metadata/android/hi/changelogs/968.txt b/fastlane/metadata/android/hi/changelogs/968.txt new file mode 100644 index 00000000000..3972a96c159 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/968.txt @@ -0,0 +1,7 @@ +Added channel details option to long-press menu. +Added functionality to rename Playlist Name from playlist interface. +Allow the user to pause while a video is buffering. +Polished the white theme. +Fixed overlapping fonts when using a larger font size. +Fixed no video on Formuler and Zephier devices. +Fixed various crashes. diff --git a/fastlane/metadata/android/hi/changelogs/969.txt b/fastlane/metadata/android/hi/changelogs/969.txt new file mode 100644 index 00000000000..59b2488e974 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/969.txt @@ -0,0 +1,8 @@ +• Allow installation on external storage +• [Bandcamp] Added support for displaying the first three comments on a stream +• Only show 'download has started' toast when download is started +• Do not set reCaptcha cookie when there is no cookie stored +• [Player] Improve cache performance +• [Player] Fixed player not automatically playing +• Dismiss previous Snackbars when deleting downloads +• Fixed trying to delete object not in list diff --git a/fastlane/metadata/android/hi/changelogs/970.txt b/fastlane/metadata/android/hi/changelogs/970.txt new file mode 100644 index 00000000000..f4ff5fe3483 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/970.txt @@ -0,0 +1,11 @@ +New +• Show content metadata (tags, categories, license, ...) below the description +• Added "Show channel details" option in remote (non-local) playlists +• Added "Open in browser" option to long-press menu + +Fixed +• Fixed rotation crash on video detail page +• Fixed "Play with Kodi" button in player always prompts to install Kore +• Fixed and improved setting import and export paths +• [YouTube] Fixed comment like count +And much more diff --git a/fastlane/metadata/android/hi/changelogs/971.txt b/fastlane/metadata/android/hi/changelogs/971.txt new file mode 100644 index 00000000000..48e9ddaa010 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/971.txt @@ -0,0 +1,3 @@ +हॉटफिक्स +• रिबफर के बाद प्लेबैक के लिए बफर बढ़ाएं +• प्लेयर में प्ले-क्यू आइकन पर क्लिक करने पर टैबलेट और टीवी पर क्रैश ठीक किया गया diff --git a/fastlane/metadata/android/hi/changelogs/972.txt b/fastlane/metadata/android/hi/changelogs/972.txt new file mode 100644 index 00000000000..318890d608c --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/972.txt @@ -0,0 +1,14 @@ +New +Recognize timestamps and hashtags in description +Added manual tablet mode setting +Added ability to hide played items in a feed + +Improved +Support Storage Access Framework properly +Better error handling of unavailable and terminated channels +The Android share sheet for Android 10+ users now shows the content title. +Updated Invidious instances and support Piped links. + +Fixed +[YouTube] Age restricted content +Prevent leaked window Exception when opening choice dialog diff --git a/fastlane/metadata/android/hi/changelogs/973.txt b/fastlane/metadata/android/hi/changelogs/973.txt new file mode 100644 index 00000000000..120359a24cd --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/973.txt @@ -0,0 +1,4 @@ +Hotfix +• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row +• Fix download dialog disappearing without doing anything if opened from the share menu +• Update a library related to opening external activities such as the Storage Access Framework file picker diff --git a/fastlane/metadata/android/hi/changelogs/974.txt b/fastlane/metadata/android/hi/changelogs/974.txt new file mode 100644 index 00000000000..e028a5e0b3a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/974.txt @@ -0,0 +1,5 @@ +Hotfix +• Fix buffering issues caused by YouTube throttling +• Fix YouTube comments extraction and crashes with disabled comments +• Fix YouTube music search +• Fix PeerTube livestreams diff --git a/fastlane/metadata/android/hi/changelogs/975.txt b/fastlane/metadata/android/hi/changelogs/975.txt new file mode 100644 index 00000000000..8a35a7e2810 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/975.txt @@ -0,0 +1,17 @@ +New +• Show a thumbnail preview while seeking +• Detect disabled comments +• Allow marking a feed item as watched +• Show comment hearts + +Improved +• Improve metadata and tags layout +• Apply service color to UI components + +Fixed +• Fix thumbnail in mini player +• Fix endless buffering on duplicate queue items +• Some player fixes like rotation and faster closing +• Fix ReCAPTCHA remaining loaded in background +• Disable clicks while refreshing feed +• Fix some downloader crashes diff --git a/fastlane/metadata/android/hi/changelogs/976.txt b/fastlane/metadata/android/hi/changelogs/976.txt new file mode 100644 index 00000000000..4f868872bbe --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/976.txt @@ -0,0 +1,10 @@ +• Added option to directly open player in fullscreen +• Allow choosing which types of search suggestions to show +• Dark theme now darker + dark splash screen added +• Improved file picker to gray out unwanted files +• Fixed importing YouTube subscriptions +• Replaying a stream requires on tap on the replay button again +• Fixed closing audio session +• [Android TV] Fixed long seekbar jumps when using a DPad + +To see further changes, view the changelog (and blog post) from the Links tab below. diff --git a/fastlane/metadata/android/hi/changelogs/977.txt b/fastlane/metadata/android/hi/changelogs/977.txt new file mode 100644 index 00000000000..df2eb6c9ea7 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/977.txt @@ -0,0 +1,10 @@ +• Added a "play next" button to the long press menu +• Added YouTube shorts path prefix to intent filter +• Fixed Settings import +• Swap seekbar position with player buttons in Queue screen +• Various fixes related to MediasessionManager +• Fixed seekbar not completed after video end +• Disabled media tunneling on RealtekATV +• Expanded minimized player buttons clickable area + +To see further changes, view the changelog (and blog post) from the Links tab below. diff --git a/fastlane/metadata/android/hi/changelogs/978.txt b/fastlane/metadata/android/hi/changelogs/978.txt new file mode 100644 index 00000000000..bb032f753df --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/978.txt @@ -0,0 +1 @@ +एक नए न्यूपाइप संस्करण के लिए चेक को ठीक किया गया। यह चेक कभी-कभी बहुत जल्दी निष्पादित किया गया था और इसलिए ऐप क्रैश हो गया। इसे अभी ठीक किया जाना चाहिए। diff --git a/fastlane/metadata/android/hi/changelogs/979.txt b/fastlane/metadata/android/hi/changelogs/979.txt new file mode 100644 index 00000000000..f6cec22ceb8 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/979.txt @@ -0,0 +1,2 @@ +- प्लेबैक फिर से शुरू करना +- यह सुनिश्चित करने के लिए सुधार कि सेवा जो यह निर्धारित करती है कि न्यूपाइप को नए संस्करण की जांच करनी चाहिए या नहीं, पृष्ठभूमि में शुरू नहीं हुई है diff --git a/fastlane/metadata/android/hi/changelogs/980.txt b/fastlane/metadata/android/hi/changelogs/980.txt new file mode 100644 index 00000000000..bd3086c6817 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/980.txt @@ -0,0 +1,13 @@ +New +• Added "Add to playlist" option to share menu +• Added support for y2u.be and PeerTube short links + +Improved +• Made Playback-Speed-Controls more compact +• Feed highlights new items now +• "Show watched items" option in the feed is now saved + +Fixed +• Fixed YouTube likes and dislikes extraction +• Fixed automatic replay after returning from the background +And much more diff --git a/fastlane/metadata/android/hi/changelogs/981.txt b/fastlane/metadata/android/hi/changelogs/981.txt new file mode 100644 index 00000000000..a2c1b19b2b3 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/981.txt @@ -0,0 +1,2 @@ +Android 11+ पर बफ़रिंग के बाद विफल प्लेबैक रिज्यूमे को ठीक करने के लिए MediaParser समर्थन को हटा दिया गया। +प्लेबैक समस्याओं को ठीक करने के लिए Philips QM16XE पर मीडिया टनलिंग अक्षम की गई। diff --git a/fastlane/metadata/android/hi/changelogs/982.txt b/fastlane/metadata/android/hi/changelogs/982.txt new file mode 100644 index 00000000000..953fcd801df --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/982.txt @@ -0,0 +1 @@ +फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है। diff --git a/fastlane/metadata/android/hi/changelogs/983.txt b/fastlane/metadata/android/hi/changelogs/983.txt new file mode 100644 index 00000000000..efbd0557c49 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/983.txt @@ -0,0 +1,9 @@ +Add new double-tap-to-seek UI and behaviour +Make settings searchable +Highlight pinned comments as such +Add open-with-app support for FSFE's PeerTube instance +Add error notifications +Fix replay of first queue item on player change +Wait longer when buffering during livestreams before failing +Fix order of local search results +Fix empty item fields in play queue diff --git a/fastlane/metadata/android/hi/changelogs/984.txt b/fastlane/metadata/android/hi/changelogs/984.txt new file mode 100644 index 00000000000..3b18b46652a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/984.txt @@ -0,0 +1,7 @@ +Load enough initial items in lists to fill the whole screen and to fix scrolling on tablets and TVs +Fix random crashes while scrolling through lists +Have the player fast seek overlay arc go under the system UI +Revert changes to cutouts when playing in multi window, causing the misplaced player regression on some phones +Increase compileSdk from 30 to 31 +Update error reporting library +Refactor some code in the player diff --git a/fastlane/metadata/android/hi/changelogs/985.txt b/fastlane/metadata/android/hi/changelogs/985.txt new file mode 100644 index 00000000000..071ab64e338 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/985.txt @@ -0,0 +1 @@ +फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है diff --git a/fastlane/metadata/android/hi/changelogs/986.txt b/fastlane/metadata/android/hi/changelogs/986.txt new file mode 100644 index 00000000000..49f7478e6db --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/986.txt @@ -0,0 +1,16 @@ +New +• Notifications for new streams +• Seamless transition between background and video players +• Change pitch by semitones +• Append the main player queue to a playlist + +Improved +• Remember speed/pitch step size +• Mitigate initial long buffering in the video player +• Improve player UI for Android TV +• Confirm before deleting all downloaded files + +Fixed +• Fix media button not hiding player controls +• Fix playback reset on player type change +• Fix rotating the playlist dialog diff --git a/fastlane/metadata/android/hi/changelogs/987.txt b/fastlane/metadata/android/hi/changelogs/987.txt new file mode 100644 index 00000000000..c3404e2a22f --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/987.txt @@ -0,0 +1,12 @@ +New +• Support delivery methods other than progressive HTTP: faster playback loading time, fixes for PeerTube and SoundCloud, playback of recently-ended YouTube livestreams +• Add button to add a remote playlist to a local one +• Image preview in Android 10+ share sheet + +Improved +• Improve playback parameters dialog +• Move subscription import/export buttons to three-dot menu + +Fixed +• Fix removing fully watched videos from playlist +• Fix share menu theme and "add to playlist" entry diff --git a/fastlane/metadata/android/hi/changelogs/988.txt b/fastlane/metadata/android/hi/changelogs/988.txt new file mode 100644 index 00000000000..5689958ad93 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/988.txt @@ -0,0 +1,2 @@ +[यूट्यूब] किसी भी वीडियो को चलाने का प्रयास करते समय "कोई स्ट्रीम नहीं मिल सका" त्रुटि को ठीक करें +[यूट्यूब] ठीक करें "निम्न सामग्री इस ऐप पर उपलब्ध नहीं है।" अनुरोधित वीडियो के बजाय दिखाया गया संदेश diff --git a/fastlane/metadata/android/hi/changelogs/989.txt b/fastlane/metadata/android/hi/changelogs/989.txt new file mode 100644 index 00000000000..d868b7fa54e --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/989.txt @@ -0,0 +1,3 @@ +• [यूट्यूब] किसी भी वीडियो को चलाने का प्रयास करते समय असीमित लोडिंग को ठीक करें +• [यूट्यूब] कुछ वीडियो पर थ्रॉटलिंग ठीक करें +• jsoup लाइब्रेरी को 1.15.3 में अपग्रेड करें, जिसमें सुरक्षा समाधान शामिल है diff --git a/fastlane/metadata/android/hi/changelogs/990.txt b/fastlane/metadata/android/hi/changelogs/990.txt new file mode 100644 index 00000000000..e12c20ba589 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/990.txt @@ -0,0 +1,15 @@ +This release drops support for Android 4.4 KitKat, now the minimum version is Android 5 Lollipop! + +New +• Download from long-press menu +• Hide future videos in feed +• Share local playlists + +Improved +• Refactor the player code into small components: less RAM used, less bugs +• Improve thumbnails' scale mode +• Vector-ize image placeholders + +Fixed +• Fix various issues with the player notification: outdated/missing media info, distorted thumbnail +• Fix fullscreen using 1/4 of screen diff --git a/fastlane/metadata/android/hi/changelogs/991.txt b/fastlane/metadata/android/hi/changelogs/991.txt new file mode 100644 index 00000000000..a365d5c4456 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/991.txt @@ -0,0 +1,13 @@ +नया +• त्रुटि पैनल में "ब्राउज़र में खोलें" बटन जोड़ें +• चैनल समूहों को सूची के रूप में प्रदर्शित करने का विकल्प जोड़ें +• [यूट्यूब] टाइमस्टैम्प यूआरएल साझा करने के लिए स्ट्रीम सेगमेंट पर लंबे समय तक क्लिक करें +• मिनी प्लेयर में क्यू प्ले बटन जोड़ें + +उन्नत +• आइसलैंडिक स्थानीयकरण जोड़ें और कई अन्य अनुवादों को अपडेट करें +• कई आंतरिक सुधार + +हल किया गया +• कई सारे क्रैश को ठीक करें +• [यूट्यूब] कुछ देशों में लोडिंग चैनल, गैर-समर्पित फ़ीड और प्लेबैक समस्याओं को ठीक करें diff --git a/fastlane/metadata/android/hi/changelogs/992.txt b/fastlane/metadata/android/hi/changelogs/992.txt new file mode 100644 index 00000000000..d4024fd0201 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/992.txt @@ -0,0 +1,17 @@ +नया +• वीडियो विवरण में सब्सक्राइबर गिनती +• कतार से डाउनलोड करें +• स्थायी रूप से एक प्लेलिस्ट थंबनेल सेट करें +• लंबे समय तक प्रेस हैशटैग और लिंक +• कार्ड दृश्य मोड + +बेहतर +• बड़ा मिनी-प्लेयर बंद बटन +• चिकना थंबनेल डाउनस्केलिंग +• लक्ष्य Android 13 (API 33) +• अब मांगने से खिलाड़ी रुक जाता है + +सही किए +• DeX/माउस पर ओवरले ठीक करें +• बिना किसी अलग ऑडियो स्ट्रीम के पृष्ठभूमि प्लेयर की अनुमति दें +• विभिन्न यूट्यूब फिक्स और अधिक… 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/hi/changelogs/995.txt b/fastlane/metadata/android/hi/changelogs/995.txt new file mode 100644 index 00000000000..63ed335a4bf --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/995.txt @@ -0,0 +1,16 @@ +नया +• चैनल टैब्स का समर्थन करें +• छवि गुणवत्ता का चयन करें +• सभी छवियों के यूआरएल प्राप्त करें + +सुधार किए +• प्लेयर इंटरफ़ेस की पहुंच +• केवल-वीडियो डाउनलोड के लिए बेहतर ऑडियो चयन +• साझा प्लेलिस्ट सामग्री में प्लेलिस्ट और वीडियो नाम शामिल करने का विकल्प + +ठीक किए +• [यूट्यूब] लाइक पाने की संख्या ठीक करें +• पॉपअप और क्रैश पर प्रतिक्रिया नहीं देने वाले प्लेयर को ठीक करें +• भाषा चयनकर्ता में गलत भाषाओं का चयन ठीक करें +• प्लेयर ऑडियो फोकस म्यूट का सम्मान नहीं कर रहा था +• प्लेलिस्ट में आइटम जोड़ना कभी-कभी काम नहीं कर रहा था diff --git a/fastlane/metadata/android/hi/changelogs/996.txt b/fastlane/metadata/android/hi/changelogs/996.txt new file mode 100644 index 00000000000..0a9369d878f --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/996.txt @@ -0,0 +1,2 @@ +Media.ccc.de में चैनल/कॉन्फ़्रेंस खोलते समय NullPointerException को ठीक किया गया। +ग्रिंच ने आपको हमारा क्रिसमस उपहार तोड़ने की कोशिश की, लेकिन हमने इसे ठीक कर दिया। diff --git a/fastlane/metadata/android/hi/changelogs/997.txt b/fastlane/metadata/android/hi/changelogs/997.txt new file mode 100644 index 00000000000..652935884ef --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/997.txt @@ -0,0 +1,17 @@ +नया +• टिप्पणियों के उत्तर जोड़ें +• प्लेलिस्ट को पुन: व्यवस्थित करने की अनुमति दें +• प्लेलिस्ट विवरण और अवधि दिखाएं +• सेटिंग्स रीसेट करने की अनुमति दें + +सुधार +• [एंड्रॉइड 13+] कस्टम अधिसूचना क्रियाएं पुनर्स्थापित करें +• अपडेटस की जांच के लिए सहमति का अनुरोध करें +• बफ़रिंग के दौरान नोटीफिकेशन से चलाने/रोकने की अनुमति दें +• कुछ सेटिंग्स पुनः व्यवस्थित करें + +ठीक किए +• [यूट्यूब] लोड न होने वाली टिप्पणियों को ठीक करें, साथ ही अन्य फिक्स और सुधार भी +• सेटिंग्स आयात में भेद्यता को हल करें और JSON पर स्विच करें +• विभिन्न डाउनलोड सुधार +• खोज पाठ को ट्रिम करें diff --git a/fastlane/metadata/android/hi/changelogs/998.txt b/fastlane/metadata/android/hi/changelogs/998.txt new file mode 100644 index 00000000000..e171cea2bc2 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/998.txt @@ -0,0 +1,4 @@ +HTTP 403 त्रुटियों के कारण YouTube द्वारा कोई स्ट्रीम न चलाए जाने की समस्या को ठीक किया गया। + +YouTube वीडियो के बीच में कभी-कभी आने वाली HTTP 403 त्रुटियों को अभी तक ठीक नहीं किया गया है। +इस समस्या को जल्द से जल्द किसी अन्य हॉटफ़िक्स रिलीज़ में संबोधित किया जाएगा। diff --git a/fastlane/metadata/android/hi/changelogs/999.txt b/fastlane/metadata/android/hi/changelogs/999.txt new file mode 100644 index 00000000000..619f9380404 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/999.txt @@ -0,0 +1,12 @@ +यह हॉटफ़िक्स रिलीज़ YouTube वीडियो के बीच में HTTP 403 त्रुटियाँ ठीक करता है। + +नया +• [SoundCloud] on.soundcloud.com URL के लिए समर्थन जोड़ें + +सुधार किया गया +• [Bandcamp] रेडियो कियोस्क में अतिरिक्त जानकारी दिखाएँ + +ठीक किया गया +• [YouTube] वीडियो की शुरुआत में या बीच में कभी-कभी होने वाली HTTP 403 त्रुटियाँ ठीक करें +• [YouTube] अधिक चैनल हेडर प्रकारों से अवतार और बैनर संजोए +• [Bandcamp] विभिन्न बग ठीक करें और हमेशा HTTPS का उपयोग करें diff --git a/fastlane/metadata/android/hr/full_description.txt b/fastlane/metadata/android/hr/full_description.txt index 14826925eba..1e3977d33f1 100644 --- a/fastlane/metadata/android/hr/full_description.txt +++ b/fastlane/metadata/android/hr/full_description.txt @@ -1 +1 @@ -NewPipe ne koristi nijednu Googleovu biblioteku niti YouTube API, već samo analizira web-stranicu kako bi pribavio potrebne podatke. Stoga se ovaj program može koristiti na uređajima bez da su Googleove usluge instalirane. Također, za korištenje programa NewPipe nije potreban YouTube račun. NewPipe je slobodan program otvorenog koda. +NewPipe ne koristi nijednu Googleovu biblioteku niti YouTube API, već samo analizira web-stranicu kako bi pribavio potrebne podatke. Stoga se ova aplikacija može koristiti na uređajima bez instaliranih Google usluga. Također, NewPipe se može koristiti bez YouTube računa. NewPipe je slobodna aplikacija otvorenog koda. 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/64.txt b/fastlane/metadata/android/hu/changelogs/64.txt index 4ba4191a9ff..206e430c95f 100644 --- a/fastlane/metadata/android/hu/changelogs/64.txt +++ b/fastlane/metadata/android/hu/changelogs/64.txt @@ -1,8 +1,8 @@ ### Fejlesztések - Lehetőség a videó minőségének korlátozására mobiladat-kapcsolaton #1339 -- Az alkalmazás bezárásáig megjegyzi a fényerő-beállítást #1442 -- Jobb letöltési teljesítmény gyengébb CPU-kon #1431 -- médiamunkamenet (működő) támogatásának hozzáadása #1433 +- A munkamenet erejéig megjegyzi a fényerő-beállítást #1442 +- Jobb letöltési teljesítmény gyengébb CPU esetén #1431 +- (működő) médiamunkamenet támogatásának hozzáadása #1433 ### Javítások - A letöltések megnyitásánál történő összeomlás javítása (a javítás mostantól érhető el a kiadási verziókban is) #1441 diff --git a/fastlane/metadata/android/hu/changelogs/65.txt b/fastlane/metadata/android/hu/changelogs/65.txt index c3ee63eccdb..8893b5c0d32 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 +- Burgermenü animáció tiltása #1486 - a letöltések törlésének visszavonása #1472 -- Letöltési lehetőség a #1498 megosztás menüben -- Megosztási lehetőség hozzáadva a hosszú érintéssel #1454 -- A fő játékos minimalizálása a 1354-es kijáratnál -- A könyvtár verziójának frissítése és az adatbázis biztonsági mentésének javítása #1510 +- Letöltési a megosztásban #1498 +- Megosztás a hosszú érintéshez #1454 +- Fő lejátszó minimalizálása a kilépésnél #1354 +- Könyvtár verzió frissítés é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ő panelt, hogy támogasson gyorsabb csévélést is. + - Csend-átugrás hozzáadása a sebesség vezérlőpulthoz. Ez hasznos lehet hangoskönyvek és bizonyos zenék esetén, ezzel folyamatos élményt nyújthat (azonban tönkre teheti a csendes zenéket =\\). + - Á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. Immáron csak egy metaadatforrás van és közvetlenül elérhető a lejátszás megkezdésekor. + - Javítva a távoli lejátszási lista metaadatok frissülése, amikor új metaadatok állnak rendelkezésre a lejátszási lista töredékének megnyitásakor. + - Különféle UI javítások: #1383, a háttérlejátszó értesítési vezérlői mostantól fehérek, a felugró lejátszót egyszerűbben le lehet állítani eldobással +- Újraírt kivonatoló 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 - - #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. +- a #1440 Hibás 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ése, 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ő túllépés felugró mód esetén. #1463 (javítva #640) +- Fő videólejátszó #1509 + - [#1412] a háttérben levő ismétlőmód NPE-t okozhatott. + - Felugró mód engedélyezése nélkül való átváltás esetén nem záródik be. diff --git a/fastlane/metadata/android/hu/changelogs/66.txt b/fastlane/metadata/android/hu/changelogs/66.txt new file mode 100644 index 00000000000..e440b88cb23 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/66.txt @@ -0,0 +1,33 @@ +# v0.13.7 változásnaplója + +### Javítva +- v0.13.6a szűrés javítása + +# v0.13.6 változásnaplója + +### Fejlesztések + +- Burgermenü animációk kikapcsolása #1486 +- Letöltések törlésének visszavonása #1472 +- Letöltés megjelenítése a megosztás menüben #1498 +- Megosztás hozzáadása a hosszú lenyomás menühöz #1454 +- Főlejátszó minimalizálása kilépéskor #1354 +- Könyvtár verzió frissítés és adatbázis biztonsági mentés javítás #1510 +- ExoPlayer 2.8.2 Frissítés #1392 + - Visszajátszási sebesség irányítópult újradolgozása a különböző sebességléptek támogatására. + - Kapcsoló hozzáadása a visszajátszási vezérlőpulthoz a hangtalan részek átugrására. Hasznos lehet a hangoskönyvekhez és egyes zenestílusokhoz, és folyamatos zene élmányt eredményezhet (viszont tönkre tehet egy zenét amiben túl sok csönd van =\\). + - Média forrás felbontás újradolgozása a metaadat automatikus lejátszóban való továbbítása érdekében. Már csak egyetlen metaadat forrás áll rendelkezésre lejátszáskor. + - Lejátszási lista darabka megnyitásakor megjelenő új metaadatnál nincs frissülés. + - Számos felület javítás: #1383, háttérben futó lejátszó gombja mindig fehérek, könnyebb a bezárás elhúzással +- Multiszervizes kibontó újradolgozása + +### Javítások + +- Javítás #1440 Hibás videó infó elrendezés #1491 +- Előzmény megtekintés javítás #1497 + - #1495, a metaadat frissítése (előnézet, cím és videó szám) amint a felhasználó belép a lejátszólistába. + - #1475, adatbázis nézet regisztrálásra kerül a külső lejátszó elemrészleteinél. +- Időtúllépés javítása kiugró ablaknál. #1463 (Fixed #640) +- Fő videólejátszó javítás #1509 + - [#1412] Az ismétlő mód NPE-t okoz, amikor a háttérben futó alkalmazás ilyen parancsot kap. + - A felugró ablak mód letiltása esetén felugró mód nem zárja be az appot. 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/69.txt b/fastlane/metadata/android/hu/changelogs/69.txt new file mode 100644 index 00000000000..dc4fa0cf426 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/69.txt @@ -0,0 +1,19 @@ +### Új +- Hosszú lenyomásnál törlés és megosztás a feliratkozásoknál #1516 +- Tablet felület és rácslistát elrendezés #1617 + +### Fejlesztések +- Legutolsó képarány mentése és betöltése #1748 +- Letöltések egyszerű elrendezése teljes videó nevekkel #1771 +- Feliratkozások törlése és megosztása közvetlenül a feliratkozások fülön #1516 +- Ha a lista végére kerül egy videó, akkor a lista végeztével folytatja azzal #1783 +- Külön beállítások a hangerő és fényerő gesztusokhoz #1644 +- Nyelvek támogatása #1792 + +### Javítások +- Idő elemzés fixálása a . format formátumhoz, így Finnországban is használható a NewPipe +- Feliratkozó számláló javítása +- Az API 28+ eszközök esetén előtéri szolgáltatás elérés hozzáadása #1830 + +### Ismert hibák +- Lejátszási státusz nem menthető Android P-n diff --git a/fastlane/metadata/android/hu/changelogs/70.txt b/fastlane/metadata/android/hu/changelogs/70.txt new file mode 100644 index 00000000000..3052e2c22a3 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/70.txt @@ -0,0 +1,25 @@ +FIGYELEM: Az előzőhöz hasonlóan ez is bugoktól hemzseg. A 17-i teljes leállás után jobb egy bugos verzió mint a semmi. Nincs igazam? ¯\_(ツ)_/¯ + +### Fejlesztések +* letöltött fájl egy érintéssel megnyitható #1879 +* android 4.1 - 4.3 támogatása megszűnt #1884 +* régi lejátszó eltávolítása #1884 +* videók eltávolítása a listából jobbra húzással #1915 +* automata hozzáadott videók eltávolítása manuális hozzáadásnál #1878 +* Utófeldolgozás a letöltésekhez és hiányzó funkciók pótlása #1759 @kapodamy jóvoltából + * Utófeldolgozási infrastruktúra + * Rendes hibakezelő "infrastruktúra" (letöltéshez) + * Több párhuzamos letöltés helyett sorba letöltés + * Sorbarendezett letöltések áthelyezése az app data-ba (`.giga` fájlok) + * Maximum letöltési újrapróbálkozás implementálása + * Rendes többszálú letöltés szüneteltetés + * Letöltések megállítása mobiladatra váltáskor (sosem működik, lásd második pont) + * Szálak számának mentése a következő letöltésekhez + * Sok zavaros kód javítása + +### Javítás +* Limitált adathasználat melletti legnagyobb felbontás használata esetén fagyás javítása #1835 +* Kiugró ablakos lejátszó fagyás javítása #1874 +* NPE a háttérben futó lejátszó megnyitásakor #1901 +* Új videók hozzáadásának javítása ha fel van töltve a lista automata videókkal #1878 +* A megfejtett leállás hiba javítása diff --git a/fastlane/metadata/android/hu/changelogs/71.txt b/fastlane/metadata/android/hu/changelogs/71.txt new file mode 100644 index 00000000000..02b5f05403a --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/71.txt @@ -0,0 +1,10 @@ +### Fejlesztések +* App frissítések értesítés hozzáadása a GitHub verzióhoz (#1608 @krtkush jóvoltából) +* Különféle javítások a letöltőhöz (#1944 @kapodamy jóvoltából): + * hiányzó fehér gombok pótlása és ikon színek módosítása + * megbizonyosodni arról, hogy az iterátor kezdésre kész e (fixes #2031) + * az új muxer lehetővé teszi az újbóli letöltés próbálkozást az "sikertelen utómunkálat" hiba esetén + * az új MPEG-4 muxer javítja ha a videó és hang nincs szinkronban (#2039) + +### Javítás +* YouTube élő steam-el leállnak egy idő után (#1996 @yausername jóvoltából) diff --git a/fastlane/metadata/android/hu/changelogs/730.txt b/fastlane/metadata/android/hu/changelogs/730.txt new file mode 100644 index 00000000000..f588f1ed5cb --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/730.txt @@ -0,0 +1,2 @@ +# Javítás +- Funkció hiba feloldás újabb gyors javítása. diff --git a/fastlane/metadata/android/hu/changelogs/740.txt b/fastlane/metadata/android/hu/changelogs/740.txt new file mode 100644 index 00000000000..b75a03e4908 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/740.txt @@ -0,0 +1,23 @@ +

    Fejlesztések

    +
      +
    • kommentekben levő linkek kattinthatóak, szöveg méret növelése
    • +
    • kommentben levő időlinknél oda ugrik
    • +
    • preferált fül mutatása az utoljára kijelölt alapján
    • +
    • lejátszás lista hozzáadása amikor hosszan nyomja a 'Háttér' gombot a lista ablakban
    • +
    • megosztott szövegben keresés ha nem link
    • +
    • "megosztás jelenlegi időben" gomb hozzáadása a fő videó lejátszóhoz
    • +
    • fő lejátszónál megjelenik a bezárás gomb, ha a lista végére ért
    • +
    • "Közvetelnül háttérben lejátszás" hozzáadása a hosszú nyomás menühöz a videó lista elemekhez
    • +
    • Angol fordítások javítása a Lejátszás/Listáhozadás parancsoknál
    • +
    • kisebb teljesítményi javítás
    • +
    • nem használt fájlok eltávolítása
    • +
    • ExoPlayer frissítése 2.9.6-ra
    • +
    • egyéni linkek támogatása
    • +
    +

    Javítás

    +
      +
    • scroll javítása kikapcsolt kommentek és streamek esetében
    • +
    • CheckForNewAppVersionTask elindul amikor nem kéne javítása
    • +
    • youtube feliratkozó import javítása: hibás URL címek figyelmen kívül hagyása, üres címmel ellátottak megtartása
    • +
    • helytelen youtube url cím javítása: aláírás tag név név nem mindig "aláírás", mely megakadályozza a videók betöltését
    • +
    diff --git a/fastlane/metadata/android/hu/changelogs/750.txt b/fastlane/metadata/android/hu/changelogs/750.txt new file mode 100644 index 00000000000..f4f26a28ba5 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/750.txt @@ -0,0 +1,22 @@ +Újdonság +Lejátszás folytatás #2288 +• Videó folytatása ott ahol leállításra került +Letöltő Downloader javítások #2149 +• Háttértár Hozzáférés Keretrendszer használata az SD kártyára való mentéshez +• Új mp4 muxer +• Opcionálisan megváltoztatható a letöltési könyvtár letöltés előtt +• Mért hálózatok tiszteletben tartása + + +Fejlesztések +• gema string-ek eltávolítása #2295 +• Auto-elforgatás használat változások életciklus aktivitás közben #2444 +• Hosszúnyomós menük konzisztensebb viselkedése #2368 + +Javítás +• Kiválasztott felirat neve nem látszódásának javítása #2394 +• Ha nem sikerül a frissítés keresése, nem omlik össze (GitHub version) #2423 +• Letöltés nem akad meg 99,9%-nál #2440 +• Lejátszási lista metaadatainak frissítése #2453 +• [SoundCloud] Lejátszásilista betöltésnél levő összeomlás javítása TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Nem kielemezhető a videó hossza javítva TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hu/changelogs/760.txt b/fastlane/metadata/android/hu/changelogs/760.txt new file mode 100644 index 00000000000..e511130bb8a --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/760.txt @@ -0,0 +1,43 @@ +Változások a 0.17.1-ban + +Új +• Tháj fordítás + + +Fejlesztések +• Lejátszás innen lista funkció újra hozzáadása a hosszúnyomás menühöz #2518 +• Kapcsoló hozzáadása a SAF-hoz / régi fájl kiválasztó #2521 + +Javítások +• App váltásnál a letöltés nézetnél eltűnő gombok javítása #2487 +• Lejátszási pozíció elmentődik, de nem menti az előzményeket +• Listanézet visszajátszás pozíciója által okozott csökkentett teljesítmény gondok javítása #2517 +• [Kivonatoló] ReCaptchaActivity javítása #2527, TeamNewPipe/NewPipeExtractor#186 +• [Kivonatoló] [YouTube] Lista eredményes keresésnél felmerülő hiba javítása TeamNewPipe/NewPipeExtractor#185 + + + +Változások a 0.17.0-ban + +Új +Lejátszás folytatás #2288 +• Videók ott folytatása, hol abba maradtak +Letöltő Javítások #2149 +• Tárhely Hozzáférés Keretrendszer használata a külső SD kártyára való mentéshez +• Új mp4 muxer +• Opcionálisan megváltoztatható a letöltési könyvtár letöltés előtt +• Fizetős hálózatok tiszteletben tartása + + +Fejlesztések +• Gema string-ek eltávolítása #2295 +• Munkamenet közbeni (auto)elforgatás változtatások #2444 +• Hosszúnyomás menük konzisztensebbek #2368 + +Javítások +• Egyes felirat nevek nem jelentek meg #2394 +• Sikertelen frissítés esetén most már nem omlik össze (GitHub verzió) #2423 +• Letöltés nem áll meg 99,9%-nál #2440 +• Lejátszási lista metaadat frissítése #2453 +• [SoundCloud] Lejátszásilista betöltésnél való összeomlás javítása TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Videó hossza nem kiszámítható hiba javítása TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hu/changelogs/770.txt b/fastlane/metadata/android/hu/changelogs/770.txt new file mode 100644 index 00000000000..b56f3328690 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/770.txt @@ -0,0 +1,4 @@ +Változások a 0.17.2-ben + +Javítás +• Videó nem volt elérhető javítása diff --git a/fastlane/metadata/android/hu/changelogs/780.txt b/fastlane/metadata/android/hu/changelogs/780.txt new file mode 100644 index 00000000000..74600667c33 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/780.txt @@ -0,0 +1,12 @@ +Változások a 0.17.3-ban + +Fejlesztések +• Opció a lejátszási státusz törlésére #2550 +• Rejtett mappák mutatása a fájl kiválasztónál #2591 +• `invidio.us` címek megnyitása NewPipe-al #2488 +• `music.youtube.com` címek megnyitása TeamNewPipe/NewPipeExtractor#194 + +Javítások +• [YouTube] 'java.lang.IllegalArgumentException javítva #192 +• [YouTube] élő streamek immáron működnek TeamNewPipe/NewPipeExtractor#195 +• Videó letöltésénél Android Pie-nál teljesítménybeli probléma javítása #2592 diff --git a/fastlane/metadata/android/hu/changelogs/790.txt b/fastlane/metadata/android/hu/changelogs/790.txt new file mode 100644 index 00000000000..37ea82b0147 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/790.txt @@ -0,0 +1,14 @@ +Fejlesztések +• Hosszabb cím hozzáadása a gyengék látók miatt #2655 +• Jobban értelmezhető és következetesebb a letöltés beállítások nyelvezete #2637 + +Javítások +• Letöltött fájl utolsó byte-jának ellenőrzése #2646 +• Videó részleti között szkrollozás fixálva #2672 +• A kereső rubrika kitörlés animációja nem duplázódik #2695 +• [SoundCloud] client_id kivonása fixálva #2745 + +Fejlesztés +• Hiányzó összefüggések poótlása melyek a NewPipeExtractor-ból jönnek a NewPipe rendszerbe #2535 +• Migráció AndroidX-be #2685 +• Frissítés ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/hu/changelogs/800.txt b/fastlane/metadata/android/hu/changelogs/800.txt new file mode 100644 index 00000000000..c8abbf126fa --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/800.txt @@ -0,0 +1,27 @@ +Új +• P2P támogatás nélküli PeerTube támogatás (#2201) [Beta]: + ◦ Videó megtekintés és letöltés PeerTube munkamenetekből + ◦ Az egész PeerTube világ elérése egy opció menüből + ◦ Hiba léphet fel az SSL kézfogás során Anrdoid 4.4 és 7.1 esetén, amikor hálózati hibára fut a egyes munkamenetekhez való hozzáférésnél. + +• Letöltőt (#2679): + ◦ Hátralevő letöltési idő kalkulálása + ◦ Opus letöltése (webm fájlok) ogg-ként + ◦ Hosszas szüneteltetés után lejárt letöltési link helyreállítása + +Fejlesztések +• Kioszkdarab tudomására hozni a preferált kontentországot, és teljesítményjavítás minden főlapon #2742 +• Új fordítások és letöltő implementációk a kivonatolóból #2713 +• Az "Alap kioszk" sor lefordítható +• Fekete navigációs bár a fekete témához #2569 + +Javítások +• Egy bug javítása, amely nem negedte a felugró lejátszó áthelyezését, ha véletlen másik ujjat is érzékelt #2772 +• Feltöltő nélküli lejátszási listák engedélyezése, a #2724-es hibával kapcsolatos összeomlások javítása, TeamNewPipe/NewPipeExtractor#219 +• TLS1.1/1.2 bekapcsolása Android 4.4 eszközökön (API 19/KitKat) hogy fixálja a TLS kézfogást a MediaCCC-vel, és egyes PeerTube munkamenetekkel #2792 +• [SoundCloud] client_id extraction TeamNewPipe/NewPipeExtractor javítva #217 +• [SoundCloud] Audió sáv mentés javítása + +Frissítés +• ExoPlayer frissítése 2.10.8 #2791-re #2816 +• Gradle frissítése 3.5.1-re, és Kotlin támogatás hozzáadása #2714 diff --git a/fastlane/metadata/android/hu/changelogs/810.txt b/fastlane/metadata/android/hu/changelogs/810.txt new file mode 100644 index 00000000000..d8e9c7e3f7c --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/810.txt @@ -0,0 +1,19 @@ +Új +• indexkép mutatása a lezárt képernyőn ha a háttérben fut + +Fejlesztések +• Háttér hosszú nyomásánál vagy felugró gombnál hozzáadja a helyi lejátszólistát +• Fő fülek scrollozhatóak, és egy fül esetén elrejtődik a többi +• Indexképek limitálása a háttérben futó lejátszónál +• Ál-indexkép használata hiányos helyi listákhoz +• *.opus kiterjesztés használata *.webm helyett a "WebM Opus" letöltési opciónál +• Új gomb a letöltések és előzmények törlésére a Letöltések-nél +• [YouTube] Támogatás a /c/shortened_url csatorna linkekhez + +Javítások +• Több hiba javítása NewPipe-on megosztást követő letöltés esetén +• Lejátszó hozzáférés létrehozó szál fixálása +• Keresési eredmény lapozás fixálása +• [YouTube] NPE-tokozó null fixálása +• [YouTube] Kommentek megtekintése invidio.us domain megnyitásánál +• [SoundCloud] client_id frissítése diff --git a/fastlane/metadata/android/hu/changelogs/820.txt b/fastlane/metadata/android/hu/changelogs/820.txt new file mode 100644 index 00000000000..0469f80cc54 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/820.txt @@ -0,0 +1 @@ +Regex név feloldás funkció használhatatlanná teszi a Youtube-ot diff --git a/fastlane/metadata/android/hu/changelogs/830.txt b/fastlane/metadata/android/hu/changelogs/830.txt new file mode 100644 index 00000000000..d955f329af4 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud client_id frissítése. diff --git a/fastlane/metadata/android/hu/changelogs/840.txt b/fastlane/metadata/android/hu/changelogs/840.txt new file mode 100644 index 00000000000..f77fac4788f --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/840.txt @@ -0,0 +1,22 @@ +Új +• Nyelvválasztó hozzáadása +• Küldés Kodi-ba opció a legördülő menüben +• Kommentek hosszan nyomása másolja őket + +Fejlesztések +• ReCaptcha aktivitás fixálása, és beérkező sütik korrekt kezelése +• Hárompontos gomb törlése a legördülő menü érdekében, és előzmény gomb elrejtődik ha már látszódnak az előzmények +• Android 6 és későbbi verzióknál korrektül megjelenik az overlay hozzáférés opció panel +• Helyi lejátszásilista átnevezése a "KönyvjelzőRész"-re hosszan nyomással +• Különböző egyéb PeerTube fejlesztések +• Több Angol fordítószál javítása + +Javítások +• Lejátszó újrindul annak ellenére, hogy a beállításokban "átváltás minimalizálásnál" van beállítva +• Kiinduló fényerő érték javítása gesztus-irányításnál +• .srt felirat letöltést követően nem tartalmaz minden sortörést +• SD kártyára mentés javítása egyes Android 5-ös eszközönél, amelyek nem felelnek meg a CTF szabványnak +• Android KitKat letöltések fixálása +• Hibás mp4 videó hangfájlként felismerés fixálása +• Többféle fordítási probléma javítása, a kínai nyelvkóddal együtt +• [YouTube] Időkódok újra klikkelhetőek a leírásban diff --git a/fastlane/metadata/android/hu/changelogs/850.txt b/fastlane/metadata/android/hu/changelogs/850.txt new file mode 100644 index 00000000000..9c738dbc499 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/850.txt @@ -0,0 +1 @@ +A YouTube weboldala frissítésre került ebben a verzióban. A régi weboldal verzió Márciusban kivezetésre kerül, ezért kérjük frissítse a NewPipe-ot. diff --git a/fastlane/metadata/android/hu/changelogs/860.txt b/fastlane/metadata/android/hu/changelogs/860.txt new file mode 100644 index 00000000000..0726ae04e47 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/860.txt @@ -0,0 +1,7 @@ +Fejlesztések +• A tempó és hangszín állapotának mentése és visszaállítása +• Kijelző kivágás támogatása a lejátszóban +• Kerekített és sima feliratkozói számláló +• Youtube optimalizálása, hogy kevesebb adatot használjon + +Több mint 15 YouTube orientált bug került fixálásra ebben a verzióban. diff --git a/fastlane/metadata/android/hu/changelogs/870.txt b/fastlane/metadata/android/hu/changelogs/870.txt new file mode 100644 index 00000000000..169735bcb36 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/870.txt @@ -0,0 +1,2 @@ +Ez egy gyorsfix verzió, hogy újra használható legyen a SoundCloud különösebb szenvedés nélkül. +Immáron a SoundCloud v2-s API-ját használja a kivonatoló, és a hibás kliens azonosító kiszűrése is javításra került. diff --git a/fastlane/metadata/android/hu/changelogs/900.txt b/fastlane/metadata/android/hu/changelogs/900.txt new file mode 100644 index 00000000000..5be792c8b52 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/900.txt @@ -0,0 +1,14 @@ +Új +• Feliratkozói csoportok és feed-ek rendbetétele +• Némító gomb a lejátszókban + +Fejlesztések +• A music.youtube.com és media.ccc.de domainek megnyitása a NewPipe-ban +• Két beállítás áthelyezése a Megjelenésből a Kontetbe +• Az 5, 15, 25 mp-es csévélés kikapcsolva ha a pontatlan keresés be van kapcsolva + +Javítások +• Egyes WebM videók most már csévélhetőek +• Adatbázis biztonsági mentás Android P-n +• Összeomlás egy letöltött fájl megosztásánál +• Egy tonna YouTube kivonatoló és még sok más hiba javítása... diff --git a/fastlane/metadata/android/hu/changelogs/910.txt b/fastlane/metadata/android/hu/changelogs/910.txt new file mode 100644 index 00000000000..7ff34883ede --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/910.txt @@ -0,0 +1 @@ +Adatbázis migráció fixálva, mely megakadályozta a NewPipe elindulását egyes esetekben. diff --git a/fastlane/metadata/android/hu/changelogs/920.txt b/fastlane/metadata/android/hu/changelogs/920.txt new file mode 100644 index 00000000000..81d18390c0f --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/920.txt @@ -0,0 +1,9 @@ +Fejlesztések + +• Feltöltési dátum és nézőszám megjelenítése a videó szélén levő infókhoz +• A felső legördülő menü elrendezés fejlesztése + +Javítások + +• Némító gomb javítása ami a 19-es API-nál hibára fut +• Hosszú 1080p 60fps videók letöltésének fixálása diff --git a/fastlane/metadata/android/hu/changelogs/930.txt b/fastlane/metadata/android/hu/changelogs/930.txt new file mode 100644 index 00000000000..49bd609eeb8 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/930.txt @@ -0,0 +1,19 @@ +Új +• Keresés YouTube Music-on +• Alap Android TV támogatás + +Fejlesztések +• Letörölhető minden megnézett videó a helyi lejátszási listából +• Összeomlás helyett most már kiírja az app, hogy nem támogatott kontent +• Kiugró lejátszó átméretezés csípéssel fejlesztve +• Listához hozzáadja a videó a háttéren tartva azujjat, és megjelenít gombokat a csatornán +• A főcímsáv méretezésének javítása + +Javítások +• Korhatáros kontent beállítás javítása +• Egyes reCAPTCHA-k javítása +• Összeomlás ha a lejátszási lista `null` és megnyitásra kerül a könyvjelző javításra került +• Hálózat orientált kivételek felismerésének javítása +• A csoport rendező gomb láthatóságának javítása a feliratkozási mezőben + +és még sok más diff --git a/fastlane/metadata/android/hu/changelogs/940.txt b/fastlane/metadata/android/hu/changelogs/940.txt new file mode 100644 index 00000000000..d3a94cc4945 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/940.txt @@ -0,0 +1,16 @@ +Új +• SoundCloud kommentek támogatása +• YouTube korlátolt beállítás hozzáadása +• A PeerTube fő csatorna részletek mutatása + +Fejlesztések +• Csak a támogatott szolgáltatásoknál jelenik meg a Kore gomb +• A navigációssáv és a státuszsor területébe belelógó gesztus navigációk blokkolása +• Újra próbálkozás és Feliratkozás gomb stílusának igazítása a szolgáltatásnak megfelelően + +Javítások +• Letöltési felület fagyásának javítása +• A böngészőben megnyitás valóban böngészőben nyitja meg a linket +• A videó megnyitáskori összeomlás és a "Videó nem lejátszható" kiírás javítása + +és más egyéb diff --git a/fastlane/metadata/android/hu/changelogs/950.txt b/fastlane/metadata/android/hu/changelogs/950.txt new file mode 100644 index 00000000000..129f845c42d --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/950.txt @@ -0,0 +1,4 @@ +Ez a verzió három kicsi javítást tartalmaz: +• Háttértár hozzáférés javítás Android 10+ esetében +• Megnyitási panel fixálása +• Hosszú videók idejének felismerésének javítása diff --git a/fastlane/metadata/android/hu/changelogs/951.txt b/fastlane/metadata/android/hu/changelogs/951.txt new file mode 100644 index 00000000000..9e27d4e7f42 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/951.txt @@ -0,0 +1,17 @@ +Új +• Kereső hozzáadása a feliratkozás kiválasztóhoz a feed csoport panelhez +• Filter hozzáadása a feed csoport panelhez, hogy csak csoporton kívüli feliratkozásokat is mutasson +• Lejátszásilista fül hozzáadása a fő ablakhoz +• Gyors ütemű előre/hátra csévélés a háttérben és kiugró lejátszóban +• Keresés ajánlások mutatása: biztosan ezt értette-e & annak eredményei + +Fejlesztések +• Nincs többé app metaadat írás a muxolt fájloknál +• Ne törölje a sikertelenül lejátszott videókat a listákból +• Státuszbár színének igazítása az eszközsáv színéhez + +Javítások +• A Lebegőpontos összeg miatt keletkező hang/videó deszink javítása +• [PeerTube] Törölt kommentek kezelése + +és még sok más diff --git a/fastlane/metadata/android/hu/changelogs/952.txt b/fastlane/metadata/android/hu/changelogs/952.txt new file mode 100644 index 00000000000..06df7cc9f04 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/952.txt @@ -0,0 +1,7 @@ +Fejlesztések +• Minden szolgáltatásnál működik az auto-lejátszás (nem csak a YouTube-nál) + +Javítás +• Fixálva a kapcsolódó videók a YouTube új folytatásával +• A korhatáros videók javítása +• [Android TV] Fixálva a késő fókusz kiemelés felületréteg diff --git a/fastlane/metadata/android/hu/changelogs/953.txt b/fastlane/metadata/android/hu/changelogs/953.txt new file mode 100644 index 00000000000..53efed44eda --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/953.txt @@ -0,0 +1 @@ +A YouTube dekódolás funkció kivonatolásának javítása. diff --git a/fastlane/metadata/android/hu/changelogs/954.txt b/fastlane/metadata/android/hu/changelogs/954.txt new file mode 100644 index 00000000000..457d0a0b9fc --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/954.txt @@ -0,0 +1,9 @@ +• Új app workflow: videók lejátszása a részletes oldalon, és lehúzva minimalizálja a lejátszót +• MediaStílus értesítések: MediaStyle notifications: customizable actions in notifications, performance improvements +• basic resizing when using NewPipe as desktop app + +• show dialog with open options in case of an unsupported URL toast +• Improve search suggestion experience when remote ones can't be fetched +• Increased default video quality to 720p60 (in-app player) and 480p (pop-up player) + +• tons of bug fixes and more 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..14b11b201dd 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 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, emellett szabad és nyílt forráskódú szoftver (FLOSS). diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt index 50752eeaf35..5e18acc4fc1 100644 --- a/fastlane/metadata/android/hu/short_description.txt +++ b/fastlane/metadata/android/hu/short_description.txt @@ -1 +1 @@ -Ingyenes, könnyű YouTube felület Androidra. +Egy ingyenes, könnyű YouTube felület Androidra. diff --git a/fastlane/metadata/android/id/changelogs/1000.txt b/fastlane/metadata/android/id/changelogs/1000.txt new file mode 100644 index 00000000000..c389d71e669 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1000.txt @@ -0,0 +1,13 @@ +Peningkatan +• Jadikan deskripsi daftar putar dapat diklik untuk menampilkan lebih banyak/sedikit konten +• [PeerTube] Menangani tautan server `subscribeto.me` secara otomatis +• Hanya mulai memutar satu item di layar riwayat + +Telah diperbaiki +• Visibilitas tombol RSS +• Kemogokan pratinjau seekbar +• Daftar putar item tanpa gambar mini +• Keluar dari dialog unduhan sebelum muncul +• Popup antrean daftar item terkait +• Urutan dalam dialog tambah ke daftar putar +• Tata letak item penanda daftar putar diff --git a/fastlane/metadata/android/id/changelogs/65.txt b/fastlane/metadata/android/id/changelogs/65.txt index 34cf20dec2a..4fad1200fcb 100644 --- a/fastlane/metadata/android/id/changelogs/65.txt +++ b/fastlane/metadata/android/id/changelogs/65.txt @@ -1,4 +1,4 @@ -###Peningkatan +### peningkatan - Nonaktifkan Animasi Ikon burgermenu #1486 - Kembali (undo) hapus unduhan #1472 diff --git a/fastlane/metadata/android/id/changelogs/66.txt b/fastlane/metadata/android/id/changelogs/66.txt index 4681fb5f464..adbbff49ca3 100644 --- a/fastlane/metadata/android/id/changelogs/66.txt +++ b/fastlane/metadata/android/id/changelogs/66.txt @@ -1,3 +1,33 @@ -old version not being translated. (F-Droid only show updated verson description) -versi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru) -(weblate notification : Translation text too long! (terjemahan terlalu panjang). +# Catatan perubahan v0.13.7 + +### Diperbaiki +- Perbaiki masalah filter pengurutan v0.13.6 + +# Changelog v0.13.6 + +### Perbaikan + +- Nonaktifkan animasi ikon menu burger #1486 +- batalkan penghapusan unduhan #1472 +- Opsi unduh di menu berbagi #1498 +- Menambahkan opsi berbagi ke menu ketuk panjang #1454 +- Minimalkan pemutar utama saat keluar #1354 +- Pembaruan versi library dan perbaikan cadangan basis data #1510 +- Pembaruan ExoPlayer 2.8.2 #1392 + - Mengolah ulang dialog kontrol kecepatan pemutaran untuk mendukung ukuran langkah yang berbeda untuk perubahan kecepatan yang lebih cepat. + - Menambahkan tombol untuk maju cepat selama hening di kontrol kecepatan pemutaran. Ini akan berguna untuk buku audio dan genre musik tertentu, dan dapat menghadirkan pengalaman yang benar-benar mulus (dan dapat memecah lagu dengan banyak keheningan =\\). + - Refaktor ulang resolusi sumber media untuk memungkinkan penyampaian metadata bersama media secara internal di pemutar, daripada melakukannya secara manual. Sekarang kami memiliki satu sumber metadata dan langsung tersedia saat pemutaran dimulai. + - Memperbaiki metadata daftar putar jarak jauh yang tidak diperbarui ketika metadata baru tersedia ketika fragmen daftar putar dibuka. + - Berbagai perbaikan UI: #1383, kontrol notifikasi pemutar latar belakang kini selalu berwarna putih, lebih mudah untuk mematikan pemutar popup melalui lemparan +- Gunakan ekstraktor baru dengan arsitektur yang difaktorkan ulang untuk multilayanan + +### Perbaikan + +- Perbaiki #1440 Tata Letak Info Video Rusak #1491 +- Lihat perbaikan riwayat #1497 + - #1495, dengan memperbarui metadata (thumbnail, judul, dan jumlah video) segera setelah pengguna mengakses daftar putar. + - #1475, dengan mendaftarkan tampilan di database saat pengguna memulai video di pemutar eksternal pada fragmen detail. +- Perbaiki batas waktu layar jika ada mode popup. #1463 (Diperbaiki #640) +- Perbaikan pemutar video utama #1509 + - [#1412] Memperbaiki mode pengulangan yang menyebabkan pemutar NPE ketika intent baru diterima saat aktivitas pemutar berada di latar belakang. + - Perbaiki meminimalkan pemutar ke popup tidak menghancurkan pemutar ketika izin popup tidak diberikan. diff --git a/fastlane/metadata/android/id/changelogs/972.txt b/fastlane/metadata/android/id/changelogs/972.txt new file mode 100644 index 00000000000..99990cc9030 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/972.txt @@ -0,0 +1,14 @@ +Baru +Mengenali stempel waktu dan hashtag dalam deskripsi +Menambahkan pengaturan mode tablet manual +Menambahkan kemampuan untuk menyembunyikan item yang diputar di feed + +Ditingkatkan +Mendukung Kerangka Akses Penyimpanan dengan benar +Penanganan kesalahan yang lebih baik untuk saluran yang tidak tersedia dan dihentikan +Lembar berbagi Android untuk pengguna Android 10+ sekarang menampilkan judul konten. +Memperbarui instance Invidious dan mendukung tautan Piped. + +Diperbaiki +[YouTube] Konten yang dibatasi usia +Cegah Pengecualian jendela bocor saat membuka dialog pilihan diff --git a/fastlane/metadata/android/id/changelogs/973.txt b/fastlane/metadata/android/id/changelogs/973.txt new file mode 100644 index 00000000000..3ba7d9f054e --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/973.txt @@ -0,0 +1,4 @@ +Perbaikan terbaru +- Memperbaiki thumbnail dan judul yang terpotong dalam tata letak grid, karena perhitungan yang salah tentang berapa banyak video yang dapat ditampung dalam satu baris +- Memperbaiki dialog unduhan yang menghilang tanpa melakukan apa pun jika dibuka dari menu berbagi +- Memperbarui pustaka yang terkait dengan membuka aktivitas eksternal seperti pemilih file Storage Access Framework diff --git a/fastlane/metadata/android/id/changelogs/974.txt b/fastlane/metadata/android/id/changelogs/974.txt new file mode 100644 index 00000000000..4cdc5ab55fb --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/974.txt @@ -0,0 +1,5 @@ +Perbaikan terbaru +• Memperbaiki masalah buffering yang disebabkan oleh pembatasan YouTube +• Memperbaiki ekstraksi komentar YouTube dan kerusakan pada komentar yang dinonaktifkan +• Perbaiki pencarian musik YouTube +• Perbaiki streaming langsung PeerTube diff --git a/fastlane/metadata/android/id/changelogs/975.txt b/fastlane/metadata/android/id/changelogs/975.txt new file mode 100644 index 00000000000..b8f4aca1fc0 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/975.txt @@ -0,0 +1,17 @@ +Baru +• Menampilkan Thumbnail ketika Mempercepat +• Deteksi komentar yang dimatikan +• Penandaan item feed sebagai ditonton +• Menampilkan Komentar disukai + +Peningkatan +• Pembaruan Layout metadata dan tag +• Penerapan warna layanan pada komponen UI + +Perbaikan +• Perbaiki thumbnail pada mini player +• Perbaiki buffering tanpa akhir pada item antrian duplikat +• Perbaikan Beberapa player rotasi layar dan penutupan yang lebih cepat +• Perbaiki ReCaptcha tetap termuat di latar belakang +• Matikan klik saat memuat feed +• Perbaiki beberapa kerusakan pengunduh diff --git a/fastlane/metadata/android/id/changelogs/976.txt b/fastlane/metadata/android/id/changelogs/976.txt new file mode 100644 index 00000000000..d3c7e505b69 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/976.txt @@ -0,0 +1,10 @@ +• Tambahkan opsi untuk langsung membuka pemutar dalam layar penuh +• Izinkan memilih jenis saran pencarian yang akan ditampilkan +• Tema gelap kini lebih gelap + layar splash gelap ditambahkan +• Peningkatan pemilih file untuk menyembunyikan file yang tidak diinginkan +• Memperbaiki impor langganan YouTube +• Memutar ulang stream memerlukan ketukan pada tombol putar ulang lagi +• Memperbaiki sesi audio penutup +• [Android TV] Memperbaiki lompatan seekbar yang panjang saat menggunakan DPad + +Untuk melihat perubahan lebih lanjut, lihat log perubahan (dan postingan blog) dari tab Tautan di bawah. diff --git a/fastlane/metadata/android/id/changelogs/977.txt b/fastlane/metadata/android/id/changelogs/977.txt new file mode 100644 index 00000000000..11df38bd984 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/977.txt @@ -0,0 +1,10 @@ +• Menambahkan tombol "mainkan berikutnya" ke menu tekan lama +• Menambahkan awalan jalur pendek YouTube ke filter maksud +• Impor Pengaturan Tetap +• Tukar posisi seekbar dengan tombol pemutar di layar Antrian +• Berbagai perbaikan terkait MediasessionManager +• Memperbaiki bilah pencari yang tidak selesai setelah video berakhir +• Menonaktifkan terowongan media di RealtekATV +• Memperluas area yang dapat diklik tombol pemutar yang diperkecil + +Untuk melihat perubahan lebih lanjut, lihat log perubahan (dan postingan blog) dari tab Tautan di bawah. diff --git a/fastlane/metadata/android/id/changelogs/978.txt b/fastlane/metadata/android/id/changelogs/978.txt new file mode 100644 index 00000000000..6b452521a29 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/978.txt @@ -0,0 +1 @@ +Memperbaiki pelaksanaan pemeriksaan untuk versi NewPipe baru. Pemeriksaan ini terkadang dilakukan terlalu dini sehingga menyebabkan aplikasi mogok. Itu harus diperbaiki sekarang. diff --git a/fastlane/metadata/android/id/changelogs/979.txt b/fastlane/metadata/android/id/changelogs/979.txt new file mode 100644 index 00000000000..abc741c867d --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/979.txt @@ -0,0 +1,2 @@ +- Memperbaiki melanjutkan pemutaran +- Perbaikan untuk memastikan bahwa layanan yang menentukan apakah NewPipe harus memeriksa pemeriksaan versi baru tidak dimulai di latar belakang diff --git a/fastlane/metadata/android/id/changelogs/980.txt b/fastlane/metadata/android/id/changelogs/980.txt new file mode 100644 index 00000000000..13a173f5df1 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/980.txt @@ -0,0 +1,13 @@ +Baru +• Menambahkan opsi "Tambahkan ke playlist" untuk berbagi menu +• Menambahkan dukungan untuk tautan pendek y2u.be dan PeerTube + +Ditingkatkan +• Membuat Kontrol Kecepatan Pemutaran menjadi lebih ringkas +• Feed menyoroti item baru sekarang +• Opsi "Tampilkan item yang ditonton" di feed kini disimpan + +Tetap +• Memperbaiki ekstraksi suka dan tidak suka YouTube +• Memperbaiki pemutaran ulang otomatis setelah kembali dari latar belakang +Dan banyak lagi diff --git a/fastlane/metadata/android/id/changelogs/981.txt b/fastlane/metadata/android/id/changelogs/981.txt new file mode 100644 index 00000000000..f3b556443c2 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/981.txt @@ -0,0 +1,2 @@ +Menghapus dukungan MediaParser untuk memperbaiki pemutaran yang gagal dilanjutkan setelah buffering di Android 11+. +Menonaktifkan terowongan media pada Philips QM16XE untuk memperbaiki masalah pemutaran. diff --git a/fastlane/metadata/android/id/changelogs/982.txt b/fastlane/metadata/android/id/changelogs/982.txt new file mode 100644 index 00000000000..87113285505 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/982.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun. diff --git a/fastlane/metadata/android/id/changelogs/983.txt b/fastlane/metadata/android/id/changelogs/983.txt new file mode 100644 index 00000000000..3ee5449c228 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/983.txt @@ -0,0 +1,9 @@ +Tambahkan UI dan perilaku ketuk dua kali untuk mencari +Jadikan pengaturan dapat dicari +Sorot komentar yang disematkan seperti itu +Tambahkan dukungan terbuka dengan aplikasi untuk instance PeerTube FSFE +Tambahkan pemberitahuan kesalahan +Perbaiki pemutaran ulang item antrian pertama saat pergantian pemain +Tunggu lebih lama saat melakukan buffering selama streaming langsung sebelum gagal +Perbaiki urutan hasil pencarian lokal +Perbaiki bidang item kosong di antrian putar diff --git a/fastlane/metadata/android/id/changelogs/984.txt b/fastlane/metadata/android/id/changelogs/984.txt new file mode 100644 index 00000000000..f0e1b297083 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/984.txt @@ -0,0 +1,7 @@ +Muat item awal secukupnya dalam daftar untuk memenuhi seluruh layar dan untuk memperbaiki pengguliran di tablet dan TV +Perbaiki kerusakan acak saat menelusuri daftar +Minta pemain untuk mencari overlay dengan cepat di bawah UI sistem +Mengembalikan perubahan pada potongan saat memutar di multi jendela, menyebabkan regresi pemutar salah tempat di beberapa ponsel +Tingkatkan kompilasiSdk dari 30 menjadi 31 +Perbarui pustaka pelaporan kesalahan +Refactor beberapa kode di pemutar diff --git a/fastlane/metadata/android/id/changelogs/985.txt b/fastlane/metadata/android/id/changelogs/985.txt new file mode 100644 index 00000000000..d3fea84ab5e --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/985.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun diff --git a/fastlane/metadata/android/id/changelogs/987.txt b/fastlane/metadata/android/id/changelogs/987.txt new file mode 100644 index 00000000000..b31a40dc01f --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/987.txt @@ -0,0 +1,12 @@ +Baru +• Mendukung metode pengiriman selain HTTP progresif: waktu pemuatan pemutaran lebih cepat, perbaikan untuk PeerTube dan SoundCloud, pemutaran streaming langsung YouTube yang baru saja berakhir +• Tombol Tambah untuk menambahkan playlist jarak jauh ke playlist lokal +• Pratinjau gambar di lembar berbagi Android 10+ + +Ditingkatkan +• Meningkatkan dialog parameter pemutaran +• Pindahkan tombol ekspor-impor langganan ke menu tiga titik + +Tetap +• Perbaiki penghapusan video yang ditonton sepenuhnya dari daftar putar +• Perbaiki tema menu berbagi dan entri "tambahkan ke daftar putar". diff --git a/fastlane/metadata/android/id/changelogs/988.txt b/fastlane/metadata/android/id/changelogs/988.txt new file mode 100644 index 00000000000..6433bfa5448 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Perbaiki kesalahan "Tidak dapat memperoleh streaming apa pun" saat mencoba memutar video apa pun +[YouTube] Perbaiki "Konten berikut tidak tersedia di aplikasi ini." pesan ditampilkan alih-alih video yang diminta diff --git a/fastlane/metadata/android/id/changelogs/989.txt b/fastlane/metadata/android/id/changelogs/989.txt new file mode 100644 index 00000000000..d388366dd36 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Perbaiki pemuatan tanpa batas saat mencoba memutar video apa pun +• [YouTube] Memperbaiki pembatasan pada beberapa video +• Tingkatkan perpustakaan jsoup ke 1.15.3, yang mencakup perbaikan keamanan diff --git a/fastlane/metadata/android/id/changelogs/990.txt b/fastlane/metadata/android/id/changelogs/990.txt new file mode 100644 index 00000000000..ac117f40579 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/990.txt @@ -0,0 +1,15 @@ +Rilis ini menghilangkan dukungan untuk Android 4.4 KitKat, sekarang versi minimumnya adalah Android 5 Lollipop! + +Baru +• Download dari menu tekan lama +• Sembunyikan video mendatang di feed +• Bagikan playlist lokal + +Ditingkatkan +• Memfaktorkan ulang kode pemutar menjadi komponen-komponen kecil: lebih sedikit RAM yang digunakan, lebih sedikit bug +• Meningkatkan mode skala thumbnail +• Placeholder gambar berukuran vektor + +Tetap +• Memperbaiki berbagai masalah dengan notifikasi pemutar: info media yang ketinggalan jaman, gambar mini yang terdistorsi +• Perbaiki layar penuh menggunakan 1/4 layar diff --git a/fastlane/metadata/android/id/changelogs/991.txt b/fastlane/metadata/android/id/changelogs/991.txt new file mode 100644 index 00000000000..a803d5a143c --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/991.txt @@ -0,0 +1,13 @@ +Baru +• Tambahkan tombol "Buka di browser" di panel kesalahan +• Tambahkan opsi untuk menampilkan grup saluran sebagai daftar +• [YouTube] Klik-lama pada segmen streaming untuk membagikan URL stempel waktu +• Tambahkan tombol antrian putar ke pemutar mini + +Disempurnakan +• Tambahkan lokalisasi Islandia dan perbarui banyak terjemahan lainnya +• Banyak perbaikan internal + +Diperbaiki +• Memperbaiki beberapa kerusakan +• [YouTube] Memperbaiki pemuatan saluran, feed non-khusus, dan mengatasi masalah pemutaran di beberapa negara diff --git a/fastlane/metadata/android/id/changelogs/992.txt b/fastlane/metadata/android/id/changelogs/992.txt new file mode 100644 index 00000000000..50733474354 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/992.txt @@ -0,0 +1,17 @@ +Baru +- Jumlah pelanggan dalam detail video +- Unduh dari antrean +- Mengatur gambar mini daftar putar secara permanen +- Tekan lama tagar dan tautan +- Mode tampilan kartu + +Lebih baik +- Tombol tutup pemutar mini yang lebih besar +- Pengecilan ukuran gambar mini yang lebih halus +- Target Android 13 (API 33) +- Mencari tidak lagi menjeda pemain + +Diperbaiki +- Perbaiki overlay pada DeX/mouse +- Izinkan pemutar latar belakang tanpa aliran audio terpisah +- Berbagai perbaikan YouTube dan banyak lagi… diff --git a/fastlane/metadata/android/id/changelogs/993.txt b/fastlane/metadata/android/id/changelogs/993.txt new file mode 100644 index 00000000000..2a4c8f2d670 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/993.txt @@ -0,0 +1,12 @@ +Baru +• Tambahkan peringatan saat menambahkan duplikat daftar putar dan tombol tambahkan untuk menghapusnya +• Izinkan pengabaian tombol perangkat keras +• Izinkan menyembunyikan video yang ditonton sebagian di feed + +Ditingkatkan +• Gunakan lebih banyak kolom grid di layar besar +• Membuat indikator kemajuan konsisten dengan pengaturan + +Tetap +• Memperbaiki URL pembuka browser, unduhan, dan pemutar eksternal di Android 11+ +• Memperbaiki interaksi dengan layar penuh yang memerlukan dua ketukan pada MIUI diff --git a/fastlane/metadata/android/id/changelogs/994.txt b/fastlane/metadata/android/id/changelogs/994.txt new file mode 100644 index 00000000000..fc75016b171 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/994.txt @@ -0,0 +1,15 @@ +Baru +• Mendukung beberapa track audio/bahasa +• Izinkan mengatur gestur volume dan kecerahan di sisi mana pun pada layar +• Dukungan untuk menampilkan tab utama di bagian bawah layar + +Disempurnakan +• [Bandcamp] Menangani track berbayar + +Diperbaiki +• [YouTube] Kesalahan HTTP 403 untuk streaming +• Pemutar berwarna hitam saat beralih ke pemutar utama dari tampilan daftar putar +• Kebocoran memori layanan pemutar +• [PeerTube] Avatar pengunggah dan subsaluran ditukar + +dan banyak lagi diff --git a/fastlane/metadata/android/id/changelogs/995.txt b/fastlane/metadata/android/id/changelogs/995.txt new file mode 100644 index 00000000000..b3db15bf162 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/995.txt @@ -0,0 +1,16 @@ +Baru +• Mendukung tab saluran +• Pilih kualitas gambar +• Dapatkan URL ke semua gambar + +Ditingkatkan +• Aksesibilitas antarmuka pemutar +• Pilihan audio yang lebih baik untuk unduhan video saja +• Pilihan untuk memasukkan nama playlist dan video ke konten daftar putar bersama + +Diperbaiki +• [YouTube] Perbaiki penghitungan jumlah suka +• Perbaiki pemutar yang tidak merespons popup dan crash +• Pemilihan bahasa yang salah di pemilih bahasa +• Fokus audio pemutar tidak menerapkan mode senyap +• Penambahan item daftar putar terkadang tidak berfungsi diff --git a/fastlane/metadata/android/id/changelogs/996.txt b/fastlane/metadata/android/id/changelogs/996.txt new file mode 100644 index 00000000000..d1fd9d5b768 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/996.txt @@ -0,0 +1,2 @@ +Perbaiki NullPointerException saat membuka saluran / konferensi di media.ccc.de. +The Grinch mencoba untuk merusak hadiah Natal kami ke anda, tapi kami memperbaikinya. diff --git a/fastlane/metadata/android/id/changelogs/997.txt b/fastlane/metadata/android/id/changelogs/997.txt new file mode 100644 index 00000000000..7895e84e31e --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/997.txt @@ -0,0 +1,15 @@ +Baru +• Tambah balasan komentar +• Izinkan susunan ulg playlist +• Tampilkan deskripsi & durasi daftar putar +• Izinkan setelan ulg +• [Android 13+] Pulihkan tindakan notifikasi khusus +• Minta persetujuan utk pemeriksaan update +• Izinkan pemutaran notifikasi sementara buffering +• Susun ulg bbrp setelan + +Perbaikan +• [YouTube] Perbaiki komentar yg tdk dapat dimuat, ditambah perbaikan & peningkatan +• Atasi kerentanan pengimporan pengaturan & ubah ke JSON +• Perbaikan unduhan +• Pangkas teks pencarian diff --git a/fastlane/metadata/android/id/changelogs/998.txt b/fastlane/metadata/android/id/changelogs/998.txt new file mode 100644 index 00000000000..d3fea84ab5e --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/998.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun diff --git a/fastlane/metadata/android/id/changelogs/999.txt b/fastlane/metadata/android/id/changelogs/999.txt new file mode 100644 index 00000000000..d3fea84ab5e --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/999.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun diff --git a/fastlane/metadata/android/is/changelogs/997.txt b/fastlane/metadata/android/is/changelogs/997.txt new file mode 100644 index 00000000000..b8cba725276 --- /dev/null +++ b/fastlane/metadata/android/is/changelogs/997.txt @@ -0,0 +1,17 @@ +Nýtt +• Bætt við svörum í athugasemdum +• Leyfð endurröðun spilunarlista +• Birt lýsing og lengd spilunarlista +• Leyfð frumstilling stillinga + +Bætt +• [Android 13+] Endurheimt aðgerða sérsniðinna tilkynninga +• Beðið um samþykki við leit að uppfærslum +• Leyfð afspilun/bið tilkynninga á meðan biðminni er fyllt +• Endurröðun sumra stillinga + +Lagfært +• [YouTube] Lagaðir hnökrar við innhleðslu athugasemda, auk annarra endurbóta +• Leystur öryggisgalli við innflutning stillinga og yfirfærsla í JSON +• Ýmsar endurbætur við niðurhal +• Afskurður óþarfa leitartexta diff --git a/fastlane/metadata/android/is/full_description.txt b/fastlane/metadata/android/is/full_description.txt index ed360287856..8b002b6fab7 100644 --- a/fastlane/metadata/android/is/full_description.txt +++ b/fastlane/metadata/android/is/full_description.txt @@ -1 +1 @@ -NewPipe er frjáls hugbúnaður sem notar ekki tól frá Google eða YouTube forritaskil. Það sækir aðeins vefsíðuna til að fá þær upplýsingar sem það þarf. Þess vegna er hægt að nota þetta forrit á tækjum án þess að Google Services sé uppsett. Einnig þarftu ekki YouTube reikning til að nota NewPipe. +NewPipe er frjáls hugbúnaður sem notar ekki tól frá Google eða YouTube forritaskil. Það sækir aðeins vefsíðuna til að fá þær upplýsingar sem það þarf. Þess vegna er hægt að nota þetta forrit á tækjum án þess að Google Services sé uppsett. Einnig þarftu ekki YouTube reikning til að nota NewPipe, og svo er þetta frjáls og opinn hugbúnaður. diff --git a/fastlane/metadata/android/is/short_description.txt b/fastlane/metadata/android/is/short_description.txt index 833ead56d7c..526934bb6d9 100644 --- a/fastlane/metadata/android/is/short_description.txt +++ b/fastlane/metadata/android/is/short_description.txt @@ -1 +1 @@ -Frjáls og léttur YouTube spilari fyrir Android. +Frjáls og létt birtingarmynd YouTube fyrir Android. diff --git a/fastlane/metadata/android/it/changelogs/1000.txt b/fastlane/metadata/android/it/changelogs/1000.txt new file mode 100644 index 00000000000..85ac0ca0f48 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/1000.txt @@ -0,0 +1,13 @@ +Miglioramenti +• Rendi cliccabile la descrizione della playlist per mostrare più/meno contenuti +• [PeerTube] Gestisci automaticamente i collegamenti alle istanze "subscribeto.me" +• Inizia a riprodurre solo un singolo elemento nella schermata della cronologia + +Risolti +• Fix visibilità pulsante RSS +• Fix arresti anomali dell'anteprima della barra di ricerca +• Fix mettere in playlist un elemento senza miniatura +• Fix uscita finestra di dialogo di download prima che venga visualizzata +• Fix popup di accodamento dell'elenco degli elementi correlati +• Fix ordine nella finestra di dialogo Aggiungi alla playlist +• Regola il layout degli elementi dei segnalibri della playlist diff --git a/fastlane/metadata/android/it/changelogs/992.txt b/fastlane/metadata/android/it/changelogs/992.txt new file mode 100644 index 00000000000..b11e7249e6b --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/992.txt @@ -0,0 +1,17 @@ +Nuovo +• Numero di iscritti nei dettagli del video +• Scarica dalla coda +• Impostare in modo permanente una miniatura della playlist +• Premi a lungo hashtag e link +• Modalità di visualizzazione scheda + +Migliorato +• Pulsante di chiusura mini-player più grande +• Downscaling delle miniature più agevole +• Target Android 13 (API 33) +• La ricerca non mette più in pausa il lettore + +Corretto +• Corretto l'overlay su DeX/mouse +• Consenti lettore in background senza flussi audio separati +• Varie correzioni di YouTube e altro… diff --git a/fastlane/metadata/android/it/changelogs/993.txt b/fastlane/metadata/android/it/changelogs/993.txt new file mode 100644 index 00000000000..ecaf530d21b --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/993.txt @@ -0,0 +1,12 @@ +Nuovo +• Aggiunto avviso di aggiunta playlist doppia e un pulsante per rimuoverla +• Ignora pulsanti hardware +• Nascondi video visti parzialmente + +Migliorato +• Usa più colonne nella griglia su schermi grandi +• Indicatori di avanzamento consistenti con le impostazioni + +Corretto +• Fix apertura URL, download e player esterni su Android 11+ +• Fix interazione con schermo intero che richiedeva due otcchi su MIUI 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/it/changelogs/995.txt b/fastlane/metadata/android/it/changelogs/995.txt new file mode 100644 index 00000000000..efed82f4e24 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/995.txt @@ -0,0 +1,16 @@ +Novità +• Supporto a schede dei canali +• Selezione qualità dell'immagine +• Ottieni URL per tutte le immagini + +Migliorato +• Accessibilità delle interfacce del player +• Miglior scelta dell'audio per i download video-only +• Condivisione playlist con più opzioni + +Corretto +• [YouTube] Sistemati i mi piace +• Talvolta il player non rispondeva o crashava +• Selezione di lingue errate nel selettore +• Il focus audio del player non rispettava il muto +• Talvolta aggiungere elementi a playlist non funzionava diff --git a/fastlane/metadata/android/it/changelogs/996.txt b/fastlane/metadata/android/it/changelogs/996.txt new file mode 100644 index 00000000000..0d69a32647b --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/996.txt @@ -0,0 +1,2 @@ +Corretto un NullPointerException quando si apre un canale / conferenza in media.ccc.de. +Il Grinch ha cercato di rompere il nostro regalo di Natale per te, ma l'abbiamo risolto. diff --git a/fastlane/metadata/android/it/changelogs/997.txt b/fastlane/metadata/android/it/changelogs/997.txt new file mode 100644 index 00000000000..f8885512802 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/997.txt @@ -0,0 +1,17 @@ +Novità +• Risposte ai commenti +• Riordinamento playlist +• Mostra descrizione e durata playlist +• Consenti ripristino impostazioni + +Migliorie +• [Android 13+] Ripristina azioni di notifica personalizzate +• Richiedi consenso per ricerca aggiornamenti +• Notifiche avvio/pausa durante il buffer +• Riordinate alcune impostazioni + +Correzioni +• [YouTube] I commenti non si caricavano, altre correzioni +• Vulnerabilità in importa impostazioni e passaggio a JSON +• Correzioni sui download +• Trim delle ricerche diff --git a/fastlane/metadata/android/it/changelogs/998.txt b/fastlane/metadata/android/it/changelogs/998.txt new file mode 100644 index 00000000000..73fc6f2d862 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/998.txt @@ -0,0 +1,4 @@ +Corretto problema di riproduzione di YouTube causato da errori HTTP 403. + +Gli errori HTTP 403 saltuari nel mezzo di un video di YouTube non sono ancora stati sistemati. +Questo problema sarà affrontato in un altra release hotfix non appena possibile. diff --git a/fastlane/metadata/android/it/changelogs/999.txt b/fastlane/metadata/android/it/changelogs/999.txt new file mode 100644 index 00000000000..c2652da28ee --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/999.txt @@ -0,0 +1,12 @@ +Questo aggiornamento hotfix risolve gli errori HTTP 403 nel mezzo dei video di YouTube. + +Novità +• [SoundCloud] Aggiunto il supporto per gli URL on.soundcloud.com + +Migliorie +• [Bandcamp] Mostra informazioni aggiuntive nel chiosco della radio + +Correzioni +• [YouTube] Corretti errori HTTP 403 occasionali all'inizio o nel mezzo dei video +• [YouTube] Estrazione avatar e banner da più tipi di canali +• [Bandcamp] Risolti vari bug e forzato l'uso di HTTPS diff --git a/fastlane/metadata/android/ja/changelogs/1000.txt b/fastlane/metadata/android/ja/changelogs/1000.txt new file mode 100644 index 00000000000..9f468fd9caf --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/1000.txt @@ -0,0 +1,13 @@ +改善点 +• プレイリストの説明をクリック可能にして、内容の表示/非表示を切り替えられるようにしました。 +• [PeerTube] `subscribeto.me` インスタンスのリンクを自動的に処理します。 +• 履歴画面で単一のアイテムのみを再生するようにしました。 + +修正点 +• RSSボタンの表示を修正しました。 +• シークバーのプレビューによるクラッシュを修正しました。 +• サムネイルなしのアイテムをプレイリストに追加する際の問題を修正しました。 +• ダウンロードダイアログが表示される前に終了する問題を修正しました。 +• 関連アイテムリストのキューイングポップアップを修正しました。 +• プレイリスト追加ダイアログの順序を修正しました。 +• プレイリストブックマークアイテムのレイアウトを調整しました。 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/ja/changelogs/954.txt b/fastlane/metadata/android/ja/changelogs/954.txt index e927e8e5178..6b0da159847 100644 --- a/fastlane/metadata/android/ja/changelogs/954.txt +++ b/fastlane/metadata/android/ja/changelogs/954.txt @@ -1,6 +1,6 @@ ・新しいアプリケーションの利用体系: 詳細ページで動画を再生し、下にスワイプしてプレイヤーを最小化する ・MediaStyle 通知: 通知のカスタマイズ可能なアクション、パフォーマンスの向上 -・デスクトップアプリのような NewPipe 使用中のリサイズ +・デスクトップアプリのような NewPipe 使用中のリサイズ ・サポートしていない URL のとき他のアプリで開くオプションを表示する ・取得できなかった場合の検索サジェストのユーザー体験の向上 diff --git a/fastlane/metadata/android/ka/changelogs/64.txt b/fastlane/metadata/android/ka/changelogs/64.txt index 5d32b7c0d0d..de50608ab7b 100644 --- a/fastlane/metadata/android/ka/changelogs/64.txt +++ b/fastlane/metadata/android/ka/changelogs/64.txt @@ -1,5 +1,5 @@ ### გაუმჯობესებები - - დაემატა ვიდეოს ხარისხის შეზღუდვის შესაძლებლობა მობილური ინტერნეტის გამოყენებისას. #1339 + - დაემატა ვიდეოს ხარისხის შეზღუდვის შესაძლებლობა მობილური ინტერნეტის გამოყენებისას. #1339 - დაიმახსოვრე სიკაშკაშე #1442 სესიისთვის - გააუმჯობესეთ ჩამოტვირთვის შესრულება სუსტი CPU-ებისთვის #1431 - დაამატეთ (სამუშაო) მხარდაჭერა მედია სესიისთვის #1433 diff --git a/fastlane/metadata/android/ka/changelogs/69.txt b/fastlane/metadata/android/ka/changelogs/69.txt index b5d54c5655f..4bc9f3c0382 100644 --- a/fastlane/metadata/android/ka/changelogs/69.txt +++ b/fastlane/metadata/android/ka/changelogs/69.txt @@ -11,7 +11,7 @@ - დაამატეთ მხარდაჭერა ლოკალიზაციის #1792-ისთვის ### ასწორებს - - დააფიქსირეთ დროის ანალიზი . ფორმატში, ამიტომ NewPipe შეიძლება გამოყენებულ იქნას ფინეთში + - დააფიქსირეთ დროის ანალიზი . ფორმატში, ამიტომ NewPipe შეიძლება გამოყენებულ იქნას ფინეთში - შეასწორეთ გამოწერების რაოდენობა - დაამატეთ წინა პლანზე სერვისის ნებართვა API 28+ მოწყობილობებისთვის #1830 diff --git a/fastlane/metadata/android/ka/changelogs/740.txt b/fastlane/metadata/android/ka/changelogs/740.txt index 3589197f90a..b6f13456b04 100644 --- a/fastlane/metadata/android/ka/changelogs/740.txt +++ b/fastlane/metadata/android/ka/changelogs/740.txt @@ -3,11 +3,11 @@
  • გახადეთ კომენტარებში ბმულები დაწკაპუნებით, გაზარდეთ ტექსტის ზომა
  • მოძებნეთ კომენტარებში დროის ანაბეჭდის ბმულებზე დაწკაპუნებით
  • სასურველი ჩანართის ჩვენება ახლახან არჩეული მდგომარეობის მიხედვით
  • -
  • დაამატე დასაკრავი სია რიგში, როდესაც დიდხანს დააწკაპუნებთ 'ფონზე' დასაკრავი სიის ფანჯარაში
  • +
  • დაამატე დასაკრავი სია რიგში, როდესაც დიდხანს დააწკაპუნებთ 'ფონზე' დასაკრავი სიის ფანჯარაში
  • მოძებნეთ გაზიარებული ტექსტი, როდესაც ის არ არის URL
  • -
  • დაამატეთ "გაზიარება მიმდინარე დროს" ღილაკი მთავარ ვიდეო დამკვრელზე
  • +
  • დაამატეთ "გაზიარება მიმდინარე დროს" ღილაკი მთავარ ვიდეო დამკვრელზე
  • დახურვის ღილაკის დამატება მთავარ დამკვრელზე, როდესაც ვიდეო რიგი დასრულდება
  • -
  • დაამატეთ "დაკვრა პირდაპირ ფონზე" ვიდეო სიის ელემენტების მენიუს ხანგრძლივი დაჭერისთვის
  • +
  • დაამატეთ "დაკვრა პირდაპირ ფონზე" ვიდეო სიის ელემენტების მენიუს ხანგრძლივი დაჭერისთვის
  • გააუმჯობესეთ ინგლისური თარგმანი Play/Enqueue ბრძანებებისთვის
  • შესრულების მცირე გაუმჯობესება
  • გამოუყენებელი ფაილების წაშლა
  • diff --git a/fastlane/metadata/android/ka/changelogs/850.txt b/fastlane/metadata/android/ka/changelogs/850.txt index c78859a4ee3..7f6cc55e250 100644 --- a/fastlane/metadata/android/ka/changelogs/850.txt +++ b/fastlane/metadata/android/ka/changelogs/850.txt @@ -1 +1 @@ -ამ გამოშვებაში განახლდა YouTube ვებსაიტის ვერსია. ვებსაიტის ძველი ვერსია შეწყდება მარტში და, შესაბამისად, თქვენ უნდა განაახლოთ NewPipe. +ამ გამოშვებაში განახლდა YouTube ვებსაიტის ვერსია. ვებსაიტის ძველი ვერსია შეწყდება მარტში და, შესაბამისად, თქვენ უნდა განაახლოთ NewPipe. diff --git a/fastlane/metadata/android/ka/changelogs/967.txt b/fastlane/metadata/android/ka/changelogs/967.txt index 5d1835b2e95..232586a7315 100644 --- a/fastlane/metadata/android/ka/changelogs/967.txt +++ b/fastlane/metadata/android/ka/changelogs/967.txt @@ -1 +1 @@ -გაასწორა YouTube, რომელიც ევროკავშირში არ მუშაობს გამართულად. ეს გამოწვეული იყო ახალი ქუქი-ჩანაწერით და კონფიდენციალურობის თანხმობის სისტემით, რომელიც მოითხოვს NewPipe-ს დააყენოს თანხმობის ქუქი-ფაილები. +გაასწორა YouTube, რომელიც ევროკავშირში არ მუშაობს გამართულად. ეს გამოწვეული იყო ახალი ქუქი-ჩანაწერით და კონფიდენციალურობის თანხმობის სისტემით, რომელიც მოითხოვს NewPipe-ს დააყენოს თანხმობის ქუქი-ფაილები. diff --git a/fastlane/metadata/android/ka/changelogs/978.txt b/fastlane/metadata/android/ka/changelogs/978.txt index 600962d14f3..787d5d12e26 100644 --- a/fastlane/metadata/android/ka/changelogs/978.txt +++ b/fastlane/metadata/android/ka/changelogs/978.txt @@ -1 +1 @@ -დაფიქსირდა შემოწმების შესრულება NewPipe-ის ახალი ვერსიისთვის. ეს შემოწმება ხანდახან ძალიან ადრე სრულდებოდა და, შესაბამისად, იწვევს აპის ავარიას. ეს ახლა უნდა გამოსწორდეს. +დაფიქსირდა შემოწმების შესრულება NewPipe-ის ახალი ვერსიისთვის. ეს შემოწმება ხანდახან ძალიან ადრე სრულდებოდა და, შესაბამისად, იწვევს აპის ავარიას. ეს ახლა უნდა გამოსწორდეს. diff --git a/fastlane/metadata/android/ka/changelogs/988.txt b/fastlane/metadata/android/ka/changelogs/988.txt index e42877c9c2d..3c74e29f5da 100644 --- a/fastlane/metadata/android/ka/changelogs/988.txt +++ b/fastlane/metadata/android/ka/changelogs/988.txt @@ -1,2 +1,2 @@ [YouTube] გაასწორდა შეცდომა „ვერ მივიღე ნაკადი“ რომელიმე ვიდეოს დაკვრის მცდელობისას - [YouTube] შეასწორდა „შემდეგი კონტენტი მიუწვდომელია ამ აპში“. მოთხოვნილი ვიდეოს ნაცვლად ნაჩვენები შეტყობინება + [YouTube] შეასწორდა „შემდეგი კონტენტი მიუწვდომელია ამ აპში“. მოთხოვნილი ვიდეოს ნაცვლად ნაჩვენები შეტყობინება diff --git a/fastlane/metadata/android/ka/changelogs/998.txt b/fastlane/metadata/android/ka/changelogs/998.txt new file mode 100644 index 00000000000..d20512f1710 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/998.txt @@ -0,0 +1 @@ +გაასწორა YouTube არ უკრავს არცერთ ნაკადს diff --git a/fastlane/metadata/android/ka/changelogs/999.txt b/fastlane/metadata/android/ka/changelogs/999.txt new file mode 100644 index 00000000000..d20512f1710 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/999.txt @@ -0,0 +1 @@ +გაასწორა YouTube არ უკრავს არცერთ ნაკადს diff --git a/fastlane/metadata/android/ka/full_description.txt b/fastlane/metadata/android/ka/full_description.txt index eff57aabe3d..e65267b469c 100644 --- a/fastlane/metadata/android/ka/full_description.txt +++ b/fastlane/metadata/android/ka/full_description.txt @@ -1 +1 @@ -NewPipe არ იყენებს Google Framework ბიბლიოთეკას ან YouTube API-ს. ის მხოლოდ აანალიზებს ვებსაიტს, რათა მოიპოვოს მისთვის საჭირო ინფორმაცია. ამიტომ ამ აპლიკაციის გამოყენება შესაძლებელია მოწყობილობებზე Google სერვისების დაყენების გარეშე. გარდა ამისა, თქვენ არ გჭირდებათ YouTube ანგარიში NewPipe-ის გამოსაყენებლად და ეს არის FLOSS. +NewPipe არ იყენებს Google Framework ბიბლიოთეკას ან YouTube API-ს. ის მხოლოდ აანალიზებს ვებსაიტს, რათა მოიპოვოს მისთვის საჭირო ინფორმაცია. ამიტომ ამ აპლიკაციის გამოყენება შესაძლებელია მოწყობილობებზე Google სერვისების დაყენების გარეშე. გარდა ამისა, თქვენ არ გჭირდებათ YouTube ანგარიში NewPipe-ის გამოსაყენებლად და ეს არის FLOSS. diff --git a/fastlane/metadata/android/kk/changelogs/63.txt b/fastlane/metadata/android/kk/changelogs/63.txt new file mode 100644 index 00000000000..9442b136f7b --- /dev/null +++ b/fastlane/metadata/android/kk/changelogs/63.txt @@ -0,0 +1,8 @@ +### Жақсартулар +- Импорттау/экспорттау параметрлері #1333 +- Артық шығындарды азайту (өнімділікті арттыру) #1371 +- №1375 кодты сәл жақсарту +- GDPR #1420 туралы бәрін қосыңыз + +### Түзетілді +- Жүктеуші: файлдардан аяқталмаған жүктеулерді жүктеу кезінде ақаулық жойылды .giga #1407 diff --git a/fastlane/metadata/android/kk/changelogs/64.txt b/fastlane/metadata/android/kk/changelogs/64.txt new file mode 100644 index 00000000000..7dda13e3a54 --- /dev/null +++ b/fastlane/metadata/android/kk/changelogs/64.txt @@ -0,0 +1,8 @@ +### Жақсартулар +- Мобильді деректерді пайдалану кезінде бейне сапасын шектеу мүмкіндігі қосылды. #1339 +- #1442 сессиясының жарықтығын есте сақтаңыз +- Әлсіз #1431 процессорлары үшін жүктеу өнімділігі жақсарды +- #1433 медиа сессиясына (жұмыс) қолдау қосылды + +### Түзету +- Жүктеулерді ашқан кезде ақаулық жойылды (түзету енді шығарылым құрылымдары үшін қол жетімді) #1441 diff --git a/fastlane/metadata/android/kk/changelogs/65.txt b/fastlane/metadata/android/kk/changelogs/65.txt new file mode 100644 index 00000000000..ae8d5865776 --- /dev/null +++ b/fastlane/metadata/android/kk/changelogs/65.txt @@ -0,0 +1,24 @@ +### Жақсартулар +- Burgermenu белгішесінің анимациясын өшіріңіз #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/kn-IN/changelogs/830.txt b/fastlane/metadata/android/kn-IN/changelogs/830.txt new file mode 100644 index 00000000000..266c384e265 --- /dev/null +++ b/fastlane/metadata/android/kn-IN/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud ಸಮಸ್ಯೆಗಳನ್ನು ಸರಿಪಡಿಸಲು SoundCloud client_id ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ. diff --git a/fastlane/metadata/android/kn-IN/changelogs/850.txt b/fastlane/metadata/android/kn-IN/changelogs/850.txt new file mode 100644 index 00000000000..ca21e747225 --- /dev/null +++ b/fastlane/metadata/android/kn-IN/changelogs/850.txt @@ -0,0 +1 @@ +ಈ ಬಿಡುಗಡೆಯ ಯೂಟ್ಯೂಬ್ ವೆಬ್‌ಸೈಟ್ ಆವೃತ್ತಿಯನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ. ಹಳೆಯ ವೆಬ್‌ಸೈಟ್ ಆವೃತ್ತಿಯು ಮಾರ್ಚ್‌ನಲ್ಲಿ ಸ್ಥಗಿತಗೊಳ್ಳಲಿದೆ ಮತ್ತು ಆದ್ದರಿಂದ ನೀವು ನ್ಯೂಪೈಪ್ ಅನ್ನು ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. diff --git a/fastlane/metadata/android/kn-IN/full_description.txt b/fastlane/metadata/android/kn-IN/full_description.txt new file mode 100644 index 00000000000..58a5e255076 --- /dev/null +++ b/fastlane/metadata/android/kn-IN/full_description.txt @@ -0,0 +1 @@ +ನ್ಯೂಪೈಪ್ ಯಾವುದೇ ಗೂಗಲ್ ಫ್ರೇಮ್‌ವರ್ಕ್ ಲೈಬ್ರರಿಗಳನ್ನು ಅಥವಾ ಯೂಟ್ಯೂಬ್‌ ಏಪಿಐ ಅನ್ನು ಬಳಸುವುದಿಲ್ಲ. ಇದು ಅಗತ್ಯವಿರುವ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ವೆಬ್‌ಸೈಟ್ ಅನ್ನು ಮಾತ್ರ ಪಾರ್ಸ್ ಮಾಡುತ್ತದೆ. ಆದ್ದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಗೂಗಲ್ ಸೇವೆಗಳನ್ನು ಸ್ಥಾಪಿಸದೆಯೇ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸಬಹುದು. ಅಲ್ಲದೆ, ನ್ಯೂಪೈಪ್ ಅನ್ನು ಬಳಸಲು ನಿಮಗೆ ಯೂಟ್ಯೂಬ್ ಖಾತೆಯ ಅಗತ್ಯವಿಲ್ಲ ಮತ್ತು ಅದು FLOSS ಆಗಿದೆ. diff --git a/fastlane/metadata/android/kn-IN/short_description.txt b/fastlane/metadata/android/kn-IN/short_description.txt new file mode 100644 index 00000000000..e8caefb88fc --- /dev/null +++ b/fastlane/metadata/android/kn-IN/short_description.txt @@ -0,0 +1 @@ +ಆಂಡ್ರಾಯ್ಡ್‌ಗಾಗಿ ತಯಾರಿಸಿರುವ ಯೂಟ್ಯೂಬ್ ಆಧಾರಿತ ಉಚಿತ ಕಿರುತಂತ್ರಾಂಶ. diff --git a/fastlane/metadata/android/ko/changelogs/65.txt b/fastlane/metadata/android/ko/changelogs/65.txt new file mode 100644 index 00000000000..163721e3e4d --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/65.txt @@ -0,0 +1,26 @@ +### 개선사항 + +- 버거 메뉴 아이콘 애니메이션 비활성화 #1486 +- 다운로드 삭제 취소 #1472 +- 공유 메뉴 #1498의 다운로드 옵션 +- 길게 탭하는 메뉴 #1454에 공유 옵션 추가 +- 1354번 출구에서 메인 플레이어 최소화 +- 라이브러리 버전 업데이트 및 데이터베이스 백업 수정 #1510 +- ExoPlayer 2.8.2 업데이트 #1392 + - 더 빠른 속도 변경을 위해 다양한 단계 크기를 지원하도록 재생 속도 제어 대화 상자 재작업. + - 재생 속도 제어에서 무음 중에 빨리 감기하는 토글을 추가. 이는 오디오북과 특정 음악 장르에 도움이 될 것이며 진정한 원활한 경험을 제공할 수 있음 (그리고 무음이 많은 노래를 깨뜨릴 수 있음 =\\).. + - 수동으로 수행하는 대신 플레이어 내부에서 미디어와 함께 메타데이터를 전달할 수 있도록 미디어 소스 해상도 리팩터링. 이제 단일 메타데이터 소스가 있으며 재생이 시작되면 바로 사용할 수 있음. + - 재생 목록 조각이 열릴 때 새 메타데이터를 사용할 수 있을 때 원격 재생 목록 메타데이터가 업데이트되지 않는 문제 수정. + - 다양한 UI 수정: #1383, 백그라운드 플레이어 알림 컨트롤은 이제 항상 흰색이며, 플링을 통해 팝업 플레이어를 더 쉽게 종료할 수 있음. +- 멀티서비스를 위해 리팩토링된 아키텍처를 갖춘 새로운 추출기 사용. + +### 수정됨 + +- #1440 깨진 비디오 정보 레이아웃 수정 #1491 +- 기록 수정 #1497 보기 + - #1495, 사용자가 재생 목록에 접속하는 즉시 메타데이터(썸네일, 제목 및 동영상 개수) 업데이트 + - #1475, 사용자가 디테일 프래그먼트의 외부 플레이어에서 비디오를 시작할 때 데이터베이스에 뷰 등록- 팝업 모드의 경우 크린 시간 초과 문제 수정. +- 팝업 모드의 경우 화면 시간 초과 수정. #1463 (#640 수정). +- 기본 비디오 플레이어 수정 #1509 + - [#1412] 플레이어 활동이 백그라운드에 있는 동안 새로운 인텐트가 수신되면 반복 모드에서 플레이어 NPE가 발생하는 문제 수정. + - 팝업 권한이 부여되지 않은 경우 플레이어를 팝업으로 최소화하면 플레이어가 삭제되지 않는 문제 수정. diff --git a/fastlane/metadata/android/ko/changelogs/66.txt b/fastlane/metadata/android/ko/changelogs/66.txt new file mode 100644 index 00000000000..430ff96e019 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/66.txt @@ -0,0 +1,29 @@ +# v0.13.7의 변경 내역 +### 수정됨 +- v0.13.6의 정렬 필터 문제 수정 + +# v0.13.6의 변경 내역 +### 개선 사항 +- 버거 메뉴 아이콘 애니메이션 비활성화 #1486 +- 다운로드 삭제 취소 #1472 +- 공유 메뉴 #1498의 다운로드 옵션 +- 길게 탭하는 메뉴 #1454에 공유 옵션 추가 +- 1354번 출구에서 메인 플레이어 최소화 +- 라이브러리 버전 업데이트 및 데이터베이스 백업 수정 #1510 +- ExoPlayer 2.8.2 업데이트 #1392 + - 더 빠른 속도 변경을 위해 다양한 단계 크기를 지원하도록 재생 속도 제어 대화 상자를 재작업했습니다. + - 재생 속도 제어에서 무음 중에 빨리 감기하는 토글을 추가했습니다. 이는 오디오북과 특정 음악 장르에 도움이 될 것이며 진정한 원활한 경험을 제공할 수 있습니다(그리고 무음이 많은 노래를 깨뜨릴 수 있습니다 =\\). + - 수동으로 수행하는 대신 플레이어 내부에서 미디어와 함께 메타데이터를 전달할 수 있도록 미디어 소스 해상도를 리팩터링했습니다. 이제 단일 메타데이터 소스가 있으며 재생이 시작되면 바로 사용할 수 있습니다. + - 재생 목록 조각이 열릴 때 새 메타데이터를 사용할 수 있을 때 원격 재생 목록 메타데이터가 업데이트되지 않는 문제를 수정했습니다. + - 다양한 UI 수정: #1383, 백그라운드 플레이어 알림 컨트롤은 이제 항상 흰색이며, 플링을 통해 팝업 플레이어를 더 쉽게 종료할 수 있습니다. +- 멀티서비스를 위해 리팩토링된 아키텍처를 갖춘 새로운 추출기 사용 + +### 수정 +- #1440 깨진 비디오 정보 레이아웃 수정 #1491 +- 기록 수정 #1497 보기 + - #1495, 사용자가 재생 목록에 액세스하는 즉시 메타데이터(썸네일, 제목 및 동영상 개수)를 업데이트합니다. + - #1475, 사용자가 디테일 프래그먼트의 외부 플레이어에서 비디오를 시작할 때 데이터베이스에 뷰를 등록합니다. +- 팝업 모드의 경우 크린 시간 초과 문제를 수정합니다. #1463 (고정 #640) +- 기본 비디오 플레이어 수정 #1509 + - [#1412] 플레이어 활동이 백그라운드에 있는 동안 새로운 인텐트가 수신되면 반복 모드에서 플레이어 NPE가 발생하는 문제를 수정했습니다. + - 팝업 권한이 부여되지 않은 경우 플레이어를 팝업으로 최소화하면 플레이어가 삭제되지 않는 문제가 해결되었습니다. diff --git a/fastlane/metadata/android/ko/changelogs/68.txt b/fastlane/metadata/android/ko/changelogs/68.txt new file mode 100644 index 00000000000..77f8fad4172 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/68.txt @@ -0,0 +1,31 @@ +# v0.14.1의 변경 사항 + +### 수정됨 +- 비디오 URL #1659를 해독하지 못하던 문제 수정 +- 설명 링크가 잘 추출되지 않던 문제 수정 #1657 + +# v0.14.0의 변경 사항 + +### 새로운 +- 새로운 서랍 디자인 #1461 +- 새로운 맞춤형 첫 페이지 #1461 + +### 개선 사항 +- 재작업된 제스처 컨트롤 #1604 +- 팝업 플레이어를 닫는 새로운 방법 #1597 + +### 수정됨 +- 구독 횟수를 확인할 수 없을 때 발생하는 오류를 수정합니다. #1649를 닫습니다. + - 이 경우 "구독자 수를 확인할 수 없음"을 표시합니다. +- YouTube 재생목록이 비어 있을 때 NPE 수정 +- SoundCloud의 키오스크에 대한 빠른 수정 +- 리팩터링 및 버그 수정 #1623 + - 순환 검색 결과 #1562 수정 + - 탐색 막대가 정적으로 배치되지 않은 문제 수정 + - YT Premium 비디오가 올바르게 차단되지 않는 문제 수정 + - 가끔 비디오가 로드되지 않는 문제 수정(DASH 구문 분석으로 인해) + - 동영상 설명의 링크 수정 + - 누군가 외부 SD 카드에 다운로드하려고 하면 경고 표시 + - 아무것도 표시되지 않음 예외 트리거 보고서 수정 + - Android 8.1용 백그라운드 플레이어에는 썸네일이 표시되지 않습니다. [여기 참조](https://github.com/TeamNewPipe/NewPipe/issues/943) +- 방송수신기 등록 문제 수정. #1641을 닫습니다. diff --git a/fastlane/metadata/android/ko/changelogs/69.txt b/fastlane/metadata/android/ko/changelogs/69.txt new file mode 100644 index 00000000000..0083b5e5873 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/69.txt @@ -0,0 +1,19 @@ +### 새로운 +- 길게 탭하여 구독정보 삭제 및 공유 #1516 +- 태블릿 UI 및 그리드 목록 레이아웃 #1617 + +### 개선 사항 +- 마지막으로 사용된 화면 비율 #1748을 저장하고 다시 로드합니다. +- 전체 비디오 이름 #1771을 사용하여 다운로드 활동에서 선형 레이아웃을 활성화합니다. +- 구독 탭 #1516 내에서 직접 구독 삭제 및 공유 +- 재생 대기열이 이미 종료된 경우 대기열에 추가하면 비디오 재생이 시작됩니다. #1783 +- 볼륨 및 밝기 제스처에 대한 별도 설정 #1644 +- 현지화 #1792 지원 추가 + +### 수정 +- 에 대한 시간 구문 분석을 수정합니다. 형식이므로 핀란드에서 NewPipe를 사용할 수 있습니다. +- 구독 수 수정 +- API 28+ 장치에 대한 포그라운드 서비스 권한 추가 #1830 + +### 알려진 버그 +- Android P에서는 재생 상태를 저장할 수 없습니다. diff --git a/fastlane/metadata/android/ko/changelogs/70.txt b/fastlane/metadata/android/ko/changelogs/70.txt new file mode 100644 index 00000000000..15c41627fba --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/70.txt @@ -0,0 +1,25 @@ +주의: 이 버전은 아마도 지난 버전과 마찬가지로 버그페스트일 것입니다. 그러나 17. 이후 전체 종료로 인해 깨진 버전이 버전이 없는 것보다 낫습니다. 오른쪽? ̅\_(ツ)_/̅ + +### 개선 사항 +* 이제 다운로드한 파일을 한 번의 클릭으로 열 수 있습니다 #1879 +* 안드로이드 4.1 - 4.3 #1884에 대한 지원 중단 +* 이전 플레이어 #1884 제거 +* 스트림을 오른쪽으로 스와이프하여 현재 재생 대기열에서 스트림을 제거합니다. #1915 +* 새 스트림이 수동으로 대기열에 추가되면 자동 대기열에 추가된 스트림을 제거합니다. #1878 +* 다운로드를 위한 후처리 및 누락된 기능 구현 #1759 by @kapodamy + * 후처리 인프라 + * 적절한 오류 처리 "인프라"(다운로더용) + * 여러 다운로드 대신 대기열 + * 직렬화된 보류 중인 다운로드(`.giga` 파일)를 앱 데이터로 이동 + * 최대 다운로드 재시도 구현 + * 적절한 멀티스레드 다운로드 일시중지 + * 모바일 네트워크로 전환할 때 다운로드 중지(작동하지 않음, 두 번째 항목 참조) + * 다음 다운로드를 위해 스레드 수를 저장하세요 + * 많은 불일치가 수정되었습니다. + +### 수정됨 +* 기본 해상도가 최고 및 제한된 모바일 데이터 해상도 #1835로 설정된 경우 충돌 수정 +* 팝업 플레이어 충돌 수정 #1874 +* 백그라운드 플레이어를 열려고 할 때 NPE #1901 +* 자동 대기열이 활성화된 경우 새 스트림을 삽입하는 문제 수정 #1878 +* 암호 해독 폐쇄 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/71.txt b/fastlane/metadata/android/ko/changelogs/71.txt new file mode 100644 index 00000000000..c38a4e6c756 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/71.txt @@ -0,0 +1,10 @@ +### 개선 사항 +* GitHub 빌드에 대한 앱 업데이트 알림 추가(@krtkush의 #1608) +* 다운로더의 다양한 개선 사항(@kapodamy의 #1944): + * 누락된 흰색 아이콘을 추가하고 하드코어 방식을 사용하여 아이콘 색상을 변경합니다. + * 반복자가 초기화되었는지 확인하세요(수정 #2031) + * 새 먹서에서 "사후 처리 실패" 오류가 있는 다운로드 재시도 허용 + * 비동기 비디오 및 오디오 스트림을 수정하는 새로운 MPEG-4 먹서(#2039) + +### 수정됨 +* YouTube 실시간 스트리밍은 잠시 후에 재생이 중지됩니다(@yausername의 #1996). diff --git a/fastlane/metadata/android/ko/changelogs/730.txt b/fastlane/metadata/android/ko/changelogs/730.txt new file mode 100644 index 00000000000..b30d9896adc --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/730.txt @@ -0,0 +1,2 @@ +# 고정 +- 핫픽스 복호화 기능 오류가 다시 발생했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/740.txt b/fastlane/metadata/android/ko/changelogs/740.txt new file mode 100644 index 00000000000..41c78eb2ab2 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/740.txt @@ -0,0 +1,23 @@ +

    개선 사항

    +
      +
    • 댓글의 링크를 클릭 가능하게 만들고 텍스트 크기를 늘립니다.
    • +
    • 댓글의 타임스탬프 링크 클릭
    • +
    • 최근 선택한 상태를 기준으로 기본 탭 표시
    • +
    • 재생목록 창에서 '배경'을 길게 클릭하면 대기열에 재생목록 추가
    • +
    • URL이 아닌 공유 텍스트 검색
    • +
    • 기본 비디오 플레이어에 "현재 시간 공유" 버튼 추가
    • +
    • 동영상 대기열이 완료되면 기본 플레이어에 닫기 버튼 추가
    • +
    • 동영상 목록 항목의 길게 누르기 메뉴에 "백그라운드에서 직접 재생" 추가
    • +
    • Play/Enqueue 명령에 대한 영어 번역 개선
    • +
    • 작은 성능 개선
    • +
    • 사용하지 않는 파일 제거
    • +
    • ExoPlayer를 2.9.6으로 업데이트
    • +
    • Invidious 링크에 대한 지원 추가
    • +
    +

    수정됨

    +
      +
    • 댓글 및 관련 스트림이 비활성화된 고정 스크롤
    • +
    • CheckForNewAppVersionTask가 실행되어서는 안 될 때 실행되는 문제를 수정했습니다.
    • +
    • YouTube 구독 가져오기 수정: URL이 잘못된 구독은 무시하고 제목이 비어 있는 구독은 유지
    • +
    • 잘못된 YouTube URL 수정: 서명 태그 이름이 스트림 로드를 방해하는 '서명'이 아닐 수도 있습니다.
    • +
    diff --git a/fastlane/metadata/android/ko/changelogs/750.txt b/fastlane/metadata/android/ko/changelogs/750.txt new file mode 100644 index 00000000000..08450674b27 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/750.txt @@ -0,0 +1,22 @@ +새로운 +재생 재개 #2288 +• 지난번에 중단한 스트림 재개 +다운로더 개선 사항 #2149 +• 저장소 액세스 프레임워크를 사용하여 외부 SD 카드에 다운로드 저장 +• 새로운 mp4 먹서 +• 선택적으로 다운로드를 시작하기 전에 다운로드 디렉터리를 변경합니다. +• 종량제 네트워크를 존중합니다. + + +향상 +• gema 문자열 #2295 제거됨 +• 활동 수명주기 동안 (자동)회전 변경 처리 #2444 +• 길게 누르기 메뉴를 일관성있게 만들기 #2368 + +결정된 +• 선택한 자막 트랙 이름이 표시되지 않는 문제 수정 #2394 +• 앱 업데이트 확인 실패 시 충돌 방지(GitHub 버전) #2423 +• 다운로드가 99.9%에서 멈추는 현상 수정 #2440 +• 재생 대기열 메타데이터 업데이트 #2453 +• [SoundCloud] 재생 목록을 로드할 때 발생하는 충돌 수정 TeamNewPipe/NewPipeExtractor#170 +• [YouTube] 고정 기간은 TeamNewPipe/NewPipeExtractor#177로 파싱할 수 없습니다. diff --git a/fastlane/metadata/android/ko/changelogs/760.txt b/fastlane/metadata/android/ko/changelogs/760.txt new file mode 100644 index 00000000000..78097b1abb7 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/760.txt @@ -0,0 +1,43 @@ +0.17.1의 변경 사항 + +새로운 +• 태국어 현지화 + + +향상 +• 재생목록을 다시 길게 누르는 메뉴에 여기서 재생 시작 작업 추가 #2518 +• SAF/레거시 파일 선택기 #2521용 스위치 추가 + +결정된 +• 앱 전환 시 다운로드 보기에서 버튼이 사라지는 문제 수정 #2487 +• 시청 기록이 비활성화되어 있어도 고정 재생 위치가 저장됩니다. +• 목록 보기의 재생 위치로 인해 성능이 저하되는 문제 수정 #2517 +• [추출기] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 수정 +• [Extractor] [YouTube] 결과에 재생목록이 있을 때 일반 검색 오류 수정 TeamNewPipe/NewPipeExtractor#185 + + + +0.17.0의 변경 사항 + +새로운 +재생 재개 #2288 +• 지난번에 중단한 스트림 재개 +다운로더 개선 사항 #2149 +• 저장소 액세스 프레임워크를 사용하여 외부 SD 카드에 다운로드 저장 +• 새로운 mp4 먹서 +• 선택적으로 다운로드를 시작하기 전에 다운로드 디렉터리를 변경합니다. +• 종량제 네트워크를 존중합니다. + + +향상 +• gema 문자열 #2295 제거됨 +• 활동 수명주기 동안 (자동)회전 변경 처리 #2444 +• 길게 누르기 메뉴를 일관성있게 만들기 #2368 + +결정된 +• 선택한 자막 트랙 이름이 표시되지 않는 문제 수정 #2394 +• 앱 업데이트 확인 실패 시 충돌 방지(GitHub 버전) #2423 +• 다운로드가 99.9%에서 멈추는 현상 수정 #2440 +• 재생 대기열 메타데이터 업데이트 #2453 +• [SoundCloud] 재생 목록을 로드할 때 발생하는 충돌 수정 TeamNewPipe/NewPipeExtractor#170 +• [YouTube] 고정 기간은 TeamNewPipe/NewPipeExtractor#177로 파싱할 수 없습니다. diff --git a/fastlane/metadata/android/ko/changelogs/770.txt b/fastlane/metadata/android/ko/changelogs/770.txt new file mode 100644 index 00000000000..3008815d801 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/770.txt @@ -0,0 +1,4 @@ +0.17.2의 변경 사항 + +고치다 +• 사용할 수 있는 동영상이 없는 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/780.txt b/fastlane/metadata/android/ko/changelogs/780.txt new file mode 100644 index 00000000000..114b38dd550 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/780.txt @@ -0,0 +1,12 @@ +0.17.3의 변경 사항 + +향상 +• 재생 상태를 지우는 옵션 추가 #2550 +• 파일 선택기에 숨겨진 디렉터리 표시 #2591 +• `invidio.us` 인스턴스의 URL이 NewPipe #2488로 열리도록 지원합니다. +• 'music.youtube.com' URL에 대한 지원 추가 TeamNewPipe/NewPipeExtractor#194 + +결정된 +• [YouTube] 'java.lang.IllegalArgumentException #192 수정 +• [YouTube] 실시간 스트림이 작동하지 않는 문제 수정 TeamNewPipe/NewPipeExtractor#195 +• 스트림을 다운로드할 때 Android Pie의 성능 문제 수정 #2592 diff --git a/fastlane/metadata/android/ko/changelogs/790.txt b/fastlane/metadata/android/ko/changelogs/790.txt new file mode 100644 index 00000000000..c426443b2cf --- /dev/null +++ b/fastlane/metadata/android/ko/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/ko/changelogs/800.txt b/fastlane/metadata/android/ko/changelogs/800.txt new file mode 100644 index 00000000000..04907891e90 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/800.txt @@ -0,0 +1,27 @@ +새로운 +• P2P 없이 PeerTube 지원(#2201)[베타]: + ◦ PeerTube 인스턴스에서 비디오 시청 및 다운로드 + ◦ 전체 PeerTube 세계에 액세스하려면 설정에 인스턴스를 추가하세요. + ◦ 특정 인스턴스에 액세스할 때 Android 4.4 및 7.1에서 SSL 핸드셰이크에 문제가 있어 네트워크 오류가 발생할 수 있습니다. + +• 다운로더(#2679): + ◦ 다운로드 ETA 계산 + ◦ opus(webm 파일)를 ogg로 다운로드 + ◦ 오랜 일시 중지 후 다운로드를 재개하려면 만료된 다운로드 링크를 복구하세요. + +향상 +• KioskFragment가 선호하는 콘텐츠 국가의 변경 사항을 인식하고 모든 기본 탭의 성능을 향상시킵니다. #2742 +• 추출기 #2713에서 새로운 현지화 및 다운로더 구현을 사용합니다. +• '기본 키오스크' 문자열을 번역 가능하게 만듭니다. +• 검은색 테마용 검은색 탐색 모음 #2569 + +결정된 +• 팝업플레이어 이동 중 다른 손가락을 놓으면 팝업플레이어가 이동되지 않는 버그 수정 #2772 +• 업로더가 없는 재생목록을 허용하고 이 문제 #2724, TeamNewPipe/NewPipeExtractor#219와 관련된 충돌을 해결합니다. +• Android 4.4 기기(API 19/KitKat)에서 TLS1.1/1.2를 활성화하여 MediaCCC 및 일부 PeerTube 인스턴스와의 TLS 핸드셰이크 수정 #2792 +• [SoundCloud] client_id 추출 수정 TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] 오디오 스트림 추출 수정 + +개발 +• ExoPlayer를 2.10.8 #2791, #2816으로 업데이트 +• Gradle을 3.5.1로 업데이트하고 Kotlin 지원 #2714를 추가합니다. diff --git a/fastlane/metadata/android/ko/changelogs/810.txt b/fastlane/metadata/android/ko/changelogs/810.txt new file mode 100644 index 00000000000..38ab2c4b3a8 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/810.txt @@ -0,0 +1,19 @@ +새로운 +• 백그라운드에서 재생할 때 잠금 화면에 동영상 미리보기 이미지 표시 + +향상 +• 배경/팝업 버튼을 길게 누르면 대기열에 로컬 재생 목록 추가 +• 기본 페이지 탭을 스크롤 가능하게 만들고 탭이 하나만 있는 경우 숨깁니다. +• 백그라운드 플레이어의 알림 썸네일 업데이트 양 제한 +• 빈 로컬 재생목록에 더미 썸네일 추가 +• *.webm 대신 *.opus 파일 확장자를 사용하고 다운로드 드롭다운에서 'WebM Opus' 대신 형식 라벨에 'opus'를 표시합니다. +• '다운로드'에 다운로드한 파일이나 다운로드 기록을 삭제하는 버튼 추가 +• [YouTube] /c/shortened_url 채널 링크에 지원 추가 + +결정된 +• NewPipe에 비디오를 공유하고 해당 스트림을 직접 다운로드할 때 여러 문제가 해결되었습니다. +• 생성 스레드 외부에서 플레이어 액세스 수정 +• 검색결과 페이지 고정 +• [YouTube] Null 전환으로 인해 NPE가 발생하는 문제 수정 +• [YouTube] invidio.us URL을 열 때 댓글 보기 문제를 해결했습니다. +• [SoundCloud] client_id 업데이트됨 diff --git a/fastlane/metadata/android/ko/changelogs/820.txt b/fastlane/metadata/android/ko/changelogs/820.txt new file mode 100644 index 00000000000..0c669a8a454 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/820.txt @@ -0,0 +1 @@ +YouTube를 사용할 수 없게 만드는 복호화 함수 이름 정규식을 수정했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/830.txt b/fastlane/metadata/android/ko/changelogs/830.txt new file mode 100644 index 00000000000..ad677b1e2b3 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud 문제를 해결하기 위해 SoundCloud client_id를 업데이트했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/840.txt b/fastlane/metadata/android/ko/changelogs/840.txt new file mode 100644 index 00000000000..56d539c500b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/840.txt @@ -0,0 +1,22 @@ +새로운 사항 +• 앱 언어를 변경하는 언어 선택기 추가 +• 플레이어 접을 수 있는 메뉴에 Kodi로 보내기 버튼 추가 +• 길게 눌러서 댓글을 복사하는 기능 추가 + +개선된 사항 +• ReCaptcha 활동 수정 및 획득한 쿠키를 올바르게 저장 +• 설정에서 시청 기록이 활성화되지 않은 경우 점 메뉴 대신 서랍 및 기록 숨기기 버튼 추가 +• Android 6 이상에서 설정에서 다른 앱 위에 표시 권한 요청 올바르게 수행 +• BookmarkFragment에서 길게 클릭하여 로컬 재생 목록 이름 변경 +• 다양한 PeerTube 개선 +• 여러 영어 소스 문자열 개선 + +수정된 사항 +• "앱 전환 시 최소화" 옵션이 활성화되고 NewPipe가 최소화되면 일시 중지되지만 플레이어가 다시 시작되는 문제 수정 +• 제스처의 초기 밝기 값 수정 +• 모든 줄 바꿈이 포함되지 않은 .srt 자막 다운로드 수정 +• 일부 Android 5 기기가 CTF 호환이 아니기 때문에 SD 카드로 다운로드가 실패하는 문제 수정 +• Android KitKat에서 다운로드 수정 +• 손상된 비디오 .mp4 파일이 오디오 파일로 인식되는 문제 수정 +• 여러 지역화 수정 문제, 잘못된 중국어 언어 코드 포함 +• [YouTube] 설명의 타임스탬프를 다시 클릭할 수 있음 diff --git a/fastlane/metadata/android/ko/changelogs/850.txt b/fastlane/metadata/android/ko/changelogs/850.txt new file mode 100644 index 00000000000..c37333531e1 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/850.txt @@ -0,0 +1 @@ +이 릴리스에서는 YouTube 웹사이트 버전이 업데이트되었습니다. 이전 웹사이트 버전은 3월에 중단되므로 NewPipe를 업그레이드해야 합니다. diff --git a/fastlane/metadata/android/ko/changelogs/860.txt b/fastlane/metadata/android/ko/changelogs/860.txt new file mode 100644 index 00000000000..8b0277ecd66 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/860.txt @@ -0,0 +1,7 @@ +개선된 기능 +• 피치와 템포가 언후크되었는지 여부를 저장하고 복원 +• 플레이어에서 디스플레이 컷아웃 지원 +• 라운드 뷰 및 구독자 수 +• YouTube를 최적화하여 데이터를 덜 사용 + +이 릴리스에서는 YouTube 관련 버그 15개 이상이 수정되었습니다. diff --git a/fastlane/metadata/android/ko/changelogs/870.txt b/fastlane/metadata/android/ko/changelogs/870.txt new file mode 100644 index 00000000000..a859a8d73ef --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/870.txt @@ -0,0 +1,2 @@ +이것은 NewPipe를 업데이트하여 SoundCloud를 다시 큰 번거로움 없이 사용할 수 있도록 하는 핫픽스 릴리스입니다. +SoundCloud의 v2 API가 이제 추출기에서 사용되고 잘못된 클라이언트 ID 감지가 개선되었습니다. diff --git a/fastlane/metadata/android/ko/changelogs/900.txt b/fastlane/metadata/android/ko/changelogs/900.txt new file mode 100644 index 00000000000..1c098e85a08 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/900.txt @@ -0,0 +1,14 @@ +새로운 기능 +• 구독 그룹 및 정렬된 피드 +• 플레이어의 음소거 버튼 + +개선된 기능 +• NewPipe에서 music.youtube.com 및 media.ccc.de 링크 열기 허용 +• 모양에서 콘텐츠로 두 가지 설정 재배치 +• 부정확한 탐색이 활성화된 경우 5, 15, 25초 탐색 옵션 숨기기 + +수정된 기능 +• 일부 WebM 비디오 탐색 불가 +• Android P에서 데이터베이스 백업 +• 다운로드한 파일을 공유할 때 충돌 +• 수많은 YouTube 추출 문제 등... diff --git a/fastlane/metadata/android/ko/changelogs/910.txt b/fastlane/metadata/android/ko/changelogs/910.txt new file mode 100644 index 00000000000..97890f94442 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/910.txt @@ -0,0 +1 @@ +일부 드문 경우에 NewPipe가 시작되지 않는 고정 데이터베이스 마이그레이션이 수정되었습니다. diff --git a/fastlane/metadata/android/ko/changelogs/920.txt b/fastlane/metadata/android/ko/changelogs/920.txt new file mode 100644 index 00000000000..bb8449fd010 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/920.txt @@ -0,0 +1,9 @@ +개선된 사항 + +• 스트림 그리드 항목에 업로드 날짜 및 조회수 추가 +• 서랍 헤더 레이아웃 개선 + +수정된 사항 + +• API 19에서 충돌을 일으키는 음소거 버튼 수정 +• 긴 1080p 60fps 비디오 다운로드 수정 diff --git a/fastlane/metadata/android/ko/changelogs/930.txt b/fastlane/metadata/android/ko/changelogs/930.txt new file mode 100644 index 00000000000..964b94b76ba --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/930.txt @@ -0,0 +1,19 @@ +새로운 사항 +• YouTube Music에서 검색 +• 기본 Android TV 지원 + +개선된 사항 +• 로컬 재생 목록에서 시청한 모든 비디오를 제거하는 기능 추가 +• 아직 콘텐츠가 지원되지 않을 때 충돌 대신 메시지 표시 +• 핀치 제스처로 팝업 플레이어 크기 조정 개선 +• 채널의 배경 및 팝업 버튼에서 길게 누르면 스트림 대기열에 추가 +• 서랍 헤더 제목의 크기 처리 개선 + +수정된 사항 +• 연령 제한 콘텐츠 설정이 작동하지 않는 문제 수정 +• 특정 종류의 reCAPTCHA 수정 +• 재생 목록이 `null`인 동안 북마크를 열 때 충돌 수정 +• 네트워크 관련 예외 감지 수정 +• 구독 조각에서 그룹 정렬 버튼 표시 수정 + +및 기타 diff --git a/fastlane/metadata/android/ko/changelogs/940.txt b/fastlane/metadata/android/ko/changelogs/940.txt new file mode 100644 index 00000000000..8a65c8c7879 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/940.txt @@ -0,0 +1,16 @@ +새로운 사항 +• SoundCloud 댓글 지원 추가 +• YouTube 제한 모드 설정 추가 +• PeerTube 부모 채널 세부 정보 표시 + +개선된 사항 +• 지원되는 서비스에만 Kore 버튼 표시 +• NavigationBar 또는 StatusBar에서 시작하는 플레이어 제스처 차단 +• 서비스 색상에 따라 재시도 및 구독 버튼 배경색 변경 + +수정된 사항 +• 다운로드 대화 상자 정지 수정 +• 브라우저에서 열기 버튼이 이제 브라우저에서 실제로 열림 +• 비디오 열기 및 "이 스트림을 재생할 수 없습니다" 오류 수정 + +및 기타 diff --git a/fastlane/metadata/android/ko/changelogs/950.txt b/fastlane/metadata/android/ko/changelogs/950.txt new file mode 100644 index 00000000000..3fd1a82da6b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/950.txt @@ -0,0 +1,4 @@ +이 릴리스는 세 가지 작은 수정 사항을 제공합니다. +• Android 10+에서 스토리지 접속 수정 +• 키오스크 열기 수정 +• 긴 비디오의 지속 시간 구문 분석 수정 diff --git a/fastlane/metadata/android/ko/changelogs/951.txt b/fastlane/metadata/android/ko/changelogs/951.txt new file mode 100644 index 00000000000..1bbc79b36df --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/951.txt @@ -0,0 +1,17 @@ +새로운 사항 +• 피드 그룹 대화 상자에 구독 선택기 검색 추가 +• 피드 그룹 대화 상자에 필터를 추가하여 그룹화되지 않은 구독만 표시 +• 메인 페이지에 재생 목록 탭 추가 +• 백그라운드/팝업 플레이어 대기열에서 빨리 감기/되감기 +• 검색 제안 표시: 다음을 의미하고 결과를 표시 + +개선된 사항 +• 멀티플렉싱된 파일에 쓰기 애플리케이션 메타데이터 삭제 +• 실패한 스트림을 대기열에서 제거하지 않음 +• 툴바 색상과 일치하도록 상태 표시줄 색상 업데이트 + +수정된 사항 +• 부동 소수점 누적 오류로 인한 오디오/비디오 비동기화 수정 +• [PeerTube] 삭제된 댓글 처리 + +및 기타 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/changelogs/954.txt b/fastlane/metadata/android/ko/changelogs/954.txt new file mode 100644 index 00000000000..d4f600ad2de --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/954.txt @@ -0,0 +1,9 @@ +• 새로운 애플리케이션 워크플로: 세부 정보 페이지에서 비디오 재생, 아래로 스와이프하여 플레이어 최소화 +• MediaStyle 알림: 알림에서 사용자 정의 가능한 작업, 성능 개선 +• 데스크톱 앱으로 NewPipe를 사용할 때 기본 크기 조정 + +• 지원되지 않는 URL 토스트의 경우 열린 옵션이 있는 대화 상자 표시 +• 원격 토스트를 가져올 수 없는 경우 검색 제안 환경 개선 +• 기본 비디오 품질을 720p60(앱 내 플레이어) 및 480p(팝업 플레이어)로 높임 + +• 수많은 버그 수정 및 기타 diff --git a/fastlane/metadata/android/ko/changelogs/957.txt b/fastlane/metadata/android/ko/changelogs/957.txt new file mode 100644 index 00000000000..82b97b58204 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/957.txt @@ -0,0 +1,10 @@ +• 특정 인큐 동작을 하나로 통합 +• 플레이어를 닫는 두 손가락 제스처 +• reCAPTCHA 쿠키 지우기 허용 +• 알림에 색상을 입히지 않는 옵션 +• 무한 버퍼링, NewPipe에 공유할 때의 버그 동작 및 기타 불일치를 수정하기 위해 비디오 세부 정보가 열리는 방식 개선 +• YouTube 비디오 속도 향상 및 연령 제한 비디오 수정 +• 빨리 감기/되감기 시 충돌 수정 +• 축소판 그림을 끌어서 목록을 재정렬하지 않음 +• 팝업 속성을 항상 기억 +• Santali 언어 추가 diff --git a/fastlane/metadata/android/ko/changelogs/958.txt b/fastlane/metadata/android/ko/changelogs/958.txt new file mode 100644 index 00000000000..88b28781528 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/958.txt @@ -0,0 +1,15 @@ +새롭고 개선된 사항: +• 잠금 화면에서 썸네일을 숨기는 옵션 다시 추가 +• 피드 새로 고침을 위해 당김 +• 로컬 목록을 가져올 때 성능 개선 + +수정된 사항: +• RAM에서 제거된 후 NewPipe를 시작할 때 발생하는 충돌 수정 +• 인터넷에 연결되어 있지 않을 때 시작 시 발생하는 충돌 수정 +• 밝기 및 볼륨 제스처 설정에 대한 수정 +• [YouTube] 긴 재생 목록 수정 + +기타: +• 코드 정리 및 여러 가지 내부 개선 사항 +• 종속성 업데이트 +• 번역 업데이트 diff --git a/fastlane/metadata/android/ko/changelogs/959.txt b/fastlane/metadata/android/ko/changelogs/959.txt new file mode 100644 index 00000000000..bf0ba68d092 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/959.txt @@ -0,0 +1,3 @@ +오류 보고자를 연 후 무한 루프가 발생하는 문제를 해결. +NewPipe에서 자동으로 열 수 있는 PeerTube 인스턴스 목록을 업데이트. +번역 업데이트. diff --git a/fastlane/metadata/android/ko/changelogs/960.txt b/fastlane/metadata/android/ko/changelogs/960.txt new file mode 100644 index 00000000000..1289c9fa77f --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/960.txt @@ -0,0 +1,4 @@ +• 설정의 데이터베이스 내보내기 설명이 향상되었습니다. +• 유튜브 코멘트 파싱이 수정되었습니다. +• media.ccc.de 서비스 표기명이 수정되었습니다. +• 번역이 업데이트되었습니다. diff --git a/fastlane/metadata/android/ko/changelogs/961.txt b/fastlane/metadata/android/ko/changelogs/961.txt new file mode 100644 index 00000000000..2553d38f6f4 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] 믹스 지원 +• [YouTube] 공공 방송사와 Covid-19에 대한 정보 표시 +• [media.ccc.de] 최신 비디오 추가 +• 소말리아어 번역 추가 + +• 많은 내부 개선 사항 + +• 플레이어 내에서 비디오 공유 수정 +• 빈 ReCaptcha 웹뷰 수정 +• 목록에서 스트림을 제거할 때 발생하는 충돌 수정 +• [PeerTube] 관련 스트림 수정 +• [YouTube] YouTube Music 검색 수정 diff --git a/fastlane/metadata/android/ko/changelogs/962.txt b/fastlane/metadata/android/ko/changelogs/962.txt new file mode 100644 index 00000000000..a95ef20910d --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/962.txt @@ -0,0 +1,2 @@ +media.ccc.de 서비스에 "최근" 비디오를 추가했습니다. +media.ccc.de 서비스에 라이브 스트림을 추가했고 라이브 스트림 지원도 추가했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/963.txt b/fastlane/metadata/android/ko/changelogs/963.txt new file mode 100644 index 00000000000..428d4973870 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] 채널 이어가기 수정 diff --git a/fastlane/metadata/android/ko/changelogs/964.txt b/fastlane/metadata/android/ko/changelogs/964.txt new file mode 100644 index 00000000000..c26c4d3a687 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/964.txt @@ -0,0 +1,8 @@ +• 플레이어 컨트롤에 챕터 지원 추가 +• [PeerTube] 세피아 검색 추가 +• 비디오 세부 정보 보기에 공유 버튼 다시 추가 및 스트림 설명 탭 레이아웃으로 이동 +• 밝기 제스처가 비활성화된 경우 밝기 복원 비활성화 +• Kodi에서 비디오를 재생하는 목록 항목 추가 +• 일부 기기에서 기본 브라우저가 설정되지 않은 경우 충돌 수정 및 공유 대화 상자 개선 +• 전체 화면 플레이어에서 하드웨어 공간 버튼으로 재생/일시 중지 전환 +• [media.ccc.de] 다양한 수정 및 개선 diff --git a/fastlane/metadata/android/ko/changelogs/965.txt b/fastlane/metadata/android/ko/changelogs/965.txt new file mode 100644 index 00000000000..055f8589f7d --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/965.txt @@ -0,0 +1,6 @@ +채널 그룹을 재정렬할 때 발생하는 충돌을 수정했습니다. +채널 및 재생 목록에서 더 많은 YouTube 비디오를 가져오는 문제를 수정했습니다. +YouTube 댓글을 가져오는 문제를 수정했습니다. +YouTube URL에서 /watch/, /v/ 및 /w/ 하위 경로에 대한 지원을 추가했습니다. +SoundCloud 클라이언트 ID 및 지역 제한 콘텐츠 추출 문제를 수정했습니다. +북부 쿠르드어 현지화를 추가했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/966.txt b/fastlane/metadata/android/ko/changelogs/966.txt new file mode 100644 index 00000000000..6e8bb022e7f --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/966.txt @@ -0,0 +1,14 @@ +새로운 사항: +• 새로운 서비스 추가: Bandcamp + +개선된 사항: +• 앱이 기기 테마를 따르도록 하는 옵션 추가 +• 개선된 오류 패널을 표시하여 일부 충돌 방지 +• 콘텐츠를 사용할 수 없는 이유에 대한 자세한 정보 표시 +• 하드웨어 공간 버튼이 재생/일시 중지 트리거 +• "다운로드 시작됨" 토스트 표시 + +수정된 사항: +• 백그라운드에서 재생하는 동안 비디오 세부 정보에서 매우 작은 썸네일 수정 +• 최소화된 플레이어에서 빈 제목 수정 +• 마지막 크기 조정 모드가 올바르게 복원되지 않는 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/967.txt b/fastlane/metadata/android/ko/changelogs/967.txt new file mode 100644 index 00000000000..8ad225e82c3 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/967.txt @@ -0,0 +1 @@ +EU에서 YouTube가 제대로 작동하지 않는 문제를 수정했습니다. 이는 NewPipe가 CONSENT 쿠키를 설정해야 하는 새로운 쿠키 및 개인정보 동의 시스템으로 인해 발생했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/968.txt b/fastlane/metadata/android/ko/changelogs/968.txt new file mode 100644 index 00000000000..49bb9583135 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/968.txt @@ -0,0 +1,7 @@ +길게 누르기 메뉴에 채널 세부 정보 옵션 추가. +재생 목록 인터페이스에서 재생 목록 이름을 바꾸는 기능 추가. +비디오가 버퍼링되는 동안 사용자가 일시 정지할 수 있도록 허용. +흰색 테마를 다듬음. +더 큰 글꼴 크기를 사용할 때 겹치는 글꼴 수정. +Formuler 및 Zephier 기기에서 비디오가 나오지 않는 문제 수정. +다양한 충돌 수정. diff --git a/fastlane/metadata/android/ko/changelogs/969.txt b/fastlane/metadata/android/ko/changelogs/969.txt new file mode 100644 index 00000000000..fd55b531f5e --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/969.txt @@ -0,0 +1,8 @@ +• 외부 저장소에 설치 허용 +• [Bandcamp] 스트림에서 처음 세 개의 댓글 표시 지원 추가 +• 다운로드가 시작될 때만 '다운로드가 시작되었습니다' 토스트 표시 +• 쿠키가 저장되지 않은 경우 reCaptcha 쿠키 설정 안 함 +• [플레이어] 캐시 성능 개선 +• [플레이어] 플레이어가 자동으로 재생되지 않는 문제 수정 +• 다운로드 삭제 시 이전 스낵바 해제 +• 목록에 없는 개체 삭제 시도 수정 diff --git a/fastlane/metadata/android/ko/changelogs/970.txt b/fastlane/metadata/android/ko/changelogs/970.txt new file mode 100644 index 00000000000..c8bae41c25f --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/970.txt @@ -0,0 +1,11 @@ +새로운 사항 +• 설명 아래에 콘텐츠 메타데이터(태그, 카테고리, 라이선스 등) 표시 +• 원격(로컬이 아닌) 재생 목록에 "채널 세부 정보 표시" 옵션 추가 +• 길게 누르면 메뉴에 "브라우저에서 열기" 옵션 추가 + +수정된 사항 +• 비디오 세부 정보 페이지에서 회전 충돌 수정 +• 플레이어에서 "Kodi로 재생" 버튼이 항상 Kore를 설치하라는 메시지를 표시하도록 수정 +• 가져오기 및 내보내기 경로 설정 수정 및 개선 +• [YouTube] 댓글 좋아요 수 수정 +그리고 훨씬 더 많은 기능 diff --git a/fastlane/metadata/android/ko/changelogs/971.txt b/fastlane/metadata/android/ko/changelogs/971.txt new file mode 100644 index 00000000000..d30e70a5bf1 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/971.txt @@ -0,0 +1,3 @@ +핫픽스 +• 재버퍼링 후 재생을 위한 버퍼 증가 +• 플레이어에서 재생 대기열 아이콘을 클릭할 때 태블릿 및 TV에서 발생하는 충돌 수정 diff --git a/fastlane/metadata/android/ko/changelogs/972.txt b/fastlane/metadata/android/ko/changelogs/972.txt new file mode 100644 index 00000000000..7a8c2656ac6 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/972.txt @@ -0,0 +1,14 @@ +새로운 사항 +설명에서 타임스탬프와 해시태그 인식 +수동 태블릿 모드 설정 추가 +피드에서 재생된 항목을 숨기는 기능 추가 + +개선된 사항 +저장소 액세스 프레임워크 제대로 지원 +사용할 수 없는 채널과 종료된 채널의 오류 처리 개선 +Android 10 이상 사용자를 위한 Android 공유 시트에 이제 콘텐츠 제목이 표시됩니다. +Invidious 인스턴스 업데이트 및 파이프 링크 지원 + +수정된 사항 +[YouTube] 연령 제한 콘텐츠 +선택 대화 상자를 열 때 창 예외가 누출되는 것을 방지 diff --git a/fastlane/metadata/android/ko/changelogs/973.txt b/fastlane/metadata/android/ko/changelogs/973.txt new file mode 100644 index 00000000000..4549929476e --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/973.txt @@ -0,0 +1,4 @@ +핫픽스 +• 한 행에 들어갈 수 있는 비디오 수를 잘못 계산하여 그리드 레이아웃에서 썸네일과 제목이 잘리는 문제 수정 +• 공유 메뉴에서 열면 아무것도 하지 않고 다운로드 대화 상자가 사라지는 문제 수정 +• Storage Access Framework 파일 선택기와 같은 외부 활동을 여는 것과 관련된 라이브러리 업데이트 diff --git a/fastlane/metadata/android/ko/changelogs/974.txt b/fastlane/metadata/android/ko/changelogs/974.txt new file mode 100644 index 00000000000..4f5f5b53189 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/974.txt @@ -0,0 +1,5 @@ +핫픽스 +• YouTube 제한으로 인한 버퍼링 문제 해결 +• YouTube 댓글 추출 및 비활성화된 댓글로 인한 충돌 해결 +• YouTube 음악 검색 해결 +• PeerTube 라이브 스트림 해결 diff --git a/fastlane/metadata/android/ko/changelogs/975.txt b/fastlane/metadata/android/ko/changelogs/975.txt new file mode 100644 index 00000000000..18986fd1664 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/975.txt @@ -0,0 +1,17 @@ +새로운 사항 +• 검색하는 동안 썸네일 미리보기 표시 +• 비활성화된 댓글 감지 +• 피드 항목을 시청한 것으로 표시 허용 +• 댓글 하트 표시 + +개선된 사항 +• 메타데이터 및 태그 레이아웃 개선 +• UI 구성 요소에 서비스 색상 적용 + +수정된 사항 +• 미니 플레이어의 썸네일 수정 +• 중복 대기열 항목에서 끝없는 버퍼링 수정 +• 회전 및 더 빠른 닫기와 같은 일부 플레이어 수정 +• 백그라운드에서 로드된 상태로 유지되는 ReCAPTCHA 수정 +• 피드를 새로 고칠 때 클릭 비활성화 +• 일부 다운로더 충돌 수정 diff --git a/fastlane/metadata/android/ko/changelogs/976.txt b/fastlane/metadata/android/ko/changelogs/976.txt new file mode 100644 index 00000000000..15899398add --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/976.txt @@ -0,0 +1,10 @@ +• 전체 화면에서 플레이어를 직접 여는 옵션 추가 +• 표시할 검색 제안 유형 선택 허용 +• 어두운 테마가 이제 더 어둡고 어두운 시작 화면 추가 +• 원치 않는 파일을 회색으로 표시하는 파일 선택기 개선 +• YouTube 구독 가져오기 수정 +• 스트림을 재생하려면 재생 버튼을 다시 탭해야 함 +• 오디오 세션 닫기 수정 +• [Android TV] DPad 사용 시 긴 탐색 막대 점프 수정 + +추가 변경 사항을 보려면 아래 링크 탭에서 변경 로그(및 블로그 게시물)를 확인하세요. diff --git a/fastlane/metadata/android/ko/changelogs/977.txt b/fastlane/metadata/android/ko/changelogs/977.txt new file mode 100644 index 00000000000..869e8f86f23 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/977.txt @@ -0,0 +1,10 @@ +• 길게 누르기 메뉴에 "다음 재생" 버튼 추가 +• 인텐트 필터에 YouTube shorts 경로 접두사 추가 +• 설정 가져오기 수정 +• 대기열 화면에서 플레이어 버튼과 탐색 막대 위치 바꾸기 +• MediasessionManager와 관련된 다양한 수정 +• 비디오 종료 후 탐색 막대가 완료되지 않는 문제 수정 +• RealtekATV에서 미디어 터널링 비활성화 +• 최소화된 플레이어 버튼 클릭 가능 영역 확장 + +추가 변경 사항을 보려면 아래 링크 탭에서 변경 로그(및 블로그 게시물)를 확인하세요. diff --git a/fastlane/metadata/android/ko/changelogs/978.txt b/fastlane/metadata/android/ko/changelogs/978.txt new file mode 100644 index 00000000000..c6d8587a09b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/978.txt @@ -0,0 +1 @@ +새로운 NewPipe 버전에 대한 체크 실행을 수정했습니다. 이 체크는 때때로 너무 일찍 실행되어 앱 충돌로 이어졌습니다. 이제 수정되어야 합니다. diff --git a/fastlane/metadata/android/ko/changelogs/979.txt b/fastlane/metadata/android/ko/changelogs/979.txt new file mode 100644 index 00000000000..f68be2467b8 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/979.txt @@ -0,0 +1,2 @@ +- 재생 재개 수정 +- NewPipe가 새 버전을 확인해야 하는지 여부를 결정하는 서비스가 백그라운드에서 시작되지 않도록 개선 diff --git a/fastlane/metadata/android/ko/changelogs/980.txt b/fastlane/metadata/android/ko/changelogs/980.txt new file mode 100644 index 00000000000..a79074b3ccf --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/980.txt @@ -0,0 +1,13 @@ +새로운 사항 +• 공유 메뉴에 "재생목록에 추가" 옵션 추가 +• y2u.be 및 PeerTube 짧은 링크 지원 추가 + +개선된 사항 +• 재생 속도 제어를 더 컴팩트하게 만들기 +• 피드에서 이제 새 항목을 강조 표시 +• 피드의 "시청한 항목 표시" 옵션이 이제 저장됨 + +수정된 사항 +• YouTube 좋아요 및 싫어요 추출 수정 +• 백그라운드에서 돌아온 후 자동 재생 수정 +및 기타 여러 사항 diff --git a/fastlane/metadata/android/ko/changelogs/981.txt b/fastlane/metadata/android/ko/changelogs/981.txt new file mode 100644 index 00000000000..a338ae694cc --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/981.txt @@ -0,0 +1,2 @@ +Android 11+에서 버퍼링 후 재생 재개 실패를 해결하기 위해 MediaParser 지원을 제거했습니다. +재생 문제를 해결하기 위해 Philips QM16XE에서 미디어 터널링을 비활성화했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/982.txt b/fastlane/metadata/android/ko/changelogs/982.txt new file mode 100644 index 00000000000..a8417d186a1 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/982.txt @@ -0,0 +1 @@ +YouTube에서 스트림이 재생되지 않는 문제를 해결했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/983.txt b/fastlane/metadata/android/ko/changelogs/983.txt new file mode 100644 index 00000000000..2f3349e0931 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/983.txt @@ -0,0 +1,9 @@ +새로운 더블 탭 탐색 UI 및 동작 추가 +설정 검색 가능 +고정된 댓글을 강조 표시 +FSFE의 PeerTube 인스턴스에 앱으로 열기 지원 추가 +오류 알림 추가 +플레이어 변경 시 첫 번째 대기열 항목 재생 수정 +실시간 스트리밍 중 버퍼링 시 실패하기 전까지 더 오래 대기 +로컬 검색 결과 순서 수정 +재생 대기열에서 빈 항목 필드 수정 diff --git a/fastlane/metadata/android/ko/changelogs/984.txt b/fastlane/metadata/android/ko/changelogs/984.txt new file mode 100644 index 00000000000..2edf874738b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/984.txt @@ -0,0 +1,7 @@ +전체 화면을 채우고 태블릿과 TV에서 스크롤을 수정하기 위해 목록에 충분한 초기 항목을 로드 +목록을 스크롤하는 동안 발생하는 무작위 충돌을 수정 +플레이어 빠른 탐색 오버레이 아크를 시스템 UI 아래로 이동 +다중 창에서 재생할 때 컷아웃의 변경 사항을 되돌려 일부 휴대폰에서 플레이어가 잘못 배치된 회귀를 발생 +compileSdk를 30에서 31로 늘림 +오류 보고 라이브러리를 업데이트 +플레이어의 일부 코드를 리팩토링 diff --git a/fastlane/metadata/android/ko/changelogs/985.txt b/fastlane/metadata/android/ko/changelogs/985.txt new file mode 100644 index 00000000000..39ea565411e --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/985.txt @@ -0,0 +1 @@ +YouTube에서 스트림을 재생하지 않는 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/986.txt b/fastlane/metadata/android/ko/changelogs/986.txt new file mode 100644 index 00000000000..a8856487895 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/986.txt @@ -0,0 +1,16 @@ +새로운 사항 +• 새 스트림에 대한 알림 +• 백그라운드와 비디오 플레이어 간의 원활한 전환 +• 반음 단위로 피치 변경 +• 재생 목록에 메인 플레이어 대기열 추가 + +개선된 사항 +• 속도/피치 단계 크기 기억 +• 비디오 플레이어에서 초기 긴 버퍼링 완화 +• Android TV용 플레이어 UI 개선 +• 다운로드한 모든 파일을 삭제하기 전에 확인 + +수정된 사항 +• 미디어 버튼이 플레이어 컨트롤을 숨기지 않는 문제 수정 +• 플레이어 유형 변경 시 재생 재설정 문제 수정 +• 재생 목록 대화 상자 회전 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/987.txt b/fastlane/metadata/android/ko/changelogs/987.txt new file mode 100644 index 00000000000..429f401be61 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/987.txt @@ -0,0 +1,12 @@ +새로운 사항 +• 점진적 HTTP 이외의 전송 방법 지원: 재생 로딩 시간 단축, PeerTube 및 SoundCloud 수정, 최근에 종료된 YouTube 라이브 스트림 재생 +• 원격 재생 목록을 로컬 재생 목록에 추가하는 추가 버튼 +• Android 10+ 공유 시트에서 이미지 미리 보기 + +개선된 사항 +• 재생 매개변수 대화 상자 개선 +• 구독 가져오기/내보내기 버튼을 3개 점 메뉴로 이동 + +수정된 사항 +• 재생 목록에서 완전히 시청한 비디오 제거 수정 +• 공유 메뉴 테마 및 "재생 목록에 추가" 항목 수정 diff --git a/fastlane/metadata/android/ko/changelogs/988.txt b/fastlane/metadata/android/ko/changelogs/988.txt new file mode 100644 index 00000000000..4dafcd8acdd --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] 비디오를 재생하려고 할 때 "스트림을 가져올 수 없습니다" 오류 수정 +[YouTube] 요청한 비디오 대신 "다음 콘텐츠는 이 앱에서 사용할 수 없습니다." 메시지가 표시되는 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/989.txt b/fastlane/metadata/android/ko/changelogs/989.txt new file mode 100644 index 00000000000..18f3b74763a --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] 비디오를 재생하려고 할 때 무한 로딩 수정 +• [YouTube] 일부 비디오의 속도 조절 수정 +• 보안 수정이 포함된 jsoup 라이브러리를 1.15.3으로 업그레이드 diff --git a/fastlane/metadata/android/ko/changelogs/990.txt b/fastlane/metadata/android/ko/changelogs/990.txt new file mode 100644 index 00000000000..33e0f6e637b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/990.txt @@ -0,0 +1,15 @@ +이 릴리스에서는 Android 4.4 KitKat에 대한 지원이 중단되었으며, 이제 최소 버전은 Android 5 Lollipop입니다! + +새로운 사항 +• 길게 누르기 메뉴에서 다운로드 +• 피드에서 향후 동영상 숨기기 +• 로컬 재생 목록 공유 + +개선된 사항 +• 플레이어 코드를 작은 구성 요소로 리팩토링: RAM 사용량 감소, 버그 감소 +• 썸네일의 크기 조정 모드 개선 +• 이미지 자리 표시자 벡터화 + +수정된 사항 +• 플레이어 알림과 관련된 다양한 문제 수정: 오래되거나 누락된 미디어 정보, 왜곡된 썸네일 +• 화면의 1/4을 사용하여 전체 화면 수 diff --git a/fastlane/metadata/android/ko/changelogs/991.txt b/fastlane/metadata/android/ko/changelogs/991.txt new file mode 100644 index 00000000000..b786325cd8b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/991.txt @@ -0,0 +1,13 @@ +새로운 사항 +• 오류 패널에 "브라우저에서 열기" 버튼 추가 +• 채널 그룹을 목록으로 표시하는 옵션 추가 +• [YouTube] 스트림 세그먼트를 길게 클릭하여 타임스탬프 URL 공유 +• 미니 플레이어에 재생 대기열 버튼 추가 + +개선된 사항 +• 아이슬란드어 현지화 추가 및 기타 여러 번역 업데이트 +• 여러 내부 개선 + +수정된 사항 +• 여러 충돌 수정 +• [YouTube] 일부 국가에서 채널 로딩, 비전용 피드 및 해결 방법 재생 문제 수정 diff --git a/fastlane/metadata/android/ko/changelogs/992.txt b/fastlane/metadata/android/ko/changelogs/992.txt new file mode 100644 index 00000000000..5798994fd07 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/992.txt @@ -0,0 +1,17 @@ +새로운 기능 +• 영상 상세정보에서 구독자 수 표시 +• 대기열에서 다운로드 +• 영구적으로 재생목록 썸네일 설정 +• 해시태그와 링크 길게 누르기 +• 카드 보기 모드 + +향상된 기능 +• 더 커진 미니 플레이어 닫기 버튼 +• 더 부드러운 썸네일 다운스케일링 +• 안드로이드 13 지원 (API 33) +• 검색 시 플레이어를 중지하지 않음 + +수정된 기능 +• Dex/마우스에서 오버레이 수정 +• 별도의 오디오 스트림 없이 백그라운드 플레이어 허용 +• 다양한 YouTube 수정들과 더 많은 것들… diff --git a/fastlane/metadata/android/ko/changelogs/993.txt b/fastlane/metadata/android/ko/changelogs/993.txt new file mode 100644 index 00000000000..1d31792a9c6 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/993.txt @@ -0,0 +1,12 @@ +새로운 사항 +• 재생 목록 중복을 추가할 때 경고를 추가하고 이를 제거하는 버튼 추가 +• 하드웨어 버튼 무시 허용 +• 피드에서 부분적으로 시청한 비디오 숨기기 허용 + +개선된 사항 +• 대형 화면에서 더 많은 그리드 열 사용 +• 설정과 일치하는 진행률 표시기 만들기 + +수정된 사항 +• Android 11 이상에서 브라우저 URL, 다운로드 및 외부 플레이어 열기 수정 +• MIUI에서 두 번 탭해야 하는 전체 화면 상호 작용 수정 diff --git a/fastlane/metadata/android/ko/changelogs/994.txt b/fastlane/metadata/android/ko/changelogs/994.txt new file mode 100644 index 00000000000..80fdf6ac86b --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/994.txt @@ -0,0 +1,15 @@ +새로운 사항 +• 여러 오디오 트랙/언어 지원 +• 화면의 어느 쪽에서든 볼륨 및 밝기 제스처 설정 허용 +• 화면 하단에 메인 탭 표시 지원 + +개선된 사항 +• [Bandcamp] 유료 구독 벽 뒤의 트랙 처리 + +수정된 사항 +• [YouTube] 스트림에 대한 403 HTTP 오류 +• 재생 목록 보기에서 메인 플레이어로 전환할 때 검은색 플레이어 +• 플레이어 서비스 메모리 누수 +• [PeerTube] 업로더와 하위 채널 아바타가 바뀌었습니다. + +및 기타 diff --git a/fastlane/metadata/android/ko/changelogs/995.txt b/fastlane/metadata/android/ko/changelogs/995.txt new file mode 100644 index 00000000000..00e8e74e35e --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/995.txt @@ -0,0 +1,16 @@ +새로운 사항 +• 채널 탭 지원 +• 이미지 품질 선택 +• 모든 이미지에 대한 URL 가져오기 + +개선된 사항 +• 플레이어 인터페이스 접근성 +• 비디오 전용 다운로드를 위한 더 나은 오디오 선택 +• 공유된 플레이리스트 콘텐츠에 플레이리스트 및 비디오 이름을 포함하는 옵션 + +수정된 사항 +• [YouTube] 좋아요 수 수정 +• 플레이어가 응답하지 않는 팝업 및 충돌 수정 +• 언어 선택기에서 잘못된 언어 선택 +• 플레이어 오디오 포커스가 음소거를 따르지 않음 +• 플레이리스트 항목 추가가 가끔 작동하지 않음 diff --git a/fastlane/metadata/android/ko/changelogs/996.txt b/fastlane/metadata/android/ko/changelogs/996.txt new file mode 100644 index 00000000000..7ebc37a8db2 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/996.txt @@ -0,0 +1,2 @@ +media.ccc.de에서 채널/컨퍼런스를 열 때 NullPointerException이 발생하는 것을 수정했습니다. +그린치가 당신에게 준 크리스마스 선물을 깰려고 했지만, 우리는 그것을 수정했습니다. diff --git a/fastlane/metadata/android/ko/changelogs/997.txt b/fastlane/metadata/android/ko/changelogs/997.txt new file mode 100644 index 00000000000..6e35425b7a6 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/997.txt @@ -0,0 +1,17 @@ +새로운 사항 +• 댓글 답글 추가 +• 재생 목록 재정렬 허용 +• 재생 목록 설명 및 기간 표시 +• 설정 재설정 허용 + +개선된 사항 +• [Android 13+] 사용자 지정 알림 작업 복원 +• 업데이트 확인에 대한 동의 요청 +• 버퍼링하는 동안 알림 재생/일시 중지 허용 +• 일부 설정 재정렬 + +수정된 사항 +• [YouTube] 댓글이 로드되지 않는 문제 수정 및 기타 수정 및 개선 사항 +• 설정 가져오기 및 JSON으로 전환의 취약성 수정 +• 다양한 다운로드 수정 +• 검색 텍스트 다듬기 diff --git a/fastlane/metadata/android/ko/changelogs/998.txt b/fastlane/metadata/android/ko/changelogs/998.txt new file mode 100644 index 00000000000..609685eea8c --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/998.txt @@ -0,0 +1,4 @@ +HTTP 403 오류로 인해 YouTube에서 스트림을 재생하지 못하는 문제를 수정했습니다. + +YouTube 비디오 중간에 가끔 발생하는 HTTP 403 오류는 아직 수정되지 않았습니다. +이 문제는 가능한 한 빨리 다른 핫픽스 릴리스에서 해결될 예정입니다. diff --git a/fastlane/metadata/android/ko/changelogs/999.txt b/fastlane/metadata/android/ko/changelogs/999.txt new file mode 100644 index 00000000000..dd2c95ddafd --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/999.txt @@ -0,0 +1,12 @@ +이 핫픽스 릴리스는 YouTube 비디오 중간에 발생하는 HTTP 403 오류를 수정합니다. + +새로운 사항 +• [SoundCloud] on.soundcloud.com URL 지원 추가 + +개선된 사항 +• [Bandcamp] 라디오 키오스크에 추가 정보 표시 + +수정된 사항 +• [YouTube] 비디오 시작 또는 중간에 발생하는 HTTP 403 오류 수정 +• [YouTube] 더 많은 채널 헤더 유형에서 아바타와 배너 추출 +• [Bandcamp] 다양한 버그 수정 및 항상 HTTPS 사용 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/lv/changelogs/63.txt b/fastlane/metadata/android/lv/changelogs/63.txt index f014fac4a72..94c6a06df9b 100644 --- a/fastlane/metadata/android/lv/changelogs/63.txt +++ b/fastlane/metadata/android/lv/changelogs/63.txt @@ -1,8 +1,8 @@ ### Uzlabojumi -- Importēšanas/eksportēšanas iestatījumi #1333 -- Samazināt pārzīmēšanu (ātruma uzlabojums) #1371 +- Iestatījumu importēšana/eksportēšana #1333 +- Samazināts pārzīmēšanas skaits (veiktspējas uzlabojums) #1371 - Nelieli koda uzlabojumi #1375 -- Pievienot visu par GDPR #1420 +- Pievienots viss par GDPR #1420 ### Salabots -- Lejupielādētājs: Salabota aplikācijas nobrukšana, ielādējot nepabeigtas lejupielādes no .giga failiem #1407 +- Lejupielādētājs: Salabota lietotnes nobrukšana turpinot lejupielādēt nepabeigtās .giga failu lejupielādes #1407 diff --git a/fastlane/metadata/android/lv/changelogs/64.txt b/fastlane/metadata/android/lv/changelogs/64.txt index 9fd77b64183..3d49ae26ba1 100644 --- a/fastlane/metadata/android/lv/changelogs/64.txt +++ b/fastlane/metadata/android/lv/changelogs/64.txt @@ -1,5 +1,5 @@ ### Uzlabojumi -- Pievienota iespēja ierobežot video kvalitāti, ja tiek lietoti mobilie dati. #1339 +- Pievienota iespēja ierobežot video kvalitāti, ja tiek lietoti mobilie dati. #1339 - Iegaumē spilgtuma iestatījumu visu sesijas laiku #1442 - Uzlabots lejupielāžu ātrums uz vājākiem procesoriem #1431 - pievienots (working) mēdiju sesijas atbalsts #1433 diff --git a/fastlane/metadata/android/lv/changelogs/730.txt b/fastlane/metadata/android/lv/changelogs/730.txt new file mode 100644 index 00000000000..9cbf82f1035 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/730.txt @@ -0,0 +1,2 @@ +# Salabots +- Atkārtoti izlabota atšifrēšanas funkcijas kļūda. diff --git a/fastlane/metadata/android/lv/changelogs/770.txt b/fastlane/metadata/android/lv/changelogs/770.txt new file mode 100644 index 00000000000..a46cda84a83 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/770.txt @@ -0,0 +1,4 @@ +Izmaiņas 0.17.2 versijā + +Salabots +• Novērsta problēma, ka videoklips bija nepieejams diff --git a/fastlane/metadata/android/lv/changelogs/820.txt b/fastlane/metadata/android/lv/changelogs/820.txt new file mode 100644 index 00000000000..29b132b9e45 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/820.txt @@ -0,0 +1 @@ +Salabota regulārās izteiksmes funkcijas nosaukuma atšifrēšana, kuras dēļ YouTube bija nelietojams. diff --git a/fastlane/metadata/android/lv/changelogs/830.txt b/fastlane/metadata/android/lv/changelogs/830.txt new file mode 100644 index 00000000000..53d9190d4e2 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/830.txt @@ -0,0 +1 @@ +Atjaunināts SoundCloud client_id, lai novērstu SoundCloud problēmas. diff --git a/fastlane/metadata/android/lv/changelogs/850.txt b/fastlane/metadata/android/lv/changelogs/850.txt new file mode 100644 index 00000000000..20c79661b88 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/850.txt @@ -0,0 +1 @@ +Šī versijas relīze iekļauj atjaunināto YouTube vietnes versiju. Vecās vietnes versijas atbalsts tiks pārtraukta martā, un tāpēc jums ir nepieciešams atjaunināt NewPipe. diff --git a/fastlane/metadata/android/lv/changelogs/860.txt b/fastlane/metadata/android/lv/changelogs/860.txt new file mode 100644 index 00000000000..9845aa9ef96 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/860.txt @@ -0,0 +1,7 @@ +Uzlabojumi +• Saglabāt un atjaunot neatkarīgi no tā, vai augstums un temps ir atspējoti vai nav +• Atbalsta displeja izgriezumu atskaņotājā +• Apaļš (360 grādu) skats un abonentu skaits +• Optimizēts YouTube, lai izmantotu mazāk datu + +Šajā versijā ir novērstas vairāk nekā 15 ar YouTube saistītas kļūdas. diff --git a/fastlane/metadata/android/lv/changelogs/870.txt b/fastlane/metadata/android/lv/changelogs/870.txt new file mode 100644 index 00000000000..5a3a7ba6aad --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/870.txt @@ -0,0 +1,2 @@ +Šis ielāpu izlaidums ļauj jaunajai New Pipe versijai atkal izmantot SoundCloud bez liekām problēmām. +Ekstraktorā tagad tiek izmantots Soundcloud v2 API, kā arī ir uzlabota nederīgu klientu ID noteikšana. diff --git a/fastlane/metadata/android/lv/changelogs/910.txt b/fastlane/metadata/android/lv/changelogs/910.txt new file mode 100644 index 00000000000..8e7b9d2273a --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/910.txt @@ -0,0 +1 @@ +Salabota datu bāzes migrācija, kas retos gadījumos neļāva NewPipe palaisties. diff --git a/fastlane/metadata/android/lv/changelogs/920.txt b/fastlane/metadata/android/lv/changelogs/920.txt new file mode 100644 index 00000000000..ea4c60b1465 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/920.txt @@ -0,0 +1,9 @@ +Uzlabojumi + +• Pievienots augšupielādes datums un skatījumu skaits plūsmas elementiem režģa skatā +• Uzlabojumi atvilktņu galvenes izkārtojumā + +Salabots + +• Salabota skaņas izslēgšanas poga, kas izraisīja avārijas uz Android ar API 19 +• Salabota ilgu 1080p 60 kadri sekundē videoklipu lejupielāde diff --git a/fastlane/metadata/android/lv/changelogs/950.txt b/fastlane/metadata/android/lv/changelogs/950.txt new file mode 100644 index 00000000000..f9a82fe2028 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/950.txt @@ -0,0 +1,4 @@ +Šajā versijā ir veikti tikai trīs nelieli labojumi: +• Salabota piekļuve krātuvei Android 10+ operētājsistēmās +• Salabota kiosku atvēršana +• Salabota ilguma noteikšana ilgiem videoklipiem diff --git a/fastlane/metadata/android/lv/changelogs/963.txt b/fastlane/metadata/android/lv/changelogs/963.txt new file mode 100644 index 00000000000..270f2cd81a9 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Salabots kanāla turpinājums diff --git a/fastlane/metadata/android/lv/changelogs/996.txt b/fastlane/metadata/android/lv/changelogs/996.txt new file mode 100644 index 00000000000..0f23a570a0c --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/996.txt @@ -0,0 +1,2 @@ +Salabota NullPointerException kļūda, kad atvēra media.ccc.de vietnes kanālu/konferenci. +Grinčs mēģināja salauzt mūsu Ziemassvētku dāvanu jums, taču mēs to salabojām. diff --git a/fastlane/metadata/android/lv/full_description.txt b/fastlane/metadata/android/lv/full_description.txt index 092644ed3a1..301b9ded5f8 100644 --- a/fastlane/metadata/android/lv/full_description.txt +++ b/fastlane/metadata/android/lv/full_description.txt @@ -1 +1 @@ -NewPipe neizmanto nekādas Google bibliotēkas vai YouTube API. Tā tikai apstrādā vietni, lai iegūtu nepieciešamo informāciju. Tāpēc šo lietotni var izmantot arī ierīcēs, kurās Google pakalpojumi nav uzstādīti. Nav pat nepieciešams YouTube konts, lai izmantotu NewPipe, un tas ir FLOSS. +NewPipe neizmanto nekādas Google bibliotēkas vai YouTube API. Tā tikai aprasa vietni, lai iegūtu nepieciešamo informāciju. Tāpēc šo lietotni var izmantot arī ierīcēs, kurās Google pakalpojumi nav uzstādīti. Nav pat nepieciešams YouTube konts, lai izmantotu NewPipe, un lietotne pat ir bezmaksas, bez ierobežojuma, atvērtā pirmkoda programmatūra - FLOSS (Free / Libre / Open Source Software). diff --git a/fastlane/metadata/android/ml/changelogs/64.txt b/fastlane/metadata/android/ml/changelogs/64.txt new file mode 100644 index 00000000000..d35e465ffa8 --- /dev/null +++ b/fastlane/metadata/android/ml/changelogs/64.txt @@ -0,0 +1,8 @@ +### മെച്ചപ്പെടുത്തലുകൾ +- മൊബൈൽ ഡാറ്റാ ഉപയോഗിക്കുമ്പോൾ ഉള്ള വീഡിയോ ക്വാളിറ്റി നിജപ്പെടുത്താൻ ഉള്ള ക്രമീകരണം വരുത്തി #1339 +- ഒരു സെഷനിലെ ഓർത്തിരിക്കുന്നു #1442. +- ശേഷി കുറഞ്ഞ പ്രൊസസ്സറുകൾക്കുള്ള ഡൌൺലോഡ് പെർഫോമൻസ് പുരോഗമനം വരുത്തി. +-മീഡിയ സെഷന് സപ്പോർട്ട് ലഭ്യമാക്കി (പ്രവർത്തനം ) + +### പരിഹരണങ്ങൾ +- ഡൗൺലോഡ്സ് തുറക്കുമ്പോൾ ഉള്ള ക്റാഷ് പരിഹരിച്ചു. (പരിഹാരം പുതിയ ബിൽഡിൽ ലഭ്യമാണ് ) #1441 diff --git a/fastlane/metadata/android/ms/changelogs/1000.txt b/fastlane/metadata/android/ms/changelogs/1000.txt new file mode 100644 index 00000000000..bf40044db31 --- /dev/null +++ b/fastlane/metadata/android/ms/changelogs/1000.txt @@ -0,0 +1,13 @@ +Dipertingkat +• Jadikan penerangan senarai main boleh diklik untuk menunjukkan kandungan yang lebih banyak/kurang +• [PeerTube] Kendalikan pautan segera `subscribeto.me` secara automatik +• Hanya mula mainkan item tunggal di skrin sejarah + +Dibaiki +• Baiki keterlihatan butang RSS +• Baiki ranap pratonton bar carian +• Baiki pembuatan senarai main item tanpa lakaran kecil +• Baiki dialog keluar daripada muat turun sebelum ia muncul +• Baiki timbul baris gilir senarai item yang berkaitan +• Baiki susunan dalam menambah dialog senarai main +• Laraskan susun atur item penanda buku senarai main diff --git a/fastlane/metadata/android/ms/changelogs/790.txt b/fastlane/metadata/android/ms/changelogs/790.txt new file mode 100644 index 00000000000..ea974dd39ee --- /dev/null +++ b/fastlane/metadata/android/ms/changelogs/790.txt @@ -0,0 +1,14 @@ +Dipertingkat +• Tambah lebih banyak tajuk untuk meningkatkan keterlihatan bagi orang buta #2655 +• Jadikan bahasa tetapan folder muat turun lebih tekal dan jelas #2637 + +Dibaiki +• Periksa jika bait terakhir di blok telah dimuat turun #2646 +• Baiki penatalan di cebisan butiran video #2672 +• Keluarkan animasi kotak kosongkan carian berganda kepada satu #2695 +• [SoundCloud] Baiki penyarian client_id #2745 + +Pembangunan +• Tambah tanggungan yang hilang diwarisi daripada NewPipeExtractor kepada NewPipe #2535 +• Berhijrah ke AndroidX #2685 +• Kemas kini kepada ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/ms/changelogs/952.txt b/fastlane/metadata/android/ms/changelogs/952.txt new file mode 100644 index 00000000000..52e443b5364 --- /dev/null +++ b/fastlane/metadata/android/ms/changelogs/952.txt @@ -0,0 +1,7 @@ +Dipertingkat +• Automain tersedia untuk semua perkhidmatan (bukan hanya untuk YouTube) + +Dibaiki +• Baiki strim berkaitan dengan menyokong sambungan baharu YouTube +• Baiki video sekatan umur YouTube +• [Android TV] Baiki tindanan serlahan fokus yang berlarutan diff --git a/fastlane/metadata/android/ms/changelogs/953.txt b/fastlane/metadata/android/ms/changelogs/953.txt new file mode 100644 index 00000000000..24cefe7b52a --- /dev/null +++ b/fastlane/metadata/android/ms/changelogs/953.txt @@ -0,0 +1 @@ +Baiki penyarian fungsi penyahsulitan YouTube. diff --git a/fastlane/metadata/android/ms/changelogs/954.txt b/fastlane/metadata/android/ms/changelogs/954.txt new file mode 100644 index 00000000000..2b544c2b7ba --- /dev/null +++ b/fastlane/metadata/android/ms/changelogs/954.txt @@ -0,0 +1,9 @@ +• Aliran kerja aplikasi yang baharu: Mainkan video di laman butiran, leret ke bawah untuk mengecilkan pemain +• Pemberitahuan MediaStyle: Tindakan boleh suai pada pemberitahuan, peningkatan prestasi +• Ubah saiz asas apabila menggunakan NewPipe sebagai aplikasi atas meja + +• Tunjukkan dialog dengan pilihan terbuka sekiranya pemberitahuan URL tidak disokong +• Tingkatkan pengalaman cadangan carian apabila yang jauh tidak dapat diambil +• Tingkatkan mutu video lalai kepada 720p60 (pemain dalam aplikasi) dan 480p (pemain timbul) + +• Pelbagai pembaikan pepijat dan banyak lagi diff --git a/fastlane/metadata/android/ms/full_description.txt b/fastlane/metadata/android/ms/full_description.txt index 59fd024c4b5..2c8d1cd6ead 100644 --- a/fastlane/metadata/android/ms/full_description.txt +++ b/fastlane/metadata/android/ms/full_description.txt @@ -1 +1 @@ -NewPipe tidak menggunakan pustaka kerangka kerja Google sama sekali, atau layanan API Youtube. NewPipe cuma menghuraikan laman YouTube untuk mendapatkan maklumat yang diperlukan. Oleh itu, NewPipe boleh digunakan pada peranti tanpa Google Services. Anda juga tidak perlu memiliki akaun YouTube untuk menggunakan NewPipe, dan aplikasi ini adalah sepenuhnya FLOSS. +NewPipe tidak menggunakan sebarang pustaka kerangka kerja Google atau API Youtube. NewPipe cuma menghuraikan tapak web untuk mendapatkan maklumat yang perlu. Oleh itu, aplikasi ini boleh digunakan pada peranti tanpa perkhidmatan Google. Anda juga tidak memerlukan akaun YouTube untuk menggunakan NewPipe, dan aplikasi ini sepenuhnya FLOSS. diff --git a/fastlane/metadata/android/ms/short_description.txt b/fastlane/metadata/android/ms/short_description.txt index 0d19c025e40..2b407fdd795 100644 --- a/fastlane/metadata/android/ms/short_description.txt +++ b/fastlane/metadata/android/ms/short_description.txt @@ -1 +1 @@ -Sebuah klien YouTube percuma dan ringan untuk Android. +Satu aplikasi seiras YouTube yang percuma dan ringan untuk Android. diff --git a/fastlane/metadata/android/nb-NO/changelogs/992.txt b/fastlane/metadata/android/nb-NO/changelogs/992.txt new file mode 100644 index 00000000000..02605fc2ce5 --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/992.txt @@ -0,0 +1,17 @@ +Nytt +• Antall abonnenter i videodetaljene +• Last ned fra køen +• Sett miniatyrbilde for spilleliste +• Langtrykk på emneknagger og linker +• Kortvisningsmodus + +Forbedret +• Større lukkenapp på minispilleren +• Bedre nedskalering av miniatyrbilder +• Målversjon er nå Android 13 (API 33) +• Blafring pauser ikke lenger spilleren + +Fikset +• Fiks overlay for DeX/mus +• Tillat bakgrunnsspiller med ingen separate lydstrømmer +• Diverse YouTube-fikser, med mer … diff --git a/fastlane/metadata/android/nb-NO/full_description.txt b/fastlane/metadata/android/nb-NO/full_description.txt index 6fc7e0fbdff..0ffda33f810 100644 --- a/fastlane/metadata/android/nb-NO/full_description.txt +++ b/fastlane/metadata/android/nb-NO/full_description.txt @@ -1,5 +1 @@ -Gemenhetslig fri programvare. -Bruker ingen av Google-rammeverksbibliotekene, eller YouTube-API-et. -Det tolker kun nettsiden for å hente infoen som trengs. -Derfor kan dette programmet brukes på enheter der Google-tjenestene ikke er installert. -Du trenger heller ikke en YouTube-konto for å bruke installere det. +NewPipe bruker ikke noen av Googles rammeverksbiblioteker, eller YouTube-API-et. Den bare tolker nettsiden for å hente informasjonen den trenger. Programmet kan derfor brukes på enheter uten Google-tjenester, og du trenger ikke en YouTube-konto for å bruke det. I tillegg er det er gemenfrihetslig fritt. diff --git a/fastlane/metadata/android/nb-NO/short_description.txt b/fastlane/metadata/android/nb-NO/short_description.txt index feaf8f8ba6c..c19a75993bd 100644 --- a/fastlane/metadata/android/nb-NO/short_description.txt +++ b/fastlane/metadata/android/nb-NO/short_description.txt @@ -1 +1 @@ -En fri og lett mediaplattformsavspiller. +En fri og lett YouTube-skjermflate for Android. diff --git a/fastlane/metadata/android/nl/changelogs/63.txt b/fastlane/metadata/android/nl/changelogs/63.txt index ca6de697f63..33bd9bb2fdf 100644 --- a/fastlane/metadata/android/nl/changelogs/63.txt +++ b/fastlane/metadata/android/nl/changelogs/63.txt @@ -2,7 +2,7 @@ - Instellingen importeren/exporteren #1333 - Overdraw verminderen (prestatieverbetering) #1371 - Kleine code verbeteringen #1375 -- Alles toevoegen over GDPR #1420 +- Alles toegevoegd over GDPR #1420 ### Opgelost -- Downloader: Een crash verholpen bij laden van onafgemaakte downloads van .giga bestanden #1407 +- Downloader: Een crash verholpen bij het laden van onafgemaakte downloads van .giga bestanden #1407 diff --git a/fastlane/metadata/android/nl/changelogs/64.txt b/fastlane/metadata/android/nl/changelogs/64.txt index 610aba45a2c..dd457279c15 100644 --- a/fastlane/metadata/android/nl/changelogs/64.txt +++ b/fastlane/metadata/android/nl/changelogs/64.txt @@ -1,8 +1,8 @@ ### Verbeteringen -- Mogelijkheid toegevoegd om de videokwaliteit te beperken bij gebruik van mobiele data. #1339 +- Mogelijkheid toegevoegd om de videokwaliteit te beperken bij het gebruik van mobiele data. #1339 - Helderheid voor de sessie onthouden #1442 - Downloadprestaties voor zwakkere CPU's verbeterd #1431 - (werkende) ondersteuning voor mediasessie toegevoegd #1433 ### Opgelost -- Crash bij openen downloads verhelpen (fix nu beschikbaar voor release builds) #1441 +- Crash bij openen downloads verholpen (fix nu beschikbaar voor release builds) #1441 diff --git a/fastlane/metadata/android/nl/changelogs/65.txt b/fastlane/metadata/android/nl/changelogs/65.txt new file mode 100644 index 00000000000..434eee0fad6 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/65.txt @@ -0,0 +1,26 @@ +### Verbeteringen + +- Burgermenu icoon animatie uitschakelen #1486 +- Verwijderen van downloads ongedaan maken #1472 +- Downloadoptie in deel menu #1498 +- Deeloptie toegevoegd aan menu met lange ingedrukt houden #1454 +- Hoofdspeler minimaliseren bij afsluiten #1354 +- Bibliotheek versie update en database back-up fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - De afspeelsnelheidsdialoog herwerkt om verschillende stapgrootten te ondersteunen voor snellere snelheidsverandering. + - Een schakelaar toegevoegd om snel vooruit te spoelen tijdens stiltes in de afspeelsnelheidcontrole. Dit zou handig moeten zijn voor luisterboeken en bepaalde muziekgenres, en kan een echte naadloze ervaring opleveren (en kan een nummer met veel stiltes verkorten = //). + - Verfijnde mediabronresolutie zodat metadata naast media intern in de speler kunnen worden doorgegeven, in plaats van dit handmatig te doen. Nu hebben we een enkele bron van metadata en deze is direct beschikbaar wanneer het afspelen begint. + - Metagegevens van afspeellijst op afstand niet bijgewerkt wanneer nieuwe metagegevens beschikbaar zijn wanneer afspeellijstfragment wordt geopend. + - Diverse UI fixes: #1383, achtergrondspeler meldingselementen nu altijd wit, makkelijker uitschakelen van popup speler door gooien +- Gebruik nieuwe extractor met refactored architectuur voor multiservice + +### Fixes + +- Fix #1440 Gebroken video-info-indeling #1491 +- Geschiedenis bekijken fix #1497 + - #1495, door de metadata (thumbnail, titel en videotelling) werkt bij zodra de gebruiker de afspeellijst opent. + - #1475, door een weergave in de database te registreren wanneer de gebruiker een video start op externe speler op detailfragment. +- Fix scherm timeout bij popup modus. #1463 (Fixed #640) +- Hoofd video speler fix #1509 + - #1412] Fixed repeat mode veroorzaakt speler NPE wanneer nieuwe intentie wordt ontvangen terwijl speler activiteit op de achtergrond is. + - Fixed minimaliseren van speler naar popup vernietigt speler niet wanneer popup toestemming niet is verleend. diff --git a/fastlane/metadata/android/nl/changelogs/66.txt b/fastlane/metadata/android/nl/changelogs/66.txt new file mode 100644 index 00000000000..ea71571b03b --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/66.txt @@ -0,0 +1,33 @@ +# changelog versie v0.13.7 + + ### opgelost + - Problemen met sorteerfilters van v0.13.6 oplossen + + # Wijzigingslog van v0.13.6 + + ### Verbeteringen + + - Schakel burgermenupictogramanimatie #1486 uit + - Verwijdering van downloads #1472 ongedaan maken + - Downloadoptie in deelmenu #1498 + - Deeloptie toegevoegd aan langtikmenu #1454 + - Minimaliseer de hoofdspeler bij verlaten #1354 + - Update van bibliotheekversie en fix #1510 voor databaseback-up + - ExoPlayer 2.8.2 Update #1392 + - Herwerkt het dialoogvenster voor de afspeelsnelheid om verschillende stapgroottes te ondersteunen voor een snellere snelheidsverandering. + - Een schakelaar toegevoegd om snel vooruit te spoelen tijdens stiltes in de afspeelsnelheid. Dit zou nuttig moeten zijn voor audioboeken en bepaalde muziekgenres, en kan een echt naadloze ervaring opleveren (en kan een nummer breken met veel stiltes =\\). + - Herstructureerde mediabronresolutie om het doorgeven van metadata naast media intern in de speler mogelijk te maken, in plaats van dit handmatig te doen. Nu hebben we één enkele bron met metadata, die direct beschikbaar is wanneer het afspelen begint. + - Probleem opgelost dat metagegevens van externe afspeellijsten niet worden bijgewerkt wanneer nieuwe metagegevens beschikbaar zijn wanneer het afspeellijstfragment wordt geopend. + - Verschillende UI-oplossingen: #1383, bedieningselementen voor meldingen op de achtergrondspeler zijn nu altijd wit, het is gemakkelijker om de pop-upspeler af te sluiten door te gooien + - Gebruik een nieuwe extractor met gerefactoreerde architectuur voor multiservice + + ### Oplossingen + + - Repareer #1440 Kapotte video-info-indeling #1491 + - Bekijk geschiedenisfix #1497 + - #1495, door de metagegevens (miniatuur, titel en aantal video's) bij te werken zodra de gebruiker de afspeellijst opent. + - #1475, door een weergave in de database te registreren wanneer de gebruiker een video start op een externe speler op detailfragment. + - Fix creen time-out in geval van pop-upmodus. #1463 (vast #640) + - Reparatie hoofdvideospeler #1509 + - [#1412] Probleem opgelost waarbij de herhaalmodus ervoor zorgt dat spelers NPE krijgen als er nieuwe intentie wordt ontvangen terwijl spelersactiviteit op de achtergrond plaatsvindt. + - Probleem opgelost waarbij de speler tot een pop-up wordt geminimaliseerd, waardoor de speler niet wordt vernietigd als er geen toestemming voor de pop-up wordt verleend. diff --git a/fastlane/metadata/android/nl/changelogs/68.txt b/fastlane/metadata/android/nl/changelogs/68.txt new file mode 100644 index 00000000000..36b3d26011d --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/68.txt @@ -0,0 +1,31 @@ +# changelog versie v0.14.1 + + ### opgelost + - Probleem opgelost waarbij video-URL #1659 niet kon worden gedecodeerd + - Vaste beschrijvingslink wordt niet goed geëxtraheerd #1657 + + # wijzigingen van v0.14.0 + + ### Nieuw + - Nieuw ladeontwerp #1461 + - Nieuwe aanpasbare voorpagina #1461 + + ### Verbeteringen + - Herwerkte gebarenbediening #1604 + - Nieuwe manier om de pop-upspeler #1597 te sluiten + + ### Vast + - Fout opgelost wanneer het aantal abonnementen niet beschikbaar is. Sluit #1649. + - Toon in die gevallen "Aantal abonnees niet beschikbaar". + - Fix NPE wanneer een YouTube-afspeellijst leeg is + - Snelle oplossing voor de kiosken in SoundCloud + - Refactor en bugfix #1623 + - Fix Cyclisch zoekresultaat #1562 + - Fix Zoekbalk niet statisch opgemaakt + - Fix YT Premium-video wordt niet correct geblokkeerd + - Fix Video's worden soms niet geladen (vanwege DASH-parsing) + - Corrigeer links in de videobeschrijving + - Toon waarschuwing wanneer iemand probeert te downloaden naar een externe SD-kaart + - niets repareren weergegeven uitzonderingstriggersrapport + - miniatuur wordt niet weergegeven in de achtergrondspeler voor Android 8.1 [zie hier](https://github.com/TeamNewPipe/NewPipe/issues/943) + - Fix registratie van uitzendingsontvanger. Sluit #1641. diff --git a/fastlane/metadata/android/nl/changelogs/930.txt b/fastlane/metadata/android/nl/changelogs/930.txt new file mode 100644 index 00000000000..853bfa5de2f --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/930.txt @@ -0,0 +1,19 @@ +Nieuw + • Zoek op YouTube Muziek + • Basisondersteuning voor Android TV + + Verbeterd + • De mogelijkheid toegevoegd om alle bekeken video's uit een lokale afspeellijst te verwijderen + • Toon bericht wanneer inhoud nog niet wordt ondersteund in plaats van te crashen + • Verbeterde grootte van de pop-upspeler met knijpbewegingen + • Zet streams in de wachtrij door lang op de achtergrond- en pop-upknoppen in het kanaal te drukken + • Verbeterde formaatverwerking van de titel van de ladekoptekst + + Opgelost + • instelling voor inhoud met leeftijdsbeperking werkt niet opgelost + • Bepaalde soorten reCAPTCHA's opgelost + • Crash opgelost bij het openen van bladwijzers terwijl de afspeellijst 'null' is + • Vaste detectie van netwerkgerelateerde uitzonderingen + • Probleem opgelost met de zichtbaarheid van de groepssorteerknop in het abonnementsfragment + + en meer 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/changelogs/998.txt b/fastlane/metadata/android/nl/changelogs/998.txt new file mode 100644 index 00000000000..9bd8adf8693 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/998.txt @@ -0,0 +1 @@ +YouTube speelt geen stream af opgelost diff --git a/fastlane/metadata/android/nl/changelogs/999.txt b/fastlane/metadata/android/nl/changelogs/999.txt new file mode 100644 index 00000000000..f3bedb9af12 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/999.txt @@ -0,0 +1,12 @@ +Deze hotfix-release lost HTTP 403-fouten op in het midden van YouTube-video's. + +Nieuw +• [SoundCloud] Ondersteuning toegevoegd voor on.soundcloud.com-URL's + +Verbeterd +• [Bandcamp] Extra info getoond in radio­kiosk + +Opgelost +• [YouTube] Af en toe voorkomende HTTP 403-fouten opgelost aan het begin of in het midden van video's +• [YouTube] Avatar en banner worden geëxtraheerd uit meer kanaal­header­typen +• [Bandcamp] Verschillende bugs opgelost en HTTPS geforceerd 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/1000.txt b/fastlane/metadata/android/pa/changelogs/1000.txt new file mode 100644 index 00000000000..90d70c151ca --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/1000.txt @@ -0,0 +1,13 @@ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਵੱਧ/ਘੱਟ ਸਮੱਗਰੀ ਦਿਖਾਉਣ ਲਈ ਪਲੇਲਿਸਟ ਵਰਣਨ ਨੂੰ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਬਣਾਓ +• [PeerTube] `subscribeto.me` ਇੰਸਟੈਂਸ ਲਿੰਕਾਂ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ ਹੈਂਡਲ ਕਰੋ +• ਇਤਿਹਾਸ ਸਕਰੀਨ ਵਿੱਚ ਸਿਰਫ਼ ਸਿੰਗਲ ਆਈਟਮ ਨੂੰ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ + +ਠੀਕ ਕਰਿਆ +• RSS ਬਟਨ ਦੀ ਦਿੱਖ ਨੂੰ ਠੀਕ ਕਰੋ +• ਸੀਕਬਾਰ ਪੂਰਵਦਰਸ਼ਨ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਥੰਮਨੇਲ-ਰਹਿਤ ਆਈਟਮ ਦੀ ਪਲੇਲਿਸਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਦੇ ਦਿਸਣ ਤੋਂ ਪਹਿਲਾਂ ਇਸਨੂੰ ਬਾਹਰ ਕੱਢਣਾ ਠੀਕ ਕਰੋ +• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪਅੱਪ ਨੂੰ ਠੀਕ ਕਰੋ +• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਵਿੱਚ ਜੋੜਨ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ +• ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਆਈਟਮ ਖਾਕਾ ਵਿਵਸਥਿਤ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/65.txt b/fastlane/metadata/android/pa/changelogs/65.txt new file mode 100644 index 00000000000..0fbf1147e25 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/65.txt @@ -0,0 +1 @@ +### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/66.txt b/fastlane/metadata/android/pa/changelogs/66.txt new file mode 100644 index 00000000000..aecf80cbcfb --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/66.txt @@ -0,0 +1 @@ +# v0.13.7 ਦਾ ਚੇਂਜਲਾਗ ### ਸਥਿਰ - v0.13.6 ਦੇ ਕ੍ਰਮਬੱਧ ਫਿਲਟਰ ਮੁੱਦਿਆਂ ਨੂੰ ਠੀਕ ਕਰੋ # v0.13.6 ਦਾ ਚੇਂਜਲਾਗ ### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/68.txt b/fastlane/metadata/android/pa/changelogs/68.txt new file mode 100644 index 00000000000..e8e54ea4f5e --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/68.txt @@ -0,0 +1 @@ +v0.14.1 ਦੇ # ਬਦਲਾਅ ### ਸਥਿਰ - ਵੀਡੀਓ url #1659 ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ - ਸਥਿਰ ਵਰਣਨ ਲਿੰਕ #1657 ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਐਕਸਟਰੈਕਟ ਨਹੀਂ ਕਰਦਾ ਹੈ v0.14.0 ਦੀਆਂ # ਤਬਦੀਲੀਆਂ ### ਨਵਾਂ - ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 - ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 ### ਸੁਧਾਰ - ਮੁੜ ਕੰਮ ਕੀਤਾ ਸੰਕੇਤ ਨਿਯੰਤਰਣ #1604 - ਪੌਪਅੱਪ ਪਲੇਅਰ #1597 ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ ### ਸਥਿਰ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ। #1649 ਬੰਦ ਹੁੰਦਾ ਹੈ। - ਉਹਨਾਂ ਮਾਮਲਿਆਂ ਵਿੱਚ "ਗਾਹਕ ਗਿਣਤੀ ਉਪਲਬਧ ਨਹੀਂ" ਦਿਖਾਓ - YouTube ਪਲੇਲਿਸਟ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕਰੋ - SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਫਿਕਸ - ਰਿਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623 - ਚੱਕਰੀ ਖੋਜ ਨਤੀਜੇ #1562 ਨੂੰ ਠੀਕ ਕਰੋ - ਸੀਕ ਬਾਰ ਨੂੰ ਸਥਿਰ ਤੌਰ 'ਤੇ ਬਾਹਰ ਨਾ ਕੱਢੋ - ਫਿਕਸ YT ਪ੍ਰੀਮੀਅਮ ਵੀਡੀਓ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ - ਕਈ ਵਾਰ ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੇ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ (DASH ਪਾਰਸਿੰਗ ਦੇ ਕਾਰਨ) - ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਲਿੰਕ ਫਿਕਸ ਕਰੋ - ਜਦੋਂ ਕੋਈ ਬਾਹਰੀ sdcard 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ ਤਾਂ ਚੇਤਾਵਨੀ ਦਿਖਾਓ - ਅਪਵਾਦ ਟਰਿੱਗਰ ਰਿਪੋਰਟ ਦਿਖਾਈ ਗਈ ਕੁਝ ਵੀ ਠੀਕ ਨਾ ਕਰੋ - ਐਂਡਰਾਇਡ 8.1 ਲਈ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ [ਇੱਥੇ ਦੇਖੋ](https://github.com/TeamNewPipe/NewPipe/issues/943) - ਪ੍ਰਸਾਰਣ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਦੀ ਰਜਿਸਟਰੇਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। #1641 ਬੰਦ ਹੁੰਦਾ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/69.txt b/fastlane/metadata/android/pa/changelogs/69.txt new file mode 100644 index 00000000000..b6358991b36 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/69.txt @@ -0,0 +1 @@ +### ਨਵਾਂ - ਮਿਟਾਓ ਅਤੇ ਸਬਸਕ੍ਰਿਪਸ਼ਨ #1516 ਵਿੱਚ ਸਾਂਝਾ ਕਰੋ - ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਖਾਕਾ #1617 ### ਸੁਧਾਰ - ਆਖਰੀ ਵਰਤੇ ਗਏ ਆਸਪੈਕਟ ਰੇਸ਼ੋ #1748 ਨੂੰ ਸਟੋਰ ਅਤੇ ਰੀਲੋਡ ਕਰੋ - ਪੂਰੇ ਵੀਡੀਓ ਨਾਮ #1771 ਦੇ ਨਾਲ ਡਾਊਨਲੋਡ ਗਤੀਵਿਧੀ ਵਿੱਚ ਲੀਨੀਅਰ ਲੇਆਉਟ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਟੈਬ #1516 ਦੇ ਅੰਦਰੋਂ ਸਿੱਧਾ ਗਾਹਕੀਆਂ ਨੂੰ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ - ਜੇਕਰ ਪਲੇ ਕਤਾਰ ਪਹਿਲਾਂ ਹੀ #1783 ਖਤਮ ਹੋ ਗਈ ਹੈ ਤਾਂ ਹੁਣ ਏਨਕਿਊ ਕਰਨਾ ਵੀਡੀਓ ਚਲਾਉਣ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ - ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤ #1644 ਲਈ ਵੱਖਰੀ ਸੈਟਿੰਗ - ਸਥਾਨਕਕਰਨ #1792 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ### ਫਿਕਸ - ਲਈ ਪਾਰਸਿੰਗ ਸਮਾਂ ਫਿਕਸ ਕਰੋ। ਫਾਰਮੈਟ, ਇਸ ਲਈ ਨਿਊ ਪਾਈਪ ਨੂੰ ਫਿਨਲੈਂਡ ਵਿੱਚ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ - API 28+ ਡਿਵਾਈਸਾਂ #1830 ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ ### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ - ਐਂਡ੍ਰਾਇਡ ਪੀ 'ਤੇ ਪਲੇਬੈਕ ਸਟੇਟ ਨੂੰ ਸੇਵ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/70.txt b/fastlane/metadata/android/pa/changelogs/70.txt new file mode 100644 index 00000000000..97d781d4aac --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/70.txt @@ -0,0 +1 @@ +ਧਿਆਨ ਦਿਓ: ਇਹ ਸੰਸਕਰਣ ਸ਼ਾਇਦ ਇੱਕ ਬੱਗਫੈਸਟ ਹੈ, ਬਿਲਕੁਲ ਪਿਛਲੇ ਇੱਕ ਵਾਂਗ। ਹਾਲਾਂਕਿ 17 ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬੰਦ ਹੋਣ ਦੇ ਕਾਰਨ. ਇੱਕ ਟੁੱਟਿਆ ਹੋਇਆ ਸੰਸਕਰਣ ਕੋਈ ਸੰਸਕਰਣ ਨਾਲੋਂ ਬਿਹਤਰ ਹੈ. ਸਹੀ? ¯\_(ツ)_/¯ ### ਸੁਧਾਰ * ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ #1879 * ਐਂਡਰਾਇਡ 4.1 - 4.3 #1884 ਲਈ ਸਹਾਇਤਾ ਛੱਡੋ * ਪੁਰਾਣੇ ਪਲੇਅਰ #1884 ਨੂੰ ਹਟਾਓ * ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ #1915 'ਤੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ * ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਹੁੰਦੀ ਹੈ #1878 * @kapodamy ਦੁਆਰਾ ਡਾਉਨਲੋਡ ਕਰਨ ਅਤੇ ਗੁੰਮ ਹੋਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ #1759 ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ * ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਬੁਨਿਆਦੀ ਢਾਂਚਾ * "ਬੁਨਿਆਦੀ ਢਾਂਚੇ" ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਸਹੀ ਤਰੁੱਟੀ (ਡਾਊਨਲੋਡਰ ਲਈ) * ਮਲਟੀਪਲ ਡਾਉਨਲੋਡਸ ਦੀ ਬਜਾਏ ਕਤਾਰ * ਲੜੀਬੱਧ ਲੰਬਿਤ ਡਾਉਨਲੋਡਸ (`ਗੀਗਾ` ਫਾਈਲਾਂ) ਨੂੰ ਐਪ ਡੇਟਾ ਵਿੱਚ ਮੂਵ ਕਰੋ * ਅਧਿਕਤਮ ਡਾਊਨਲੋਡ ਦੀ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਨੂੰ ਲਾਗੂ ਕਰੋ * ਉਚਿਤ ਮਲਟੀ-ਥ੍ਰੈਡ ਡਾਊਨਲੋਡ ਵਿਰਾਮ * ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ 'ਤੇ ਜਾਣ ਵੇਲੇ ਡਾਊਨਲੋਡ ਬੰਦ ਕਰੋ (ਕਦੇ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਦੂਜਾ ਪੁਆਇੰਟ ਦੇਖੋ) * ਅਗਲੇ ਡਾਉਨਲੋਡਸ ਲਈ ਥਰਿੱਡ ਗਿਣਤੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ * ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ ### ਸਥਿਰ * ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਾਲ ਕਰੈਸ਼ ਨੂੰ ਬਿਹਤਰ ਅਤੇ ਸੀਮਤ ਮੋਬਾਈਲ ਡਾਟਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ #1835 'ਤੇ ਸੈੱਟ ਕਰੋ * ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਰੈਸ਼ ਫਿਕਸਡ #1874 * ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ #1901 ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ NPE * ਜਦੋਂ ਆਟੋ ਕਤਾਰ ਯੋਗ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੰਮਿਲਿਤ ਕਰਨ ਲਈ ਠੀਕ ਕਰੋ #1878 * ਡੀਸਾਈਪਰਿੰਗ ਸ਼ੱਟਟਾਊਨ ਮੁੱਦੇ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/71.txt b/fastlane/metadata/android/pa/changelogs/71.txt new file mode 100644 index 00000000000..bafa26f8c3c --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/71.txt @@ -0,0 +1 @@ +### ਸੁਧਾਰ * GitHub ਬਿਲਡ ਲਈ ਐਪ ਅਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ (@krtkush ਦੁਆਰਾ #1608) * ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (@kapodamy ਦੁਆਰਾ #1944): * ਗੁੰਮ ਹੋਏ ਚਿੱਟੇ ਆਈਕਨ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਆਈਕਨ ਦੇ ਰੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਹਾਰਡਕੋਰਡ ਤਰੀਕੇ ਦੀ ਵਰਤੋਂ ਕਰੋ * ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਇਟਰੇਟਰ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ ਹੈ (ਫਿਕਸ #2031) * ਨਵੇਂ ਮੁਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ" ਗਲਤੀ ਦੇ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ * ਨਵਾਂ MPEG-4 ਮੁਕਸਰ ਫਿਕਸਿੰਗ ਗੈਰ-ਸਿੰਕਰੋਨਸ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਜ਼ (#2039) ### ਸਥਿਰ * YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣੀਆਂ ਬੰਦ ਹੋ ਜਾਂਦੀਆਂ ਹਨ (@yausername ਦੁਆਰਾ #1996) diff --git a/fastlane/metadata/android/pa/changelogs/730.txt b/fastlane/metadata/android/pa/changelogs/730.txt new file mode 100644 index 00000000000..56f5a7d32f1 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/730.txt @@ -0,0 +1,2 @@ +# ਠੀਕ ਕੀਤਾ +- ਹੌਟ ਫਿਕਸ ਦੁਬਾਰਾ ਗਲਤ ਹੋਇਆ ਡੀਕ੍ਰਿਪਟ ਫੰਕਸ਼ਨ ਠੀਕ । diff --git a/fastlane/metadata/android/pa/changelogs/740.txt b/fastlane/metadata/android/pa/changelogs/740.txt new file mode 100644 index 00000000000..6a2dbdc8601 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/740.txt @@ -0,0 +1 @@ +ਬਦਲਾਅ ਸੂਚੀ ਅਨੁਵਾਦ ਕਰਣਯੋਗ ਨਹੀਂ। ਬਿਲਕੁਲ ਬਕਵਾਸ diff --git a/fastlane/metadata/android/pa/changelogs/750.txt b/fastlane/metadata/android/pa/changelogs/750.txt new file mode 100644 index 00000000000..0b875b705e5 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/750.txt @@ -0,0 +1 @@ +ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/760.txt b/fastlane/metadata/android/pa/changelogs/760.txt new file mode 100644 index 00000000000..fd4b8f2a458 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/760.txt @@ -0,0 +1 @@ +0.17.1 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ • ਥਾਈ ਸਥਾਨਕਕਰਨ ਸੁਧਾਰ • ਦੁਬਾਰਾ #2518 ਪਲੇਲਿਸਟਾਂ ਲਈ ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਪਲੇ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ • SAF / ਪੁਰਾਤਨ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • ਐਪਸ #2487 ਨੂੰ ਬਦਲਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਫਿਕਸ ਪਲੇਬੈਕ ਸਥਿਤੀ ਸਟੋਰ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਹਾਲਾਂਕਿ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਅਯੋਗ ਹੈ • ਸੂਚੀ ਦ੍ਰਿਸ਼ #2517 ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਦੇ ਕਾਰਨ ਘਟੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ • [ਐਕਸਟ੍ਰੈਕਟਰ] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 ਫਿਕਸ • [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜੇ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ TeamNewPipe/NewPipeExtractor#185 0.17.0 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/770.txt b/fastlane/metadata/android/pa/changelogs/770.txt new file mode 100644 index 00000000000..03903c01168 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/770.txt @@ -0,0 +1,4 @@ +0.17.2 ਵਿੱਚ ਬਦਲਾਅ + +ਠੀਕ ਕਰੋ +• ਫਿਕਸ ਕੋਈ ਵੀ ਵੀਡੀਓ ਉਪਲਬਧ ਨਹੀਂ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/780.txt b/fastlane/metadata/android/pa/changelogs/780.txt new file mode 100644 index 00000000000..999a244682b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/780.txt @@ -0,0 +1 @@ +0.17.3 ਵਿੱਚ ਬਦਲਾਅ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ #2550 ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਫਾਈਲ ਪਿਕਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ • NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਨਾਂ ਤੋਂ ਸਮਰਥਨ URL • `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • [YouTube] ਸਥਿਰ 'java.lang.IllegalArgumentException #192 • [YouTube] ਸਥਿਰ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ TeamNewPipe/NewPipeExtractor#195 • ਇੱਕ ਸਟ੍ਰੀਮ #2592 ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਐਂਡਰੌਇਡ ਪਾਈ ਵਿੱਚ ਸਥਿਰ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/790.txt b/fastlane/metadata/android/pa/changelogs/790.txt new file mode 100644 index 00000000000..f841801eb52 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/790.txt @@ -0,0 +1 @@ +ਸੁਧਾਰ • ਅੰਨ੍ਹੇ ਲੋਕਾਂ #2655 ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ • ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਸੈਟਿੰਗ ਦੀ ਭਾਸ਼ਾ ਨੂੰ ਵਧੇਰੇ ਇਕਸਾਰ ਅਤੇ ਘੱਟ ਅਸਪਸ਼ਟ #2637 ਬਣਾਓ ਸਥਿਰ • ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ #2646 ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ • ਵੀਡੀਓ ਡਿਟੇਲ ਫਰੈਗਮੈਂਟ #2672 ਵਿੱਚ ਸਥਿਰ ਸਕ੍ਰੋਲਿੰਗ • ਡਬਲ ਸਰਚ ਕਲੀਅਰ ਬਾਕਸ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਇੱਕ #2695 ਵਿੱਚ ਹਟਾਓ • [SoundCloud] ਕਲਾਇਟ_ਆਈਡੀ ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • NewPipeExtractor ਤੋਂ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲੀ ਗੁੰਮ ਨਿਰਭਰਤਾ ਨੂੰ NewPipe #2535 ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ • AndroidX #2685 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ • ExoPlayer 2.10.6 #2697, #2736 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/800.txt b/fastlane/metadata/android/pa/changelogs/800.txt new file mode 100644 index 00000000000..53868c894bd --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/800.txt @@ -0,0 +1 @@ +ਨਵਾਂ • P2P (#2201) [ਬੀਟਾ] ਤੋਂ ਬਿਨਾਂ PeerTube ਸਮਰਥਨ: ◦ PeerTube ਉਦਾਹਰਨਾਂ ਤੋਂ ਵੀਡੀਓ ਦੇਖੋ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਪੂਰੀ PeerTube ਸੰਸਾਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਉਦਾਹਰਨਾਂ ਸ਼ਾਮਲ ਕਰੋ ◦ Android 4.4 ਅਤੇ 7.1 'ਤੇ SSL ਹੈਂਡਸ਼ੇਕ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ ਜਦੋਂ ਕੁਝ ਖਾਸ ਮੌਕਿਆਂ 'ਤੇ ਪਹੁੰਚ ਕਰਦੇ ਸਮੇਂ ਨੈੱਟਵਰਕ ਗੜਬੜ ਹੋ ਜਾਂਦੀ ਹੈ। • ਡਾਊਨਲੋਡਰ (#2679): ◦ ਡਾਊਨਲੋਡ ETA ਦੀ ਗਣਨਾ ਕਰੋ ◦ ਓਪਸ (ਵੈਬ ਫਾਈਲਾਂ) ਨੂੰ ogg ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ-ਹਾਸਲ ਕਰੋ ਸੁਧਾਰ • ਕਿਓਸਕਫ੍ਰੈਗਮੈਂਟ ਨੂੰ ਤਰਜੀਹੀ ਸਮਗਰੀ ਵਾਲੇ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਤੋਂ ਜਾਣੂ ਕਰਵਾਓ ਅਤੇ ਸਾਰੀਆਂ ਮੁੱਖ ਟੈਬਾਂ #2742 ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ। • ਐਕਸਟਰੈਕਟਰ #2713 ਤੋਂ ਨਵੇਂ ਸਥਾਨਕਕਰਨ ਅਤੇ ਡਾਉਨਲੋਡਰ ਲਾਗੂਕਰਨ ਦੀ ਵਰਤੋਂ ਕਰੋ • "ਡਿਫੌਲਟ ਕਿਓਸਕ" ਸਤਰ ਨੂੰ ਅਨੁਵਾਦਯੋਗ ਬਣਾਓ • ਬਲੈਕ ਥੀਮ #2569 ਲਈ ਬਲੈਕ ਨੈਵੀਗੇਸ਼ਨ ਪੱਟੀ ਸਥਿਰ • ਇੱਕ ਬੱਗ ਫਿਕਸ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਹਿਲਾ ਨਹੀਂ ਸਕਦਾ ਸੀ ਜੇਕਰ ਪੌਪਅੱਪ ਪਲੇਅਰ #2772 ਨੂੰ ਹਿਲਾਉਂਦੇ ਸਮੇਂ ਕੋਈ ਹੋਰ ਉਂਗਲ ਰੱਖੀ ਜਾਂਦੀ ਹੈ • ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਅਪਲੋਡਰ ਦੀ ਗੁੰਮਸ਼ੁਦਗੀ ਦੀ ਆਗਿਆ ਦਿਓ ਅਤੇ ਇਸ ਸਮੱਸਿਆ ਨਾਲ ਸਬੰਧਤ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2724, TeamNewPipe/NewPipeExtractor#219 • MediaCCC ਅਤੇ ਕੁਝ PeerTube ਉਦਾਹਰਨਾਂ #2792 ਨਾਲ TLS ਹੈਂਡਸ਼ੇਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਕਰਨਾ • [SoundCloud] ਫਿਕਸਡ ਕਲਾਈਂਟ_ਆਈਡੀ ਐਕਸਟ੍ਰੈਕਸ਼ਨ TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] ਆਡੀਓ ਸਟ੍ਰੀਮ ਕੱਢਣ ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • ExoPlayer ਨੂੰ 2.10.8 #2791, #2816 'ਤੇ ਅੱਪਡੇਟ ਕਰੋ • Gradle ਨੂੰ 3.5.1 ਵਿੱਚ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ Kotlin ਸਹਿਯੋਗ #2714 ਸ਼ਾਮਲ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/810.txt b/fastlane/metadata/android/pa/changelogs/810.txt new file mode 100644 index 00000000000..96a2b9da5be --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/810.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ ਸੁਧਾਰ • ਬੈਕਗ੍ਰਾਉਂਡ / ਪੌਪਅੱਪ ਬਟਨ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਕਤਾਰ ਵਿੱਚ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਸ਼ਾਮਲ ਕਰੋ • ਮੁੱਖ ਪੰਨਾ ਟੈਬਾਂ ਨੂੰ ਸਕ੍ਰੋਲ ਕਰਨ ਯੋਗ ਬਣਾਓ ਅਤੇ ਸਿਰਫ਼ ਇੱਕ ਟੈਬ ਹੋਣ 'ਤੇ ਲੁਕਾਓ • ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਸੂਚਨਾ ਥੰਬਨੇਲ ਅੱਪਡੇਟ ਦੀ ਸੀਮਾ ਮਾਤਰਾ • ਖਾਲੀ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਲਈ ਡਮੀ ਥੰਬਨੇਲ ਸ਼ਾਮਲ ਕਰੋ • *.webm ਦੀ ਬਜਾਏ *.opus ਫਾਈਲ ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਅਤੇ ਡਾਊਨਲੋਡ ਡ੍ਰੌਪਡਾਉਨ ਵਿੱਚ "WebM Opus" ਦੀ ਬਜਾਏ ਫਾਰਮੈਟ ਲੇਬਲ ਵਿੱਚ "opus" ਦਿਖਾਓ • "ਡਾਊਨਲੋਡ" ਵਿੱਚ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਜਾਂ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਨੂੰ ਮਿਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ • [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • NewPipe ਨਾਲ ਵੀਡੀਓ ਸਾਂਝਾ ਕਰਨ ਅਤੇ ਇਸ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧੇ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ • ਇਸ ਦੇ ਸਿਰਜਣ ਥ੍ਰੈਡ ਤੋਂ ਬਾਹਰ ਸਥਿਰ ਪਲੇਅਰ ਪਹੁੰਚ • ਸਥਿਰ ਖੋਜ ਨਤੀਜੇ ਪੇਜਿੰਗ • [YouTube] ਨਿਸ਼ਚਤ ਸਵਿਚਿੰਗ ਚਾਲੂ ਕਰਨ ਨਾਲ NPE ਹੁੰਦਾ ਹੈ • [YouTube] ਇੱਕ invidio.us url ਖੋਲ੍ਹਣ ਵੇਲੇ ਟਿੱਪਣੀਆਂ ਦੇਖਣ ਲਈ ਸਥਿਰ • [SoundCloud] ਅੱਪਡੇਟ ਕੀਤਾ client_id diff --git a/fastlane/metadata/android/pa/changelogs/820.txt b/fastlane/metadata/android/pa/changelogs/820.txt new file mode 100644 index 00000000000..aa355469888 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/820.txt @@ -0,0 +1 @@ +ਸਥਿਰ ਡੀਕ੍ਰਿਪਟ ਫੰਕਸ਼ਨ ਨਾਮ regex YouTube ਨੂੰ ਵਰਤੋਂਯੋਗ ਨਹੀਂ ਬਣਾਉਂਦਾ। diff --git a/fastlane/metadata/android/pa/changelogs/830.txt b/fastlane/metadata/android/pa/changelogs/830.txt new file mode 100644 index 00000000000..6bd990808f5 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ SoundCloud client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/840.txt b/fastlane/metadata/android/pa/changelogs/840.txt new file mode 100644 index 00000000000..74509849684 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/840.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਪਲੇਅਰ ਸਮੇਟਣਯੋਗ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਬਟਨ 'ਤੇ ਭੇਜੋ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੀ ਪ੍ਰੈਸ 'ਤੇ ਟਿੱਪਣੀਆਂ ਨੂੰ ਕਾਪੀ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ ਸੁਧਾਰ • ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ • ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਚਾਲੂ ਨਾ ਹੋਣ 'ਤੇ ਦਰਾਜ਼ ਦੇ ਹੱਕ ਵਿੱਚ ਡਾਟ-ਮੀਨੂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਅਤੇ ਇਤਿਹਾਸ ਨੂੰ ਲੁਕਾਓ ਬਟਨ • Android 6 ਅਤੇ ਬਾਅਦ ਵਾਲੇ 'ਤੇ ਸਹੀ ਢੰਗ ਨਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਹੋਰ ਐਪਾਂ ਦੀ ਇਜਾਜ਼ਤ ਦੇ ਉੱਪਰ ਡਿਸਪਲੇ ਲਈ ਪੁੱਛੋ • BookmarkFragment ਵਿੱਚ ਲੰਮਾ-ਕਲਿੱਕ ਕਰਕੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਦਾ ਨਾਮ ਬਦਲੋ • ਕਈ PeerTube ਸੁਧਾਰ • ਕਈ ਅੰਗਰੇਜ਼ੀ ਸਰੋਤ ਸਤਰਾਂ ਨੂੰ ਸੁਧਾਰਿਆ ਗਿਆ ਹੈ ਸਥਿਰ • ਫਿਕਸਡ ਪਲੇਅਰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ ਹਾਲਾਂਕਿ ਇਹ ਉਦੋਂ ਰੋਕਿਆ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਵਿਕਲਪ "ਐਪ ਸਵਿੱਚ 'ਤੇ ਛੋਟਾ ਕਰੋ" ਯੋਗ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਨਿਊ ਪਾਈਪ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ • ਸੰਕੇਤ ਲਈ ਸ਼ੁਰੂਆਤੀ ਚਮਕ ਮੁੱਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਸਥਿਰ .srt ਉਪਸਿਰਲੇਖ ਡਾਉਨਲੋਡ ਜਿਸ ਵਿੱਚ ਸਾਰੇ ਲਾਈਨ ਬ੍ਰੇਕ ਨਹੀਂ ਹਨ • SD ਕਾਰਡ 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡ ਅਸਫਲ ਹੋ ਰਿਹਾ ਹੈ ਕਿਉਂਕਿ ਕੁਝ Android 5 ਡਿਵਾਈਸਾਂ CTF ਅਨੁਕੂਲ ਨਹੀਂ ਹਨ • Android KitKat 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ • ਸਥਿਰ ਭ੍ਰਿਸ਼ਟ ਵੀਡੀਓ .mp4 ਫਾਈਲ ਨੂੰ ਆਡੀਓ ਫਾਈਲ ਵਜੋਂ ਮਾਨਤਾ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ • ਗਲਤ ਚੀਨੀ ਭਾਸ਼ਾ ਕੋਡ ਸਮੇਤ, ਮਲਟੀਪਲ ਸਥਾਨੀਕਰਨ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ • [YouTube] ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਹਨ diff --git a/fastlane/metadata/android/pa/changelogs/850.txt b/fastlane/metadata/android/pa/changelogs/850.txt new file mode 100644 index 00000000000..561cdec62e8 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/850.txt @@ -0,0 +1 @@ +ਇਸ ਰੀਲੀਜ਼ ਵਿੱਚ YouTube ਵੈੱਬਸਾਈਟ ਸੰਸਕਰਣ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ ਸੀ। ਪੁਰਾਣਾ ਵੈੱਬਸਾਈਟ ਸੰਸਕਰਣ ਮਾਰਚ ਵਿੱਚ ਬੰਦ ਹੋਣ ਜਾ ਰਿਹਾ ਹੈ ਅਤੇ ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਨਿਊ ਪਾਈਪ ਨੂੰ ਅਪਗ੍ਰੇਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/860.txt b/fastlane/metadata/android/pa/changelogs/860.txt new file mode 100644 index 00000000000..900671ab847 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/860.txt @@ -0,0 +1 @@ +ਸੁਧਾਰ • ਸੇਵ ਕਰੋ ਅਤੇ ਰੀਸਟੋਰ ਕਰੋ ਕਿ ਕੀ ਪਿੱਚ ਅਤੇ ਟੈਂਪੋ ਅਣਹੁੱਕ ਹਨ ਜਾਂ ਨਹੀਂ • ਪਲੇਅਰ ਵਿੱਚ ਡਿਸਪਲੇ ਕੱਟਆਊਟ ਦਾ ਸਮਰਥਨ ਕਰੋ • ਗੋਲ ਦ੍ਰਿਸ਼ ਅਤੇ ਗਾਹਕਾਂ ਦੀ ਗਿਣਤੀ • ਘੱਟ ਡਾਟਾ ਵਰਤਣ ਲਈ YouTube ਨੂੰ ਅਨੁਕੂਲ ਬਣਾਇਆ ਗਿਆ ਇਸ ਰੀਲੀਜ਼ ਵਿੱਚ 15 ਤੋਂ ਵੱਧ YouTube-ਸਬੰਧਤ ਬੱਗ ਫਿਕਸ ਕੀਤੇ ਗਏ ਸਨ। diff --git a/fastlane/metadata/android/pa/changelogs/870.txt b/fastlane/metadata/android/pa/changelogs/870.txt new file mode 100644 index 00000000000..3656c86fcc0 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/870.txt @@ -0,0 +1,2 @@ +ਇਹ ਇੱਕ ਹੌਟਫਿਕਸ ਰੀਲੀਜ਼ ਹੈ ਜੋ ਨਿਊਪਾਈਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਰਿਹਾ ਹੈ ਤਾਂ ਜੋ ਦੁਬਾਰਾ ਵੱਡੀਆਂ ਮੁਸ਼ਕਲਾਂ ਤੋਂ ਬਿਨਾਂ ਸਾਉਂਡ ਕਲਾਉਡ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਜਾ ਸਕੇ। +SoundCloud ਦਾ v2 API ਹੁਣ ਐਕਸਟਰੈਕਟਰ ਵਿੱਚ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਅਵੈਧ ਕਲਾਇੰਟ ਆਈਡੀ ਦੀ ਖੋਜ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/900.txt b/fastlane/metadata/android/pa/changelogs/900.txt new file mode 100644 index 00000000000..f9a004a0dbd --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/900.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਗਾਹਕੀ ਸਮੂਹ ਅਤੇ ਕ੍ਰਮਬੱਧ ਫੀਡ • ਖਿਡਾਰੀਆਂ ਵਿੱਚ ਮਿਊਟ ਬਟਨ ਸੁਧਾਰ • NewPipe ਵਿੱਚ music.youtube.com ਅਤੇ media.ccc.de ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਿਓ • ਦਿੱਖ ਤੋਂ ਸਮੱਗਰੀ ਤੱਕ ਦੋ ਸੈਟਿੰਗਾਂ ਨੂੰ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ • 5, 15, 25 ਸਕਿੰਟ ਦੇ ਸੀਕ ਵਿਕਲਪਾਂ ਨੂੰ ਲੁਕਾਓ ਜੇਕਰ ਅਢੁੱਕਵੀਂ ਖੋਜ ਸਮਰਥਿਤ ਹੈ ਸਥਿਰ • ਕੁਝ WebM ਵੀਡੀਓ ਖੋਜਣ ਯੋਗ ਨਹੀਂ ਹਨ • Android P 'ਤੇ ਡਾਟਾਬੇਸ ਬੈਕਅੱਪ • ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਨੂੰ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਕਰੈਸ਼ • ਬਹੁਤ ਸਾਰੇ YouTube ਐਕਸਟਰੈਕਸ਼ਨ ਮੁੱਦੇ ਅਤੇ ਹੋਰ... diff --git a/fastlane/metadata/android/pa/changelogs/910.txt b/fastlane/metadata/android/pa/changelogs/910.txt new file mode 100644 index 00000000000..1cc2a1432af --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/910.txt @@ -0,0 +1 @@ +ਸਥਿਰ ਡੇਟਾਬੇਸ ਮਾਈਗ੍ਰੇਸ਼ਨ ਜਿਸ ਨੇ ਕੁਝ ਦੁਰਲੱਭ ਮਾਮਲਿਆਂ ਵਿੱਚ ਨਿਊਪਾਈਪ ਨੂੰ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਰੋਕਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/920.txt b/fastlane/metadata/android/pa/changelogs/920.txt new file mode 100644 index 00000000000..04fc07937e8 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/920.txt @@ -0,0 +1 @@ +ਸੁਧਾਰ • ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅੱਪਲੋਡ ਦੀ ਮਿਤੀ ਅਤੇ ਦੇਖਣ ਦੀ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ ਸਥਿਰ • ਏਪੀਆਈ 19 'ਤੇ ਕ੍ਰੈਸ਼ ਹੋਣ ਕਾਰਨ ਫਿਕਸਡ ਮਿਊਟ ਬਟਨ • ਲੰਬੇ 1080p 60fps ਵੀਡੀਓ ਦੀ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ diff --git a/fastlane/metadata/android/pa/changelogs/930.txt b/fastlane/metadata/android/pa/changelogs/930.txt new file mode 100644 index 00000000000..a067bfb5868 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/930.txt @@ -0,0 +1 @@ +ਨਵਾਂ • YouTube ਸੰਗੀਤ 'ਤੇ ਖੋਜੋ • ਬੁਨਿਆਦੀ Android TV ਸਮਰਥਨ ਸੁਧਾਰ • ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ • ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਜਦੋਂ ਸਮੱਗਰੀ ਅਜੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਸੁਨੇਹਾ ਦਿਖਾਓ • ਚੁਟਕੀ ਇਸ਼ਾਰਿਆਂ ਨਾਲ ਪੌਪਅੱਪ ਪਲੇਅਰ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਗਿਆ ਹੈ • ਬੈਕਗ੍ਰਾਊਂਡ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਅਤੇ ਚੈਨਲ ਵਿੱਚ ਪੌਪਅੱਪ ਬਟਨਾਂ 'ਤੇ ਸਟ੍ਰੀਮ ਨੂੰ ਐਨਕਿਊ ਕਰੋ • ਦਰਾਜ਼ ਸਿਰਲੇਖ ਦੇ ਸਿਰਲੇਖ ਦੇ ਆਕਾਰ ਨੂੰ ਸੰਭਾਲਣ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ ਸਥਿਰ • ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ • ਕੁਝ ਖਾਸ ਕਿਸਮ ਦੇ reCAPTCHA ਫਿਕਸ ਕੀਤੇ ਗਏ ਹਨ • ਪਲੇਲਿਸਟ `ਨੱਲ` ਹੋਣ 'ਤੇ ਬੁੱਕਮਾਰਕ ਖੋਲ੍ਹਣ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਨੈੱਟਵਰਕ ਸੰਬੰਧੀ ਅਪਵਾਦਾਂ ਦੀ ਸਥਿਰ ਖੋਜ • ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫਰੈਗਮੈਂਟ ਵਿੱਚ ਗਰੁੱਪ ਸੌਰਟ ਬਟਨ ਦੀ ਸਥਿਰ ਦਿੱਖ ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/940.txt b/fastlane/metadata/android/pa/changelogs/940.txt new file mode 100644 index 00000000000..b9d9b3fdf98 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/940.txt @@ -0,0 +1 @@ +ਨਵਾਂ • SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ • YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ • PeerTube ਮੂਲ ਚੈਨਲ ਦੇ ਵੇਰਵੇ ਦਿਖਾਓ ਸੁਧਾਰ • ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ ਕੋਰ ਬਟਨ ਦਿਖਾਓ • ਨੈਵੀਗੇਸ਼ਨਬਾਰ ਜਾਂ ਸਟੇਟਸਬਾਰ ਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਪਲੇਅਰ ਸੰਕੇਤਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ • ਸੇਵਾ ਦੇ ਰੰਗ ਦੇ ਆਧਾਰ 'ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਗਾਹਕ ਬਣੋ ਬਟਨਾਂ ਦਾ ਪਿਛੋਕੜ ਰੰਗ ਬਦਲੋ ਸਥਿਰ • ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਨੂੰ ਠੀਕ ਕਰੋ • ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ • ਵੀਡੀਓ ਖੋਲ੍ਹਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/950.txt b/fastlane/metadata/android/pa/changelogs/950.txt new file mode 100644 index 00000000000..454a34bd479 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/950.txt @@ -0,0 +1,4 @@ +ਇਹ ਰੀਲੀਜ਼ ਤਿੰਨ ਛੋਟੇ ਫਿਕਸ ਲਿਆਉਂਦਾ ਹੈ: +• Adroid 10+ 'ਤੇ ਸਥਿਰ ਸਟੋਰੇਜ ਪਹੁੰਚ +• ਫਿਕਸਡ ਓਪਨਿੰਗ ਕਿਓਸਕ +• ਲੰਬੇ ਵੀਡੀਓਜ਼ ਦੀ ਸਥਿਰ ਮਿਆਦ ਪਾਰਸਿੰਗ diff --git a/fastlane/metadata/android/pa/changelogs/951.txt b/fastlane/metadata/android/pa/changelogs/951.txt new file mode 100644 index 00000000000..2b1cd7933f0 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/951.txt @@ -0,0 +1,13 @@ +ਨਵਾਂ +• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਗਾਹਕੀ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕਰੋ +• ਸਿਰਫ਼ ਗੈਰ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕਰੋ +• ਪਲੇਲਿਸਟ ਟੈਬ ਨੂੰ ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਸ਼ਾਮਲ ਕਰੋ +• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਤਾਰ ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ/ਰਿਵਾਈਂਡ ਕਰੋ +• ਖੋਜ ਸੁਝਾਅ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਹੈ ਅਤੇ ਇਸ ਲਈ ਨਤੀਜਾ ਦਿਖਾ ਰਿਹਾ ਹੈ +ਸੁਧਾਰ +• ਮਿਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਛੱਡੋ • ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ +• ਟੂਲਬਾਰ ਦੇ ਰੰਗ ਨਾਲ ਮੇਲ ਕਰਨ ਲਈ ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਰੰਗ ਅੱਪਡੇਟ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਤਰੁੱਟੀਆਂ ਦੇ ਕਾਰਨ ਫਿਕਸਡ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ +• [PeerTube] ਮਿਟਾਈਆਂ ਗਈਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਸੰਭਾਲੋ ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/952.txt b/fastlane/metadata/android/pa/changelogs/952.txt new file mode 100644 index 00000000000..dda91ee5514 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/952.txt @@ -0,0 +1,7 @@ +ਸੁਧਾਰ +• ਆਟੋ-ਪਲੇ ਸਾਰੀਆਂ ਸੇਵਾਵਾਂ ਲਈ ਉਪਲਬਧ ਹੈ (ਸਿਰਫ਼ YouTube ਦੀ ਬਜਾਏ) + +ਠੀਕ ਕੀਤਾ +• YouTube ਦੀਆਂ ਨਵੀਆਂ ਨਿਰੰਤਰਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਕੇ ਸੰਬੰਧਿਤ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ ਗਿਆ +• ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ YouTube ਵੀਡੀਓ +• [Android TV] ਸਥਿਰ ਲੰਮੀ ਫੋਕਸ ਹਾਈਲਾਈਟ ਓਵਰਲੇ diff --git a/fastlane/metadata/android/pa/changelogs/953.txt b/fastlane/metadata/android/pa/changelogs/953.txt new file mode 100644 index 00000000000..5d5672ad250 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/953.txt @@ -0,0 +1 @@ +YouTube ਦੇ ਡੀਕ੍ਰਿਪਸ਼ਨ ਫੰਕਸ਼ਨ ਦੇ ਐਕਸਟਰੈਕਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। diff --git a/fastlane/metadata/android/pa/changelogs/954.txt b/fastlane/metadata/android/pa/changelogs/954.txt new file mode 100644 index 00000000000..3eb8dd68bf6 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/954.txt @@ -0,0 +1,8 @@ +• ਨਵਾਂ ਐਪਲੀਕੇਸ਼ਨ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ +• ਮੀਡੀਆ ਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ +• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਰੀਸਾਈਜ਼ ਕਰਨਾ + +• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਖੁੱਲੇ ਵਿਕਲਪਾਂ ਨਾਲ ਡਾਇਲਾਗ ਦਿਖਾਓ +• ਜਦੋਂ ਰਿਮੋਟ ਨੂੰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਤਾਂ ਖੋਜ ਸੁਝਾਅ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ +• ਡਿਫ਼ਾਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ ਨੂੰ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਹੈ +• ਬਹੁਤ ਸਾਰੇ ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/955.txt b/fastlane/metadata/android/pa/changelogs/955.txt new file mode 100644 index 00000000000..ea480cb5a53 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/955.txt @@ -0,0 +1,3 @@ +[YouTube] ਕੁਝ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਖੋਜ ਨੂੰ ਠੀਕ ਕਰੋ +[YouTube] ਬੇਤਰਤੀਬੇ ਡੀਕ੍ਰਿਪਸ਼ਨ ਅਪਵਾਦਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +[SoundCloud] ਸਲੈਸ਼ ਨਾਲ ਖਤਮ ਹੋਣ ਵਾਲੇ URL ਹੁਣ ਸਹੀ ਤਰ੍ਹਾਂ ਪਾਰਸ ਕੀਤੇ ਗਏ ਹਨ diff --git a/fastlane/metadata/android/pa/changelogs/956.txt b/fastlane/metadata/android/pa/changelogs/956.txt new file mode 100644 index 00000000000..897a5bf2af6 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ diff --git a/fastlane/metadata/android/pa/changelogs/957.txt b/fastlane/metadata/android/pa/changelogs/957.txt new file mode 100644 index 00000000000..eb66dacbc97 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/957.txt @@ -0,0 +1,10 @@ +• ਖਾਸ ਐਨਕਿਊ ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਜੋੜੋ +• ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਦੋ ਉਂਗਲਾਂ ਦੇ ਸੰਕੇਤ +• reCAPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਦਿਓ +• ਨੋਟੀਫਿਕੇਸ਼ਨ ਨੂੰ ਰੰਗ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ +• ਅਨੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਵਿਡੀਓ ਵੇਰਵਿਆਂ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਇਸ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ, ਨਿਊਪਾਈਪ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਵੇਲੇ ਬੱਗੀ ਵਿਵਹਾਰ ਅਤੇ ਹੋਰ ਅਸੰਗਤਤਾਵਾਂ +• YouTube ਵੀਡੀਓਜ਼ ਦੀ ਗਤੀ ਵਧਾਓ ਅਤੇ ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ +• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਇੰਡ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ +• ਥੰਬਨੇਲ ਖਿੱਚ ਕੇ ਸੂਚੀਆਂ ਨੂੰ ਮੁੜ ਵਿਵਸਥਿਤ ਨਾ ਕਰੋ +• ਪੌਪਅੱਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਯਾਦ ਰੱਖੋ +• ਸੰਤਾਲੀ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/958.txt b/fastlane/metadata/android/pa/changelogs/958.txt new file mode 100644 index 00000000000..66c2ae76377 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/958.txt @@ -0,0 +1 @@ +ਨਵਾਂ ਅਤੇ ਸੁਧਾਰਿਆ ਗਿਆ: • ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਥੰਬਨੇਲ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਵਿਕਲਪ • ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਖਿੱਚੋ • ਸਥਾਨਕ ਸੂਚੀਆਂ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਬਿਹਤਰ ਕਾਰਗੁਜ਼ਾਰੀ ਸਥਿਰ: • ਰੈਮ ਤੋਂ ਹਟਾਏ ਜਾਣ ਤੋਂ ਬਾਅਦ ਨਿਊਪਾਈਪ ਨੂੰ ਚਾਲੂ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਾ ਹੋਣ 'ਤੇ ਸਟਾਰਟਅਪ 'ਤੇ ਸਥਿਰ ਕਰੈਸ਼ • ਚਮਕ- ਅਤੇ ਵੌਲਯੂਮ-ਇਸ਼ਾਰਾ ਸੈਟਿੰਗਾਂ ਦਾ ਆਦਰ ਕਰਦੇ ਹੋਏ ਸਥਿਰ • [YouTube] ਸਥਿਰ ਲੰਬੀਆਂ ਪਲੇਲਿਸਟਾਂ ਹੋਰ: • ਕੋਡ ਕਲੀਨਅੱਪ ਅਤੇ ਕਈ ਅੰਦਰੂਨੀ ਸੁਧਾਰ • ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ • ਅਨੁਵਾਦ ਅੱਪਡੇਟ diff --git a/fastlane/metadata/android/pa/changelogs/959.txt b/fastlane/metadata/android/pa/changelogs/959.txt new file mode 100644 index 00000000000..5ababff32fc --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/959.txt @@ -0,0 +1,3 @@ +ਗਲਤੀ ਰਿਪੋਰਟਰ ਨੂੰ ਖੋਲ੍ਹਣ ਤੋਂ ਬਾਅਦ ਕਰੈਸ਼ਾਂ ਦਾ ਬੇਅੰਤ ਲੂਪ ਸਥਿਰ ਕੀਤਾ ਗਿਆ। +PeerTube ਉਦਾਹਰਨਾਂ ਦੀ ਅੱਪਡੇਟ ਕੀਤੀ ਸੂਚੀ ਜੋ +NewPipe ਦੁਆਰਾ ਆਪਣੇ ਆਪ ਖੋਲ੍ਹੀ ਜਾ ਸਕਦੀ ਹੈ। ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ। diff --git a/fastlane/metadata/android/pa/changelogs/960.txt b/fastlane/metadata/android/pa/changelogs/960.txt new file mode 100644 index 00000000000..8527ebd2d4b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/960.txt @@ -0,0 +1,4 @@ +• ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਨਿਰਯਾਤ ਡੇਟਾਬੇਸ ਵਿਕਲਪ ਦਾ ਸੁਧਾਰਿਆ ਗਿਆ ਵਰਣਨ। +• ਸਥਿਰ YouTube ਟਿੱਪਣੀਆਂ ਪਾਰਸਿੰਗ। +• media.ccc.de ਸੇਵਾ ਦਾ ਸਥਿਰ ਡਿਸਪਲੇ ਨਾਮ। +• ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ। diff --git a/fastlane/metadata/android/pa/changelogs/961.txt b/fastlane/metadata/android/pa/changelogs/961.txt new file mode 100644 index 00000000000..069b0823901 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/961.txt @@ -0,0 +1 @@ +• [YouTube] ਮਿਕਸ ਸਮਰਥਨ • [YouTube] ਜਨਤਕ ਪ੍ਰਸਾਰਕਾਂ ਅਤੇ ਕੋਵਿਡ-19 ਬਾਰੇ ਜਾਣਕਾਰੀ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ • [media.ccc.de] ਜੋੜੇ ਗਏ ਹਾਲੀਆ ਵੀਡੀਓ • ਸੋਮਾਲੀ ਅਨੁਵਾਦ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਬਹੁਤ ਸਾਰੇ ਅੰਦਰੂਨੀ ਸੁਧਾਰ • ਪਲੇਅਰ ਦੇ ਅੰਦਰੋਂ ਸਥਿਰ ਸ਼ੇਅਰਿੰਗ ਵੀਡੀਓ • ਸਥਿਰ ਖਾਲੀ ReCaptcha ਵੈਬਵਿਊ • ਇੱਕ ਸੂਚੀ ਵਿੱਚੋਂ ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਉਣ ਵੇਲੇ ਆਈ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ • [PeerTube] ਸਥਿਰ ਸੰਬੰਧਿਤ ਸਟ੍ਰੀਮਾਂ • [YouTube] ਸਥਿਰ YouTube ਸੰਗੀਤ ਖੋਜ diff --git a/fastlane/metadata/android/pa/changelogs/962.txt b/fastlane/metadata/android/pa/changelogs/962.txt new file mode 100644 index 00000000000..3676cf31b0a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/962.txt @@ -0,0 +1,2 @@ +media.ccc.de ਸੇਵਾ ਵਿੱਚ "ਹਾਲੀਆ" ਵਿਡੀਓਜ਼ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ। +media.ccc.de ਸੇਵਾ ਵਿੱਚ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਸ਼ਾਮਲ ਕੀਤੀਆਂ ਗਈਆਂ ਅਤੇ ਲਾਈਵ ਸਟ੍ਰੀਮ ਸਮਰਥਨ ਵੀ। diff --git a/fastlane/metadata/android/pa/changelogs/963.txt b/fastlane/metadata/android/pa/changelogs/963.txt new file mode 100644 index 00000000000..f0bc9b09cf1 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] ਸਥਿਰ ਚੈਨਲ ਨਿਰੰਤਰਤਾ diff --git a/fastlane/metadata/android/pa/changelogs/964.txt b/fastlane/metadata/android/pa/changelogs/964.txt new file mode 100644 index 00000000000..85dc2c15149 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/964.txt @@ -0,0 +1 @@ +• ਪਲੇਅਰ ਨਿਯੰਤਰਣ ਵਿੱਚ ਅਧਿਆਵਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • [PeerTube] ਸੇਪੀਆ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ • ਜੇਕਰ ਚਮਕ ਦਾ ਸੰਕੇਤ ਅਸਮਰੱਥ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਬੰਦ ਕਰੋ • ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਸ਼ੇਅਰ ਡਾਇਲਾਗਸ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ • ਫੁੱਲਸਕ੍ਰੀਨ ਪਲੇਅਰ ਵਿੱਚ ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਨਾਲ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਟੌਗਲ ਕਰੋ • [media.ccc.de] ਕਈ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ diff --git a/fastlane/metadata/android/pa/changelogs/965.txt b/fastlane/metadata/android/pa/changelogs/965.txt new file mode 100644 index 00000000000..83e28b70750 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/965.txt @@ -0,0 +1 @@ +ਸਥਿਰ ਕਰੈਸ਼ ਜੋ ਚੈਨਲ ਸਮੂਹਾਂ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰਨ ਵੇਲੇ ਵਾਪਰਿਆ ਸੀ। ਚੈਨਲਾਂ ਅਤੇ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਹੋਰ YouTube ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਥਿਰ ਕੀਤਾ ਗਿਆ ਹੈ। YouTube ਟਿੱਪਣੀਆਂ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਥਿਰ ਹੈ। YouTube URL ਵਿੱਚ /watch/, /v/ ਅਤੇ /w/ ਸਬਪਾਥ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ। SoundCloud ਕਲਾਇੰਟ ਆਈਡੀ ਅਤੇ ਭੂ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮਗਰੀ ਦਾ ਸਥਿਰ ਐਕਸਟਰੈਕਸ਼ਨ। ਉੱਤਰੀ ਕੁਰਦਿਸ਼ ਸਥਾਨਕਕਰਨ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/966.txt b/fastlane/metadata/android/pa/changelogs/966.txt new file mode 100644 index 00000000000..61afac50376 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/966.txt @@ -0,0 +1 @@ +ਨਵਾਂ: • ਇੱਕ ਨਵੀਂ ਸੇਵਾ ਸ਼ਾਮਲ ਕਰੋ: Bandcamp ਸੁਧਾਰ: • ਐਪ ਨੂੰ ਡਿਵਾਈਸ ਥੀਮ ਦਾ ਅਨੁਸਰਣ ਕਰਨ ਲਈ ਇੱਕ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕਰੋ • ਇੱਕ ਸੁਧਾਰਿਆ ਹੋਇਆ ਗਲਤੀ ਪੈਨਲ ਦਿਖਾ ਕੇ ਕੁਝ ਕਰੈਸ਼ਾਂ ਨੂੰ ਰੋਕੋ • ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਦਿਖਾਓ ਕਿ ਸਮੱਗਰੀ ਕਿਉਂ ਉਪਲਬਧ ਨਹੀਂ ਹੈ • ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ • "ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ" ਟੋਸਟ ਦਿਖਾਓ ਸਥਿਰ: • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਵਿੱਚ ਬਹੁਤ ਛੋਟੇ ਥੰਬਨੇਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਨਿਊਨਤਮ ਪਲੇਅਰ ਵਿੱਚ ਖਾਲੀ ਸਿਰਲੇਖ ਨੂੰ ਠੀਕ ਕਰੋ • ਪਿਛਲੇ ਰੀਸਾਈਜ਼ ਮੋਡ ਨੂੰ ਠੀਕ ਤਰ੍ਹਾਂ ਰੀਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/967.txt b/fastlane/metadata/android/pa/changelogs/967.txt new file mode 100644 index 00000000000..8b63f43e75b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/967.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube EU ਵਿੱਚ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ। ਇਹ ਇੱਕ ਨਵੀਂ ਕੂਕੀ ਅਤੇ ਗੋਪਨੀਯਤਾ ਸਹਿਮਤੀ ਪ੍ਰਣਾਲੀ ਦੇ ਕਾਰਨ ਹੋਇਆ ਸੀ ਜਿਸ ਲਈ ਇੱਕ CONSENT ਕੂਕੀ ਸੈੱਟ ਕਰਨ ਲਈ NewPipe ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/968.txt b/fastlane/metadata/android/pa/changelogs/968.txt new file mode 100644 index 00000000000..3e3909022ad --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/968.txt @@ -0,0 +1 @@ +ਲੰਬੇ ਸਮੇਂ ਲਈ ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਚੈਨਲ ਵੇਰਵੇ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। ਪਲੇਲਿਸਟ ਇੰਟਰਫੇਸ ਤੋਂ ਪਲੇਲਿਸਟ ਨਾਮ ਦਾ ਨਾਮ ਬਦਲਣ ਲਈ ਕਾਰਜਸ਼ੀਲਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ। ਵੀਡੀਓ ਬਫਰਿੰਗ ਹੋਣ 'ਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਰੁਕਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। ਚਿੱਟੇ ਥੀਮ ਨੂੰ ਪਾਲਿਸ਼ ਕੀਤਾ। ਇੱਕ ਵੱਡੇ ਫੌਂਟ ਆਕਾਰ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਓਵਰਲੈਪਿੰਗ ਫੌਂਟਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਫਾਰਮੂਲਰ ਅਤੇ ਜ਼ੇਫੀਅਰ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਵੀਡੀਓ ਫਿਕਸ ਨਹੀਂ ਕੀਤਾ ਗਿਆ। ਵੱਖ-ਵੱਖ ਕਰੈਸ਼ਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ। diff --git a/fastlane/metadata/android/pa/changelogs/969.txt b/fastlane/metadata/android/pa/changelogs/969.txt new file mode 100644 index 00000000000..4708c4a1380 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/969.txt @@ -0,0 +1 @@ +• ਬਾਹਰੀ ਸਟੋਰੇਜ 'ਤੇ ਇੰਸਟਾਲੇਸ਼ਨ ਦੀ ਆਗਿਆ ਦਿਓ • [ਬੈਂਡਕੈਂਪ] ਇੱਕ ਸਟ੍ਰੀਮ 'ਤੇ ਪਹਿਲੀਆਂ ਤਿੰਨ ਟਿੱਪਣੀਆਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿਰਫ਼ 'ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਗਿਆ ਹੈ' ਟੋਸਟ ਦਿਖਾਓ • ਜਦੋਂ ਕੋਈ ਕੂਕੀ ਸਟੋਰ ਨਾ ਹੋਵੇ ਤਾਂ ਰੀਕੈਪਚਾ ਕੂਕੀ ਸੈਟ ਨਾ ਕਰੋ • [ਖਿਡਾਰੀ] ਕੈਸ਼ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • [ਖਿਡਾਰੀ] ਫਿਕਸਡ ਪਲੇਅਰ ਆਟੋਮੈਟਿਕ ਨਹੀਂ ਚੱਲ ਰਿਹਾ • ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਮਿਟਾਉਣ ਵੇਲੇ ਪਿਛਲੀਆਂ ਸਨੈਕਬਾਰਾਂ ਨੂੰ ਖਾਰਜ ਕਰੋ • ਸੂਚੀ ਵਿੱਚ ਨਾ ਹੋਣ ਵਾਲੀ ਵਸਤੂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ diff --git a/fastlane/metadata/android/pa/changelogs/970.txt b/fastlane/metadata/android/pa/changelogs/970.txt new file mode 100644 index 00000000000..679c9dae39f --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/970.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਵਰਣਨ ਦੇ ਹੇਠਾਂ ਸਮੱਗਰੀ ਮੈਟਾਡੇਟਾ (ਟੈਗ, ਸ਼੍ਰੇਣੀਆਂ, ਲਾਇਸੰਸ, ...) ਦਿਖਾਓ • ਰਿਮੋਟ (ਗੈਰ-ਸਥਾਨਕ) ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ "ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ "ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਸਥਿਰ • ਵੀਡੀਓ ਵੇਰਵੇ ਪੰਨੇ 'ਤੇ ਸਥਿਰ ਰੋਟੇਸ਼ਨ ਕਰੈਸ਼ • ਪਲੇਅਰ ਵਿੱਚ ਸਥਿਰ "ਕੋਡੀ ਨਾਲ ਖੇਡੋ" ਬਟਨ ਹਮੇਸ਼ਾ ਕੋਰ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਪ੍ਰੇਰਦਾ ਹੈ • ਸਥਿਰ ਅਤੇ ਸੁਧਾਰੀ ਸੈਟਿੰਗ ਆਯਾਤ ਅਤੇ ਨਿਰਯਾਤ ਮਾਰਗ • [YouTube] ਸਥਿਰ ਟਿੱਪਣੀ ਪਸੰਦ ਗਿਣਤੀ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/971.txt b/fastlane/metadata/android/pa/changelogs/971.txt new file mode 100644 index 00000000000..d3dbe862f76 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/971.txt @@ -0,0 +1,3 @@ +ਹੌਟਫਿਕਸ +• ਰੀਬਫਰ ਤੋਂ ਬਾਅਦ ਪਲੇਬੈਕ ਲਈ ਬਫਰ ਵਧਾਓ +• ਪਲੇਅਰ ਵਿੱਚ ਪਲੇ-ਕਿਊ ਆਈਕਨ 'ਤੇ ਕਲਿੱਕ ਕਰਨ ਵੇਲੇ ਟੈਬਲੈੱਟਾਂ ਅਤੇ ਟੀਵੀ 'ਤੇ ਸਥਿਰ ਕਰੈਸ਼ diff --git a/fastlane/metadata/android/pa/changelogs/972.txt b/fastlane/metadata/android/pa/changelogs/972.txt new file mode 100644 index 00000000000..9cf29019820 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/972.txt @@ -0,0 +1,13 @@ +ਨਵਾਂ +ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਅਤੇ ਹੈਸ਼ਟੈਗਾਂ ਨੂੰ ਪਛਾਣੋ +ਮੈਨੂਅਲ ਟੈਬਲੇਟ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +ਇੱਕ ਫੀਡ ਵਿੱਚ ਖੇਡੀਆਂ ਗਈਆਂ ਆਈਟਮਾਂ ਨੂੰ ਲੁਕਾਉਣ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ + +ਸੁਧਾਰ +ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦਾ ਸਹੀ ਢੰਗ ਨਾਲ ਸਮਰਥਨ ਕਰੋ +ਅਣਉਪਲਬਧ ਅਤੇ ਬੰਦ ਕੀਤੇ ਚੈਨਲਾਂ ਦੀ ਬਿਹਤਰ ਗਲਤੀ ਹੈਂਡਲਿੰਗ +Android 10+ ਉਪਭੋਗਤਾਵਾਂ ਲਈ Android ਸ਼ੇਅਰ ਸ਼ੀਟ ਹੁਣ ਸਮੱਗਰੀ ਦਾ ਸਿਰਲੇਖ ਦਿਖਾਉਂਦੀ ਹੈ। +ਅੱਪਡੇਟ ਕੀਤਾ Invidious ਮੌਕੇ ਅਤੇ ਸਹਿਯੋਗ ਪਾਈਪ ਲਿੰਕ. + +ਠੀਕ ਕੀਤਾ +[YouTube] ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਚੋਣ ਡਾਇਲਾਗ ਖੋਲ੍ਹਣ ਵੇਲੇ ਲੀਕ ਵਿੰਡੋ ਅਪਵਾਦ ਨੂੰ ਰੋਕੋ diff --git a/fastlane/metadata/android/pa/changelogs/973.txt b/fastlane/metadata/android/pa/changelogs/973.txt new file mode 100644 index 00000000000..3afd456da56 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/973.txt @@ -0,0 +1,4 @@ +ਹੌਟਫਿਕਸ +• ਇੱਕ ਕਤਾਰ ਵਿੱਚ ਕਿੰਨੇ ਵਿਡੀਓ ਫਿੱਟ ਹੋ ਸਕਦੇ ਹਨ ਦੀ ਗਲਤ ਗਣਨਾ ਕਰਕੇ, ਗਰਿੱਡ ਲੇਆਉਟ ਵਿੱਚ ਕੱਟੇ ਜਾ ਰਹੇ ਥੰਬਨੇਲ ਅਤੇ ਸਿਰਲੇਖਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਸ਼ੇਅਰ ਮੀਨੂ ਤੋਂ ਖੋਲ੍ਹੇ ਜਾਣ 'ਤੇ ਬਿਨਾਂ ਕੁਝ ਕੀਤੇ ਗਾਇਬ ਹੋ ਰਹੇ ਡਾਉਨਲੋਡ ਡਾਇਲੌਗ ਨੂੰ ਠੀਕ ਕਰੋ +• ਬਾਹਰੀ ਗਤੀਵਿਧੀਆਂ ਜਿਵੇਂ ਕਿ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਫਾਈਲ ਪਿਕਰ ਖੋਲ੍ਹਣ ਨਾਲ ਸਬੰਧਤ ਇੱਕ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/974.txt b/fastlane/metadata/android/pa/changelogs/974.txt new file mode 100644 index 00000000000..563a9768af3 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/974.txt @@ -0,0 +1,5 @@ +ਹੌਟਫਿਕਸ +• YouTube ਥ੍ਰੋਟਲਿੰਗ ਦੇ ਕਾਰਨ ਬਫਰਿੰਗ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਬੰਦ ਕੀਤੀਆਂ ਟਿੱਪਣੀਆਂ ਨਾਲ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ YouTube ਟਿੱਪਣੀਆਂ ਕੱਢਣ +• YouTube ਸੰਗੀਤ ਖੋਜ ਨੂੰ ਠੀਕ ਕਰੋ +• PeerTube ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/975.txt b/fastlane/metadata/android/pa/changelogs/975.txt new file mode 100644 index 00000000000..c866df1e21e --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/975.txt @@ -0,0 +1,16 @@ +ਨਵਾਂ +• ਸੀਕ ਕਰਨ ਵੇਲੇ ਇੱਕ ਥੰਮਨੇਲ ਪੂਰਵਦਰਸ਼ਨ ਦਿਖਾਓ +• ਅਯੋਗ ਟਿੱਪਣੀਆਂ ਦਾ ਪਤਾ ਲਗਾਓ +• ਫੀਡ ਆਈਟਮ ਨੂੰ ਦੇਖੇ ਗਏ ਵਜੋਂ ਨਿਸ਼ਾਨਬੱਧ ਕਰਨ ਦਿਓ +• ਟਿੱਪਣੀ ਦਿਲ ਦਿਖਾਓ + +ਸੁਧਾਰ +• ਮੈਟਾਡੇਟਾ ਅਤੇ ਟੈਗਸ ਲੇਆਉਟ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• UI ਭਾਗਾਂ 'ਤੇ ਸੇਵਾ ਰੰਗ ਲਾਗੂ ਕਰੋ +ਠੀਕ ਕੀਤਾ +• ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਠੀਕ ਕਰੋ +• ਡੁਪਲੀਕੇਟ ਕਤਾਰ ਆਈਟਮਾਂ 'ਤੇ ਬੇਅੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ ਜਿਵੇਂ ਰੋਟੇਸ਼ਨ ਅਤੇ ਤੇਜ਼ੀ ਨਾਲ ਬੰਦ ਹੋਣਾ +• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਲੋਡ ਕੀਤੇ ਬਾਕੀ ਬਚੇ ReCAPTCHA ਨੂੰ ਠੀਕ ਕਰੋ +• ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਵੇਲੇ ਕਲਿੱਕਾਂ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ +• ਕੁਝ ਡਾਊਨਲੋਡਰ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/976.txt b/fastlane/metadata/android/pa/changelogs/976.txt new file mode 100644 index 00000000000..a1a1354ca2a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/976.txt @@ -0,0 +1,10 @@ +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ +• ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗਹਿਰਾ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ +• ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ +• ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ + +• ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ +• ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ +• [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ +ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/977.txt b/fastlane/metadata/android/pa/changelogs/977.txt new file mode 100644 index 00000000000..95d779a80a3 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/977.txt @@ -0,0 +1,10 @@ +• ਲੰਬੇ ਪ੍ਰੈਸ ਮੀਨੂ ਵਿੱਚ "ਅਗਲਾ ਚਲਾਓ" ਬਟਨ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਇੰਟੈਂਟ ਫਿਲਟਰ ਵਿੱਚ YouTube ਸ਼ਾਰਟਸ ਪਾਥ ਪ੍ਰੀਫਿਕਸ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਸਥਿਰ ਸੈਟਿੰਗਾਂ ਆਯਾਤ +• ਕਤਾਰ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਬਟਨਾਂ ਨਾਲ ਸੀਕਬਾਰ ਸਥਿਤੀ ਨੂੰ ਸਵੈਪ ਕਰੋ +• MediasessionManager ਨਾਲ ਸੰਬੰਧਿਤ ਕਈ ਫਿਕਸ +• ਵੀਡੀਓ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਸਥਿਰ ਸੀਕਬਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ +• RealtekATV 'ਤੇ ਅਯੋਗ ਮੀਡੀਆ ਟਨਲਿੰਗ +• ਵਿਸਤ੍ਰਿਤ ਨਿਊਨਤਮ ਪਲੇਅਰ ਬਟਨ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਖੇਤਰ + +ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/978.txt b/fastlane/metadata/android/pa/changelogs/978.txt new file mode 100644 index 00000000000..683f43eccc5 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/978.txt @@ -0,0 +1 @@ +ਇੱਕ ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣ ਲਈ ਜਾਂਚ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਸਥਿਰ ਹੈ। ਇਹ ਜਾਂਚ ਕਈ ਵਾਰ ਬਹੁਤ ਜਲਦੀ ਕੀਤੀ ਗਈ ਸੀ ਅਤੇ ਇਸਲਈ ਐਪ ਕਰੈਸ਼ ਹੋ ਜਾਂਦੀ ਹੈ। ਇਸ ਨੂੰ ਹੁਣ ਠੀਕ ਕੀਤਾ ਜਾਣਾ ਗਿਆ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/979.txt b/fastlane/metadata/android/pa/changelogs/979.txt new file mode 100644 index 00000000000..61a432f20df --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/979.txt @@ -0,0 +1,2 @@ +- ਠੀਕ ਕੀਤਾ ਪਲੇਬੈਕ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰਨਾ +- ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਸੁਧਾਰ ਕੀਤੇ ਗਏ ਹਨ ਕਿ ਸੇਵਾ ਜੋ ਇਹ ਨਿਰਧਾਰਤ ਕਰਦੀ ਹੈ ਕਿ ਕੀ NewPipe ਨੂੰ ਨਵੇਂ ਸੰਸਕਰਣ ਦੀ ਜਾਂਚ ਲਈ ਜਾਂਚ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ, ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋਈ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/980.txt b/fastlane/metadata/android/pa/changelogs/980.txt new file mode 100644 index 00000000000..cc1b47f2601 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/980.txt @@ -0,0 +1,12 @@ +ਨਵਾਂ +• ਸ਼ੇਅਰ ਮੀਨੂ ਲਈ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• y2u.be ਅਤੇ PeerTube ਛੋਟੇ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ + +ਸੁਧਾਰ +• ਪਲੇਬੈਕ-ਸਪੀਡ-ਕੰਟਰੋਲਾਂ ਨੂੰ ਵਧੇਰੇ ਸੰਖੇਪ ਬਣਾਇਆ ਗਿਆ ਹੈ +• ਫੀਡ ਹੁਣ ਨਵੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਉਜਾਗਰ ਕਰਦੀ ਹੈ +• ਫੀਡ ਵਿੱਚ "ਦੇਖੀਆਂ ਆਈਟਮਾਂ ਦਿਖਾਓ" ਵਿਕਲਪ ਹੁਣ ਸੁਰੱਖਿਅਤ ਹੈ + +ਠੀਕ ਕੀਤਾ +• ਸਥਿਰ YouTube ਪਸੰਦਾਂ ਅਤੇ ਨਾਪਸੰਦਾਂ ਨੂੰ ਕੱਢਣਾ +• ਬੈਕਗ੍ਰਾਊਂਡ ਤੋਂ ਵਾਪਸ ਆਉਣ ਤੋਂ ਬਾਅਦ ਸਥਿਰ ਆਟੋਮੈਟਿਕ ਰੀਪਲੇਅ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/981.txt b/fastlane/metadata/android/pa/changelogs/981.txt new file mode 100644 index 00000000000..36f1415869b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/981.txt @@ -0,0 +1,2 @@ +ਐਂਡਰਾਇਡ 11+ 'ਤੇ ਬਫਰਿੰਗ ਤੋਂ ਬਾਅਦ ਅਸਫਲ ਪਲੇਬੈਕ ਰੀਜ਼ਿਊਮ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਮੀਡੀਆ ਪਾਰਸਰ ਸਮਰਥਨ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। +ਪਲੇਬੈਕ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਫਿਲਿਪਸ QM16XE 'ਤੇ ਮੀਡੀਆ ਟਨਲਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/982.txt b/fastlane/metadata/android/pa/changelogs/982.txt new file mode 100644 index 00000000000..829c8585127 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/982.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ। diff --git a/fastlane/metadata/android/pa/changelogs/983.txt b/fastlane/metadata/android/pa/changelogs/983.txt new file mode 100644 index 00000000000..c3797c649ae --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/983.txt @@ -0,0 +1,9 @@ +ਨਵਾਂ ਡਬਲ-ਟੈਪ-ਟੂ-ਸੀਕ UI ਅਤੇ ਵਿਵਹਾਰ ਸ਼ਾਮਲ ਕਰੋ +ਸੈਟਿੰਗਾਂ ਨੂੰ ਖੋਜਣਯੋਗ ਬਣਾਓ +ਪਿੰਨ ਕੀਤੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਹਾਈਲਾਈਟ ਕਰੋ +FSFE ਦੇ PeerTube ਉਦਾਹਰਨ ਲਈ ਓਪਨ-ਵਿਦ-ਐਪ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ +ਗਲਤੀ ਸੂਚਨਾਵਾਂ ਸ਼ਾਮਲ ਕਰੋ +ਪਲੇਅਰ ਬਦਲਣ 'ਤੇ ਪਹਿਲੀ ਕਤਾਰ ਆਈਟਮ ਦੇ ਰੀਪਲੇਅ ਨੂੰ ਠੀਕ ਕਰੋ +ਫੇਲ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਲਾਈਵਸਟ੍ਰੀਮ ਦੇ ਦੌਰਾਨ ਬਫਰਿੰਗ ਕਰਦੇ ਸਮੇਂ ਜ਼ਿਆਦਾ ਉਡੀਕ ਕਰੋ +ਸਥਾਨਕ ਖੋਜ ਨਤੀਜਿਆਂ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ +ਪਲੇ ਕਤਾਰ ਵਿੱਚ ਖਾਲੀ ਆਈਟਮ ਖੇਤਰਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/984.txt b/fastlane/metadata/android/pa/changelogs/984.txt new file mode 100644 index 00000000000..068d56d5952 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/984.txt @@ -0,0 +1,7 @@ +ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਭਰਨ ਅਤੇ ਟੈਬਲੇਟਾਂ ਅਤੇ ਟੀਵੀ 'ਤੇ ਸਕ੍ਰੋਲਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਸੂਚੀਆਂ ਵਿੱਚ ਲੋੜੀਂਦੀਆਂ ਸ਼ੁਰੂਆਤੀ ਆਈਟਮਾਂ ਲੋਡ ਕਰੋ +ਸੂਚੀਆਂ ਰਾਹੀਂ ਸਕ੍ਰੋਲ ਕਰਦੇ ਸਮੇਂ ਬੇਤਰਤੀਬੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +ਪਲੇਅਰ ਨੂੰ ਸਿਸਟਮ UI ਦੇ ਅਧੀਨ ਤੇਜ਼ੀ ਨਾਲ ਸੀਕ ਓਵਰਲੇ ਆਰਕ ਜਾਣ ਦਿਓ +ਮਲਟੀ ਵਿੰਡੋ ਵਿੱਚ ਖੇਡਦੇ ਸਮੇਂ ਕਟਆਊਟਾਂ ਵਿੱਚ ਬਦਲਾਵ ਵਾਪਸ ਲਿਆਓ, ਜਿਸ ਨਾਲ ਕੁਝ ਫ਼ੋਨਾਂ 'ਤੇ ਪਲੇਅਰ ਰੀਗਰੈਸ਼ਨ ਦਾ ਕਾਰਨ ਬਣਦੇ ਹਨ। +compileSdk ਨੂੰ 30 ਤੋਂ 31 ਤੱਕ ਵਧਾਓ +ਅਸ਼ੁੱਧੀ ਰਿਪੋਰਟਿੰਗ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ +ਪਲੇਅਰ ਵਿੱਚ ਕੁਝ ਕੋਡ ਰੀਫੈਕਟਰ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/985.txt b/fastlane/metadata/android/pa/changelogs/985.txt new file mode 100644 index 00000000000..fe62a1330fe --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/985.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ diff --git a/fastlane/metadata/android/pa/changelogs/986.txt b/fastlane/metadata/android/pa/changelogs/986.txt new file mode 100644 index 00000000000..b072d6cb9b1 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/986.txt @@ -0,0 +1,15 @@ +ਨਵਾਂ +• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ +• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ +• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ + +ਸੁਧਾਰ +• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ +• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ +• ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ +• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਨੂੰ ਘੁੰਮਾਉਣ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/987.txt b/fastlane/metadata/android/pa/changelogs/987.txt new file mode 100644 index 00000000000..93fc77a7753 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/987.txt @@ -0,0 +1,11 @@ +ਨਵਾਂ +• ਪ੍ਰਗਤੀਸ਼ੀਲ HTTP ਤੋਂ ਇਲਾਵਾ ਸਪੋਰਟ ਡਿਲੀਵਰੀ ਵਿਧੀਆਂ: ਤੇਜ਼ ਪਲੇਬੈਕ ਲੋਡ ਹੋਣ ਦਾ ਸਮਾਂ, PeerTube ਅਤੇ SoundCloud ਲਈ ਫਿਕਸ, ਹਾਲ ਹੀ ਵਿੱਚ ਖਤਮ ਹੋਈਆਂ YouTube ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਦਾ ਪਲੇਬੈਕ +• ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਜੋੜਨ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ +• Android 10+ ਸ਼ੇਅਰ ਸ਼ੀਟ ਵਿੱਚ ਚਿੱਤਰ ਦੀ ਪੂਰਵ-ਝਲਕ + + ਸੁਧਾਰ +• ਪਲੇਬੈਕ ਪੈਰਾਮੀਟਰ ਡਾਇਲਾਗ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਗਾਹਕੀ ਆਯਾਤ/ਨਿਰਯਾਤ ਬਟਨਾਂ ਨੂੰ ਤਿੰਨ-ਬਿੰਦੀਆਂ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਲੈ ਜਾਓ + +ਠੀਕ ਕੀਤਾ +• ਪਲੇਲਿਸਟ ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣਾ ਠੀਕ ਕਰੋ • ਸ਼ੇਅਰ ਮੀਨੂ ਥੀਮ ਅਤੇ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਐਂਟਰੀ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/988.txt b/fastlane/metadata/android/pa/changelogs/988.txt new file mode 100644 index 00000000000..a50bcc1446d --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ "ਕੋਈ ਸਟ੍ਰੀਮ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰ ਸਕਿਆ" ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +[YouTube] ਫਿਕਸ "ਹੇਠ ਦਿੱਤੀ ਸਮੱਗਰੀ ਇਸ ਐਪ 'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।" ਬੇਨਤੀ ਕੀਤੀ ਵੀਡੀਓ ਦੀ ਬਜਾਏ ਸੁਨੇਹਾ ਵਿਖਾਇਆ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/989.txt b/fastlane/metadata/android/pa/changelogs/989.txt new file mode 100644 index 00000000000..9c00f845d0a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• [YouTube] ਕੁਝ ਵੀਡੀਓਜ਼ 'ਤੇ ਥ੍ਰੋਟਲਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• jsoup ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ 1.15.3 ਵਿੱਚ ਅੱਪਗ੍ਰੇਡ ਕਰੋ, ਜਿਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਫਿਕਸ ਸ਼ਾਮਲ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/990.txt b/fastlane/metadata/android/pa/changelogs/990.txt new file mode 100644 index 00000000000..bd532ecb0da --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/990.txt @@ -0,0 +1,13 @@ +ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! +ਨਵਾਂ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ +ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ +• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/992.txt b/fastlane/metadata/android/pa/changelogs/992.txt new file mode 100644 index 00000000000..de71db15433 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/992.txt @@ -0,0 +1,15 @@ +ਨਵਾਂ +• ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਵਿੱਚ ਗਾਹਕਾਂ ਦੀ ਗਿਣਤੀ +• ਕਤਾਰ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਇੱਕ ਪਲੇਅਲਿਸਟ ਥੰਮਨੇਲ ਪੱਕੇ ਤੌਰ 'ਤੇ ਸੈੱਟ ਕਰੋ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਪ੍ਰੈੱਸ ਕਰਨ ਵਾਲੇ ਹੈਸ਼ਟੈਗ ਅਤੇ ਲਿੰਕ +• ਕਾਰਡ ਦ੍ਰਿਸ਼ ਮੋਡ + +ਸੁਧਾਰ +• ਵੱਡਾ ਮਿੰਨੀ-ਪਲੇਅਰ ਬੰਦ ਬਟਨ +• ਮੁਲਾਇਮ ਥੰਮਨੇਲ ਡਾਊਨਸਕੇਲਿੰਗ +• ਟਾਰਗੇਟ ਐਂਡਰਾਇਡ 13 (ਏਪੀਆਈ 33) +• ਹੁਣ ਪਲੇਅਰ ਸੀਕ ਕਰਨ ਤੇ ਰੁਕਦਾ ਨਹੀਂ +• DeX/ਮਾਊਸ 'ਤੇ ਓਵਰਲੇਅ ਨੂੰ ਫਿਕਸ ਕਰੋ +• ਬਿਨਾਂ ਕਿਸੇ ਵੱਖਰੇ ਆਡੀਓ ਸਟ੍ਰੀਮ ਦੇ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਨੂੰ ਚਲਾਉਣ ਦਿਓ +• ਵੱਖ-ਵੱਖ ਯੂਟਿਊਬ ਫਿਕਸ ਅਤੇ ਹੋਰ… diff --git a/fastlane/metadata/android/pa/changelogs/993.txt b/fastlane/metadata/android/pa/changelogs/993.txt new file mode 100644 index 00000000000..e8395072464 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/993.txt @@ -0,0 +1,12 @@ +ਨਵਾਂ +• ਪਲੇਲਿਸਟ ਡੁਪਲੀਕੇਟ ਜੋੜਨ ਵੇਲੇ ਚੇਤਾਵਨੀ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਹਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ +• ਹਾਰਡਵੇਅਰ ਬਟਨਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ +• ਫੀਡ ਵਿੱਚ ਅੰਸ਼ਕ ਤੌਰ 'ਤੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਲੁਕਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ + +ਸੁਧਾਰ +• ਵੱਡੀਆਂ ਸਕ੍ਰੀਨਾਂ 'ਤੇ ਹੋਰ ਗਰਿੱਡ ਕਾਲਮਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ +• ਪ੍ਰਗਤੀ ਸੂਚਕਾਂ ਨੂੰ ਸੈਟਿੰਗਾਂ ਦੇ ਨਾਲ ਇਕਸਾਰ ਬਣਾਓ + +ਠੀਕ ਕੀਤੇ +• Android 11 'ਤੇ ਖੋਲ੍ਹਣ ਵਾਲੇ ਬ੍ਰਾਊਜ਼ਰ URL, ਡਾਊਨਲੋਡ ਅਤੇ ਬਾਹਰੀ ਪਲੇਅਰ ਨੂੰ ਠੀਕ ਕਰੋ +• MIUI 'ਤੇ ਦੋ ਟੈਪਾਂ ਦੀ ਲੋੜ ਵਾਲੀ ਪੂਰੀ ਸਕ੍ਰੀਨ ਨਾਲ ਇੰਟਰੈਕਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ 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/changelogs/995.txt b/fastlane/metadata/android/pa/changelogs/995.txt new file mode 100644 index 00000000000..0da0a4261b1 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/995.txt @@ -0,0 +1,16 @@ +ਨਵਾਂ +• ਚੈਨਲ ਟੈਬਾਂ ਦਾ ਸਮਰਥਨ ਕਰੋ +• ਚਿੱਤਰ ਗੁਣਵੱਤਾ ਚੁਣੋ +• ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਲਈ URL ਪ੍ਰਾਪਤ ਕਰੋ + +ਸੁਧਾਰ +• ਪਲੇਅਰ ਇੰਟਰਫੇਸ ਦੀ ਪਹੁੰਚਯੋਗਤਾ +• ਸਿਰਫ਼-ਵੀਡੀਓ ਡਾਊਨਲੋਡਾਂ ਲਈ ਬਿਹਤਰ ਆਡੀਓ ਚੋਣ +• ਸਾਂਝੀ ਕੀਤੀ ਪਲੇਲਿਸਟ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਵਿਕਲਪ + +ਠੀਕ ਕੀਤੇ +• [ਯੂਟਿਊਬ] ਲਾਈਕ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +• ਪਲੇਅਰ ਰਿਸਪੌੰਡ ਨਹੀਂ ਕਰ ਰਿਹਾ ਦੇ ਸੁਨੇਹੇ ਦੇਣ ਵਾਲੇ ਪੌਪਅੱਪ ਅਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਵਿੱਚ ਗਲਤ ਭਾਸ਼ਾਵਾਂ ਦੀ ਚੋਣ +• ਪਲੇਅਰ ਆਡੀਓ ਫੋਕਸ ਮਿਊਟ ਦਾ ਆਦਰ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ +• ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕਦੇ-ਕਦਾਈਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/996.txt b/fastlane/metadata/android/pa/changelogs/996.txt new file mode 100644 index 00000000000..ac5940bc333 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/996.txt @@ -0,0 +1,2 @@ +media.ccc.de ਵਿੱਚ ਇੱਕ ਚੈਨਲ / ਕਾਨਫਰੰਸ ਖੋਲ੍ਹਣ ਵੇਲੇ ਇੱਕ NullPointerException ਫਿਕਸ ਕੀਤਾ ਗਿਆ। +ਗ੍ਰਿੰਚ ਨੇ ਤੁਹਾਡੇ ਲਈ ਸਾਡੇ ਕ੍ਰਿਸਮਸ ਤੋਹਫ਼ੇ ਨੂੰ ਤੋੜਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ, ਪਰ ਅਸੀਂ ਇਸਨੂੰ ਠੀਕ ਕਰ ਦਿੱਤਾ। diff --git a/fastlane/metadata/android/pa/changelogs/997.txt b/fastlane/metadata/android/pa/changelogs/997.txt new file mode 100644 index 00000000000..8e0cb85f202 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/997.txt @@ -0,0 +1,17 @@ +ਨਵਾਂ +• ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਸ਼ਾਮਿਲ ਕਰੋ +• ਪਲੇਲਿਸਟਸ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰਨ ਦਿਓ +• ਪਲੇਲਿਸਟ ਵਰਣਨ ਅਤੇ ਮਿਆਦ ਦਿਖਾਓ +• ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦਿਓ + +ਸੁਧਾਰ +• [ਐਂਡਰੌਇਡ 13+] ਕਸਟਮ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਿਰਿਆਵਾਂ ਨੂੰ ਮੁੜ ਲਾਗੂ ਕਰੋ +• ਅੱਪਡੇਟ ਜਾਂਚ ਲਈ ਸਹਿਮਤੀ ਦੀ ਬੇਨਤੀ ਕਰੋ +• ਬਫਰਿੰਗ ਦੌਰਾਨ ਨੋਟੀਫਿਕੇਸ਼ਨ ਤੋਂ ਚਲਾਉਣ/ਰੋਕਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ +• ਕੁਝ ਸੈਟਿੰਗਾਂ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• [ਯੂਟਿਊਬ] ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਠੀਕ ਕਰੋ, ਨਾਲ ਹੀ ਹੋਰ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ +• ਸੈਟਿੰਗਾਂ ਆਯਾਤ ਕਰਨ ਵਿੱਚ ਕਮਜ਼ੋਰੀ ਨੂੰ ਹੱਲ ਕਰੋ ਅਤੇ JSON 'ਤੇ ਸਵਿੱਚ ਕਰੋ +• ਕਈ ਡਾਊਨਲੋਡ ਫਿਕਸ +• ਖੋਜ ਟੈਕਸਟ ਨੂੰ ਟਰਿੱਮ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/998.txt b/fastlane/metadata/android/pa/changelogs/998.txt new file mode 100644 index 00000000000..6b3482fd443 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/998.txt @@ -0,0 +1,4 @@ +HTTP 403 ਤਰੁੱਟੀਆਂ ਕਾਰਨ ਯੂਟਿਊਬ ਕਿਸੇ ਵੀ ਸਟ੍ਰੀਮ ਨੂੰ ਨਹੀਂ ਚਲਾ ਰਿਹਾ ਠੀਕ ਕੀਤਾ ਗਿਆ। + +ਯੂਟਿਊਬ ਵੀਡੀਓ ਦੇ ਮੱਧ ਵਿੱਚ ਕਦੇ-ਕਦਾਈਂ HTTP 403 ਤਰੁੱਟੀਆਂ ਅਜੇ ਹੱਲ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ। +ਇਸ ਮੁੱਦੇ ਨੂੰ ਜਿੰਨੀ ਜਲਦੀ ਹੋ ਸਕੇ ਇੱਕ ਹੋਰ ਹੌਟਫਿਕਸ ਰਿਲੀਜ਼ ਵਿੱਚ ਹੱਲ ਕੀਤਾ ਜਾਵੇਗਾ। diff --git a/fastlane/metadata/android/pa/changelogs/999.txt b/fastlane/metadata/android/pa/changelogs/999.txt new file mode 100644 index 00000000000..f4e29ec82fb --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/999.txt @@ -0,0 +1,12 @@ +ਇਹ ਹੌਟਫਿਕਸ ਰੀਲੀਜ਼ YouTube ਵੀਡੀਓਜ਼ ਦੇ ਵਿਚਕਾਰ HTTP 403 ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹੈ। + +ਨਵਾਂ +• [SoundCloud] on.soundcloud.com URL ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰੋ + +ਸੁਧਾਰਿਆ ਗਿਆ +• [ਬੈਂਡਕੈਂਪ] ਰੇਡੀਓ ਕਿਓਸਕ ਵਿੱਚ ਵਾਧੂ ਜਾਣਕਾਰੀ ਵਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• [YouTube] ਕਦੇ-ਕਦਾਈਂ HTTP 403 ਤਰੁੱਟੀਆਂ ਨੂੰ ਵੀਡੀਓ ਦੇ ਸ਼ੁਰੂ ਵਿੱਚ ਜਾਂ ਮੱਧ ਵਿੱਚ ਠੀਕ ਕਰੋ +• [YouTube] ਹੋਰ ਚੈਨਲ ਹੈਡਰ ਕਿਸਮਾਂ ਤੋਂ ਅਵਤਾਰ ਅਤੇ ਬੈਨਰ ਐਕਟਰੈਕਟ ਕਰੋ +• [ਬੈਂਡਕੈਂਪ] ਵੱਖ-ਵੱਖ ਬੱਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਹਮੇਸ਼ਾ HTTPS ਦੀ ਵਰਤੋਂ ਕਰੋ 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/1000.txt b/fastlane/metadata/android/pl/changelogs/1000.txt new file mode 100644 index 00000000000..7246dc7dadf --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/1000.txt @@ -0,0 +1,13 @@ +Ulepszone +• Możliwość naciskania opisu playlisty, aby wyśw. więcej/mniej treści +• [PeerTube] Automat. obsługa linków instancji `subscribeto.me` +• Rozpocz. odtwarzania tylko jednej pozycji na ekranie historii + +Naprawione +• Widoczność przycisku RSS +• Awarie podglądu paska przewijania +• Dodaw. do playlisty elementu bez miniatury +• Wychodzenie z okna pobierania przed jego wyśw. +• Powiązane pozycje w oknie kolejki +• Kolejność w oknie dodaw. do playlisty +• Dostosowano układ ulubionych pozycji playlist diff --git a/fastlane/metadata/android/pl/changelogs/992.txt b/fastlane/metadata/android/pl/changelogs/992.txt new file mode 100644 index 00000000000..98d0d177375 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/992.txt @@ -0,0 +1,17 @@ +Nowe +• Liczba subskrybentów w szczegółach wideo +• Pobieranie z kolejki +• Ustawianie stałej miniatury playlisty +• Długie naciśnięcie hashtagów i linków +• Tryb widoku karty + +Ulepszone +• Większy przycisk zamykania miniodtwarzacza +• Płynniejsze zmniejszanie miniatur +• Docelowy system Android 13 (API 33) +• Przewijanie nie wstrzymuje już odtwarzacza + +Naprawione +• Nakładka dla DeX/myszy +• Zezwalanie na odtwarzanie w tle bez oddzielnych strumieni audio +• Różne poprawki YouTube i więcej… diff --git a/fastlane/metadata/android/pl/changelogs/993.txt b/fastlane/metadata/android/pl/changelogs/993.txt new file mode 100644 index 00000000000..a24d4077eaa --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/993.txt @@ -0,0 +1,12 @@ +Nowe +• Ostrzeż. podczas dodaw. duplikatów playlist i przycisk, aby je usunąć +• Opcja ignorow. przycisków sprzęt. +• Opcja ukryw. częściowo obejrzanych wideo w kanale + +Ulepszone +• Używ. więcej kol. siatki na dużych ekranach +• Ujednol. wskaź. postępu z ustawieniami + +Naprawione +• Otwier. URL-i przeglądarki, pobranych i zew. odtwarzaczy na Androidzie 11+ +• Interakcja z trybem pełnoekr. wymagającym dwóch naciśnięć na MIUI 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/pl/changelogs/995.txt b/fastlane/metadata/android/pl/changelogs/995.txt new file mode 100644 index 00000000000..3a227a3eaa4 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/995.txt @@ -0,0 +1,16 @@ +Nowe +• Obsługa kart kanałów +• Wybór jakości obrazów +• Uzyskiwanie adresów URL do wszystkich obrazów + +Ulepszone +• Dostępność UI odtwarzacza +• Lepszy wybór dźwięku dla pobierania tylko wideo +• Opcja uwzględ. nazw playlist i wideo do udostęp. zawartości playlisty + +Naprawione +• [YouTube] Liczba polubień +• Zawieszone wysk. okienka i awarie odtwarzacza +• Błędne wybory w selektorze języków +• Skupienie na dźwięku odtwarzacza nie uwzględ. wyciszenia +• Czasami niedziałające dodawanie pozycji do playlisty diff --git a/fastlane/metadata/android/pl/changelogs/997.txt b/fastlane/metadata/android/pl/changelogs/997.txt new file mode 100644 index 00000000000..24a300ec91f --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/997.txt @@ -0,0 +1,17 @@ +Nowe +• Odpowiadanie na komentarze +• Zmiana kolejności playlist +• Pokazyw. opisu i czasu trwania playlist +• Reset ustawień + +Ulepszone +• [Android 13+] Przywrócono niestand. akcje powiadomień +• Prośba o zgodę na sprawdzanie aktualizacji +• Odtw./wstrzym. powiadomień podczas bufor. +• Zmiana kolejność niektórych ustawień + +Naprawione +• [YouTube] Nieładujące się komentarze i inne poprawki i ulepszenia +• Luka w imporcie ustawień i przełączaniu na JSON +• Różne poprawki pobierania +• Przycięto wyszuk. tekst diff --git a/fastlane/metadata/android/pt-BR/changelogs/1000.txt b/fastlane/metadata/android/pt-BR/changelogs/1000.txt new file mode 100644 index 00000000000..7f89cd9b2c5 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1000.txt @@ -0,0 +1,13 @@ +Melhorado +• Torne a descrição da lista de reprodução clicável para mostrar mais / menos conteudo +• [PeerTube] Gerênciar links de instâncias `subscribeto.me` automaticamente +• Começar a reprodução apenas de um item na tela de histórico + +Corrigido +• Corrigir visibilidade do botão RSS +• Corrigir falhas na pré-visualização da barra de busca +• Corrigir erro ao adicionar item sem miniatura à playlist +• Corrigir erro ao sair da caixa de diálogo de descarregar antes de ela aparecer +• Corrigir itens relacionados ao pop-up de colocar na fila +• Corrigir a ordem no diálogo de adicionar à lista de reprodução +• Ajustar o layout do item de marcador de lista de reprodução diff --git a/fastlane/metadata/android/pt-BR/changelogs/64.txt b/fastlane/metadata/android/pt-BR/changelogs/64.txt index 74205f9baae..4497e39658c 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/64.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/64.txt @@ -1,8 +1,8 @@ ### Melhorias -- Adicionada a capacidade de limitar a qualidade do vídeo ao usar dados móveis. # 1339 -- Lembra-se do brilho da sessão # 1442 -- Melhora o desempenho de download em CPUs mais fracas # 1431 -- Adiciona suporte (funcionando) à sessão de mídia # 1433 +- Adiciona o recurso de limitar a qualidade do vídeo ao usar dados móveis. #1339 +- Mantém o brilho da sessão #1442 +- Melhora o desempenho para baixar em CPU mais fracas #1431 +- Adiciona suporte (funcionando) à sessão de mídia #1433 ### Correção -- Corrige falha ao iniciar downloads (correção agora disponível em versões de lançamento) # 1441 +- Corrige falha ao iniciar Downloads (correção agora disponível em versões de lançamento) # 1441 diff --git a/fastlane/metadata/android/pt-BR/changelogs/65.txt b/fastlane/metadata/android/pt-BR/changelogs/65.txt new file mode 100644 index 00000000000..bd7a638f68e --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/65.txt @@ -0,0 +1,26 @@ +### Melhorias + +- Desabilitar a animação do ícone do burgermenu #1486 +- Desfazer a eliminação de descarregamentos #1472 +- Opção de descarregamento no menu de partilha #1498 +- Opção de partilha adicionada ao menu de toque longo #1454 +- Minimize o jogador principal na saída #1354 +- Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Atualização #1392 + - Retrabalhado a caixa de diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de etapa para uma mudança de velocidade mais rápida. + - Adicionado uma alternância para avanço rápido durante silêncios no controle de velocidade de reprodução. Isso deve ser útil para audiolivros e certos gêneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\) + - Resolução de fonte de média ré fatorada para permitir a passagem de metadados junto com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. + - Correção de metadados de listas de reprodução remotas que não são atualizadas quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberta. + - Várias correções de interface do utilizador : #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso +- Use novo extrator com arquitetura ré fatorada para multisserviço + +### Correções + +- Corrigir #1440 Layout de informações de vídeo quebrado #1491 +- Ver correção de histórico #1497 + - #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o usuário acessar a lista de reprodução. + - #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes. +- Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640) +- Correção do reprodutor de vídeo principal #1509 + [#1412] Corrigido o modo de repetição causando NPE do reprodutor quando uma nova intenção é recebida enquanto a atividade do reprodutor está em segundo plano. + - Corrigida a minimização de reprodutor para pop-up não destrói o reprodutor quando a permissão de pop-up não é concedida. diff --git a/fastlane/metadata/android/pt-BR/changelogs/66.txt b/fastlane/metadata/android/pt-BR/changelogs/66.txt new file mode 100644 index 00000000000..ed84a27599e --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog de v0.13.7 + +### Fixo +- Fixar questões de filtro de ordenação da v0.13.6 + +# Mudança do v0.13.6 + +### Melhorias + +- Desactivar animação de ícones de burgermenu #1486 +- anular a eliminação dos downloads #1472 +- Opção de download no menu de partilha #1498 +- Adicionada a opção de partilha no menu de toque longo #1454 +- Minimizar o jogador principal na saída #1354 +- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Actualização #1392 + - Reformulou o diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de passos para uma mudança de velocidade mais rápida. + - Adicionada uma alternância para avançar rapidamente durante os silêncios no controlo de velocidade de reprodução. Isto deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma verdadeira experiência sem falhas (e pode quebrar uma canção com muitos silêncios =\i1). + - A resolução da fonte dos meios de comunicação foi refeita para permitir a passagem de metadados ao lado dos meios de comunicação internamente no leitor, em vez de o fazer manualmente. Agora temos uma única fonte de metadados e está directamente disponível quando a reprodução começa. + - Fixados os metadados da lista de reprodução remota que não são actualizados quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberto. + - Várias correcções UI: #1383, a notificação do leitor de fundo controla agora sempre branco, mais fácil de desligar o leitor de pop-ups através do fling +- Usar novo extractor com arquitectura refacturada para multiserviços + +### Correcções + +- Reparação #1440 Layout de Informação de Vídeo Partido #1491 +- Ver histórico correcção #1497 + - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. + - #1475, através do registo de uma vista na base de dados quando o utilizador inicia um vídeo no leitor externo sobre fragmento de detalhe. +- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640) +- Correcção principal do leitor de vídeo #1509 + - [#1412] Modo de repetição fixo causando NPE do jogador quando novas intenções são recebidas enquanto a actividade do jogador está em segundo plano. + - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup. diff --git a/fastlane/metadata/android/pt-BR/changelogs/68.txt b/fastlane/metadata/android/pt-BR/changelogs/68.txt new file mode 100644 index 00000000000..1e6c42e01d2 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/68.txt @@ -0,0 +1,31 @@ +# mudanças da v0.14.1 + +### fixo +- Fixo falhou em desencriptar a url de vídeo #1659 +- Ligação de descrição fixa não extraída bem #1657 + +# mudanças de v0.14.0 + +### Novo +- Novo desenho de gaveta #1461 +- Nova página inicial personalizável #1461 + +### Melhorias +- Controlos por gestos retrabalhados #1604 +- Nova forma de fechar o leitor de popup #1597 + +### Fixa +- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649. + - Mostrar "Contagem de subscritores não disponível" nesses casos +- Consertar NPE quando uma lista de reprodução do YouTube está vazia +- Correcção rápida para os quiosques em SoundCloud +- Refactor e correcção de bugs #1623 + - Resultado de pesquisa cíclica reparada #1562 + - Barra de procura fixa não estática + - Os vídeos do YT Premium não estão bloqueados correctamente + - Vídeos Fixos por vezes não carregados (devido à análise do DASH) + - Corrigir ligações na descrição vídeo + - Mostrar aviso quando alguém tenta descarregar para sdcard externo + - nada de excepção mostrado dispara o relatório + - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Correcção do registo do receptor de radiodifusão. Fecha #1641. diff --git a/fastlane/metadata/android/pt-BR/changelogs/69.txt b/fastlane/metadata/android/pt-BR/changelogs/69.txt new file mode 100644 index 00000000000..fa7d5d85cda --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/69.txt @@ -0,0 +1,19 @@ +#### Novo +- Eliminação de longa duração e partilha de subscrições #1516 +- Tabela UI e esquema de lista de grelha #1617 + +### Melhorias +- armazenar e recarregar a última relação de aspeto utilizada #1748 +- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 +- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 +- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 +- Configurações separadas para os gestos de volume e luminosidade #1644 +- Adicionar apoio à Localização #1792 + +### Correções +- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia +- Contagem fixa de assinaturas +- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830 + +### Bugs conhecidos +- O estado de reprodução não pode ser guardado no Android P diff --git a/fastlane/metadata/android/pt-BR/changelogs/70.txt b/fastlane/metadata/android/pt-BR/changelogs/70.txt new file mode 100644 index 00000000000..61de40666ef --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/70.txt @@ -0,0 +1,25 @@ +Atenção: esta versão é provavelmente um bugfest, tal como a última. No entanto, devido ao desligamento total desde o 17. uma versão quebrada é melhor do que nenhuma versão. Certo? ¯\_(ツ)_/¯ + +### Melhoria +* os arquivos baixados agora podem ser abertos com um clique #1879 +* suporte drop para android 4.1-4.3 #1884 +* remover jogador antigo #1884 +* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 +* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 +* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy + * Infra-estruturas de pós-processamento + * Tratamento adequado de erros "infraestrutura" (para downloader) + * Fila em vez de vários downloads + * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo + * Implementar nova tentativa máxima de download + * Pausa adequada para o download de vários segmentos + * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2) + * Salve a contagem de threads para os próximos downloads + * Muitas incoerências corrigidas + +### Corrigido +* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835 +* falha do jogador pop-up corrigida #1874 +* NPE ao tentar abrir o jogador de fundo #1901 +* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878 +* Corrigido o problema decypering shuttown diff --git a/fastlane/metadata/android/pt-BR/changelogs/71.txt b/fastlane/metadata/android/pt-BR/changelogs/71.txt new file mode 100644 index 00000000000..fb525ccccca --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/71.txt @@ -0,0 +1,10 @@ +### Melhoria +* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush) +* Várias melhorias para o downloader(# 1944 por @kapodamy): + * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones + * verifique se o iterador foi inicializado (correções #2031) + * * permitir novas tentativas de downloads com erro "Falha no pós-processamento" no novo mixer + * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039) + +### Corrigido +* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username) diff --git a/fastlane/metadata/android/pt-BR/changelogs/730.txt b/fastlane/metadata/android/pt-BR/changelogs/730.txt new file mode 100644 index 00000000000..3d3308760bf --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/730.txt @@ -0,0 +1,2 @@ +# Corrigido +- Erro na função de desencriptação novamente corrigido quente. diff --git a/fastlane/metadata/android/pt-BR/changelogs/740.txt b/fastlane/metadata/android/pt-BR/changelogs/740.txt new file mode 100644 index 00000000000..d591eda53e0 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/740.txt @@ -0,0 +1,23 @@ +< H4 > melhorias< / h4> +< ul> +< li>tornar os links nos comentários clicáveis, aumentar o tamanho do texto< / li> +< li>procurar ao clicar em links de carimbo de data/hora nos comentários< / li> +< li>mostrar a guia preferida com base no estado selecionado recentemente< / li> +< li>adicionar lista de reprodução à fila ao clicar longamente em & # 39;fundo& # 39; na janela da lista de reprodução< / li> +< li>procurar texto partilhado quando não é um URL< / li> +< li>adicionar o botão"Partilhar no momento atual & quot; ao leitor de vídeo principal< / li> +< li>adicionar botão fechar ao leitor principal quando terminar a fila de vídeo< / li> +< li>Adicionar & quot;Reproduzir diretamente em segundo plano & quot; ao menu longpress para itens da lista de vídeos< / li> +< li>melhorar as traduções em Inglês para comandos Play / Enqueue< / li> +< li>pequenas melhorias de desempenho< / li> +< li>remover ficheiros não utilizados < / li> +< li>Atualizar o ExoPlayer para 2.9.6< / li> +< li>adicionar suporte para links ofensivos< / li> +< / ul> +

    fixo < /h4> +< ul> +< li>rolagem fixa com comentários e fluxos relacionados desativados < / li> +< li>Corrigido CheckForNewAppVersionTask sendo executado quando deveria & # 39; t< / li> +< li>importação de assinatura fixa do youtube: ignore aqueles com url inválido e mantenha aqueles com título vazio< / li> +< li>corrigir URL inválido do YouTube: o nome da marca de assinatura nem sempre é "Assinatura", impedindo o carregamento de fluxos< / li> +< / ul> diff --git a/fastlane/metadata/android/pt-BR/changelogs/750.txt b/fastlane/metadata/android/pt-BR/changelogs/750.txt new file mode 100644 index 00000000000..25f0c1dbfdc --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/750.txt @@ -0,0 +1,22 @@ +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar meta dados da fila de reprodução #2453 +* [*[SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170 +* [*[YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177 diff --git a/fastlane/metadata/android/pt-BR/changelogs/760.txt b/fastlane/metadata/android/pt-BR/changelogs/760.txt new file mode 100644 index 00000000000..113a92615f7 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/760.txt @@ -0,0 +1,43 @@ +Alterações em 0.17.1 + +Novo +* Localização tailandesa + + +Melhorado +* Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518 +* Adicionar interruptor para SAF / legacy file picker #2521 + +Corrigido +* Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487 +* Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado +* Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517 +* [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186 +* [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185 + + + +Alterações em 0.17.0 + +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar metadados da fila de reprodução #2453 +* [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170 +* [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt-BR/changelogs/770.txt b/fastlane/metadata/android/pt-BR/changelogs/770.txt new file mode 100644 index 00000000000..d53963daa82 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/770.txt @@ -0,0 +1,4 @@ +Mudanças no 0.47.2 + +Consertado +• Consertado, nenhum vídeo estava disponível diff --git a/fastlane/metadata/android/pt-BR/changelogs/780.txt b/fastlane/metadata/android/pt-BR/changelogs/780.txt new file mode 100644 index 00000000000..61392c0df56 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/780.txt @@ -0,0 +1,12 @@ +Alterações em 0.17.3 + +Melhorado +- Adicionada opção para limpar estados de reprodução #2550 +- Mostrar diretórios ocultos no seletor de ficheiros #2591 +- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 +- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Corrigido +- [YouTube] Fixo 'java.lang.IllegalArgumentException #192 +- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195 +- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592 diff --git a/fastlane/metadata/android/pt-BR/changelogs/790.txt b/fastlane/metadata/android/pt-BR/changelogs/790.txt new file mode 100644 index 00000000000..f1b3a2dd98c --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/790.txt @@ -0,0 +1,14 @@ +Melhorado +- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655 +- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637 + +Fixa +- Verificar se o último byte no bloco é descarregado #2646 +- Rolagem fixa em fragmento de detalhe de vídeo #2672 +- Remover a dupla pesquisa de animações de caixa transparente para uma #2695 +- Fixar extracção client_id #2745 + +Desenvolvimento +- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535 +- Migrar para AndroidX #2685 +- Actualização para ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/pt-BR/changelogs/800.txt b/fastlane/metadata/android/pt-BR/changelogs/800.txt new file mode 100644 index 00000000000..1b6ec1a4c7c --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/800.txt @@ -0,0 +1,27 @@ +Novo +- Suporte PeerTube sem P2P (#2201) [Beta]: + ◦ Ver e descarregar vídeos de instâncias do PeerTube + ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube + ◦ Pode haver problemas com apertos de mão SSL no Android 4.4 e 7.1 quando o acesso a certos casos resulta num erro de rede. + +- Downloader (#2679): + ◦ Calcular ETA de descarregamento + ◦ Descarregar opus (ficheiros webm) como ogg + ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa + +Melhorado +- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742 +- Utilizar novas implementações de Localização e Downloader do extractor #2713 +- Tornar o fio "Quiosque por defeito" traduzível +- Barra de navegação preta para o tema preto #2569 + +Fixa +- Corrigido um bug que não podia mover o leitor de popup se outro dedo fosse colocado enquanto se movia o leitor de popup #2772 +- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219 +- Habilitação de TLS1.1/1.2 em dispositivos Android 4.4 (API 19/KitKat) para corrigir o aperto de mão de TLS com MediaCCC e algumas instâncias PeerTube #2792 +- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217 +- Fixar a extracção do fluxo de áudio + +Desenvolvimento +- Atualizar ExoPlayer para 2.10.8 #2791, #2816 +- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714 diff --git a/fastlane/metadata/android/pt-BR/changelogs/810.txt b/fastlane/metadata/android/pt-BR/changelogs/810.txt new file mode 100644 index 00000000000..3cb60e434ae --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/810.txt @@ -0,0 +1,19 @@ +Novo +- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo + +Melhorado +- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup +- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador +- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo +- Adicionar miniatura de miniatura para listas de reprodução locais vazias +- Use a extensão de ficheiro *.opus em vez de *.webm e mostre "opus" na etiqueta de formato em vez de "WebM Opus" no menu pendente de download +- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em "Downloads +- [YouTube] Adicionar suporte a /c/shortened_url channel links + +Fixa +- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos +- Acesso fixo do jogador fora do seu fio de criação +- Paginação fixa de resultados de pesquisa +- Ligar nulo fixo causando NPE +- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us +- ClientCloud] Client_id actualizado diff --git a/fastlane/metadata/android/pt-BR/changelogs/820.txt b/fastlane/metadata/android/pt-BR/changelogs/820.txt new file mode 100644 index 00000000000..facd023039b --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/820.txt @@ -0,0 +1 @@ +Nome da função descodificar regex corrigido, que tornava o YouTube inutilizável. diff --git a/fastlane/metadata/android/pt-BR/changelogs/830.txt b/fastlane/metadata/android/pt-BR/changelogs/830.txt new file mode 100644 index 00000000000..acc38a95d23 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/830.txt @@ -0,0 +1 @@ +Atualização do client_id SoundCloud para corrigir problemas do SoundCloud. diff --git a/fastlane/metadata/android/pt-BR/changelogs/840.txt b/fastlane/metadata/android/pt-BR/changelogs/840.txt new file mode 100644 index 00000000000..4ee1d8ab395 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/840.txt @@ -0,0 +1,22 @@ +Novo +- Adicionado o seletor de língua para alterar a língua da aplicação +- Adicionado enviar para o botão Kodi ao menu desmontável do leitor +- Capacidade adicional de copiar comentários sobre imprensa longa + +Melhorado +- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos +- Removido o ponto-menu a favor da gaveta e botão esconder histórico quando o histórico do relógio não está ativado nas definições +- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores +- Renomear playlist local através de um clique longo em BookmarkFragment +- Vários melhoramentos do PeerTube +- Melhorou várias cadeias de caracteres em inglês + +Fixa +- Jogador fixo a recomeçar, embora seja pausado quando a opção "minimizar no comutador da aplicação" é ativada e o NewPipe é minimizado +- Fixar o valor de brilho inicial para o gesto +- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha +- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF +- Descarregamento fixo no Android KitKat +- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio +- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados +- Os carimbos temporais em descrição podem ser clicados novamente diff --git a/fastlane/metadata/android/pt-BR/changelogs/850.txt b/fastlane/metadata/android/pt-BR/changelogs/850.txt new file mode 100644 index 00000000000..d5e7f5dbafb --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/850.txt @@ -0,0 +1 @@ +Neste lançamento, a versão do site do YouTube FOI foi atualizada. A versão Antiga do site será interrompida EM março, portanto, é obrigado a atualizar o NewPipe. diff --git a/fastlane/metadata/android/pt-BR/changelogs/860.txt b/fastlane/metadata/android/pt-BR/changelogs/860.txt new file mode 100644 index 00000000000..a02b2c77a3a --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/860.txt @@ -0,0 +1,7 @@ +Melhorado +- Gravar e restaurar se o tom e o tempo estão desengatados ou não +- Recorte de exibição de suporte no jogador +- Vista redonda e contagem de subscritores +- YouTube otimizado para usar menos dados + +Mais de 15 bugs relacionados ao YouTube foram corrigidos nesta versão. diff --git a/fastlane/metadata/android/pt-BR/changelogs/870.txt b/fastlane/metadata/android/pt-BR/changelogs/870.txt new file mode 100644 index 00000000000..a3387907afb --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/870.txt @@ -0,0 +1,2 @@ +Esta é uma versão hotfix que atualiza o NewPipe a permitir a utilização do SoundCloud sem grandes incómodos novamente. +A API v2 do SoundCloud é agora utilizada no extrator e a deteção de IDs de clientes inválidos foi melhorada. diff --git a/fastlane/metadata/android/pt-BR/changelogs/900.txt b/fastlane/metadata/android/pt-BR/changelogs/900.txt new file mode 100644 index 00000000000..298a1b790ea --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/900.txt @@ -0,0 +1,14 @@ +Novo +- Grupos de assinaturas e feeds ordenados +- Botão de mudo nos reprodutores + +Melhorado +- Permitir a abertura de ligações music.youtube.com e media.ccc.de em NewPipe +- Mudar duas configurações do Appearance para o Content +- Esconder 5, 15, 25 segundos de opções de busca se a busca inexata estiver ativada + +Fixo +- alguns vídeos do WebM não são procurados +- backup do banco de dados no Android P +- falhar ao compartilhar um ficheiro descarregado +- muitos problemas de extração no YouTube e mais ... diff --git a/fastlane/metadata/android/pt-BR/changelogs/910.txt b/fastlane/metadata/android/pt-BR/changelogs/910.txt new file mode 100644 index 00000000000..2cc9e7f261f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/910.txt @@ -0,0 +1 @@ +Migração do banco de dados corrigida que impediu que NewPipe iniciasse em alguns casos raros. diff --git a/fastlane/metadata/android/pt-BR/changelogs/920.txt b/fastlane/metadata/android/pt-BR/changelogs/920.txt new file mode 100644 index 00000000000..bf11b8226b5 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/920.txt @@ -0,0 +1,9 @@ +Melhorado + +- Data de carregamento e contagem de visualização dos itens da grelha de fluxo adicionada +- Melhorias para o layout do cabeçalho da gaveta + +Correções + +- O botão de silenciamento causando falhas na API 19 corrigido +- Descarregar de vídeos longos 1080p 60fps corrigido diff --git a/fastlane/metadata/android/pt-BR/changelogs/930.txt b/fastlane/metadata/android/pt-BR/changelogs/930.txt new file mode 100644 index 00000000000..1ded9e8870f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/930.txt @@ -0,0 +1,19 @@ +Novo +- Pesquisa no YouTube Música +- Suporte básico de TV Android + +Melhorado +- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local +- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar +- Reprodutor popup melhorado redimensionado com gestos de beliscão +- Enqueue streams em fundo e botões de popup no canal +- Melhor manuseamento do tamanho do título do cabeçalho da gaveta + +Fixa +- Definição de conteúdo com restrição de idade fixa não funciona +- Fixação de certos tipos de reCAPTCHAs +- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é "nula". +- Deteção fixa de exceções relacionadas com a rede +- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições + +e mais diff --git a/fastlane/metadata/android/pt-BR/changelogs/940.txt b/fastlane/metadata/android/pt-BR/changelogs/940.txt new file mode 100644 index 00000000000..d88c8d1f39d --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/940.txt @@ -0,0 +1,16 @@ +Novo +• Suporte para comentários SoundCloud +• Modo restrito - YouTub +• Mostrar detalhes do canal interligado - PeerTube + +Melhorado +• Mostar botão Kore apenas nos serviços suportados +• Bloquear gestos que começam nas barras de navegção ou estado +• Cor de fundo dos botões Tentar e Subscrever baseada na cor do serviço + +Corrigido +• Bloqueio da evolução de transferência +• Botão abrir browser +• Erro ao abri videos "não é possível reproduzir..." + +e outros diff --git a/fastlane/metadata/android/pt-BR/changelogs/951.txt b/fastlane/metadata/android/pt-BR/changelogs/951.txt new file mode 100644 index 00000000000..c391aa519e9 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/951.txt @@ -0,0 +1,15 @@ +Novo +• Pesquisa de selecionador de assinaturas +• Filtro ao diálogo do grupo de feed +• Ficha de lista de reprodução à página principal +• Avanço/retrocesso rápido na fila de fundo/pop-up de jogadores +• Mostrar sugestão de pesquisa: quis dizer & a mostrar resultado para + +Melhorado +• Não escrever metadados de apps em ficheiros muxed +• Não remover fluxos falhados da fila +• A cor da barra de estado corresponde à da de ferramentas + +Fixo +• Desync de áudio/vídeo +• [PeerTube] Gerir comentários apagados diff --git a/fastlane/metadata/android/pt-BR/changelogs/954.txt b/fastlane/metadata/android/pt-BR/changelogs/954.txt index 449fde5dc93..cd131c16256 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/954.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/954.txt @@ -1,7 +1,7 @@ -fluxo de trabalho do novo aplicativo: reproduza vídeos na página de detalhes, deslize para baixo para minimizar o player -• Notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho -• redimensionamento básico ao usar NewPipe como app de desktop -• mostrar diálogo com opções abertas em caso de URL não suportado -• Melhorada a experiência de sugestão de pesquisa -• Qualidade de vídeo padrão aumentada para 720p60 (player do app) e 480p (pop-up) -• correções de bugs +• Novo recurso: veja vídeos na página de detalhes, deslize para baixo para minimizar o vídeo +• Notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho +• redimensionamento básico ao usar NewPipe como aplicativo de computador +• diálogo com opções abertas se URL não for suportado +• Melhor experiência de sugestão de pesquisa quando não pode ser buscada +• Maior qualidade do vídeo padrão para 720p60 no reprodutor interno e 480p no Pop-up +• correções de falhas e mais (?) diff --git a/fastlane/metadata/android/pt-BR/changelogs/957.txt b/fastlane/metadata/android/pt-BR/changelogs/957.txt new file mode 100644 index 00000000000..e64899c8fc4 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/957.txt @@ -0,0 +1,10 @@ +Unir ações específicas de enfileiramento +Gesto 2 dedos p/ fechar APP +Permitir limpeza de cookies reCAPTCHA +Opção não colorir notific. +Melhorar forma como os detalhes do vídeo são abertos p/ corrigir buffering infinito, comportamento errático ao compartilhar com NewPipe, etc +Acelerar vídeos do YouTube e corrijir restrições etárias +Corrigir falha no avanço/recuo rápido +Não reorganizar listas ao arrastar miniaturas +Lembrar sempre as propriedades pop-up +Adicionar idioma Santali diff --git a/fastlane/metadata/android/pt-BR/changelogs/994.txt b/fastlane/metadata/android/pt-BR/changelogs/994.txt new file mode 100644 index 00000000000..d8e9860511f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/994.txt @@ -0,0 +1,15 @@ +Novo +• Suporte a múltiplas faixas de áudio e idiomas +• Definição de gestos para volume e brilho em qualquer lado da tela +• Suporte para exibir abas principais na parte inferior da tela + +Melhorias +• [Bandcamp] Lida com faixas sob acesso pago + +Corrigido +• [YouTube] erros HTTP 403 para transmissões +• Tela preta ao alternar ao reprodutor a partir da visualização da lista de reprodução +• Vazamento de memória no reprodutor +• [PeerTube] Avatares do carregador e do subcanal foram trocados + +e mais diff --git a/fastlane/metadata/android/pt-BR/changelogs/995.txt b/fastlane/metadata/android/pt-BR/changelogs/995.txt new file mode 100644 index 00000000000..943b842b0b5 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/995.txt @@ -0,0 +1,14 @@ +Novidades +• Suporta abas de canal +• Seleção da qualidade da imagem +• Obtém os URL para todas as imagens + +Melhorias +• Acessibilidade das interfaces do reprodutor +• Pode adicionar nome da lista de reprodução e de vídeo para compartilhamento do conteúdo +• Melhorias internas (?) e atualizações de dependências + +Corrigido +• Seleção de idiomas errados ao selecionar +• O foco do áudio do reprodutor não respeitava o mudo +• Adicionar itens para listas de reprodução não funcionava em casos específicos diff --git a/fastlane/metadata/android/pt-BR/changelogs/998.txt b/fastlane/metadata/android/pt-BR/changelogs/998.txt new file mode 100644 index 00000000000..59fc6a5cdb0 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/998.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir qualquer transmissão diff --git a/fastlane/metadata/android/pt-BR/changelogs/999.txt b/fastlane/metadata/android/pt-BR/changelogs/999.txt new file mode 100644 index 00000000000..59fc6a5cdb0 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/999.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir qualquer transmissão diff --git a/fastlane/metadata/android/pt-PT/changelogs/1000.txt b/fastlane/metadata/android/pt-PT/changelogs/1000.txt new file mode 100644 index 00000000000..3c9f55393b6 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1000.txt @@ -0,0 +1,13 @@ +Melhorado +• Torne a descrição da lista de reprodução clicável para mostrar mais / menos conteudo +• [PeerTube] Gerir links de instâncias `subscribeto.me` automaticamente +• Começar a reprodução apenas de um item na tela de histórico + +Corrigido +• Corrigir visibilidade do botão RSS +• Corrigir falhas na pré-visualização da barra de busca +• Corrigir erro ao adicionar item sem miniatura à playlist +• Corrigir erro ao sair da caixa de diálogo de descarregar antes de ela aparecer +• Corrigir itens relacionados ao pop-up de colocar na fila +• Corrigir a ordem no diálogo de adicionar à lista de reprodução +• Ajustar o layout do item de marcador de lista de reprodução diff --git a/fastlane/metadata/android/pt-PT/changelogs/65.txt b/fastlane/metadata/android/pt-PT/changelogs/65.txt index a72ca3242c8..317b268bee8 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/65.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/65.txt @@ -8,17 +8,17 @@ - Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510 - ExoPlayer 2.8.2 Atualização #1392 - Retrabalhado a caixa de diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de etapa para uma mudança de velocidade mais rápida. -- Adicionado uma alternância para avanço rápido durante silêncios no controlo de velocidade de reprodução. Isso deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\). -- Resolução de fonte de média ré fatorada para permitir a passagem de metadados com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. +- Adicionado uma alternância para avanço rápido durante silêncios no controle de velocidade de reprodução. Isso deve ser útil para audiolivros e certos gêneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\). +- Resolução de fonte de média ré fatorada para permitir a passagem de metadados junto com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. - Correção de metadados de listas de reprodução remotas que não são atualizadas quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberta. -- Várias correções de interface do utilizador: #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso +- Várias correções de interface do utilizador : #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso - Use novo extrator com arquitetura ré fatorada para multisserviço -### Conserta +### Correções - Correção #1440 Layout de informações de vídeo quebrado #1491 -- Ver correção de histórico #1497 -- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o utilizador acessar a lista de reprodução. +-Ver correção de histórico #1497 +- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o usuário acessar a lista de reprodução. - #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes. - Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640) - Correção do reprodutor de vídeo principal #1509 diff --git a/fastlane/metadata/android/pt-PT/changelogs/66.txt b/fastlane/metadata/android/pt-PT/changelogs/66.txt new file mode 100644 index 00000000000..ed84a27599e --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog de v0.13.7 + +### Fixo +- Fixar questões de filtro de ordenação da v0.13.6 + +# Mudança do v0.13.6 + +### Melhorias + +- Desactivar animação de ícones de burgermenu #1486 +- anular a eliminação dos downloads #1472 +- Opção de download no menu de partilha #1498 +- Adicionada a opção de partilha no menu de toque longo #1454 +- Minimizar o jogador principal na saída #1354 +- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Actualização #1392 + - Reformulou o diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de passos para uma mudança de velocidade mais rápida. + - Adicionada uma alternância para avançar rapidamente durante os silêncios no controlo de velocidade de reprodução. Isto deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma verdadeira experiência sem falhas (e pode quebrar uma canção com muitos silêncios =\i1). + - A resolução da fonte dos meios de comunicação foi refeita para permitir a passagem de metadados ao lado dos meios de comunicação internamente no leitor, em vez de o fazer manualmente. Agora temos uma única fonte de metadados e está directamente disponível quando a reprodução começa. + - Fixados os metadados da lista de reprodução remota que não são actualizados quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberto. + - Várias correcções UI: #1383, a notificação do leitor de fundo controla agora sempre branco, mais fácil de desligar o leitor de pop-ups através do fling +- Usar novo extractor com arquitectura refacturada para multiserviços + +### Correcções + +- Reparação #1440 Layout de Informação de Vídeo Partido #1491 +- Ver histórico correcção #1497 + - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. + - #1475, através do registo de uma vista na base de dados quando o utilizador inicia um vídeo no leitor externo sobre fragmento de detalhe. +- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640) +- Correcção principal do leitor de vídeo #1509 + - [#1412] Modo de repetição fixo causando NPE do jogador quando novas intenções são recebidas enquanto a actividade do jogador está em segundo plano. + - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup. diff --git a/fastlane/metadata/android/pt-PT/changelogs/68.txt b/fastlane/metadata/android/pt-PT/changelogs/68.txt new file mode 100644 index 00000000000..1e6c42e01d2 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/68.txt @@ -0,0 +1,31 @@ +# mudanças da v0.14.1 + +### fixo +- Fixo falhou em desencriptar a url de vídeo #1659 +- Ligação de descrição fixa não extraída bem #1657 + +# mudanças de v0.14.0 + +### Novo +- Novo desenho de gaveta #1461 +- Nova página inicial personalizável #1461 + +### Melhorias +- Controlos por gestos retrabalhados #1604 +- Nova forma de fechar o leitor de popup #1597 + +### Fixa +- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649. + - Mostrar "Contagem de subscritores não disponível" nesses casos +- Consertar NPE quando uma lista de reprodução do YouTube está vazia +- Correcção rápida para os quiosques em SoundCloud +- Refactor e correcção de bugs #1623 + - Resultado de pesquisa cíclica reparada #1562 + - Barra de procura fixa não estática + - Os vídeos do YT Premium não estão bloqueados correctamente + - Vídeos Fixos por vezes não carregados (devido à análise do DASH) + - Corrigir ligações na descrição vídeo + - Mostrar aviso quando alguém tenta descarregar para sdcard externo + - nada de excepção mostrado dispara o relatório + - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Correcção do registo do receptor de radiodifusão. Fecha #1641. diff --git a/fastlane/metadata/android/pt-PT/changelogs/69.txt b/fastlane/metadata/android/pt-PT/changelogs/69.txt new file mode 100644 index 00000000000..fa7d5d85cda --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/69.txt @@ -0,0 +1,19 @@ +#### Novo +- Eliminação de longa duração e partilha de subscrições #1516 +- Tabela UI e esquema de lista de grelha #1617 + +### Melhorias +- armazenar e recarregar a última relação de aspeto utilizada #1748 +- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 +- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 +- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 +- Configurações separadas para os gestos de volume e luminosidade #1644 +- Adicionar apoio à Localização #1792 + +### Correções +- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia +- Contagem fixa de assinaturas +- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830 + +### Bugs conhecidos +- O estado de reprodução não pode ser guardado no Android P diff --git a/fastlane/metadata/android/pt-PT/changelogs/70.txt b/fastlane/metadata/android/pt-PT/changelogs/70.txt new file mode 100644 index 00000000000..61de40666ef --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/70.txt @@ -0,0 +1,25 @@ +Atenção: esta versão é provavelmente um bugfest, tal como a última. No entanto, devido ao desligamento total desde o 17. uma versão quebrada é melhor do que nenhuma versão. Certo? ¯\_(ツ)_/¯ + +### Melhoria +* os arquivos baixados agora podem ser abertos com um clique #1879 +* suporte drop para android 4.1-4.3 #1884 +* remover jogador antigo #1884 +* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 +* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 +* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy + * Infra-estruturas de pós-processamento + * Tratamento adequado de erros "infraestrutura" (para downloader) + * Fila em vez de vários downloads + * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo + * Implementar nova tentativa máxima de download + * Pausa adequada para o download de vários segmentos + * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2) + * Salve a contagem de threads para os próximos downloads + * Muitas incoerências corrigidas + +### Corrigido +* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835 +* falha do jogador pop-up corrigida #1874 +* NPE ao tentar abrir o jogador de fundo #1901 +* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878 +* Corrigido o problema decypering shuttown diff --git a/fastlane/metadata/android/pt-PT/changelogs/71.txt b/fastlane/metadata/android/pt-PT/changelogs/71.txt new file mode 100644 index 00000000000..fb525ccccca --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/71.txt @@ -0,0 +1,10 @@ +### Melhoria +* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush) +* Várias melhorias para o downloader(# 1944 por @kapodamy): + * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones + * verifique se o iterador foi inicializado (correções #2031) + * * permitir novas tentativas de downloads com erro "Falha no pós-processamento" no novo mixer + * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039) + +### Corrigido +* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username) diff --git a/fastlane/metadata/android/pt-PT/changelogs/730.txt b/fastlane/metadata/android/pt-PT/changelogs/730.txt index 1378c5d0969..3d3308760bf 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/730.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/730.txt @@ -1,2 +1,2 @@ -# Correções +# Corrigido - Erro na função de desencriptação novamente corrigido quente. diff --git a/fastlane/metadata/android/pt-PT/changelogs/740.txt b/fastlane/metadata/android/pt-PT/changelogs/740.txt new file mode 100644 index 00000000000..d591eda53e0 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/740.txt @@ -0,0 +1,23 @@ +< H4 > melhorias< / h4> +< ul> +< li>tornar os links nos comentários clicáveis, aumentar o tamanho do texto< / li> +< li>procurar ao clicar em links de carimbo de data/hora nos comentários< / li> +< li>mostrar a guia preferida com base no estado selecionado recentemente< / li> +< li>adicionar lista de reprodução à fila ao clicar longamente em & # 39;fundo& # 39; na janela da lista de reprodução< / li> +< li>procurar texto partilhado quando não é um URL< / li> +< li>adicionar o botão"Partilhar no momento atual & quot; ao leitor de vídeo principal< / li> +< li>adicionar botão fechar ao leitor principal quando terminar a fila de vídeo< / li> +< li>Adicionar & quot;Reproduzir diretamente em segundo plano & quot; ao menu longpress para itens da lista de vídeos< / li> +< li>melhorar as traduções em Inglês para comandos Play / Enqueue< / li> +< li>pequenas melhorias de desempenho< / li> +< li>remover ficheiros não utilizados < / li> +< li>Atualizar o ExoPlayer para 2.9.6< / li> +< li>adicionar suporte para links ofensivos< / li> +< / ul> +

    fixo < /h4> +< ul> +< li>rolagem fixa com comentários e fluxos relacionados desativados < / li> +< li>Corrigido CheckForNewAppVersionTask sendo executado quando deveria & # 39; t< / li> +< li>importação de assinatura fixa do youtube: ignore aqueles com url inválido e mantenha aqueles com título vazio< / li> +< li>corrigir URL inválido do YouTube: o nome da marca de assinatura nem sempre é "Assinatura", impedindo o carregamento de fluxos< / li> +< / ul> diff --git a/fastlane/metadata/android/pt-PT/changelogs/750.txt b/fastlane/metadata/android/pt-PT/changelogs/750.txt new file mode 100644 index 00000000000..25f0c1dbfdc --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/750.txt @@ -0,0 +1,22 @@ +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar meta dados da fila de reprodução #2453 +* [*[SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170 +* [*[YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177 diff --git a/fastlane/metadata/android/pt-PT/changelogs/760.txt b/fastlane/metadata/android/pt-PT/changelogs/760.txt new file mode 100644 index 00000000000..113a92615f7 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/760.txt @@ -0,0 +1,43 @@ +Alterações em 0.17.1 + +Novo +* Localização tailandesa + + +Melhorado +* Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518 +* Adicionar interruptor para SAF / legacy file picker #2521 + +Corrigido +* Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487 +* Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado +* Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517 +* [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186 +* [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185 + + + +Alterações em 0.17.0 + +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar metadados da fila de reprodução #2453 +* [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170 +* [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt-PT/changelogs/780.txt b/fastlane/metadata/android/pt-PT/changelogs/780.txt new file mode 100644 index 00000000000..61392c0df56 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/780.txt @@ -0,0 +1,12 @@ +Alterações em 0.17.3 + +Melhorado +- Adicionada opção para limpar estados de reprodução #2550 +- Mostrar diretórios ocultos no seletor de ficheiros #2591 +- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 +- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Corrigido +- [YouTube] Fixo 'java.lang.IllegalArgumentException #192 +- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195 +- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592 diff --git a/fastlane/metadata/android/pt-PT/changelogs/790.txt b/fastlane/metadata/android/pt-PT/changelogs/790.txt new file mode 100644 index 00000000000..f1b3a2dd98c --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/790.txt @@ -0,0 +1,14 @@ +Melhorado +- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655 +- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637 + +Fixa +- Verificar se o último byte no bloco é descarregado #2646 +- Rolagem fixa em fragmento de detalhe de vídeo #2672 +- Remover a dupla pesquisa de animações de caixa transparente para uma #2695 +- Fixar extracção client_id #2745 + +Desenvolvimento +- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535 +- Migrar para AndroidX #2685 +- Actualização para ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/pt-PT/changelogs/800.txt b/fastlane/metadata/android/pt-PT/changelogs/800.txt new file mode 100644 index 00000000000..1b6ec1a4c7c --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/800.txt @@ -0,0 +1,27 @@ +Novo +- Suporte PeerTube sem P2P (#2201) [Beta]: + ◦ Ver e descarregar vídeos de instâncias do PeerTube + ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube + ◦ Pode haver problemas com apertos de mão SSL no Android 4.4 e 7.1 quando o acesso a certos casos resulta num erro de rede. + +- Downloader (#2679): + ◦ Calcular ETA de descarregamento + ◦ Descarregar opus (ficheiros webm) como ogg + ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa + +Melhorado +- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742 +- Utilizar novas implementações de Localização e Downloader do extractor #2713 +- Tornar o fio "Quiosque por defeito" traduzível +- Barra de navegação preta para o tema preto #2569 + +Fixa +- Corrigido um bug que não podia mover o leitor de popup se outro dedo fosse colocado enquanto se movia o leitor de popup #2772 +- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219 +- Habilitação de TLS1.1/1.2 em dispositivos Android 4.4 (API 19/KitKat) para corrigir o aperto de mão de TLS com MediaCCC e algumas instâncias PeerTube #2792 +- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217 +- Fixar a extracção do fluxo de áudio + +Desenvolvimento +- Atualizar ExoPlayer para 2.10.8 #2791, #2816 +- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714 diff --git a/fastlane/metadata/android/pt-PT/changelogs/810.txt b/fastlane/metadata/android/pt-PT/changelogs/810.txt new file mode 100644 index 00000000000..3cb60e434ae --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/810.txt @@ -0,0 +1,19 @@ +Novo +- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo + +Melhorado +- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup +- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador +- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo +- Adicionar miniatura de miniatura para listas de reprodução locais vazias +- Use a extensão de ficheiro *.opus em vez de *.webm e mostre "opus" na etiqueta de formato em vez de "WebM Opus" no menu pendente de download +- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em "Downloads +- [YouTube] Adicionar suporte a /c/shortened_url channel links + +Fixa +- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos +- Acesso fixo do jogador fora do seu fio de criação +- Paginação fixa de resultados de pesquisa +- Ligar nulo fixo causando NPE +- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us +- ClientCloud] Client_id actualizado diff --git a/fastlane/metadata/android/pt-PT/changelogs/840.txt b/fastlane/metadata/android/pt-PT/changelogs/840.txt new file mode 100644 index 00000000000..4ee1d8ab395 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/840.txt @@ -0,0 +1,22 @@ +Novo +- Adicionado o seletor de língua para alterar a língua da aplicação +- Adicionado enviar para o botão Kodi ao menu desmontável do leitor +- Capacidade adicional de copiar comentários sobre imprensa longa + +Melhorado +- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos +- Removido o ponto-menu a favor da gaveta e botão esconder histórico quando o histórico do relógio não está ativado nas definições +- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores +- Renomear playlist local através de um clique longo em BookmarkFragment +- Vários melhoramentos do PeerTube +- Melhorou várias cadeias de caracteres em inglês + +Fixa +- Jogador fixo a recomeçar, embora seja pausado quando a opção "minimizar no comutador da aplicação" é ativada e o NewPipe é minimizado +- Fixar o valor de brilho inicial para o gesto +- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha +- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF +- Descarregamento fixo no Android KitKat +- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio +- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados +- Os carimbos temporais em descrição podem ser clicados novamente diff --git a/fastlane/metadata/android/pt-PT/changelogs/930.txt b/fastlane/metadata/android/pt-PT/changelogs/930.txt new file mode 100644 index 00000000000..1ded9e8870f --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/930.txt @@ -0,0 +1,19 @@ +Novo +- Pesquisa no YouTube Música +- Suporte básico de TV Android + +Melhorado +- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local +- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar +- Reprodutor popup melhorado redimensionado com gestos de beliscão +- Enqueue streams em fundo e botões de popup no canal +- Melhor manuseamento do tamanho do título do cabeçalho da gaveta + +Fixa +- Definição de conteúdo com restrição de idade fixa não funciona +- Fixação de certos tipos de reCAPTCHAs +- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é "nula". +- Deteção fixa de exceções relacionadas com a rede +- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições + +e mais diff --git a/fastlane/metadata/android/pt-PT/changelogs/952.txt b/fastlane/metadata/android/pt-PT/changelogs/952.txt index 93724fdaee9..0a31a12e70b 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/952.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/952.txt @@ -1,7 +1,7 @@ Melhorado -- O autoplay está disponível para todos os serviços (em vez de apenas para o YouTube) +• A reprodução automática está disponível para todos os serviços (em vez de apenas para o YouTube) -Correções -- Fluxos relacionados corrigidos, a apoiar as novas continuações do YouTube -- Vídeos do YouTube com restrição de idade corrigido -- [Android TV] Foco e sobreposição de destaque prolongado corrigidos +Corrigido +• Transmissões relacionadas, permintindo novas continuações do YouTube +• Restrições etárias em videos do YouTube +• [Android TV] Foco e sobreposição de destaque prolongado corrigidos diff --git a/fastlane/metadata/android/pt-PT/changelogs/953.txt b/fastlane/metadata/android/pt-PT/changelogs/953.txt index dd3b4bf2b41..923f5f8b198 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/953.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/953.txt @@ -1 +1 @@ -Conserta a extração da função de desencriptação do YouTube. +Correção da extração da função de desencriptação do YouTube. diff --git a/fastlane/metadata/android/pt-PT/changelogs/954.txt b/fastlane/metadata/android/pt-PT/changelogs/954.txt index 1da36f6fa29..3d519962187 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/954.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/954.txt @@ -1,9 +1,9 @@ -• fluxo de trabalho da app nova: reproduz vídeos na página de detalhes, deslize para baixo para minimizar o reprodutor -• notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho -• redimensionamento básico ao usar NewPipe como app de desktop +• novo fluxo de trabalho da app: reproduz vídeos na página de detalhes, deslizar p/ baixo p/ minimizar o reprodutor +• notificações MediaStyle: c/ ações personalizáveis, melhorias de desempenho +• redimensionamento básico ao usar NewPipe como app desktop -• mostrar diálogo com opções abertas em caso de URL não suportado -• experiência de sugestão de pesquisa melhorada -• qualidade de vídeo predefinido aumentada a 720p60 (player do app) e 480p (pop-up) +• mostrar diálogo com opções de carregamento em caso de URL não suportado +• sugestão de pesquisa melhorada +• qualidade predefinida aumentada a 720p60 (reprodutor da app) e 480p (pop-up) -• correções de bugs +• correção de bugs diff --git a/fastlane/metadata/android/pt-PT/changelogs/955.txt b/fastlane/metadata/android/pt-PT/changelogs/955.txt index cd70b41c9ba..edc87b56b22 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/955.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/955.txt @@ -1,3 +1,3 @@ -[YouTube] A procura por alguns utilizadores corrigida -[YouTube] Exceções de desencriptação aleatórias corrigidas +[YouTube] Pesquisa corrigida para alguns utilizadores +[YouTube] Corrigidas exceções de desencriptação aleatórias [SounCloud] URLs que terminam com uma barra são agora analisados corretamente diff --git a/fastlane/metadata/android/pt-PT/changelogs/956.txt b/fastlane/metadata/android/pt-PT/changelogs/956.txt index e258a451eba..dcebd05626c 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/956.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/956.txt @@ -1 +1 @@ -[YouTube] Falha corrigida ao carregar qualquer vídeo +[YouTube] Corrigida falha ao carregar qualquer vídeo diff --git a/fastlane/metadata/android/pt-PT/changelogs/957.txt b/fastlane/metadata/android/pt-PT/changelogs/957.txt index 8bdc458b0be..e64899c8fc4 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/957.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/957.txt @@ -1,10 +1,10 @@ -- Unir ações específicas de inquérito em uma -- Gesto de dois dedos para fechar o jogador -- Permitir a limpeza de cookies reCAPTCHA -- Opção de não colorir a notificação -- Melhorar como os detalhes do vídeo são abertos para não por no buffer infinitamente -- Acelerar os vídeos do YouTube e corrigir os de idade restrita -- Reparação de colisão em avanço/retrocesso rápido -- Não reordenar as listas a arrastar as miniaturas -- Lembrar sempre das propriedades popup -- Acrescentar a língua Santali +Unir ações específicas de enfileiramento +Gesto 2 dedos p/ fechar APP +Permitir limpeza de cookies reCAPTCHA +Opção não colorir notific. +Melhorar forma como os detalhes do vídeo são abertos p/ corrigir buffering infinito, comportamento errático ao compartilhar com NewPipe, etc +Acelerar vídeos do YouTube e corrijir restrições etárias +Corrigir falha no avanço/recuo rápido +Não reorganizar listas ao arrastar miniaturas +Lembrar sempre as propriedades pop-up +Adicionar idioma Santali diff --git a/fastlane/metadata/android/pt-PT/changelogs/958.txt b/fastlane/metadata/android/pt-PT/changelogs/958.txt index d7616b944ec..fc2507f64f4 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/958.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/958.txt @@ -1,10 +1,10 @@ Novo e melhorado: -- Opção reajustada para esconder a miniatura na tela de bloqueio +- Opção reajustada para esconder a miniatura no ecrã de bloqueio - Puxar para atualizar o feed - Melhor desempenho na busca de listas locais Corrigido: -- Falha ao iniciar o NewPipe depois de ter sido removido da RAM +- Falha ao iniciar o NewPipe após ter sido removido da RAM - Falha na inicialização quando não há conexão à Internet - Respeitando as configurações de luminosidade e de volume - Listas de reprodução longas diff --git a/fastlane/metadata/android/pt-PT/changelogs/959.txt b/fastlane/metadata/android/pt-PT/changelogs/959.txt index a50b8d058f4..2ceda197e6a 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/959.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/959.txt @@ -1,3 +1,3 @@ -O loop infinito de falhas corrigido após a abertura do repórter de erro. -Lista atualizada de instâncias do PeerTube que podem ser abertas automaticamente pelo NewPipe. +Corrigido o ciclo infinito de falhas após a abertura do repórter de erros. +Atualizada a lista de instâncias PeerTube que podem ser abertas automaticamente pelo NewPipe. Traduções atualizadas. diff --git a/fastlane/metadata/android/pt-PT/changelogs/961.txt b/fastlane/metadata/android/pt-PT/changelogs/961.txt new file mode 100644 index 00000000000..61f2a981b67 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/961.txt @@ -0,0 +1,12 @@ +- Apoio à mistura +- [YouTube] Mostrar informação sobre emissoras públicas e Covid-19 +- [media.ccc.de] Adicionados vídeos recentes +- Acrescentada tradução somaliana + +- Muitas melhorias internas + +- Vídeos fixos de partilha de dentro do leitor +- Vista Web ReCaptcha em branco fixa +- Reparação de um acidente que ocorreu ao remover um fluxo de uma lista +- Fluxos relacionados fixos +- [YouTube] Pesquisa fixa de música no YouTube diff --git a/fastlane/metadata/android/pt-PT/changelogs/964.txt b/fastlane/metadata/android/pt-PT/changelogs/964.txt new file mode 100644 index 00000000000..7aa3c9fe458 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/964.txt @@ -0,0 +1,8 @@ +- Apoio adicional para capítulos nos controlos de jogadores +- Adicionada a pesquisa Sepia +- Botão de partilha reajustado na visualização detalhada do vídeo e moveu a descrição do fluxo para o layout do separador +- Desativar o restabelecimento do brilho se o gesto de brilho for desativado +- Adicionado item da lista para reproduzir vídeo no kodi +- Corrigida a falha quando não está definido um navegador padrão em alguns dispositivos e melhorados os diálogos de partilha +- Alternar jogo/pausa com botão de espaço de hardware no leitor de ecrã inteiro +- [media.ccc.de] Várias correções e melhorias diff --git a/fastlane/metadata/android/pt-PT/changelogs/966.txt b/fastlane/metadata/android/pt-PT/changelogs/966.txt new file mode 100644 index 00000000000..10aad806c6f --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/966.txt @@ -0,0 +1,14 @@ +Novo: +- Acrescentar um novo serviço: Bandcamp + +Melhorado: +- Adicionar uma opção para que a aplicação siga o tema do dispositivo +- Prevenir alguns acidentes mostrando um painel de erro melhorado +- Mostrar mais informações sobre o porquê do conteúdo na indisponibilidade +- O botão de espaço de hardware ativa o jogo/pausa +- Mostrar "Download iniciado" brinde + +Fixo: +- Fixar miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo +- Corrigir título vazio em jogador minimizado +- O último modo de reparação do tamanho não está a ser restaurado corretamente diff --git a/fastlane/metadata/android/pt-PT/changelogs/969.txt b/fastlane/metadata/android/pt-PT/changelogs/969.txt new file mode 100644 index 00000000000..28650ae9bb6 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/969.txt @@ -0,0 +1,8 @@ +* Permitir a instalação no armazenamento externo +* [Bandcamp] Adicionado suporte para exibir os três primeiros comentários em um fluxo +* Mostrar apenas o brinde 'o download começou' quando o download é iniciado +• Não defina o cookie reCaptcha quando não existir nenhum cookie armazenado +* [Jogador] melhorar o desempenho do cache +* [Jogador] jogador fixo que não joga automaticamente +* Dispensar Snackbars anteriores ao excluir downloads +* Corrigido tentando excluir objeto não na lista diff --git a/fastlane/metadata/android/pt-PT/changelogs/972.txt b/fastlane/metadata/android/pt-PT/changelogs/972.txt new file mode 100644 index 00000000000..9838ebadda5 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/972.txt @@ -0,0 +1,14 @@ +Novo +Reconhecer os timestamps e hashtags na descrição +Acrescentada a definição do modo tablet manual +Capacidade adicional de esconder itens jogados numa ração + +Melhorado +Apoiar adequadamente o Quadro de Acesso ao Armazenamento +Melhor tratamento de erros de canais indisponíveis e terminados +A folha de partilha do Android para utilizadores do Android 10+ mostra agora o título do conteúdo. +Atualização de instâncias Invidious e suporte de links Piped. + +Corrigido +[YouTube] Conteúdo restrito à idade +Prevenir fugas na janela Exceção ao abrir o diálogo de escolha diff --git a/fastlane/metadata/android/pt-PT/changelogs/975.txt b/fastlane/metadata/android/pt-PT/changelogs/975.txt index 994f0e8c560..e867d1b1152 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/975.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/975.txt @@ -8,8 +8,8 @@ Melhorias • Layout de metadados e etiquetas Fixo -• Corrigida miniatura no miniplayer -• Corrigido buffer sem fim em itens de fila duplicados -• Corrigido ReCAPTCHA que permanece carregado em segundo plano +• Corrigir miniatura no miniplayer +• Corrigir buffer sem fim em itens de fila duplicados +• Corrigir ReCAPTCHA que permanece carregado em segundo plano • Desativados os cliques enquanto atualiza o feed -• Corrigidas algumas falhas do descarregador +• Corrigir algumas falhas do descarregador diff --git a/fastlane/metadata/android/pt-PT/changelogs/983.txt b/fastlane/metadata/android/pt-PT/changelogs/983.txt new file mode 100644 index 00000000000..489f58b5b4d --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/983.txt @@ -0,0 +1,9 @@ +Acrescentar nova IU e comportamento de dupla tatuagem +Tornar as definições pesquisáveis +Destaque para os comentários em destaque como tal +Adicionar suporte open-with-app para a instância PeerTube da FSFE +Adicionar notificações de erro +Repor a repetição do item da primeira fila na mudança de jogador +Esperar mais tempo ao buffering durante os livestreams antes de falhar +Ordem fixa dos resultados da pesquisa local +Corrigir campos de itens vazios na fila de jogo diff --git a/fastlane/metadata/android/pt-PT/changelogs/986.txt b/fastlane/metadata/android/pt-PT/changelogs/986.txt new file mode 100644 index 00000000000..102422ee23a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/986.txt @@ -0,0 +1,16 @@ +Novo +- Notificações para novas correntes +- Transição sem falhas entre o fundo e os leitores de vídeo +- Alterar o passo por semitons +- Anexar a fila principal de jogadores a uma lista de reprodução + +Melhorado +- Lembre-se da velocidade/tamanho do passo +- Mitigar o longo amortecimento inicial no leitor de vídeo +- Melhorar a interface do leitor para a TV Android +- Confirmar antes de apagar todos os ficheiros descarregados + +Fixa +- Botão de fixação do media não esconde os controlos do leitor +- Reposição da reprodução corrigida na mudança de tipo de leitor +- Fixar a rotação do diálogo da lista de reprodução diff --git a/fastlane/metadata/android/pt-PT/changelogs/987.txt b/fastlane/metadata/android/pt-PT/changelogs/987.txt new file mode 100644 index 00000000000..334af9772d2 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/987.txt @@ -0,0 +1,12 @@ +Novo +- Métodos de entrega de suporte que não o HTTP progressivo: tempo de carregamento de reprodução mais rápido, correções para PeerTube e SoundCloud, reprodução de livestreams do YouTube recentemente terminados +- Adicionar botão para adicionar uma lista de reprodução remota a uma lista local +- Pré-visualização de imagem na folha de partilha Android 10+ + +Melhorado +- Melhorar o diálogo dos parâmetros de reprodução +- Mover botões de importação/exportação de subscrição para o menu de três pontos + +Fixa +- Correção da remoção de vídeos totalmente vistos da lista de reprodução +- Corrigir o tema do menu de partilha e a entrada "adicionar à lista de reprodução diff --git a/fastlane/metadata/android/pt-PT/changelogs/992.txt b/fastlane/metadata/android/pt-PT/changelogs/992.txt new file mode 100644 index 00000000000..2da819beb5e --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/992.txt @@ -0,0 +1,17 @@ +Novo +- Contagem de subscritores em detalhes de vídeo +- Descarregar da fila +- Uma miniatura permanente de listas de reprodução +- Hashtags e ligações de imprensa longa +- Modo de visualização de cartões + +Melhorado +- Botão de fecho de mini-reprodutor maior +- Redução mais suave das miniaturas +- Alvo Android 13 (API 33) +- Procurar não pausa o reprodutor + +Fixa +- Corrigido sobreposições no DeX/rato +- Permitir um leitor de fundo sem fluxo de áudio separados +- Várias correções do YouTube… diff --git a/fastlane/metadata/android/pt-PT/changelogs/993.txt b/fastlane/metadata/android/pt-PT/changelogs/993.txt new file mode 100644 index 00000000000..80c7b25f58b --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/993.txt @@ -0,0 +1,12 @@ +Novo +- Adicionar aviso ao adicionar duplicados da lista de reprodução e adicionar botão para os remover +- Permitir ignorar os botões de hardware +- Permitir a ocultação de vídeos parcialmente vistos na alimentação + +Melhorado +- Utilizar mais colunas de grelha em ecrãs grandes +- Tornar os indicadores de progresso consistentes com as definições + +Fixa +- Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+ +- Fixação interagindo com tela cheia requer duas torneiras no MIUI diff --git a/fastlane/metadata/android/pt-PT/changelogs/994.txt b/fastlane/metadata/android/pt-PT/changelogs/994.txt new file mode 100644 index 00000000000..289db33e01e --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/994.txt @@ -0,0 +1,15 @@ +Novo +- Suporte para várias faixas de áudio/idiomas +- Permitir definir gestos de volume e brilho em qualquer lado do ecrã +- Suporte para a apresentação dos separadores principais na parte inferior do ecrã + +Melhorado +- Bandcamp] Lidar com faixas atrás do muro de pagamento + +Corrigido +- YouTube] Erros HTTP 403 para streams +- Leitor preto ao mudar para o leitor principal a partir da vista de lista de reprodução +- Fuga de memória do serviço do leitor +- PeerTube] Os avatares do carregador e do sub-canal foram trocados + +e mais diff --git a/fastlane/metadata/android/pt-PT/changelogs/995.txt b/fastlane/metadata/android/pt-PT/changelogs/995.txt new file mode 100644 index 00000000000..b22d3122aac --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/995.txt @@ -0,0 +1,16 @@ +Novo +- Separadores de canais de suporte +- Selecionar a qualidade da imagem +- Obter URLs para todas as imagens + +Melhorado +- Acessibilidade das interfaces do leitor +- Melhor seleção de áudio para transferências apenas de vídeo +- Opção para incluir nomes de listas de reprodução e de vídeos no conteúdo de listas de reprodução partilhadas + +Corrigido +- YouTube] Correção da contagem de gostos +- Correção de popups e falhas do leitor que não responde +- Seleção de idiomas errados no seletor de idiomas +- A focagem do áudio do leitor não respeitava o silêncio +- A adição de itens à lista de reprodução não funcionava ocasionalmente. diff --git a/fastlane/metadata/android/pt-PT/changelogs/996.txt b/fastlane/metadata/android/pt-PT/changelogs/996.txt new file mode 100644 index 00000000000..230e76b54a0 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/996.txt @@ -0,0 +1,2 @@ +Um NullPointerException foi corrigido ao abrir um canal / conferência em media.ccc.de. +O Grinch tentou estragar o nosso presente de Natal para si, mas corrigimo-lo. diff --git a/fastlane/metadata/android/pt-PT/changelogs/997.txt b/fastlane/metadata/android/pt-PT/changelogs/997.txt new file mode 100644 index 00000000000..3e9da2ade70 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/997.txt @@ -0,0 +1,16 @@ +Novo +• Adicionar respostas de comentários +• Permitir reordenar listas de reprodução +... + +Melhorado +• [Android 13+] Restaurar ações de notificação personalizadas +• Solicitar consentimento para verificação de atualização +• Permitir reprodução/pausa de notificação durante o buffer +... + +Fixado +• [Tube] Corrigir comentários que não carregam, além de outras correções e melhorias +• Resolver vulnerabilidade nas configurações importação e mudar para JSON +• Várias correções de descargas +... diff --git a/fastlane/metadata/android/pt-PT/changelogs/998.txt b/fastlane/metadata/android/pt-PT/changelogs/998.txt new file mode 100644 index 00000000000..93519d64d7a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/998.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão diff --git a/fastlane/metadata/android/pt-PT/changelogs/999.txt b/fastlane/metadata/android/pt-PT/changelogs/999.txt new file mode 100644 index 00000000000..93519d64d7a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/999.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt index cf8f2a2554d..af5b0f9118b 100644 --- a/fastlane/metadata/android/pt-PT/full_description.txt +++ b/fastlane/metadata/android/pt-PT/full_description.txt @@ -1 +1 @@ -NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Portanto, esta app pode ser usado em aparelhos sem os Serviços do Google instalados. Além disso, não precisa de uma conta no YouTube para usar o NewPipe, e é FLOSS. +NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Desta forma, esta aplicação pode ser utilizada em aparelhos que não tenham Google Services instalados. Não precisa de uma conta Youtube e, além disso, é uma aplicação FLOSS. diff --git a/fastlane/metadata/android/pt-PT/short_description.txt b/fastlane/metadata/android/pt-PT/short_description.txt index 5e111585bc8..6c0629adc12 100644 --- a/fastlane/metadata/android/pt-PT/short_description.txt +++ b/fastlane/metadata/android/pt-PT/short_description.txt @@ -1 +1 @@ -Um frontend gratuito e leve do YouTube para o Android. +Um reprodutor Youtube para Android. diff --git a/fastlane/metadata/android/pt/changelogs/1000.txt b/fastlane/metadata/android/pt/changelogs/1000.txt new file mode 100644 index 00000000000..3c9f55393b6 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1000.txt @@ -0,0 +1,13 @@ +Melhorado +• Torne a descrição da lista de reprodução clicável para mostrar mais / menos conteudo +• [PeerTube] Gerir links de instâncias `subscribeto.me` automaticamente +• Começar a reprodução apenas de um item na tela de histórico + +Corrigido +• Corrigir visibilidade do botão RSS +• Corrigir falhas na pré-visualização da barra de busca +• Corrigir erro ao adicionar item sem miniatura à playlist +• Corrigir erro ao sair da caixa de diálogo de descarregar antes de ela aparecer +• Corrigir itens relacionados ao pop-up de colocar na fila +• Corrigir a ordem no diálogo de adicionar à lista de reprodução +• Ajustar o layout do item de marcador de lista de reprodução diff --git a/fastlane/metadata/android/pt/changelogs/63.txt b/fastlane/metadata/android/pt/changelogs/63.txt index 656a661458d..6bb13a95c0a 100644 --- a/fastlane/metadata/android/pt/changelogs/63.txt +++ b/fastlane/metadata/android/pt/changelogs/63.txt @@ -1,8 +1,8 @@ #### Melhorias - Configurações de importação/exportação #1333 -- Reduzir o overdraw (melhoria de desempenho) #1371 +- Reduzir a sobrecarga de renderização (melhoria de desempenho) #1371 - Pequenas melhorias de código #1375 - Adicione tudo sobre o GDPR #1420 -#### Fixo -- Descarregador: corrigir falha no carregamento de descarregas inacabadas dos ficheiros .giga #1407 +#### Corrigido +- Descarregador: Corrigir falha no carregamento de descarregas inacabadas dos ficheiros .giga #1407 diff --git a/fastlane/metadata/android/pt/changelogs/66.txt b/fastlane/metadata/android/pt/changelogs/66.txt new file mode 100644 index 00000000000..ed84a27599e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog de v0.13.7 + +### Fixo +- Fixar questões de filtro de ordenação da v0.13.6 + +# Mudança do v0.13.6 + +### Melhorias + +- Desactivar animação de ícones de burgermenu #1486 +- anular a eliminação dos downloads #1472 +- Opção de download no menu de partilha #1498 +- Adicionada a opção de partilha no menu de toque longo #1454 +- Minimizar o jogador principal na saída #1354 +- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Actualização #1392 + - Reformulou o diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de passos para uma mudança de velocidade mais rápida. + - Adicionada uma alternância para avançar rapidamente durante os silêncios no controlo de velocidade de reprodução. Isto deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma verdadeira experiência sem falhas (e pode quebrar uma canção com muitos silêncios =\i1). + - A resolução da fonte dos meios de comunicação foi refeita para permitir a passagem de metadados ao lado dos meios de comunicação internamente no leitor, em vez de o fazer manualmente. Agora temos uma única fonte de metadados e está directamente disponível quando a reprodução começa. + - Fixados os metadados da lista de reprodução remota que não são actualizados quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberto. + - Várias correcções UI: #1383, a notificação do leitor de fundo controla agora sempre branco, mais fácil de desligar o leitor de pop-ups através do fling +- Usar novo extractor com arquitectura refacturada para multiserviços + +### Correcções + +- Reparação #1440 Layout de Informação de Vídeo Partido #1491 +- Ver histórico correcção #1497 + - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. + - #1475, através do registo de uma vista na base de dados quando o utilizador inicia um vídeo no leitor externo sobre fragmento de detalhe. +- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640) +- Correcção principal do leitor de vídeo #1509 + - [#1412] Modo de repetição fixo causando NPE do jogador quando novas intenções são recebidas enquanto a actividade do jogador está em segundo plano. + - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup. diff --git a/fastlane/metadata/android/pt/changelogs/68.txt b/fastlane/metadata/android/pt/changelogs/68.txt new file mode 100644 index 00000000000..1e6c42e01d2 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/68.txt @@ -0,0 +1,31 @@ +# mudanças da v0.14.1 + +### fixo +- Fixo falhou em desencriptar a url de vídeo #1659 +- Ligação de descrição fixa não extraída bem #1657 + +# mudanças de v0.14.0 + +### Novo +- Novo desenho de gaveta #1461 +- Nova página inicial personalizável #1461 + +### Melhorias +- Controlos por gestos retrabalhados #1604 +- Nova forma de fechar o leitor de popup #1597 + +### Fixa +- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649. + - Mostrar "Contagem de subscritores não disponível" nesses casos +- Consertar NPE quando uma lista de reprodução do YouTube está vazia +- Correcção rápida para os quiosques em SoundCloud +- Refactor e correcção de bugs #1623 + - Resultado de pesquisa cíclica reparada #1562 + - Barra de procura fixa não estática + - Os vídeos do YT Premium não estão bloqueados correctamente + - Vídeos Fixos por vezes não carregados (devido à análise do DASH) + - Corrigir ligações na descrição vídeo + - Mostrar aviso quando alguém tenta descarregar para sdcard externo + - nada de excepção mostrado dispara o relatório + - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Correcção do registo do receptor de radiodifusão. Fecha #1641. diff --git a/fastlane/metadata/android/pt/changelogs/69.txt b/fastlane/metadata/android/pt/changelogs/69.txt new file mode 100644 index 00000000000..fa7d5d85cda --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/69.txt @@ -0,0 +1,19 @@ +#### Novo +- Eliminação de longa duração e partilha de subscrições #1516 +- Tabela UI e esquema de lista de grelha #1617 + +### Melhorias +- armazenar e recarregar a última relação de aspeto utilizada #1748 +- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 +- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 +- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 +- Configurações separadas para os gestos de volume e luminosidade #1644 +- Adicionar apoio à Localização #1792 + +### Correções +- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia +- Contagem fixa de assinaturas +- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830 + +### Bugs conhecidos +- O estado de reprodução não pode ser guardado no Android P diff --git a/fastlane/metadata/android/pt/changelogs/70.txt b/fastlane/metadata/android/pt/changelogs/70.txt new file mode 100644 index 00000000000..61de40666ef --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/70.txt @@ -0,0 +1,25 @@ +Atenção: esta versão é provavelmente um bugfest, tal como a última. No entanto, devido ao desligamento total desde o 17. uma versão quebrada é melhor do que nenhuma versão. Certo? ¯\_(ツ)_/¯ + +### Melhoria +* os arquivos baixados agora podem ser abertos com um clique #1879 +* suporte drop para android 4.1-4.3 #1884 +* remover jogador antigo #1884 +* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 +* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 +* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy + * Infra-estruturas de pós-processamento + * Tratamento adequado de erros "infraestrutura" (para downloader) + * Fila em vez de vários downloads + * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo + * Implementar nova tentativa máxima de download + * Pausa adequada para o download de vários segmentos + * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2) + * Salve a contagem de threads para os próximos downloads + * Muitas incoerências corrigidas + +### Corrigido +* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835 +* falha do jogador pop-up corrigida #1874 +* NPE ao tentar abrir o jogador de fundo #1901 +* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878 +* Corrigido o problema decypering shuttown diff --git a/fastlane/metadata/android/pt/changelogs/71.txt b/fastlane/metadata/android/pt/changelogs/71.txt new file mode 100644 index 00000000000..fb525ccccca --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/71.txt @@ -0,0 +1,10 @@ +### Melhoria +* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush) +* Várias melhorias para o downloader(# 1944 por @kapodamy): + * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones + * verifique se o iterador foi inicializado (correções #2031) + * * permitir novas tentativas de downloads com erro "Falha no pós-processamento" no novo mixer + * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039) + +### Corrigido +* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username) diff --git a/fastlane/metadata/android/pt/changelogs/740.txt b/fastlane/metadata/android/pt/changelogs/740.txt new file mode 100644 index 00000000000..c795978a894 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/740.txt @@ -0,0 +1,23 @@ +

    Improvements

    +
      +
    • make links in comments clickable, increase text size
    • +
    • seek on clicking timestamp links in comments
    • +
    • show preferred tab based on recently selected state
    • +
    • add playlist to queue when long clicking on 'Background' in playlist window
    • +
    • search for shared text when it is not an URL
    • +
    • add "share at current time" button to the main video player
    • +
    • add close button to main player when video queue is finished
    • +
    • add "Play directly in Background" to longpress menu for video list items
    • +
    • improve English translations for Play/Enqueue commands
    • +
    • small performance improvements
    • +
    • remove unused files
    • +
    • update ExoPlayer to 2.9.6
    • +
    • add support for Invidious links
    • +
    +

    Fixed

    +
      +
    • fixed scroll w/ comments and related streams disabled
    • +
    • fixed CheckForNewAppVersionTask being executed when it shouldn't
    • +
    • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
    • +
    • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
    • +
    diff --git a/fastlane/metadata/android/pt/changelogs/750.txt b/fastlane/metadata/android/pt/changelogs/750.txt new file mode 100644 index 00000000000..8ef8dd3bbfb --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/750.txt @@ -0,0 +1,22 @@ +Novo +Resumo da reprodução #2288 +• Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +• Use o Storage Access Framework para armazenar downloads em cartões SD externos +• Novo MP4 muxer +• Opcionalmente, altere o diretório de download antes de iniciar um download +• Respeitar as redes de medição + + +Melhorado +• Cordas gema removidas #2295 +• Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +• Tornar os menus de pressão longa consistentes #2368 + +Corrigido +• Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +• Corrigido ownloads presos em 99,9% #2440 +• Atualizar meta dados da fila de reprodução #2453 +• [SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170 +• [YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177 diff --git a/fastlane/metadata/android/pt/changelogs/760.txt b/fastlane/metadata/android/pt/changelogs/760.txt new file mode 100644 index 00000000000..7134cb34f0d --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/760.txt @@ -0,0 +1,43 @@ +Alterações em 0.17.1 + +Novo +• Localização tailandesa + + +Melhorado +• Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518 +• Adicionar interruptor para SAF / legacy file picker #2521 + +Corrigido +• Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487 +• Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado +• Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517 +• [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186 +• [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185 + + + +Alterações em 0.17.0 + +Novo +Resumo da reprodução #2288 +• Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +• Use o Storage Access Framework para armazenar downloads em cartões SD externos +• Novo MP4 muxer +• Opcionalmente, altere o diretório de download antes de iniciar um download +• Respeitar as redes de medição + + +Melhorado +• Cordas gema removidas #2295 +• Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +• Tornar os menus de pressão longa consistentes #2368 + +Corrigido +• Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +• Downloads fixos presos em 99,9% #2440 +• Atualizar metadados da fila de reprodução #2453 +• [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170 +• [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt/changelogs/780.txt b/fastlane/metadata/android/pt/changelogs/780.txt new file mode 100644 index 00000000000..961f1babdc7 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/780.txt @@ -0,0 +1,12 @@ +Alterações em 0.17.3 + +Melhorado em +- Adicionada opção para limpar estados de reprodução #2550 +- Mostrar diretórios ocultos no seletor de ficheiros #2591 +- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 +- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Fixa +- [YouTube] Fixo 'java.lang.IllegalArgumentException #192 +- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195 +- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592 diff --git a/fastlane/metadata/android/pt/changelogs/790.txt b/fastlane/metadata/android/pt/changelogs/790.txt new file mode 100644 index 00000000000..f1b3a2dd98c --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/790.txt @@ -0,0 +1,14 @@ +Melhorado +- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655 +- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637 + +Fixa +- Verificar se o último byte no bloco é descarregado #2646 +- Rolagem fixa em fragmento de detalhe de vídeo #2672 +- Remover a dupla pesquisa de animações de caixa transparente para uma #2695 +- Fixar extracção client_id #2745 + +Desenvolvimento +- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535 +- Migrar para AndroidX #2685 +- Actualização para ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/pt/changelogs/800.txt b/fastlane/metadata/android/pt/changelogs/800.txt new file mode 100644 index 00000000000..1b6ec1a4c7c --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/800.txt @@ -0,0 +1,27 @@ +Novo +- Suporte PeerTube sem P2P (#2201) [Beta]: + ◦ Ver e descarregar vídeos de instâncias do PeerTube + ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube + ◦ Pode haver problemas com apertos de mão SSL no Android 4.4 e 7.1 quando o acesso a certos casos resulta num erro de rede. + +- Downloader (#2679): + ◦ Calcular ETA de descarregamento + ◦ Descarregar opus (ficheiros webm) como ogg + ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa + +Melhorado +- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742 +- Utilizar novas implementações de Localização e Downloader do extractor #2713 +- Tornar o fio "Quiosque por defeito" traduzível +- Barra de navegação preta para o tema preto #2569 + +Fixa +- Corrigido um bug que não podia mover o leitor de popup se outro dedo fosse colocado enquanto se movia o leitor de popup #2772 +- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219 +- Habilitação de TLS1.1/1.2 em dispositivos Android 4.4 (API 19/KitKat) para corrigir o aperto de mão de TLS com MediaCCC e algumas instâncias PeerTube #2792 +- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217 +- Fixar a extracção do fluxo de áudio + +Desenvolvimento +- Atualizar ExoPlayer para 2.10.8 #2791, #2816 +- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714 diff --git a/fastlane/metadata/android/pt/changelogs/810.txt b/fastlane/metadata/android/pt/changelogs/810.txt new file mode 100644 index 00000000000..3cb60e434ae --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/810.txt @@ -0,0 +1,19 @@ +Novo +- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo + +Melhorado +- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup +- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador +- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo +- Adicionar miniatura de miniatura para listas de reprodução locais vazias +- Use a extensão de ficheiro *.opus em vez de *.webm e mostre "opus" na etiqueta de formato em vez de "WebM Opus" no menu pendente de download +- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em "Downloads +- [YouTube] Adicionar suporte a /c/shortened_url channel links + +Fixa +- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos +- Acesso fixo do jogador fora do seu fio de criação +- Paginação fixa de resultados de pesquisa +- Ligar nulo fixo causando NPE +- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us +- ClientCloud] Client_id actualizado diff --git a/fastlane/metadata/android/pt/changelogs/840.txt b/fastlane/metadata/android/pt/changelogs/840.txt new file mode 100644 index 00000000000..4ee1d8ab395 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/840.txt @@ -0,0 +1,22 @@ +Novo +- Adicionado o seletor de língua para alterar a língua da aplicação +- Adicionado enviar para o botão Kodi ao menu desmontável do leitor +- Capacidade adicional de copiar comentários sobre imprensa longa + +Melhorado +- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos +- Removido o ponto-menu a favor da gaveta e botão esconder histórico quando o histórico do relógio não está ativado nas definições +- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores +- Renomear playlist local através de um clique longo em BookmarkFragment +- Vários melhoramentos do PeerTube +- Melhorou várias cadeias de caracteres em inglês + +Fixa +- Jogador fixo a recomeçar, embora seja pausado quando a opção "minimizar no comutador da aplicação" é ativada e o NewPipe é minimizado +- Fixar o valor de brilho inicial para o gesto +- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha +- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF +- Descarregamento fixo no Android KitKat +- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio +- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados +- Os carimbos temporais em descrição podem ser clicados novamente diff --git a/fastlane/metadata/android/pt/changelogs/930.txt b/fastlane/metadata/android/pt/changelogs/930.txt new file mode 100644 index 00000000000..1ded9e8870f --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/930.txt @@ -0,0 +1,19 @@ +Novo +- Pesquisa no YouTube Música +- Suporte básico de TV Android + +Melhorado +- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local +- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar +- Reprodutor popup melhorado redimensionado com gestos de beliscão +- Enqueue streams em fundo e botões de popup no canal +- Melhor manuseamento do tamanho do título do cabeçalho da gaveta + +Fixa +- Definição de conteúdo com restrição de idade fixa não funciona +- Fixação de certos tipos de reCAPTCHAs +- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é "nula". +- Deteção fixa de exceções relacionadas com a rede +- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições + +e mais diff --git a/fastlane/metadata/android/pt/changelogs/955.txt b/fastlane/metadata/android/pt/changelogs/955.txt index 98bed58fecd..edc87b56b22 100644 --- a/fastlane/metadata/android/pt/changelogs/955.txt +++ b/fastlane/metadata/android/pt/changelogs/955.txt @@ -1,3 +1,3 @@ -[YouTube] O problema com busca que afetava utilizadores foi corrigida -[YouTube] Exceções de desencriptação aleatórias foram corrigidas -[SounCloud] URLs que terminam com uma barra são analisadas corretamente +[YouTube] Pesquisa corrigida para alguns utilizadores +[YouTube] Corrigidas exceções de desencriptação aleatórias +[SounCloud] URLs que terminam com uma barra são agora analisados corretamente diff --git a/fastlane/metadata/android/pt/changelogs/956.txt b/fastlane/metadata/android/pt/changelogs/956.txt index e258a451eba..dcebd05626c 100644 --- a/fastlane/metadata/android/pt/changelogs/956.txt +++ b/fastlane/metadata/android/pt/changelogs/956.txt @@ -1 +1 @@ -[YouTube] Falha corrigida ao carregar qualquer vídeo +[YouTube] Corrigida falha ao carregar qualquer vídeo diff --git a/fastlane/metadata/android/pt/changelogs/961.txt b/fastlane/metadata/android/pt/changelogs/961.txt new file mode 100644 index 00000000000..61f2a981b67 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/961.txt @@ -0,0 +1,12 @@ +- Apoio à mistura +- [YouTube] Mostrar informação sobre emissoras públicas e Covid-19 +- [media.ccc.de] Adicionados vídeos recentes +- Acrescentada tradução somaliana + +- Muitas melhorias internas + +- Vídeos fixos de partilha de dentro do leitor +- Vista Web ReCaptcha em branco fixa +- Reparação de um acidente que ocorreu ao remover um fluxo de uma lista +- Fluxos relacionados fixos +- [YouTube] Pesquisa fixa de música no YouTube diff --git a/fastlane/metadata/android/pt/changelogs/964.txt b/fastlane/metadata/android/pt/changelogs/964.txt new file mode 100644 index 00000000000..7aa3c9fe458 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/964.txt @@ -0,0 +1,8 @@ +- Apoio adicional para capítulos nos controlos de jogadores +- Adicionada a pesquisa Sepia +- Botão de partilha reajustado na visualização detalhada do vídeo e moveu a descrição do fluxo para o layout do separador +- Desativar o restabelecimento do brilho se o gesto de brilho for desativado +- Adicionado item da lista para reproduzir vídeo no kodi +- Corrigida a falha quando não está definido um navegador padrão em alguns dispositivos e melhorados os diálogos de partilha +- Alternar jogo/pausa com botão de espaço de hardware no leitor de ecrã inteiro +- [media.ccc.de] Várias correções e melhorias diff --git a/fastlane/metadata/android/pt/changelogs/966.txt b/fastlane/metadata/android/pt/changelogs/966.txt new file mode 100644 index 00000000000..10aad806c6f --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/966.txt @@ -0,0 +1,14 @@ +Novo: +- Acrescentar um novo serviço: Bandcamp + +Melhorado: +- Adicionar uma opção para que a aplicação siga o tema do dispositivo +- Prevenir alguns acidentes mostrando um painel de erro melhorado +- Mostrar mais informações sobre o porquê do conteúdo na indisponibilidade +- O botão de espaço de hardware ativa o jogo/pausa +- Mostrar "Download iniciado" brinde + +Fixo: +- Fixar miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo +- Corrigir título vazio em jogador minimizado +- O último modo de reparação do tamanho não está a ser restaurado corretamente diff --git a/fastlane/metadata/android/pt/changelogs/969.txt b/fastlane/metadata/android/pt/changelogs/969.txt new file mode 100644 index 00000000000..28650ae9bb6 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/969.txt @@ -0,0 +1,8 @@ +* Permitir a instalação no armazenamento externo +* [Bandcamp] Adicionado suporte para exibir os três primeiros comentários em um fluxo +* Mostrar apenas o brinde 'o download começou' quando o download é iniciado +• Não defina o cookie reCaptcha quando não existir nenhum cookie armazenado +* [Jogador] melhorar o desempenho do cache +* [Jogador] jogador fixo que não joga automaticamente +* Dispensar Snackbars anteriores ao excluir downloads +* Corrigido tentando excluir objeto não na lista diff --git a/fastlane/metadata/android/pt/changelogs/972.txt b/fastlane/metadata/android/pt/changelogs/972.txt new file mode 100644 index 00000000000..9838ebadda5 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/972.txt @@ -0,0 +1,14 @@ +Novo +Reconhecer os timestamps e hashtags na descrição +Acrescentada a definição do modo tablet manual +Capacidade adicional de esconder itens jogados numa ração + +Melhorado +Apoiar adequadamente o Quadro de Acesso ao Armazenamento +Melhor tratamento de erros de canais indisponíveis e terminados +A folha de partilha do Android para utilizadores do Android 10+ mostra agora o título do conteúdo. +Atualização de instâncias Invidious e suporte de links Piped. + +Corrigido +[YouTube] Conteúdo restrito à idade +Prevenir fugas na janela Exceção ao abrir o diálogo de escolha diff --git a/fastlane/metadata/android/pt/changelogs/983.txt b/fastlane/metadata/android/pt/changelogs/983.txt new file mode 100644 index 00000000000..489f58b5b4d --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/983.txt @@ -0,0 +1,9 @@ +Acrescentar nova IU e comportamento de dupla tatuagem +Tornar as definições pesquisáveis +Destaque para os comentários em destaque como tal +Adicionar suporte open-with-app para a instância PeerTube da FSFE +Adicionar notificações de erro +Repor a repetição do item da primeira fila na mudança de jogador +Esperar mais tempo ao buffering durante os livestreams antes de falhar +Ordem fixa dos resultados da pesquisa local +Corrigir campos de itens vazios na fila de jogo diff --git a/fastlane/metadata/android/pt/changelogs/986.txt b/fastlane/metadata/android/pt/changelogs/986.txt new file mode 100644 index 00000000000..102422ee23a --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/986.txt @@ -0,0 +1,16 @@ +Novo +- Notificações para novas correntes +- Transição sem falhas entre o fundo e os leitores de vídeo +- Alterar o passo por semitons +- Anexar a fila principal de jogadores a uma lista de reprodução + +Melhorado +- Lembre-se da velocidade/tamanho do passo +- Mitigar o longo amortecimento inicial no leitor de vídeo +- Melhorar a interface do leitor para a TV Android +- Confirmar antes de apagar todos os ficheiros descarregados + +Fixa +- Botão de fixação do media não esconde os controlos do leitor +- Reposição da reprodução corrigida na mudança de tipo de leitor +- Fixar a rotação do diálogo da lista de reprodução diff --git a/fastlane/metadata/android/pt/changelogs/987.txt b/fastlane/metadata/android/pt/changelogs/987.txt new file mode 100644 index 00000000000..334af9772d2 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/987.txt @@ -0,0 +1,12 @@ +Novo +- Métodos de entrega de suporte que não o HTTP progressivo: tempo de carregamento de reprodução mais rápido, correções para PeerTube e SoundCloud, reprodução de livestreams do YouTube recentemente terminados +- Adicionar botão para adicionar uma lista de reprodução remota a uma lista local +- Pré-visualização de imagem na folha de partilha Android 10+ + +Melhorado +- Melhorar o diálogo dos parâmetros de reprodução +- Mover botões de importação/exportação de subscrição para o menu de três pontos + +Fixa +- Correção da remoção de vídeos totalmente vistos da lista de reprodução +- Corrigir o tema do menu de partilha e a entrada "adicionar à lista de reprodução diff --git a/fastlane/metadata/android/pt/changelogs/992.txt b/fastlane/metadata/android/pt/changelogs/992.txt new file mode 100644 index 00000000000..2da819beb5e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/992.txt @@ -0,0 +1,17 @@ +Novo +- Contagem de subscritores em detalhes de vídeo +- Descarregar da fila +- Uma miniatura permanente de listas de reprodução +- Hashtags e ligações de imprensa longa +- Modo de visualização de cartões + +Melhorado +- Botão de fecho de mini-reprodutor maior +- Redução mais suave das miniaturas +- Alvo Android 13 (API 33) +- Procurar não pausa o reprodutor + +Fixa +- Corrigido sobreposições no DeX/rato +- Permitir um leitor de fundo sem fluxo de áudio separados +- Várias correções do YouTube… diff --git a/fastlane/metadata/android/pt/changelogs/993.txt b/fastlane/metadata/android/pt/changelogs/993.txt new file mode 100644 index 00000000000..80c7b25f58b --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/993.txt @@ -0,0 +1,12 @@ +Novo +- Adicionar aviso ao adicionar duplicados da lista de reprodução e adicionar botão para os remover +- Permitir ignorar os botões de hardware +- Permitir a ocultação de vídeos parcialmente vistos na alimentação + +Melhorado +- Utilizar mais colunas de grelha em ecrãs grandes +- Tornar os indicadores de progresso consistentes com as definições + +Fixa +- Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+ +- Fixação interagindo com tela cheia requer duas torneiras no MIUI diff --git a/fastlane/metadata/android/pt/changelogs/994.txt b/fastlane/metadata/android/pt/changelogs/994.txt new file mode 100644 index 00000000000..289db33e01e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/994.txt @@ -0,0 +1,15 @@ +Novo +- Suporte para várias faixas de áudio/idiomas +- Permitir definir gestos de volume e brilho em qualquer lado do ecrã +- Suporte para a apresentação dos separadores principais na parte inferior do ecrã + +Melhorado +- Bandcamp] Lidar com faixas atrás do muro de pagamento + +Corrigido +- YouTube] Erros HTTP 403 para streams +- Leitor preto ao mudar para o leitor principal a partir da vista de lista de reprodução +- Fuga de memória do serviço do leitor +- PeerTube] Os avatares do carregador e do sub-canal foram trocados + +e mais diff --git a/fastlane/metadata/android/pt/changelogs/995.txt b/fastlane/metadata/android/pt/changelogs/995.txt new file mode 100644 index 00000000000..2c92c1d72a5 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/995.txt @@ -0,0 +1,16 @@ +Novo +- Separadores de canais de suporte +- Selecionar a qualidade da imagem +- Obter URLs para todas as imagens + +Melhorado +- Acessibilidade das interfaces do leitor +- Melhor seleção de áudio para transferências apenas de vídeo +- Opção para incluir nomes de listas de reprodução e de vídeos no conteúdo de listas de reprodução partilhadas + +Corrigido +- YouTube] Correção da contagem de gostos +- Correção de popups e falhas do leitor que não responde +- Seleção de idiomas errados no seletor de idiomas +- A focagem do áudio do leitor não estava a respeitar o silêncio +- A adição de itens à lista de reprodução não funcionava ocasionalmente diff --git a/fastlane/metadata/android/pt/changelogs/996.txt b/fastlane/metadata/android/pt/changelogs/996.txt new file mode 100644 index 00000000000..4f1c8f22993 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/996.txt @@ -0,0 +1,2 @@ +Foi corrigida uma NullPointerException ao abrir um canal/conferência em media.ccc.de. +O Grinch tentou estragar a nossa prenda de Natal, mas nós resolvemos o problema. diff --git a/fastlane/metadata/android/pt/changelogs/997.txt b/fastlane/metadata/android/pt/changelogs/997.txt new file mode 100644 index 00000000000..3e9da2ade70 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/997.txt @@ -0,0 +1,16 @@ +Novo +• Adicionar respostas de comentários +• Permitir reordenar listas de reprodução +... + +Melhorado +• [Android 13+] Restaurar ações de notificação personalizadas +• Solicitar consentimento para verificação de atualização +• Permitir reprodução/pausa de notificação durante o buffer +... + +Fixado +• [Tube] Corrigir comentários que não carregam, além de outras correções e melhorias +• Resolver vulnerabilidade nas configurações importação e mudar para JSON +• Várias correções de descargas +... diff --git a/fastlane/metadata/android/pt/changelogs/998.txt b/fastlane/metadata/android/pt/changelogs/998.txt new file mode 100644 index 00000000000..0cfc2ca888e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/998.txt @@ -0,0 +1,4 @@ +Corrigido YouTube não reproduzir nenhuma transmissão por causa de erros HTTP 403 + +Erros HTTP 403 ocasionais a meio de um video de Youtube ainda não foram resolvidos. +Esse problema será resolvido em outro hotfix o mais rápido possível. diff --git a/fastlane/metadata/android/pt/changelogs/999.txt b/fastlane/metadata/android/pt/changelogs/999.txt new file mode 100644 index 00000000000..b260aca0b2e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/999.txt @@ -0,0 +1,12 @@ +Este hotfix corrige erros HTTP 403 no meio de vídeos do YouTube. + +Novo +• [SoundCloud] Suporte adicionado para URLs do tipo on.soundcloud.com + +Melhorado +• [Bandcamp] Exibição de informações adicionais no quiosque de rádio + +Corrigido +• [YouTube] Correção de erros ocasionais HTTP 403 no início ou no meio dos vídeos +• [YouTube] Extração de avatar e banner de mais tipos de cabeçalhos de canal +• [Bandcamp] Correção de vários bugs e uso constante de HTTPS diff --git a/fastlane/metadata/android/pt/full_description.txt b/fastlane/metadata/android/pt/full_description.txt index af5b0f9118b..af327a1488f 100644 --- a/fastlane/metadata/android/pt/full_description.txt +++ b/fastlane/metadata/android/pt/full_description.txt @@ -1 +1 @@ -NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Desta forma, esta aplicação pode ser utilizada em aparelhos que não tenham Google Services instalados. Não precisa de uma conta Youtube e, além disso, é uma aplicação FLOSS. +NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Desta forma, esta aplicação pode ser utilizada em aparelhos que não tenham Google Services instalados. Também não precisa de uma conta Youtube e, além disso, é uma aplicação FLOSS. diff --git a/fastlane/metadata/android/pt/short_description.txt b/fastlane/metadata/android/pt/short_description.txt index 6c0629adc12..1f2c457236d 100644 --- a/fastlane/metadata/android/pt/short_description.txt +++ b/fastlane/metadata/android/pt/short_description.txt @@ -1 +1 @@ -Um reprodutor Youtube para Android. +Um frontend gratuito e leve do YouTube para Android. diff --git a/fastlane/metadata/android/ru/changelogs/63.txt b/fastlane/metadata/android/ru/changelogs/63.txt index 8cb650ef4c8..59101af13ca 100644 --- a/fastlane/metadata/android/ru/changelogs/63.txt +++ b/fastlane/metadata/android/ru/changelogs/63.txt @@ -1,8 +1,8 @@ ### Улучшения - Импорт/экспорт настроек #1333 -- Уменьшена перерисовка (оптимизация производительности) #1371 +- Уменьшено количество перерисовки (повышена производительность) #1371 - Небольшие улучшения кода #1375 - Добавлено всё о GDPR #1420 -### Исправлено +### Исправления - Загрузчик: Исправлен вылет при продолжении незавершённых загрузок с форматом .giga #1407 diff --git a/fastlane/metadata/android/ru/changelogs/64.txt b/fastlane/metadata/android/ru/changelogs/64.txt index e2a02f8ee70..ffa1927c289 100644 --- a/fastlane/metadata/android/ru/changelogs/64.txt +++ b/fastlane/metadata/android/ru/changelogs/64.txt @@ -1,8 +1,8 @@ ### Улучшения -- Добавлена возможность ограничить качество видео при использовании мобильного интернета #1339 +- Добавлена возможность ограничения качества видео при использовании мобильного интернета #1339 - Теперь яркость запоминается на время сессии #1442 - Улучшена производительность загрузки для более слабых процессоров #1431 - Добавлена (работающая) поддержка для медиа-сессии #1433 -### Исправлено +### Исправления - Исправлен вылет при открытии Загрузок (доступно в релизных сборках) #1441 diff --git a/fastlane/metadata/android/ru/changelogs/65.txt b/fastlane/metadata/android/ru/changelogs/65.txt index 51993fef336..bd81955c480 100644 --- a/fastlane/metadata/android/ru/changelogs/65.txt +++ b/fastlane/metadata/android/ru/changelogs/65.txt @@ -1 +1,26 @@ -эскиз видео +### Улучшения + +- Отключение анимации значка burgermenu #1486 +- Отменение удаления загрузок #1472 +- Опция загрузки в меню общего доступа #1498 +- Добавлена опция "Поделиться" в меню долгого нажатием #1454 +- Минимизировать главного игрока на выходе #1354 +- Обновление версии библиотеки и исправление резервного копирования базы данных #1510 +- Обновление ExoPlayer до 2.8.2 #1392 +- Переработан диалог управления скоростью воспроизведения для поддержки различных размеров шага для более быстрого изменения скорости. +- Добавлен переключатель для быстрой перемотки вперед во время пауз в управлении скоростью воспроизведения. Это должно быть полезно для аудиокниг и определенных музыкальных жанров и может принести по-настоящему плавный опыт (и может прервать песню большим количеством пауз =\\). +- Переработано разрешение источника мультимедиа, позволяющее передавать метаданные вместе с мультимедиа внутри проигрывателя, а не делать это вручную. Теперь у нас есть единый источник метаданных, и он доступен непосредственно при запуске воспроизведения. +- Исправлено, что метаданные удаленного плейлиста не обновлялись, когда новые метаданные были доступны при открытии фрагмента плейлиста. +- Различные исправления пользовательского интерфейса: # 1383, элементы управления уведомлениями фонового проигрывателя теперь всегда белые, проще отключить всплывающее окно проигрывателя с помощью щелчка +- Используйте новый экстрактор с переработанной архитектурой для мультисервиса + +### Исправления + +- Исправлено #1440 неработающий макет видеоинформации #1491 +- Исправление истории просмотра #1497 +- # 1495, обновляя метаданные (миниатюру, заголовок и количество видео), как только пользователь получает доступ к списку воспроизведения. +- #1475, путем регистрации просмотра в базе данных, когда пользователь запускает видео на внешнем проигрывателе на детальном фрагменте. +- Исправлен тайм-аут creen в случае всплывающего режима. #1463 (исправлено #640) +- Исправление основного видеоплеера #1509 +- [#1412] Исправлен режим повтора, вызывающий NPE плеера при получении нового намерения, когда активность игрока находится в фоновом режиме. +- Исправлено сведение проигрывателя к всплывающему окну не приводит к уничтожению проигрывателя, если разрешение на всплывающее окно не предоставлено. diff --git a/fastlane/metadata/android/ru/changelogs/66.txt b/fastlane/metadata/android/ru/changelogs/66.txt index 51993fef336..d37569a6820 100644 --- a/fastlane/metadata/android/ru/changelogs/66.txt +++ b/fastlane/metadata/android/ru/changelogs/66.txt @@ -1 +1,33 @@ -эскиз видео +# Список изменений версии 0.13.7 + +### Исправлено +- Исправлены проблемы с фильтром сортировки версии 0.13.6 + +# Список изменений версии 0.13.6 + +### Улучшения + +- Отключение анимации значка burgermenu #1486 +- Отменение удаления загрузок #1472 +- Опция загрузки в меню общего доступа #1498 +- Добавлена опция "Поделиться" в меню с длинным нажатием #1454 +- Минимизировать главного игрока на выходе #1354 +- Обновление версии библиотеки и исправление резервного копирования базы данных #1510 +- Обновление ExoPlayer до 2.8.2 #1392 +- Переработан диалог управления скоростью воспроизведения для поддержки различных размеров шага для более быстрого изменения скорости. +- Добавлен переключатель для быстрой перемотки вперед во время пауз в управлении скоростью воспроизведения. Это должно быть полезно для аудиокниг и определенных музыкальных жанров и может принести по-настоящему плавный опыт (и может прервать песню большим количеством пауз =\\). +- Переработано разрешение источника мультимедиа, позволяющее передавать метаданные вместе с мультимедиа внутри проигрывателя, а не делать это вручную. Теперь у нас есть единый источник метаданных, и он доступен непосредственно при запуске воспроизведения. +- Исправлено, что метаданные удаленного плейлиста не обновлялись, когда новые метаданные были доступны при открытии фрагмента плейлиста. +- Различные исправления пользовательского интерфейса: # 1383, элементы управления уведомлениями фонового проигрывателя теперь всегда белые, проще отключить всплывающее окно проигрывателя с помощью щелчка +- Используйте новый экстрактор с переработанной архитектурой для мультисервиса + +### Исправления + +- Исправлено #1440 неработающий макет видеоинформации #1491 +- Исправление истории просмотра #1497 +- # 1495, обновляя метаданные (миниатюру, заголовок и количество видео), как только пользователь получает доступ к списку воспроизведения. +- #1475, путем регистрации просмотра в базе данных, когда пользователь запускает видео на внешнем проигрывателе на детальном фрагменте. +- Исправлен тайм-аут creen в случае всплывающего режима. #1463 (исправлено #640) +- Исправление основного видеоплеера #1509 +- [#1412] Исправлен режим повтора, вызывающий NPE плеера при получении нового намерения, когда активность игрока находится в фоновом режиме. +- Исправлено сведение проигрывателя к всплывающему окну не приводит к уничтожению проигрывателя, если разрешение на всплывающее окно не предоставлено. diff --git a/fastlane/metadata/android/ru/changelogs/68.txt b/fastlane/metadata/android/ru/changelogs/68.txt index 51993fef336..71e6bf4bbff 100644 --- a/fastlane/metadata/android/ru/changelogs/68.txt +++ b/fastlane/metadata/android/ru/changelogs/68.txt @@ -1 +1,31 @@ -эскиз видео +# Изменения в версии 0.14.1 + +### Исправлено +- Исправлена ошибка при расшифровке URL-адреса видео #1659 +- Исправлена плохо извлекающаяся ссылка на описание#1657 + +# Изменения в версии 0.14.0 + +### Из нового +- Новый дизайн выпадающего списка #1461 +- Новая настраиваемая главная страница #1461 + +### Улучшения +- Переработанное управление жестами #1604 +- Новый способ закрытия всплывающего окна проигрывателя #1597 + +### Исправления +- Исправлена ошибка недоступности количества подписок. Закрыто #1649. +- Показ "Количество подписчиков недоступно" в этих случаях +- Исправлено NPE, при пустом плейлист YouTube +- Быстрое исправление киосков в SoundCloud +- Рефакторинг и исправление ошибок #1623 +- Исправлен результат циклического поиска #1562 +- Исправлена панель поиска, не размещенная статически +- Исправлено, что видео YT Premium блокируется неправильно +- Исправлено, что видео иногда не загружалось (из-за разбора ТИРЕ) +- Исправлены ссылки в описании видео +- Показывать предупреждение, когда кто-то пытается загрузить на внешнюю SD-карту +- Исправлено ничего непоказывающее сообщение о триггерах исключений +- Неотображаемая миниатура в фоновом проигрывателе на Android 8.1 [смотрите здесь](https://github.com/TeamNewPipe/NewPipe/issues/943 ) +- Исправлена регистрация широковещательного приемника. Закрыто #1641. diff --git a/fastlane/metadata/android/ru/changelogs/69.txt b/fastlane/metadata/android/ru/changelogs/69.txt index c081690f841..1d97b0283cf 100644 --- a/fastlane/metadata/android/ru/changelogs/69.txt +++ b/fastlane/metadata/android/ru/changelogs/69.txt @@ -1 +1,19 @@ -настройки +### Из нового +- Длительное нажатие на удаление и общий доступ в подписках #1516 +- Пользовательский интерфейс планшета и макет списка таблиц #1617 + +### Улучшения +- Сохранение и перезагрузка последнего использованного соотношения сторон #1748 +- Включена линейная компоновка в активности загрузки с полными названиями видео #1771 +- Удалять подписки и делиться ими непосредственно с вкладки подписки #1516 +- Постановка в очередь теперь запускает воспроизведение видео, если очередь воспроизведения уже закончилась #1783 +- Отдельные настройки для жестов громкости и яркости #1644 +- Добавлена поддержка локализации #1792 + +### Исправления +- Исправлено время разбора для . format, чтобы NewPipe можно было использовать в Финляндии +- Исправлено количество подписок +- Добавить разрешение на работу в активном режиме для устройств API 28+ #1830 + +### Известные ошибки +- Состояние воспроизведения не может быть сохранено на телефоне Android P diff --git a/fastlane/metadata/android/ru/changelogs/70.txt b/fastlane/metadata/android/ru/changelogs/70.txt index da96c42fda6..8272619cda4 100644 --- a/fastlane/metadata/android/ru/changelogs/70.txt +++ b/fastlane/metadata/android/ru/changelogs/70.txt @@ -1 +1,25 @@ -всплывающий +ВНИМАНИЕ: Эта версия, вероятно, является багфестом, как и предыдущая. Однако из-за полного отключения с 17. сломанная версия лучше, чем без версии. Верно? ¯\_(ツ)_/¯ + +### Улучшения +* Загруженные файлы теперь можно открыть одним щелчком мыши #1879 +* Поддержка drop для Android 4.1 - 4.3 #1884 +* Удалён старый плеер #1884 +* Удаление потоков из текущей очереди воспроизведения, проведя по ним пальцем вправо #1915 +* Удаление потока, автоматически поставленного в очередь, когда новый поток ставится в очередь вручную #1878 +* Постобработка для загрузки и реализации недостающих функций #1759 от @kapodamy +* Инфраструктура постобработки +* Правильная обработка ошибок "инфраструктуры" (для загрузчика) +* Очередь вместо нескольких загрузок +* Переместить сериализованные ожидающие загрузки (файлы `.giga`) в данные приложения +* Реализовать максимальную повторную попытку загрузки +* Правильная приостановка многопоточной загрузки +* Остановка загрузки при подключении к мобильной сети (никогда не работает, см. 2-й пункт) +* Сохраните количество потоков для следующих загрузок +* Исправлено множество несогласованностей + +### Исправления +* Исправлена ошибка с разрешением по умолчанию, установленным на лучшее и ограниченное разрешение мобильных данных #1835 +* исправлен сбой всплывающего проигрывателя #1874 +* NPE при попытке открыть фоновый проигрыватель #1901 +* Исправлена ошибка вставки новых потоков при включенной автоматической постановке в очередь #1878 +* Исправлена проблема с отключением decypering shuttown diff --git a/fastlane/metadata/android/ru/changelogs/71.txt b/fastlane/metadata/android/ru/changelogs/71.txt index 57b179cf25e..c66f055d1aa 100644 --- a/fastlane/metadata/android/ru/changelogs/71.txt +++ b/fastlane/metadata/android/ru/changelogs/71.txt @@ -1 +1,10 @@ -стрим +### Улучшения +* Добавлено уведомление об обновлении приложения из сборки на GitHub (# 1608 от @krtkush) +* Различные улучшения загрузчика (#1944 от @kapodamy): +* Добавьте недостающие белые значки и используйте hardcore way для изменения цвета значков +* Проверка инициализации итератора (исправления #2031) +* Добавлена повторная загрузка для "ошибки постобработки" в новом микшере +* Новый микшер MPEG-4, исправляющий асинхронные видео- и аудиопотоки (#2039) + +### Исправления +* Прямые трансляции YouTube переставали воспроизводиться спустя короткое время (#1996 от @username) diff --git a/fastlane/metadata/android/ru/changelogs/740.txt b/fastlane/metadata/android/ru/changelogs/740.txt index a89174aeb8d..61f21baa822 100644 --- a/fastlane/metadata/android/ru/changelogs/740.txt +++ b/fastlane/metadata/android/ru/changelogs/740.txt @@ -1,23 +1,23 @@

    Улучшения

      -
    • сделана возможность нажимать на ссылки в комментариях, увеличен размер текста
    • -
    • поиск по нажатию на временные отметки в комментариях
    • +
    • добавлены интерактивность для ссылок в комментариях, увеличен размер текста
    • +
    • поиск нажатием по временные отметки в комментариях
    • показывать предпочитаемую вкладку, на основании состояния недавно выбраных
    • добавить плейлист в очередь при длинном нажатии на 'Фон' в окне плейлиста
    • поиск по тексту переданному приложению, если это не ссылка
    • добавить "поделиться на этом моменте" кнопку в основной видео-проигрыватель
    • добавить кнопку закрытия в основной видео-проигрыватель, когда очередь проигрывания закончилась
    • добавить "Воспроизвести на фоне" в меню длинного нажатия для предметов из видео-листа
    • -
    • улучшить английский перевод для команд Воспроизвести/Добавить в очередь
    • +
    • улучшен английский перевод для команд Воспроизвести/Добавить в очередь
    • мелкие улучшения работы приложения
    • уюрать неиспользованные файлы
    • -
    • обновить ExoPlayer до 2.9.6
    • +
    • обновлён ExoPlayer до 2.9.6
    • добавить поддержку ссылок Invidious
    -

    Исправлено

    +

    Исправления

    • исправлено пролистывание с выключенными комментариями и похожими трансляциями
    • исправлено запуск CheckForNewAppVersionTask когда это не нужно't
    • исправлено импорт подписок с youtube: игнорирование подписок с неправильными ссылками и сохранение тех, у которых пустые названия
    • -
    • исправить неправильные YouTube ссылки: название метки подписи не всегда "signature", что не даёт загружаться трансляциям
    • +
    • исправить неправильные YouTube - ссылки: название метки подписи не всегда "signature", что не даёт загружаться трансляциям
    diff --git a/fastlane/metadata/android/ru/changelogs/750.txt b/fastlane/metadata/android/ru/changelogs/750.txt index aac46059afc..ebe57b15972 100644 --- a/fastlane/metadata/android/ru/changelogs/750.txt +++ b/fastlane/metadata/android/ru/changelogs/750.txt @@ -1,22 +1,22 @@ -Новое +Из нового Продолжить проигрывание #2288 • Продолжать трансляции с того момента, где вы остановились -Улучшения загрузчика #2149 +Улучшения загрузчика #2149 • Использовать Storage Access Framework для хранения загрузок на SD-картах • Новый mp4 микшер • Выборочно меняйте путь загрузки перед тем, как начать скачивание -• Учитывать сети с измеряемым трафиком +• Учитывать сети с измеряемым трафиком -Улучшено -• Убрано gema строчки #2295 +Улучшения +• Убраны gema строчки #2295 • Работа с изменениями (авто)поворота во время цикла использования #2444 • Сделать меню длинного нажатия постоянными #2368 -Исправлено +Исправления • Исправлено не показывающееся название выбранной дорожки субтитров #2394 -• Не вылетать при провальной проверке обновлений приложения (GitHub версия) #2423 +• Не вылетать при провальной проверке обновлений приложения (GitHub версия) #2423 • Исправлено вечную загрузку при достижении 99.9% #2440 -• Обновление метаданных очереди проигрывания #2453 +• Обновление метаданных очереди проигрывания #2453 • [SoundCloud] Исправлен вылет при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170 • [YouTube] Исправлена ошибка парсинга времени проигрывания TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ru/changelogs/760.txt b/fastlane/metadata/android/ru/changelogs/760.txt new file mode 100644 index 00000000000..9780bf28f89 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/760.txt @@ -0,0 +1,43 @@ +Изменения в 0.17.1 + +Из нового +• Тайская локализация + + +Улучшения +• Добавлено действие "Начать воспроизведение здесь" в меню с длительным нажатием для списков воспроизведения #2518 +• Добавлен переключатель для SAF / legacy средства выбора файлов #2521 + +Исправления +• Исправлено исчезновение кнопок в режиме загрузки при переключении приложений #2487 +• Фиксированная позиция воспроизведения сохраняется, хотя история просмотра отключена +• Исправлено снижение производительности, вызванное позицией воспроизведения в списках просмотров #2517 +• [Extractor] Исправлено ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Исправлена случайная ошибка поиска, когда плейлисты отображаются в результатах TeamNewPipe/NewPipeExtractor#185 + + + +Изменения в версии 0.17.0 + +Из нового +Возобновление воспроизведения #2288 +• Возобновите потоки с того места, где вы остановились в прошлый раз +Улучшения загрузчика #2149 +• Используйте платформу доступа к хранилищу для хранения загрузок на внешних SD-картах +• Новый мультиплексор mp4 +• При необходимости измените каталог загрузки перед началом загрузки +• Уважайте дозированные сети + + +Улучшения +• Удалены gema строки #2295 +• Изменение поворота ручки (автоматически) в течение жизненного цикла действия #2444 +• Сделайте меню при длительном нажатии согласованным #2368 + +Исправления +• Исправлено, что название выбранного трека субтитров не отображалось #2394 +• Не происходит сбой при сбое проверки обновления приложения (версия GitHub) #2423 +• Исправлено застревание загрузок на уровне 99,9% #2440 +• Обновить метаданные очереди воспроизведения #2453 +• [SoundCloud] Исправлен сбой при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Фиксированная продолжительность не может быть разделена на TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ru/changelogs/770.txt b/fastlane/metadata/android/ru/changelogs/770.txt new file mode 100644 index 00000000000..d2802f80734 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/770.txt @@ -0,0 +1,4 @@ +Изменения в 0.17.2 + +Исправления +• Исправлено, что видео не было доступно diff --git a/fastlane/metadata/android/ru/changelogs/790.txt b/fastlane/metadata/android/ru/changelogs/790.txt index 24d1c115af0..e5724384f52 100644 --- a/fastlane/metadata/android/ru/changelogs/790.txt +++ b/fastlane/metadata/android/ru/changelogs/790.txt @@ -1 +1,14 @@ -папки +Улучшения +• Добавлено больше названий, чтобы улучшить доступность для слепых людей #2655 +• Язык папки загрузки сделан более согласованным и менее двусмысленным #2637 + +Исправления +• Проверка загрузки последнего байта в блоке #2646 +• Исправлена прокрутка в детальном фрагменте видео #2672 +• Удалите анимацию двойного поиска в поле очистки до одного #2695 +• [SoundCloud] Исправлено извлечение идентификатора клиента #2745 + +Разработка +• Добавлены недостающие зависимости, унаследованные от New Pipe Extractor, в New Pipe #2535 +• Переход на AndroidX #2685 +• Обновление ExoPlayer до 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/ru/changelogs/800.txt b/fastlane/metadata/android/ru/changelogs/800.txt new file mode 100644 index 00000000000..1ae6c2bd7e5 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/800.txt @@ -0,0 +1,27 @@ +Из нового +• Поддержка PeerTube без P2P (#2201) [бета-версия]: +◦ Смотрите и скачивайте видео с сайтов PeerTube. +◦ Добавлены экземпляры в настройках, чтобы получить доступ ко всему миру PeerTube +◦ Могут возникнуть проблемы с SSL-квитированием на Android 4.4 и 7.1 при доступе к определенным экземплярам, что приводит к сетевой ошибке. + +• Загрузчик (#2679): +◦ Рассчитать время загрузки +◦ Загрузить opus (файлы webm) в формате ogg +◦ Восстанавливайте ссылки для скачивания с истекшим сроком действия, чтобы возобновить загрузку после длительной паузы + +Улучшения +• Информируйте KioskFragment об изменениях в предпочитаемой стране контента и улучшайте производительность всех основных вкладок #2742 +• Используйте новые реализации локализации и загрузчика из extractor #2713 +• Сделайте строку "Киоск по умолчанию" переводимой +• Черная панель навигации для черной темы #2569 + +Исправления +• Исправлена ошибка, из-за которой всплывающий проигрыватель не мог перемещаться, если при перемещении всплывающего проигрывателя был помещен другой палец #2772 +• Разрешить плейлистам отсутствие загрузчика и исправить сбои, связанные с этой проблемой #2724, TeamNewPipe/NewPipeExtractor#219 +• Включение TLS1.1/1.2 на устройствах Android 4.4 (API 19/KitKat) для исправления рукопожатия TLS с MediaCCC и некоторыми экземплярами PeerTube #2792 +• [SoundCloud] Исправлено извлечение идентификатора клиента TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] Исправлено извлечение аудиопотока + +Разработка +• Обновление ExoPlayer до 2.10.8 #2791, #2816 +• Обновление Gradle до 3.5.1 и добавлена поддержка Kotlin #2714 diff --git a/fastlane/metadata/android/ru/changelogs/810.txt b/fastlane/metadata/android/ru/changelogs/810.txt new file mode 100644 index 00000000000..bd0eb6fc54b --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/810.txt @@ -0,0 +1,19 @@ +Из нового +• Показывать миниатюру видео на экране блокировки при воспроизведении в фоновом режиме + +Улучшения +• Добавление локального списка воспроизведения в очередь при длительном нажатии на фоновую / всплывающую кнопку +• Сделайте вкладки главной страницы прокручиваемыми и скрывайте, когда есть только одна вкладка. +• Ограничить количество обновлений миниатюр уведомлений в фоновом проигрывателе +• Добавить фиктивный эскиз для пустых локальных списков воспроизведения +• Используется расширение файла *.opus вместо *.webm и показывает "opus" в метке формата вместо "WebMOpus" в выпадающем списке загрузки +• Добавить кнопку для удаления загруженных файлов или истории загрузок в разделе "Загрузки" +• [YouTube] Добавить поддержку ссылок на каналы /c/shortened_url + +Исправления +• Исправлены многочисленные проблемы при совместном использовании видео в New Pipe и прямой загрузке его потоков +• Исправлен доступ игрока из потока его создания +• Исправлена подкачка результатов поиска по страницам +• [YouTube] Исправлено включение null, приводящее к NPE +• [YouTube] Исправлен просмотр комментариев при открытии invidia.us url-адрес +• [SoundCloud] Обновлен идентификатор клиента diff --git a/fastlane/metadata/android/ru/changelogs/840.txt b/fastlane/metadata/android/ru/changelogs/840.txt new file mode 100644 index 00000000000..af4791a7d69 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/840.txt @@ -0,0 +1,22 @@ +Из нового +• Добавлен выбор языка для изменения языка приложения +• Добавлена кнопка "Отправить Коди" в складное меню плеера +• Добавлена возможность копировать комментарии при длительном нажатии + +Улучшения +• Исправьте активность reCAPTCHA и правильно сохраните полученные файлы cookie +• Удалено точечное меню в пользу ящика и кнопки скрыть историю, когда просмотр истории не включен в настройках +• Правильно запрашивайте разрешение на отображение поверх других приложений в настройках на Android 6 и более поздних версиях +• Переименуйте локальный список воспроизведения, щелкнув длительным щелчком в BookmarkFragment +• Различные улучшения PeerTube +• Улучшены несколько исходных строк на английском языке + +Исправления +• Исправлен повторный запуск проигрывателя, хотя он приостановлен, когда включена опция "свернуть при переключении приложений" и NewPipe свернут +• Исправьте начальное значение яркости для жеста +• Исправлена загрузка субтитров .srt, содержащих не все разрывы строк +• Исправлена ошибка загрузки на SD-карту из-за того, что некоторые устройства Android 5 не совместимы с CTF +• Исправлена загрузка на Android KitKat +• Исправлено, что поврежденный файл video .mp4 распознавался как аудиофайл +• Исправлены многочисленные проблемы с локализацией, включая неправильные коды китайского языка +• [YouTube] Временные метки в описании снова доступны для кликабельности diff --git a/fastlane/metadata/android/ru/changelogs/860.txt b/fastlane/metadata/android/ru/changelogs/860.txt new file mode 100644 index 00000000000..3e76217e502 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/860.txt @@ -0,0 +1,7 @@ +Улучшено +• Сохраняйте и восстанавливайте независимо от того, отключены ли высота тона и темп или нет +• Поддержка выреза дисплея в плеере +• Круговой обзор и количество подписчиков +• Оптимизирован YouTube для использования меньшего количества данных + +В этом выпуске было исправлено более 15 ошибок, связанных с YouTube. diff --git a/fastlane/metadata/android/ru/changelogs/870.txt b/fastlane/metadata/android/ru/changelogs/870.txt new file mode 100644 index 00000000000..7d1f72dd56c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/870.txt @@ -0,0 +1,2 @@ +Это выпуск исправления, обновляющий New Pipe, чтобы снова использовать SoundCloud без серьезных проблем. +Soundcloud v2 API теперь используется в экстракторе, и было улучшено обнаружение недопустимых идентификаторов клиентов. diff --git a/fastlane/metadata/android/ru/changelogs/900.txt b/fastlane/metadata/android/ru/changelogs/900.txt new file mode 100644 index 00000000000..001561bfb62 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/900.txt @@ -0,0 +1,14 @@ +Из нового +• Группы подписок и отсортированные каналы +• Кнопка отключения звука в проигрывателях + +Улучшения +• Разрешить открытие music.youtube.com и media.ccc.de соединения в новой трубе +• Переместите две настройки с внешнего вида на содержимое +• Скрыть параметры поиска на 5, 15, 25 секунд, если включен неточный поиск + +Исправления +• некоторые видеоролики WebM недоступны для поиска +• резервное копирование базы данных на телефоне Android +• сбой при совместном использовании загруженного файла +• тонны проблем с извлечением с YouTube и многое другое... diff --git a/fastlane/metadata/android/ru/changelogs/920.txt b/fastlane/metadata/android/ru/changelogs/920.txt new file mode 100644 index 00000000000..3cf0c63becc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/920.txt @@ -0,0 +1,9 @@ +Улучшено + +• Добавлена дата загрузки и количество просмотров для элементов сетки потока +• Улучшения в макете заголовка ящика + +Исправлено + +• Исправлена кнопка отключения звука, вызывающая сбои в API 19 +• Исправлена загрузка длинных видео с разрешением 1080p 60 кадров в секунду diff --git a/fastlane/metadata/android/ru/changelogs/930.txt b/fastlane/metadata/android/ru/changelogs/930.txt new file mode 100644 index 00000000000..58a849bf479 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/930.txt @@ -0,0 +1,19 @@ +Из нового +• Поиск музыки на YouTube +• Базовая поддержка Android TV + +Улучшения +• Добавлена возможность удалять все просмотренные видео из локального списка воспроизведения +• Показывать сообщение, когда контент еще не поддерживается, вместо сбоя +• Улучшено изменение размера всплывающего проигрывателя с помощью пинч-жестов +• Постановка потоков в очередь при длительном нажатии на фоновые и всплывающие кнопки в канале +• Улучшена обработка размера заголовка заголовка ящика + +Исправления +• Исправлена ошибка, из-за которой не работает настройка контента с ограничением по возрасту +• Исправлены некоторые виды рекапчи +• Исправлен сбой при открытии закладок, когда плейлист имеет значение `null` +• Исправлено обнаружение исключений, связанных с сетью +• Исправлена видимость кнопки сортировки по группам во фрагменте подписок + +и много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/940.txt b/fastlane/metadata/android/ru/changelogs/940.txt new file mode 100644 index 00000000000..a375d726dfa --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/940.txt @@ -0,0 +1,16 @@ +Из нового +• Добавлена поддержка комментариев SoundCloud +• Добавить настройку ограниченного режима YouTube +• Показать сведения о родительском канале PeerTube + +Улучшения +• Показывать кнопку Kore только для поддерживаемых сервисов +• Блокируйте жесты игрока, которые начинаются с панели навигации или строки состояния +• Измените цвет фона кнопок повтора и подписки на основе цвета сервиса + +Исправления +• Исправлена блокировка диалогового окна загрузки +• Кнопка Открыть в браузере теперь действительно открывается в браузере +• Исправлена ошибка при открытии видео и "Не удалось воспроизвести этот поток" + +и много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/951.txt b/fastlane/metadata/android/ru/changelogs/951.txt new file mode 100644 index 00000000000..d45fb542b56 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/951.txt @@ -0,0 +1,17 @@ +Из нового +• Добавить поиск для средства выбора подписки в диалоговом окне группы каналов +• Добавьте фильтр в диалоговое окно группы каналов, чтобы показывать только негруппированные подписки +• Добавить вкладку плейлиста на главную страницу +• Быстрая перемотка вперед / назад в фоновом режиме / очередь всплывающих окон проигрывателя +• Отобразить предложение по поиску: вы имели в виду и показываете результат для + +Улучшения +• Удалите метаданные приложения для записи в смешанные файлы +• Не удаляйте сбойные потоки из очереди +• Обновите цвет строки состояния, чтобы он соответствовал цвету панели инструментов + +Исправления +• Исправлена рассинхронизация аудио / видео, вызванная накопительными ошибками с плавающей запятой +• [PeerTube] Обрабатывает удаленные комментарии + +и много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/954.txt b/fastlane/metadata/android/ru/changelogs/954.txt new file mode 100644 index 00000000000..6d6273af19d --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/954.txt @@ -0,0 +1,9 @@ +• новый рабочий процесс приложения: воспроизведение видео на странице сведений, проведите пальцем вниз, чтобы свернуть проигрыватель +• Уведомления в стиле медиастайла: настраиваемые действия в уведомлениях, повышение производительности +• базовое изменение размера при использовании New Pipe в качестве настольного приложения + +• показывать диалоговое окно с открытыми параметрами в случае появления неподдерживаемого URL-адреса +• Улучшите работу с поисковыми предложениями, когда удаленные предложения не могут быть извлечены +• Увеличено качество видео по умолчанию до 720p60 (встроенный проигрыватель) и 480p (всплывающий проигрыватель) + +• тонны исправлений ошибок и многое другое diff --git a/fastlane/metadata/android/ru/changelogs/957.txt b/fastlane/metadata/android/ru/changelogs/957.txt new file mode 100644 index 00000000000..3f3af1d3cb5 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/957.txt @@ -0,0 +1,10 @@ +• Объединить конкретные действия по постановке в очередь в одно +• Жест двумя пальцами для закрытия проигрывателя +• Разрешить очистку файлов cookie reCAPTCHA +• Возможность не раскрашивать уведомление +• Улучшите способ открытия деталей видео, чтобы исправить бесконечную буферизацию, ошибки при совместном использовании с новым каналом и другие несоответствия +• Ускорьте просмотр видео на YouTube и исправьте возрастные ограничения +• Исправлен сбой при быстрой перемотке вперед / назад +• Не переставляйте списки, перетаскивая миниатюры +• Всегда помните о свойствах всплывающего окна +• Добавить язык Сантали diff --git a/fastlane/metadata/android/ru/changelogs/959.txt b/fastlane/metadata/android/ru/changelogs/959.txt new file mode 100644 index 00000000000..6784a604a39 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/959.txt @@ -0,0 +1,3 @@ +Исправлен бесконечный цикл сбоев после открытия отчета об ошибках. +Обновлен список экземпляров PeerTube, которые могут быть автоматически открыты новым каналом. +Обновленные переводы. diff --git a/fastlane/metadata/android/ru/changelogs/960.txt b/fastlane/metadata/android/ru/changelogs/960.txt new file mode 100644 index 00000000000..eeb34abc8ad --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/960.txt @@ -0,0 +1,4 @@ +• Улучшено описание опции экспорта базы данных в настройках. +• Исправлен синтаксический анализ комментариев на YouTube. +• Исправлено отображаемое имя media.ccc.de обслуживание. +• Обновленные переводы. diff --git a/fastlane/metadata/android/ru/changelogs/961.txt b/fastlane/metadata/android/ru/changelogs/961.txt new file mode 100644 index 00000000000..9d91653b396 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Поддержка микширования +• [YouTube] Отображает информацию об общественных вещателях и Covid-19 +• [media.ccc.de ] Добавлены последние видео +• Добавлен перевод на сомалийский + +• Множество внутренних улучшений + +• Исправлен обмен видео из плеера +• Исправлено пустое веб-представление reCAPTCHA +• Исправлен сбой, возникавший при удалении потока из списка +• [PeerTube] Исправлены связанные потоки +• [YouTube] Исправлен поиск музыки на YouTube diff --git a/fastlane/metadata/android/ru/changelogs/964.txt b/fastlane/metadata/android/ru/changelogs/964.txt new file mode 100644 index 00000000000..74c406568ed --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/964.txt @@ -0,0 +1,8 @@ +• Добавлена поддержка глав в элементах управления плеером +• [PeerTube] Добавлен поиск в сепии +• Повторно добавлена кнопка "Поделиться" в подробном просмотре видео и перенесено описание потока в макет вкладки +• Отключите восстановление яркости, если жест яркости отключен +• Добавлен элемент списка для воспроизведения видео на kodi +• Исправлен сбой, когда на некоторых устройствах не был установлен браузер по умолчанию, и улучшены диалоги общего доступа +• Переключение воспроизведения / паузы с помощью аппаратной кнопки пробела в полноэкранном проигрывателе +• [media.ccc.de] Различные исправления и улучшения diff --git a/fastlane/metadata/android/ru/changelogs/965.txt b/fastlane/metadata/android/ru/changelogs/965.txt new file mode 100644 index 00000000000..91154a156f2 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/965.txt @@ -0,0 +1,6 @@ +Исправлен сбой, возникавший при переупорядочивании групп каналов. +Исправлено получение большего количества видео с YouTube из каналов и плейлистов. +Исправлено получение комментариев на YouTube. +Добавлена поддержка подпутей /watch/, /v/ и /w/ в URL-адресах YouTube. +Исправлено извлечение идентификатора клиента SoundCloud и контента с географическими ограничениями. +Добавлена локализация на северном курдском языке. diff --git a/fastlane/metadata/android/ru/changelogs/966.txt b/fastlane/metadata/android/ru/changelogs/966.txt new file mode 100644 index 00000000000..dd76fc64850 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/966.txt @@ -0,0 +1,14 @@ +Из нового: +• Добавить новую услугу: Bandcamp + +Улучшения: +• Добавьте опцию, чтобы приложение соответствовало теме устройства +• Предотвратите некоторые сбои, показав улучшенную панель ошибок +• Показать дополнительную информацию о том, почему контент в недоступном +• Аппаратная кнопка пробела запускает воспроизведение/паузу +• Показать тост "Загрузка начата" + +Исправления: +• Исправлена очень маленькая миниатюра в деталях видео при воспроизведении в фоновом режиме +• Исправлен пустой заголовок в свернутом проигрывателе +• Исправлено, что последний режим изменения размера восстанавливался неправильно diff --git a/fastlane/metadata/android/ru/changelogs/967.txt b/fastlane/metadata/android/ru/changelogs/967.txt new file mode 100644 index 00000000000..675a4c9089c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/967.txt @@ -0,0 +1 @@ +Исправлена ошибка, из-за которой YouTube не работал должным образом в ЕС. Это было вызвано новым файлом cookie и системой согласия на конфиденциальность, которая требует нового канала для установки файла cookie СОГЛАСИЯ. diff --git a/fastlane/metadata/android/ru/changelogs/968.txt b/fastlane/metadata/android/ru/changelogs/968.txt new file mode 100644 index 00000000000..b4c718af797 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/968.txt @@ -0,0 +1,7 @@ +Добавлена опция сведений о канале в меню при длительном нажатии. +Добавлена функция переименования названия списка воспроизведения из интерфейса списка воспроизведения. +Разрешить пользователю делать паузу во время буферизации видео. +Отполировал белую тему. +Исправлено наложение шрифтов при использовании большего размера шрифта. +Исправлено отсутствие видео на устройствах Formuler и Zephier. +Исправлены различные сбои. diff --git a/fastlane/metadata/android/ru/changelogs/969.txt b/fastlane/metadata/android/ru/changelogs/969.txt new file mode 100644 index 00000000000..259c9024df4 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/969.txt @@ -0,0 +1,8 @@ +• Разрешить установку на внешнее хранилище +• [Bandcamp] Добавлена поддержка отображения первых трех комментариев в потоке +• Показывать тост "загрузка началась" только при запуске загрузки +• Не устанавливайте файл cookie reCAPTCHA, если файл cookie не сохранен +• [Player] Повысить производительность кэша +• [Player] Исправлено, что проигрыватель не воспроизводился автоматически +• Отключите предыдущие панели закусок при удалении загрузок +• Исправлена попытка удалить объект, которого нет в списке diff --git a/fastlane/metadata/android/ru/changelogs/970.txt b/fastlane/metadata/android/ru/changelogs/970.txt new file mode 100644 index 00000000000..92a89e07ed5 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/970.txt @@ -0,0 +1,11 @@ +Из нового +• Просмотр метаданных контента (теги, категории, лицензии и т.д.) под описанием. +• Добавлена опция "Показать информацию о канале" в удаленных (не локальных) плейлистах. +• В меню длительного нажатия добавлена опция "Открыть в браузере". + +Исправления +• Исправлен сбой при вращении на странице сведений о видео. +• Исправлена ошибка, из-за которой кнопка «Играть с Kodi» в плеере всегда предлагала установить Kore. +• Исправлены и улучшены настройки путей импорта и экспорта +• [YouTube] Исправлены комментарии и их количество. +И много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/971.txt b/fastlane/metadata/android/ru/changelogs/971.txt new file mode 100644 index 00000000000..27584b05b6c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/971.txt @@ -0,0 +1,3 @@ +Исправление + • Увеличен буфер для воспроизведения после повторной буферизации + • Исправлен вылет на планшетах и телевизорах при нажатии на иконку play-queue в плеере diff --git a/fastlane/metadata/android/ru/changelogs/972.txt b/fastlane/metadata/android/ru/changelogs/972.txt new file mode 100644 index 00000000000..c254c0a5481 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/972.txt @@ -0,0 +1,14 @@ +Из нового +Распознавание временных меток и хэштегов в описании +Добавлена ручная настройка режима планшета +Добавлена возможность скрывать воспроизводимые элементы в ленте + +Улучшения +Исправлена поддержка Storage Access Framework +Улучшенная обработка ошибок недоступных и прерванных каналов +На листе обмена Android для пользователей Android 10+ теперь отображается заголовок контента +Обновлены экземпляры Invidious и добавлена поддержка каналов + +Исправления +[YouTube] Контент с ограничением по возрасту +Утечка окна Исключение при открытии диалогового окна выбора diff --git a/fastlane/metadata/android/ru/changelogs/973.txt b/fastlane/metadata/android/ru/changelogs/973.txt new file mode 100644 index 00000000000..a3733fa2556 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/973.txt @@ -0,0 +1,4 @@ +Быстрое исправление +• Исправлена ошибка, из-за которой миниатюры и заголовки обрезались в макете сетки из-за неправильного расчета количества видео, которое может поместиться в одну строку +• Исправлена ошибка, из-за которой диалоговое окно загрузки исчезало без каких-либо действий, если оно было открыто из меню «Поделиться» +• Обновлена библиотека, связанная с открытием внешних действий, таких как средство выбора файлов Storage Access Framework diff --git a/fastlane/metadata/android/ru/changelogs/974.txt b/fastlane/metadata/android/ru/changelogs/974.txt new file mode 100644 index 00000000000..b3591946a5a --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/974.txt @@ -0,0 +1,5 @@ +Быстрое исправление +•Исправлены проблемы с буферизацией, вызванные тротлингом YouTube +•Исправлено извлечение комментариев YouTube и сбои с отключенными комментариями +• Исправлен поиск музыки на YouTube +• Исправления прямых трансляций PeerTube diff --git a/fastlane/metadata/android/ru/changelogs/975.txt b/fastlane/metadata/android/ru/changelogs/975.txt new file mode 100644 index 00000000000..f0a6630fccc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/975.txt @@ -0,0 +1,17 @@ +Из нового +• Показ миниатюры во время поиска +• Обнаружение отключённых комментариев +• Разрешение отмечать элемент ленты как просматриваемый +• Показывать сердечки комментариев + +Улучшения +• Улучшено расположение метаданных и тегов +• Применение служебного цвета к компонентам пользовательского интерфейса + +Исправления +• Исправлена миниатюра в мини-плеере +• Исправлена бесконечная буферизация повторяющихся элементов очереди +• Некоторые исправления плеера, такие как вращение и более быстрое закрытие +• Исправлена ошибка, из-за которой ReCAPTCHA оставалась загруженной в фоновом режиме +• Отключины клики во время обновления элементов ленты +• Исправлены некоторые сбои загрузчика diff --git a/fastlane/metadata/android/ru/changelogs/976.txt b/fastlane/metadata/android/ru/changelogs/976.txt new file mode 100644 index 00000000000..2b24b0350a7 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/976.txt @@ -0,0 +1,10 @@ +• Добавлена возможность прямого открытия плеера в полноэкранном режиме +• Разрешение выбирать, какие типы поисковых предложений показывать +• Тёмная тема стала темнее + добавлен тёмный экран-заставка +• Улучшено средство выбора файлов, позволяющее выделить ненужные файлы серым цветом +• Исправлен импорт подписок YouTube +• Для повторного воспроизведения потока требуется повторное нажатие на кнопку воспроизведения +• Исправлено закрытие аудио сессии +• [Android TV] Исправлены долгие скачки панели поиска при использовании DPad + +Чтобы увидеть дальнейшие изменения, просмотрите журнал изменений (и сообщение в блоге) на вкладке «Ссылки» ниже. diff --git a/fastlane/metadata/android/ru/changelogs/977.txt b/fastlane/metadata/android/ru/changelogs/977.txt new file mode 100644 index 00000000000..f63e6a575ee --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/977.txt @@ -0,0 +1,10 @@ +• В меню длительного нажатия добавлена кнопка "перейти к следующему" +• В фильтр намерений добавлен префикс пути к YouTube shorts +• Исправлен импорт настроек +• Поменяны местами панель поиска с кнопками проигрывателя на экране очереди +• Различные исправления, связанные с MediasessionManager +• Исправлена ошибка, из-за которой панель поиска не закрывалась после окончания видео +• Отключено медиа-туннелирование на RealtekATV +• Расширена интерактивная область кнопок свёрнутого проигрывателя + +Чтобы увидеть дальнейшие изменения, просмотрите журнал изменений (и сообщение в блоге) на вкладке «Ссылки» ниже. diff --git a/fastlane/metadata/android/ru/changelogs/978.txt b/fastlane/metadata/android/ru/changelogs/978.txt new file mode 100644 index 00000000000..1ae2c65da9f --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/978.txt @@ -0,0 +1 @@ +Исправлено выполнение проверки для новых версий NewPipe. Иногда эта проверка выполнялась слишком рано, что приводило к падению приложения. Теперь это должно быть исправлено. diff --git a/fastlane/metadata/android/ru/changelogs/979.txt b/fastlane/metadata/android/ru/changelogs/979.txt new file mode 100644 index 00000000000..81235074a21 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/979.txt @@ -0,0 +1,2 @@ +- Исправлено возобновление воспроизведения +- Улучшения для службы, определяющей, должен ли NewPipe проверять наличие новой версии, не запускалась в фоновом режиме diff --git a/fastlane/metadata/android/ru/changelogs/980.txt b/fastlane/metadata/android/ru/changelogs/980.txt new file mode 100644 index 00000000000..7bc804b06d3 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/980.txt @@ -0,0 +1,13 @@ +Из нового +• Добавлена опция «Добавить в плейлист» в меню «Поделиться» +• Добавлена поддержка коротких ссылок y2u.be и PeerTube + +Улучшения +• Элементы управления скоростью воспроизведения стали более компактными. +• Лента теперь выделяет новые элементы +• Опция «Показывать просмотренные элементы» в ленте теперь сохраняется + +Исправления +• Исправлено извлечение лайков и дизлайков YouTube. +• Исправлен автоматический повтор после выхода из фонового режима +И многое другое diff --git a/fastlane/metadata/android/ru/changelogs/981.txt b/fastlane/metadata/android/ru/changelogs/981.txt new file mode 100644 index 00000000000..1e6aeb5aedc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/981.txt @@ -0,0 +1,2 @@ +Удалена поддержка MediaParser для исправления возобновления воспроизведения после буферизации на Android 11+. +Отключено медиа-туннелирование на Philips QM16XE для решения проблем с воспроизведением. diff --git a/fastlane/metadata/android/ru/changelogs/983.txt b/fastlane/metadata/android/ru/changelogs/983.txt new file mode 100644 index 00000000000..9e9a6e52c43 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/983.txt @@ -0,0 +1,9 @@ +Добавлен новый пользовательский интерфейс для поиска через двойное нажатие и поведения +Настройки сделаны более доступными для поиска +Выделенные закреплённые комментарии как таковые +Добавлена поддержка открытия с помощью приложения для экземпляра FSFE PeerTube. +Добавлены уведомления об ошибках +Исправлено повторное воспроизведение первого элемента очереди при смене плеера. +Подождите дольше при буферизации во время прямых трансляций, прежде чем произойдет сбой +Исправлен порядок результатов локального поиска +Исправлены пустые поля предметов в очереди воспроизведения diff --git a/fastlane/metadata/android/ru/changelogs/984.txt b/fastlane/metadata/android/ru/changelogs/984.txt new file mode 100644 index 00000000000..0a7a8ebcd0d --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/984.txt @@ -0,0 +1,7 @@ +Загружайте достаточно начальных элементов в списках, чтобы заполнить весь экран и исправить прокрутку на планшетах и телевизорах +Исправлены случайные сбои при прокрутке списков +Оверлейная дуга быстрого поиска теперь идёт под системным пользовательским интерфейсом +Отменены изменения в вырезах при воспроизведении в многооконном режиме, вызывая неуместную регрессию проигрывателя на некоторых телефонах. +Увеличен compileSdk с 30 до 31 +Обновлена библиотека отчётов об ошибках +Рефакторинг кода в плеере diff --git a/fastlane/metadata/android/ru/changelogs/986.txt b/fastlane/metadata/android/ru/changelogs/986.txt new file mode 100644 index 00000000000..679ea7d7cdf --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/986.txt @@ -0,0 +1,16 @@ +Из нового +• Уведомления о новых трансляциях +• Плавный переход между фоном и видеоплеерами +• Изменение скорости по полушагам +• Добавлена очередь основного проигрывателя в список воспроизведения + +Улучшения +• Запоминание размера шага скорости +• Уменьшина начальная долгая буферизация в видеоплеере +• Улучшен пользовательский интерфейс плеера для Android TV +• Подтверждение удаления всех загруженных файлов + +Исправления +• Исправлена ошибка, из-за которой кнопка мультимедиа не скрывала элементы управления проигрывателем +• Исправлен сброс воспроизведения при смене типа проигрывателя +• Исправлен поворот диалогового окна плейлиста diff --git a/fastlane/metadata/android/ru/changelogs/987.txt b/fastlane/metadata/android/ru/changelogs/987.txt index 8e97023650f..257179fc636 100644 --- a/fastlane/metadata/android/ru/changelogs/987.txt +++ b/fastlane/metadata/android/ru/changelogs/987.txt @@ -1,12 +1,12 @@ -Новое +Из нового • Поддержка методов доставки, отличных от прогрессивного HTTP: ускорение времени загрузки воспроизведения, исправления PeerTube и SoundCloud, воспроизведение недавно закончившихся трансляций YouTube • Кнопка «Добавить», чтобы добавить удаленный плейлист к локальному • Предпросмотр изображения на странице общего доступа Android 10+ -Улучшено +Улучшения • Улучшения окна параметров воспроизведения • Перемещение кнопки импорта/экспорта подписки в трехточечное меню -Исправлено +Исправления • Исправлено удаление полностью просмотренных видео из плейлиста • Исправлена тема меню «Поделиться» и пункт «Добавить в плейлист» diff --git a/fastlane/metadata/android/ru/changelogs/988.txt b/fastlane/metadata/android/ru/changelogs/988.txt new file mode 100644 index 00000000000..1464aa3b5c2 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Исправлена ошибка «Не удалось получить поток» при попытке воспроизвести любое видео. +[YouTube] Исправление «Следующий контент недоступен в этом приложении». Сообщение отображается вместо запрошенного видео diff --git a/fastlane/metadata/android/ru/changelogs/989.txt b/fastlane/metadata/android/ru/changelogs/989.txt new file mode 100644 index 00000000000..889fec465ca --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Исправлена бесконечная загрузка при попытке воспроизвести любое видео +• [YouTube] Исправлено замедление некоторых видео +• Обновлена библиотека jsoup до версии 1.15.3, которая включает исправления безопасности diff --git a/fastlane/metadata/android/ru/changelogs/990.txt b/fastlane/metadata/android/ru/changelogs/990.txt new file mode 100644 index 00000000000..195704f3a74 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/990.txt @@ -0,0 +1,15 @@ +В этом выпуске прекращена поддержка Android 4.4 KitKat, теперь минимальная версия — Android 5 Lollipop! + +Из нового +• Добавлен пункт "Загрузка" в меню длительного нажатия +• Возможность скрыть будущие видео в ленте +• Возможность делиться локальными плейлистами + +Улучшения +• Рефакторинг кода проигрывателя на небольшие компоненты: меньше оперативной памяти, меньше ошибок +• Улучшен режим масштабирования миниатюр. +• Заполнители векторных изображений + +Исправления +• Исправлены различные проблемы с уведомлением проигрывателя: устаревшая/отсутствующая информация о медиа, искажённая миниатюра +• Исправлен полноэкранный режим с использованием 1/4 экрана diff --git a/fastlane/metadata/android/ru/changelogs/991.txt b/fastlane/metadata/android/ru/changelogs/991.txt new file mode 100644 index 00000000000..6d4f2beac73 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/991.txt @@ -0,0 +1,13 @@ +Из нового +• Добавлена кнопка "Открыть в браузере" на панели ошибок +• Добавлена возможность отображать группы каналов в виде списка +• [YouTube] Нажмите и удерживайте сегменты потока, чтобы поделиться URL-адресом временной метки +• Добавлена кнопка очереди воспроизведения в мини-плеер + +Улучшения +• Добавлена исландская локализация и обновлены многие другие переводы +• Множество внутренних улучшений + +Исправления +• Исправление нескольких сбоев +• [YouTube] Исправлены проблемы с загрузкой каналов, невыделенной лентой и временным решением проблем с воспроизведением в некоторых странах diff --git a/fastlane/metadata/android/ru/changelogs/992.txt b/fastlane/metadata/android/ru/changelogs/992.txt new file mode 100644 index 00000000000..d4e5616fa50 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/992.txt @@ -0,0 +1,17 @@ +Из нового +• Количество подписчиков в сведениях о видео. +• Загрузить из очереди +• Навсегда установить миниатюру плейлиста +• Нажмите и удерживайте хэштеги и ссылки. +• Режим просмотра "карта" + +Улучшения +• Увеличенная кнопка закрытия мини-плеера +• Более плавное уменьшение миниатюр +• Целевой Android 13 (API 33) +• Поиск больше не останавливает плеер + +Исправления +• Исправлено наложение на DeX/мыши. +• Разрешить фоновый проигрыватель без отдельных аудиопотоков +• Различные исправления YouTube и многое другое… diff --git a/fastlane/metadata/android/ru/changelogs/993.txt b/fastlane/metadata/android/ru/changelogs/993.txt new file mode 100644 index 00000000000..dc0f2f63862 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/993.txt @@ -0,0 +1,12 @@ +Из нового +• Добавлено предупреждение при добавлении дубликатов плейлистов и добавлена кнопка для их удаления +• Разрешение игнорировать аппаратные кнопки +• Разрешение скрывать частично просмотренные видео в ленте + +Улучшения +• Используйте больше столбцов сетки на больших экранах +• Приведите индикаторы прогресса в соответствие с настройками + +Исправления +• Исправлено открытие URL-адресов браузера, загрузок и внешних проигрывателей на Android 11+ +• Исправлено взаимодействие с полноэкранным режимом, требующее двух нажатий в MIUI diff --git a/fastlane/metadata/android/ru/changelogs/994.txt b/fastlane/metadata/android/ru/changelogs/994.txt new file mode 100644 index 00000000000..3cc5bc01d83 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/994.txt @@ -0,0 +1,15 @@ +Новый +- Поддержка нескольких аудиодорожек/языков +- Возможность установки жестов громкости и яркости на любой стороне экрана +- Поддержка отображения основных вкладок в нижней части экрана + +Улучшено +- [Bandcamp] Обработка треков за платной стеной + +Исправлено +- [YouTube] 403 HTTP-ошибки для потоков +- Черный плеер при переключении на основной плеер из просмотра плейлиста +- Утечка памяти службы плеера +- [PeerTube] Аватары загрузчика и подканалов менялись местами + +и многое другое diff --git a/fastlane/metadata/android/ru/changelogs/995.txt b/fastlane/metadata/android/ru/changelogs/995.txt new file mode 100644 index 00000000000..11b54b66207 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/995.txt @@ -0,0 +1,16 @@ +Новое +• Поддержка вкладок каналов +• Выбор качества изображения +• Получение URL всех изображений + +Улучшено +• Доступность интерфейсов плееров +• Выбор аудио для скачивания только видео +• Возможность включения названий плейлистов и видео в общий плейлист + +Исправлено +• Получение кол-ва лайков +• Плеер не видит всплывающие окона и вылетает +• Выбор неправильных языков в переключателе языков +• Фокусировка звука проигрывателя не учитывала выключение звука +• Добавление элемента плейлиста иногда не работает diff --git a/fastlane/metadata/android/ru/changelogs/996.txt b/fastlane/metadata/android/ru/changelogs/996.txt new file mode 100644 index 00000000000..d516b0bc288 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/996.txt @@ -0,0 +1,2 @@ +Исправлена ошибка NullPointerException при открытии канала/конференции в media.ccc.de. +Гринч пытался сломать наш рождественский подарок вам, но мы починили его. diff --git a/fastlane/metadata/android/ru/changelogs/997.txt b/fastlane/metadata/android/ru/changelogs/997.txt new file mode 100644 index 00000000000..37c67289b9c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/997.txt @@ -0,0 +1,17 @@ +Новый +- Добавление ответов на комментарии +- Разрешить переупорядочивание плейлистов +- Показывать описание и продолжительность плейлиста +- Возможность сброса настроек + +Улучшено +- [Android 13+] Восстановление пользовательских действий с уведомлениями +- Запрос согласия на проверку обновлений +- Разрешить воспроизведение/паузу уведомлений при буферизации +- Изменение порядка некоторых настроек + +Исправлено +- [YouTube] Исправление не загружающихся комментариев, а также другие исправления и улучшения +- Устранение уязвимости в импорте настроек и переход на JSON +- Различные исправления загрузки +- Обрезка текста для поиска diff --git a/fastlane/metadata/android/ru/changelogs/998.txt b/fastlane/metadata/android/ru/changelogs/998.txt new file mode 100644 index 00000000000..d3978869d59 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/998.txt @@ -0,0 +1 @@ +Исправлено: YouTube не воспроизводил никакие потоки diff --git a/fastlane/metadata/android/ru/changelogs/999.txt b/fastlane/metadata/android/ru/changelogs/999.txt new file mode 100644 index 00000000000..d3978869d59 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/999.txt @@ -0,0 +1 @@ +Исправлено: YouTube не воспроизводил никакие потоки diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt index d25f04b0029..8daf4ef3a9f 100644 --- a/fastlane/metadata/android/ru/full_description.txt +++ b/fastlane/metadata/android/ru/full_description.txt @@ -1 +1 @@ -NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых сведений. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube, это свободное программное обеспечение. +NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых данных. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube, это свободное программное обеспечение. diff --git a/fastlane/metadata/android/si/full_description.txt b/fastlane/metadata/android/si/full_description.txt new file mode 100644 index 00000000000..c5300a7e97e --- /dev/null +++ b/fastlane/metadata/android/si/full_description.txt @@ -0,0 +1 @@ +NewPipe කිසිදු Google රාමු පුස්තකාලයක් හෝ YouTube API භාවිතා නොකරයි. එය අවශ්‍ය තොරතුරු ලබා ගැනීම සඳහා වෙබ් අඩවිය විග්‍රහ කරයි. එබැවින් මෙම යෙදුම Google සේවා ස්ථාපනය කර නොමැති උපාංග මත භාවිතා කළ හැක. එසේම, ඔබට NewPipe භාවිතා කිරීමට YouTube ගිණුමක් අවශ්‍ය නොවන අතර එය FLOSS වේ. diff --git a/fastlane/metadata/android/si/short_description.txt b/fastlane/metadata/android/si/short_description.txt new file mode 100644 index 00000000000..6f79e214d4a --- /dev/null +++ b/fastlane/metadata/android/si/short_description.txt @@ -0,0 +1 @@ +Android සඳහා නොමිලේ සැහැල්ලු YouTube ඉදිරි අන්තය. diff --git a/fastlane/metadata/android/sk/changelogs/1000.txt b/fastlane/metadata/android/sk/changelogs/1000.txt new file mode 100644 index 00000000000..36b9aeae1e9 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/1000.txt @@ -0,0 +1,13 @@ +Vylepšenie +- Umožnené kliknutie na popis playlistu, aby sa zobrazilo viac/menej obsahu +- [PeerTube] Automatické spracovanie odkazov inštancie `subscribeto.me` +- Spustenie prehrávania iba jednej položky v histórii + +Opravené +- Oprava viditeľnosti tlačidla RSS +- Oprava pádov náhľadu na paneli vyhľadávania +- Oprava pridania položky bez miniatúry do playlistu +- Oprava ukončenia okna sťahovania pred jeho zobrazením +- Oprava vyskakovacieho okna zoznamu súvisiacich položiek +- Oprava poradia v okne pridania do playlistu +- Úprava rozloženia položiek záložiek playlistu 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/68.txt b/fastlane/metadata/android/sk/changelogs/68.txt new file mode 100644 index 00000000000..238b1e0b18c --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/68.txt @@ -0,0 +1,31 @@ +# changes of v0.14.1 + +### Fixed +- Fixed failed to decrypt video url #1659 +- Fixed description link not extract well #1657 + +# changes of v0.14.0 + +### New +- New Drawer design #1461 +- New customizable front page #1461 + +### Improvements +- Reworked Gesture controls #1604 +- New way to close the popup player #1597 + +### Fixed +- Fix error when subscription count is not available. Closes #1649. + - Show "Subscriber count not available" in those cases +- Fix NPE when a YouTube playlist is empty +- Quick fix for the kiosks in SoundCloud +- Refactor and bugfix #1623 + - Fix Cyclic search result #1562 + - Fix Seek bar not statically lay outed + - Fix YT Premium video are not blocked correctly + - Fix Videos sometimes not loading (due to DASH parsing) + - Fix links in video description + - Show warning when someone tries to download to external sdcard + - fix nothing shown exception triggers report + - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Fix registering of broadcast receiver. Closes #1641. diff --git a/fastlane/metadata/android/sk/changelogs/69.txt b/fastlane/metadata/android/sk/changelogs/69.txt new file mode 100644 index 00000000000..c8262d1b0d7 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/69.txt @@ -0,0 +1,19 @@ +### New +- Long-tap delete and share in subscriptions #1516 +- Tablet UI and grid list layout #1617 + +### Improvements +- store and reload the last used aspect ratio #1748 +- Enable linear layout in Downloads activity with full video names #1771 +- Delete and share subscriptions directly from within the subscriptions tab #1516 +- Enqueuing now triggers video playing if the play queue has already ended #1783 +- Separate settings for volume and brightness gestures #1644 +- Add support for Localization #1792 + +### Fixes +- Fix time parsing for . format, so NewPipe can be used in Finland +- Fix subscription count +- Add foreground service permission for API 28+ devices #1830 + +### Known Bugs +- Playback state can not be saved on Android P diff --git a/fastlane/metadata/android/sk/changelogs/70.txt b/fastlane/metadata/android/sk/changelogs/70.txt new file mode 100644 index 00000000000..ad87a4409c5 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/70.txt @@ -0,0 +1,25 @@ +ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯ + +### Improvements +* downloaded files can now be opened with one click #1879 +* drop support for android 4.1 - 4.3 #1884 +* remove old player #1884 +* remove streams from current play queue by swiping them to the right #1915 +* remove auto queued stream when a new stream is enqueued manually #1878 +* Postprocessing for downloads and implement missing features #1759 by @kapodamy + * Post-processing infrastructure + * Proper error handling "infrastructure" (for downloader) + * Queue instead of multiple downloads + * Move serialized pending downloads (`.giga` files) to app data + * Implement max download retry + * Proper multi-thread download pausing + * Stop downloads when swicthing to mobile network (never works, see 2nd point) + * Save the thread count for next downloads + * A lot of incoherences fixed + +### Fixed +* Fix crash with default resolution set to best and limited mobile data resolution #1835 +* pop-up player crash fixed #1874 +* NPE when trying to open background player #1901 +* Fix for inserting new streams when auto queuing is enabled #1878 +* Fixed the decypering shuttown issue diff --git a/fastlane/metadata/android/sk/changelogs/71.txt b/fastlane/metadata/android/sk/changelogs/71.txt new file mode 100644 index 00000000000..5facfc05f3a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/71.txt @@ -0,0 +1,10 @@ +### Improvements +* Add app update notification for GitHub build (#1608 by @krtkush) +* Various improvements to the downloader (#1944 by @kapodamy): + * add missing white icons and use hardcored way for change the icon colors + * check if the iterator is initialized (fixes #2031) + * allow retry downloads with "post-processing failed" error in the new muxer + * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039) + +### Fixed +* YouTube live streams stop playing after a short time (#1996 by @yausername) diff --git a/fastlane/metadata/android/sk/changelogs/730.txt b/fastlane/metadata/android/sk/changelogs/730.txt new file mode 100644 index 00000000000..c317f53d26b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/730.txt @@ -0,0 +1,2 @@ +# Fixed +- Hot fix decrypt function error again. diff --git a/fastlane/metadata/android/sk/changelogs/740.txt b/fastlane/metadata/android/sk/changelogs/740.txt new file mode 100644 index 00000000000..c795978a894 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/740.txt @@ -0,0 +1,23 @@ +

    Improvements

    +
      +
    • make links in comments clickable, increase text size
    • +
    • seek on clicking timestamp links in comments
    • +
    • show preferred tab based on recently selected state
    • +
    • add playlist to queue when long clicking on 'Background' in playlist window
    • +
    • search for shared text when it is not an URL
    • +
    • add "share at current time" button to the main video player
    • +
    • add close button to main player when video queue is finished
    • +
    • add "Play directly in Background" to longpress menu for video list items
    • +
    • improve English translations for Play/Enqueue commands
    • +
    • small performance improvements
    • +
    • remove unused files
    • +
    • update ExoPlayer to 2.9.6
    • +
    • add support for Invidious links
    • +
    +

    Fixed

    +
      +
    • fixed scroll w/ comments and related streams disabled
    • +
    • fixed CheckForNewAppVersionTask being executed when it shouldn't
    • +
    • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
    • +
    • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
    • +
    diff --git a/fastlane/metadata/android/sk/changelogs/750.txt b/fastlane/metadata/android/sk/changelogs/750.txt new file mode 100644 index 00000000000..39b77f7c346 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/750.txt @@ -0,0 +1,22 @@ +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/sk/changelogs/760.txt b/fastlane/metadata/android/sk/changelogs/760.txt new file mode 100644 index 00000000000..6e000f6d9f0 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/760.txt @@ -0,0 +1,43 @@ +Changes in 0.17.1 + +New +• Thai localization + + +Improved +• Add start playing here action in long-press menus for playlists again #2518 +• Add switch for SAF / legacy file picker #2521 + +Fixed +• Fix disappearing buttons in downloads view when switching apps #2487 +• Fix playback position is stored although watch history is disabled +• Fix reduced performance caused by playback position in list views #2517 +• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 + + + +Changes in 0.17.0 + +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/sk/changelogs/770.txt b/fastlane/metadata/android/sk/changelogs/770.txt new file mode 100644 index 00000000000..439c6532b34 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/770.txt @@ -0,0 +1,4 @@ +Changes in 0.17.2 + +Fix +• Fix no video was available diff --git a/fastlane/metadata/android/sk/changelogs/780.txt b/fastlane/metadata/android/sk/changelogs/780.txt new file mode 100644 index 00000000000..9100d7335f0 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/780.txt @@ -0,0 +1,12 @@ +Changes in 0.17.3 + +Improved +• Added option to clear playback states #2550 +• Show hidden directories in the file picker #2591 +• Support URLs from `invidio.us` instances to be opened with NewPipe #2488 +• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Fixed +• [YouTube] Fixed 'java.lang.IllegalArgumentException #192 +• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195 +• Fixed performance problem in android pie when downloading a stream #2592 diff --git a/fastlane/metadata/android/sk/changelogs/790.txt b/fastlane/metadata/android/sk/changelogs/790.txt new file mode 100644 index 00000000000..ec77b2acb0d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/790.txt @@ -0,0 +1,14 @@ +Improved +• Add more titles to improve accessibility for blind people #2655 +• Make language of download folder setting more consistent and less ambiguous #2637 + +Fixed +• Check if last byte in the block is downloaded #2646 +• Fixed scrolling in video detail fragment #2672 +• Remove double search clear box animations to one #2695 +• [SoundCloud] Fix client_id extraction #2745 + +Development +• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 +• Migrate to AndroidX #2685 +• Update to ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/sk/changelogs/800.txt b/fastlane/metadata/android/sk/changelogs/800.txt new file mode 100644 index 00000000000..332b5c9946d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/800.txt @@ -0,0 +1,27 @@ +New +• PeerTube support without P2P (#2201) [Beta]: + ◦ Watch and download videos from PeerTube instances + ◦ Add instances in the settings to access the complete PeerTube world + ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. + +• Downloader (#2679): + ◦ Calculate download ETA + ◦ Download opus (webm files) as ogg + ◦ Recover expired download links to resume downloads after a long pause + +Improved +• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 +• Use new Localization and Downloader implementations from extractor #2713 +• Make "Default kiosk" string translatable +• Black navigation bar for black theme #2569 + +Fixed +• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 +• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 +• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 +• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] Fix audio stream extraction + +Development +• Update ExoPlayer to 2.10.8 #2791, #2816 +• Update Gradle to 3.5.1 and add Kotlin support #2714 diff --git a/fastlane/metadata/android/sk/changelogs/810.txt b/fastlane/metadata/android/sk/changelogs/810.txt new file mode 100644 index 00000000000..c75855fd18a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/810.txt @@ -0,0 +1,19 @@ +New +• Show video thumbnail on the lock screen when playing in the background + +Improved +• Add local playlist to queue when long pressing on background / popup button +• Make main page tabs scrollable and hide when there is only a single tab +• Limit amount of notification thumbnail updates in background player +• Add dummy thumbnail for empty local playlists +• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown +• Add button to delete downloaded files or download history in "Downloads" +• [YouTube] Add support to /c/shortened_url channel links + +Fixed +• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly +• Fixed player access out of its creation thread +• Fixed search result paging +• [YouTube] Fixed switching on null causing NPE +• [YouTube] Fixed viewing comments when opening an invidio.us url +• [SoundCloud] Updated client_id diff --git a/fastlane/metadata/android/sk/changelogs/820.txt b/fastlane/metadata/android/sk/changelogs/820.txt new file mode 100644 index 00000000000..d562917110c --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/820.txt @@ -0,0 +1 @@ +Fixed decrypt function name regex making YouTube unusable. diff --git a/fastlane/metadata/android/sk/changelogs/830.txt b/fastlane/metadata/android/sk/changelogs/830.txt new file mode 100644 index 00000000000..c9876f3381a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/830.txt @@ -0,0 +1 @@ +Updated SoundCloud client_id to fix SoundCloud issues. diff --git a/fastlane/metadata/android/sk/changelogs/840.txt b/fastlane/metadata/android/sk/changelogs/840.txt new file mode 100644 index 00000000000..95dc80844c8 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/840.txt @@ -0,0 +1,22 @@ +New +• Added language selector to change the app language +• Added send to Kodi button to player collapsible menu +• Added ability to copy comments on long press + +Improved +• Fix ReCaptcha activity and correctly save obtained cookies +• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings +• Ask for display over other apps permission in settings correctly on Android 6 and later +• Rename local playlist by long-clicking in BookmarkFragment +• Various PeerTube improvements +• Improved several English source strings + +Fixed +• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized +• Fix initial brightness value for gesture +• Fixed .srt subtitle downloads containing not all line breaks +• Fixed download to SD card failing because some Android 5 devices are not CTF compliant +• Fixed downloading on Android KitKat +• Fixed corrupt video .mp4 file being recognized as audio file +• Fixed multiple localization problems, including wrong Chinese language codes +• [YouTube] Timestamps in description are clickable again diff --git a/fastlane/metadata/android/sk/changelogs/850.txt b/fastlane/metadata/android/sk/changelogs/850.txt new file mode 100644 index 00000000000..91f8306daea --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/850.txt @@ -0,0 +1 @@ +Tn this release the YouTube website version was updated. The old website version is going to be discontinued in March and therefore you are required to upgrade NewPipe. diff --git a/fastlane/metadata/android/sk/changelogs/860.txt b/fastlane/metadata/android/sk/changelogs/860.txt new file mode 100644 index 00000000000..9b1567f82b9 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/860.txt @@ -0,0 +1,7 @@ +Improved +• Save and restore whether pitch and tempo are unhooked or not +• Support display cutout in player +• Round view and subscriber count +• Optimized YouTube to use less data + +More than 15 YouTube-related bugs were fixed in this release. diff --git a/fastlane/metadata/android/sk/changelogs/870.txt b/fastlane/metadata/android/sk/changelogs/870.txt new file mode 100644 index 00000000000..4d9da919012 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/870.txt @@ -0,0 +1,2 @@ +This is a hotfix release updating NewPipe to allow using SoundCloud without major hassles again. +SoundCloud's v2 API is used in the extractor now and the detection of invalid client IDs has been improved. diff --git a/fastlane/metadata/android/sk/changelogs/900.txt b/fastlane/metadata/android/sk/changelogs/900.txt new file mode 100644 index 00000000000..78a617e47f4 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/900.txt @@ -0,0 +1,14 @@ +New +• Subscription groups and sorted feeds +• Mute button in players + +Improved +• Allow opening music.youtube.com and media.ccc.de links in NewPipe +• Relocate two settings from Appearance to Content +• Hide 5, 15, 25 second seek options if inexact seek is enabled + +Fixed +• some WebM videos are not seekable +• database backup on Android P +• crash when sharing a downloaded file +• tons of YouTube extraction issue and more ... diff --git a/fastlane/metadata/android/sk/changelogs/910.txt b/fastlane/metadata/android/sk/changelogs/910.txt new file mode 100644 index 00000000000..ac2755ece75 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/910.txt @@ -0,0 +1 @@ +Fixed database migration which prevented NewPipe from starting in some rare cases. diff --git a/fastlane/metadata/android/sk/changelogs/920.txt b/fastlane/metadata/android/sk/changelogs/920.txt new file mode 100644 index 00000000000..1484a6bd0ff --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/920.txt @@ -0,0 +1,9 @@ +Improved + +• Added upload date and view count on stream grid items +• Improvements for the drawer header layout + +Fixed + +• Fixed mute button causing crashes on API 19 +• Fixed downloading of long 1080p 60fps videos diff --git a/fastlane/metadata/android/sk/changelogs/930.txt b/fastlane/metadata/android/sk/changelogs/930.txt new file mode 100644 index 00000000000..b23b01ea8ce --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/930.txt @@ -0,0 +1,19 @@ +New +• Search on YouTube Music +• Basic Android TV support + +Improved +• Added the ability to remove all watched videos from a local playlist +• Show message when content isn't supported yet instead of crashing +• Improved popup player resize with pinch gestures +• Enqueue streams on long press on background and popup buttons in channel +• Improved size handling of the drawer header title + +Fixed +• Fixed age restricted content setting not working +• Fixed certain kinds of reCAPTCHAs +• Fixed crash when opening bookmarks while playlist is `null` +• Fixed detection of network related exceptions +• Fixed visibility of group sort button in the subscriptions fragment + +and more diff --git a/fastlane/metadata/android/sk/changelogs/940.txt b/fastlane/metadata/android/sk/changelogs/940.txt new file mode 100644 index 00000000000..f9530bc68c4 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/940.txt @@ -0,0 +1,16 @@ +New +• Add support for SoundCloud comments +• Add YouTube restricted mode setting +• Show PeerTube parent channel details + +Improved +• Show Kore button only for supported services +• Block player gestures that begin at the NavigationBar or StatusBar +• Change retry & subscribe buttons background color based on service color + +Fixed +• Fix download dialog freeze +• Open in browser button now really opens in browser +• Fix crash on opening videos and "Could not play this stream" + +and more diff --git a/fastlane/metadata/android/sk/changelogs/950.txt b/fastlane/metadata/android/sk/changelogs/950.txt new file mode 100644 index 00000000000..2c044099d9d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/950.txt @@ -0,0 +1,4 @@ +This release brings three small fixes: +• Fixed storage access on Adroid 10+ +• Fixed opening kiosks +• Fixed duration parsing of long videos diff --git a/fastlane/metadata/android/sk/changelogs/951.txt b/fastlane/metadata/android/sk/changelogs/951.txt new file mode 100644 index 00000000000..e933e5cbd48 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/951.txt @@ -0,0 +1,17 @@ +New +• Add search for subscription picker in the feed group dialog +• Add filter to the feed group dialog to show only ungrouped subscriptions +• Add playlist tab to main page +• Fast forward/rewind in background/pop-up player queue +• Display search suggestion: did you mean & showing result for + +Improved +• Drop writing application metadata in muxed files +• Do not remove failed streams from the queue +• Update status bar color to match toolbar color + +Fixed +• Fixed audio/video desync caused by floating point cumulative errors +• [PeerTube] Handle deleted comments + +and more diff --git a/fastlane/metadata/android/sk/changelogs/952.txt b/fastlane/metadata/android/sk/changelogs/952.txt new file mode 100644 index 00000000000..d228e3a2ddb --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/952.txt @@ -0,0 +1,7 @@ +Improved +• Auto-play is available for all services (instead of only for YouTube) + +Fixed +• Fixed related streams by supporting YouTube's new continuations +• Fixed age restricted YouTube videos +• [Android TV] Fixed lingering focus highlight overlay diff --git a/fastlane/metadata/android/sk/changelogs/953.txt b/fastlane/metadata/android/sk/changelogs/953.txt new file mode 100644 index 00000000000..95428b44822 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/953.txt @@ -0,0 +1 @@ +Fix extraction of YouTube's decryption function. diff --git a/fastlane/metadata/android/sk/changelogs/954.txt b/fastlane/metadata/android/sk/changelogs/954.txt new file mode 100644 index 00000000000..42753ab4fe0 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/954.txt @@ -0,0 +1,9 @@ +• new application workflow: play videos on detail page, swipe down to minimize player +• MediaStyle notifications: customizable actions in notifications, performance improvements +• basic resizing when using NewPipe as desktop app + +• show dialog with open options in case of an unsupported URL toast +• Improve search suggestion experience when remote ones can't be fetched +• Increased default video quality to 720p60 (in-app player) and 480p (pop-up player) + +• tons of bug fixes and more diff --git a/fastlane/metadata/android/sk/changelogs/955.txt b/fastlane/metadata/android/sk/changelogs/955.txt new file mode 100644 index 00000000000..bfbdc71617b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/955.txt @@ -0,0 +1,3 @@ +[YouTube] Fix search for some users +[YouTube] Fix random decryption exceptions +[SoundCloud] URLs that end with a slash are now parsed correctly diff --git a/fastlane/metadata/android/sk/changelogs/956.txt b/fastlane/metadata/android/sk/changelogs/956.txt new file mode 100644 index 00000000000..d7f50ead5b5 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] Fixed crash when loading any video diff --git a/fastlane/metadata/android/sk/changelogs/957.txt b/fastlane/metadata/android/sk/changelogs/957.txt new file mode 100644 index 00000000000..f84bc82b283 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/957.txt @@ -0,0 +1,10 @@ +• Unify specific enqueue actions into one +• Two finger gesture to close player +• Allow clearing reCAPTCHA cookies +• Option to not colorize notification +• Improve how video details are opened to fix infinite buffering, buggy behaviour when sharing to NewPipe and other inconsistencies +• Speed up YouTube videos and fix age restricted ones +• Fix crash on fast forward/rewind +• Don't rearrange lists by dragging thumbnails +• Always remember popup properties +• Add Santali language diff --git a/fastlane/metadata/android/sk/changelogs/958.txt b/fastlane/metadata/android/sk/changelogs/958.txt new file mode 100644 index 00000000000..e72f8cf6c6b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/958.txt @@ -0,0 +1,15 @@ +New and improved: +• Re-added option to hide thumbnail on lock screen +• Pull to refresh feed +• Improved performance when fetching local lists + +Fixed: +• Fixed crash when starting NewPipe after it was removed from RAM +• Fixed crash on startup when there is no internet connection +• Fixed respecting brightness- and volume-gesture settings +• [YouTube] Fixed long playlists + +Other: +• Code cleanup and several internal improvements +• Dependency updates +• Translation updates diff --git a/fastlane/metadata/android/sk/changelogs/959.txt b/fastlane/metadata/android/sk/changelogs/959.txt new file mode 100644 index 00000000000..58a5d4306a2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/959.txt @@ -0,0 +1,3 @@ +Fixed endless loop of crashes after opening the error reporter. +Updated list of PeerTube instances which can be opened automatically by NewPipe. +Updated translations. diff --git a/fastlane/metadata/android/sk/changelogs/960.txt b/fastlane/metadata/android/sk/changelogs/960.txt new file mode 100644 index 00000000000..de4309d490e --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/960.txt @@ -0,0 +1,4 @@ +• Improved description of export database option in settings. +• Fixed YouTube comments parsing. +• Fixed display name of media.ccc.de service. +• Updated translations. diff --git a/fastlane/metadata/android/sk/changelogs/961.txt b/fastlane/metadata/android/sk/changelogs/961.txt new file mode 100644 index 00000000000..13001246f24 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Mix support +• [YouTube] Display info about public broadcasters and Covid-19 +• [media.ccc.de] Added recent videos +• Added Somali translation + +• Many internal improvements + +• Fixed sharing videos from within the player +• Fixed blank ReCaptcha webview +• Fixed crash which occurred when removing a stream from a list +• [PeerTube] Fixed related streams +• [YouTube] Fixed YouTube Music search diff --git a/fastlane/metadata/android/sk/changelogs/962.txt b/fastlane/metadata/android/sk/changelogs/962.txt new file mode 100644 index 00000000000..a2f47964bc0 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/962.txt @@ -0,0 +1,2 @@ +Added "recent" videos to media.ccc.de service. +Added live streams to media.ccc.de service and also live stream support. diff --git a/fastlane/metadata/android/sk/changelogs/963.txt b/fastlane/metadata/android/sk/changelogs/963.txt new file mode 100644 index 00000000000..72be99a972c --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Fixed channel continuation diff --git a/fastlane/metadata/android/sk/changelogs/964.txt b/fastlane/metadata/android/sk/changelogs/964.txt new file mode 100644 index 00000000000..1238eb87691 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/964.txt @@ -0,0 +1,8 @@ +• Added support for chapters in player controls +• [PeerTube] Added Sepia search +• Re-added share button in video detail view and moved stream description into the tab layout +• Disable restoring brightness if brightness gesture is disabled +• Added list item to play video on kodi +• Fixed crash when no default browser is set on some devices and improve share dialogs +• Toggle play/pause with hardware space button in fullscreen player +• [media.ccc.de] Various fixes and improvements diff --git a/fastlane/metadata/android/sk/changelogs/965.txt b/fastlane/metadata/android/sk/changelogs/965.txt new file mode 100644 index 00000000000..eaed8c84778 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/965.txt @@ -0,0 +1,6 @@ +Fixed crash which occurred when reordering channel groups. +Fixed getting more YouTube videos from channels and playlists. +Fixed getting YouTube comments. +Added support for /watch/, /v/ and /w/ subpaths in YouTube URLs. +Fixed extraction of SoundCloud client id and geo-restricted content. +Added Northern Kurdish localization. diff --git a/fastlane/metadata/android/sk/changelogs/966.txt b/fastlane/metadata/android/sk/changelogs/966.txt new file mode 100644 index 00000000000..b7fdc182fa4 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/966.txt @@ -0,0 +1,14 @@ +New: +• Add a new service: Bandcamp + +Improved: +• Add an option to have the app follow the device theme +• Prevent some crashes by showing an improved error panel +• Show more information on why content in unavailable +• Hardware space button triggers play/pause +• Show "Download started" toast + +Fixed: +• Fix very small thumbnail in video details while playing in the background +• Fix empty title in minimized player +• Fix last resize mode not being restored correctly diff --git a/fastlane/metadata/android/sk/changelogs/967.txt b/fastlane/metadata/android/sk/changelogs/967.txt new file mode 100644 index 00000000000..e5a8868caa4 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/967.txt @@ -0,0 +1 @@ +Fixed YouTube not working properly in the EU. This was caused by a new cookie and privacy consent system which requires NewPipe to set a CONSENT cookie. diff --git a/fastlane/metadata/android/sk/changelogs/968.txt b/fastlane/metadata/android/sk/changelogs/968.txt new file mode 100644 index 00000000000..3972a96c159 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/968.txt @@ -0,0 +1,7 @@ +Added channel details option to long-press menu. +Added functionality to rename Playlist Name from playlist interface. +Allow the user to pause while a video is buffering. +Polished the white theme. +Fixed overlapping fonts when using a larger font size. +Fixed no video on Formuler and Zephier devices. +Fixed various crashes. diff --git a/fastlane/metadata/android/sk/changelogs/970.txt b/fastlane/metadata/android/sk/changelogs/970.txt new file mode 100644 index 00000000000..f4ff5fe3483 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/970.txt @@ -0,0 +1,11 @@ +New +• Show content metadata (tags, categories, license, ...) below the description +• Added "Show channel details" option in remote (non-local) playlists +• Added "Open in browser" option to long-press menu + +Fixed +• Fixed rotation crash on video detail page +• Fixed "Play with Kodi" button in player always prompts to install Kore +• Fixed and improved setting import and export paths +• [YouTube] Fixed comment like count +And much more diff --git a/fastlane/metadata/android/sk/changelogs/971.txt b/fastlane/metadata/android/sk/changelogs/971.txt new file mode 100644 index 00000000000..8e1a71457b8 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/971.txt @@ -0,0 +1,3 @@ +Hotfix +• Increase buffer for playback after rebuffer +• Fixed crash on tablets and TVs when clicking on the play-queue icon in the player diff --git a/fastlane/metadata/android/sk/changelogs/972.txt b/fastlane/metadata/android/sk/changelogs/972.txt new file mode 100644 index 00000000000..318890d608c --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/972.txt @@ -0,0 +1,14 @@ +New +Recognize timestamps and hashtags in description +Added manual tablet mode setting +Added ability to hide played items in a feed + +Improved +Support Storage Access Framework properly +Better error handling of unavailable and terminated channels +The Android share sheet for Android 10+ users now shows the content title. +Updated Invidious instances and support Piped links. + +Fixed +[YouTube] Age restricted content +Prevent leaked window Exception when opening choice dialog diff --git a/fastlane/metadata/android/sk/changelogs/973.txt b/fastlane/metadata/android/sk/changelogs/973.txt new file mode 100644 index 00000000000..120359a24cd --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/973.txt @@ -0,0 +1,4 @@ +Hotfix +• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row +• Fix download dialog disappearing without doing anything if opened from the share menu +• Update a library related to opening external activities such as the Storage Access Framework file picker diff --git a/fastlane/metadata/android/sk/changelogs/974.txt b/fastlane/metadata/android/sk/changelogs/974.txt new file mode 100644 index 00000000000..e028a5e0b3a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/974.txt @@ -0,0 +1,5 @@ +Hotfix +• Fix buffering issues caused by YouTube throttling +• Fix YouTube comments extraction and crashes with disabled comments +• Fix YouTube music search +• Fix PeerTube livestreams diff --git a/fastlane/metadata/android/sk/changelogs/975.txt b/fastlane/metadata/android/sk/changelogs/975.txt new file mode 100644 index 00000000000..8a35a7e2810 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/975.txt @@ -0,0 +1,17 @@ +New +• Show a thumbnail preview while seeking +• Detect disabled comments +• Allow marking a feed item as watched +• Show comment hearts + +Improved +• Improve metadata and tags layout +• Apply service color to UI components + +Fixed +• Fix thumbnail in mini player +• Fix endless buffering on duplicate queue items +• Some player fixes like rotation and faster closing +• Fix ReCAPTCHA remaining loaded in background +• Disable clicks while refreshing feed +• Fix some downloader crashes diff --git a/fastlane/metadata/android/sk/changelogs/976.txt b/fastlane/metadata/android/sk/changelogs/976.txt new file mode 100644 index 00000000000..4f868872bbe --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/976.txt @@ -0,0 +1,10 @@ +• Added option to directly open player in fullscreen +• Allow choosing which types of search suggestions to show +• Dark theme now darker + dark splash screen added +• Improved file picker to gray out unwanted files +• Fixed importing YouTube subscriptions +• Replaying a stream requires on tap on the replay button again +• Fixed closing audio session +• [Android TV] Fixed long seekbar jumps when using a DPad + +To see further changes, view the changelog (and blog post) from the Links tab below. diff --git a/fastlane/metadata/android/sk/changelogs/977.txt b/fastlane/metadata/android/sk/changelogs/977.txt new file mode 100644 index 00000000000..df2eb6c9ea7 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/977.txt @@ -0,0 +1,10 @@ +• Added a "play next" button to the long press menu +• Added YouTube shorts path prefix to intent filter +• Fixed Settings import +• Swap seekbar position with player buttons in Queue screen +• Various fixes related to MediasessionManager +• Fixed seekbar not completed after video end +• Disabled media tunneling on RealtekATV +• Expanded minimized player buttons clickable area + +To see further changes, view the changelog (and blog post) from the Links tab below. diff --git a/fastlane/metadata/android/sk/changelogs/978.txt b/fastlane/metadata/android/sk/changelogs/978.txt new file mode 100644 index 00000000000..34fa05f85fb --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/978.txt @@ -0,0 +1 @@ +Fixed executing the check for a new NewPipe version. This check was executed too early sometimes and therefore lead to an app crash. That should be fixed now. diff --git a/fastlane/metadata/android/sk/changelogs/979.txt b/fastlane/metadata/android/sk/changelogs/979.txt new file mode 100644 index 00000000000..5da4f70fbe5 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/979.txt @@ -0,0 +1,2 @@ +- Fixed resuming playback +- Improvements to ensure that the service which determines if NewPipe should check for a new version checks is not started in background diff --git a/fastlane/metadata/android/sk/changelogs/980.txt b/fastlane/metadata/android/sk/changelogs/980.txt new file mode 100644 index 00000000000..bd3086c6817 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/980.txt @@ -0,0 +1,13 @@ +New +• Added "Add to playlist" option to share menu +• Added support for y2u.be and PeerTube short links + +Improved +• Made Playback-Speed-Controls more compact +• Feed highlights new items now +• "Show watched items" option in the feed is now saved + +Fixed +• Fixed YouTube likes and dislikes extraction +• Fixed automatic replay after returning from the background +And much more diff --git a/fastlane/metadata/android/sk/changelogs/981.txt b/fastlane/metadata/android/sk/changelogs/981.txt new file mode 100644 index 00000000000..9a2230ade33 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/981.txt @@ -0,0 +1,2 @@ +Removed MediaParser support to fix failing playback resume after buffering on Android 11+. +Disabled media tunneling on Philips QM16XE to fix playback problems. diff --git a/fastlane/metadata/android/sk/changelogs/982.txt b/fastlane/metadata/android/sk/changelogs/982.txt new file mode 100644 index 00000000000..ab2c0ae0b06 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/982.txt @@ -0,0 +1 @@ +Fixed YouTube not playing any stream. diff --git a/fastlane/metadata/android/sk/changelogs/983.txt b/fastlane/metadata/android/sk/changelogs/983.txt new file mode 100644 index 00000000000..efbd0557c49 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/983.txt @@ -0,0 +1,9 @@ +Add new double-tap-to-seek UI and behaviour +Make settings searchable +Highlight pinned comments as such +Add open-with-app support for FSFE's PeerTube instance +Add error notifications +Fix replay of first queue item on player change +Wait longer when buffering during livestreams before failing +Fix order of local search results +Fix empty item fields in play queue diff --git a/fastlane/metadata/android/sk/changelogs/984.txt b/fastlane/metadata/android/sk/changelogs/984.txt new file mode 100644 index 00000000000..3b18b46652a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/984.txt @@ -0,0 +1,7 @@ +Load enough initial items in lists to fill the whole screen and to fix scrolling on tablets and TVs +Fix random crashes while scrolling through lists +Have the player fast seek overlay arc go under the system UI +Revert changes to cutouts when playing in multi window, causing the misplaced player regression on some phones +Increase compileSdk from 30 to 31 +Update error reporting library +Refactor some code in the player diff --git a/fastlane/metadata/android/sk/changelogs/985.txt b/fastlane/metadata/android/sk/changelogs/985.txt new file mode 100644 index 00000000000..2f96b8dc548 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/985.txt @@ -0,0 +1 @@ +Fixed YouTube not playing any stream diff --git a/fastlane/metadata/android/sk/changelogs/986.txt b/fastlane/metadata/android/sk/changelogs/986.txt new file mode 100644 index 00000000000..49f7478e6db --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/986.txt @@ -0,0 +1,16 @@ +New +• Notifications for new streams +• Seamless transition between background and video players +• Change pitch by semitones +• Append the main player queue to a playlist + +Improved +• Remember speed/pitch step size +• Mitigate initial long buffering in the video player +• Improve player UI for Android TV +• Confirm before deleting all downloaded files + +Fixed +• Fix media button not hiding player controls +• Fix playback reset on player type change +• Fix rotating the playlist dialog diff --git a/fastlane/metadata/android/sk/changelogs/988.txt b/fastlane/metadata/android/sk/changelogs/988.txt new file mode 100644 index 00000000000..c8e502e6016 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Fix "Could not get any stream" error when trying to play any video +[YouTube] Fix "The Following content is not available on this app." message shown instead of the video requested 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/sk/changelogs/994.txt b/fastlane/metadata/android/sk/changelogs/994.txt new file mode 100644 index 00000000000..4095fafb2cd --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/994.txt @@ -0,0 +1,15 @@ +Nové +• Podpora viacerých zvukových skladieb / jazykov +• Umožňuje nastaviť objem a jasové gestá na každej strane obrazovky +• Podpora pre zobrazenie hlavných bodov v dolnej časti obrazovky + +Zlepšené +• [Bandcamp] podpora skladieb dostupná pre predplatiteľov + +Opravené +• [YouTube] 403 HTTP chýb pre streamy +• Čierná obrazovka pri prepínaní do hlavného prehrávača zo zobraznia z playlistu +• Pretečenie pamäte prehrávača +• [PeerTube] Avatary uploadera a subkanála boli vymenené + +a viac diff --git a/fastlane/metadata/android/sk/changelogs/995.txt b/fastlane/metadata/android/sk/changelogs/995.txt new file mode 100644 index 00000000000..9729b3f70b3 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/995.txt @@ -0,0 +1,16 @@ +Nové +- Podpora kariet kanálov +- Výber kvality obrázka +- Získate adresy URL všetkých obrázkov + +Vylepšené +- Prístupnosť rozhrania prehrávača +- Lepší výber zvuku pri sťahovaní videa +- Možnosť zahrnúť názvy playlistov a videí do zdieľaného obsahu playlistov + +Opravené +- [YouTube] Oprava získavania počtu lajkov +- Oprava vyskakovacích okien a pádov prehrávača +- Výber nesprávnych jazykov vo výbere jazyka +- Zameranie zvuku prehrávača nerešpektovalo stlmenie +- Občas nefungovalo pridávanie položiek do playlistu diff --git a/fastlane/metadata/android/sk/changelogs/996.txt b/fastlane/metadata/android/sk/changelogs/996.txt new file mode 100644 index 00000000000..25fa111b5a2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/996.txt @@ -0,0 +1,2 @@ +Opravená výnimka NullPointerException pri otvorení kanála/konferencie v media.ccc.de. +Grinch sa pokúsil prekaziť náš vianočný darček pre vás, ale opravili sme to. diff --git a/fastlane/metadata/android/sk/changelogs/997.txt b/fastlane/metadata/android/sk/changelogs/997.txt new file mode 100644 index 00000000000..98bd604bb87 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/997.txt @@ -0,0 +1,17 @@ +Nové +• Pridané odpovede na komentáre +• Umožnená zmena poradia zoznamov skladieb +• Zobrazenie popisu a trvania playlistu +• Umožnené resetovanie nastavení + +Vylepšené +• [Android 13+] Obnovenie vlastných akcií upozornenia +• Vyžiadanie súhlasu na kontrolu aktualizácie +• Povolenie oznámenia prehrávania/pozastavenia počas načítania +• Zmena poradia niektorých nastavení + +Opravené +• [YouTube] Oprava nenačítania komentárov, ďalšie opravy a vylepšenia +• Vyriešenie zraniteľnosti pri importe nastavení a prepnutie na JSON +• Rôzne opravy sťahovania +• Orezanie textu vyhľadávania diff --git a/fastlane/metadata/android/sk/changelogs/998.txt b/fastlane/metadata/android/sk/changelogs/998.txt new file mode 100644 index 00000000000..725b6c5f18f --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/998.txt @@ -0,0 +1,4 @@ +Opravené neprehrávanie streamov v YouTube z dôvodu chýb HTTP 403. + +Občasné chyby HTTP 403 uprostred videa YouTube ešte nie sú opravené. +Tento problém bude čo najskôr vyriešený v ďalšom opravnom vydaní. diff --git a/fastlane/metadata/android/sk/changelogs/999.txt b/fastlane/metadata/android/sk/changelogs/999.txt new file mode 100644 index 00000000000..7649bfd4ea2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/999.txt @@ -0,0 +1,12 @@ +Táto verzia opravuje chyby HTTP 403 uprostred videí YouTube. + +Nové +- [SoundCloud] Pridanie podpory pre adresy URL on.soundcloud.com + +Vylepšené +- [Bandcamp] Zobrazenie dodatočných informácií v rozhlasovom kiosku + +Opravené +- [YouTube] Oprava občasných chýb HTTP 403 na začiatku alebo uprostred videí +- YouTube] Extrahovanie avatara a banneru z viacerých typov hlavičiek kanálov +- Bandcamp] Opravené rôzne chyby a vždy používaný protokol HTTPS diff --git a/fastlane/metadata/android/sl/changelogs/991.txt b/fastlane/metadata/android/sl/changelogs/991.txt new file mode 100644 index 00000000000..14f174a5a08 --- /dev/null +++ b/fastlane/metadata/android/sl/changelogs/991.txt @@ -0,0 +1,13 @@ +Novo +- Dodajanje gumba "Odpri v brskalniku" v podoknu z napakami +- Dodana možnost za prikaz skupin kanalov kot seznam +- [YouTube] Dolgi pritisk na segmente video pretoka za deljenje časovnega žiga URL-ja +- Dodajte gumb za predvajanje v vrsti v mini predvajalnik + +Izboljšave +- Dodana islandska lokalizacija ter posodobitev številnih drugih prevodov +- Številne notranje izboljšave + +Popravki +- Odprava večih sesutij +- [YouTube] Odprava težave z nalaganjem kanalov, nenamenskimi viri ter predvajanjem v nekaterih državah diff --git a/fastlane/metadata/android/sl/short_description.txt b/fastlane/metadata/android/sl/short_description.txt new file mode 100644 index 00000000000..8826524fcd1 --- /dev/null +++ b/fastlane/metadata/android/sl/short_description.txt @@ -0,0 +1 @@ +Brezplačen in enostaven YouTube "frontend" za Android. diff --git a/fastlane/metadata/android/sq/short_description.txt b/fastlane/metadata/android/sq/short_description.txt new file mode 100644 index 00000000000..8bbad4de371 --- /dev/null +++ b/fastlane/metadata/android/sq/short_description.txt @@ -0,0 +1 @@ +Një frontend i lehtë i YouTube falas për Android. diff --git a/fastlane/metadata/android/sr/changelogs/994.txt b/fastlane/metadata/android/sr/changelogs/994.txt new file mode 100644 index 00000000000..3ed14410d6f --- /dev/null +++ b/fastlane/metadata/android/sr/changelogs/994.txt @@ -0,0 +1,15 @@ +Ново +• Подржава више аудио снимака/језика +• Дозвољава подешавање јачине звука и покрета за осветљење на било којој страни екрана +• Подршка за приказивање главних картица на дну екрана + +Побољшано +• [Bandcamp] Управљање нумерама иза платног зида + +Поправљено +• [YouTube] 403 HTTP грешке за стримове +• Црни плејер при преласку на главни плејер са приказа плејлисте +• Цурење сервисне меморије плејера +• [PeerTube] Аватари отпремаоца и подканала су замењени + +и још много тога diff --git a/fastlane/metadata/android/sr/changelogs/995.txt b/fastlane/metadata/android/sr/changelogs/995.txt new file mode 100644 index 00000000000..0604eb08893 --- /dev/null +++ b/fastlane/metadata/android/sr/changelogs/995.txt @@ -0,0 +1,16 @@ +Ново +• Подршка за картице канала +• Могућност бирања квалитета слике +• Набавите URL адресе за све слике + +Побољшано +• Прист. интерф. плејера +• Бољи избор звука за преузимања само видео снимака +• Опција за укљ. назива плејлисте и видео сним. у дељ. сад. плејл. + +Поправљено +• [YouTube] Попр. доб. лајкова +• Попр. проб. када плејер не реаг. на иск. проз. и отказује +• Изб. погр. јез. у бир. јез. +• Аудио фокус плејера није пошт. утиш. звук +• Додавање пред. на плејлисте повр. не функционише diff --git a/fastlane/metadata/android/sr/changelogs/996.txt b/fastlane/metadata/android/sr/changelogs/996.txt new file mode 100644 index 00000000000..749b74624ab --- /dev/null +++ b/fastlane/metadata/android/sr/changelogs/996.txt @@ -0,0 +1,2 @@ +Поправљен NullPointerException приликом отварања канала/конференције у media.ccc.de. +Гринч је покушао да вам поквари наш божићни поклон, али смо то поправили. diff --git a/fastlane/metadata/android/sr/full_description.txt b/fastlane/metadata/android/sr/full_description.txt index df0c3c3f95c..e488a0ea440 100644 --- a/fastlane/metadata/android/sr/full_description.txt +++ b/fastlane/metadata/android/sr/full_description.txt @@ -1 +1 @@ -ЊуПајп не користи ниједну библиотеку Гугл оквира нити Јутјуб АПИ. Само скида са Јутјуба оно што му је потребно. Стога се ова апликација може користити на уређајима без инсталираних Гугл услуга. Такође, није вам потребан Јутјуб налог да бисте користили ЊуПајп, и још је слободан, бесплатан и отвореног кода. +NewPipe не користи никакве библиотеке Google оквира, нити YouTube API. Само анализира веб-сајт како би добио потребне информације. Из тог разлога, ова апликација се може користити на уређајима без инсталираних Google услуга. Такође, није Вам потребан YouTube налог да бисте користили NewPipe, a чак је и слободног, отвореног кода. diff --git a/fastlane/metadata/android/sr/short_description.txt b/fastlane/metadata/android/sr/short_description.txt index 34168631b55..82608e9db7d 100644 --- a/fastlane/metadata/android/sr/short_description.txt +++ b/fastlane/metadata/android/sr/short_description.txt @@ -1 +1 @@ -Бесплатна и лагана Јутјуб замена за Андроид. +Бесплатна и лагана замена за YouTube за Android. diff --git a/fastlane/metadata/android/sv/changelogs/63.txt b/fastlane/metadata/android/sv/changelogs/63.txt index dcf52354b1f..51c6551c18a 100644 --- a/fastlane/metadata/android/sv/changelogs/63.txt +++ b/fastlane/metadata/android/sv/changelogs/63.txt @@ -1,7 +1,7 @@ ### Förbättringar -- Import/export inställningar #1333 +- Import/exportinställningar #1333 - Minskade överdragningen (prestandaförbättring) #1371 -- Små kod förbättringar #1375 +- Små kodförbättringar #1375 - La till allt om GDPR #1420 ### Fixade diff --git a/fastlane/metadata/android/sv/changelogs/64.txt b/fastlane/metadata/android/sv/changelogs/64.txt index f874eebffb9..182fc0156b3 100644 --- a/fastlane/metadata/android/sv/changelogs/64.txt +++ b/fastlane/metadata/android/sv/changelogs/64.txt @@ -1,8 +1,8 @@ ### Förbättringar -- La till möjligheten all begränsa video kvaliteten vid användning av mobildata. #1339 +- La till möjligheten all begränsa videokvaliteten vid användning av mobildata. #1339 - Kom ihåg ljusstyrka för sessionen #1442 -- Förbättra nedladdnings prestandan på svagare CPUs #1431 -- La till (fungerande) support för media sessioner #1433 +- Förbättra nedladdningsprestandan på svagare CPUs #1431 +- La till (fungerande) support för mediasessioner #1433 ### Fixade - Fixade krasch vid öppning av nedladdningar (fixen är nu tillgänglig för release builds) #1441 diff --git a/fastlane/metadata/android/sv/changelogs/790.txt b/fastlane/metadata/android/sv/changelogs/790.txt new file mode 100644 index 00000000000..367e97cfb2f --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/790.txt @@ -0,0 +1,14 @@ +Förbättrad +- Lägg till fler titlar för att förbättra tillgängligheten för blinda #2655 +- Språket i inställningen för nedladdningsmappen blir mer konsekvent och mindre tvetydigt #2637 + +Rättad +- Kontrollera om sista byte i blocket laddas ner #2646 +- Fastställd rullning i videodetaljfragment #2672 +- Ta bort dubbla animationer av sökrutan till en enda #2695 +- [SoundCloud] Fixa utvinning av client_id #2745 + +Utveckling +- Lägg till saknade beroenden som ärvts från NewPipeExtractor i NewPipe #2535 +- Migrera till AndroidX #2685 +- Uppdatering till ExoPlayer 2.10.6 #2697, #2736 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/sv/changelogs/954.txt b/fastlane/metadata/android/sv/changelogs/954.txt new file mode 100644 index 00000000000..4ba3dc35048 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/954.txt @@ -0,0 +1,9 @@ +• nytt arbetsflöde för applikationen: spela upp videor på detalj-sidan, dra nedåt för att minimera spelaren +• MediaStyle-aviseringar: anpassningsbara åtgärder i aviseringar, prestanda-förbättringar +• grundläggande storleksändring när NewPipe används som en skrivbordsapp + +• visa ett dialogfönster med öppna alternativ i händelse av en URL-toast som inte stöds +• Förbättra sökförslagsupplevelsen när avlägsna sökningar inte kan hämtas +• Ökad standardvideokvalitet till 720p60 (spelare i appen) och 480p (popup-spelare) + +• tonvis med buggfixar och mer diff --git a/fastlane/metadata/android/sv/changelogs/957.txt b/fastlane/metadata/android/sv/changelogs/957.txt new file mode 100644 index 00000000000..a8be4f09b55 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/957.txt @@ -0,0 +1,10 @@ +• Förenade specifika kö åtgärder +• Två finger gest att stänga spelare +• Tillåt rensning av reCAPTCHA-cookies +• Inställning för att inte färglägga meddelande +• Förbättra hur videoinformation öppnas för att fixa oändlig buffring, buggigt beteende när du delar till NewPipe och andra inkonsekvenser +• Snabba upp YouTube-videor och fixa åldersbegränsning +• Fixa krasch vid snabb fram/bak spolning +• Ordna inte listor genom att dra miniatyrer +• Kom alltid ihåg popup egenskaper +• Lägga till Santali språk diff --git a/fastlane/metadata/android/sv/changelogs/958.txt b/fastlane/metadata/android/sv/changelogs/958.txt new file mode 100644 index 00000000000..268362f8739 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/958.txt @@ -0,0 +1,10 @@ +Nytt och förbättrat: +• La till inställning för att dölja miniatyr på låsskärmen +• Dra för att uppdatera flöde +• Förbättrad prestanda vid hämtning av lokala listor + +Fixat: +• Fixade krasch när du startar NewPipe efter att den togs bort från RAM +• Fixade krasch vid start när det inte finns någon internetanslutning +• Fixade respekt för ljusstyrka- och volymgestinställningar +• [YouTube] Fixade långa spellistor diff --git a/fastlane/metadata/android/sv/changelogs/961.txt b/fastlane/metadata/android/sv/changelogs/961.txt new file mode 100644 index 00000000000..6e1abc229dc --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Mix stöd +• [YouTube] Visa information om offentliga programföretag och Covid-19 +• [media.ccc.de] La till nya videor +• La till somalisk översättning + +• Många interna förbättringar + +• Fixade delning av videor ifrån spelaren +• Fixade blank ReCaptcha webview +• Fixade krasch som inträffade när du tar bort en ström från en lista +• [PeerTube] Fixade relaterade strömmar +• [YouTube] Fixade YouTube Musiksökning diff --git a/fastlane/metadata/android/sv/changelogs/964.txt b/fastlane/metadata/android/sv/changelogs/964.txt new file mode 100644 index 00000000000..cbdc9f4ffc5 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/964.txt @@ -0,0 +1,7 @@ +• La till stöd för kapitel i spelarkontroller +• [PeerTube] La till Sepia-sökning +• La till dela knappen i videodetaljvy och flyttad strömbeskrivning till flik layouten +• Inaktivera återställande av ljusstyrka om ljusstyrks gest är inaktiverad +• Lägg till listobjekt för att spela video på kodi +• Fixade krasch när ingen standardwebbläsare är inställd på vissa enheter och förbättrade dela dialog +• Växla spela/pausa med hårdvaru mellanslags knapp i fullskärm diff --git a/fastlane/metadata/android/sv/changelogs/965.txt b/fastlane/metadata/android/sv/changelogs/965.txt new file mode 100644 index 00000000000..9b298947a4d --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/965.txt @@ -0,0 +1,6 @@ +Fixade krasch som inträffade vid förflyttning av kanalgrupper. +Fixade hämtning av fler YouTube videor från kanaler och spellistor. +Fixade hämtning av YouTube kommentarer. +La till stöd för /watch /, /v / och /w / subpaths i YouTube adresser. +Fixade extraktion av SoundCloud klient id och geobegränsat innehåll. +La till nordkurdisk lokalisering. diff --git a/fastlane/metadata/android/sv/changelogs/966.txt b/fastlane/metadata/android/sv/changelogs/966.txt new file mode 100644 index 00000000000..b8e18360429 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/966.txt @@ -0,0 +1,14 @@ +Nytt: +• La till en ny tjänst: Bandcamp + +Förbättrat: +• Lägg till en inställning för att appen ska följa enhetstemat +• Förhindra vissa kraschar genom att visa en förbättrad felpanel +• Visa mer information om varför innehåll är otillgängligt +• Hårdvaru mellanslagsknapp ändrar spela/pausa +• Visa "Nedladdning startad" toast + +Fixat: +• Fixade liten miniatyr i videodetaljer medan du spelar i bakgrunden +• Fixade tom titel i minimerad spelare +• Fixade senaste storleksläge som inte återställdes korrekt diff --git a/fastlane/metadata/android/sv/changelogs/968.txt b/fastlane/metadata/android/sv/changelogs/968.txt new file mode 100644 index 00000000000..4582309f434 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/968.txt @@ -0,0 +1,7 @@ +La till kanalinformationsalternativ i långtrycksmenyn. +La till funktionalitet för att byta namn från spellistans gränssnitt. +Låt användaren pausa medan en video buffrar. +Polerade det ljusa temat. +Fixade överlappande teckensnitt när du använder en större teckenstorlek. +Fixade ingen video på Formuler och Zephier enheter. +Fixade olika kraschar. diff --git a/fastlane/metadata/android/sv/changelogs/970.txt b/fastlane/metadata/android/sv/changelogs/970.txt new file mode 100644 index 00000000000..020ee2c1bd6 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/970.txt @@ -0,0 +1,11 @@ +Nytt +• Visa innehåll metadata (taggar, kategorier, licens, ...) under beskrivningen +• Lägg till alternativet "Visa kanalinformation" i distans (icke-lokala) spellistor +• Lägg till "Öppna i webbläsare" -alternativ för långtrycksmeny + +Fixat +• Fixade rotations krasch på video detalj sida +• Fixade "Spela med Kodi" knappen i spelaren som alltid uppmanade till att installera Kore +• Fixade och förbättrad inställning av import och exportvägar +• [YouTube] Fixade kommentarers gilla antal +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/975.txt b/fastlane/metadata/android/sv/changelogs/975.txt new file mode 100644 index 00000000000..f280c383054 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/975.txt @@ -0,0 +1,15 @@ +Nytt +• Visa en miniatyr förhandsvisning medan du söker +• Upptäck avstängda kommentarer +• Tillåt markering av ett flödesobjekt som visat +• Visa kommentar hjärtan + +Förbättrat +• Förbättrade metadata och tagg layout +• Applicera service färg till UI komponenter + +Fixat +• Fixade miniatyrbild i minispelare +• Fixade oändlig buffring på dubbla köartiklar +• Vissa spelare fixar som rotation och snabbare stängning +• Fixade ReCAPTCHA som var kvar i bakgrunden diff --git a/fastlane/metadata/android/sv/changelogs/976.txt b/fastlane/metadata/android/sv/changelogs/976.txt new file mode 100644 index 00000000000..96b005170a2 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/976.txt @@ -0,0 +1,9 @@ +• La till alternativ för att direkt öppna spelare i fullskärm +• Tillåt användaren att välja vilka typer av sökförslag som ska visas +• Mörkt tema är nu mörkare + mörk startskärm tillagd +• Förbättrade fil väljare att gråa ut oönskade filer +• Fixade import av YouTube prenumerationer +• Att spela en ström kräver tryck på spela knappen igen +• [Android TV] Fixa långa sökbar hopp vid användning av en DPad + +För att se ytterligare ändringar, se ändringsloggen (och blogginlägg) från Länkfliken nedan. diff --git a/fastlane/metadata/android/sv/changelogs/983.txt b/fastlane/metadata/android/sv/changelogs/983.txt new file mode 100644 index 00000000000..edc397a2918 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/983.txt @@ -0,0 +1,9 @@ +La till nytt dubbel tryck för att söka UI och beteende +Gör inställningar sökbara +Markera fäst kommentarer som sådana +Lägg till öppna med app stöd för FSFE PeerTube instans +Lägg till felmeddelanden +Fixade repris av första kö objekt vid spelar förändring +Vänta längre vid buffring under livestreams innan misslyckande +Fixade ordning av lokala sökresultat +Fixade tomma objektfält i spelkö diff --git a/fastlane/metadata/android/sv/changelogs/986.txt b/fastlane/metadata/android/sv/changelogs/986.txt new file mode 100644 index 00000000000..2ebaacaa856 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/986.txt @@ -0,0 +1,15 @@ +Nytt +• Avisering för nya strömningar +• Sömlös övergång mellan bakgrund och videospelare +• Ändra pitch av semitoner +• Lägg till huvudspelarens kö i en spellista + +Förbättrat +• Kom ihåg hastighet/pitch steg storlek +• Mildra initial lång buffring i videospelaren +• Förbättra spelarens UI för Android TV +• Bekräfta innan borttagning av alla nedladdade filer + +Fixat +• Fixade media knapp som inte gömde spelarkontroller +• Fixade uppspelningsåterställning vid spelar förändring diff --git a/fastlane/metadata/android/sv/changelogs/987.txt b/fastlane/metadata/android/sv/changelogs/987.txt new file mode 100644 index 00000000000..59416e59e30 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/987.txt @@ -0,0 +1,12 @@ +Nytt +• Stöd andra leveransmetoder än progressiv HTTP: snabbare uppspelningstid, fixar för PeerTube och SoundCloud, uppspelning av nyligen avslutade YouTube strömmar +• La till knapp för att lägga till en fjärrspellista till en lokal +• Bildförhandsvisning i Android 10+ dela blad + +Förbättrat +• Förbättrade uppspelningsparametrar dialog +• Flytta abonnemang import/exportknappar till trepunktsmenyn + +Fixat +• Fixade ta bort tittade videor från spellista +• Fixade dela meny tema och "lägg till i spellista" diff --git a/fastlane/metadata/android/sv/changelogs/988.txt b/fastlane/metadata/android/sv/changelogs/988.txt new file mode 100644 index 00000000000..09335ecbc67 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Fixade "Kan inte få någon ström" fel vid spelning av någon video +[YouTube] Fixade "Det följande innehållet är inte tillgängligt på den här appen." meddelandet visas istället för videon som begärs diff --git a/fastlane/metadata/android/sv/changelogs/989.txt b/fastlane/metadata/android/sv/changelogs/989.txt new file mode 100644 index 00000000000..28dcdf24507 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Fixade oändlig laddning vid försök att spela någon video +• [YouTube] Fixade throttling på vissa videor +• Uppgraderade jsoup-biblioteket till 1.15.3, vilket inkluderar en säkerhetsfix diff --git a/fastlane/metadata/android/sv/changelogs/990.txt b/fastlane/metadata/android/sv/changelogs/990.txt new file mode 100644 index 00000000000..1f1069accbc --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/990.txt @@ -0,0 +1,15 @@ +Denna version avslutar stödet för Android 4.4 KitKat, nu är den minsta versionen Android 5 Lollipop! + +Nytt +• Ladda ner från lång-tryck menyn +• Dölj framtida videor i flödet +• Dela lokala spellistor + +Förbättrat +• Refaktorera spelarkoden i små komponenter: mindre RAM används, mindre buggar +• Förbättra miniatyrernas skalläge +• Vectorisera bildplatshållare + +Fixat +• Fixade problem med spelarens meddelande: föråldrad/saknad media info, förvrängd miniatyr +• Fixade fullskärm som använde 1/4 av skärmen diff --git a/fastlane/metadata/android/sv/changelogs/991.txt b/fastlane/metadata/android/sv/changelogs/991.txt new file mode 100644 index 00000000000..7f79c5ee726 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/991.txt @@ -0,0 +1,13 @@ +Nytt +• Lägg till "Öppna i webbläsare" knappen i felpanel +• Lägg till inställning för att visa kanalgrupper som lista +• [YouTube] Långtryck på strömsegment för att dela tidsstämpel URL +• Lägg till play kö knapp till minispelare + +Förbättrat +• Lägg till isländsk lokalisering och uppdatera många andra översättningar +• Många interna förbättringar + +Fixat +• Fixade flera kraschar +• [YouTube] Fixade laddning av kanaler, icke-dedikerade flöden och uppspelningsproblem i vissa länder diff --git a/fastlane/metadata/android/sv/changelogs/992.txt b/fastlane/metadata/android/sv/changelogs/992.txt new file mode 100644 index 00000000000..253f1e5311f --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/992.txt @@ -0,0 +1,17 @@ +Nytt +• Prenumerant antal i videodetaljer +• Ladda ner från kön +• Ställ in en permanent miniatyr fr spellista +• Långtryckt hashtags och länkar +• Kortvys läge + +Förbättrat +• Större minispelar stäng knapp +• Mjukare miniatyrs nedskalning +• Sikta på Android 13 (API 33) +• Sökning pausar inte längre spelaren + +Fixat +• Fixade overlay på DeX/Mouse +• Tillåt bakgrundsspelare utan separata ljudströmmar +• Olika YouTube-fixar och mer… diff --git a/fastlane/metadata/android/sv/changelogs/993.txt b/fastlane/metadata/android/sv/changelogs/993.txt new file mode 100644 index 00000000000..a06eafcd747 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/993.txt @@ -0,0 +1,12 @@ +Nytt +• La till varning vid tilläggning av dubbletter i spellista och la till knapp för att ta bort dem +• Tillåt ignorering av hårdvaruknappar +• Tillåt att dölja delvis tittade videor från flödet + +Förbättrat +• Använd fler rutnät kolumner på stora skärmar +• Gör framstegsindikatorer konsekventa med inställningar + +Fixat +• Fixade öppning av webbläsar URLs, nedladdningar och externa spelare på Android 11+ +• Fixade interaktion med helskärm som kräver två tryck på MIUI diff --git a/fastlane/metadata/android/sv/changelogs/994.txt b/fastlane/metadata/android/sv/changelogs/994.txt new file mode 100644 index 00000000000..a07e8350091 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/994.txt @@ -0,0 +1,15 @@ +Nytt +• Stöd flera ljudspår/språk +• Tillåt inställning av volym och ljusstyrks gester på valfri sida av skärmen +• Stöd för att visa huvudflikar längst ner på skärmen + +Förbättrat +• [Bandcamp] Hantera spår bakom betalvägg + +Fixat +• [YouTube] 403 HTTP-fel för strömmar +• Svart spelare vid byte till huvudspelare från spellistans vy +• Spela service minnesläckor +• [PeerTube] Uppladdare och sub kanal avatarer var utbytta + +och mer diff --git a/fastlane/metadata/android/sv/changelogs/995.txt b/fastlane/metadata/android/sv/changelogs/995.txt new file mode 100644 index 00000000000..be146073997 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/995.txt @@ -0,0 +1,16 @@ +Nytt +• Stöd kanalflikar +• Välj bildkvalitet +• Få webbadresser till alla bilder + +Förbättrat +• Tillgänglighet för spelargränssnitt +• Bättre ljudval för endast video nedladdningar +• Alternativ att inkludera spellista och videonamn till delat spellistinnehåll + +Fixat +• [YouTube] Fixade hämtning av gillaantal +• Fixade spelare som inte svarar popup och kraschar +• Val av fel språk i språkväljare +• Spelarens ljudfokus respekterade inte mute +• Spellist-objekt addition som ibland inte fungerade diff --git a/fastlane/metadata/android/sv/changelogs/996.txt b/fastlane/metadata/android/sv/changelogs/996.txt new file mode 100644 index 00000000000..8ee87d8c838 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/996.txt @@ -0,0 +1,2 @@ +Fixade en NullPointerException när du öppnar en kanal / konferens i media.ccc.de. +Grinchen försökte förstöra vår julklapp till er, men vi fixade den. diff --git a/fastlane/metadata/android/sv/changelogs/997.txt b/fastlane/metadata/android/sv/changelogs/997.txt new file mode 100644 index 00000000000..f5c18754dc9 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/997.txt @@ -0,0 +1,17 @@ +Nytt +• La till kommentars svar +• Tillåt omordnande av spellistor +• Visa spellistors beskrivning och varaktighet +• Tillåt återställning av inställningar + +Förbättrat +• [Android 13+] Återställ anpassade aviserings åtgärder +• Begär samtycke för uppdateringskontroll +• Tillåt spela/pausa från avisering under buffring +• Omordnade några inställningar + +Fixat +• [YouTube] Fixade kommentarer som inte laddas +• Lös sårbarhet i inställnings import och byt till JSON +• Olika hämtnings fixar +• Trimma sök text diff --git a/fastlane/metadata/android/sv/changelogs/998.txt b/fastlane/metadata/android/sv/changelogs/998.txt new file mode 100644 index 00000000000..9d4be6a4a61 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/998.txt @@ -0,0 +1,4 @@ +Åtgärdat att YouTube inte spelar någon ström på grund av HTTP 403 fel. + +HTTP 403 fel som ibland uppstår mitt i en YouTube-video är inte åtgärdade ännu. +Det problemet kommer att åtgärdas i en annan uppdatering så snart som möjligt. diff --git a/fastlane/metadata/android/sv/changelogs/999.txt b/fastlane/metadata/android/sv/changelogs/999.txt new file mode 100644 index 00000000000..672ca50b087 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/999.txt @@ -0,0 +1,12 @@ +Denna uppdatering löser HTTP 403 fel i mitten av YouTube-videor. + +Nytt +• [SoundCloud] Lägg till stöd för on.soundcloud.com URLs + +Förbättrat +• [Bandcamp] Visa ytterligare information i radio kiosk + +Fixat +• [YouTube] Löst tillfälliga HTTP 403 fel i början eller i mitten av videor +• [YouTube] Extrahera avatar och banner från fler kanalhuvudtyper +• [Bandcamp] Fixat olika buggar och använd alltid HTTPS diff --git a/fastlane/metadata/android/sv/short_description.txt b/fastlane/metadata/android/sv/short_description.txt index 6b29f892c4d..d0e04f5853c 100644 --- a/fastlane/metadata/android/sv/short_description.txt +++ b/fastlane/metadata/android/sv/short_description.txt @@ -1 +1 @@ -En gratis lättviktsklient för YouTube på Android. +En gratis lättviktsklient för YouTube för Android. diff --git a/fastlane/metadata/android/ta/changelogs/63.txt b/fastlane/metadata/android/ta/changelogs/63.txt index 6a90173ef8c..08858333a8f 100644 --- a/fastlane/metadata/android/ta/changelogs/63.txt +++ b/fastlane/metadata/android/ta/changelogs/63.txt @@ -1,8 +1,8 @@ ### மேம்பாடுகள் -- இறக்குமதி/ஏற்றுமதி அமைப்புகள் #1333 -- ஓவர் டிராவைக் குறைக்கவும் (செயல்திறன் மேம்பாடு) #1371 -- சிறிய குறியீடு மேம்பாடுகள் #1375 -- GDPR #1420 பற்றிய அனைத்தையும் சேர்க்கவும் +- இறக்குமதி / ஏற்றுமதி அமைப்புகள் #1333 +- ஓவர்டிராவைக் குறைக்கவும் (செயல்திறன் மேம்பாடு) #1371 +- சிறிய குறியீடு மேம்பாடுகள் #1375 +- GDPR #1420 பற்றி அனைத்தையும் சேர்க்கவும் ### சரி செய்யப்பட்டது -- டவுன்லோடர்: .giga கோப்புகள் #1407 இலிருந்து முடிக்கப்படாத பதிவிறக்கங்களை ஏற்றுவதில் ஏற்படும் செயலிழப்பை சரிசெய்யவும் +- டவுன்லோடர்: .giga கோப்புகளை #1407 இருந்து முடிக்கப்படாத பதிவிறக்கங்களை ஏற்றும் செயலிழப்பு சரி diff --git a/fastlane/metadata/android/ta/changelogs/64.txt b/fastlane/metadata/android/ta/changelogs/64.txt index 04336a3cdc9..315cd1c8dc4 100644 --- a/fastlane/metadata/android/ta/changelogs/64.txt +++ b/fastlane/metadata/android/ta/changelogs/64.txt @@ -1,8 +1,8 @@ ### மேம்பாடுகள் -- மொபைல் டேட்டாவைப் பயன்படுத்தினால் வீடியோ தரத்தைக் கட்டுப்படுத்தும் திறன் சேர்க்கப்பட்டது. #1339 -- அமர்வு #1442 க்கான பிரகாசத்தை நினைவில் கொள்க -- பலவீனமான CPUகளுக்கான பதிவிறக்க செயல்திறனை மேம்படுத்தவும் #1431 -- மீடியா அமர்வு #1433க்கு (வேலை செய்யும்) ஆதரவைச் சேர்க்கவும் +- மொபைல் தரவு பயன்படுத்தி என்றால் வீடியோ தரம் கட்டுப்படுத்த திறன் சேர்க்கப்பட்டது. #1339 +- அமர்வு #1442 க்கான பிரகாசத்தை நினைவில் கொள்ளுங்கள் +- பலவீனமான CPUகளுக்கான பதிவிறக்க செயல்திறனை மேம்படுத்தவும் #1431 +- ஊடக அமர்வு #1433 ஆதரவு சேர்க்க (வேலை) ஆதரவு -### சரி -- பதிவிறக்கங்களைத் திறப்பதில் ஏற்படும் செயலிழப்பைச் சரிசெய்தல் (வெளியீட்டு உருவாக்கங்களுக்கு இப்போது சரிசெய்தல் கிடைக்கிறது) #1441 +### சரி செய்யவும் +- பதிவிறக்கங்களைத் திறப்பதில் செயலிழப்பை சரிசெய்யவும் (இப்போது வெளியீட்டு உருவாக்கங்களுக்கு கிடைக்கும் சரி) #1441 diff --git a/fastlane/metadata/android/ta/changelogs/65.txt b/fastlane/metadata/android/ta/changelogs/65.txt new file mode 100644 index 00000000000..05fd375e6ed --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/65.txt @@ -0,0 +1,26 @@ +### மேம்பாடுகள் + +- பர்கர்மெனு ஐகான் அனிமேஷன் முடக்கு #1486 +- பதிவிறக்கங்கள் நீக்க #1472 செயல்தவிர்க்கவும் +- பங்கு மெனுவில் விருப்பத்தைப் பதிவிறக்கவும் #1498 +- நீண்ட குழாய் மெனு # 1454 பங்கு விருப்பத்தை சேர்க்கப்பட்டது +- வெளியேறும் #1354 இல் முக்கிய வீரரைக் குறைக்கவும் +- நூலக பதிப்பு மேம்படுத்தல் மற்றும் தரவுத்தள காப்பு திருத்தம் #1510 +- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 + - வேகமான வேக மாற்றத்திற்கான வெவ்வேறு படி அளவுகளை ஆதரிக்க பின்னணி வேகக் கட்டுப்பாட்டு உரையாடலை மறுவேலை செய்தது. + - பின்னணி வேக கட்டுப்பாடு மௌனங்கள் போது வேகமாக முன்னோக்கி ஒரு நிலைமாற்றி சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் உண்மையான தடையற்ற அனுபவத்தைக் கொண்டுவர முடியும் (மேலும் நிறைய மௌனங்களுடன் ஒரு பாடலை உடைக்க முடியும் =). + - மெட்டாடேட்டாவை கைமுறையாக செய்வதை விட, பிளேயரில் உள்நாட்டில் மீடியாவுடன் மெட்டாடேட்டாவை அனுப்ப அனுமதிக்க மறுசீரமைக்கப்பட்ட ஊடக மூல தீர்மானம். இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை ஆதாரம் உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாக கிடைக்கும். + - நிலையான தொலை பிளேலிஸ்ட் மெட்டாடேட்டா பிளேலிஸ்ட் துண்டு திறக்கப்படும் போது புதிய மெட்டாடேட்டா கிடைக்கும் போது புதுப்பிக்கப்படவில்லை. + - பல்வேறு UI திருத்தங்கள்: #1383, பின்னணி பிளேயர் அறிவிப்பு கட்டுப்பாடுகள் இப்போது எப்போதும் வெள்ளை, எளிதாக ஃப்ளிங்கிங் மூலம் பாப்அப் பிளேயர் மூட எளிதாக +- மல்டிசர்வீஸிற்கான மறுசீரமைக்கப்பட்ட கட்டமைப்புடன் புதிய பிரித்தெடுத்தலைப் பயன்படுத்தவும் + +### திருத்தங்கள் + +- #1440 உடைந்த வீடியோ தகவல் தளவமைப்பு #1491 சரி +- வரலாறு திருத்தம் #1497 பார்க்க + - #1495, பயனர் பிளேலிஸ்ட்டை அணுகியவுடன் மெட்டாடேட்டாவை (சிறுபடம், தலைப்பு மற்றும் வீடியோ எண்ணிக்கை) புதுப்பிப்பதன் மூலம். + - #1475, பயனர் விவரம் துண்டு வெளிப்புற பிளேயர் ஒரு வீடியோ தொடங்கும் போது தரவுத்தளத்தில் ஒரு பார்வை பதிவு மூலம். +- பாப்அப் பயன்முறையில் க்ரீன் டைம்அவுட்டை சரிசெய்யவும். #1463 (நிலையான #640) +- முக்கிய வீடியோ பிளேயர் திருத்தம் #1509 + - [#1412] பிளேயர் செயல்பாடு பின்னணியில் இருக்கும்போது புதிய நோக்கம் பெறும்போது பிளேயர் NPE ஐ ஏற்படுத்தும் நிலையான மீண்டும் பயன்முறை. + - பாப்அப் செய்ய நிலையான வீரர் குறைக்க பாப்அப் அனுமதி வழங்கப்படாதபோது வீரர் அழிக்க முடியாது. diff --git a/fastlane/metadata/android/ta/changelogs/66.txt b/fastlane/metadata/android/ta/changelogs/66.txt new file mode 100644 index 00000000000..ba6cfae1cd8 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/66.txt @@ -0,0 +1,21 @@ +# v0.13.7 இன் சேஞ்ச் + +### சரி செய்யப்பட்டது +- v0.13.6 வரிசை வடிகட்டி சிக்கல்களை சரிசெய்யவும் + +# v0.13.6 இன் சேஞ்ச் + +### மேம்பாடுகள் + +- பர்கர்மெனு ஐகான் அனிமேஷன் முடக்கு #1486 +- பதிவிறக்கங்கள் நீக்க #1472 செயல்தவிர்க்கவும் +- பங்கு மெனுவில் விருப்பத்தைப் பதிவிறக்கவும் #1498 +- நீண்ட குழாய் மெனு # 1454 பங்கு விருப்பத்தை சேர்க்கப்பட்டது +- வெளியேறும் #1354 இல் முக்கிய வீரரைக் குறைக்கவும் +- நூலக பதிப்பு மேம்படுத்தல் மற்றும் தரவுத்தள காப்பு திருத்தம் #1510 + +- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 + - வேகமான வேக மாற்றத்திற்கான வெவ்வேறு படி அளவுகளை ஆதரிக்க பின்னணி வேகக் கட்டுப்பாட்டு உரையாடலை மறுவேலை செய்தது. + - பின்னணி வேக கட்டுப்பாடு மௌனங்கள் போது வேகமாக முன்னோக்கி ஒரு நிலைமாற்றி சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் உண்மையான தடையற்ற அனுபவத்தைக் கொண்டுவர முடியும் (மேலும் நிறைய மௌனங்களுடன் ஒரு பாடலை உடைக்க முடியும் =). + - மெட்டாடேட்டாவை கைமுறையாக செய்வதை விட, பிளேயரில் உள்நாட்டில் மீடியாவுடன் மெட்டாடேட்டாவை அனுப்ப அனுமதிக்க மறுசீரமைக்கப்பட்ட ஊடக மூல தீர்மானம். இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை ஆதாரம் உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாக கிடைக்கும். + - நிலையான தொலை பிளேலிஸ்ட் மெட்டாடேட்டா இல்லை diff --git a/fastlane/metadata/android/ta/changelogs/68.txt b/fastlane/metadata/android/ta/changelogs/68.txt new file mode 100644 index 00000000000..9bada1861d0 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/68.txt @@ -0,0 +1,31 @@ +# v0.14.1 மாற்றங்கள் + +### சரி செய்யப்பட்டது +- வீடியோ url #1659 மறைகுறியாக்க சரி தோல்வி +- நிலையான விளக்கம் இணைப்பு நன்றாக பிரித்தெடுக்க இல்லை #1657 + +# v0.14.0 மாற்றங்கள் + +### புதியது +- புதிய அலமாரியின் வடிவமைப்பு #1461 +- புதிய வாடிக்கையாளர்களின் முன் பக்கம் #1461 + +### மேம்பாடுகள் +- மறுவேலை செய்யப்பட்ட சைகை கட்டுப்பாடுகள் #1604 +- பாப்அப் பிளேயர் #1597 மூட புதிய வழி + + +### சரி செய்யப்பட்டது +- சந்தா எண்ணிக்கை கிடைக்காதபோது பிழையை சரிசெய்யவும். #1649 ஐ மூடுகிறது. + - அந்த சந்தர்ப்பங்களில் "சந்தாதாரர் எண்ணிக்கை கிடைக்கவில்லை" என்பதைக் காட்டு +- YouTube பிளேலிஸ்ட் காலியாக இருக்கும்போது NPE ஐ சரிசெய்யவும் +- SoundCloud இல் கியோஸ்க்குகளுக்கான விரைவான திருத்தம் +- Refactor மற்றும் பிழைத்திருத்தம் #1623 + - சுழற்சி தேடல் விளைவாக #1562 சரி + - சரி சீக் பட்டி நிலையாக இடப்படவில்லை + - YT பிரீமியம் வீடியோ சரியாக தடுக்கப்படவில்லை என்பதை சரிசெய்யவும் + - சில நேரங்களில் ஏற்றப்படாத வீடியோக்களை சரிசெய்யவும் (DASH பாகுபடுத்தல் காரணமாக) + - வீடியோ விளக்கத்தில் இணைப்புகளை சரிசெய்யவும் + - யாராவது வெளிப்புற SDCARD க்கு பதிவிறக்க முயற்சிக்கும்போது எச்சரிக்கையைக் காட்டு + - எதுவும் காட்டப்படவில்லை விதிவிலக்கு தூண்டுதல்கள் அறிக்கை சரி + - சிறு அண்ட்ராய்டு பின்னணி பிளேயர் காட்டப்படவில்லை 8.1 [இங்கே பார்க்கவும்](https://github.com/TeamNewPip diff --git a/fastlane/metadata/android/ta/changelogs/730.txt b/fastlane/metadata/android/ta/changelogs/730.txt new file mode 100644 index 00000000000..9e5dc93b5f0 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/730.txt @@ -0,0 +1,2 @@ +# சரி செய்யப்பட்டது +- சூடான திருத்தம் மறைகுறியாக்க செயல்பாடு பிழை மீண்டும். diff --git a/fastlane/metadata/android/ta/changelogs/770.txt b/fastlane/metadata/android/ta/changelogs/770.txt new file mode 100644 index 00000000000..c49e90b8c6a --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/770.txt @@ -0,0 +1,4 @@ +0.17.2 இல் மாற்றங்கள் + +சரி செய்யவும் +• எந்த வீடியோவும் கிடைக்கவில்லை என்பதை சரிசெய்யவும் diff --git a/fastlane/metadata/android/ta/changelogs/820.txt b/fastlane/metadata/android/ta/changelogs/820.txt new file mode 100644 index 00000000000..b6fbe3c010e --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/820.txt @@ -0,0 +1 @@ +நிலையான மறைகுறியாக்க செயல்பாடு பெயர் regex YouTube ஐ பயன்படுத்த முடியாததாக ஆக்குகிறது. diff --git a/fastlane/metadata/android/ta/changelogs/830.txt b/fastlane/metadata/android/ta/changelogs/830.txt new file mode 100644 index 00000000000..bf5ff50a003 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud சிக்கல்களை சரிசெய்ய SoundCloud client_id புதுப்பிக்கப்பட்டது. diff --git a/fastlane/metadata/android/ta/changelogs/850.txt b/fastlane/metadata/android/ta/changelogs/850.txt new file mode 100644 index 00000000000..ebd0323828c --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/850.txt @@ -0,0 +1 @@ +இந்த வெளியீட்டில் YouTube வலைத்தள பதிப்பு புதுப்பிக்கப்பட்டது. பழைய வலைத்தள பதிப்பு மார்ச் மாதத்தில் நிறுத்தப்பட உள்ளது, எனவே நீங்கள் NewPipe ஐ மேம்படுத்த வேண்டும். diff --git a/fastlane/metadata/android/ta/changelogs/870.txt b/fastlane/metadata/android/ta/changelogs/870.txt new file mode 100644 index 00000000000..01a24f92a06 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/870.txt @@ -0,0 +1,2 @@ +இது மீண்டும் பெரிய தொந்தரவுகள் இல்லாமல் SoundCloud ஐப் பயன்படுத்த அனுமதிக்க NewPipe ஐப் புதுப்பிக்கும் ஹாட்ஃபிக்ஸ் வெளியீடு ஆகும். +SoundCloud இன் v2 API இப்போது பிரித்தெடுத்தலில் பயன்படுத்தப்படுகிறது மற்றும் தவறான கிளையன்ட் ஐடிகளைக் கண்டறிதல் மேம்படுத்தப்பட்டுள்ளது. diff --git a/fastlane/metadata/android/ta/changelogs/910.txt b/fastlane/metadata/android/ta/changelogs/910.txt new file mode 100644 index 00000000000..a42768229f3 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/910.txt @@ -0,0 +1 @@ +சில அரிதான சந்தர்ப்பங்களில் நியூபைப் தொடங்குவதைத் தடுத்த நிலையான தரவுத்தள இடம்பெயர்வு. diff --git a/fastlane/metadata/android/ta/changelogs/920.txt b/fastlane/metadata/android/ta/changelogs/920.txt new file mode 100644 index 00000000000..16dcf714981 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/920.txt @@ -0,0 +1,9 @@ +மேம்படுத்தப்பட்ட + +• பதிவேற்ற தேதி மற்றும் ஸ்ட்ரீம் கட்டம் உருப்படிகளில் பார்வை எண்ணிக்கை சேர்க்கப்பட்டது +• டிராயர் தலைப்பு தளவமைப்பிற்கான மேம்பாடுகள் + +நிலையான + +• API 19 இல் செயலிழப்புகளை ஏற்படுத்தும் நிலையான முடக்கு பொத்தான் +• நீண்ட 1080p 60fps வீடியோக்களை நிலையான பதிவிறக்கம் diff --git a/fastlane/metadata/android/ta/changelogs/950.txt b/fastlane/metadata/android/ta/changelogs/950.txt new file mode 100644 index 00000000000..ba11011b207 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/950.txt @@ -0,0 +1,4 @@ +இந்த வெளியீடு மூன்று சிறிய திருத்தங்களைக் கொண்டுவருகிறது: +• Adroid 10+ இல் நிலையான சேமிப்பக அணுகல் +• நிலையான திறப்பு கியோஸ்க்குகள் +• நீண்ட வீடியோக்களை நிலையான கால பாகுபடுத்தல் diff --git a/fastlane/metadata/android/ta/changelogs/953.txt b/fastlane/metadata/android/ta/changelogs/953.txt new file mode 100644 index 00000000000..1d995e38cf4 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/953.txt @@ -0,0 +1 @@ +YouTube இன் மறைகுறியாக்க செயல்பாட்டை பிரித்தெடுத்தலை சரிசெய்யவும். diff --git a/fastlane/metadata/android/ta/changelogs/955.txt b/fastlane/metadata/android/ta/changelogs/955.txt new file mode 100644 index 00000000000..bdd5a000d00 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/955.txt @@ -0,0 +1,3 @@ +[யூடியூப்] சில பயனர்களுக்கான தேடலை சரிசெய்யவும் +[யூடியூப்] சீரற்ற மறைகுறியாக்க விதிவிலக்குகளை சரிசெய்யவும் +[சவுண்ட்கிளவுட்] ஸ்லாஷுடன் முடிவடையும் URL கள் இப்போது சரியாக பாகுபடுத்தப்படுகின்றன diff --git a/fastlane/metadata/android/ta/changelogs/956.txt b/fastlane/metadata/android/ta/changelogs/956.txt new file mode 100644 index 00000000000..0d572e2fc57 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/956.txt @@ -0,0 +1 @@ +[யூடியூப்] எந்த வீடியோ ஏற்றும் போது நிலையான செயலிழப்பு diff --git a/fastlane/metadata/android/ta/changelogs/967.txt b/fastlane/metadata/android/ta/changelogs/967.txt new file mode 100644 index 00000000000..0ca446b693f --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/967.txt @@ -0,0 +1 @@ +­ஐரோப்பிய ஒன்றியத்தில் YouTube சரியாக வேலை செய்யவில்லை என்று சரி செய்யப்பட்டது. இது ஒரு புதிய குக்கீ மற்றும் தனியுரிமை ஒப்புதல் அமைப்பால் ஏற்பட்டது, இதற்கு நியூபைப் ஒப்புதல் குக்கீயை அமைக்க வேண்டும். diff --git a/fastlane/metadata/android/ta/full_description.txt b/fastlane/metadata/android/ta/full_description.txt index 12e0e08ef87..f86da9366aa 100644 --- a/fastlane/metadata/android/ta/full_description.txt +++ b/fastlane/metadata/android/ta/full_description.txt @@ -1 +1 @@ -NewPipe எந்த Google கட்டமைப்பு நூலகங்களையும் அல்லது YouTube API ஐயும் பயன்படுத்துவதில்லை. இணையத்தளத்திற்குத் தேவையான தகவல்களைப் பெறுவதற்காக மட்டுமே இது அலசுகிறது. எனவே Google சேவைகள் நிறுவப்படாத சாதனங்களில் இந்தப் பயன்பாட்டைப் பயன்படுத்தலாம். மேலும், NewPipe ஐப் பயன்படுத்த உங்களுக்கு YouTube கணக்கு தேவையில்லை, அது FLOSS ஆகும். +நியூபயிப் எந்த கூகிள் கட்டமைப்பு நூலகங்களையும் அல்லது YouTube API ஐயும் பயன்படுத்தாது. இது தேவையான தகவல்களைப் பெறுவதற்காக வலைத்தளத்தை மட்டுமே பாகுபடுத்துகிறது. எனவே கூகுள் சர்வீசஸ் இன்ஸ்டால் இல்லாத சாதனங்களில் இந்த அப்ளிகேஷனை பயன்படுத்த முடியும். மேலும், NewPipe ஐப் பயன்படுத்த உங்களுக்கு YouTube கணக்கு தேவையில்லை, அது FLOSS. diff --git a/fastlane/metadata/android/ta/short_description.txt b/fastlane/metadata/android/ta/short_description.txt index a4098402857..249f8eb4b05 100644 --- a/fastlane/metadata/android/ta/short_description.txt +++ b/fastlane/metadata/android/ta/short_description.txt @@ -1 +1 @@ -Android க்கான இலவச இலகுரக YouTube முன்பக்கம். +ஆன்டிராயிடுக்கான இலவச இலகுரக யூடியூப் முன்பக்கம். 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/tl/short_description.txt b/fastlane/metadata/android/tl/short_description.txt new file mode 100644 index 00000000000..52f2bd8e804 --- /dev/null +++ b/fastlane/metadata/android/tl/short_description.txt @@ -0,0 +1 @@ +Isang libreng magaan na frontend ng YouTube para sa Android. 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/tr/changelogs/1000.txt b/fastlane/metadata/android/tr/changelogs/1000.txt new file mode 100644 index 00000000000..fb92057d032 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/1000.txt @@ -0,0 +1,13 @@ +Geliştirmeler +• Liste açıklamaları daha fazla/az göstermek için artık tıklanabilir +• [PeerTube] `subscribeto.me` sunucu bağlantıları otomatik olarak işlenir +• Geçmiş ekranında sadece tek bir item oynatılır + +Düzeltmeler +• RSS buton görünürlüğü düzeltildi +• Bar önizleme çökmeleri düzeltildi +• Küçük resmi olmayan itemleri listeye ekleme düzeltildi +• İndirme iletişim kutusu görünmeden önce çıkma düzeltildi +• Listeye ekle diyalogundaki sıra düzeltildi +• Liste yer imi öğe düzenini ayarlandı +... diff --git a/fastlane/metadata/android/tr/changelogs/64.txt b/fastlane/metadata/android/tr/changelogs/64.txt index 082c7d60834..88ee9482c51 100644 --- a/fastlane/metadata/android/tr/changelogs/64.txt +++ b/fastlane/metadata/android/tr/changelogs/64.txt @@ -1,8 +1,8 @@ ### Geliştirmeler -- Mobil veri kullanıldığında video kalitesini sınırlandırma seçeneği eklendi #1339 -- O an açık oturum için parlaklığı hatırla #1442 -- eski CPU'larda indirme performansı iyileştirildi #1431 +- Mobil veri kullanıldığında video kalitesini sınırlandırma seçeneği eklendi. #1339 +- Oturum boyunca parlaklığı hatırla #1442 +- düşük performanslı CPU'larda indirme performansı iyileştirildi #1431 - Medya oturumu için destek eklendi (çalışıyor) #1433 -###Düzeltmeler -- İndirmeler açılırken çökme düzeltildi #1441 +### Düzeltmeler +- İndirilenler açılırken çökme düzeltildi(Yayın sürümleri için düzeltme mevcut) #1441 diff --git a/fastlane/metadata/android/tr/changelogs/68.txt b/fastlane/metadata/android/tr/changelogs/68.txt index b2507d48474..069a0a22ee8 100644 --- a/fastlane/metadata/android/tr/changelogs/68.txt +++ b/fastlane/metadata/android/tr/changelogs/68.txt @@ -1,31 +1,31 @@ # v0.14.1 değişiklikleri -### Sabit -- Sabit video url # 1659 şifresini çözmek için başarısız oldu -- Sabit açıklama bağlantısı iyi ayıklanmıyor # 1657 +### Düzeltmeler +- Video url'sinin şifresinin çözülememesi düzeltildi #1659 +- Sabit açıklama bağlantısı iyi açılamıyor #1657 # v0.14.0 değişiklikleri -### Yeni -- Yeni Çekmece tasarımı # 1461 -- Yeni özelleştirilebilir ön sayfa # 1461 +### Yenilikler +- Yeni Çekmece tasarımı #1461 +- Yeni özelleştirilebilir ön sayfa #1461 -### Geliştirmeler -- Yeniden işlenmiş Hareket kontrolleri # 1604 -- Pop-up oynatıcıyı kapatmanın yeni yolu # 1597 +### İyileştirmeler +- Yenilenmiş Hareket kontrolleri #1604 +- Açılır oynatıcıyı kapatmanın yeni yolu #1597 -### Sabit -- Abonelik sayısı mevcut olmadığında bir hata düzeltildi. # 1649'u kapatır. -- Bu durumlarda "Abone sayısı mevcut değil" i göster -- Bir YouTube çalma listesi boş olduğunda npe'yi düzeltin -- Soundcloud'daki kiosklar için hızlı düzeltme -- Refactor ve hata düzeltme # 1623 -- Döngüsel arama sonucunu düzelt # 1562 -- Statik olarak yerleştirilmemiş Arama çubuğunu düzeltin -- Fix YT Premium video doğru engellenmiyor -- Bazen yüklenmeyen videoları düzeltin (ÇİZGİ ayrıştırma nedeniyle) -- Video açıklamasındaki bağlantıları düzeltin -- Birisi harici sd karta indirmeye çalıştığında uyarıyı göster -- gösterilen hiçbir şey düzeltilmedi istisna tetikleyicileri raporu -- android 8.1 için arka plan oynatıcısında gösterilmeyen küçük resim [buraya bakın] (https://github.com/TeamNewPipe/NewPipe/issues/943 ) -- Yayın alıcısının kaydını düzeltin. # 1641'i kapatır. +### Düzeltmeler +- Abonelik sayısı mevcut olmadığında hatayı düzeldi. Kapatılır #1649. + - Bu durumlarda "Abone sayısı mevcut değil" ifadesini göster +- Bir YouTube oynatma listesi boş olduğunda NPE düzeltme +- SoundCloud'daki kiosklar için hızlı düzeltme +- Yeniden düzenleme ve hata düzeltme #1623 + - Döngüsel arama sonucunu düzeltildi#1562 + - Arama çubuğu statik olarak düzenlenmemiş düzeltildi + -YT Premium videoları doğru şekilde engellenmiyor düzeltildi + - Videoların bazen yüklenmemesi düzeltildi (DASH ayrıştırma nedeniyle) + - Video açıklamasındaki bağlantıları düzeltildi + - Birisi harici sd karta indirmeye çalıştığında uyarı göster + - Gösterilen hiçbir istisna tetikleyici bildirmesi düzeltildi + - android 8.1 için arka plan oynatıcıda küçük resim gösterilmiyor [buradan ulaşabilirsiniz](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Yayın alıcısının kaydı düzeltildi. Kapatılır #1641. diff --git a/fastlane/metadata/android/tr/changelogs/69.txt b/fastlane/metadata/android/tr/changelogs/69.txt new file mode 100644 index 00000000000..d927ed9c461 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/69.txt @@ -0,0 +1,19 @@ +### Yenilikler +- Aboneliklerde uzun dokunarak silme ve paylaşma işlemleri eklendi #1516 +- Tablet kullanıcı arayüzü ve kılavuz liste düzeni eklendi #1617 + +### İyileştirmeler +- En son kullanılan en-boy oranını kaydetme ve tekrar yükleme eklendi #1748 +- İndirmeler etkinliğinde tam video isimleriyle lineer düzen etkinleştirildi #1771 +- Abonelikleri doğrudan abonelikler sekmesi içinden silme ve paylaşma eklendi #1516 +- Kuyrukta oynatma zaten sona ermişse video oynatmayı tetikleyen sıra eklendi #1783 +- Ses ve parlaklık jestleri için ayrı ayarlar eklendi #1644 +- Yerelleştirme desteği eklendi #1792 + +### Düzeltmeler +- Finlandiya'da kullanılabilmesi için nokta biçemi için zaman ayrıştırma düzeltildi +- Abonelik sayısı düzeltildi +- API 28+ cihazlar için öncelikli hizmet izni eklendi #1830 + +### Bilinen Hatalar +- Oynatma durumu Android P üzerinde kaydedilemiyor diff --git a/fastlane/metadata/android/tr/changelogs/70.txt b/fastlane/metadata/android/tr/changelogs/70.txt new file mode 100644 index 00000000000..930b73eebe1 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/70.txt @@ -0,0 +1,25 @@ +DİKKAT: Bu sürüm muhtemelen bir öncekinde olduğu gibi bir hata festivalidir. Ancak 17. sürümden bu yana tam kapanma nedeniyle bozuk bir sürüm, hiç sürüm olmamasından daha iyidir. Değil mi? ¯\_(ツ)_/¯ + +### İyileştirmeler +* indirilen dosyalar artık tek bir tıklama ile açılabilir #1879 +* Android 4.1 - 4.3 için desteği bırakın #1884 +* eski oynatıcıyı kaldır #1884 +* akışları sağa kaydırarak mevcut oynatma kuyruğundan kaldırın #1915 +* Yeni bir akış manuel olarak sıralandığında otomatik sıralanan akışı kaldır #1878 +* İndirmeler için postprocessing ve eksik özellikleri uygulama #1759 by @kapodamy +* İşlem sonrası altyapı +* Uygun hata işleme "altyapısı" (indirici için) +* Çoklu indirme yerine kuyruk +* Serileştirilmiş bekleyen indirmeleri (`.giga` dosyaları) uygulama verilerine taşı +* Maksimum indirme yeniden denemesini uygulayın +* Uygun çok iş parçacıklı indirme duraklatması +* Mobil ağa geçildiğinde indirmeleri durdur (asla çalışmaz, bkz. 2. nokta) +* İplik sayısını sonraki indirmeler için saklayın +* Bir çok tutarsızlık düzeltildi + +### Sabit +* Varsayılan çözünürlük en iyi ve sınırlı mobil veri çözünürlüğü olarak ayarlandığında oluşan çökme düzeltildi #1835 +* pop-up oynatıcı çökmesi düzeltildi #1874 +* Arka plan oynatıcısını açmaya çalışırken NPE #1901 +* Otomatik kuyruklama etkinleştirildiğinde yeni akışların eklenmesi için düzeltme #1878 +* deşifre sorunu düzeltildi diff --git a/fastlane/metadata/android/tr/changelogs/71.txt b/fastlane/metadata/android/tr/changelogs/71.txt new file mode 100644 index 00000000000..8786821a6a3 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/71.txt @@ -0,0 +1,10 @@ +### İyileştirmeler +* GitHub derlemesi için uygulama güncelleme bildirimi ekleyin (#1608 yazan @krtkush) +* İndiricide çeşitli iyileştirmeler (@kapodamy tarafından #1944): +* eksik beyaz simgeleri ekleyin ve simge renklerini değiştirmek için sert çizgili yol kullanın +* yineleyicinin başlatılıp başlatılmadığını kontrol edin (#2031'i düzeltir) +* Yeni muxer'da " işlem-sonrası başarısız" hatası ile yeniden indirme denemelerine izin verin +* Senkronize olmayan video ve ses akışlarını düzelten yeni MPEG-4 muxer (#2039) + +### Sabit +* YouTube canlı yayınları kısa bir süre sonra oynatılmayı durduruyor (#1996 by @yausername) diff --git a/fastlane/metadata/android/tr/changelogs/730.txt b/fastlane/metadata/android/tr/changelogs/730.txt new file mode 100644 index 00000000000..cb6e64592ae --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/730.txt @@ -0,0 +1,2 @@ +# Sabit +- Şifre çözme işlevi hatasını tekrar düzeltin. diff --git a/fastlane/metadata/android/tr/changelogs/740.txt b/fastlane/metadata/android/tr/changelogs/740.txt new file mode 100644 index 00000000000..14f47d14d24 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/740.txt @@ -0,0 +1,22 @@ +Sure, I can provide a Turkish translation for your list: + +**Geliştirmeler** +- Yorumlardaki bağlantıları tıklanabilir yap, metin boyutunu artır +- Zaman damgası bağlantılarına tıklanınca konumu ayarla +- Son seçilen duruma göre tercih edilen sekme göster +- Çalma listesi penceresinde 'Arka Plan' üzerine uzun tıklayarak sıraya ekle +- URL olmayan paylaşılan metni ara +- Ana video oynatıcısına 'şu anki zamanda paylaş' düğmesi ekle +- Video sırası bittiğinde ana oynatıcıya kapat düğmesi ekle +- Video listesi öğeleri için uzun tıklama menüsüne 'Arka Planda Doğrudan Oynat' ekle +- Play/Enqueue komutları için İngilizce çevirileri iyileştir +- Küçük performans iyileştirmeleri +- Kullanılmayan dosyaları kaldır +- ExoPlayer'ı 2.9.6 sürümüne güncelle +- Invidious bağlantılarına destek ekle + +**Düzeltmeler** +- Yorumlar ve ilgili akışlar devre dışı bırakıldığında kaydırma sorununu düzelt +- CheckForNewAppVersionTask'in gereksiz yürütülmesini düzelt +- Geçersiz URL'leri olan abonelikleri yok say ve başlığı boş olanları sakla +- Geçersiz YouTube URL'lerini düzelt: İmza etiket adı her zaman "signature" olmadığından akışların yüklenmesini engelle diff --git a/fastlane/metadata/android/tr/changelogs/750.txt b/fastlane/metadata/android/tr/changelogs/750.txt new file mode 100644 index 00000000000..8e3a2f37f46 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/750.txt @@ -0,0 +1,21 @@ +Yeni +Oynatma devam ediyor #2288 +- Akışlara en son kaldığınız yerden devam edin +İndirici Geliştirmeleri #2149 +- İndirmeleri harici SD kartlarda depolamak için Depolama Erişim Çerçevesini kullanın +- Yeni mp4 muxer +- İsteğe bağlı olarak indirme işlemine başlamadan önce indirme dizinini değiştirme +- Ölçülü ağlara saygı gösterin + +Geliştirilmiş +- Gema dizeleri kaldırıldı #2295 +- Etkinlik yaşam döngüsü sırasında (otomatik) rotasyon değişikliklerini işleme #2444 +- Uzun basma menülerini tutarlı hale getirin #2368 + +Sabit +- Seçili altyazı parça adının gösterilmemesi düzeltildi #2394 +- Uygulama güncellemesi kontrolü başarısız olduğunda çökme (GitHub sürümü) #2423 +- İndirmelerin %99,9'da takılması düzeltildi #2440 +- Oynatma kuyruğu meta verilerini güncelleme #2453 +- [SoundCloud] Çalma listeleri yüklenirken oluşan çökme düzeltildi TeamNewPipe/NewPipeExtractor#170 +- [YouTube] Sabit süre ayrıştırılamıyor TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/tr/changelogs/760.txt b/fastlane/metadata/android/tr/changelogs/760.txt new file mode 100644 index 00000000000..f6ca13ce6d3 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/760.txt @@ -0,0 +1,40 @@ +0.17.1'deki Değişiklikler + +Yeni +- Tayca yerelleştirme + +Geliştirilmiş +- Çalma listeleri için uzun basma menülerine burada oynatmaya başla eylemini tekrar ekleyin #2518 +- SAF / eski dosya seçici için anahtar ekleyin #2521 + +Sabit +- Uygulama değiştirirken indirilenler görünümünde kaybolan düğmeleri düzeltme #2487 +- İzleme geçmişi devre dışı olmasına rağmen sabit oynatma konumu kaydedilir +- Liste görünümlerinde oynatma konumunun neden olduğu düşük performansı düzeltme #2517 +- [Extractor] ReCaptchaActivity #2527'yi düzeltin, TeamNewPipe/NewPipeExtractor#186 +- [Extractor] [YouTube] Çalma listeleri sonuçlarda olduğunda sıradan arama hatasını düzeltin TeamNewPipe/NewPipeExtractor#185 + +0.17.0'daki Değişiklikler + +Yeni +Oynatma devam ediyor #2288 +- Akışlara en son kaldığınız yerden devam edin +İndirici Geliştirmeleri #2149 +- İndirmeleri harici SD kartlarda depolamak için Depolama Erişim Çerçevesini kullanın +- Yeni mp4 muxer +- İsteğe bağlı olarak indirme işlemine başlamadan önce indirme dizinini değiştirme +- Ölçülü ağlara saygı gösterin + + +Geliştirilmiş +- Gema dizeleri kaldırıldı #2295 +- Etkinlik yaşam döngüsü sırasında (otomatik) rotasyon değişikliklerini işleme #2444 +- Uzun basma menülerini tutarlı hale getirin #2368 + +Sabit +- Seçili altyazı parça adının gösterilmemesi düzeltildi #2394 +- Uygulama güncellemesi kontrolü başarısız olduğunda çökme (GitHub sürümü) #2423 +- İndirmelerin %99,9'da takılması düzeltildi #2440 +- Oynatma kuyruğu meta verilerini güncelleme #2453 +- [SoundCloud] Çalma listeleri yüklenirken oluşan çökme düzeltildi TeamNewPipe/NewPipeExtractor#170 +- [YouTube] Sabit süre ayrıştırılamıyor TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/tr/changelogs/770.txt b/fastlane/metadata/android/tr/changelogs/770.txt new file mode 100644 index 00000000000..0fbf281de0f --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/770.txt @@ -0,0 +1,3 @@ +0.17.2'deki Değişiklikler +Düzeltme +- Düzeltme video mevcut değildi diff --git a/fastlane/metadata/android/tr/changelogs/780.txt b/fastlane/metadata/android/tr/changelogs/780.txt new file mode 100644 index 00000000000..68b98d7b444 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/780.txt @@ -0,0 +1,12 @@ +0.17.3'teki Değişiklikler + +Geliştirilmiş +- Oynatma durumlarını temizleme seçeneği eklendi #2550 +- Dosya seçicide gizli dizinleri gösterme #2591 +- NewPipe ile açılacak `invidio.us` örneklerinden URL'leri destekleyin #2488 +- music.youtube.com` URL`leri için destek ekleyin TeamNewPipe/NewPipeExtractor#194 + +Sabit +- [YouTube] 'java.lang.IllegalArgumentException #192 düzeltildi +- [YouTube] Canlı yayınların çalışmaması düzeltildi TeamNewPipe/NewPipeExtractor#195 +- Android pie'da akış indirirken yaşanan performans sorunu düzeltildi #2592 diff --git a/fastlane/metadata/android/tr/changelogs/790.txt b/fastlane/metadata/android/tr/changelogs/790.txt new file mode 100644 index 00000000000..5ff443779d1 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/790.txt @@ -0,0 +1,14 @@ +Geliştirilmiş +- Görme engelli kişilerin erişilebilirliğini iyileştirmek için daha fazla başlık ekleyin #2655 +- İndirme klasörü ayarının dilini daha tutarlı ve daha az belirsiz hale getirin #2637 + +Sabit +- Bloktaki son baytın indirilip indirilmediğini kontrol edin #2646 +- Video ayrıntı parçasındaki kaydırma düzeltildi #2672 +- Çift arama temizleme kutusu animasyonlarını teke indir #2695 +- [SoundCloud] Client_id çıkarma işlemini düzeltin #2745 + +Geliştirme +- NewPipeExtractor'dan miras alınan eksik bağımlılıkları NewPipe'a ekleyin #2535 +- AndroidX'e geçiş #2685 +- ExoPlayer 2.10.6 #2697, #2736 için güncelleme diff --git a/fastlane/metadata/android/tr/changelogs/996.txt b/fastlane/metadata/android/tr/changelogs/996.txt new file mode 100644 index 00000000000..e2e1bec89b3 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/996.txt @@ -0,0 +1,2 @@ +media.ccc.de'de bir kanal / konferans açarken yaşanan NullPointerException sorunu düzeltildi. +Grinch size Noel hediyemizi bozmaya çalıştı ama biz düzelttik. diff --git a/fastlane/metadata/android/tr/changelogs/997.txt b/fastlane/metadata/android/tr/changelogs/997.txt new file mode 100644 index 00000000000..ef0368d18cb --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/997.txt @@ -0,0 +1,17 @@ +Yeni +• Yorum yanıtları ekle +• Oynatma listelerini yeniden sıralamaya izin ver +• Oynatma listesi açıklamasını ve süresini göster +• Ayarların sıfırlanmasına izin ver + +İyileştirildi +• [Android 13+] Özel bildirim eylemlerini geri yükle +• Güncelleme denetimi için onay iste +• Arabelleğe alma sırasında bildirim oynatma/duraklatmaya izin ver +• Bazı ayarları yeniden sırala + +Düzeltildi +• [YouTube] Yorumların yüklenmemesini düzelt, ayrıca diğer düzeltmeler ve iyileştirmeler +• Ayarların içe aktarılmasındaki güvenlik açığını çöz ve JSON'a geç +• Çeşitli indirme düzeltmeleri +• Arama metnini kırp diff --git a/fastlane/metadata/android/tr/changelogs/998.txt b/fastlane/metadata/android/tr/changelogs/998.txt new file mode 100644 index 00000000000..e5979c68d6a --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/998.txt @@ -0,0 +1 @@ +YouTube'un herhangi bir akışı oynatmaması düzeltildi diff --git a/fastlane/metadata/android/tr/changelogs/999.txt b/fastlane/metadata/android/tr/changelogs/999.txt new file mode 100644 index 00000000000..e5979c68d6a --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/999.txt @@ -0,0 +1 @@ +YouTube'un herhangi bir akışı oynatmaması düzeltildi diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt index 11daef85b63..e90a307b7cd 100644 --- a/fastlane/metadata/android/tr/full_description.txt +++ b/fastlane/metadata/android/tr/full_description.txt @@ -1,2 +1 @@ -NewPipe herhangi bir Google çerçeve kütüphanesi veya YouTube API'ı kullanmaz. Sadece, ihtiyaç duyduğu bilgiyi edinmek için web sitesini ayrıştırır. -Bu nedenle Google hizmetlerinin kurulmadığı aygıtlarda kullanılabilir. Ayrıca, NewPipe'ı kullanırken YouTube hesabına ihtiyacınız yok, ve bu özgür ve açık kaynaklı bir yazılımdır. +NewPipe, Google çerçeve kütüphanelerini veya YouTube API'sını kullanmaz. İhtiyaç duyduğu bilgileri almak için sadece web sitesini ayrıştırır. Bu nedenle bu uygulama, Google Hizmetleri yüklü olmayan cihazlarda kullanılabilir. Ayrıca NewPipe'ı kullanmak için bir YouTube hesabına ihtiyacınız yoktur ve bu FLOSS. diff --git a/fastlane/metadata/android/tr/short_description.txt b/fastlane/metadata/android/tr/short_description.txt index 626cc0ff102..15c2751ee05 100644 --- a/fastlane/metadata/android/tr/short_description.txt +++ b/fastlane/metadata/android/tr/short_description.txt @@ -1 +1 @@ -Android için özgür ve hafif bir YouTube istemcisi. +Android için Bedava ve hafif bir YouTube istemcisi. diff --git a/fastlane/metadata/android/uk/changelogs/1000.txt b/fastlane/metadata/android/uk/changelogs/1000.txt new file mode 100644 index 00000000000..38e0cbfc25d --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1000.txt @@ -0,0 +1,10 @@ +Покращена +• Зробіть опис списку відтворення доступним, щоб показати більше/менше вмісту +• [PeerTube] Автоматично обробляти посилання екземплярів `subscribeto.me` +• Почніть відтворювати лише один предмет на екрані історії + +Виправлено +• Виправити видимість кнопки RSS +• Виправлено збої попереднього перегляду панелі пошуку +• Виправлено створення списку відтворення елемента без мініатюр +• Виправлено вихід із діалогового вікна завантаження до його появи diff --git a/fastlane/metadata/android/uk/changelogs/985.txt b/fastlane/metadata/android/uk/changelogs/985.txt index 905287c7494..a90cfff6b3b 100644 --- a/fastlane/metadata/android/uk/changelogs/985.txt +++ b/fastlane/metadata/android/uk/changelogs/985.txt @@ -1 +1 @@ -Виправлено проблему невідтворюваності трансляцій +Виправлено проблему невідтворюваності трансляцій YouTube diff --git a/fastlane/metadata/android/uk/changelogs/992.txt b/fastlane/metadata/android/uk/changelogs/992.txt new file mode 100644 index 00000000000..4efccccb4d8 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/992.txt @@ -0,0 +1,17 @@ +Нове +• Кількість підписників у поробицях відео +• Завантаження з черги +• Постійна мініатюра добірки +• Затискання хештегів і посилань +• Картковий режим перегляду + +Удосконалено +• Більша кнопка закриття мініпрогравача +• Плавніше зменшення масштабу мініатюр +• Цільова версія Android 13 (API 33) +• Пошук більше не призупиняє програвач + +Виправлено +• Виправлено накладання на DeX/миша +• Дозволено фоновий програвач без окремих аудіопотоків +• Різні виправлення YouTube тощо… diff --git a/fastlane/metadata/android/uk/changelogs/993.txt b/fastlane/metadata/android/uk/changelogs/993.txt new file mode 100644 index 00000000000..7b540cda236 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/993.txt @@ -0,0 +1,12 @@ +Нове +• Додано попередження про дублікати добірок і кнопку їх видалення +• Дозвіл ігнорувати апаратні кнопки +• Дозвіл ховати частково переглянуті відео + +Поліпшено +• Більше стовпців сітки на великих екранах +• Індикатори перегляду відповідні налаштуванням + +Виправлено +• Відкриття URL-адрес браузера, завантажень і зовнішніх програвачів на Android 11+ +• Роботу повноекранного режиму, який вимагав двох дотиків у MIUI diff --git a/fastlane/metadata/android/uk/changelogs/994.txt b/fastlane/metadata/android/uk/changelogs/994.txt new file mode 100644 index 00000000000..ba5c6615831 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/994.txt @@ -0,0 +1,15 @@ +Нове +• Підтримка кількох звукових доріжок/мов +• Регулювання гучності та яскравості жестами з будь-якого боку екрана +• Підтримка показу основних вкладок у нижній частині екрана + +Поліпшено +• [Bandcamp] Обробка платних доріжок + +Виправлено +• [YouTube] 403 HTTP помилки для трансляцій +• Чорний програвач під час переходу до головного програвача з добірки +• Витік службової пам'яті програвача +• [PeerTube] Поміняно місцями аватарки завантажувача та підканалу + +та багато іншого diff --git a/fastlane/metadata/android/uk/changelogs/995.txt b/fastlane/metadata/android/uk/changelogs/995.txt new file mode 100644 index 00000000000..3e40c900aab --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/995.txt @@ -0,0 +1,16 @@ +Нове +• Підтримка вкладок каналів +• Вибір якості зображень +• Отримання URL всіх зображень + +Поліпшено +• Доступність інтерфейсу +• Кращий вибір аудіо для завантаження відео +• Опція додавати назву добірки й відео поширюваного вмісту добірки + +Виправлено +• [YouTube] лічильник вподобайок +• Нереагування спливних вікон і збої в роботі програвача +• Вибір неправильних мов у перемикачі мов +• Фокусування звуку програвача не враховувало вимкнення звуку +• Додавання елементів добірок інколи не працювало diff --git a/fastlane/metadata/android/uk/changelogs/996.txt b/fastlane/metadata/android/uk/changelogs/996.txt new file mode 100644 index 00000000000..e9fd2c523fa --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/996.txt @@ -0,0 +1,2 @@ +Виправлено NullPointerException під час відкриття каналу / конференції у media.ccc.de. +Грінч намагався зламати наш різдвяний подарунок, але ми його полагодили. diff --git a/fastlane/metadata/android/uk/changelogs/997.txt b/fastlane/metadata/android/uk/changelogs/997.txt new file mode 100644 index 00000000000..4c591d2781a --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/997.txt @@ -0,0 +1,17 @@ +Нове +• Додано коментарі відповідей +• Дозвіл перевпор. плейлістів +• Показ опису й тривалості плейлістів +• Дозвіл скидати налаштування + +Удосконалено +• [Android 13+] Відновлено власні дії сповіщень +• Запит згоди на пошук оновлень +• Дозвіл відтвор./паузи зі сповіщень під час буферизації +• Перевпор. деякі налаштування + +Виправлено +• [YouTube] Усунуто незавантаж. коментарів та інші виправлення +• Усунуто вразливість імпорту налаштув. і переходу на JSON +• Виправлення завантажень +• Обрізання тексту пошуку diff --git a/fastlane/metadata/android/uk/changelogs/998.txt b/fastlane/metadata/android/uk/changelogs/998.txt new file mode 100644 index 00000000000..366b4971876 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/998.txt @@ -0,0 +1,4 @@ +Виправлено помилку, коли не відтворювалися трансляції YouTube через помилку HTTP 403. + +Випадкові помилки HTTP 403 посеред відео на YouTube ще не виправлені. +Ця проблема буде усунена в наступному випуску виправлення якнайшвидше. diff --git a/fastlane/metadata/android/uk/changelogs/999.txt b/fastlane/metadata/android/uk/changelogs/999.txt new file mode 100644 index 00000000000..54224096020 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/999.txt @@ -0,0 +1,12 @@ +Цей випуск виправляє помилки HTTP 403 в середині відео YouTube. + +Нове +• [SoundCloud] Додано підтримку URL-адрес on.soundcloud.com + +Вдосконалено +- [Bandcamp] Показ додаткових відомостей у радіокіоску + +Виправлено +• [YouTube] Виправлено випадкові помилки HTTP 403 на початку або в середині відео +• [YouTube] Витягнуто аватар і банер з більшої кількості типів заголовків каналів +- [Bandcamp] Виправлено різні помилки та постійно використовується HTTPS 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/65.txt b/fastlane/metadata/android/vi/changelogs/65.txt new file mode 100644 index 00000000000..de47bd38bf9 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/65.txt @@ -0,0 +1,27 @@ +##Cải thiện: +### Cải tiến + +- Tắt hoạt ảnh biểu tượng burgermenu #1486 +- hoàn tác xóa các bản tải xuống # 1472 +- Tùy chọn tải xuống trong menu chia sẻ #1498 +- Đã thêm tùy chọn chia sẻ vào menu nhấn dài #1454 +- Thu nhỏ trình phát chính ở lối ra #1354 +- Cập nhật phiên bản thư viện và sửa lỗi sao lưu cơ sở dữ liệu #1510 +- Cập nhật ExoPlayer 2.8.2 #1392 + - Làm lại hộp thoại kiểm soát tốc độ phát lại để hỗ trợ các kích cỡ bước khác nhau nhằm thay đổi tốc độ nhanh hơn. + - Đã thêm nút chuyển đổi để tua đi nhanh trong khi im lặng trong điều khiển tốc độ phát lại. Điều này sẽ hữu ích cho sách nói và một số thể loại âm nhạc nhất định, đồng thời có thể mang lại trải nghiệm liền mạch thực sự (và có thể ngắt một bài hát có nhiều khoảng lặng =\\). + - Độ phân giải nguồn phương tiện được tái cấu trúc để cho phép truyền siêu dữ liệu cùng với phương tiện bên trong trình phát, thay vì thực hiện thủ công. Bây giờ chúng tôi có một nguồn siêu dữ liệu duy nhất và có sẵn trực tiếp khi quá trình phát lại bắt đầu. + - Đã sửa lỗi siêu dữ liệu danh sách phát từ xa không cập nhật khi có siêu dữ liệu mới khi mở đoạn danh sách phát. + - Các bản sửa lỗi giao diện người dùng khác nhau: #1383, các điều khiển thông báo trình phát nền giờ đây luôn có màu trắng, dễ dàng tắt trình phát bật lên hơn thông qua thao tác ném +- Sử dụng trình trích xuất mới với kiến trúc được tái cấu trúc cho nhiều dịch vụ + +### Sửa lỗi + +- Sửa lỗi #1440 Bố cục thông tin video bị hỏng #1491 +- Xem lịch sử sửa lỗi #1497 + - #1495, bằng cách cập nhật siêu dữ liệu (hình thu nhỏ, tiêu đề và số lượng video) ngay khi người dùng truy cập danh sách phát. + - #1475, bằng cách đăng ký chế độ xem trong cơ sở dữ liệu khi người dùng bắt đầu phát video trên trình phát bên ngoài trên đoạn chi tiết. +- Sửa lỗi hết thời gian chờ màn hình trong trường hợp ở chế độ bật lên. #1463 (Đã sửa #640) +- Sửa lỗi trình phát video chính #1509 + - [#1412] Đã sửa lỗi chế độ lặp lại khiến người chơi gặp NPE khi nhận được ý định mới trong khi hoạt động của người chơi ở chế độ nền. + - Đã sửa lỗi thu nhỏ trình phát thành cửa sổ bật lên không hủy trình phát khi không được cấp quyền bật lên. diff --git a/fastlane/metadata/android/vi/changelogs/66.txt b/fastlane/metadata/android/vi/changelogs/66.txt new file mode 100644 index 00000000000..99b09fe058b --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/66.txt @@ -0,0 +1,33 @@ +# Nhật ký thay đổi của v0.13.7 + +### Đã sửa +- Khắc phục sự cố bộ lọc sắp xếp của v0.13.6 + +# Nhật ký thay đổi của v0.13.6 + +### Cải tiến + +- Tắt hoạt ảnh biểu tượng burgermenu #1486 +- hoàn tác xóa tải xuống #1472 +- Tùy chọn tải xuống trong menu chia sẻ #1498 +- Đã thêm tùy chọn chia sẻ vào menu nhấn dài #1454 +- Thu nhỏ trình phát chính ở lối ra #1354 +- Phiên bản thư viện cập nhật và bản sửa lỗi sao lưu cơ sở dữ liệu #1510 +- ExoPlayer 2.8.2 Cập nhật #1392 +- Làm lại hộp thoại kiểm soát tốc độ phát lại để hỗ trợ các kích cỡ bước khác nhau nhằm thay đổi tốc độ nhanh hơn. +- Đã thêm nút chuyển đổi để tua đi nhanh trong khi im lặng trong điều khiển tốc độ phát lại. Điều này sẽ hữu ích cho sách nói và một số thể loại âm nhạc nhất định, đồng thời có thể mang lại trải nghiệm liền mạch thực sự (và có thể ngắt một bài hát có nhiều khoảng lặng =\\). +- Độ phân giải nguồn phương tiện được tái cấu trúc để cho phép truyền siêu dữ liệu cùng với phương tiện nội bộ trong trình phát thay vì thực hiện thủ công. Bây giờ chúng tôi có một nguồn siêu dữ liệu duy nhất và có sẵn trực tiếp khi quá trình phát lại bắt đầu. +- Đã sửa lỗi siêu dữ liệu danh sách phát từ xa không cập nhật khi có siêu dữ liệu mới khi mở đoạn danh sách phát. +- Nhiều bản sửa lỗi giao diện người dùng khác nhau: #1383, các điều khiển thông báo trình phát nền giờ đây luôn có màu trắng, dễ dàng tắt trình phát cửa sổ bật lên thông qua thao tác ném +- Sử dụng trình trích xuất mới với kiến trúc được tái cấu trúc cho nhiều dịch vụ + +### Sửa lỗi + +- Sửa lỗi #1440 Bố cục thông tin video bị hỏng #1491 +- Xem lịch sử sửa lỗi #1497 +- #1495, bằng cách cập nhật siêu dữ liệu (hình thu nhỏ, tiêu đề và số lượng video) ngay khi người dùng truy cập vào danh sách phát. +- #1475, bằng cách đăng ký chế độ xem trong cơ sở dữ liệu khi người dùng bắt đầu video trên trình phát bên ngoài trên đoạn chi tiết. +- Sửa lỗi màn hình hết thời gian chờ trong chế độ bật lên. #1463 (Đã sửa #640) +- Sửa lỗi trình phát video chính #1509 +- [#1412] Đã sửa lỗi chế độ lặp lại khiến người chơi NPE khi nhận được ý định mới trong khi hoạt động của người chơi ở trong nền. +- Đã sửa lỗi thu nhỏ trình phát thành cửa sổ bật lên không hủy trình phát khi không được cấp quyền cửa sổ bật lên. diff --git a/fastlane/metadata/android/vi/changelogs/68.txt b/fastlane/metadata/android/vi/changelogs/68.txt new file mode 100644 index 00000000000..2247be255b9 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/68.txt @@ -0,0 +1,31 @@ +# thay đổi của v0.14.1 + +### Đã sửa +- Đã sửa lỗi không giải mã được url video #1659 +- Sửa lỗi link mô tả không giải nén tốt #1657 + +# thay đổi của v0.14.0 + +### Mới +- Thiết kế ngăn kéo mới #1461 +- Trang trước có thể tùy chỉnh mới #1461 + +### Cải tiến +- Điều khiển cử chỉ được làm lại #1604 +- Cách mới để đóng trình phát cửa sổ bật lên #1597 + +### Đã sửa +- Sửa lỗi khi không có số lượng đăng ký. Đóng #1649. +- Hiển thị "Không có số lượng người đăng ký" trong những trường hợp đó +- Khắc phục NPE khi danh sách phát YouTube trống +- Sửa nhanh các ki-ốt trong SoundCloud +- Tái cấu trúc và sửa lỗi #1623 +- Sửa kết quả tìm kiếm theo chu kỳ #1562 +- Sửa lỗi thanh Tìm kiếm không được bố trí tĩnh +- Sửa lỗi video YT Premium không bị chặn đúng cách +- Khắc phục Video đôi khi không tải (do phân tích cú pháp DASH) +- Sửa các liên kết trong phần mô tả video +- Hiển thị cảnh báo khi ai đó cố gắng tải xuống thẻ sdcard bên ngoài +- sửa lỗi không hiển thị báo cáo kích hoạt ngoại lệ +- hình thu nhỏ không hiển thị trong trình phát nền dành cho android 8.1 [xem tại đây](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Sửa lỗi đăng ký máy thu phát sóng. Đóng #1641. diff --git a/fastlane/metadata/android/vi/changelogs/69.txt b/fastlane/metadata/android/vi/changelogs/69.txt new file mode 100644 index 00000000000..a6fb21da097 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/69.txt @@ -0,0 +1,19 @@ +### Mới +- Nhấn và giữ để xóa và chia sẻ trong đăng ký #1516 +- Giao diện người dùng máy tính bảng và bố cục danh sách lưới #1617 + +### Cải tiến +- lưu trữ và tải lại tỷ lệ khung hình được sử dụng lần cuối # 1748 +- Bật bố cục tuyến tính trong hoạt động Tải xuống với tên video đầy đủ #1771 +- Xóa và chia sẻ đăng ký trực tiếp từ trong tab đăng ký #1516 +- Việc xếp hàng hiện sẽ kích hoạt phát video nếu hàng đợi phát đã kết thúc #1783 +- Riêng cài đặt cho cử chỉ âm lượng và độ sáng #1644 +- Thêm hỗ trợ Bản địa hóa #1792 + +### Sửa lỗi +- Sửa lỗi phân tích thời gian cho . định dạng, vì vậy NewPipe có thể được sử dụng ở Phần Lan +- Sửa số lượng đăng ký +- Thêm quyền dịch vụ nền trước cho các thiết bị API 28+ #1830 + +### Lỗi đã biết +- Không thể lưu trạng thái phát lại trên Android P diff --git a/fastlane/metadata/android/vi/changelogs/70.txt b/fastlane/metadata/android/vi/changelogs/70.txt new file mode 100644 index 00000000000..7e52b528716 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/70.txt @@ -0,0 +1,25 @@ +LƯU Ý: Phiên bản này có thể là một lỗi nghiêm trọng, giống như phiên bản trước. Tuy nhiên do đã tắt hoàn toàn kể từ ngày 17. một phiên bản bị hỏng còn tốt hơn là không có phiên bản nào. Phải không? ¯\_(ツ)_/¯ + +### Cải tiến +* bây giờ có thể mở các tệp đã tải xuống bằng một cú nhấp chuột #1879 +* bỏ hỗ trợ cho android 4.1 - 4.3 #1884 +* xóa trình phát cũ #1884 +* xóa luồng khỏi hàng phát hiện tại bằng cách vuốt chúng sang phải #1915 +* xóa luồng được xếp hàng tự động khi luồng mới được xếp hàng thủ công #1878 +* Xử lý hậu kỳ để tải xuống và triển khai các tính năng còn thiếu #1759 của @kapodamy +* Cơ sở hạ tầng hậu xử lý +* Xử lý lỗi thích hợp "cơ sở hạ tầng" (dành cho người tải xuống) +* Xếp hàng thay vì tải xuống nhiều lần +* Di chuyển các lượt tải xuống đang chờ xử lý nối tiếp (tệp `.giga`) sang dữ liệu ứng dụng +* Triển khai thử tải xuống tối đa +* Tạm dừng tải xuống đa luồng thích hợp +* Dừng tải xuống khi chuyển sang mạng di động (không bao giờ hoạt động, xem điểm thứ 2) +* Lưu số lượng chủ đề cho lần tải tiếp theo +* Đã sửa rất nhiều lỗi không mạch lạc + +### Đã sửa +* Khắc phục sự cố với độ phân giải mặc định được đặt thành độ phân giải dữ liệu di động tốt nhất và hạn chế #1835 +* Đã sửa lỗi trình phát bật lên #1874 +* NPE khi cố mở trình phát nền #1901 +* Sửa lỗi chèn luồng mới khi bật xếp hàng tự động #1878 +* Đã khắc phục sự cố tắt máy giải mã diff --git a/fastlane/metadata/android/vi/changelogs/71.txt b/fastlane/metadata/android/vi/changelogs/71.txt new file mode 100644 index 00000000000..6eb1ad511b9 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/71.txt @@ -0,0 +1,10 @@ +### Cải thiện +* Thêm thông báo cập nhật ứng dụng cho bản dựng GitHub (#1608 bởi @krtkush) +* Nhiều cải tiến cho trình tải xuống (#1944 bởi @kapodamy): +* Thêm biểu tượng trắng bị thiếu và sử dụng cách thức cố định để thay đổi màu biểu tượng +* Kiểm tra xem trình lặp có được khởi tạo hay không (sửa lỗi #2031) +* Cho phép tải xuống lại với lỗi "xử lý hậu kỳ thất bại" trong bộ ghép nối mới +* Bộ ghép nối MPEG-4 mới sửa lỗi luồng video và âm thanh không đồng bộ (#2039) + +### Sửa lỗi +* Luồng trực tiếp YouTube dừng phát sau một thời gian ngắn (#1996 bởi @yausername) diff --git a/fastlane/metadata/android/vi/changelogs/740.txt b/fastlane/metadata/android/vi/changelogs/740.txt new file mode 100644 index 00000000000..dacb5019abb --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/740.txt @@ -0,0 +1,23 @@ +

    Cải tiến

    +
      +
    • click được liên kết trong phần bình luận, tăng cỡ chữ
    • +
    • nhảy đến khi click vào mốc thời gian ở bình luận
    • +
    • hiện tab ưa thích dựa trên trạng thái lựa chọn gần đây
    • +
    • thêm danh sách phát vào hàng chờ khi chạm lâu 'Phát nền' trong cửa sổ danh sách phát
    • +
    • tìm kiếm từ ngữ chung khi nó không phảiURL
    • +
    • thêm "chia sẻ thời gian hiện tại " nút trờ về video chính
    • +
    • thêm nút đóng vào trình phát chính khi hàng đợi video kết thúc
    • +
    • thêm "Chơi trực tiếp dưới nền" chạm lâu vào menu để xem danh sách video
    • +
    • cải thiện bản dịch tiếng Anh cho lệnh Chơi/Thêm vào danh sách
    • +
    • cải thiện hiệu năng một xíu
    • +
    • xóa bỏ những tệp không dùng đến
    • +
    • cập nhật ExoPlayer lên 2.9.6
    • +
    • hỗ trợ liên kết Invidious
    • +
    +

    Vá lỗi

    +
      +
    • sửa w/ bình luận và vô hiệu hóa phát luồng liên quan
    • +
    • sửa lỗi CheckForNewAppVersionTask bị thực thi khi không mong muốn't
    • +
    • sửa lỗi nhập danh sách kênh youtube đăng ký: phớt lờ url không hợp lệ và giữ nó trống với tiêu đề
    • +
    • sửa lỗi url youtube không hợp lệ: tên thẻ chữ ký không phải lúc nào cũng là "chữ ký" ngăn luồng tải
    • +
    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/820.txt b/fastlane/metadata/android/vi/changelogs/820.txt index f048433771f..8554471a8da 100644 --- a/fastlane/metadata/android/vi/changelogs/820.txt +++ b/fastlane/metadata/android/vi/changelogs/820.txt @@ -1 +1 @@ -Sửa regex trong hàm giải mã đang làm cho phần YouTube không xài được. +Sửa regex trong hàm giải mã đang làm cho phần YouTube không dùng được. diff --git a/fastlane/metadata/android/vi/changelogs/860.txt b/fastlane/metadata/android/vi/changelogs/860.txt new file mode 100644 index 00000000000..aff4dbddca9 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/860.txt @@ -0,0 +1,7 @@ +Cải thiện +• Lưu và khôi phục trạng thái bật/tắt âm vực và nhịp độ. +• Hỗ trợ hiển thị phần cắt trên màn hình trong trình phát. +• Làm tròn lượt xem và số lượng người đăng ký. +• Tối ưu hóa YouTube để sử dụng ít dữ liệu hơn. + +Hơn 15 lỗi liên quan đến YouTube đã được sửa trong bản phát hành này. diff --git a/fastlane/metadata/android/vi/changelogs/900.txt b/fastlane/metadata/android/vi/changelogs/900.txt new file mode 100644 index 00000000000..f5a6e0bac69 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/900.txt @@ -0,0 +1,14 @@ +Mới +• Nhóm đăng ký và luồng được sắp xếp +• Nút tắt tiếng trong trình phát + +Cải thiện +• Cho phép mở liên kết music.youtube.com và media.ccc.de trong NewPipe +• Di dời hai cài đặt từ Xuất hiện sang Nội dung +• Ẩn tùy chọn tìm kiếm 5, 15, 25 giây nếu tìm kiếm không chính xác được bật + +Sửa lỗi +• Một số video WebM không thể tìm kiếm +• Sao lưu cơ sở dữ liệu trên Android P +• Sự cố khi chia sẻ tệp đã tải xuống +• Rất nhiều vấn đề trích xuất YouTube và nhiều hơn nữa... diff --git a/fastlane/metadata/android/vi/changelogs/920.txt b/fastlane/metadata/android/vi/changelogs/920.txt new file mode 100644 index 00000000000..568b149d9e7 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/920.txt @@ -0,0 +1,9 @@ +Cải thiện + +• Thêm ngày tải lên và số lượt xem vào các mục lưới phát trực tiếp. +• Cải thiện bố cục tiêu đề ngăn kéo. + +Sửa lỗi + +• Sửa lỗi nút tắt tiếng gây treo trên API 19. +• Sửa lỗi tải xuống video 1080p 60fps dài diff --git a/fastlane/metadata/android/vi/changelogs/952.txt b/fastlane/metadata/android/vi/changelogs/952.txt new file mode 100644 index 00000000000..8f99a8e4847 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/952.txt @@ -0,0 +1,7 @@ +Cải thiện +• Tự động phát có sẵn cho tất cả các dịch vụ (thay vì chỉ cho YouTube) + +Sửa lỗi +• Sửa lỗi các luồng liên quan bằng cách hỗ trợ tiếp nối mới của YouTube +• Sửa lỗi video YouTube bị giới hạn độ tuổi +• [Android TV] Sửa lỗi lớp phủ nổi bật của tiêu điểm vẫn còn diff --git a/fastlane/metadata/android/vi/changelogs/965.txt b/fastlane/metadata/android/vi/changelogs/965.txt new file mode 100644 index 00000000000..d0287509d11 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/965.txt @@ -0,0 +1,6 @@ +Sửa lỗi sập ứng dụng khi sắp xếp lại các nhóm kênh. +Sửa lỗi lấy thêm video YouTube từ kênh và danh sách phát. +Sửa lỗi lấy bình luận YouTube. +Thêm hỗ trợ cho các đường dẫn phụ /watch/, /v/ và /w/ trong URL YouTube. +Sửa lỗi trích xuất ID khách hàng SoundCloud và nội dung bị giới hạn địa lý. +Thêm bản địa hóa tiếng Kurd Bắc. diff --git a/fastlane/metadata/android/vi/changelogs/967.txt b/fastlane/metadata/android/vi/changelogs/967.txt new file mode 100644 index 00000000000..1e2c075a5f3 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/967.txt @@ -0,0 +1 @@ +Sửa lỗi YouTube không hoạt động đúng cách ở EU. Nguyên nhân là do hệ thống cookie và đồng ý quyền riêng tư mới yêu cầu NewPipe đặt cookie CONSENT. diff --git a/fastlane/metadata/android/vi/changelogs/968.txt b/fastlane/metadata/android/vi/changelogs/968.txt new file mode 100644 index 00000000000..832fc49722a --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/968.txt @@ -0,0 +1,7 @@ +Thêm tùy chọn chi tiết kênh vào menu nhấn giữ lâu. +Thêm chức năng đổi tên Danh sách phát từ giao diện danh sách phát. +Cho phép người dùng tạm dừng trong khi video đang được đệm. +Hoàn thiện giao diện màu trắng. +Sửa lỗi font chữ chồng lên nhau khi sử dụng kích thước font chữ lớn hơn. +Sửa lỗi không có video trên thiết bị Formuler và Zephier. +Sửa lỗi treo ứng dụng. diff --git a/fastlane/metadata/android/vi/changelogs/969.txt b/fastlane/metadata/android/vi/changelogs/969.txt new file mode 100644 index 00000000000..ccb57509ed0 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/969.txt @@ -0,0 +1,8 @@ +• Cho phép cài đặt trên bộ nhớ ngoài +• [Bandcamp] Thêm hỗ trợ hiển thị ba bình luận đầu tiên trên một luồng +• Chỉ hiển thị thông báo "tải xuống đã bắt đầu" khi tải xuống được bắt đầu +• Không đặt cookie reCaptcha khi không có cookie nào được lưu trữ +• [Trình phát] Cải thiện hiệu suất bộ nhớ cache +• [Trình phát] Sửa lỗi trình phát không tự động phát +• Loại bỏ Snackbars trước khi xóa tải xuống +• Sửa lỗi cố gắng xóa đối tượng không có trong danh sách diff --git a/fastlane/metadata/android/vi/changelogs/970.txt b/fastlane/metadata/android/vi/changelogs/970.txt new file mode 100644 index 00000000000..34aaf9d0c13 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/970.txt @@ -0,0 +1,11 @@ +Mới +• Hiển thị siêu dữ liệu nội dung (thẻ, danh mục, giấy phép, ...) bên dưới phần mô tả +• Thêm tùy chọn "Hiển thị chi tiết kênh" trong danh sách phát từ xa (không phải cục bộ) +• Thêm tùy chọn "Mở trong trình duyệt" vào menu nhấn giữ + +Sửa lỗi +• Sửa lỗi xoay màn hình bị lỗi trên trang chi tiết video +• Sửa lỗi nút "Phát với Kodi" trong trình phát luôn nhắc cài đặt Kore +• Sửa lỗi và cải thiện đường dẫn nhập và xuất cài đặt +• [YouTube] Sửa lỗi số lượng thích cho bình luận +Và nhiều hơn nữa diff --git a/fastlane/metadata/android/vi/changelogs/971.txt b/fastlane/metadata/android/vi/changelogs/971.txt new file mode 100644 index 00000000000..98c90445095 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/971.txt @@ -0,0 +1,3 @@ +Khắc phục nhanh +• Tăng bộ nhớ đệm cho phát lại sau khi tải lại bộ nhớ đệm +• Sửa lỗi sập ứng dụng trên máy tính bảng và TV khi nhấp vào biểu tượng hàng đợi phát trong trình phát diff --git a/fastlane/metadata/android/vi/changelogs/973.txt b/fastlane/metadata/android/vi/changelogs/973.txt new file mode 100644 index 00000000000..7310ebefbaf --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/973.txt @@ -0,0 +1,4 @@ +Khắc phục nhanh +• Sửa lỗi hình thu nhỏ và tiêu đề bị cắt trong bố cục lưới, do tính toán sai về số lượng video có thể vừa trong một hàng. +• Sửa lỗi hộp thoại tải xuống biến mất mà không làm gì nếu được mở từ menu chia sẻ. +• Cập nhật thư viện liên quan đến việc mở các hoạt động bên ngoài như trình chọn tệp của Storage Access Framework. diff --git a/fastlane/metadata/android/vi/changelogs/974.txt b/fastlane/metadata/android/vi/changelogs/974.txt new file mode 100644 index 00000000000..204bbd1ac72 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/974.txt @@ -0,0 +1,5 @@ +Khắc phục nhanh +• Sửa lỗi bộ nhớ đệm do YouTube giới hạn tốc độ +• Sửa lỗi trích xuất bình luận YouTube và lỗi sập ứng dụng khi tắt bình luận +• Sửa lỗi tìm kiếm nhạc YouTube +• Sửa lỗi phát trực tiếp PeerTube diff --git a/fastlane/metadata/android/vi/changelogs/978.txt b/fastlane/metadata/android/vi/changelogs/978.txt new file mode 100644 index 00000000000..191b6ec0fe6 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/978.txt @@ -0,0 +1 @@ +Đã sửa lỗi thực hiện kiểm tra phiên bản NewPipe mới. Kiểm tra này đôi khi được thực hiện quá sớm và do đó dẫn đến ứng dụng bị lỗi. Vấn đề này đã được sửa. diff --git a/fastlane/metadata/android/vi/changelogs/979.txt b/fastlane/metadata/android/vi/changelogs/979.txt new file mode 100644 index 00000000000..e6d0794b6a8 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/979.txt @@ -0,0 +1,2 @@ +- Sửa lỗi tiếp tục phát lại +- Cải thiện để đảm bảo dịch vụ xác định xem NewPipe có nên kiểm tra phiên bản mới hay không không được khởi động trong nền diff --git a/fastlane/metadata/android/vi/changelogs/980.txt b/fastlane/metadata/android/vi/changelogs/980.txt new file mode 100644 index 00000000000..21c44cda7fb --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/980.txt @@ -0,0 +1,13 @@ +Mới +• Thêm tùy chọn "Thêm vào danh sách phát" vào menu chia sẻ +• Thêm hỗ trợ cho y2u.be và PeerTube short links + +Cải tiến +• Làm cho các điều khiển tốc độ phát lại nhỏ gọn hơn +• Nguồn cấp dữ liệu hiện nay làm nổi bật các mục mới +• Tùy chọn "Hiển thị các mục đã xem" trong nguồn cấp dữ liệu hiện được lưu + +Sửa lỗi +• Sửa lỗi trích xuất thích và không thích của YouTube +• Sửa lỗi phát lại tự động sau khi quay lại từ nền +Và nhiều hơn nữa diff --git a/fastlane/metadata/android/vi/changelogs/981.txt b/fastlane/metadata/android/vi/changelogs/981.txt new file mode 100644 index 00000000000..a77e8de7e8e --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/981.txt @@ -0,0 +1,2 @@ +Loại bỏ hỗ trợ MediaParser để sửa lỗi tiếp tục phát lại thất bại sau khi bộ nhớ đệm trên Android 11+. +Vô hiệu hóa truyền thông qua đường hầm trên Philips QM16XE để sửa lỗi phát lại. diff --git a/fastlane/metadata/android/vi/changelogs/982.txt b/fastlane/metadata/android/vi/changelogs/982.txt new file mode 100644 index 00000000000..e825d56cf2c --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/982.txt @@ -0,0 +1 @@ +Sửa lỗi YouTube không phát bất kỳ luồng nào. diff --git a/fastlane/metadata/android/vi/changelogs/983.txt b/fastlane/metadata/android/vi/changelogs/983.txt new file mode 100644 index 00000000000..f74e07bc3f4 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/983.txt @@ -0,0 +1,9 @@ +Thêm giao diện người dùng và hành vi vuốt đúp để tìm kiếm mới +Làm cho cài đặt có thể tìm kiếm được +Làm nổi bật các bình luận đã ghim +Thêm hỗ trợ mở với ứng dụng cho phiên bản PeerTube của FSFE +Thêm thông báo lỗi +Sửa lỗi phát lại mục đầu tiên trong hàng đợi khi thay đổi trình phát +Chờ lâu hơn khi bộ nhớ đệm trong các phát trực tiếp trước khi thất bại +Sửa thứ tự kết quả tìm kiếm cục bộ +Sửa lỗi trường mục trống trong hàng đợi phát diff --git a/fastlane/metadata/android/vi/changelogs/984.txt b/fastlane/metadata/android/vi/changelogs/984.txt new file mode 100644 index 00000000000..4145ef636f8 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/984.txt @@ -0,0 +1,7 @@ +Tải đủ số lượng mục ban đầu trong danh sách để lấp đầy toàn bộ màn hình và sửa lỗi cuộn trên máy tính bảng và TV +Sửa lỗi sập ứng dụng ngẫu nhiên khi cuộn qua danh sách +Làm cho vòng cung tìm kiếm nhanh của trình phát đi dưới giao diện người dùng hệ thống +Hoàn tác thay đổi đối với phần cắt khi phát trong nhiều cửa sổ, gây ra lỗi hồi quy trình phát bị đặt sai vị trí trên một số điện thoại +Tăng compileSdk từ 30 lên 31 +Cập nhật thư viện báo cáo lỗi +Cấu trúc lại một số mã trong trình phát diff --git a/fastlane/metadata/android/vi/changelogs/985.txt b/fastlane/metadata/android/vi/changelogs/985.txt new file mode 100644 index 00000000000..d2086b62c1f --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/985.txt @@ -0,0 +1 @@ +Đã sửa lỗi YouTube không phát bất kỳ luồng nào diff --git a/fastlane/metadata/android/vi/changelogs/987.txt b/fastlane/metadata/android/vi/changelogs/987.txt new file mode 100644 index 00000000000..776bf53f788 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/987.txt @@ -0,0 +1,12 @@ +Mới +• Hỗ trợ các phương thức phân phối khác ngoài HTTP lũy tiến: thời gian tải nhanh hơn, sửa lỗi cho PeerTube và SoundCloud, phát lại các luồng trực tiếp YouTube đã kết thúc gần đây +• Thêm nút để thêm danh sách phát từ xa vào danh sách phát cục bộ +• Xem trước hình ảnh trong bảng chia sẻ Android 10+ + +Cải thiện +• Cải thiện hộp thoại thông số phát lại +• Di chuyển các nút nhập / xuất đăng ký sang menu ba chấm + +Cố định +• Khắc phục sự cố xóa video đã xem đầy đủ khỏi danh sách phát +• Sửa chủ đề thực đơn chia sẻ và mục "thêm vào danh sách phát" diff --git a/fastlane/metadata/android/vi/changelogs/988.txt b/fastlane/metadata/android/vi/changelogs/988.txt new file mode 100644 index 00000000000..545f3c7b48d --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Sửa lỗi “Không thể nhận bất kỳ luồng nào” khi cố gắng phát bất kỳ video nào +[YouTube] Khắc phục thông báo hiển thị “Nội dung sau không có sẵn trên ứng dụng này.” thay vì video được yêu cầu diff --git a/fastlane/metadata/android/vi/changelogs/989.txt b/fastlane/metadata/android/vi/changelogs/989.txt new file mode 100644 index 00000000000..542db61c76d --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Sửa lỗi tải vô hạn khi cố gắng phát bất kỳ video nào +• [YouTube] Sửa lỗi điều tiết trên một số video +• Nâng cấp thư viện jsoup lên 1.15.3, bao gồm bản sửa lỗi bảo mật diff --git a/fastlane/metadata/android/vi/changelogs/990.txt b/fastlane/metadata/android/vi/changelogs/990.txt new file mode 100644 index 00000000000..c867f31dddf --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/990.txt @@ -0,0 +1,15 @@ +Hiện tại hỗ trợ phiên bản tối thiểu là Android 5 Lollipop! + +Mới +• Tải xuống từ menu nhấn và giữ +• Ẩn các video trong tương lai trong nguồn cấp dữ liệu +• Chia sẻ danh sách phát địa phương + +Cải thiện +• Tái cấu trúc mã trình phát.. +• Cải thiện chế độ chia tỷ lệ của hình thu nhỏ +• Trình giữ chỗ hình ảnh theo kiểu vector hóa + +Khắc phục +• Khắc phục nhiều vấn đề khác nhau với thông báo trình phát: thông tin phương tiện lỗi thời/bị thiếu, hình thu nhỏ bị méo +• Sửa toàn màn hình bằng 1/4 màn hình diff --git a/fastlane/metadata/android/vi/changelogs/991.txt b/fastlane/metadata/android/vi/changelogs/991.txt new file mode 100644 index 00000000000..8ffaf155155 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/991.txt @@ -0,0 +1,13 @@ +Mới +• Thêm nút "Mở trong trình duyệt" trong bảng lỗi +• Thêm tùy chọn hiển thị nhóm kênh dạng danh sách +• [YouTube] Nhấp và giữ vào các phân đoạn phát trực tuyến để chia sẻ URL dấu thời gian +• Thêm nút xếp hàng phát vào trình phát mini + +Cải thiện +• Thêm bản địa hóa tiếng Iceland và cập nhật nhiều bản dịch khác +• Nhiều cải tiến nội bộ + +Sửa chữa +• Khắc phục nhiều sự cố +• [YouTube] Khắc phục sự cố tải kênh, nguồn cấp dữ liệu không chuyên dụng và giải pháp khắc phục sự cố phát lại ở một số quốc gia 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/changelogs/994.txt b/fastlane/metadata/android/vi/changelogs/994.txt new file mode 100644 index 00000000000..e73fcb20a53 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/994.txt @@ -0,0 +1,15 @@ +Mới +• Hỗ trợ nhiều bản âm thanh/ngôn ngữ +• Cho phép cài đặt cử chỉ âm lượng và độ sáng ở bất kỳ phía nào của màn hình +• Hỗ trợ hiển thị các tab chính ở cuối màn hình + +Cải thiện +• [Bandcamp] Xử lý các dấu vết đằng sau bức tường phí + +Đã sửa +• [YouTube] Lỗi HTTP 403 cho luồng +• Trình phát màu đen khi chuyển sang trình phát chính từ chế độ xem danh sách phát +• Rò rỉ bộ nhớ dịch vụ trình phát +• [PeerTube] Hình đại diện của người tải lên và kênh con đã bị hoán đổi + +và hơn thế nữa diff --git a/fastlane/metadata/android/vi/changelogs/995.txt b/fastlane/metadata/android/vi/changelogs/995.txt new file mode 100644 index 00000000000..69b616883e0 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/995.txt @@ -0,0 +1,14 @@ +Mới +• Hỗ trợ tab kênh +• Chọn chất lượng hình ảnh +• Nhận URL cho tất cả hình ảnh + +Cải thiện +• Khả năng truy cập của giao diện trình phát +• Tùy chọn thêm tên danh sách phát và tên video vào nội dung chia sẻ danh sách phát +• Cải tiến nội bộ và cập nhật phụ thuộc + +Đã sửa +• Lựa chọn ngôn ngữ sai trong bộ chọn ngôn ngữ +• Tiêu điểm âm thanh của trình phát không bị tắt tiếng +• Thêm mục vào danh sách phát không hoạt động trong các trường hợp cụ thể diff --git a/fastlane/metadata/android/vi/changelogs/996.txt b/fastlane/metadata/android/vi/changelogs/996.txt new file mode 100644 index 00000000000..2f92c6dc28d --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/996.txt @@ -0,0 +1,2 @@ +Đã sửa lỗi NullPointerException khi mở kênh/hội nghị trong media.ccc.de. +Grinch đã cố làm vỡ món quà Giáng sinh của chúng tôi dành cho bạn, nhưng chúng tôi đã sửa nó. diff --git a/fastlane/metadata/android/vi/changelogs/997.txt b/fastlane/metadata/android/vi/changelogs/997.txt new file mode 100644 index 00000000000..d143823d342 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/997.txt @@ -0,0 +1,17 @@ +Mới + • Thêm câu trả lời nhận xét + • Cho phép sắp xếp lại danh sách phát + • Hiển thị mô tả và thời lượng danh sách phát + • Cho phép đặt lại cài đặt + + Cải thiện + • [Android 13+] Khôi phục các tác vụ thông báo tùy chỉnh + • Yêu cầu sự đồng ý để kiểm tra cập nhật + • Cho phép phát/tạm dừng thông báo trong khi lưu vào bộ đệm + • Sắp xếp lại một số cài đặt + + Đã sửa + • [YouTube] Khắc phục lỗi không tải được bình luận, cùng với các bản sửa lỗi và cải tiến khác + • Giải quyết lỗ hổng trong cài đặt nhập và chuyển sang JSON + • Nhiều bản sửa lỗi tải xuống khác nhau + • Cắt bớt văn bản tìm kiếm diff --git a/fastlane/metadata/android/vi/changelogs/998.txt b/fastlane/metadata/android/vi/changelogs/998.txt new file mode 100644 index 00000000000..d2086b62c1f --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/998.txt @@ -0,0 +1 @@ +Đã sửa lỗi YouTube không phát bất kỳ luồng nào diff --git a/fastlane/metadata/android/vi/changelogs/999.txt b/fastlane/metadata/android/vi/changelogs/999.txt new file mode 100644 index 00000000000..d2086b62c1f --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/999.txt @@ -0,0 +1 @@ +Đã sửa lỗi YouTube không phát bất kỳ luồng nào 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/fastlane/metadata/android/zh-Hans/changelogs/998.txt b/fastlane/metadata/android/zh-Hans/changelogs/998.txt new file mode 100644 index 00000000000..8a5424c9e02 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/998.txt @@ -0,0 +1 @@ +修复YouTube无法播放任何视频 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/999.txt b/fastlane/metadata/android/zh-Hans/changelogs/999.txt new file mode 100644 index 00000000000..8a5424c9e02 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/999.txt @@ -0,0 +1 @@ +修复YouTube无法播放任何视频 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/1000.txt b/fastlane/metadata/android/zh-Hant/changelogs/1000.txt new file mode 100644 index 00000000000..c08ff0971f1 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/1000.txt @@ -0,0 +1,13 @@ +改善 +• 讓播放清單描述可點擊以顯示更多或更少的內容 +• [PeerTube] 自動處理 `subscribeto.me` 站台連結 +• 在歷史畫面中只開始播放單一項目 + +修正 +• 修正 RSS 按鈕的能鍵度 +• 修正進度列預覽當機的問題 +• 修正播放清單中沒有縮圖的項目 +• 修正在下載對話框出現前退出的問題 +• 修正相關項目清單排序彈出 +• 修正新增至播放清單對話框的順序 +• 調整播放清單書籤項目的佈局 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/65.txt b/fastlane/metadata/android/zh-Hant/changelogs/65.txt new file mode 100644 index 00000000000..e398065cc7e --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/65.txt @@ -0,0 +1,26 @@ +###改進 + +- 停用 burgermenu 圖示動畫 #1486 +- 撤銷刪除下載 #1472 +- 分享選單中的下載選項 #1498 +- 在長點選單中加入分享選項 #1454 +- 退出時最小化主播放器 #1354 +- 程式庫版本更新和資料庫備份修正 #1510 +- ExoPlayer 2.8.2 更新 #1392 + - 重新設計播放速度控制對話框,支援不同步驟大小以加快速度變化。 + - 在播放速度控制中新增靜音時快轉的切換。這應該對有聲讀物和某些音樂類型很有幫助,並能帶來真正的無縫體驗 (而且可以打破有大量靜音的歌曲 =\)。 + - 重構媒體來源解析,允許在播放器內部傳輸媒體旁的 metadata,而非手動傳輸。現在我們有單一的 metadata 來源,並可在播放開始時直接使用。 + - 開啟播放清單片段時,當有新的 metadata 時,遠端播放清單 metadata 不會更新。 + - 各種使用者介面修正: #1383、背景播放器通知控制現在總是白色、透過甩動更容易關閉彈出播放器 +- 針對多服務使用重構架構的新萃取器 + +###修正 + +- 修正 #1440 破碎的視訊資訊佈局 #1491 +- 檢視歷史修正 #1497 + - #1495,通過在用戶訪問播放列表時更新元資料(縮圖、標題和視頻數量)。 + - 1475, 當使用者在詳細片段的外部播放器上啟動影片時,在資料庫中註冊檢視。 +- 修正彈出模式下的超時問題。#1463 (已修復 #640) +- 主視訊播放器修正 #1509 + - [#1412] 修正當播放器活動在背景時,收到新的意圖時,重複模式會導致播放器 NPE。 + - 修正當未授予彈出權限時,將播放器最小化為彈出視窗不會銷毀播放器。 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/992.txt b/fastlane/metadata/android/zh-Hant/changelogs/992.txt new file mode 100644 index 00000000000..97bc793b27b --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/992.txt @@ -0,0 +1,17 @@ +新增 +• 影片詳細資訊的訂閱者人數 +• 佇列功能表的下載按鈕 +• 永久設定播放清單的縮圖 +• 主題標籤和連結的長按動作 +• 卡片檢視模式 + +改進 +• 迷你播放器的關閉按鈕略為放大 +• 縮圖縮小時較順滑 +• 目標版本現為 Android 13 (API 33) +• 快轉時不再暫停播放器 + +修正 +• 修正 DeX/滑鼠的覆蓋 +• 背景播放器允許無獨立音訊串流 +• 若干 YouTube 修正及其他… diff --git a/fastlane/metadata/android/zh-Hant/changelogs/993.txt b/fastlane/metadata/android/zh-Hant/changelogs/993.txt new file mode 100644 index 00000000000..0a095cff931 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/993.txt @@ -0,0 +1,12 @@ +新增 +• 重複加入至播放清單時警告,同時另設移除重複項目的按鈕 +• 允許忽略硬體按鈕 +• 允許在摘要中隱藏已部分觀看的影片 + +改進 +• 在大螢幕上以格線顯示更多欄 +• 進度標示器與設定一致 + +修正 +• 修正 Android 11+ 上開啟瀏覽器 URL、下載與外部播放器 +• 修正 MIUI 上全螢幕操作需要輕觸兩下 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/996.txt b/fastlane/metadata/android/zh-Hant/changelogs/996.txt new file mode 100644 index 00000000000..8f7cabf3600 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/996.txt @@ -0,0 +1,2 @@ +修正在 media.ccc.de 開啟頻道/會議時的 NullPointerException。 +鬼靈精試圖破壞我們送給您的聖誕禮物,但我們修好了。 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/997.txt b/fastlane/metadata/android/zh-Hant/changelogs/997.txt new file mode 100644 index 00000000000..e5df621ab6b --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/997.txt @@ -0,0 +1,17 @@ +新增 +• 顯示留言回覆 +• 允許重新排序播放清單 +• 顯示播放清單描述與總時長 +• 允許重設所有設定 + +改進 +• [Android 13+] 還原自訂通知動作 +• 更新檢查徵求同意 +• 緩衝時允許自通知中播放/暫停 +• 重新排序部分設定 + +修正 +• [YouTube] 修正留言未能載入,以及其他修正與改進 +• 解決設定匯入的漏洞並改用 JSON +• 若干下載修正 +• 修剪搜尋文字 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/998.txt b/fastlane/metadata/android/zh-Hant/changelogs/998.txt new file mode 100644 index 00000000000..4e8bf65377d --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/998.txt @@ -0,0 +1 @@ +修正 YouTube 無法播放任何串流 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/999.txt b/fastlane/metadata/android/zh-Hant/changelogs/999.txt new file mode 100644 index 00000000000..4e8bf65377d --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/999.txt @@ -0,0 +1 @@ +修正 YouTube 無法播放任何串流 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt index cf0bd858878..5bcc922a83f 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt @@ -1,2 +1,2 @@ -移除了對MediaParser的支持,以解決在Android 11+上緩衝後恢復播放失敗的問題。 -在Philips QM16XE上禁用了媒體隧道,以解決播放問題。 +移除咗對MediaParser(媒體解析器)嘅支持,解決咗喺Android 11+上面緩衝後,恢復播放時失敗嘅問題。 +喺Philips QM16XE上禁用了media tunneling(隧道模式),去解決恢復播放卡機嘅問題。 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt index ec2edbe3844..d141dc9ce59 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt @@ -1,9 +1,9 @@ -新加撳兩下跳轉嘅介面同功能 -設定有得打字嚟搵 -留言置頂有色水分辨 -為 FSFE 嘅 PeerTube 站新加「用 app 嚟開」支援 -新加錯誤通知 -修正播放器轉變時重播隊頭項目 -直播串流緩衝時等耐啲先至算失敗 -修正本機搜尋結果嘅排位 -修正排隊播入面開天窗嘅項目欄位 +新加咗撳兩下就跳轉介面嘅功能 +可以喺設定入面打字搵嘢 +突出咗置頂嘅留言 +支援咗用 app 去開由FSFE (歐洲自由軟件基金會)託管嘅 PeerTube站 +新加咗錯誤通知 +修正咗播放器轉換嗰陣重播排隊嘅首項 +等耐啲實況串流緩衝再定輸數 +修正咗本機搜尋結果嘅順位 +修正咗播放順位入面空寥寥項目嘅欄位 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt index 34be1e7efbb..d93c53791c4 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt @@ -1,7 +1,7 @@ -喺清單度載入足夠多初始項目去填滿成個螢幕並修正喺平板電腦同電視上面嘅捲動問題 -修正捲動清單時偶發閃退 +喺清單度載入足量初始項目去填滿全螢幕,並修正喺平板電腦同電視機上面嘅捲動問題 +修正咗捲動播放清單嗰陣突然出現嘅閃退問題 播放器快轉嘅覆蓋弧形擺喺系統介面後面 -撤回多視窗播放時嘅 M 字額變動,以免部份手機出現播放器錯位嘅倒退 -將 compileSdk 由 30 升至 31 -更新問題報告程式庫 -執整播放器部份程式碼 +撤回多視窗播放時嘅 M 字額變動,以免部份手機出現播放器錯位嘅倒放 +將 compileSdk (指定 Gradle 應該使用嘅Android API 級別去編譯你嘅應用)由 30 升至 31 +更新咗回報問題報告嘅程式庫 +重構部份喺播放器嘅程式碼 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt index f1d67925fda..9a4721551a1 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt @@ -1 +1 @@ -修正 YouTube 乜串流都播唔到 +修正咗 YouTube 乜嘢實況串流都播唔到嘅問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt index e451189ef6e..c3c2fbbe8eb 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt @@ -1,16 +1,16 @@ 新嘢 -• 新加串流有通知 -• 幕後同影片播放器無縫切換 +• 新嘅實況串流會顯示通知出嚟 +• 無隙切換背景同影片播放器 • 按半度調整音高 -• 將主版面播放器排隊播追加落播放清單 +• 將主版面播放器隊列追加後變成播放清單 進步 -• 記住速率/音高調整步伐 -• 改善影片播放器開波時漫長緩衝 -• 完善 Android TV 嘅播放器版面 -• 刪除晒全部下載咗嘅檔案之前先確認 +• 記住咗倍速/音高嘅調整步調 +• 改善咗影片播放器開波嗰陣嘅漫長緩衝期 +• 改善咗 Android TV 嘅播放器版面 +• 確認多次係咪真係要刪除晒所有下載咗嘅檔案 修正 -• 修正媒體掣冇隱藏到啲播放器控掣 -• 修正播放器類型有變時重頭再播 -• 修正播放器清單對話方塊嘅方向旋轉 +• 修正咗媒體掣入面冇隱藏到啲播放器控掣選項 +• 修正咗播放器換轉類別嗰陣嘅重頭再播過 +• 修正咗播放器清單對話方塊嘅旋轉方向 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt new file mode 100644 index 00000000000..bfe34c02159 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt @@ -0,0 +1,17 @@ +新嘢 +• 影片詳情騷埋訂閱人數 +• 排隊播整埋個下載掣 +• 自選播放清單封面縮圖 +• 撳實主題標籤同連結有得複製 +• 有得以一張張白紙舉起一條條片 + +進步 +• 袖珍播放器個閂埋掣大粒啲 +• 縮圖縮細時幼細啲 +• 編譯目標版本訂為 Android 13 (API 33) +• 條片快轉時唔再暫停播放器 + +執漏 +• 修正三星 DeX/滑鼠覆蓋 +• 無獨立聲音串流都有得幕後播 +• 若干 YouTube 修正、等等… diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt new file mode 100644 index 00000000000..76e24fb31fc --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt @@ -0,0 +1,12 @@ +新嘢 +• 重複加入去播放清單時警告,同時整多個掣剷走重複咗嗰啲 +• 硬件掣有得當佢冇到 +• 摘要有得收埋未睇晒嘅片 + +進步 +• 大螢幕一格格騷多幾欄 +• 轉圈公仔跟返設定噉樣 + +執漏 +• 修正 Android 11+ 開啟瀏覽器 URL、下載同外面播放器 +• 修正 MIUI 全螢幕時要撳兩下至搞得掂 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt new file mode 100644 index 00000000000..dcc635e908a --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt @@ -0,0 +1,15 @@ +新嘢 +• 支援多重音軌/語言 +• 螢幕嘅音量同光暗手勢設定有得分左右 +• 主畫面嘅分頁揀選有得搬落最低 + +進步 +• [Bandcamp] 處理收費閘之下嘅曲目 + +修正 +• [YouTube] 串流出現 403 HTTP 錯誤 +• 播放清單版面轉去主版面播放器時播放器冇嘢睇 +• 播放器服務記憶體洩漏 +• [PeerTube] 上載者同子頻道頭像調轉咗 + +其餘不贅 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt new file mode 100644 index 00000000000..87050f4a535 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt @@ -0,0 +1,16 @@ +新嘢 +• 支援頻道分頁 +• 啲圖有得揀畫質 +• 啲圖全部都有得攞返條拎 + +進步 +• 播放器介面暢易達 +• 揀返條靚啲嘅聲黐返落去齋晝面嘅影片下載 +• 分享播放清單時有得加埋播放清單個名同入面啲片名 + +修正 +• [YouTube] 執返掂個 like 數 +• 執返好播放器話冇回應個框框同埋閃退 +• 揀選版面語言揀錯文 +• 播放器聲音焦點無視噤聲 +• 加入項目去播放清單有時唔得 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt new file mode 100644 index 00000000000..8b136fc4256 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt @@ -0,0 +1,2 @@ +修正開啟 media.ccc.de 嘅頻道/會議時發生 NullPointerException 失卻指標錯誤。 +柳煙輕愜夜,俊緒留江影。謝謝您陪我哋跑完悲歡離合嘅一年。 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/997.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/997.txt new file mode 100644 index 00000000000..009bd31fc4e --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/997.txt @@ -0,0 +1,17 @@ +新嘢 +• 留言睇埋回覆 +• 播放清單有得執排位 +• 騷埋播放清單描述同總片長 +• 設定有得推倒重來 + +進步 +• [Android 13+] 自訂通知動作回歸 +• 徵得同意至睇過有冇更新 +• 緩衝緊通知都照撳得播放/暫停 +• 一啲設定執過位 + +修正 +• [YouTube] 執返掂啲留言 lo 唔到,同埋其他執漏同進步 +• 解決設定匯入漏洞兼轉會用 JSON +• 若干下載執漏 +• 搵嘢飛起頭尾啲空格 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt new file mode 100644 index 00000000000..9a4721551a1 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt @@ -0,0 +1 @@ +修正咗 YouTube 乜嘢實況串流都播唔到嘅問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt new file mode 100644 index 00000000000..9a4721551a1 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt @@ -0,0 +1 @@ +修正咗 YouTube 乜嘢實況串流都播唔到嘅問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/full_description.txt b/fastlane/metadata/android/zh_Hant_HK/full_description.txt index 9fe7dfeb96a..9c6fbaef6d8 100644 --- a/fastlane/metadata/android/zh_Hant_HK/full_description.txt +++ b/fastlane/metadata/android/zh_Hant_HK/full_description.txt @@ -1 +1 @@ -NewPipe 冇用到任何 Google 框架程式庫又或者 YouTube API,單憑解析網站去攞到所需嘅資訊,因此就算冇裝 Google 服務嘅機都用得呢個 app。此外,NewPipe 亦毋需您要有 YouTube 帳戶就用得,而且係自由同開放原始碼嘅軟件 (FLOSS)。 +NewPipe 冇用到任何 Google 框架程式庫同YouTube API。而NewPipe透過解析網站,就可以攞到所需嘅資訊。因此,就算冇裝到使用Google 架構嘅機,都用得呢個 app。此外,您亦毋需有 YouTube 帳戶就用到NewPipe,而且呢個係自由同有開放原始碼嘅軟件 (FLOSS)。 diff --git a/fastlane/metadata/android/zh_Hant_HK/short_description.txt b/fastlane/metadata/android/zh_Hant_HK/short_description.txt index 8f4a31c0399..4dd4818cf45 100644 --- a/fastlane/metadata/android/zh_Hant_HK/short_description.txt +++ b/fastlane/metadata/android/zh_Hant_HK/short_description.txt @@ -1 +1 @@ -一個自由輕巧嘅 Android YouTube 前端。 +適用於Android嘅免費,自由、輕量級同具有前瞻性嘅YouTube。 diff --git a/gradle.properties b/gradle.properties index 032d70cee99..ed32303da4f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,6 @@ android.enableJetifier=false +android.nonFinalResIds=false +android.nonTransitiveRClass=true 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..4ea536e7796 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=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-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%